From c033fc636169cecfc5ca054312a3e20e3effb22d Mon Sep 17 00:00:00 2001 From: yujialong <479214531@qq.com> Date: Thu, 21 Nov 2024 11:42:33 +0800 Subject: [PATCH] initial --- .gitignore | 2 + .hbuilderx/launch.json | 24 + App.vue | 36 + README.md | 1 + apis/modules/article.js | 26 + apis/modules/client.js | 54 + apis/modules/course.js | 38 + apis/modules/order.js | 42 + apis/modules/parner.js | 42 + apis/modules/product.js | 50 + apis/modules/user.js | 100 + apis/request.js | 80 + components/empty/empty.vue | 40 + components/filter-popup/components/mask.vue | 130 + components/filter-popup/components/popup.vue | 510 ++++ components/filter-popup/detail.md | 155 ++ components/filter-popup/filter-popup.vue | 596 +++++ components/notAuth/notAuth.vue | 26 + config/product.js | 10 + config/request.js | 21 + course/addCourse/addCourse.vue | 399 +++ course/clients/clients.vue | 280 ++ course/courseDetail/courseDetail.vue | 334 +++ course/curClient/curClient.vue | 273 ++ course/editCourse/editCourse.vue | 504 ++++ course/orderDetail/orderDetail.vue | 1201 +++++++++ course/ordered/ordered.vue | 285 ++ course/practiceDetail/practiceDetail.vue | 109 + course/privacyAgreement/privacyAgreement.vue | 107 + course/products/products.vue | 399 +++ course/serviceAgreement/serviceAgreement.vue | 88 + course/shopCart/shopCart.vue | 317 +++ index.html | 14 + libs/Oss/base64.js | 135 + libs/Oss/crypto.js | 117 + libs/Oss/hmac.js | 37 + libs/Oss/sha1.js | 82 + libs/Oss/upload.js | 71 + libs/WXBizDataCrypt.js | 35 + libs/mtj-wx-sdk.config.js | 39 + libs/mtj-wx-sdk.js | 1 + libs/share.js | 36 + libs/uma.js | 18 + libs/util.js | 129 + main.js | 43 + manifest.json | 73 + package-lock.json | 777 ++++++ package.json | 16 + pages.json | 208 ++ pages/achievement/achievement.vue | 216 ++ pages/index/index.vue | 166 ++ pages/login/login.vue | 347 +++ pages/orders/orders.vue | 360 +++ pages/person/person.vue | 409 +++ static/iconfont/iconfont.css | 32 + static/iconfont/iconfont.ttf | Bin 0 -> 2748 bytes static/image/arrow-down.png | Bin 0 -> 257 bytes static/image/avatar.png | Bin 0 -> 1380 bytes static/image/index/1.png | Bin 0 -> 775 bytes static/image/index/2.png | Bin 0 -> 1078 bytes static/image/index/3.png | Bin 0 -> 1331 bytes static/image/index/4.png | Bin 0 -> 1289 bytes static/image/index/5.png | Bin 0 -> 599 bytes static/image/index/6.png | Bin 0 -> 439 bytes static/image/index/7.png | Bin 0 -> 1062 bytes static/image/index/8.png | Bin 0 -> 518 bytes static/image/index/9.png | Bin 0 -> 522 bytes static/image/index/banner.png | Bin 0 -> 25860 bytes static/image/index/banner1.png | Bin 0 -> 21349 bytes static/image/info-bg.jpg | Bin 0 -> 21392 bytes static/image/info.png | Bin 0 -> 29025 bytes static/image/login1.png | Bin 0 -> 9196 bytes static/image/login2.png | Bin 0 -> 4584 bytes static/image/logo.png | Bin 0 -> 9939 bytes static/image/logo1.png | Bin 0 -> 3028 bytes static/image/none.png | Bin 0 -> 7725 bytes static/image/person-bg.png | Bin 0 -> 26636 bytes static/image/person1.png | Bin 0 -> 528 bytes static/image/person2.png | Bin 0 -> 620 bytes static/image/person26.png | Bin 0 -> 382 bytes static/image/person27.png | Bin 0 -> 537 bytes static/image/person3.png | Bin 0 -> 514 bytes static/image/person4.png | Bin 0 -> 689 bytes static/image/person5.png | Bin 0 -> 519 bytes static/image/person6.png | Bin 0 -> 457 bytes static/image/person7.png | Bin 0 -> 270 bytes static/image/person8.png | Bin 0 -> 734 bytes static/image/person9.png | Bin 0 -> 372 bytes static/image/phone.png | Bin 0 -> 302 bytes static/image/product.png | Bin 0 -> 3585 bytes static/image/product/1.png | Bin 0 -> 483 bytes static/image/product/2.png | Bin 0 -> 434 bytes static/image/product/3.png | Bin 0 -> 298 bytes static/image/product/4.png | Bin 0 -> 351 bytes static/image/product/5.png | Bin 0 -> 641 bytes static/image/product/6.png | Bin 0 -> 251 bytes static/image/product/excel.png | Bin 0 -> 480 bytes static/image/product/pdf.png | Bin 0 -> 440 bytes static/image/product/ppt.png | Bin 0 -> 347 bytes static/image/product/shop-blue.png | Bin 0 -> 1007 bytes static/image/product/shop.png | Bin 0 -> 510 bytes static/image/product/word.png | Bin 0 -> 502 bytes static/image/qrcode.png | Bin 0 -> 325 bytes static/image/school.png | Bin 0 -> 282 bytes static/image/study-bg.jpg | Bin 0 -> 49116 bytes static/image/tab1-1.png | Bin 0 -> 368 bytes static/image/tab1.png | Bin 0 -> 218 bytes static/image/tab2-1.png | Bin 0 -> 223 bytes static/image/tab2.png | Bin 0 -> 372 bytes static/image/tab3-1.png | Bin 0 -> 195 bytes static/image/tab3.png | Bin 0 -> 331 bytes static/image/tab4-1.png | Bin 0 -> 222 bytes static/image/tab4.png | Bin 0 -> 410 bytes static/image/trash.png | Bin 0 -> 373 bytes static/image/unfold.png | Bin 0 -> 197 bytes static/image/wechat.png | Bin 0 -> 525 bytes static/image/workbench/index1.png | Bin 0 -> 39359 bytes static/image/workbench/index10.png | Bin 0 -> 221 bytes static/image/workbench/index11.png | Bin 0 -> 15624 bytes static/image/workbench/index12.png | Bin 0 -> 14767 bytes static/image/workbench/index2.png | Bin 0 -> 70125 bytes static/image/workbench/index3.png | Bin 0 -> 974 bytes static/image/workbench/index4.png | Bin 0 -> 760 bytes static/image/workbench/index5.png | Bin 0 -> 310 bytes static/image/workbench/index6.png | Bin 0 -> 654 bytes static/image/workbench/index7.png | Bin 0 -> 283 bytes static/image/workbench/index8.png | Bin 0 -> 773 bytes static/image/workbench/index9.png | Bin 0 -> 624 bytes styles/common.scss | 305 +++ uni.scss | 3 + uni_modules/Sansnn-uQRCode/changelog.md | 44 + .../u-qrcode/gcanvas/bridge/bridge-weex.js | 241 ++ .../context-2d/FillStyleLinearGradient.js | 18 + .../gcanvas/context-2d/FillStylePattern.js | 8 + .../context-2d/FillStyleRadialGradient.js | 17 + .../gcanvas/context-2d/RenderingContext.js | 666 +++++ .../gcanvas/context-webgl/ActiveInfo.js | 11 + .../u-qrcode/gcanvas/context-webgl/Buffer.js | 21 + .../gcanvas/context-webgl/Framebuffer.js | 21 + .../u-qrcode/gcanvas/context-webgl/GLenum.js | 298 +++ .../gcanvas/context-webgl/GLmethod.js | 142 + .../u-qrcode/gcanvas/context-webgl/GLtype.js | 23 + .../u-qrcode/gcanvas/context-webgl/Program.js | 21 + .../gcanvas/context-webgl/Renderbuffer.js | 21 + .../gcanvas/context-webgl/RenderingContext.js | 1191 +++++++++ .../u-qrcode/gcanvas/context-webgl/Shader.js | 22 + .../context-webgl/ShaderPrecisionFormat.js | 11 + .../u-qrcode/gcanvas/context-webgl/Texture.js | 22 + .../gcanvas/context-webgl/UniformLocation.js | 22 + .../gcanvas/context-webgl/classUtils.js | 3 + .../components/u-qrcode/gcanvas/env/canvas.js | 74 + .../components/u-qrcode/gcanvas/env/image.js | 96 + .../components/u-qrcode/gcanvas/env/tool.js | 24 + .../components/u-qrcode/gcanvas/index.js | 39 + .../components/u-qrcode/u-qrcode.vue | 684 +++++ .../Sansnn-uQRCode/js_sdk/u-qrcode/license.md | 201 ++ .../Sansnn-uQRCode/js_sdk/u-qrcode/module.js | 2285 +++++++++++++++++ .../js_sdk/u-qrcode/package.json | 24 + .../Sansnn-uQRCode/js_sdk/u-qrcode/readme.md | 274 ++ .../js_sdk/u-qrcode/u-qrcode.js | 2285 +++++++++++++++++ uni_modules/Sansnn-uQRCode/package.json | 83 + uni_modules/Sansnn-uQRCode/readme.md | 274 ++ uni_modules/hpy-form-select/changelog.md | 2 + .../hpy-form-select/hpy-form-select.vue | 255 ++ uni_modules/hpy-form-select/package.json | 87 + uni_modules/hpy-form-select/readme.md | 169 ++ uni_modules/mp-html/README.md | 191 ++ uni_modules/mp-html/changelog.md | 121 + .../mp-html/components/mp-html/mp-html.vue | 498 ++++ .../mp-html/components/mp-html/node/node.vue | 576 +++++ .../mp-html/components/mp-html/parser.js | 1333 ++++++++++ uni_modules/mp-html/package.json | 76 + .../static/app-plus/mp-html/js/handler.js | 1 + .../app-plus/mp-html/js/uni.webview.min.js | 1 + .../static/app-plus/mp-html/local.html | 1 + uni_modules/uni-badge/changelog.md | 29 + .../components/uni-badge/uni-badge.vue | 268 ++ uni_modules/uni-badge/package.json | 88 + uni_modules/uni-badge/readme.md | 10 + uni_modules/uni-calendar/changelog.md | 16 + .../components/uni-calendar/calendar.js | 546 ++++ .../components/uni-calendar/i18n/en.json | 12 + .../components/uni-calendar/i18n/index.js | 8 + .../components/uni-calendar/i18n/zh-Hans.json | 12 + .../components/uni-calendar/i18n/zh-Hant.json | 12 + .../uni-calendar/uni-calendar-item.vue | 181 ++ .../components/uni-calendar/uni-calendar.vue | 554 ++++ .../components/uni-calendar/util.js | 354 +++ uni_modules/uni-calendar/package.json | 88 + uni_modules/uni-calendar/readme.md | 103 + uni_modules/uni-card/changelog.md | 26 + .../uni-card/components/uni-card/uni-card.vue | 270 ++ uni_modules/uni-card/package.json | 90 + uni_modules/uni-card/readme.md | 12 + uni_modules/uni-collapse/changelog.md | 36 + .../uni-collapse-item/uni-collapse-item.vue | 402 +++ .../components/uni-collapse/uni-collapse.vue | 147 ++ uni_modules/uni-collapse/package.json | 89 + uni_modules/uni-collapse/readme.md | 12 + uni_modules/uni-combox/changelog.md | 15 + .../components/uni-combox/uni-combox.vue | 275 ++ uni_modules/uni-combox/package.json | 90 + uni_modules/uni-combox/readme.md | 11 + uni_modules/uni-config-center/changelog.md | 6 + uni_modules/uni-config-center/package.json | 81 + uni_modules/uni-config-center/readme.md | 93 + .../common/uni-config-center/index.js | 1 + .../common/uni-config-center/package.json | 9 + uni_modules/uni-countdown/changelog.md | 24 + .../components/uni-countdown/i18n/en.json | 6 + .../components/uni-countdown/i18n/index.js | 8 + .../uni-countdown/i18n/zh-Hans.json | 6 + .../uni-countdown/i18n/zh-Hant.json | 6 + .../uni-countdown/uni-countdown.vue | 271 ++ uni_modules/uni-countdown/package.json | 86 + uni_modules/uni-countdown/readme.md | 10 + uni_modules/uni-data-checkbox/changelog.md | 41 + .../uni-data-checkbox/uni-data-checkbox.vue | 817 ++++++ uni_modules/uni-data-checkbox/package.json | 87 + uni_modules/uni-data-checkbox/readme.md | 18 + uni_modules/uni-data-picker/changelog.md | 56 + .../components/uni-data-picker/keypress.js | 45 + .../uni-data-picker/uni-data-picker.vue | 539 ++++ .../uni-data-pickerview/uni-data-picker.js | 563 ++++ .../uni-data-pickerview.vue | 333 +++ uni_modules/uni-data-picker/package.json | 92 + uni_modules/uni-data-picker/readme.md | 22 + uni_modules/uni-dateformat/changelog.md | 10 + .../components/uni-dateformat/date-format.js | 200 ++ .../uni-dateformat/uni-dateformat.vue | 88 + uni_modules/uni-dateformat/package.json | 88 + uni_modules/uni-dateformat/readme.md | 11 + uni_modules/uni-datetime-picker/changelog.md | 89 + .../uni-datetime-picker/calendar-item.vue | 185 ++ .../uni-datetime-picker/calendar.vue | 898 +++++++ .../uni-datetime-picker/i18n/en.json | 19 + .../uni-datetime-picker/i18n/index.js | 8 + .../uni-datetime-picker/i18n/zh-Hans.json | 19 + .../uni-datetime-picker/i18n/zh-Hant.json | 19 + .../uni-datetime-picker/keypress.js | 45 + .../uni-datetime-picker/time-picker.vue | 927 +++++++ .../uni-datetime-picker.vue | 997 +++++++ .../components/uni-datetime-picker/util.js | 410 +++ uni_modules/uni-datetime-picker/package.json | 90 + uni_modules/uni-datetime-picker/readme.md | 21 + uni_modules/uni-drawer/changelog.md | 13 + .../components/uni-drawer/keypress.js | 45 + .../components/uni-drawer/uni-drawer.vue | 183 ++ uni_modules/uni-drawer/package.json | 87 + uni_modules/uni-drawer/readme.md | 10 + uni_modules/uni-easyinput/changelog.md | 35 + .../components/uni-easyinput/common.js | 56 + .../uni-easyinput/uni-easyinput.vue | 461 ++++ uni_modules/uni-easyinput/package.json | 90 + uni_modules/uni-easyinput/readme.md | 11 + uni_modules/uni-fab/changelog.md | 17 + .../uni-fab/components/uni-fab/uni-fab.vue | 475 ++++ uni_modules/uni-fab/package.json | 87 + uni_modules/uni-fab/readme.md | 9 + uni_modules/uni-fav/changelog.md | 17 + .../uni-fav/components/uni-fav/i18n/en.json | 4 + .../uni-fav/components/uni-fav/i18n/index.js | 8 + .../components/uni-fav/i18n/zh-Hans.json | 4 + .../components/uni-fav/i18n/zh-Hant.json | 4 + .../uni-fav/components/uni-fav/uni-fav.vue | 156 ++ uni_modules/uni-fav/package.json | 89 + uni_modules/uni-fav/readme.md | 10 + uni_modules/uni-file-picker/changelog.md | 61 + .../uni-file-picker/choose-and-upload-file.js | 224 ++ .../uni-file-picker/uni-file-picker.vue | 651 +++++ .../uni-file-picker/upload-file.vue | 325 +++ .../uni-file-picker/upload-image.vue | 292 +++ .../components/uni-file-picker/utils.js | 109 + uni_modules/uni-file-picker/package.json | 86 + uni_modules/uni-file-picker/readme.md | 11 + uni_modules/uni-forms/changelog.md | 60 + .../uni-forms-item/uni-forms-item.vue | 509 ++++ .../components/uni-forms/uni-forms.vue | 472 ++++ .../components/uni-forms/validate.js | 486 ++++ uni_modules/uni-forms/package.json | 90 + uni_modules/uni-forms/readme.md | 23 + uni_modules/uni-goods-nav/changelog.md | 16 + .../components/uni-goods-nav/i18n/en.json | 6 + .../components/uni-goods-nav/i18n/index.js | 8 + .../uni-goods-nav/i18n/zh-Hans.json | 6 + .../uni-goods-nav/i18n/zh-Hant.json | 6 + .../uni-goods-nav/uni-goods-nav.vue | 224 ++ uni_modules/uni-goods-nav/package.json | 88 + uni_modules/uni-goods-nav/readme.md | 10 + uni_modules/uni-grid/changelog.md | 13 + .../uni-grid-item/uni-grid-item.vue | 127 + .../uni-grid/components/uni-grid/uni-grid.vue | 142 + uni_modules/uni-grid/package.json | 86 + uni_modules/uni-grid/readme.md | 11 + uni_modules/uni-group/changelog.md | 14 + .../components/uni-group/uni-group.vue | 130 + uni_modules/uni-group/package.json | 87 + uni_modules/uni-group/readme.md | 9 + uni_modules/uni-icons/changelog.md | 22 + .../uni-icons/components/uni-icons/icons.js | 1169 +++++++++ .../components/uni-icons/uni-icons.vue | 96 + .../components/uni-icons/uniicons.css | 663 +++++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 86 + uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-id-common/changelog.md | 26 + uni_modules/uni-id-common/package.json | 87 + uni_modules/uni-id-common/readme.md | 3 + .../common/uni-id-common/index.js | 1 + .../common/uni-id-common/package.json | 16 + uni_modules/uni-indexed-list/changelog.md | 17 + .../uni-indexed-list-item.vue | 144 ++ .../uni-indexed-list/uni-indexed-list.vue | 367 +++ uni_modules/uni-indexed-list/package.json | 89 + uni_modules/uni-indexed-list/readme.md | 11 + uni_modules/uni-link/changelog.md | 17 + .../uni-link/components/uni-link/uni-link.vue | 128 + uni_modules/uni-link/package.json | 87 + uni_modules/uni-link/readme.md | 11 + uni_modules/uni-list/changelog.md | 20 + .../components/uni-list-ad/uni-list-ad.vue | 107 + .../uni-list-chat/uni-list-chat.scss | 58 + .../uni-list-chat/uni-list-chat.vue | 538 ++++ .../uni-list-item/uni-list-item.vue | 454 ++++ .../uni-list/components/uni-list/uni-list.vue | 108 + .../components/uni-list/uni-refresh.vue | 65 + .../components/uni-list/uni-refresh.wxs | 87 + uni_modules/uni-list/package.json | 91 + uni_modules/uni-list/readme.md | 346 +++ uni_modules/uni-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 399 +++ uni_modules/uni-load-more/package.json | 86 + uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-nav-bar/changelog.md | 37 + .../components/uni-nav-bar/uni-nav-bar.vue | 343 +++ .../components/uni-nav-bar/uni-status-bar.vue | 27 + uni_modules/uni-nav-bar/package.json | 89 + uni_modules/uni-nav-bar/readme.md | 15 + uni_modules/uni-notice-bar/changelog.md | 16 + .../uni-notice-bar/uni-notice-bar.vue | 395 +++ uni_modules/uni-notice-bar/package.json | 90 + uni_modules/uni-notice-bar/readme.md | 13 + uni_modules/uni-number-box/changelog.md | 25 + .../uni-number-box/uni-number-box.vue | 221 ++ uni_modules/uni-number-box/package.json | 85 + uni_modules/uni-number-box/readme.md | 13 + uni_modules/uni-pagination/changelog.md | 20 + .../components/uni-pagination/i18n/en.json | 4 + .../components/uni-pagination/i18n/es.json | 4 + .../components/uni-pagination/i18n/fr.json | 4 + .../components/uni-pagination/i18n/index.js | 12 + .../uni-pagination/i18n/zh-Hans.json | 4 + .../uni-pagination/i18n/zh-Hant.json | 4 + .../uni-pagination/uni-pagination.vue | 409 +++ uni_modules/uni-pagination/package.json | 86 + uni_modules/uni-pagination/readme.md | 13 + uni_modules/uni-popup/changelog.md | 60 + .../components/uni-popup-dialog/keypress.js | 45 + .../uni-popup-dialog/uni-popup-dialog.vue | 271 ++ .../uni-popup-message/uni-popup-message.vue | 143 ++ .../uni-popup-share/uni-popup-share.vue | 187 ++ .../components/uni-popup/i18n/en.json | 7 + .../components/uni-popup/i18n/index.js | 8 + .../components/uni-popup/i18n/zh-Hans.json | 7 + .../components/uni-popup/i18n/zh-Hant.json | 7 + .../components/uni-popup/keypress.js | 45 + .../uni-popup/components/uni-popup/popup.js | 26 + .../components/uni-popup/uni-popup.vue | 474 ++++ uni_modules/uni-popup/package.json | 90 + uni_modules/uni-popup/readme.md | 17 + uni_modules/uni-rate/changelog.md | 25 + .../uni-rate/components/uni-rate/uni-rate.vue | 361 +++ uni_modules/uni-rate/package.json | 88 + uni_modules/uni-rate/readme.md | 12 + uni_modules/uni-row/changelog.md | 10 + .../uni-row/components/uni-col/uni-col.vue | 317 +++ .../uni-row/components/uni-row/uni-row.vue | 190 ++ uni_modules/uni-row/package.json | 87 + uni_modules/uni-row/readme.md | 10 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 ++ .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 ++ .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-search-bar/changelog.md | 27 + .../components/uni-search-bar/i18n/en.json | 4 + .../components/uni-search-bar/i18n/index.js | 8 + .../uni-search-bar/i18n/zh-Hans.json | 4 + .../uni-search-bar/i18n/zh-Hant.json | 4 + .../uni-search-bar/uni-search-bar.vue | 287 +++ uni_modules/uni-search-bar/package.json | 89 + uni_modules/uni-search-bar/readme.md | 14 + .../uni-segmented-control/changelog.md | 9 + .../uni-segmented-control.vue | 145 ++ .../uni-segmented-control/package.json | 87 + uni_modules/uni-segmented-control/readme.md | 13 + uni_modules/uni-steps/changelog.md | 16 + .../components/uni-steps/uni-steps.vue | 269 ++ uni_modules/uni-steps/package.json | 89 + uni_modules/uni-steps/readme.md | 13 + uni_modules/uni-swipe-action/changelog.md | 33 + .../uni-swipe-action-item/bindingx.js | 300 +++ .../components/uni-swipe-action-item/isPC.js | 12 + .../uni-swipe-action-item/mpalipay.js | 193 ++ .../uni-swipe-action-item/mpother.js | 257 ++ .../components/uni-swipe-action-item/mpwxs.js | 82 + .../uni-swipe-action-item/render.js | 270 ++ .../uni-swipe-action-item.vue | 344 +++ .../components/uni-swipe-action-item/wx.wxs | 341 +++ .../uni-swipe-action/uni-swipe-action.vue | 60 + uni_modules/uni-swipe-action/package.json | 87 + uni_modules/uni-swipe-action/readme.md | 11 + uni_modules/uni-swiper-dot/changelog.md | 12 + .../uni-swiper-dot/uni-swiper-dot.vue | 218 ++ uni_modules/uni-swiper-dot/package.json | 87 + uni_modules/uni-swiper-dot/readme.md | 11 + uni_modules/uni-table/changelog.md | 21 + .../components/uni-table/uni-table.vue | 455 ++++ .../components/uni-tbody/uni-tbody.vue | 29 + .../uni-table/components/uni-td/uni-td.vue | 90 + .../components/uni-th/filter-dropdown.vue | 503 ++++ .../uni-table/components/uni-th/uni-th.vue | 274 ++ .../components/uni-thead/uni-thead.vue | 129 + .../components/uni-tr/table-checkbox.vue | 179 ++ .../uni-table/components/uni-tr/uni-tr.vue | 171 ++ uni_modules/uni-table/i18n/en.json | 9 + uni_modules/uni-table/i18n/es.json | 9 + uni_modules/uni-table/i18n/fr.json | 9 + uni_modules/uni-table/i18n/index.js | 12 + uni_modules/uni-table/i18n/zh-Hans.json | 9 + uni_modules/uni-table/i18n/zh-Hant.json | 9 + uni_modules/uni-table/package.json | 86 + uni_modules/uni-table/readme.md | 13 + uni_modules/uni-tag/changelog.md | 21 + .../uni-tag/components/uni-tag/uni-tag.vue | 252 ++ uni_modules/uni-tag/package.json | 87 + uni_modules/uni-tag/readme.md | 13 + uni_modules/uni-test/changelog.md | 39 + .../uni-test/components/uni-test/uni-test.vue | 26 + uni_modules/uni-test/package.json | 83 + uni_modules/uni-test/readme.md | 10 + uni_modules/uni-title/changelog.md | 8 + .../components/uni-title/uni-title.vue | 171 ++ uni_modules/uni-title/package.json | 88 + uni_modules/uni-title/readme.md | 14 + uni_modules/uni-transition/changelog.md | 20 + .../uni-transition/createAnimation.js | 128 + .../uni-transition/uni-transition.vue | 277 ++ uni_modules/uni-transition/package.json | 87 + uni_modules/uni-transition/readme.md | 11 + uni_modules/uni-ui/changelog.md | 383 +++ .../uni-ui/components/uni-ui/uni-ui.vue | 7 + uni_modules/uni-ui/package.json | 128 + uni_modules/uni-ui/readme.md | 248 ++ user/account/account.vue | 61 + user/addStaff/addStaff.vue | 51 + user/article/article.vue | 212 ++ user/email/email.vue | 113 + user/info/info.vue | 285 ++ user/password/password.vue | 62 + user/phone/phone.vue | 119 + user/plans/plans.vue | 281 ++ user/qrcode/qrcode.vue | 168 ++ user/reg/reg.vue | 140 + user/scheme/scheme.vue | 116 + user/selectAccount/selectAccount.vue | 94 + user/send/send.vue | 95 + user/setting/setting.vue | 92 + user/study/study.vue | 289 +++ 483 files changed, 60070 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 README.md create mode 100644 apis/modules/article.js create mode 100644 apis/modules/client.js create mode 100644 apis/modules/course.js create mode 100644 apis/modules/order.js create mode 100644 apis/modules/parner.js create mode 100644 apis/modules/product.js create mode 100644 apis/modules/user.js create mode 100644 apis/request.js create mode 100644 components/empty/empty.vue create mode 100644 components/filter-popup/components/mask.vue create mode 100644 components/filter-popup/components/popup.vue create mode 100644 components/filter-popup/detail.md create mode 100644 components/filter-popup/filter-popup.vue create mode 100644 components/notAuth/notAuth.vue create mode 100644 config/product.js create mode 100644 config/request.js create mode 100644 course/addCourse/addCourse.vue create mode 100644 course/clients/clients.vue create mode 100644 course/courseDetail/courseDetail.vue create mode 100644 course/curClient/curClient.vue create mode 100644 course/editCourse/editCourse.vue create mode 100644 course/orderDetail/orderDetail.vue create mode 100644 course/ordered/ordered.vue create mode 100644 course/practiceDetail/practiceDetail.vue create mode 100644 course/privacyAgreement/privacyAgreement.vue create mode 100644 course/products/products.vue create mode 100644 course/serviceAgreement/serviceAgreement.vue create mode 100644 course/shopCart/shopCart.vue create mode 100644 index.html create mode 100644 libs/Oss/base64.js create mode 100644 libs/Oss/crypto.js create mode 100644 libs/Oss/hmac.js create mode 100644 libs/Oss/sha1.js create mode 100644 libs/Oss/upload.js create mode 100644 libs/WXBizDataCrypt.js create mode 100644 libs/mtj-wx-sdk.config.js create mode 100644 libs/mtj-wx-sdk.js create mode 100644 libs/share.js create mode 100644 libs/uma.js create mode 100644 libs/util.js create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/achievement/achievement.vue create mode 100644 pages/index/index.vue create mode 100644 pages/login/login.vue create mode 100644 pages/orders/orders.vue create mode 100644 pages/person/person.vue create mode 100644 static/iconfont/iconfont.css create mode 100644 static/iconfont/iconfont.ttf create mode 100644 static/image/arrow-down.png create mode 100644 static/image/avatar.png create mode 100644 static/image/index/1.png create mode 100644 static/image/index/2.png create mode 100644 static/image/index/3.png create mode 100644 static/image/index/4.png create mode 100644 static/image/index/5.png create mode 100644 static/image/index/6.png create mode 100644 static/image/index/7.png create mode 100644 static/image/index/8.png create mode 100644 static/image/index/9.png create mode 100644 static/image/index/banner.png create mode 100644 static/image/index/banner1.png create mode 100644 static/image/info-bg.jpg create mode 100644 static/image/info.png create mode 100644 static/image/login1.png create mode 100644 static/image/login2.png create mode 100644 static/image/logo.png create mode 100644 static/image/logo1.png create mode 100644 static/image/none.png create mode 100644 static/image/person-bg.png create mode 100644 static/image/person1.png create mode 100644 static/image/person2.png create mode 100644 static/image/person26.png create mode 100644 static/image/person27.png create mode 100644 static/image/person3.png create mode 100644 static/image/person4.png create mode 100644 static/image/person5.png create mode 100644 static/image/person6.png create mode 100644 static/image/person7.png create mode 100644 static/image/person8.png create mode 100644 static/image/person9.png create mode 100644 static/image/phone.png create mode 100644 static/image/product.png create mode 100644 static/image/product/1.png create mode 100644 static/image/product/2.png create mode 100644 static/image/product/3.png create mode 100644 static/image/product/4.png create mode 100644 static/image/product/5.png create mode 100644 static/image/product/6.png create mode 100644 static/image/product/excel.png create mode 100644 static/image/product/pdf.png create mode 100644 static/image/product/ppt.png create mode 100644 static/image/product/shop-blue.png create mode 100644 static/image/product/shop.png create mode 100644 static/image/product/word.png create mode 100644 static/image/qrcode.png create mode 100644 static/image/school.png create mode 100644 static/image/study-bg.jpg create mode 100644 static/image/tab1-1.png create mode 100644 static/image/tab1.png create mode 100644 static/image/tab2-1.png create mode 100644 static/image/tab2.png create mode 100644 static/image/tab3-1.png create mode 100644 static/image/tab3.png create mode 100644 static/image/tab4-1.png create mode 100644 static/image/tab4.png create mode 100644 static/image/trash.png create mode 100644 static/image/unfold.png create mode 100644 static/image/wechat.png create mode 100644 static/image/workbench/index1.png create mode 100644 static/image/workbench/index10.png create mode 100644 static/image/workbench/index11.png create mode 100644 static/image/workbench/index12.png create mode 100644 static/image/workbench/index2.png create mode 100644 static/image/workbench/index3.png create mode 100644 static/image/workbench/index4.png create mode 100644 static/image/workbench/index5.png create mode 100644 static/image/workbench/index6.png create mode 100644 static/image/workbench/index7.png create mode 100644 static/image/workbench/index8.png create mode 100644 static/image/workbench/index9.png create mode 100644 styles/common.scss create mode 100644 uni.scss create mode 100644 uni_modules/Sansnn-uQRCode/changelog.md create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/bridge/bridge-weex.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleLinearGradient.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStylePattern.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleRadialGradient.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/RenderingContext.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ActiveInfo.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Buffer.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Framebuffer.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLenum.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLmethod.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLtype.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Program.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Renderbuffer.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/RenderingContext.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Shader.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ShaderPrecisionFormat.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Texture.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/UniformLocation.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/classUtils.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/canvas.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/image.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/tool.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/index.js create mode 100644 uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue create mode 100644 uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/license.md create mode 100644 uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/module.js create mode 100644 uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/package.json create mode 100644 uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/readme.md create mode 100644 uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/u-qrcode.js create mode 100644 uni_modules/Sansnn-uQRCode/package.json create mode 100644 uni_modules/Sansnn-uQRCode/readme.md create mode 100644 uni_modules/hpy-form-select/changelog.md create mode 100644 uni_modules/hpy-form-select/components/hpy-form-select/hpy-form-select.vue create mode 100644 uni_modules/hpy-form-select/package.json create mode 100644 uni_modules/hpy-form-select/readme.md create mode 100644 uni_modules/mp-html/README.md create mode 100644 uni_modules/mp-html/changelog.md create mode 100644 uni_modules/mp-html/components/mp-html/mp-html.vue create mode 100644 uni_modules/mp-html/components/mp-html/node/node.vue create mode 100644 uni_modules/mp-html/components/mp-html/parser.js create mode 100644 uni_modules/mp-html/package.json create mode 100644 uni_modules/mp-html/static/app-plus/mp-html/js/handler.js create mode 100644 uni_modules/mp-html/static/app-plus/mp-html/js/uni.webview.min.js create mode 100644 uni_modules/mp-html/static/app-plus/mp-html/local.html create mode 100644 uni_modules/uni-badge/changelog.md create mode 100644 uni_modules/uni-badge/components/uni-badge/uni-badge.vue create mode 100644 uni_modules/uni-badge/package.json create mode 100644 uni_modules/uni-badge/readme.md create mode 100644 uni_modules/uni-calendar/changelog.md create mode 100644 uni_modules/uni-calendar/components/uni-calendar/calendar.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/en.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/index.js create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/i18n/zh-Hant.json create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/uni-calendar.vue create mode 100644 uni_modules/uni-calendar/components/uni-calendar/util.js create mode 100644 uni_modules/uni-calendar/package.json create mode 100644 uni_modules/uni-calendar/readme.md create mode 100644 uni_modules/uni-card/changelog.md create mode 100644 uni_modules/uni-card/components/uni-card/uni-card.vue create mode 100644 uni_modules/uni-card/package.json create mode 100644 uni_modules/uni-card/readme.md create mode 100644 uni_modules/uni-collapse/changelog.md create mode 100644 uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue create mode 100644 uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue create mode 100644 uni_modules/uni-collapse/package.json create mode 100644 uni_modules/uni-collapse/readme.md create mode 100644 uni_modules/uni-combox/changelog.md create mode 100644 uni_modules/uni-combox/components/uni-combox/uni-combox.vue create mode 100644 uni_modules/uni-combox/package.json create mode 100644 uni_modules/uni-combox/readme.md create mode 100644 uni_modules/uni-config-center/changelog.md create mode 100644 uni_modules/uni-config-center/package.json create mode 100644 uni_modules/uni-config-center/readme.md create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/package.json create mode 100644 uni_modules/uni-countdown/changelog.md create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/en.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/index.js create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hans.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/i18n/zh-Hant.json create mode 100644 uni_modules/uni-countdown/components/uni-countdown/uni-countdown.vue create mode 100644 uni_modules/uni-countdown/package.json create mode 100644 uni_modules/uni-countdown/readme.md create mode 100644 uni_modules/uni-data-checkbox/changelog.md create mode 100644 uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue create mode 100644 uni_modules/uni-data-checkbox/package.json create mode 100644 uni_modules/uni-data-checkbox/readme.md create mode 100644 uni_modules/uni-data-picker/changelog.md create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/keypress.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue create mode 100644 uni_modules/uni-data-picker/package.json create mode 100644 uni_modules/uni-data-picker/readme.md create mode 100644 uni_modules/uni-dateformat/changelog.md create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/date-format.js create mode 100644 uni_modules/uni-dateformat/components/uni-dateformat/uni-dateformat.vue create mode 100644 uni_modules/uni-dateformat/package.json create mode 100644 uni_modules/uni-dateformat/readme.md create mode 100644 uni_modules/uni-datetime-picker/changelog.md create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js create mode 100644 uni_modules/uni-datetime-picker/package.json create mode 100644 uni_modules/uni-datetime-picker/readme.md create mode 100644 uni_modules/uni-drawer/changelog.md create mode 100644 uni_modules/uni-drawer/components/uni-drawer/keypress.js create mode 100644 uni_modules/uni-drawer/components/uni-drawer/uni-drawer.vue create mode 100644 uni_modules/uni-drawer/package.json create mode 100644 uni_modules/uni-drawer/readme.md create mode 100644 uni_modules/uni-easyinput/changelog.md create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/common.js create mode 100644 uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue create mode 100644 uni_modules/uni-easyinput/package.json create mode 100644 uni_modules/uni-easyinput/readme.md create mode 100644 uni_modules/uni-fab/changelog.md create mode 100644 uni_modules/uni-fab/components/uni-fab/uni-fab.vue create mode 100644 uni_modules/uni-fab/package.json create mode 100644 uni_modules/uni-fab/readme.md create mode 100644 uni_modules/uni-fav/changelog.md create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/en.json create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/index.js create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hans.json create mode 100644 uni_modules/uni-fav/components/uni-fav/i18n/zh-Hant.json create mode 100644 uni_modules/uni-fav/components/uni-fav/uni-fav.vue create mode 100644 uni_modules/uni-fav/package.json create mode 100644 uni_modules/uni-fav/readme.md create mode 100644 uni_modules/uni-file-picker/changelog.md create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue create mode 100644 uni_modules/uni-file-picker/components/uni-file-picker/utils.js create mode 100644 uni_modules/uni-file-picker/package.json create mode 100644 uni_modules/uni-file-picker/readme.md create mode 100644 uni_modules/uni-forms/changelog.md create mode 100644 uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/uni-forms.vue create mode 100644 uni_modules/uni-forms/components/uni-forms/validate.js create mode 100644 uni_modules/uni-forms/package.json create mode 100644 uni_modules/uni-forms/readme.md create mode 100644 uni_modules/uni-goods-nav/changelog.md create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json create mode 100644 uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue create mode 100644 uni_modules/uni-goods-nav/package.json create mode 100644 uni_modules/uni-goods-nav/readme.md create mode 100644 uni_modules/uni-grid/changelog.md create mode 100644 uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue create mode 100644 uni_modules/uni-grid/components/uni-grid/uni-grid.vue create mode 100644 uni_modules/uni-grid/package.json create mode 100644 uni_modules/uni-grid/readme.md create mode 100644 uni_modules/uni-group/changelog.md create mode 100644 uni_modules/uni-group/components/uni-group/uni-group.vue create mode 100644 uni_modules/uni-group/package.json create mode 100644 uni_modules/uni-group/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-id-common/changelog.md create mode 100644 uni_modules/uni-id-common/package.json create mode 100644 uni_modules/uni-id-common/readme.md create mode 100644 uni_modules/uni-id-common/uniCloud/cloudfunctions/common/uni-id-common/index.js create mode 100644 uni_modules/uni-id-common/uniCloud/cloudfunctions/common/uni-id-common/package.json create mode 100644 uni_modules/uni-indexed-list/changelog.md create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list-item.vue create mode 100644 uni_modules/uni-indexed-list/components/uni-indexed-list/uni-indexed-list.vue create mode 100644 uni_modules/uni-indexed-list/package.json create mode 100644 uni_modules/uni-indexed-list/readme.md create mode 100644 uni_modules/uni-link/changelog.md create mode 100644 uni_modules/uni-link/components/uni-link/uni-link.vue create mode 100644 uni_modules/uni-link/package.json create mode 100644 uni_modules/uni-link/readme.md create mode 100644 uni_modules/uni-list/changelog.md create mode 100644 uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss create mode 100644 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue create mode 100644 uni_modules/uni-list/components/uni-list-item/uni-list-item.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-list.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.vue create mode 100644 uni_modules/uni-list/components/uni-list/uni-refresh.wxs create mode 100644 uni_modules/uni-list/package.json create mode 100644 uni_modules/uni-list/readme.md create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-nav-bar/changelog.md create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue create mode 100644 uni_modules/uni-nav-bar/package.json create mode 100644 uni_modules/uni-nav-bar/readme.md create mode 100644 uni_modules/uni-notice-bar/changelog.md create mode 100644 uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue create mode 100644 uni_modules/uni-notice-bar/package.json create mode 100644 uni_modules/uni-notice-bar/readme.md create mode 100644 uni_modules/uni-number-box/changelog.md create mode 100644 uni_modules/uni-number-box/components/uni-number-box/uni-number-box.vue create mode 100644 uni_modules/uni-number-box/package.json create mode 100644 uni_modules/uni-number-box/readme.md create mode 100644 uni_modules/uni-pagination/changelog.md create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/en.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/es.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/index.js create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/uni-pagination.vue create mode 100644 uni_modules/uni-pagination/package.json create mode 100644 uni_modules/uni-pagination/readme.md create mode 100644 uni_modules/uni-popup/changelog.md create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/en.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/index.js create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json create mode 100644 uni_modules/uni-popup/components/uni-popup/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup/popup.js create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.vue create mode 100644 uni_modules/uni-popup/package.json create mode 100644 uni_modules/uni-popup/readme.md create mode 100644 uni_modules/uni-rate/changelog.md create mode 100644 uni_modules/uni-rate/components/uni-rate/uni-rate.vue create mode 100644 uni_modules/uni-rate/package.json create mode 100644 uni_modules/uni-rate/readme.md create mode 100644 uni_modules/uni-row/changelog.md create mode 100644 uni_modules/uni-row/components/uni-col/uni-col.vue create mode 100644 uni_modules/uni-row/components/uni-row/uni-row.vue create mode 100644 uni_modules/uni-row/package.json create mode 100644 uni_modules/uni-row/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uni-search-bar/changelog.md create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/en.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/index.js create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hans.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/i18n/zh-Hant.json create mode 100644 uni_modules/uni-search-bar/components/uni-search-bar/uni-search-bar.vue create mode 100644 uni_modules/uni-search-bar/package.json create mode 100644 uni_modules/uni-search-bar/readme.md create mode 100644 uni_modules/uni-segmented-control/changelog.md create mode 100644 uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue create mode 100644 uni_modules/uni-segmented-control/package.json create mode 100644 uni_modules/uni-segmented-control/readme.md create mode 100644 uni_modules/uni-steps/changelog.md create mode 100644 uni_modules/uni-steps/components/uni-steps/uni-steps.vue create mode 100644 uni_modules/uni-steps/package.json create mode 100644 uni_modules/uni-steps/readme.md create mode 100644 uni_modules/uni-swipe-action/changelog.md create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/bindingx.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpalipay.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpother.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/render.js create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/uni-swipe-action-item.vue create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action-item/wx.wxs create mode 100644 uni_modules/uni-swipe-action/components/uni-swipe-action/uni-swipe-action.vue create mode 100644 uni_modules/uni-swipe-action/package.json create mode 100644 uni_modules/uni-swipe-action/readme.md create mode 100644 uni_modules/uni-swiper-dot/changelog.md create mode 100644 uni_modules/uni-swiper-dot/components/uni-swiper-dot/uni-swiper-dot.vue create mode 100644 uni_modules/uni-swiper-dot/package.json create mode 100644 uni_modules/uni-swiper-dot/readme.md create mode 100644 uni_modules/uni-table/changelog.md create mode 100644 uni_modules/uni-table/components/uni-table/uni-table.vue create mode 100644 uni_modules/uni-table/components/uni-tbody/uni-tbody.vue create mode 100644 uni_modules/uni-table/components/uni-td/uni-td.vue create mode 100644 uni_modules/uni-table/components/uni-th/filter-dropdown.vue create mode 100644 uni_modules/uni-table/components/uni-th/uni-th.vue create mode 100644 uni_modules/uni-table/components/uni-thead/uni-thead.vue create mode 100644 uni_modules/uni-table/components/uni-tr/table-checkbox.vue create mode 100644 uni_modules/uni-table/components/uni-tr/uni-tr.vue create mode 100644 uni_modules/uni-table/i18n/en.json create mode 100644 uni_modules/uni-table/i18n/es.json create mode 100644 uni_modules/uni-table/i18n/fr.json create mode 100644 uni_modules/uni-table/i18n/index.js create mode 100644 uni_modules/uni-table/i18n/zh-Hans.json create mode 100644 uni_modules/uni-table/i18n/zh-Hant.json create mode 100644 uni_modules/uni-table/package.json create mode 100644 uni_modules/uni-table/readme.md create mode 100644 uni_modules/uni-tag/changelog.md create mode 100644 uni_modules/uni-tag/components/uni-tag/uni-tag.vue create mode 100644 uni_modules/uni-tag/package.json create mode 100644 uni_modules/uni-tag/readme.md create mode 100644 uni_modules/uni-test/changelog.md create mode 100644 uni_modules/uni-test/components/uni-test/uni-test.vue create mode 100644 uni_modules/uni-test/package.json create mode 100644 uni_modules/uni-test/readme.md create mode 100644 uni_modules/uni-title/changelog.md create mode 100644 uni_modules/uni-title/components/uni-title/uni-title.vue create mode 100644 uni_modules/uni-title/package.json create mode 100644 uni_modules/uni-title/readme.md create mode 100644 uni_modules/uni-transition/changelog.md create mode 100644 uni_modules/uni-transition/components/uni-transition/createAnimation.js create mode 100644 uni_modules/uni-transition/components/uni-transition/uni-transition.vue create mode 100644 uni_modules/uni-transition/package.json create mode 100644 uni_modules/uni-transition/readme.md create mode 100644 uni_modules/uni-ui/changelog.md create mode 100644 uni_modules/uni-ui/components/uni-ui/uni-ui.vue create mode 100644 uni_modules/uni-ui/package.json create mode 100644 uni_modules/uni-ui/readme.md create mode 100644 user/account/account.vue create mode 100644 user/addStaff/addStaff.vue create mode 100644 user/article/article.vue create mode 100644 user/email/email.vue create mode 100644 user/info/info.vue create mode 100644 user/password/password.vue create mode 100644 user/phone/phone.vue create mode 100644 user/plans/plans.vue create mode 100644 user/qrcode/qrcode.vue create mode 100644 user/reg/reg.vue create mode 100644 user/scheme/scheme.vue create mode 100644 user/selectAccount/selectAccount.vue create mode 100644 user/send/send.vue create mode 100644 user/setting/setting.vue create mode 100644 user/study/study.vue diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2857694 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +unpackage +node_modules diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..37af134 --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,24 @@ +{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version": "0.0", + "configurations": [{ + "default" : + { + "launchtype" : "local" + }, + "h5" : + { + "launchtype" : "local" + }, + "mp-toutiao" : + { + "launchtype" : "local" + }, + "mp-weixin" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..55be1b2 --- /dev/null +++ b/App.vue @@ -0,0 +1,36 @@ + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..2837dc6 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# 职站商城 \ No newline at end of file diff --git a/apis/modules/article.js b/apis/modules/article.js new file mode 100644 index 0000000..c67ac27 --- /dev/null +++ b/apis/modules/article.js @@ -0,0 +1,26 @@ +import request from '@/apis/request.js' +const { get, post } = request + +export const partnerOperatingList = (data) => { + return post('nakadai/nakadai/partner/article/management/partnerOperatingList', data) +} + +export const findById = id => { + return post('nakadai/nakadai/applets/partner/browse?contentId=' + id) +} + +export const queryClassificationByType = id => { + return post('nakadai/nakadai/partner/article/classification/queryClassificationByType?typeId=' + id) +} + +export const schemeList = data => { + return post('nakadai/nakadai/partner/schemeManagement/schemeList', data) +} + +export const schemeFindById = id => { + return post('nakadai/nakadai/partner/schemeManagement/findById?id=' + id) +} + +export const collectCourse = (id, state) => { + return post('nakadai/nakadai/partner/article/management/collectCourse?contentId=' + id + '&state=' + state) +} \ No newline at end of file diff --git a/apis/modules/client.js b/apis/modules/client.js new file mode 100644 index 0000000..560370c --- /dev/null +++ b/apis/modules/client.js @@ -0,0 +1,54 @@ +import request from '@/apis/request.js' +const { get, post } = request + +export const queryCustomer = (data) => { + return post('nakadai/nakadai/customer/queryCustomer', data) +} + +export const list = (data) => { + return post('nakadai/nakadai/applets/customer/getCustomerListBasedOnBusinessManagerId', data) +} + +export const all = (data) => { + return post('nakadai/nakadai/applets/customer/customerList', data) +} + +export const queryCustomerDetails = (data) => { + return get('nakadai/nakadai/customer/queryCustomerDetails', data) +} + +export const querySchool = (data) => { + return get('nakadai/nakadai/school/querySchool', data) +} + +export const queryIndustryClass = (data) => { + return get('nakadai/nakadai/hrIndustryClass/queryIndustryClass', data) +} + +export const queryIndustry = (data) => { + return get('nakadai/nakadai/hrIndustry/queryIndustry', data) +} + +export const queryCustomerIsExists = (data) => { + return get('nakadai/nakadai/customer/queryCustomerIsExists', data) +} + +export const addCustomer = (data) => { + return post('nakadai/nakadai/customer/addCustomer', data) +} + +export const updateCustomer = (data) => { + return post('nakadai/nakadai/customer/updateCustomer', data) +} + +export const getProductsSubscribedByCustomers = (data) => { + return get('nakadai/nakadai/customer/getProductsSubscribedByCustomers', data) +} + +export const getTeamsByAccountId = (data) => { + return post('nakadai/nakadai/applets/customer/getTeamsByAccountId', data) +} + +export const getTheBusinessManagerIdsUnderTheTeam = id => { + return post(`nakadai/nakadai/applets/customer/getTheBusinessManagerIdsUnderTheTeam?id=${id}`) +} \ No newline at end of file diff --git a/apis/modules/course.js b/apis/modules/course.js new file mode 100644 index 0000000..7677fe6 --- /dev/null +++ b/apis/modules/course.js @@ -0,0 +1,38 @@ +import request from '@/apis/request.js' +const { get, post } = request + +export const getSchoolCourseAuthority = () => { + return get('nakadai/nakadai/curriculum/getSchoolCourseAuthority') +} + +export const recentUse = data => { + return post('nakadai/nakadai/curriculum/recentUse', data) +} + +export const schoolCourse = data => { + return get('nakadai/nakadai/curriculum/schoolCourse', data) +} + +export const queryChaptersAndSubsections = id => { + return get('nakadai/nakadai/curriculum/chapter/queryChaptersAndSubsections/' + id) +} + +export const curriculumDetail = (cid, mallId) => { + return post(`nakadai/nakadai/curriculum/curriculumDetail?cid=${cid}&mallId=${mallId}`) +} + +export const queryPracticeByStudent = data => { + return post('occupationlab/occupationlab/achievement/queryPracticeByStudent', data) +} + +export const queryAssessmentByStudent = data => { + return post('occupationlab/occupationlab/achievement/queryAssessmentByStudent', data) +} + +export const practiceByStudentDetail = data => { + return post(`occupationlab/occupationlab/achievement/practiceByStudentDetail?curriculumId=${data.cid}&projectId=${data.projectId}&paperId=${data.paperId}&pageNum=${data.page}&pageSize=${data.pageSize}`) +} + +export const experimentOverview = () => { + return get('occupationlab/occupationlab/achievement/experimentOverview') +} \ No newline at end of file diff --git a/apis/modules/order.js b/apis/modules/order.js new file mode 100644 index 0000000..e9a003d --- /dev/null +++ b/apis/modules/order.js @@ -0,0 +1,42 @@ +import request from '@/apis/request.js' +const { get, post } = request + +export const getOrderOtherTime = (data) => { + return post('nakadai/nakadai/orderOther/getOrderOtherTime', data) +} + +export const add = (data) => { + return post('nakadai/nakadai/order/add', data) +} + +export const update = (data) => { + return post('nakadai/nakadai/order/update', data) +} + +export const getDetail = (data) => { + return get('nakadai/nakadai/order/get', data) +} + +export const renew = (data) => { + return post('nakadai/nakadai/orderOther/renew', data) +} + +export const list = (data) => { + return post('nakadai/nakadai/applets/order/orderList', data) +} + +export const orderList = (data) => { + return post('nakadai/nakadai/order/list', data) +} + +export const del = (data) => { + return post('nakadai/nakadai/order/delete', data) +} + +export const miniProgramOrderRecord = (data) => { + return post('nakadai/nakadai/applets/order/miniProgramOrderRecord', data) +} + +export const queryCitySettlementPrice = (mallId, provinceId, cityId) => { + return post(`nakadai/mallPrice/queryCitySettlementPrice?mallId=${mallId}&provinceId=${provinceId}&cityId=${cityId}`) +} \ No newline at end of file diff --git a/apis/modules/parner.js b/apis/modules/parner.js new file mode 100644 index 0000000..c3a3f0b --- /dev/null +++ b/apis/modules/parner.js @@ -0,0 +1,42 @@ +import request from '@/apis/request.js' +const { get, post } = request + +export const savePartnerAccount = (data) => { + return post('nakadai/nakadai/partnerAccount/savePartnerAccount', data) +} + +export const teamList = (data) => { + return post('nakadai/nakadai/partnerAccount/partnerAccountList', data) +} + +export const generateInvitationCode = accountId => { + return post(`nakadai/nakadai/partnerAccount/generateInvitationCode?accountId=${accountId}`) +} + +export const treeList = (data) => { + return post('nakadai/nakadai/partnerClassification/treeList', data) +} + +export const my = (data) => { + return get('nakadai/nakadai/partner-team/my', data) +} + +export const mailFileSend = (data) => { + return post('nakadai/nakadai/partnerAccount/mailFileSend', data) +} + +export const salesProgress = data => { + return post(`nakadai/nakadai/applets/partner/salesProgress`, data) +} + +export const annualOperatingAnalysis = data => { + return post(`nakadai/nakadai/applets/partner/annualOperatingAnalysis`, data) +} + +export const editProvinceCity = data => { + return post(`nakadai/nakadai/partner-team/editProvinceCity`, data) +} + +export const getPartnerTeamRates = data => { + return post(`nakadai/nakadai/partner-team/getPartnerTeamRates`, data) +} \ No newline at end of file diff --git a/apis/modules/product.js b/apis/modules/product.js new file mode 100644 index 0000000..4726020 --- /dev/null +++ b/apis/modules/product.js @@ -0,0 +1,50 @@ +import request from '@/apis/request.js' +const { get, post } = request + +export const AppletsDataProductList = (data) => { + return post('nakadai/nakadai/dataProduct/AppletsDataProductList', data) +} + +export const tagsList = () => { + return get('nakadai/tags/tagsList') +} + +export const listOfGoods = (data) => { + return post('nakadai/mall/listOfGoods', data) +} + +export const detailsOfGoods = (id) => { + return get('nakadai/mall/detailsOfGoods?mallId=' + id) +} + +export const productCategoryList = () => { + return get('nakadai/productClassification/productCategoryList') +} + +export const productTypeList = () => { + return get('nakadai/productType/productTypeList') +} + +export const addToShoppingCart = (data) => { + return post('nakadai/mini/program/shopping/cart/addToShoppingCart', data) +} + +export const delCart = (data) => { + return post('nakadai/mini/program/shopping/cart/batchDeletion', data) +} + +export const shoppingCartList = (data) => { + return post('nakadai/mini/program/shopping/cart/shoppingCartList', data) +} + +export const courseDiscipline = () => { + return get('nakadai/nakadai/subject/courseDiscipline') +} + +export const courseProfessionalClass = id => { + return get('nakadai/nakadai/subject/courseProfessionalClass?disciplineId=' + id) +} + +export const courseProfessional = id => { + return get('nakadai/nakadai/subject/courseProfessional?professionalClassId=' + id) +} \ No newline at end of file diff --git a/apis/modules/user.js b/apis/modules/user.js new file mode 100644 index 0000000..effec4a --- /dev/null +++ b/apis/modules/user.js @@ -0,0 +1,100 @@ +import Config from '@/config/request.js' +import request from '@/apis/request.js' +const { get, post } = request + +export const studentWeChatAppletCallback = (data) => { + return post('users/users/user/studentWeChatAppletCallback', data) +} + +export const studentBinding = (data) => { + return post('users/users/user/studentBinding', data) +} + +export const weChatToken = (data) => { + return post('users/users/user/weChatToken', data) +} + +export const captcha = (data) => { + return Config.baseURL + `users/users/user/captcha` +} + +export const queryProvince = () => { + return get('nakadai/nakadai/province/queryProvince') +} + +export const queryCity = (data) => { + return get('nakadai/nakadai/city/queryCity', data) +} + +export const updateAvatars = url => { + return post(`users/users/user/updateAvatars?url=` + url) +} + +export const userBinding = (data) => { + return post('users/users/user/userBinding', data) +} +export const sendPhoneOrEmailCode = (data) => { + return post('users/users/userAccount/sendPhoneOrEmailCode', data) +} + +export const examinePassword = (data) => { + return post('users/users/userAccount/examinePassword', data) +} + +export const getUserRolesPermissionMenu = (data) => { + return get('users/users/user-role/getUserRolesPermissionMenu', data) +} + +export const updatePersonCenter = (data) => { + return post('users/users/userAccount/updatePersonCenter', data) +} + +export const queryUserInfoDetails = () => { + return get('users/users/userAccount/queryUserInfoDetails') +} + +export const updateMyEmail = (data) => { + return post('nakadai/nakadai/partner-team/updateMyEmail', data) +} + +export const mailCodeSend = (data) => { + return post('nakadai/nakadai/partner-team/mailCodeSend', data) +} + +export const changeAccount = account => { + return post(`users/users/applets/mine/changeAccount?account=${account}`) +} + +export const changePhoneNumber = (phone, code) => { + return post(`users/users/applets/mine/changePhoneNumber?phone=${phone}&code=${code}`) +} + +export const checkIfAnAccountExists = account => { + return post(`users/users/applets/mine/checkIfAnAccountExists?account=${account}`) +} + +export const checkIfThePhoneNumberExists = phone => { + return post(`users/users/applets/mine/checkIfThePhoneNumberExists?phone=${phone}`) +} + +export const queryPartnerAccount = data => { + return post(`nakadai/nakadai/partnerAccount/queryPartnerAccount?phone=${data.phone}&openId=${data.openId}&douYinOpenId=${data.douYinOpenId}`) +} + +export const getSessionKey = data => { + return post(`users/users/user/getSessionKey`, data) +} + +export const partnerAccountApplication = data => { + return post(`nakadai/nakadai/partnerAccount/partnerAccountApplication`, data) +} + +export const loginByOpenid = openid => { + return post(`users/users/user/loginByOpenid?openid=${openid}`) +} + +export const checkWorkNumOrAccount = account => { + return post(`occupationlab/occupationlab/architecture/checkWorkNumOrAccount?platformId=4&type=0&account=` + account) +} + +export const updateUserAvatars = `http://39.108.250.202:9000/users/users/userAccount/updateUserAvatars` \ No newline at end of file diff --git a/apis/request.js b/apis/request.js new file mode 100644 index 0000000..4ea0553 --- /dev/null +++ b/apis/request.js @@ -0,0 +1,80 @@ +import config from '@/config/request' +let logouted = 0 + +const request = options => { + const header = Object.assign({}, config.headers, { + token: uni.getStorageSync('token') + }) + const otherUrl = ['queryPartnerAccount', 'getSessionKey', 'loginByOpenid', 'partnerAccountApplication', 'checkWorkNumOrAccount'] + return new Promise((resolve, reject)=>{ + const { url } = options + uni.request({ + header, + // url: (otherUrl.find(e => url.includes(e)) ? 'http://192.168.31.116:9000/' : config.baseURL) + url, + url: config.baseURL + url, + method: options.method || 'GET', // 请求类型,默认为GET + data: options.data || {}, // 请求参数,默认空对象 + success: ({ data }) => { + const { status, message, code } = data + // 状态判断,根据后台定义并提示 + if (status === 200) { + resolve(data) + } else if (status == 401 || code === 401) { + if (!logouted) { + // 登录过期 + uni.clearStorageSync() + uni.showToast({ + title: message || '登录过期,请重新登录', + icon: 'none' + }) + setTimeout(() => { + logouted = 0 + uni.reLaunch({ + url: '/pages/index/index' + }) + }, 1500) + reject(data) + logouted = 1 + } + } else if (status == 10028 || status == 10014) { // 用户不存在 + resolve(data) + } else if (!status) { + resolve(data) + } else { + uni.showToast({ + title: message, + icon: 'none' + }) + reject(data) + } + }, + fail: err => { + uni.showToast({ + title: '请求失败!', + icon: 'none' + }) + reject(err) + }, + }) + }) +} + +const get = (url, data, options = {}) => { + options.method = 'GET' + options.data = data + options.url = url + return request(options) +} + +const post = (url, data, options = {}) => { + options.method = 'POST' + options.data = data + options.url = url + return request(options) +} + +export default { + request, + get, + post +} \ No newline at end of file diff --git a/components/empty/empty.vue b/components/empty/empty.vue new file mode 100644 index 0000000..42d2f06 --- /dev/null +++ b/components/empty/empty.vue @@ -0,0 +1,40 @@ + + + + + diff --git a/components/filter-popup/components/mask.vue b/components/filter-popup/components/mask.vue new file mode 100644 index 0000000..521f0d9 --- /dev/null +++ b/components/filter-popup/components/mask.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/components/filter-popup/components/popup.vue b/components/filter-popup/components/popup.vue new file mode 100644 index 0000000..fffcfdc --- /dev/null +++ b/components/filter-popup/components/popup.vue @@ -0,0 +1,510 @@ + + + + + diff --git a/components/filter-popup/detail.md b/components/filter-popup/detail.md new file mode 100644 index 0000000..e704412 --- /dev/null +++ b/components/filter-popup/detail.md @@ -0,0 +1,155 @@ +## 导入即用 全端支持 + +### 有问题 + wx : zy597172583 标注来意 可评论 看到及时回复 +1.使用方式 + +```javascript + + + diff --git a/components/notAuth/notAuth.vue b/components/notAuth/notAuth.vue new file mode 100644 index 0000000..52f9d08 --- /dev/null +++ b/components/notAuth/notAuth.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/config/product.js b/config/product.js new file mode 100644 index 0000000..206e21d --- /dev/null +++ b/config/product.js @@ -0,0 +1,10 @@ +/** +/** + * 产品 配置文件 + * @author yujialong + */ + +export default { + normalIcon: 'https://huoran.oss-cn-shenzhen.aliyuncs.com/20220609/png/1534733700683030528.png', // 通用图标 + dataIcon: 'https://huoran.oss-cn-shenzhen.aliyuncs.com/20220627/png/1541256164447641600.png' // 数据图标 +} diff --git a/config/request.js b/config/request.js new file mode 100644 index 0000000..430eec3 --- /dev/null +++ b/config/request.js @@ -0,0 +1,21 @@ +/** +/** + * 请求配置文件 + * @author yujialong + */ + +export default { + // baseURL: 'https://izhixinyun.com/', + baseURL: 'http://192.168.31.51:9000/', + // baseURL: 'http://121.37.12.51/', + headers: { + 'Content-Type': 'application/json;charset=UTF-8' + }, + data: {}, + method: 'POST', + responseType: 'json', // 响应数据类型 + withCredentials: false, // 携带cookie + // ======================== 以下为注入axios的配置项 ============================= + showLoading: true, // 是否显示加载动画 + isFormData: false // 是否序列化表单数据 +} diff --git a/course/addCourse/addCourse.vue b/course/addCourse/addCourse.vue new file mode 100644 index 0000000..40c3996 --- /dev/null +++ b/course/addCourse/addCourse.vue @@ -0,0 +1,399 @@ + + + + + diff --git a/course/clients/clients.vue b/course/clients/clients.vue new file mode 100644 index 0000000..3612133 --- /dev/null +++ b/course/clients/clients.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/course/courseDetail/courseDetail.vue b/course/courseDetail/courseDetail.vue new file mode 100644 index 0000000..d2a1b3e --- /dev/null +++ b/course/courseDetail/courseDetail.vue @@ -0,0 +1,334 @@ + + + + + diff --git a/course/curClient/curClient.vue b/course/curClient/curClient.vue new file mode 100644 index 0000000..f02cfdc --- /dev/null +++ b/course/curClient/curClient.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/course/editCourse/editCourse.vue b/course/editCourse/editCourse.vue new file mode 100644 index 0000000..2eb2a5d --- /dev/null +++ b/course/editCourse/editCourse.vue @@ -0,0 +1,504 @@ + + + + + diff --git a/course/orderDetail/orderDetail.vue b/course/orderDetail/orderDetail.vue new file mode 100644 index 0000000..74f3fd0 --- /dev/null +++ b/course/orderDetail/orderDetail.vue @@ -0,0 +1,1201 @@ + + + + + diff --git a/course/ordered/ordered.vue b/course/ordered/ordered.vue new file mode 100644 index 0000000..85e08f0 --- /dev/null +++ b/course/ordered/ordered.vue @@ -0,0 +1,285 @@ + + + + + diff --git a/course/practiceDetail/practiceDetail.vue b/course/practiceDetail/practiceDetail.vue new file mode 100644 index 0000000..b1967d4 --- /dev/null +++ b/course/practiceDetail/practiceDetail.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/course/privacyAgreement/privacyAgreement.vue b/course/privacyAgreement/privacyAgreement.vue new file mode 100644 index 0000000..f8dfd12 --- /dev/null +++ b/course/privacyAgreement/privacyAgreement.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/course/products/products.vue b/course/products/products.vue new file mode 100644 index 0000000..33058e9 --- /dev/null +++ b/course/products/products.vue @@ -0,0 +1,399 @@ + + + + + diff --git a/course/serviceAgreement/serviceAgreement.vue b/course/serviceAgreement/serviceAgreement.vue new file mode 100644 index 0000000..391b6d7 --- /dev/null +++ b/course/serviceAgreement/serviceAgreement.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/course/shopCart/shopCart.vue b/course/shopCart/shopCart.vue new file mode 100644 index 0000000..40fe190 --- /dev/null +++ b/course/shopCart/shopCart.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..9efb733 --- /dev/null +++ b/index.html @@ -0,0 +1,14 @@ + + + + + + + + + + +
+ + + diff --git a/libs/Oss/base64.js b/libs/Oss/base64.js new file mode 100644 index 0000000..4535327 --- /dev/null +++ b/libs/Oss/base64.js @@ -0,0 +1,135 @@ +export const Base64 = { + + // private property + _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", + + // public method for encoding + encode : function (input) { + var output = ""; + var chr1, chr2, chr3, enc1, enc2, enc3, enc4; + var i = 0; + + input = Base64._utf8_encode(input); + + while (i < input.length) { + + chr1 = input.charCodeAt(i++); + chr2 = input.charCodeAt(i++); + chr3 = input.charCodeAt(i++); + + enc1 = chr1 >> 2; + enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); + enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); + enc4 = chr3 & 63; + + if (isNaN(chr2)) { + enc3 = enc4 = 64; + } else if (isNaN(chr3)) { + enc4 = 64; + } + + output = output + + this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + + this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); + + } + + return output; + }, + + // public method for decoding + decode : function (input) { + var output = ""; + var chr1, chr2, chr3; + var enc1, enc2, enc3, enc4; + var i = 0; + + input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); + + while (i < input.length) { + + enc1 = this._keyStr.indexOf(input.charAt(i++)); + enc2 = this._keyStr.indexOf(input.charAt(i++)); + enc3 = this._keyStr.indexOf(input.charAt(i++)); + enc4 = this._keyStr.indexOf(input.charAt(i++)); + + chr1 = (enc1 << 2) | (enc2 >> 4); + chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); + chr3 = ((enc3 & 3) << 6) | enc4; + + output = output + String.fromCharCode(chr1); + + if (enc3 != 64) { + output = output + String.fromCharCode(chr2); + } + if (enc4 != 64) { + output = output + String.fromCharCode(chr3); + } + + } + + output = Base64._utf8_decode(output); + + return output; + + }, + + // private method for UTF-8 encoding + _utf8_encode : function (string) { + string = string.replace(/\r\n/g,"\n"); + var utftext = ""; + + for (var n = 0; n < string.length; n++) { + + var c = string.charCodeAt(n); + + if (c < 128) { + utftext += String.fromCharCode(c); + } + else if((c > 127) && (c < 2048)) { + utftext += String.fromCharCode((c >> 6) | 192); + utftext += String.fromCharCode((c & 63) | 128); + } + else { + utftext += String.fromCharCode((c >> 12) | 224); + utftext += String.fromCharCode(((c >> 6) & 63) | 128); + utftext += String.fromCharCode((c & 63) | 128); + } + + } + + return utftext; + }, + + // private method for UTF-8 decoding + _utf8_decode : function (utftext) { + var string = ""; + var i = 0; + var c = c1 = c2 = 0; + + while ( i < utftext.length ) { + + c = utftext.charCodeAt(i); + + if (c < 128) { + string += String.fromCharCode(c); + i++; + } + else if((c > 191) && (c < 224)) { + c2 = utftext.charCodeAt(i+1); + string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); + i += 2; + } + else { + c2 = utftext.charCodeAt(i+1); + c3 = utftext.charCodeAt(i+2); + string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); + i += 3; + } + + } + + return string; + } + +} \ No newline at end of file diff --git a/libs/Oss/crypto.js b/libs/Oss/crypto.js new file mode 100644 index 0000000..7807ea4 --- /dev/null +++ b/libs/Oss/crypto.js @@ -0,0 +1,117 @@ +var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; +let Crypto = {}; +var util = Crypto.util = { + rotl: function (n, b) { + return (n << b) | (n >>> (32 - b)); + }, + rotr: function (n, b) { + return (n << (32 - b)) | (n >>> b); + }, + endian: function (n) { + if (n.constructor == Number) { + return util.rotl(n, 8) & 0x00FF00FF | + util.rotl(n, 24) & 0xFF00FF00; + } + for (var i = 0; i < n.length; i++) + n[i] = util.endian(n[i]); + return n; + }, + randomBytes: function (n) { + for (var bytes = []; n > 0; n--) + bytes.push(Math.floor(Math.random() * 256)); + return bytes; + }, + stringToBytes: function (str) { + var bytes = []; + for (var i = 0; i < str.length; i++) + bytes.push(str.charCodeAt(i)); + return bytes; + }, + bytesToString: function (bytes) { + var str = []; + for (var i = 0; i < bytes.length; i++) + str.push(String.fromCharCode(bytes[i])); + return str.join(""); + }, + stringToWords: function (str) { + var words = []; + for (var c = 0, b = 0; c < str.length; c++, b += 8) + words[b >>> 5] |= str.charCodeAt(c) << (24 - b % 32); + return words; + }, + bytesToWords: function (bytes) { + var words = []; + for (var i = 0, b = 0; i < bytes.length; i++, b += 8) + words[b >>> 5] |= bytes[i] << (24 - b % 32); + return words; + }, + wordsToBytes: function (words) { + var bytes = []; + for (var b = 0; b < words.length * 32; b += 8) + bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF); + return bytes; + }, + bytesToHex: function (bytes) { + var hex = []; + for (var i = 0; i < bytes.length; i++) { + hex.push((bytes[i] >>> 4).toString(16)); + hex.push((bytes[i] & 0xF).toString(16)); + } + return hex.join(""); + }, + hexToBytes: function (hex) { + var bytes = []; + for (var c = 0; c < hex.length; c += 2) + bytes.push(parseInt(hex.substr(c, 2), 16)); + return bytes; + }, + bytesToBase64: function (bytes) { + if (typeof btoa == "function") return btoa(util.bytesToString(bytes)); + var base64 = [], + overflow; + for (var i = 0; i < bytes.length; i++) { + switch (i % 3) { + case 0: + base64.push(base64map.charAt(bytes[i] >>> 2)); + overflow = (bytes[i] & 0x3) << 4; + break; + case 1: + base64.push(base64map.charAt(overflow | (bytes[i] >>> 4))); + overflow = (bytes[i] & 0xF) << 2; + break; + case 2: + base64.push(base64map.charAt(overflow | (bytes[i] >>> 6))); + base64.push(base64map.charAt(bytes[i] & 0x3F)); + overflow = -1; + } + } + if (overflow != undefined && overflow != -1) + base64.push(base64map.charAt(overflow)); + while (base64.length % 4 != 0) base64.push("="); + return base64.join(""); + }, + base64ToBytes: function (base64) { + if (typeof atob == "function") return util.stringToBytes(atob(base64)); + base64 = base64.replace(/[^A-Z0-9+\/]/ig, ""); + var bytes = []; + for (var i = 0; i < base64.length; i++) { + switch (i % 4) { + case 1: + bytes.push((base64map.indexOf(base64.charAt(i - 1)) << 2) | + (base64map.indexOf(base64.charAt(i)) >>> 4)); + break; + case 2: + bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0xF) << 4) | + (base64map.indexOf(base64.charAt(i)) >>> 2)); + break; + case 3: + bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0x3) << 6) | + (base64map.indexOf(base64.charAt(i)))); + break; + } + } + return bytes; + } +}; +Crypto.mode = {}; +export default Crypto; \ No newline at end of file diff --git a/libs/Oss/hmac.js b/libs/Oss/hmac.js new file mode 100644 index 0000000..1918f4c --- /dev/null +++ b/libs/Oss/hmac.js @@ -0,0 +1,37 @@ +import Crypto from './crypto.js'; +/*! + * Crypto-JS v1.1.0 + * http://code.google.com/p/crypto-js/ + * Copyright (c) 2009, Jeff Mott. All rights reserved. + * http://code.google.com/p/crypto-js/wiki/License + */ +(function(){ + +// Shortcut +var util = Crypto.util; + +Crypto.HMAC = function (hasher, message, key, options) { + + // Allow arbitrary length keys + key = key.length > hasher._blocksize * 4 ? + hasher(key, { asBytes: true }) : + util.stringToBytes(key); + + // XOR keys with pad constants + var okey = key, + ikey = key.slice(0); + for (var i = 0; i < hasher._blocksize * 4; i++) { + okey[i] ^= 0x5C; + ikey[i] ^= 0x36; + } + + var hmacbytes = hasher(util.bytesToString(okey) + + hasher(util.bytesToString(ikey) + message, { asString: true }), + { asBytes: true }); + return options && options.asBytes ? hmacbytes : + options && options.asString ? util.bytesToString(hmacbytes) : + util.bytesToHex(hmacbytes); + +}; + +})(); \ No newline at end of file diff --git a/libs/Oss/sha1.js b/libs/Oss/sha1.js new file mode 100644 index 0000000..5632fd7 --- /dev/null +++ b/libs/Oss/sha1.js @@ -0,0 +1,82 @@ +import Crypto from './crypto.js'; +/*! + * Crypto-JS v1.1.0 + * http://code.google.com/p/crypto-js/ + * Copyright (c) 2009, Jeff Mott. All rights reserved. + * http://code.google.com/p/crypto-js/wiki/License + */ +(function(){ + +// Shortcut +var util = Crypto.util; + +// Public API +var SHA1 = Crypto.SHA1 = function (message, options) { + var digestbytes = util.wordsToBytes(SHA1._sha1(message)); + return options && options.asBytes ? digestbytes : + options && options.asString ? util.bytesToString(digestbytes) : + util.bytesToHex(digestbytes); +}; + +// The core +SHA1._sha1 = function (message) { + + var m = util.stringToWords(message), + l = message.length * 8, + w = [], + H0 = 1732584193, + H1 = -271733879, + H2 = -1732584194, + H3 = 271733878, + H4 = -1009589776; + + // Padding + m[l >> 5] |= 0x80 << (24 - l % 32); + m[((l + 64 >>> 9) << 4) + 15] = l; + + for (var i = 0; i < m.length; i += 16) { + + var a = H0, + b = H1, + c = H2, + d = H3, + e = H4; + + for (var j = 0; j < 80; j++) { + + if (j < 16) w[j] = m[i + j]; + else { + var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16]; + w[j] = (n << 1) | (n >>> 31); + } + + var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + ( + j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 : + j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 : + j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 : + (H1 ^ H2 ^ H3) - 899497514); + + H4 = H3; + H3 = H2; + H2 = (H1 << 30) | (H1 >>> 2); + H1 = H0; + H0 = t; + + } + + H0 += a; + H1 += b; + H2 += c; + H3 += d; + H4 += e; + + } + + return [H0, H1, H2, H3, H4]; + +}; + +// Package private blocksize +SHA1._blocksize = 16; + +})(); \ No newline at end of file diff --git a/libs/Oss/upload.js b/libs/Oss/upload.js new file mode 100644 index 0000000..a673826 --- /dev/null +++ b/libs/Oss/upload.js @@ -0,0 +1,71 @@ +import Crypto from './crypto.js'; +import './hmac.js'; +import './sha1.js'; +import Util from '@/libs/util' +import {Base64} from './base64.js'; + +let date=new Date() +date=date.setHours(date.getHours() + 24) +let extime=""+new Date(date).toISOString() +console.log(33, extime) +var policyText = { + "expiration": extime, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了 + "conditions": [ + ["content-length-range", 0, 1024*1024*100] // 设置上传文件的大小限制 + ] +}; +var config={ + accessid:'LTAI4FzqQHnk4rozqLZ8jCNj', + accesskey:'mveW7B1OyFoKUkHm8WsxmrjHmkJWHq', + osshost:'https://huoran.oss-cn-shenzhen.aliyuncs.com', + policyBase64:Base64.encode(JSON.stringify(policyText)) +} +var message = config.policyBase64; +var bytes = Crypto.HMAC(Crypto.SHA1, message, config.accesskey, { asBytes: true }) ; +var signature = Crypto.util.bytesToBase64(bytes); +var timetamp = new Date().getTime(); +function random_string(len) { +  len = len || 32; +  var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; +  var maxPos = chars.length; +  var pwd = ''; +  for (let i = 0; i < len; i++) { +   pwd += chars.charAt(Math.floor(Math.random() * maxPos)); + } + return pwd; +} +var OSS={ + name:'aliyun', + host:config.osshost, + accessid:config.accessid, + signature:signature, + policyBase64:config.policyBase64, +} +export default function(tempFilePaths, callback) { + const ext = Util.getFileExt(tempFilePaths) + const fileName = Date.now() + '.' + ext + uni.uploadFile({ +   url: OSS.host, +   filePath: tempFilePaths, + fileType: '', + name: 'file', + formData: { + name: fileName, + key: fileName,//文件名 +  policy: OSS.policyBase64, // 输入你获取的的policy + OSSAccessKeyId: OSS.accessid, // 输入你的AccessKeyId + success_action_status: '200', // 让服务端返回200,不然,默认会返回204 + signature: OSS.signature, // 输入你获取的的signature + }, + success: (res) => { + callback({ + name: fileName, + url: OSS.host + '/' + fileName, + ext + }) + }, + fail: (res) => { + console.log(res); + } +}) +}; \ No newline at end of file diff --git a/libs/WXBizDataCrypt.js b/libs/WXBizDataCrypt.js new file mode 100644 index 0000000..36b3de1 --- /dev/null +++ b/libs/WXBizDataCrypt.js @@ -0,0 +1,35 @@ +var crypto = require('crypto') + +function WXBizDataCrypt(appId, sessionKey) { + this.appId = appId + this.sessionKey = sessionKey +} + +WXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) { + // base64 decode + var sessionKey = new Buffer(this.sessionKey, 'base64') + encryptedData = new Buffer(encryptedData, 'base64') + iv = new Buffer(iv, 'base64') + + try { + // 解密 + var decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv) + // 设置自动 padding 为 true,删除填充补位 + decipher.setAutoPadding(true) + var decoded = decipher.update(encryptedData, 'binary', 'utf8') + decoded += decipher.final('utf8') + + decoded = JSON.parse(decoded) + + } catch (err) { + throw new Error('Illegal Buffer') + } + + if (decoded.watermark.appid !== this.appId) { + throw new Error('Illegal Buffer') + } + + return decoded +} + +module.exports = WXBizDataCrypt \ No newline at end of file diff --git a/libs/mtj-wx-sdk.config.js b/libs/mtj-wx-sdk.config.js new file mode 100644 index 0000000..e1d7474 --- /dev/null +++ b/libs/mtj-wx-sdk.config.js @@ -0,0 +1,39 @@ +/** + * @file 百度移动统计配置文件 + */ + +module.exports = { + /** + * 从百度移动统计获取的AppKey + * @type {string} + */ + appKey: 'ce2fa79380', + + /** + * 是否使用了插件 + * @type {boolean} + */ + hasPlugin: false, + + /** + * 是否获取当前的地理位置和速度信息 + * @type {boolean} + */ + getLocation: false, + + /** + * 是否获取组件滚动信息 + * @type {boolean} + */ + getComponentScroll: false, + /** + * 是否开启了A/B 测试 + * @type {boolean} + */ + hasABTest: false, + /** + * 是否开启热力图功能 + * @type {boolean} + */ + hasHeatmap: false, +}; diff --git a/libs/mtj-wx-sdk.js b/libs/mtj-wx-sdk.js new file mode 100644 index 0000000..b908aa2 --- /dev/null +++ b/libs/mtj-wx-sdk.js @@ -0,0 +1 @@ +var mtjwxsdk=function(t){"use strict";var e,n,r="1.10.23",o="https://hmma.baidu.com/mini.gif",a={app:["onShow","onHide","onError"],page:["onShow","onReady","onHide","onPageScroll"],share:["onShareAppMessage"],behavior:["tap"]},i="mtj_uuid",c="mtj_user",s="mtj_user_property",u="mtj_track_status",f="mtj_remote_config",l="mtj_ab_experiment_list",h="mtj_ab_active_experiment_ids",p={},d={type:1},g={aso:{}},m={},y=function(t){if(!1!==p.trackStatus){var n=t.data.et?{mtj_ii:t.data.uuid||"",mtj_et:t.data.et,mtj_en:t.data.en}:{};return e.request({url:t.url,data:t.data,header:Object.assign({"content-type":"application/json"},n,t.header),method:t.method||"POST",dataType:t.dataType||"json",success:function(e){t.success&&t.success(e)},fail:function(e){t.fail&&t.fail(e)}})}},v=function(){return"undefined"!=typeof crypto&&crypto.getRandomValues?crypto.getRandomValues(new Uint32Array(1))[0]:Math.floor(4294967295*Math.random())},b=function(t,e){return"[object "+e+"]"==={}.toString.call(t)},j=function(t,e,n){var r=(t=t.replace(new RegExp(e+"=[^&]*","g"),"").replace(/(\?|&)&/g,"$1").replace(/(\?|&)$/g,"")).indexOf("?")>0?"&":"?";return t+r+e+"="+encodeURIComponent(n)},S=function t(e){return b(e,"Object")||b(e,"Array")?(Object.keys(e).forEach((function(n){var r=e[n];b(r,"Object")||b(r,"Array")?e[n]=t(r):e[n]=""+r})),e):e},O=function(t){return b(t,"String")&&/^[a-z][a-z0-9_]{0,31}$/.test(t)},w=function(t){return b(t,"String")&&/^[a-z0-9_]{1,32}$/.test(t)},k=function(t){return b(t,"String")||b(t,"Number")},x=function(t){return b(t,"String")&&/^\d{11}$/.test(t)},P=function(t){return b(t,"String")&&28===t.length},_=0,T=function(t){return new Promise((function(e,n){return t.data=t.data||{},p.blacklist&&(p.blacklist.indexOf("all")>-1&&t.data.et||p.blacklist.indexOf("behavior")>-1&&"behavior"===t.data.et)?e():(t.data.v=r,t.data.rqc=++_,o=t.data,JSON.stringify(o).length<=204800?(t.success=function(t){return e(t)},t.fail=function(t){return n(t)},void y(t)):(_--,n(new Error("invalid data"))));var o}))},I=function(t,e){var n=b(e,"Object")?JSON.stringify(e):""+e;T({url:o,dataType:"string",data:Object.assign({},d,{et:"error",en:t,ep:{ex:n},rid:v()})})},A=function(t){t.rid=v(),t.aso=t.aso||{};var e={url:o,dataType:"string",data:Object.assign({},d,t)};T(e),(m.circleToken||m.circleByThreeFingers)&&("page"===t.et&&"show"===t.en||"behavior"===t.et&&"tap"===t.en)&&(e.url="https://hmma.baidu.com/mini.gif?circle=1",e.data.token=m.circleToken,T(e).catch((function(t){return console.error(t)})))};function E(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){var n=t&&("undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"]);if(null==n)return;var r,o,a=[],i=!0,c=!1;try{for(n=n.call(t);!(i=(r=n.next()).done)&&(a.push(r.value),!e||a.length!==e);i=!0);}catch(t){c=!0,o=t}finally{try{i||null==n.return||n.return()}finally{if(c)throw o}}return a}(t,e)||function(t,e){if(!t)return;if("string"==typeof t)return N(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);"Object"===n&&t.constructor&&(n=t.constructor.name);if("Map"===n||"Set"===n)return Array.from(t);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return N(t,e)}(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function N(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n>t/4).toString(16)})),q(i,t),p.hasABTest&&(U(l),U(h))),t}))},B=function(t){return new Promise((function(n){if(!t)return n();e.getShareInfo({shareTicket:t,success:function(t){delete t.errMsg,n(t)},fail:function(){n({})}})}))},M=function(){return n||(d.sid=v(),d.rqc=0,n=Promise.all([D(),new Promise((function(t){e.getSystemInfo({success:function(e){delete e.errMsg,t(e)},fail:function(){t({})}})})),new Promise((function(t){e.getNetworkType({success:function(e){delete e.errMsg,t(e)},fail:function(){t({})}})})),Promise.resolve().then((function(){var t=C(c),n=b(t,"Object")?t:{};return new Promise((function(t){e.getSetting({success:function(r){r.authSetting&&r.authSetting["scope.userInfo"]?e.getUserInfo({success:function(e){delete e.userInfo.errMsg,t(Object.assign(n,e.userInfo))},fail:function(){t(n)}}):t(n)},fail:function(){t(n)}})}))})),new Promise((function(t){if(!p.getLocation)return t({});e.getLocation({type:"wgs84",success:function(e){delete e.errMsg,t(e)},fail:function(){t({})}})})),Promise.resolve().then((function(){var t=C(s);return b(t,"Object")?t:{}}))]).then((function(t){var e=E(t,6),n=e[0],o=e[1],a=e[2],i=e[3],c=e[4],s=e[5];d.uuid=n,g.system=S(o),g.network=S(a),Object.keys(i).length>0&&(g.user=S(i)),Object.keys(c).length>0&&(g.location=S(c)),Object.keys(s).length>0&&(g.userProperty=JSON.stringify(s)),"devtools"===g.system.platform&&p.latestVersion&&function(t,e){for(var n=t.split("."),r=e.split("."),o=0;o<3;o++){var a=+n[o]||0,i=+r[o]||0;if(a>i)return 1;if(i>a)return-1}return 0}(r,p.latestVersion)<0&&console.warn("百度移动统计微信小程序SDK已更新,为不影响您的正常使用,请到SDK下载中心 https://mtj.baidu.com/web/sdk/index 下载最新版本")})))},R={onShow:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=(g.aso.query||[]).filter((function(t){return 0===t.key.indexOf("mtj_")}));return g.aso.scene=""+(t.scene||""),t.referrerInfo&&t.referrerInfo.appId?g.aso.referrerInfo=t.referrerInfo:delete g.aso.referrerInfo,g.aso.path=t.path||"",g.aso.query=Object.keys(t.query||{}).map((function(e){return{key:e,value:t.query[e]}})),e.length>0&&!/(^|,)mtj_/.test(Object.keys(t.query||{}).join(","))&&(g.aso.query=g.aso.query.concat(e)),(t.query||{}).mtj_ctoken&&!p.disableCircling&&(m.circleToken=t.query.mtj_ctoken),(t.query||{}).mtj_htoken&&p.hasHeatmap&&(m.heatmapToken=t.query.mtj_htoken),M().then((function(){return B(t.shareTicket)})).then((function(t){t?g.aso.shareInfo=t:delete g.aso.shareInfo,A(Object.assign({et:"app",en:"show"},g))})).catch((function(t){I("app.onShow",t)}))},onHide:function(){A({et:"app",en:"hide"})},onError:function(t){var e=b(t,"Object")?JSON.stringify(S(t)):""+t;A({et:"app",en:"error",ep:{ex:e}})}};function F(){this.options={opacity:100,radius:30,bshadow:1.5,boundVal:15e3,shadowBlur:15,points:{max:100,data:[]},gradient:{.45:"rgb(0,0,255)",.55:"rgb(0,255,255)",.65:"rgb(0,255,0)",.95:"yellow",1:"rgb(255,0,0)"}}}F.prototype={getCanvas:function(t){return new Promise((function(n,r){e.createSelectorQuery().select(t).fields({node:!0,size:!0}).exec((function(t){n(t[0].node)}))}))},getPageClientRect:function(){return new Promise((function(t,n){e.createSelectorQuery().select(".hm-container").boundingClientRect((function(e){t([e.width,e.height])})).exec()}))},init:function(){var t=this;return Promise.all([this.getPageClientRect(),this.getCanvas("#cvs"),this.getCanvas("#cvd")]).then((function(e){var n=E(e,3),r=n[0],o=n[1],a=n[2];t.options.width=r[0],t.options.height=r[1],o.width=t.options.width,o.height=t.options.height,t.options.context.setData({p_width:t.options.width,p_height:t.options.height});var i=o.getContext("2d");t.options.ctx=i,a.width=1,a.height=256;var c=a.getContext("2d");t.options.pctx=c}))},renderShadow:function(t,e,n,r){var o=this.options.ctx,a=this.options.boundVal,i=parseFloat(n/this.options.points.max,10);o.shadowColor="rgba(0, 0, 0, "+i+")",o.shadowOffsetX=a,o.shadowOffsetY=a,o.shadowBlur=this.options.shadowBlur,o.beginPath(),o.arc(t-a,e-a,this.options.radius,0,2*Math.PI,!0),o.closePath(),o.fill(),r||this.cachePoint(t,e,n)},colorize:function(){for(var t=this.options.width,e=this.options.height,n=this.options.ctx,r=n.getImageData(0,0,t,e),o=r.data,a=o.length,i=this.getPalette(),c=this.options.opacity,s=3;sr.max&&(r.max=n),o.push([t,e,n])},addPoint:function(t,e,n){this.options.ctx.clearRect(0,0,this.options.width,this.options.height),this.options.pctx.clearRect(0,0,1,256);for(var r=this.options.points.data,o=r.length,a=0;a0&&A(Object.assign({et:"page",en:"scroll",ep:S(t[0])},a))}))}catch(t){I("page.trackComponentScrollEvent",t)}},onPageScroll:function(t){(!m.pageScrollTop||t.scrollTop>m.pageScrollTop)&&(m.pageScrollTop=t.scrollTop)},onShareAppMessage:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n={from:t.from,path:e.path};if(!n.path){var r=d.query.map((function(t){return t.key+"="+t.value})).join("&");n.path=d.path+(r?"?"+r:"")}e.title&&(n.title=""+e.title),t.target&&(n.target=JSON.stringify(t.target)),A(Object.assign({et:"share",en:"action",ep:n},g));var o=g.aso.query.filter((function(t){return"mtj_shuuid"===t.key})),a=o[0]?o[0].value.split("_"):[];d.uuid!==a[a.length-1]&&a.push(d.uuid);var i=a.slice(Math.max(0,a.length-3)).join("_");return e.path=j(n.path,"mtj_shuuid",i),e},onAction:function(t,e){if(t&&t.type&&t.currentTarget){var n="#"+(t.currentTarget.id||e);if("tap"===t.type){var r=[{key:"xpath",value:n}],o=t.detail,a=o.x,i=o.y,c={};return void 0!==a&&void 0!==i&&(c={x:Math.floor(a),y:Math.floor(i)}),void A(Object.assign({et:"behavior",en:"tap",ep:{data:r},posi:c},g))}if("touchmove"===t.type&&-1===J&&t.touches instanceof Array&&3===t.touches.length){if(z+=1,clearTimeout(V),3===z)return m.circleByThreeFingers=!0,m.circleToken=void 0,void A(Object.assign({et:"page",en:"show"},g));J=setTimeout((function(){J=-1,V=setTimeout((function(){z=0}),500)}),1e3)}}}},L={trackEvent:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(!O(t))return Promise.reject(new Error("事件名称不合法"));var n=Object.keys(e).filter((function(t){return w(t)&&k(e[t])})).map((function(t){return{key:""+t,value:""+e[t],type:b(e[t],"String")?"string":"number"}}));return M().then((function(){A(Object.assign({et:"event",en:""+t,ep:{data:n}},g))})).catch((function(t){I("trackEvent",t)}))},setTrackStatus:function(t){b(t,"Boolean")&&(p.trackStatus=t,q(u,t))},setUserInfo:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.tel,n=t.openId;return M().then((function(){var t=C(c),r=b(t,"Object")?t:{};x(e)&&(r.tel=g.user.tel=e.substr(e.length-11)),P(n)&&(r.openId=g.user.openId=n),(r.tel||r.openId)&&q(c,r),b(e,"Undefined")||x(e)||console.error("手机号 ".concat(e," 不合法")),b(n,"Undefined")||P(n)||console.error("openid ".concat(n," 不合法"))})).catch((function(t){I("setUserInfo",t)}))},setUserId:function(t){return Promise.resolve().then((function(){if(!(b(t,"String")||b(t,"Number")&&Number.isFinite(t)))return Promise.reject(new Error("userId只能是字符串或数字"));var e=""+t,n=C(s),r=b(n,"Object")?n:{};if(!r.uid_||r.uid_[0]!==e){r.uid_=[e,"1"],q(s,r),g.userProperty=JSON.stringify(r);var o=[{key:"uid",value:e}];return M().then((function(){A(Object.assign({et:"api",en:"setUserId",ep:{data:o}},g))})).catch((function(t){I("setUserId",t)}))}}))},setUserProperty:function(t){return Promise.resolve().then((function(){var e=C(s),n=b(e,"Object")?e:{};if(b(t,"Null"))Object.keys(n).forEach((function(t){"_"!==t.charAt(0)&&"_"!==t.charAt(t.length-1)&&delete n[t]}));else if(!b(t,"Object"))return Promise.reject(new Error("userProperty必须是对象"));var r=Object.keys(n).filter((function(t){return"_"!==t.charAt(0)&&"_"!==t.charAt(t.length-1)})).length;Object.keys(t||{}).forEach((function(e){var o=t[e];""===e||"_"===e.charAt(0)||"_"===e.charAt(e.length-1)&&"ab_"!==e&&"ab_filter_"!==e||(b(o,"Null")?n[e]&&(delete n[e],r--):!(b(o,"String")||b(o,"Number")&&Number.isFinite(o))||e.length>256||(""+o).length>256||!n[e]&&r>=100||(n[e]||r++,n[e]=[o,"1"]))})),q(s,n),g.userProperty=JSON.stringify(n)}))}},$={data:[],init:function(){var t=this,e=d.uuid;e?this.startFetch(e):D().then((function(e){d.uuid=e,t.startFetch(e)}))},startFetch:function(t){console.log("---您的设备ID---",t),this.fetchTest()},getExpDataByParamName:function(t){var e=C(l);if(this.setLocalData(e),!e||!b(e,"Array"))return{};var n=e.find((function(e){return e&&b(e.params,"Object")&&!b(e.params[t],"Undefined")}));return n&&n.params?{expValue:n.params[t],expId:n.e}:{}},fetchTest:function(t,e,n){var r=this,o=d.uuid,a=d.key;y({url:"https://hm.baidu.com/v1/diversion/",data:{cid:o,tid:a},method:"GET",success:function(o){b(o,"Object")&&200===o.statusCode&&b(o.data,"Object")&&0===o.data.status?r.handleFetchResponse(o.data,t,e,n):n&&n(e)},fail:function(){console.error("请求分流实验失败"),n&&n(e)}})},handleFetchResponse:function(t,e,n,r){var o=[];if(b(t,"Object")&&b(t.data,"Object")&&b(t.data.expr,"Array")&&(o=t.data.expr),this.updateStorage(o),this.setLocalData(o),r){var a=this.getExpDataByParamName(e),i=a.expValue,c=a.expId;b(i,"Null")||b(i,"Undefined")?r(n):this.handleInTest(i,c,r)}},handleInTest:function(t,e,n){n(t),this.updateUserProperty(e)},updateStorage:function(t){q(l,t)},setLocalData:function(t){this.data=t||[]},updateUserProperty:function(t){var e=this,n=this.getActiveExpIds(t)||[],r={ab_:null,ab_filter_:null},o={},a=[];if(n.forEach((function(t){var n=e.getExpDataFromId(t);b(n,"Object")&&(o[n.e]=n.g,a.push(n.h||0))})),a.length){var i=0;a.forEach((function(t){i=function(t,e){var n="00000000000000000000000000000000";function r(t){var e=(n+n+Number(t).toString(2)).slice(-64);return[parseInt(e.slice(0,32),2),parseInt(e.slice(-32),2)]}function o(t){return(n+t.toString(2)).slice(-32)}var a=r(t),i=r(e);return parseInt(o((a[0]|i[0])>>>0)+o((a[1]|i[1])>>>0),2)}(i,t)})),r={ab_:JSON.stringify(o),ab_filter_:i}}L.setUserProperty(r)},getExpDataFromId:function(t){return C(l).find((function(e){return String(e.e)===String(t)}))},setActiveExperimentIds:function(t){q(h,t)},getActiveExpIds:function(t){var e=this,n=C(h)||[];return b(t,"Undefined")||-1!==n.indexOf(t)||n.push(t),n=(n=n.filter((function(t){return!!e.getExpDataFromId(t)}))).filter((function(t,e){return n.indexOf(t)===e})),this.setActiveExperimentIds(n),n}},K=function(t){if(p.hasABTest)if(b(t,"Object")){var e=t.paramName;if(null!=e){var n=t.defaultValue;if(b(n,"Undefined"))console.error("请设置参数默认值");else{var r=t.callback;if(b(r,"Function")){var o=$.getExpDataByParamName(e),a=o.expValue,i=o.expId;b(a,"Null")||b(a,"Undefined")?$.fetchTest(e,n,r):$.handleInTest(a,i,r)}else console.error("callback必须为函数")}}else console.error("请设置实验参数名称")}else console.error("传递参数请设置为对象")},Q=function(t,e,n){var r=e[t];e[t]=function(e){if(n.call(this,e,t),r)return r.apply(this,arguments)}},G=App,W=function(t){a.app.forEach((function(e){Q(e,t,R[e])})),t.mtj=L,t.mtj.pageEvent=H,t.mtj.fetchABTest=K,G(t)},X=Page,Y=function(t){a.page.forEach((function(e){Q(e,t,H[e])})),a.share.forEach((function(e){!function(t,e,n){var r=e[t];e[t]=function(t){var e=r&&r.apply(this,arguments);return n.call(this,t,e)}}(e,t,H[e])})),Object.keys(t).forEach((function(e){"function"==typeof t[e]&&-1===a.page.indexOf(e)&&-1===a.share.indexOf(e)&&Q(e,t,H.onAction)})),X(t)},Z=Behavior,tt=function(t){return a.page.forEach((function(e){Q(e,t.methods,H[e])})),Z(t)};tt.prototype.constructor=Behavior;var et=Component,nt=function(t){return a.page.forEach((function(e){Q(e,t.methods,H[e])})),et(t)},rt=function(){var t,n;t=wx,e=t;try{n=require("./mtj-wx-sdk.config")}catch(t){return void console.error("请把mtj-wx-sdk.config.js文件拷贝到utils目录中")}n&&n.appKey?(d.key=n.appKey,p.getLocation=n.getLocation||!1,p.getComponentScroll=n.getComponentScroll||!1,p.disableCircling=n.disableCircling||!1,p.trackStatus=!(!1===C(u)),p.hasABTest=n.hasABTest||!1,p.hasHeatmap=n.hasHeatmap||!1,p.hasABTest&&$.init(),function(){var t=C(f);if(t){Object.keys(t).forEach((function(e){p[e]=t[e]}));var e=t.updateTimestamp||0;if(+new Date-e<864e5)return Promise.resolve()}T({url:"https://hmma.baidu.com/mini.conf",method:"POST",header:{"content-type":"application/x-www-form-urlencoded"},data:{type:"wx",key:d.key}}).then((function(t){if(t&&t.data){var e=t.data;Object.keys(e).forEach((function(t){p[t]=e[t]})),e.updateTimestamp=+new Date,q(f,e)}else I("remoteConfig",t)})).catch((function(t){I("sendRequest",t)}))}(),n.hasPlugin||(App=W,Page=Y),module.exports={App:W,Page:Y,Behavior:tt,Component:nt}):console.error("请设置mtj-wx-sdk.config.js文件中的appKey字段")};return rt(),t.init=rt,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); diff --git a/libs/share.js b/libs/share.js new file mode 100644 index 0000000..a8d0166 --- /dev/null +++ b/libs/share.js @@ -0,0 +1,36 @@ +export default{ + // 监听用户点击右上角菜单的「转发」按钮时触发的事件 + onShareAppMessage() { + // 设置转发的参数 + return { + title: "职站商城", + // path: '', + imageUrl: "", + success: function(res) { + if (res.errMsg == 'shareAppMessage:ok') { + console.log("成功", res) + } + }, + fail: function(res) { + console.log("失败", res) + } + } + }, + // 分享到朋友圈 + onShareTimeline:function(res){ + return { + title: '职站商城', + // imageUrl:'/static/image/phone.png', + query:'' + } + }, + // 收藏 + onAddToFavorites:function(res) { + return { + title: '职站商城', + // imageUrl:'/static/image/phone.png', + query: '', + } + } + +} \ No newline at end of file diff --git a/libs/uma.js b/libs/uma.js new file mode 100644 index 0000000..a688ffd --- /dev/null +++ b/libs/uma.js @@ -0,0 +1,18 @@ + +import uma from 'umtrack-wx'; +uma.init({ + appKey: '64cc98d5a1a164591b62da3e', // 由友盟分配的APP_KEY + useOpenid: true, + // 使用Openid进行统计,此项为false时将使用友盟+uuid进行用户统计。 + // 使用Openid来统计微信小程序的用户,会使统计的指标更为准确,对系统准确性要求高的应用推荐使用Openid + autoGetOpenid: true, + // 使用openid进行统计时,是否授权友盟自动获取Openid, + // 如若需要,请到友盟后台"设置管理-应用信息"(https://mp.umeng.com/setting/appset)中设置appId及secret + debug: true,// 是否打开调试模式 + uploadUserInfo: true, // 自动上传用户信息,设为false取消上传,默认为false + enableVerify: true +}); +uma.install = function(Vue) { + Vue.prototype.$uma = uma; +} +export default uma; diff --git a/libs/util.js b/libs/util.js new file mode 100644 index 0000000..8e72d90 --- /dev/null +++ b/libs/util.js @@ -0,0 +1,129 @@ +import Product from '@/config/product' + +const files = [ + 'https://huoran.oss-cn-shenzhen.aliyuncs.com/用户服务协议.docx', // 用户服务协议 + 'https://huoran.oss-cn-shenzhen.aliyuncs.com/用户隐私协议.docx', // 用户隐私协议 + 'https://huoran.oss-cn-shenzhen.aliyuncs.com/1709798668435.docx', // 人工智能 + 'https://huoran.oss-cn-shenzhen.aliyuncs.com/1709798621083.docx', // 大数据 + 'https://huoran.oss-cn-shenzhen.aliyuncs.com/1709798646462.docx', // 金融科技 +] +const docExts = ['doc', 'xls', 'ppt', 'pdf', 'docx', 'xlsx', 'pptx'] +export default { + // 路由跳转 + to(url) { + uni.navigateTo({ + url + }) + }, + // 成功提示 + sucMsg(title, duration = 1500) { + uni.showToast({ + title, + duration + }) + }, + // 错误提示 + errMsg(title, duration = 1500) { + uni.showToast({ + title, + icon: 'none', + duration + }) + }, + // 如果非数字,则返回0 + handleNaN(val) { + return isNaN(val) || val == 0 ? '' : val + }, + // 小于10,返回0+传入值 + preZero(val) { + return val < 10 ? '0' + val : val + }, + //返回格式化时间,传参例如:"yyyy-MM-dd hh:mm:ss" + formatDate(date, fmt = 'yyyy-MM-dd hh:mm:ss') { + var date = date ? date : new Date() + var o = { + "M+" : date.getMonth()+1, //月份 + "d+" : date.getDate(), //日 + "h+" : date.getHours(), //小时 + "m+" : date.getMinutes(), //分 + "s+" : date.getSeconds(), //秒 + "q+" : Math.floor((date.getMonth()+3)/3), //季度 + "S" : date.getMilliseconds() //毫秒 + } + if(/(y+)/.test(fmt)) { + fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length)) + } + for(var k in o) { + if(new RegExp("("+ k +")").test(fmt)){ + fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length))) + } + } + return fmt + }, + // 获取商务经理id + getBmId(val) { + return uni.getStorageSync('team').partnerId + }, + // 获取商务经理名称 + getBmName(val) { + return uni.getStorageSync('team').partnerClassificationName + }, + // 返回图标。如果有图标,则直接返回 + getIcon(e) { + return e.appletIcon || Product.normalIcon + }, + // 判断文件类型是否能够通过uni.openDocument打开(doc, xls, ppt, pdf, docx, xlsx, pptx) + isDoc(ext) { + return docExts.includes(ext) + }, + // 预览文档 + openFile(id) { + uni.showLoading({ + title: '加载中', + mask: true + }) + // 下载文件资源到本地 + uni.downloadFile({ + url: files[id], + success: function(res) { + console.log(11, res) + uni.hideLoading(); + uni.showLoading({ + title: '正在打开', + mask: true + }) + // 新开页面打开文档,支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx。 + uni.openDocument({ + filePath: res.tempFilePath, + fileType: 'pdf', // 文件类型,指定文件类型打开文件,有效值 doc, xls, ppt, pdf, docx, xlsx, pptx + showMenu: true, // 允许出现分享功能 + success: res => { + uni.hideLoading() + }, + fail: openError => { + uni.hideLoading() + } + }) + }, + fail: function(err) { + uni.hideLoading() + } + }) + }, + // 产品管理的产品分类(classificationId)有6个,订单管理的产品分类(authority)有5个,后者是由前者决定的,但是id不一样。把产品管理的分类id传入这个函数,即可返回订单的分类id + getOrderType(id) { + if (id == 1 || id == 2) return 1 + if (id == 3) return 2 + if (id == 4) return 3 + if (id == 5) return 0 + if (id == 6) return 4 + }, + // 去掉html标签 + removeTag(str) { + return str.replace(/(<[^>]+>)|(( )+)/g , '') + }, + // 传入文件名获取文件后缀 + getFileExt(fileName) { + return fileName.substring(fileName.lastIndexOf(".") + 1); + }, +} \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..589448c --- /dev/null +++ b/main.js @@ -0,0 +1,43 @@ + +// #ifndef VUE3 +import Vue from 'vue' +import App from './App' +import util from '@/libs/util' +import uma from './libs/uma' +import share from './libs/share' +import mtjWxSdk from './libs/mtj-wx-sdk' + +Vue.config.productionTip = false +Vue.prototype.$util = util +Vue.use(uma) +Vue.mixin(share) + +App.mpType = 'app' + +// 权限控制 +Vue.prototype.auth = function(text){ + const auth = uni.getStorageSync('auth') + if (text && auth && auth.length) { + const isPermission = auth.includes(text) + return auth.includes(text) + } + // return true +} + +const app = new Vue({ + ...App, + share +}) +app.$mount() +// #endif + +// #ifdef VUE3 +import { createSSRApp } from 'vue' +import App from './App.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..4d126fb --- /dev/null +++ b/manifest.json @@ -0,0 +1,73 @@ +{ + "name" : "职站商城", + "appid" : "__UNI__2E89BA6", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + "app-plus" : { + /* 5+App特有相关 */ + "usingComponents" : true, + "nvueCompiler" : "uni-app", + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "modules" : {}, + /* 模块配置 */ + "distribute" : { + /* 应用发布信息 */ + "android" : { + /* android打包配置 */ + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + "ios" : {}, + /* ios打包配置 */ + "sdkConfigs" : {} + } + }, + /* SDK配置 */ + "sdkConfigs" : {}, + "quickapp" : {}, + /* 快应用特有相关 */ + "mp-weixin" : { + "appid" : "wx2b506fdb0eeee65d", + "setting" : { + "urlCheck" : false, + "es6" : true, + "minified" : true + }, + "usingComponents" : true, + "optimization" : { + "subPackages" : true + }, + "uniStatistics" : { + "enable" : false + } + }, + "vueVersion" : "2", + "uniStatistics" : { + "version" : "2" + }, + "mp-toutiao" : { + "appid" : "tt2192572fbea04fe601" + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..eb2ff65 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,777 @@ +{ + "name": "筛选 菜单 筛选菜单 上拉筛选 ", + "version": "1.0.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "cacache": { + "version": "11.3.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz", + "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-webpack-plugin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz", + "integrity": "sha512-PlZRs9CUMnAVylZq+vg2Juew662jWtwOXOqH4lbQD9ZFhRG9R7tVStOgHt21CBGVq7k5yIJaz8TXDLSjV+Lj8Q==", + "requires": { + "cacache": "^11.3.2", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.7.0", + "webpack-log": "^2.0.0" + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==" + }, + "dir-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", + "requires": { + "path-type": "^3.0.0" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ==", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==" + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==", + "requires": { + "aproba": "^1.1.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.9.1.tgz", + "integrity": "sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==" + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "umtrack-wx": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/umtrack-wx/-/umtrack-wx-2.8.0.tgz", + "integrity": "sha512-F5ul+Q7bDJ6MDrn9ysPAyB9nyP1vCxLGUBkSJ4uvknt8rjmX4tqy1IUnJuWKj9ZH2BtkjRFpldQXJSlLDOYfhQ==" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..569edcd --- /dev/null +++ b/package.json @@ -0,0 +1,16 @@ +{ + "id": "filter-popup", + "name": "筛选 菜单 筛选菜单 上拉筛选 ", + "version": "1.0.4", + "description": "筛选菜单,支持单选和多选 , 选择后的数据通过.sync双向绑定,全端支持 导入即用", + "keywords": [ + "筛选", + "菜单", + "筛选菜单", + "上拉筛选" + ], + "dependencies": { + "copy-webpack-plugin": "^5.0.3", + "umtrack-wx": "^2.8.0" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..72681b0 --- /dev/null +++ b/pages.json @@ -0,0 +1,208 @@ +{ + "pages": [ + { + "path" : "pages/login/login", + "style" : + { + "navigationBarTitleText": "登录", + "enablePullDownRefresh": false + } + }, + { + "path" : "pages/index/index", + "style" : + {"navigationBarTitleText": "课程", + "enablePullDownRefresh": false + } + }, + { + "path" : "pages/achievement/achievement", + "style" : + { + "navigationBarTitleText": "成绩", + "enablePullDownRefresh": true + } + }, + { + "path" : "pages/person/person", + "style" : + { + "navigationBarTitleText": "我的", + "navigationStyle": "custom", + "enablePullDownRefresh": false + } + } + ], + "subPackages": [ + { + "root": "course", + "pages": [ + { + "path" : "courseDetail/courseDetail", + "style" : + { + "navigationBarTitleText": "课程详情", + "enablePullDownRefresh": true + } + }, + { + "path" : "practiceDetail/practiceDetail", + "style" : + { + "navigationBarTitleText": "练习情况", + "enablePullDownRefresh": true + } + } + ] + }, + { + "root": "user", + "pages": [ + { + "path" : "reg/reg", + "style" : + { + "navigationBarTitleText": "绑定账号", + "enablePullDownRefresh": false + } + }, + { + "path" : "selectAccount/selectAccount", + "style" : + { + "navigationBarTitleText": "选择账号", + "enablePullDownRefresh": false + } + }, + { + "path" : "setting/setting", + "style" : + { + "navigationBarTitleText": "设置", + "enablePullDownRefresh": false + } + }, + { + "path" : "password/password", + "style" : + { + "navigationBarTitleText": "修改密码", + "enablePullDownRefresh": false + } + }, + { + "path" : "addStaff/addStaff", + "style" : + { + "navigationBarTitleText": "邀请成员", + "enablePullDownRefresh": false + } + }, + { + "path" : "account/account", + "style" : + { + "navigationBarTitleText": "修改账号", + "enablePullDownRefresh": false + } + } + ,{ + "path" : "phone/phone", + "style" : + { + "navigationBarTitleText": "修改手机号", + "enablePullDownRefresh": false + } + } + ,{ + "path" : "email/email", + "style" : + { + "navigationBarTitleText": "修改邮箱", + "enablePullDownRefresh": false + } + } + ,{ + "path" : "qrcode/qrcode", + "style" : + { + "navigationBarTitleText": "邀请加入", + "enablePullDownRefresh": false + } + } + ,{ + "path" : "article/article", + "style" : + { + "navigationBarTitleText": "学习", + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#fff", + "enablePullDownRefresh": false + } + } + ,{ + "path" : "scheme/scheme", + "style" : + { + "navigationBarTitleText": "方案详情", + "enablePullDownRefresh": false + } + }, + { + "path" : "send/send", + "style" : + { + "navigationBarTitleText": "下载发送", + "enablePullDownRefresh": false + } + } + ] + } + ], + "preloadRule": { + "pages/index/index": { + "network": "all", + "packages": ["course"] + } + }, + "condition": { //模式配置,仅开发期间生效 + "current": 0, //当前激活的模式(list 的索引项) + "list": [{ + "name": "test", //模式名称 + "path": "pages/login/login" //启动页面,必选 + }] + }, + "globalStyle": { + "navigationBarTextStyle": "white", + "navigationBarTitleText": "慧教云舟", + "navigationBarBackgroundColor": "#007EFF", + "backgroundColor": "#f5f5f5", + "app-plus": { + "background": "#efeff4" + } + }, + "tabBar": { + "color": "#B8B9B8", + "selectedColor": "#007FFF", + "borderStyle": "white", + "backgroundColor": "#ffffff", + "fontSize": "22px", + "iconWidth": "20px", + "list": [{ + "pagePath": "pages/index/index", + "iconPath": "static/image/tab1.png", + "selectedIconPath": "static/image/tab1-1.png", + "text": "课程" + }, { + "pagePath": "pages/achievement/achievement", + "iconPath": "static/image/tab2.png", + "selectedIconPath": "static/image/tab2-1.png", + "text": "成绩" + }, { + "pagePath": "pages/person/person", + "iconPath": "static/image/tab4.png", + "selectedIconPath": "static/image/tab4-1.png", + "text": "我的" + }] + } +} diff --git a/pages/achievement/achievement.vue b/pages/achievement/achievement.vue new file mode 100644 index 0000000..3fbf5e8 --- /dev/null +++ b/pages/achievement/achievement.vue @@ -0,0 +1,216 @@ + + + + + diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..55d2f97 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..963efbd --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,347 @@ + + + + + diff --git a/pages/orders/orders.vue b/pages/orders/orders.vue new file mode 100644 index 0000000..b188f73 --- /dev/null +++ b/pages/orders/orders.vue @@ -0,0 +1,360 @@ + + + + + diff --git a/pages/person/person.vue b/pages/person/person.vue new file mode 100644 index 0000000..5e27982 --- /dev/null +++ b/pages/person/person.vue @@ -0,0 +1,409 @@ + + + + + diff --git a/static/iconfont/iconfont.css b/static/iconfont/iconfont.css new file mode 100644 index 0000000..3a65ec5 --- /dev/null +++ b/static/iconfont/iconfont.css @@ -0,0 +1,32 @@ +@font-face { + font-family: "iconfont"; src: url('/static/iconfont/iconfont.ttf') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-qrcode:before { + content: "\e7dd"; +} + +.icon-dingdan:before { + content: "\e601"; +} + +.icon-product:before { + content: "\e788"; +} + +.icon-edit:before { + content: "\e621"; +} + +.icon-filter:before { + content: "\e6b9"; +} + diff --git a/static/iconfont/iconfont.ttf b/static/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9db285d98e975304ef3231633c3fb0db66a3ea4b GIT binary patch literal 2748 zcmd^BU2GIp6h3F}%aRWJh#I{SC;eNLTin+CuQ#NG4a?v7Ybc>5d6sexbCu(gs)L=9myL<8VJzZ2Q)O~ zis_U%$%3^0Hqrik>c|*2ab4tUY9W=^YcKR%0dNy3438DZjY|(TAAom+7<+(XXEO^k zu%E)A#)GoJ;vicb;$B$zF7ZlD&mT}_>)w6$*j}zynMGjDM7lw67IRB7T!Ctf=3Fm* z02VCT_T+_5*bKt+eFJ;IpGz49Siys^8eji!jJeU_l(i8qL6UJP5(mkTZBG;d&w)gH zeM8_GIcv}OE5wjeAb`Y(`yXvbc3TFnmvR1%l@DHz8B*h(78@^`<#hQ>Z1PDb0AQW1 zg2$Y-lf>m#*3nG6C%y>ViLSOXC6=+=T)sMgYW~gwFT6ROyu6+0=MDk`?MZWL< zd$Z5ifRhHQLz(i;J3oo#X1nvUm9N^J*J}Qh-FeOC@7Ud`SQ!WKHM}9vt+LN9dz~TF zfC3SSLpSupJ{W>m;VirdpHfAeTjaVxC>(E&CA$I%jYYcRu6QijiwSKlw#X|n6s~^? zou{%B;r1e3wq@>h6LL@Sx(ed{ZJ)Lzp~aWc_^o-{r$`J3m?UkQn>)RMX2yrF&Ci*n z_%N|tAnY`6b0xk+d3MQ?PA0t|v9Gvv5xzyxqNUkKh=Jl;v|`?yd)s!(J%1yy#h8|g zgh`T7SmZq6Q|^opS;AQMy$8kpmWGB6uJOt6&XftGzoJTaDpR4We9w-N|lbah?{Q zwnWlpr6^*hNcd%{*WKXW;qhe53qEB!!2GyB^K*3|P|b%Q1gNg9tv2~6^d0GSyLXbd zZhq(&g3}7Anp<-v8ta>yI^+KL%{Tr0k)Z6{b>0pt1kqNc zG`fkhu>dZ3#=(sEEe;k5uW_(M=Q8GCnfSd9_QG1&=HM!_IL6<8(L;VTIPPGCTDat3 z0sL^)!HoDf9V`<5-oX-tVcx+q@gF+a3xnu$a205n-dfUAhMrLmPN}2mVj){B7?pXK zK0J|2l`3Rq9@IL;y&rMWzsahN1;F^bWkh*at&vXm#(=ftN|Bssz=6_Cpg zk)1SYM`6TTH3l2$QR;ZKpNf9e+GpPSHRFfP`VVD+WrK_YG89ol8C@VBE~SeZ-IWFD?zCysrcRwYY0@O16a)ap{o~)r1N94+1o;IsG@L)CCb4h(#`?9M@`60< z^RuGe%x=E{N+)`{IEHAPKYJ#UuR(#w^`epT;#+^;hjLDGFJS)CJgIo{rDekYdnbMS zSerkss_z1RP`)&IcS z|Gd`!yVn1_*Z;fM|Gd}#!rK44*Z;lP|Ha(@zS#f2+5foI|NsC0^!fkI;s4a-|K98W z!rK4t_5bGZ|Gd}#+35fI`~T|m|H$6|Ls_4w0000UbW%=J0M_{NcjskO91^?5LI*i4 zs)b9ko8QfjGNXPYTW{-L-4g%+1aV13K~!kowAN{o+At6W;FfH&F9Q<@VaSs=Y{2)w zU#gN+X?`%RZqxH!pi9z|o=9zW$#;uGhJSo^SnTr4oW9reeDrwAFV9o@9v}G<3Cny& z#^$+$h|4W^eg6)Hw-wo#I4HS^#n=KP6t9k+9x#&I(|Fq@UhqCT;yb*?=QPI2;bq4y zspYWXFQl_xz{sz)Dpd|<+y{wmG8oEE;ujLO{7U#%A+4|Krs=w-sfQkEqQ?AZxU(a#9Pz8ZuOteqnwD%xT_F!bskJ*9q2qGOgOZ|VN3PKe)lP5O` ztTG6d;P^R{Xm-Ko$=-u?4PsZYHmYQ`L7@fbsOsQbP`GJ&s!;7T?*W$6d^&=PqM998 zLr`fUeMMH_)j_3#G}v$8H9_SD-Vge3j)X3#G~oGltV7em9TFxnTD*tx;066PL&`O% zJdm;$?X>-hF^Rooe#U~1LQ^?*!p|R`x&dr>YG_ZVnG><_qvCK zi`UqwpgM>Y1i&=c14J@{P^pa;&&RZ54(A0BT4nP@uGfmaWxX-mm`u|J|)ulcfoocyZ4USV>G0?3__- zvS&1x(IH_y+0%gLj=XkSWtq`r!)$ETcBc~Aa$7EqRbr78LgblN78rQ|Kp{(Sv2~CW z0A$EAip+FDzc8k1ipHpc@xmJD=AHKi}EGo(tCm5LdBnEe!cCadEztQ1ogUSC=tJ^#qCiXU`e2OUp zNnlY->nm)ey8NPoT`*-8p|-Fpq9Ti|juv=P=wK@wk?w*~0#97ktESos;i>cdI8Px-H%CSYnj}&BF3-ySt8F%-H>Rkd5G7Dqad6@F3q8%Rt1+{16fy>9xxD<8VP8Gjz|p9+d9EZ7!~iwoRyu?^wHuKwnj m@0^pTly^F3`SH^afbAb-4nNz`j~yle0000^-E$`wPHHbM^c81)_4wwYgX}e~@$xI4%vD8$*a<(eN%RyI2h^O|p^dkla#s!`(jv*0;-%h(;*5n}K%HI`h_$_bE z#_zN4J@{X*Y4AAX(T{0mky&A-pMFPq8Y!GD(2 zl}k9EZQPrif(<6XopL@g+-fouI3(1w=nRIz=B7Ul? zoybj)ix=J!daR+J@5kOl2KJ%6{domM>GcM*O&EPzgpc2Xct*Pmh#(^bToU^v9bC8 z`rE0v;_ZezO$rs~7rqCe=a#) zK3N@*E}(%jx&lC189fjQVgRL}dVx|v#488V$S<$YBW?iFB54RTfuZ0(LoG-ijvv$^O38-tf`& zODpE(rbVkrNeVtav~9`E$vtIp5q@4CRyqoz!dz@DpFg~P_2AC+OXqfOTH94!mYE#l z?r3dh#Lvfj{J`$b%jQp;*w#>6mG5t-E^~T)ovn)e7vFEs7#NtmJzX3_A`ZWu7U?Wy zD03vabf?%9@1-G(x!&Aau1l^ho>rw;arO6#Yx8ct|1WsT?4;UV$4zVW?LJhe7#~ji zC(Km&NyU3V-`~~G*E>&3Wj!|O-;?j_o5hj~v@Y)cb2RcmP{*|DJ5{wEobJ~S-%0wi zw!AW_c0y;+Ojf6~MR%0`)ZCc7M};L*amL(7Z3`bYhW$&Ma@zi#fM<$Nj;7sxU)wo? z*8hwi^Llc#mvtP~jz+YfQ=0pv{iEQ&npw8)MbeL?U+s7@Z-0$L zrE`knSTXK8G_7R0QfKSYNso6PX-JXXzz`k`)7c~f3-zvy`Kjv2ZVt0P_QH@e)uV&|Wblz7H;+g7Jsk#_A<2FIQkq?xT;RBRnm zSNCA`^(6;2OD!^2t!>=+f9Hz8MonI}6^Aaajq3Sdcl(>4Z>g#TN7(k&=R!^!{kWT~ z<-jcd^K9*-M>os09GM^NmFVQTx4Ti|q`BZ9UhcT$h8eSuEIawMiuuX9zZ+&P|Hpgo z?T44jJZx`%{AR0d-q)DkTo}*RW^&_GYQO}xjmq+DZrvJu;oi1VGt}P*O%{uvZYz1h zS|H-gx=fx2>hc*f**p&}F-9?~NgUXEeeV6|#}2c#Mn7siwbXbLx6_Ha!hiagxp68R zMwjh4ea?3|qg&AJwEtY6-agP*tkA9QTdz_}0xL>W*ovPKXGW-LS*oC`4%$OSThQV?+v1qNs$Kx2W*fS>_MCEPBc zI7Akx3+{M`N(c#805Spws*#LB)(Dgb8UjRcyQOY3a}O2w4~`2{mH{bsNDapy*w zspQq8TY0{pKQynVG|@$d|Hac&y`DyDqHkYa+CQVaBEakEqx&~69Y5aImTje}DbM)yt7E0-*oU{_aEl&sHwWGMp!bBd>nV@Sl| zrD5sGiyQ=08=AUeO^)68Ju_lar<8E7+OaQXE5kqh|KFXQC|(#V-oJ-`+Re)Rgz|d~ zn;G+7_sP${-IF`#EaR(fqJ8t8OYyzon)2N0+gmQ4g%0P`{ulEVCiU;PcK4|3f1h#t zx%InAPrp4j|KWK|Os>qnZ9@L;9i8WwZe!b%ZM^EWc}BhQ{Lh=Z+J5++niR*Wq4;$* zC+jJx_(+AorQ!Z7ELFd{=j}6SSfjJhapz>Q9U*VIUIjehX*n*pKeCZ`{ledSK4|&! zRsCDNzI3%}r>V*wnZN}NT010{l`q<4D4u>qAxL6^NY{jacC7!a-ag*7Z}Q>Qu70mX zv|7S`#{cTN5Gl#(`&p;U>g%2tT@C^Jt?vhYIL9dRP41okhq;pq>U?f5QfN0X;XAvy zTI7+6uVQbi-%+^)1h<<9FL*Qalgm*(Z{0SzGLlrMMiZ}e|x&HoMRKr_`y5QTjHyp1@#cUJP zVEpv%Ug^09=d~U(L@nih^3djnn{p<9&OYfD!8s<4O|L4PaITC4AIrHy+E%=m{wrJ6&B!K7D9c zDZ6#bC+$tk5x-+4k7YmB9>2wHv8gh%pvr2(r$~{FVkJzsOZ*RuDs%h}<`=$%hXAy3rZ&S()pnrOu)0^73=valfp5^eTwi zY@^TP(;F759*W{I{oP%5YYET3wl$wzN@ia?p0h~w=)Gw>GPD!7xas>Pd^D$ECA=YrTluf4KIjQ0*(vo$hs3ckPReOHwKlZDSu8pJAKP#$D(1)~VuD u4v(Jd_IoOdx6^Odg-y5@^=XQ7`akBr*^f?`Yi(5n6$+lNelF{r5}E*sC`8o& literal 0 HcmV?d00001 diff --git a/static/image/index/4.png b/static/image/index/4.png new file mode 100644 index 0000000000000000000000000000000000000000..0af3c84e3805d5bddef6d69be495135d62cf115d GIT binary patch literal 1289 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz^E4B6XFWwGSvNtl0Zh~e<-&e z%m9ki!Wcjih+?2195wuBCkfB2+VH;LmqY)=xKJ`S$Me@qB+FUY>_d<%Q|-q3*^ia%^{x?OZ%9KHC1n z)w5@IZ&}&aP@Nqf=;!QUVhG44^JadHe5^y*uXp(y7wgcSX)E z?*85M2i@9@-!x`%S5En{zNFl*@9fc!x6W?~EwQp@v#-7scDb-n<=^b>|HE(hyT_lA z=dxP<`?gM67QanIlXE=s*?o4i=4#`)uRmiM|9Y;!m7@==M&np1c7^wahmzc$F; zQP~l8w5^Dnbak}o;eHRzstn9W=5J|R2&jEs@! zB7TdlM?ZdF*SBOtz#(J%AJum_8Wevt^DW$PAyN3h{pAVMcE(N=@;q=;`nI+H{lqE4 zj?Z1EKhFKAaPOq(5AGEn!fjQe#~uk7y2Nzu?>Zs2qe14u#WJfG0pbT6Iu=B5D(*gR z%P@NxuipJsz9Sz(6rQn`H^n{VvT1BkZ`N*F=LzGm6E;HHwvh~zD3qJ|xKq2o;ot2B;Yp>T`J7@dh4Q>Z*R$kgNPp~HRNrLsX zW>c~dD}0KJTRS)7+V3StuAlg~XN#d|N}Av9s`eGrM2=3K{=GbM z@}{NB*6F?9bFjnzM#2ZNz1F8oKN-2SL=|VK}%jz(c{pXj_;{zg~8nA%^GI~H+ z5Rw6jKm>tS@XG-O^?~9*#k{h*JaW3+vYHId|Di4cDz5#{CkHeKtVUKJs1e8oX_p6T z(T13FVZE~((D61UL4Lsu1y7#zcPdIs9A9d+#^f;Xx7VEPUq0TImEryK`tpU-M^-JK z-c(zani>=AVxc7}^z-hXotx+PG?y2+8>uY+;A6wUz$oD9;usQf`0b^WLCp>#tq+Bj zorF^5oSr!vtDiIe{x{zH#idPGF2pRj6Hv1{c<&GM?SZQcEi{%|e+$z{d@FeIii6|1 z9+v;St#8=AoUCzV^q#!$?)!<84HwGKl76!3>&xl)go}2(x)}dh@Ar@GB_Z{^(|qS& zIwN!Jqr7L*2Isc#f}S(IJ=WTsGBQ*-Ua!Db-)$0{WcYpM^ZZRcJR!5z9&PQ^+4a7!PTS*N@%{iJ+C;6HVNDZCHf gwY*%`9JRHEfrtN*rvXO}Co z6;%Ic=={%+24Vx1eJZy(542acB*-tAVXyAihS0*_A-_*=-0*^QpneUp# zKah?T?TuEb?lU_X-F|>i*GyN^!fVUPlMan#yn-)OZi%`)XlUu;Nb#6(hoOzZ>zm0Y zaiMC>VsqhY>tcS9XA{2}FaPwNsq~T8?ik7I*54Zs)<3$C#!#Fn!X(der|pUh>#Hj% uJ6^wLusNE{zV5+F@mY4?E_EwNTxLE~wX;|=<-#dY40yWwxvXe>k`e{(PSs?V{i5t|Rj4<->bt zPVU>WeZzvj?&{KXXE_N`ZuY0X4pzUuzkBoK!R?z@&#qY5SdtK7W~L%5$jUP9_0{u- z)-0bkt)VI}D-0|QgFr;B4q#NoHopGSRi5NI`TXqqS?;Ap6z8zQ=7 zg$V1$@B4QC_x@?8>YwI)N^gJde>L?t^D3X6Y52#nKxDOQ^3tVGCr;M*=l?}z)0}@> z+j6tkd(3l_7ycqW>Cr9g*LBL`;RFnHChy0=RcCXaVFm@`FWjLm-fEBesGyp;@9$Nr4><2FCW!*UbVb^ zTB-Z%>ucq$obB%a5RoohBY#b>GfVeI(94#m#UXb$#fJ)dem$}2=E8kz&hqwJz3fXZ z4sjKkdN=g<$ye_zKRuXJv9gKb+vDFm^UZ&j=gqfLJKtVwtHF`IH}?wrr=%wl7bOk- zt5HF`|7^%;o_g2QW|qc`Q_O(^r+&3}_2rd>NvrFZ9dDS@=Dopummid0`*R`)>3VUzX%S_&tzt3Ck%v8I?;*I>1Q^j^X z);3_dIdLUN?!Tv%++0pk_h(I?C^6r~k>j=fM2p8f+aLE$l=&)WdgZmpJf=TSH5V-H rcrx{9O!tD+i@dIeC12X@|1*eNoQ(WQ75RlR5lGbEkP-m$9&o843R0dLC50ugskk#jx*5?O_=z>THLq;Dc z%PXzJFRjNXYXCGvKo(>sP*zbOFb-&+Qb~|sFvD+|h;8a0pR84@59DTfmva5|)}|t( zZ@X8`>~ywKRg@Ac+`WANI|c?ubx#+^kch)?r$?@9HsEpP6*)9v%ZIp^Hjn2tQ`yw`m9{s0{yXjQf@}qMmFD0Bl{~xB_(P^H3!QjSRpZUwES0W(y9zi& z)aS+ST)rx+TUY3n@WE|s&&ABmZM?1-67uHlRm~bP!$+CE!q1iXcr6WZp@=sJO8XXFPBQiS~d~%k3^qbTAz(}wD q;hG=G(SLU8|9dF#|C5eSqxhyrS0^rB+&d2#zzm+QelF{r5}E+~G{Tqw literal 0 HcmV?d00001 diff --git a/static/image/index/9.png b/static/image/index/9.png new file mode 100644 index 0000000000000000000000000000000000000000..f6fcd88c741ef07189ac5bae254fc0f06828f2f1 GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dy?EyX^u0VSCfuj(#_uz35g`2%a>UL2oP zmy;FYE%W{H_NCQD&bEePf-`zr(*w+uHW;&u?_pqIWb<@!46!)9cEZhRO$Gw2vpe2& zFM6~ue{t~t|Fy#BPD&~$`CkdP+PzyresG`Fi}UIqq_;lyURZt5aH=_Xz&S6Iv%QjjwG0vW*Do>*7dp8@ zk>kyjx=mSj{fev`SugkftZ7eROS<)5;EcyvhW#8;{!8K~D7GqZu5%0vTAbtPIh!|c zbIHw!Cg+Pf+%n!BBA<87TCB7&!eQ3@*t3@YiHh=56#us@EqP$OIc1IKrse9)pV%Ea W6dd|$oYn$ElEKr}&t;ucLK6T}Fb7=# literal 0 HcmV?d00001 diff --git a/static/image/index/banner.png b/static/image/index/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..5e12e7609372c996febec4e6baecf8b2872aacb9 GIT binary patch literal 25860 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 M07*qoM6N<$g3F%F_5c6? literal 0 HcmV?d00001 diff --git a/static/image/index/banner1.png b/static/image/index/banner1.png new file mode 100644 index 0000000000000000000000000000000000000000..96f920cacacf0c52ae32d0da1851f794230eff8d GIT binary patch literal 21349 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
R-$MNF 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≈6N=sJ1Tw@ZPC~{WH~Z#i7BV%`f6UA8j|8ovr}Q*P3h9;i2J;Ehyn;j5wPmBusOB)zI1PI@7xaJ(L)b{m z2>hA+_q*UlSRRjn;AmTgEj9XgXTGp(9#z3d-f^MP4?Q|Rz?t~YQARFPRgmsK@aADl zd2x^y?KK~7Yq8UK0K82MJgsg`(Qzx|fB4SdyR&5;p-kQJ`gWn<9W=?XZ+7n~$vsJX z6bJwPD`rwZ(w%~Ta`{()+EdoyCT7N`;@ZTI-V={Q{)$!?r7VFFxYFZrs4S3T-@uxn}57yxb1{$ku+AljRVx^zdVve|?!o>F@?F@*0j(ak*0{GjMc zL1j)309|TP1^`5e!DGYV!m;9@)%oKQ7hRr`W5AT-_1ocmmM=_0s*-@IMcu*GaA_ zNMqoQfR5ZWz9H^~UWX!_3=iPN$M<;L24l{BkPxFBkg`D%-q6raG<82lJz5YR9+|v7 zn!K3zw?*^J?Hv%-n*NeP@gICPM457HhgMmXT@qhSPm25rYJw z@m~yz(fX3QDLr~4V#sPYQt02EpiwLR5wW62wRhjXRrI2)LK%&p+GSvadMt%SW0YT~a-ca_;K+W!&LAa zMVdm~F5c}w(L!P+ur&hsM-MslAvPXB)fZ0~oY!j86fYtVLYceNE}n;fx>Od)f5(5m zqZ$anMU!2FqT&uQBx#Pc-K1)nl|&F4ihiDoMcZ-2pI{$nBSTZIQ9?;=)=0${4o4QHDIpkH7Z>!LT z^jdK|_y(5Y38-cX`|@5d zXC~R>O2JGWS19J<0|JJQ`45e?a%gspjh{U~k2t9+PCebkk;jR`E>6H|6GF6HG-PTI zD8Y@q+}K7(4_2X|xmf$V^Gz1)KKxyjKiE-F*bQ+R#YbDe@$yLAK$oht3s#3 zDq0~&X#m!!dULqLF3{z2|1s89bZ|Qq{{$75oar1M%V5RC~5>j--)Cs_V+?V?1 z%|9@6wbcSnH>JEfp-e{?SRWj;hCS(u{@oYx1Smx4*PNZ`ZTzjhp-~^kC~b}PsPmU_ zQc^B~T6Hb&-OtzB-FZQ+izVc>T79f{?|PG-XBIm9K<&h8KXaSAyKDp+t>tnoDYY`2 zugCh66>75Adp&ei6P%z9PNMV?-K`?AI6q|gpisAb&;j$appGU_3;L<7{h?iJsFrt; z$RYfwX+DsIeMLMZ`BW5NVv09GcZbX}RiEYYd*SE3@xar6G7*;uGW@NPjy1#0Oa7I{ z-*4V5t8|HmD7RTyH+xgUAE0hJP%Q)}3h?ZfFXXDmtEmNK2>Mmh^zk&e4q!jkW`7{x z1-&i%x`>mShKErMceUk_?G%_v5R3qCt>glLR4jo%```K*f9_M{&1CD@h3$+H$Y@|9 z$fZ}QFIBfq^#`0=8@K88p}%?w(V(bZ0cPIV-KhmrrZx>#MX_4?O~PJAA0i?n_XjfO zu1~NCY5em+VC|(MKrM!Qje__fX)0CU=lq#o_q);Q^`9rom`lVy{*0=qkh&S5tjCgF zMJZm9)5!-ISXvvW)?s!MqYeSXras7fPp<~eSvf?cjdhts|NY@3QEfzFs^Yx(c`!EQ z<$oZxd*4pbABjC7rY8a5&^*b#k8wY7e@_mH6^wOe302P?Kn($pH*o{iSyB8LkDqw0 zA7)sv8`ZE}ykn4JDq1MGa!%tXk<6zgi4dFI;5kigC<~9K#Y8G|F{;csUk&s{_I6lQ zxIktPN4jl6b@SrAnbqW%+L*lHa~dWO+Y80yLrQvz%PzICom*nCu5lYr(#4xI}_IjT! z8-yIU{`bw*w>3dvT}NskVF1^RvmB@ngde|2FoVj&@p}R(Mc}+E>NsM^t%XP7g?WM` z$$uLBhsoOp>(Z zsy|u28m_PMY5Gsf6sXfS8ZG0DbL+%XVPRi+29FHrhS%5di5U<`kMf#iikJ}JWU zEHooum7xiB?5K5>&KFh{CFztxyB$q~FtbNF!D~gLHD@KMy2CiZnPKYt`H1gi3fU

X)r75*}(~ z3c!Dd#+mq3;#Su}NsGln8snnlUrPFZovn4EdR86}yNkM9+Psp$JdqruU*YacAIk}aIn_u|lpu0Ju;;)}(S zNjG8Z_D}ZRY+d`7=nz2&K38aGeg{Z9*1~PU6(Y>*hUe^$oQ%&odSPM&h-PCg@rm_F z6pgVp!+9QQG(STY&MehKdMBd9x%XKE&WY*GUJH|9sM6*V!WJf4m7-_0hOi9(Lyloy z$^`7|`QMu3(sKP4M5NQt(@lx|#L-}(#!?-@7DF<~!Thg}nJCn-caIV`w(OcX>Z>ft zvoG=i_B>8caOApU2hh2LGKfD{jnuSm58{Guh+S1iEr>nb_rYy}zXw#-^hpl8Qk1K$ z7kCkyGai@{n3fEUTAG>cw&&Nr%C|tUpbF_^)2N_IrM-Em!BB%(lczTUs1Nu=dyY-@ zo|bD)%bWfG4aaR7L~GSu<^S%fm3M+YnLYe1xRZ{O%-?Qr>Nq){k|}!x4peTFjwd@m zK7uYJcSnfnRi`6fQ(3*7V?f`lZY>s1A)nhYH7Fm`>jzPP&&Wxhy3cu^ka?O2ot7fu z_?E4%#Hx@;sNq2mVR$iY2@u$k;%4%`aHrM_Kpf64*Z&9^*49teL4)%sWSTb~M16TT zBtGY^2+}5!i29M)bq3oPZ=SH#n^qBuL z(lXkpE~E*37pEDdRRN zrV!4kMSGz6hqr=r{uOcKq6zpNTN34rRL|L?A1ypOFe?jTAtj^R)ua50NCOvVXr?`G zHB|QEZznx(oo>eZ)55k|3|V?yj<;HA$RJKbNlTe}h zk0g$01|gh6;^M#FG2P(Y{I0*-CHYYYblMILa&#MPlwl%4E#NqA|v%{7hin?w@RGrLJwpb-1?iKHv z_5|!bCy-mD(flfp9@PZGZ1jthmdLKIR7}Gok!A2BX;*Nog{}K(@E6gXXF2Sxp6*+2 zoLCvx;SM2Ut&$8?HiPhwai3-eS6MpGB?(C`! ztVEy=SY`nUk_&CrWP5?wG9uxaDDnW^+*`k5 zBoTQ6D_>Fprse_&-K$Gp*<%F4dI?aAz-_8Zv=YSInn;2 z=de9%sxD3=13^b#BB1%ve1S#0zL|^uY|YK@(0@zA-D(g4&vb? zC137Ks&PA$pwH=EZ|>&57K3=dSf27w&+`If`VKj(O62v;YuSOHG|afDGusq5z9DuF zkG*~1chFNKU)lYsNgQw2Sghh8QxYCloTMQ-RvcH^{#0hrn1q8l>WW+SV+a&Kt)@!{ ze}v}usmZhar%kH`#!JQ!)~HDSPSSWxsY#5b?U~4NxkkO@-)^T{)TXK|qL9qFa_bC5eq{2go}w647C@4HPBD}n!`xJ zRagam|B%Z`g7ll>Ak0kBp)~zuk_4wnjC&1HW=DtypKmH82Q`N^rx`E~Utk}Uh2j0` z>~CAXgtBZLr0KWq26+;~zr@a%2V|XxuplwKSK)5A|9Y-xMOhr^&-2pA50k^3HZQxW z$oreAjtrTiV1y;n&)81q`(g`%%1|ZSt22 zs5>b{3=tA*Nuohfu#*Cc#;?vUxvCLhUxs!DTseJUV_y85vtn>WhGM- z?__EQ3)@BH@^zN4?}(8>UWYnve*e!x>G)80 zKbW%XsBLl-skfZKZ@UHw6#N%@-hqQ}aH?5tbwHh+6TO6>eB?_Aavm+>YW#H-@=jMD zN!wS4G*%zb^8{n^KwOciteg)&T&G))6crN3I%Ws%U6e*RP`)3HUf5Un<=yp;e(zZb zE4G;#JSSEl?)-DH+2@GNs4E9U018{^emR(Z@^ukMDo|YDXKt$3b>YD-UnK>3AB_wo zDD9JSJu`^CuFf}m<9L>SnOPC1?G_;%o6^*PzzFmBAV;IjCWX7O1UR$(dto&P-a3VCP}M~ z*Q;xFsGw@E%D6a(I-aNyX!6}R2C|nz4uG85_eJH(&wg(c0iIX(yny*s<_z@6NvM}4%NhII%KW>ud3S=I(1k2PI{X`zhud_jdc2-I2JM)Y%Jx&9PV$HHg1^UB7ZN zyVJJXYY0dD0kPtbSW#Ovk%~+EER{SoDmSJ%+3qV5Hpy4=MM3ZoESP~;q&Cs5xMElK z2%86$N+fH_T@O&?z1ah>kBYR!;FW9-`&4ZJEX$dljmjKtC_M2aU3<4ie{`9z)nCT5BF zd?DJzb9n{ou+A0sL5M1IZ3KS4JL=2EB`fxeo?uu9@OAryd-StV>}%aPKjcB|QZ*_M zf9~={R)#~H`s$x(`voe(mF`QbJ1bj+o1LfX@BUSe}5XAx9n z{2pnT+_m59e9R8$QIfl`0YKrCuk%4bQa@8V(6Ya`VE_Bw8;_Y)OTvx|BU8wj|0AOy!u#XBvfD9I^Oez;iKom%Q!c6 z5ZEKT<@AQc$3HLq)l8otP+n8kJf+aT^}pnoY1Mi|XCi!~{K%L(8p<)OUXqPe)@GE>pY zw{DrRcL4n#&X42vL4Vb}@joC7bqC{C()Fq>^ky*ul@GT{u^slGkEKZ}D+H~#=@s1G zovQB=Hu)VqduF!_e!{GA;xjqF1B?*W!d*1Vh#&wl>~WnW-AN+(X7b{T_DF^i)QWkl zs<-^z;wQp%D+Ko#h{7HUXq^GjEU0HAKbHb1u;*v9xkg7qXGjJ4sEh(Jm@O@+^4-$| zbZm3I`^|f}7l!Pr7eYNK2`w(2B_B2irY522s9(7%%!PMn-tVGvA_SNw5RSPQEB)!V ztk^i$G->-;fJs6@4r3ojZV(sa7Hz4=5(AfX1>eQ;v@qoHWbrdQyDMfSs%H>Jivy`I zDvm8K5v9pTn)DbOp=pMVV9NG!F%9g3G3yhMBW9RdnsqWL2+^jwgit##5$)2$UN+?f zfE$TFoH=d#tE;}KTl+SrUSwh0W(2#9+t!k~Khn!BvcQ9HXjR9DeMmD1>9%_0Y5B8> z4y;k%A2PMbloJ(V}WFbMo2 zR49BH=(1jTa4MZh@~+#XeAHIst(&`Xl|3|C@EvqEIE6F>I6m-u19Rl-(SN5b((1qEzRs zOGU1`*TXzF78XA&72gXDHrXw?XJpjM+VYPyA^P9viXOZ3@4jvf*xl#6v^&u*@Mw{3 zXvMu-ePVDl$fT_=-V;bonB73E^=GMl{ZGj1-%60kp90pb+`@kPzW_lJzU^gbK`S++ zvdXOff)=<)h@hGoP~}SFK(UfnISF>Go)4@hDSazGZUtJG;L7#O=+J6>TrioG0?YBo zAAcFwL`Bj&7)7xXD~$ttuQIBxWv?mFPlG5EMz`)lpJ7}EX2BdD+U7C4))vv$4(6U_M zf*FBV8e3fMl}1do?DFdA^#uy6Wm=)lNVCGs3uJs=f6&N6XW5fiKmYtfYv7Vx!X;9q zz_2B9o>wEx3RHs-&t+Cx6IOOBH1UgZ6?djlGxfJd7Ixv6Ghnm4TFWaxSX)`~ z!qt>3z=GBah0DF61Dyb+dE^4G#?Kg9YBa!Ac>RM`i&$MyugnTu$9Jw=wV;*U%7tr} zc%_K_dWi9}9&Z~?T2n3>4dH?mT7?nQvhAz+$*lB#91Z+fCZpDQZb3`9R^heJS~=!3 zy-%%N)Gh@nkg-J`2kx_03+h#UkXB=i5!yR$XaUQG%l}aWujmwBr9(`_{JGC;QfLX+ zhznUIQ1&XGVxqh=;#{knHRocMp)dH;|E5!Pd z{sLNtmE5vi6LjQRh(MX;OF0@!ifuB1m%jc#VTH%)>}+agr9i^mO4Tm*!|v5 z9+{RS@tPl%Drrlkj#A- zf;2# z3&AB+&FFUF`U+T?)ntTL)hl4htfp*)h#tp3ULx4;^oqs(PUND8w_KGMT8(mLR`zPYf>*z2eKkP2 zYbOc1W?@#VR<2v{B5gn_(BdByr6&B&yi*}f{3|X%O;kLy9^My@sJJE)Sa~2gKs^DA z(A&Y2mGdBO9V7RI$lA;AB*yeRO*8vGY`z53T zEy;Ck!e$IgGv<ji0aW~o?a&n>*W?AM ziK=K7#};`Wc&{9&gSTiUtNIj}#iAjE7H;YCuiZ*sIkH!NX25byT24d6@fi7Y!wRpG z(XGOyD8E4&h_CIf07s2o^cjsus9 zmb-VmfAcUVnQM^s9I%e~6$E82E7fw>DzNl-unsBy2M@U5#ZM1ZRVzqkuVQZjEHDXHp8|_j*(;jC-Yma%*LH;KdWEMgEpQR_ zzM!=_*Q@W}uu^kTNG(f&fO5Th6e`}~@ncE3$IzzzI)SZv-t8@}kssg$semf=q0WJ3 z1+G)NK%z^54`qF2uiOk;Ezt^RY**ve%jJi2eA`0LQWJq!WCbk3>tK)A-39i~sOw2G zKStI+?$_@dqrs|)kbfz(N-iYoa8sygR9E)usi>vSB5Fk&NVPI6J<8qHthcE0!gys~ zuo5kR6;LEVw7S$Qk0Qa;)T=zRa2MDnLAndK7tqoiLslWy%CNvMTHuZp)SX1EeDqGFi@oA^vRbXXQXQx1G_1HG;&Vrs`^zGnowaz_nNm?$4U!;z) zzE^o|RZ#(prEud_e36#S(zSycH?5uwry)cp6*|=5mFE@=+68M$)sAhgRX+>_lKNWrQF-y>aFO;`g?L8Y;6TnEFd zroe8a(S0CR5z>k}PUNh!Ixu*FMvyM`s(bro5JIZ3aTRt$oB~0m?JGT?8NWB5R`5;Z z9=uv#FMYJoyWA^_HF5E4*H~m!Kjg*&SYBY^7NiX88+esh%lM`^>)iti7Gi;lW!0G} z5Kx)~8WyCal^0lo^^Lj<>s3gl$nS|X1*?j6>}t5D|Z**DiNDNdzH3B@XDPhfgTtcFX)f>uUluRhwlZ%$g^mAgPiL(5uSF|g*1b=@gaFKAfaxB`^B zz$#Yf6`V9?zgK6WO9_?Lr>IvK(n=3^KLZO~jaFC{xMS@Q&87T%kdmLn;`)1{1x6d1;~gl6nQ zWmsEKYgR17LM?C&V2DJOYR)bRR_y|dSVpBYw;iqgHqRDFvC&*gR(Dw$Ttp#dRL?F} zxeJ6+=>kt9^}biv-dMPA2bR^E0SbWv73Hdgcdl%eTXr@>gsP`yuO_GKHmkfZw->BI z3taFDL0Z-+2psz--*SHHrVUKO*fR{b7;=YWe0=+>e~C8^TR6;E}a zwkdqwn4kr&k_YY9z(oY9>dHzt8MU@@XW^Zz`_ixXkN$1atJ=5&%e24+ujv^o9ee^) zmCDz-SzAF1uY86xt%Dm_*SjGsR2sRrw9JcmrR4lasajaAz~v^8N7d8uz-u4eik8$8 zEpWjLPLOf{%BbA1dvWD1P*&wGaDVMx;0Tg={=x?H3gKe)xO|hb_e!V)Yk<1`-K#2A zORL941X9rImcfr5$5F1B9Cpi)LxX) zU`s3TDopg}I<2s(JH-B86Ug3`qI;%sGn|fTuI^9B?YA9zpeexXKvkw)Sc}jfH`!e}|UzioCpS?|b(|*kaVh zQ(JWt^@>E;ep`cZiIBfO*#oK&pBE@O-8PNa;A8oWtbdrdMLxr~bllqgkI zD@Z8=-d9xJI@qzXv4w+6$--s3DlbG49Vfs%Uuus9-o3Tz7Dg8FCb?2!(hFjPMMDWp zkP2Ijkix52t+q3_O-CJM)!ek0`nvgP8*$CGsn`Ag(&SHeZ3_zG=;LMbnq3yY4RhGes`sna*Mxm}tI^ahaEX?} zBu%S{FRj+9UD(xEFo!qpzw4$;+q%jaV!c%tc0p^IU%6D7*5(hg6D#7vu1+u6m8GIo zDX#w;Q@>g4A*SMW7O;S7cOw@>Ru71U)(~7q*6c3!n;~C=i#2!^yL!JsW>Oy5e#Xbi zt~~Zyc*!p@E7aiBTQ%ZV&)X6!7BB1)EEB8H?35deuMfEc(s6hcs{Mk>1J>8DAq=$;>CHWg_!0K*Z<(( zCy&>WkUU!$TnzadvO89t$%AQ!C`+^&pG|)Q(@jl_{2I@65uw!f$0-PIeba; zO?GR>N#(mNzD{t4SX-`|4?$K$gJL;o_EoC>w}2FO;4vJ{ck2$S4OvzB9x8;@5D^Z?O zW-M+p{Z&xb4P`EmhjH~Q=jGOWOjMl~(7X=B{rS$aqD4-H@kblWzd{~BPKZ6FYPu)H qhHbq`iZhS}h>|z}00000aF7epaNR`QD((sZ0000$0k-QD4L)1Gr4`@Vm? z;kvT9CzF}aW+s!_-S9l~yaJ%gNJvWnU|;|M2Kob@=K)aw9tH*u1{xj?77hUc9uWl> z6$Kd?g$Nr59hZXSH6=L-IT+BFTaqG&}$|MS#bdwZb2db7a?E> z2nZ-hD1@k}g#0w*H2nX+%kxhF4HhgKvKRsk4FE?2gFpj&?gR*4pn^lZ;QhORK|+H= zK*7L*dhx;jE`N6dVBiptP|z^Xa{wX)Xe25GDyZwuyW->I{&=POUu@uj6lxe8t|BWq zDwNMZL;uwP(}FKi(W%v%{MBTtf!{R!#yZX9h#tW~=pPm^oeEc-Mbm^|oFnTU@*F3{ zfAzqUDvBY%nrI41q56LKhx^|e=m8C?jU3w=JewH{7V8?kUnf(W8dMt;|HY!#RMNM# zXYk0#Nys(d`8Qn%4jfINoR*ZNnndYu+P_~RbNk}|$c@lBTGzm9S{$mdct>OPFCM6g z66M*T%a)p)ziE(wABmH6mtPlbK zBInX9Bn8>t@%ZfDBj6j*lf4bQ{}~OMVKjZjeponEpEv&yUmB2;8Lz+k{3cOWnd9&@ zHJC@(4^?nFfRxO0+Se4&`v9vZad#+03Cj`t8J3&-Gv}B0dj7Ln8NUYs)So-=1zwE$ zr~ET7BL8VgDp?-&Ap9R6e{*5Meo3GotkuBV%+Rsfewm!XTDf`XG61^ZnlFp-!u5d> z3b593d+hje_?KJ*&q~<8njp}SXy6+$38>Me;NSlt0s!_<$XKNb?vwju156%aoP1&H$n^hW#Q|A<0Vs9*h;P#-@M zo#3Cr|LH!UNu$f|U3a))xz#P_8&>T+{`bZ6X)?^_ID!nPv$yS04e}1F#lF7y z2H<-oT~blsZvXW5wA|$_k4n#ltJmhrmCql+%mUK^e_Eg#930jc}WZGpVqSr=$XZHt!tnHK_S)KQ~|I!8vO9mAXPL1o=`R@@51%EPJw|UmfxeUZFJETkU0s&m< z!;6irQ@>7vmZ&kPj-CCMkR*TK_Lgza^--b!5ykTC84%5C%o-AWcY4hjap7c>!EW1n z?nJ!t4CIWomp(ZYPxl9t;#BkNo_|y6e0T<|@3-z683;iU^MBWv1g3~k0K$vvzlvRw z^u4b2^x7lQtPsfN-MaR_J7{6vEGeIqW>7XYfPyH<<%cR99aPjUHqVB~Z}JuV79J%qW_q(Kf(7uf((rR!8YUjpdY&+Na&|Y$-j}sn|$0oxVc|Dew9%h zGR~*Q-p{cuxA!~Vv#RLWeOmTCx@hM-hA1jLy>lE`@2Fhf-oJF{yUDE1eg-riw$rZo zM%Ks(=Q5vxA|CHw%LyBKhq}ZjtKBt_xfnPHH{XA20aaiC1#DG7cp0QGEcV|t(3Q}# z;4w?!_*5W@31mNt=|8AwS-C!4wRnCHPscmn*r3_rEcA>#7kPL(y&b*ELaF_@IxB_%%{X)F^S8>sRxqqE zs!!3B1tfAsL?-Uk5xr3Z~tG*I=sTQ;fNYdLHLfCz~w32R{ZVxFO6+52ES z-F5R+1*7nG&GEv-{@m%j2SWY+84#R3y%X?$bU6RGMn+U*wYg_ToVf$DW1Dt-ah_cR zX2Lmr_K!}~mrz0u5B;I~KQ=S4ac$?B^%f6>93fykC}+FnJPT*GJMrZAIIx6{qNcSA zP}`0V$E(e)1LU5KFz0$w029AJyy@-3cd#?Yo%ZxaZ{~{!l$|VcocaFXV0W+Z^^fN5 zIEHkb7tTZ1V_*ga$spVH{R8FyV^4z6xa0Fw;4GawyF%^RxZu0ab2)p|apN(hV*4}H z=w$iZ+Jz55sJv=_;W&6Jpr=2MvwGEiMLMcrWyR zJ(dYhyYOYTuCI~d<5Ut64^P#eU2u547g%4tdV@qJ3paYnxAHeMl9!DPHxU*6zjl1) zdUl1@r}G!3Y4Tql&(fzq~11v zx`4BM>wcwn&-NgIlI}IVW}%mT`wS>Na4!CM)bs!GDCr*@=~#7FUE&dO^F%8Uw0(T3 z$C;}{*<*o`xBDlig4Do*LBfg$gcsxfr#Axtd!;x3{fc`_yB-1Z!x^)y=3kf~$Ri(* zQSw0!k2{^#F}rng*;@}bxju!n(JBN$Q`vy^v42Mz2s9i<~yA3c@I3hbq0veEvuV10a1ta}->KD)wKQ)-IQY(bivF0N{MK z+`a-b7J%e#)7oEdacIWZSpN`Z({WSz1pqwmuZW4|9vKIQ&z$ZV&-KQ3vqqnA{O_V* z(1?<(wvRln&s%}}<+$;~Z6$14%^I!g!|&9806+rhkO;6+eZDdOojd*Mf2nz0ZI@5n zxIrUe{P(xV#}OAz8{gWVJOg_AH%|wdM3DoArG-4ahKzx?XUiE!=MUa@RNF2#wt5M7 z-=;SO8p0kW&z~fhPEXMe+*mu}q;K2_OYb;)ceZ4)Whkc9KVAZVzTR9+I@a{9>pms^Rf%!5MGnkfY5`i6492QLD|3 zeKXg!UWeV)Boo2aMzvA7UD;4Cn!y1u5?CCP0U23Xvj01a2bqSBpPg`DcejOTI!L6| zogWex*AroDf2W=IeKs-og=u$0lqJYn^L%fI%Qu(Hllq4zK{*H2zL$C3?ENY|Yg}`oUaGDvGZZ%HRl*CSdhh4+GGRghBq|9)^o!|0 ziPZNOl>b{GM7tG|&h{fNj*$mHr$>XO1+K1ri;8+joVu5>mG8Q{BU`n$`Osc8e&Xq} zOg?%ZHS^#pdm+e+v9HzGe)32Z71kbf#kXYJ9$Fy!b*OgXFbij6L64qTZE%^A0-K$r zDy~RLNb$E`A0ZzGVX}9>jrZ?+#J__gX5F0LzS#}AJQz1KjRpYIbN2@ZU9A*T2e(&E zFIiXjaQo-0q00U3kjtI>pfi*)HzMQ?gxP-Kr>K+5XP{}bGu&gzgMgRo(0;S)vYlf2 ztGKW}d)oZES_XYb0R3-OLOyRuC}fR58`a<50{aKTpSk+oMhQ7RuK2XX zId0lpWg#LI$e0nckPU3VzjB`D|iDZNIm-Aja?{x}V(hl)Rmu zn|}uAFMyXE%VFSNz(~k`oxL)tOs~}C!ZwSF`27?t08di!9qadM0jhk^NikuCp+bP) zkB>qx>j$I~9^|)w7(k(9oNoA8NC37&h2f>LpUGLe3pH)3+i3?L%LAi>GXqF*3@gMRx0kR)KBX@G|Z zz9=e!`@C?0#dQ~bTLq;CH^YnD6>j;EJlwi*uiI8nu8&W$0RgoskFd56;~?_cDM4K+neD zsF2Zs4*(AZkE!gVjhX$&62oU#mk+Hz5XCooJGUzr(WpPpbv>80Zt<2LcmP0vYFUtb zpR~LF*PT^V`oZ~k5LVD*4Z~wc)>KPNaBej4W>!YT2NeL_kVrJD&>N}W7DolCLk&g) z0|5YohXOF`wBZ#&8h?j*ep{Tpk<}4E!1lr+$J0ti3?^l>UF>{+Z<$UA03PmlhO)*) zE2rJ~2ijv8KokJcw#dmctMTSx1@sVX1@7mE2}unO9*qhM4h~=nfgB4QorDw()h9q0 zPtibz>Yv!mb?PL51)MPYL+*yCj|+Gn;xT{?QI(9;T!BWYcdK) z>eKx(@<3$*h#f%Py;>F>&l>R}<^q|^EZ677K&Su-EbQ+a^8tnb05K8NU{Wv=A<%eL zkrH9`_}n?=&;n|B&~TinywU=2*>gP;4+UA?kHW7!h}BN^M?f-AeC-Xyn4dB>2bWhs zKLOZ}7rK?%kCf*vEjyrRjRKPFm(TzUh?DpLxu6yaY7AHm1u1NF02-7OIEa9W312{? z?yst?oLEc^;)O|?c5|MZ#v^j3+c=$eG_?V(-=P`)TM#SW_0Uw~IXj|WrTYW&Fdv8l z2scnowP!zhXHBMn?n@Cq+b>iIUI>*2G9R>VLH$A$BB&u`s3D+NC;^a=FCz+of-gu| z=CW!MpOxdOku|3WJOpi74;~`=2g7euO7b1|&jl59$H%5zro>ayd~noHcjtVC(4Z9c zVml@}@1_|yWTRi?AnKKS&2OyMt%KU2B>|ex7x91M0!V4B2pWrs7_=}fq>vEkCb4}A zplB@OOJ&u}zhD-?6F$^eJSkjy^E?LqI`K-1+wtZ&STJea$;4{Ycz<%~K-ArHdF3f6 zAea~ZYtu7}$n^k#!1Z#?Oy{>Px@|&aq#R`*Ctv0iOpA>B!lUtpCnO9c)_PSQt)D<#Sd7HuRH0DzMKxjq2BqH=t}7qwAYYY@5| z(dk>SLE^LJFDLwbCr^$3J&!2;t+&Q!OPjaer3GHK8%C>9oJS8?dbQ_|JW0D=>ZehR z)l2|DzQX58#5g^@vz)cn|5lJtfOo#(dOmCNVL=F_d6iMl5zoZU~QCA zJTHD#h3WIV{en#@KrT84(VvVIAp5_$byh*7f@^P=^1wHoIfdyO+RstPqk`Jcw3+Hdh$7VF^P0I>sJ^pKR14zKdNaH2s@>!&MC`3spNd6!K1uAU>)dF_a!o<{u#1a`b zu$1lH3Xf-?^t{sXaNE;+@KH|#lmdvhoz4hM_g%LQ4|H6ePT#+c1U;qb2mxRrjN9LK z?@VpOx6{YV?rTjFrn|wdPC+5^fX z-#ws(1W*_S#Nx`OfG*(y0jSv^NWY6B0K5mE^8Hd6!4PK6rd{w4#J~Ch;7tSV3}H%5 zLAtaln)3I*$gq&XqAa2`aTMXvG11XJFTws#QG`{*GPe|`HyayQD=7G){Q2*WzpvnL zS`xcytei|vYa`RG)=kkhv;XQ6A|=C>Mq@Ey`3(^ie*Z2YN1`2@3eyhLevj9Xik166 zGNC{cU1j^YO|JTaEw>`# z-CH#pkPrN4f!$=Jaosu}JV*k4aCnOffI)zRL%_ozLqR}5fjD2jHvmx3Xy~NEFsK-q zB+N?sb}?j3EXpb$VzIDs$c04Id~>RQ{2U!qG_d!JV`FzS{vq)BHuYCfl}BUUKn0_i{v5Pqs1+j+P<5@C5S+j zo~9cUJs^A{uS#tnr&%=p{SZAa-~MgiBdr8oWMgQkp65ID^41GG3Q@Ff`~e>BH1)DU znJhBxzD!4%r}qhgb{YLhZ4fp%s}DE(JZ%;J>Xx0dhxJWW8u@d#za}!WqaGmnY?zuD zKg&T9#6-W#F#S-bL?aU$+|eWQDaw}0;XvXW;UgkfOU?jkBTr?yTHg zGK-U#=XPnayru+to)XTEDej5veOz>>8P68ih_*jSGAY0W~G`ShURiMk!4(Y^-0 zChX#QEu`9;F1S*lPKJXpYu))Z*%a|#WONjuaVjd_S3jQJ+iU4M&0m$2e0G zjpZiqTrMl)b#2t0+QVb=8(G!OR?Ls)jW@RvYOYP43!^U&2>439IzU5t)?7SYAwDgh4dqqTGK1}YdH!4n^el_h;wx_y{;y6=QwU?sE zh#xGsoZ5vY+)4=^ClX=5$n@MUsu@}&A4#=ex$hRQ&YQ?|TSJG3?{mDce!_A$A)j(3 zTk-i?B9Z3f=SZdNRzF$pw3Q=iu~0bHQNqCHTPn@HPeSN!aca{sW;588{zGimZKRG; zRPHK5&7u)shk@~zZZvoZyvvr*3>_F64A# zs?@#u7-dp(o+|`V&|Eo?cs!Wi;jZj^|MvooIKJMmoT{@TojiHk^n(@1$|qz7?--NGy$s(aX?+bOU{z;vv#5RgQS6OQ{PXza>tah83Q{Gk7ki+|2}=U5 zsY-LV&8c$2P_B8j-x)-vyxXoqH6f9HJNO@GoIU;%?TGBJ0H_hbnp{iBPU^) zJEE92c0aYOG!4lf1fxa;T7p$GHMzRXxYea9H%$s!fTio_-ZLW*miKarq73XD}Tze+*f8F~o&d3~1A9TZwtPA?OWjJ6$1`z`+X12my#b z6&x1``?>gCb>$1e+k}&}&wxwtR_LOn5>j}C`(D$Xsyj%r&Lc>%?p=jf0@3$MPYpqt zs1F)#rC9}%Rdma0!((|fSjS(sca;v{ZLt@k9ViQ~a&rt{MOvhDm7Mnu5^K#$X{-Cx zQPV)0z;gTXt8_+xbrHTmoEl!#)U}bdCmR+FjOz4;#N-TO#9fqmkNPuM1UmL^=!d+F zokzErqbdSouN1Pt*^KZZZQ&awt+TL-%!IPZG40$=q`KVL+UWidSRuJRZd*a99i<3D zCw_2a+^OHW)aJEu>@xjABHot#rq$h;up>oIC{H3`&$~z;9-``QA*uT#>FWqZRoHCVaytS;4!cx_cE~Tu> z9gke)snmH=HzSshWOkx93o>V#yqMBd6dYj|eLW~|dm3*!fF`_6r7GYl>DL}lvDVkq zFQ{3U>=4G}?542g+lK6$-YVj0)K=O_rT^vq)M?nV0l;j;9O08* zeR*F$u`i5pPa~y_EGrZEEjCzkCP(8w6W+>OSgJ~6R!ga=v%2OWc9{(L zsUdqp>wp7%g%5axaxFbgv~C&^d_WW47|jxC)o*ux@bs6DFJbwJA_a$9=zM) zUULX`+QPT8!6Rl{DBPO@TWQ_d7KKWMRn+!&;@yk94@tg*bwo&nA?3qajQV3yB4^P8 z9U2@itwXZz=xa3x!y2y_B4DNVr!}r!=y+S{NXfmXF`^a?#4e6W+s;KbzPO~~z>u;; zvvZfcuMa9bE%k=3O`SdQDo+pmz;``3q99X}X8G1qBe0^)BE!=kOb1QN?l8QDElFYF zDDILo4=l@ictnK>*ZAj=cy|J!6eE2I-mVH7HPBfB^&VcT z06&daG&hsZ&b2r`+Bu&ECNQfqj&ukv*XbPot+<5L*qkd@=Jt_Vpy>CFy>95`OTxn; z?^&Z~VE9(t!0Cc9ikOSyF+DLRdkk$Py%ei84v}>%x8m?|DCe}r93>~ZNMV9s^{W_0 z4%d%<7FOvUcGE=bYv!V4nMi*>A6jk-bT^>TI9Mza9FKU921O*MpW0q_`~lnL4O_yUhI;$YYL~tP|FNF?VKNrBjfSkP zrOu<>g`a$#NRK@RruJXuF5W`7<~>k*BQ(z;Oi!UN<@aksUJzW4B_WT$!oi-W_f3o) z7Ti}bpwb)U=qV5#Z%;+LM0SuDx7SDb+N%?{0^^?Da5bajU-xEB}H0&G2kt%bMGF%nA9i0`A>-mzqXT^g1c!#GB_@c2o z<5Ju-TFztIA`c$~SnRpfw|{e~w+Ojw`7|T3YmX>w;LMTacPHNnm7u2BfB(t6hfg-Y+BS(FXJt}gSwmN^16iBN z=r(PZtG%AxcD(9(D6MkyH7McS^V(>?Nqv}~$#8S-4oXEA7!t3>WBPF(!tUL6qn zQP8YX1Du#bb-6m}wwszRNy(BIF;IUvGjI`0iuOR~*t8w9-5a31Lnw9HQ>VIJ_QDlN zATIpG{8&V$msMySoBP?M z(EV;qcjcGc>rg*}m5EOpTct`zONo(qSNot3UaLaZg0A=16^vU|BeTQu>B%22C>|%& z3vOj-mvr-KlVdN8cdPaz7z^NO*qA9-5L+iwo{UwdVKyq|Wg~go63U7n>xiUFJ*aF{ zQbS&WuYc+BqL_ev`!2f{Es8XMgXd2Ea`cF3m*z)(m+=g;Xbd49+DK-=6s@}i#@pK? z(@U^+-!;1hLmP=s?w|KS>C}RB(@LAp@>f>Ay8R{-zwlq#Q1T1Qs9jV2ax%nM>5uj$ zQ}Y>>s{0OQ2T;Ez&=r)n3QTHL3wx*rc|K!Ov4EdF<=mMH7aZW}jX9LEu!PrJ(=LZ_ z$iZ}+EZZeXvW%2P=x2=AQipln6_B69gVG0MhMKysbAjf{@*g7edKSr17pi8%UQay( zko9~bKY-7OUlzaNqo*Po@QM&hOjh4xDN?NNKLhtrw;z}J2C$w1&{k@G&%cM>>l(Pt z;h1D-p*Q7!gP|~N96q8JcaNtzs(C0qMaPn>DsMFLT673K8(xx&tYDRwZJ6Pe*+q@4 zx1%8OawFD_wlz$t@d%HnZpk-^2R99HHoV?_%#d{yu zxoUfsf1n>#FL@($N$lu+R`PhAc@c5SrBDdgYpT}u#Ti{VB5VqJr|L%TFhpkLpFg&kKV zCKdV(E7%n^;`_APRc;cWGYKlmF6gcgBOik8HEME7b~I=ATc`*Gv|;-nj&r7U>>#d% z6YM<$M_nT>?%Z3{tEHZ!xtmS4oqEalbP6+N5md;7e&3-c$qO6B9e5X< z?q0#P$}I6rIF}`hta}*o^(oIoZV+lss&KM5vsSPUNF588B;t1>4iuyK)*IuQALE9O zNpDNmm<1dt-E{%ZsfqUjqF)H#(Nf-tna0-VAREgW!j?|lBR9^LsZBYk*f6xroeTF+ znPhWbzYfVUPNN$aKs$(fcdhAx+pxv=YpU&xGh|TGHQtOV;1dN3noaA1HSG{&ck-T0 zy*rf}`6tUFzC=Slr&2PS@-a{LZ?kTxi`WaT3gWR@MiW+!rZe|tP7U7hhS>8-N{0k+tnC!?syZ75K=R2^_4)+hwvr)-e^7$=c>4($IxuX<3NcRcL3CT2iJ;c0#t2S1V zm8w{^2|kH_dUB{9qivtsm6A@1O<6fNmfb(5C=j$^Y30|fO`yl4=h}levQ+7m)gD26 zh}U2TK*sHR@puS^SHRFJ=+d3M4Os`x1KYEj(Gvb0o_8+t3%1ehHqnq@5ep4{81m*Yj1R!@<>$*igOml;aB- zI$;M#f)3iT4%S5A+_3VgV=;A`nqLI0m~L*1gpS`B)wVWy=n`WjT`~R8n6fAS0aL>C zfr5l81Rg4=9w%HpW|Reg`dA|dG<`!OGj?$w5!y{~{?W?lW_ zT2PrBD1?z02-#mNx+|bDP5oMrJX4^UV1z^F-Y&~H;M8|Vdp{RAl<&~Iog5m3mduP7 zfeVJj79C%djjX#SF%$2*0JmVadx`S}g`+?syUtRXf}aqZNI;Eay% zV!zlp;p=KIEN+~bpEO=zpN9pEyL~J&x}IvmWACZ|6oMODA$h4DBT;LIAzUl$h|rbf zYx^568@f_jeLO@`el;TAnq})iR2|1Ivm6r3*Hw}DmPm7=JP9-d@ppF$JKXM#y?yk# zoH7f#cl8v{!tm@316NqN4+|8Ov*nDjZ*z9xNnlZL%t_mE9EucOJxCeDj3O8L- z=!ry!N~B&MUp7}0anC1H4)EtQS5fR|aHMzo3_I3h>hqt9I&CJY_+;Ut#4(PwmYr2h zU1MT-6(ScR9xBH*FRIUv6fbMW((_6rEt=jH8dwE=jh>#Sc(ukz^({KO$trDAWOyW?#)IBYsc(N3 zcS%&x{xtWdOcucFF1R+7Y=cjQi46=;`{D%%9$l1`jeVvQ7-)qga(t0eBxw&RjX!<3%(T;%l=7nyU@I ziN|&$FHN|*GK~n6!c944(V73B(q?yFyTd(Bp7>i`VDJY#?cE4BxWT>1_aK?)haA=y zY;Hrf&h#^_%3AziSZX7?i(7Ph0e3@fo~AA;MVv@XtV#mhtEn_anEgF=c=4a1kVoHg zC8df6a~GIHIuUChC&t-_V-D#US5mlkf6ovhZF@YtyWt4S7@y?sS0O zkK{$@<}sgZ6VSH2e;R01H~uB9bh|_FnCFo`VgB1A6bE745!!#9v{oM__Z&koYNeR9 z?7fqp>tv|_H;XoEi*_`^77{Lf&FRG{;^ip&ZexqtHhFTPiY{l z(v9S1e74u=l!5)nc8;{2U#nL3hE$~|XJ!7TyGiTCQd?ZYVe0j`+nu~dgPB3v^q4aL zm+MKlJL$W>>QT2l8OeIxJ4QWe&^VmR{Csz{<1d#NahHE;fln#+1dL5T3CY;vW3s$d z%cXgHa4ArTa$xeC<%w$KBNBOzcnX3Yq-~GV-744ZYG4EcbQHDOd z^@JEOS?chOAi}d zD1wcR)OLQ0U$2m{<_w4D=P|hWrH~aDmgX*C3MATa{LQIIy4)8M^z{=4Y{l(W3T7XQ zyvB`FC_e8%&*}}om-Qusukp+U+tL{15As@BOAA;Pq7*Y?*`Jg4QHCGE zt@OPTNYcBZTk(u4n0|u4AvWA~dno&(*gZLq7 z3Op-{uhF%+v5uKvZixP4aG7+|*_){l4N^OXk79)2!!kbGLz&zh7F}j;w=M<{@Nn9D|+2tgiS{xnR&92^Y@2%Ly>N zCHbq5PGx>-OgPLH++%*++$6Y4c?MSWc4caHVm99uL{4GJ_|p)nns!^7gjq@^ex|Ck z*TrRMB=_b;{KZcYem}-f>i*Y}yA<&M;CVLPtwa=nfvK zCWu7Zi9rArCDCj%%7DJ8!^}apC~V!uqRJNQ`lB$0KaAWdX!-Th{DVGyVhxXHJ+%7? z0iC|i!!F;i=nl;^6tfmK`1p;dnyDYyZ!y3o!<%GF)w*FVUN zQ+0J9t1HP|eT!_+vv9fYdXBI@vI*e(6JPm+bN z!xeX3i_=Nz8{8B$^YsH=-o&4$GfMT-I{jd83`ObI|Owv?bQfVya$s?w-`w_2mvCOmu*73)x zv^IBah%_=++t7Rd%n~59c@Gh)Px3S?Uozas=SAA+Uiu*e<;~Q(q>wk$R8}4QCzILo ze!UetAIU;}vxlWRw)61xc_qxwEnS6pbf?d%51hz$44i2U8O2-txfL9^9KY1>!>r}V zwUaWnkXv>iq`@+zlothi*wsn0ShjBM$?%QPD#=%~D$0^9$FXspaQqp6#KR&rvrUZh zDycuvu1i5sFlBsGQzT&r%YY87-F$PNib>1Ixv^(lP+5kghL6l8VcU!`k@4w)88+}| zh`e^lDR1HY%@iJbP!igRcikQvXcM&2c?OXDqoYLbMsFJ%HN1JtusKNm+Re4Rv^DA6 z#Ytl2h17Ck8)nx;FOVo<>QJH$(wv);V?7jEgg%u3u3x5L?8?xe0jyu@T^Fr6he*WQ z*|Kk%vg>&E(CLB?$*Xnc(WoA9aVg16|PH`Ns3Ra2jrAt?=@qx%@% z{P}gVarZRnAyK;-7|Pan#suH06mkvOJ}$nRiIMDL@|}_}sU|$!N2-&KvP!bk`bfh1 z%H)f07_(ZRhY=#tfmGNhnD?HKW)kBu;1v&tPQ)0Fehlge$Td4#9uNk3)4K7h_a$;NQFYiX^ed{hpZ0a={N>8YK1Z}y%T z*pn{Oeb+x`rdH@z;5K)!Y66RzK^?a73iH~cAR_2h(P+&k12^dWHaL_{iYwWVayiI|Qx=B- zPD2dJ(hgEl!!5g$ZKVmP$fb}%=<_I~Q9Y(4xPB9R1HGaYJcEjJBt?Zl%C~Q(*LA4H(kU?sGNunpy(orR1- zWU`kwOB@GZgCRwp89X#AIh0io5J_CAlaKz|dX;L=8&%1?uO;OKL7x0fOo zWrxBelPve=X!&O#ihmYYxEI)lL~B=a(l;=O`)=U=zP!J`F76|LQ$ z4$_3FZv8Hs`u*}Nr(yew{b-Ir%7~f$1onbt#}A7+wv5ttJnDAL@XRXDK(Kp(x)Xq~ zL}3;dHYBJ|v|sorP@VtDS;ah7Lgz!Zp}j3^_uI%=+T;Yeb3PYweeqPGzEKq}L1Tl^kS}_%5nF7vAv^+h8~JXU;#gLDG(SJZ z8SqO|XIIMXBJgM}@3@N3ryJPVg*5$oz5OaJ9Y!DiN8pz}BMq|o)eV-T;XYAvJ6N$> ztu1u=;$f_nH%vMrdf~H3E=ypquV2XN>3GxaqJ=I>tbPZ=ujvi8&?TK(72uMB<)^S*C zi*_~_${-7T6mQ8BWf@RB4c%2I?Iw;WKC#fMAW?wvfJXZE%|r~xK_AajzSSL9xh9d{ z2~}rV1wVQ8^4yFHZY*lT0j-EFtHr{t3tJI@(Dkdh>SH(Iu8=f`nz1Oi9Bia_=*qHK zl2umq;}S*?(3pB7Tz%8~gp`o{6LQ44>&Idv^OSay!w0gq)-S0Yl=z^30>($G2$}p) z!h*a-lxLxMXpugXk*0I*JkuCgY+@^lRddqD+}%WhbYco_RV4uJ?f(_yl~6LG?%j+J zgQ4^;gz^l=PktxkuwSun; z5{P6LaAP&|rfN(2MRBVENi22;VV%vY@pf{SnW8I2Hz-b~WNEKbv|cMO&Mh0_X~pJsruqs zZ3<9eOA~yLxDMDhHO&X+YeH0OUn2@>Ixxjj$SltZRt2UGFdY$m^&mI~JA$if!9i*& zC*DIzSA|Jktwt3CtkcbTC?U!d1-?-;6Uy6I*Mc+`7APL!W@S%~3Em=HJOi(J*lsTD zku^Y*C=qSbSJCvV$LVlmR)vYntT<_^zYh+=gY6Q()}J|xT84^yfJ?IS5SCK*gnpRy zCeX>jNf3eeySu*^8Wa9DcAf5BaEsjN#gJ{_vQz?@SpIiZ;^L;zI|WnsiuDqmik*E# z+u5B*2DsM_wzex4CnKAOJ z9n8XfYq?(>bp{-eR{HgS!t!QIB`;x79U_P-JImV6bo9HLB7_lVe!=4`O{c6l5|l~| zqX(z1!fO^+TP-41Db17im!#Q}o=N0oR-G~CSZo>7^nVp@U?wfo1Lv>M)1gwm#7Oi@ zbH{Qsz3+j4Pz%aJ!ZX?(mGqf2r)Ff#HZz6o& zkhPZiy6)Seq=}Spf0vdFi7b@D>DmW3s>g=L>OhD{6t^>A#Mp7^f6QaDa>5d&ZgDii zFY)D`{?!;knJcc-A)qpo3G?vElTd|W%K#My-}wI5PV%ON61kkZ^uqL=kD=&pNWJfA zZaBvR`J7&Kh*%9YFC;WJcjqI5uwXZ}XU!9tvsg)_eR`B8Hu&84rb*rDk1h2LhheVe z*A_+Ci5yGHg2B446=_cJMMnqaaUwcL(2z+k|C? z%T#>OZ7!N!*w=k)q#ByQt zVruZStk4%J>EQdwLUHRgycCo^D(Srg+iF|(wj1FPpQG0Tko532+1EVoqId;Yp;m>+ zIv><0Nvo1OjtoLlc4N{Pq7hZX2Jq_Qp8?bS6wc^NZln;ip;a8$J{p>-RFPi2UBHrT zZRBTXa3P0xMXnGI^EB07XpjbY_uye0P1hFkTHbdUf#ZBUn2J_4rb9b|HDx%nVlIFz z+9_mmtoMdSU1Lwc-!S*$y{Ddzgml(&;Gpsc?=sS#-}m$#$zal7ZDab^$r=_zPLs&R)0Oo+T>xk5^TG;8c zSDzfkF_6BE@9YybW-oB4-P8Z_Ct`a7TS62XKG?$d&w-Wb_>yr_Oo%MU- z?5n;iO(zZ3C+I$eIt4lV8H)nTf+maPH-}rlIFy|(T%h`#u}U5n&?!!r!8TZp!8u)HWCV9G^2g& zU{a$v@o%HSuahWQ8{X;#h0&eQ`4t0OKf?`_SA|HblpL@y!nfOznnbToZ z4bvy1EzZvWo9|ln$Z-0UXfI>H?TLI*r723U)BTGx^Zw0$h{ly6pbBgP?;$HM%XT;} z(H^$(vM$V+`a72*Hu;X1>bSeGzOO6Y`+Ql&*eiWpkx351eF2$FE(kxoFRg{Cw?LRV1_3epKA zB$P`>%26SRhp2Q=nkXFvL6EBA4SMc=qx$=Qi!h(M1TS$6|qDaIEUi|JY2BdiFF5ZMRA*lBM zgA!1kw)jlt?^A$D1ByflkUy)3U6RjTC#eT0>415WiCG_N8k#CCj!4*sSZ9M_5}Y7^ zvXgtL_SqA1Z^@-Ej$?bCnm zKu!87@am2`3*F951JC-E+EUf>Qoscv4{Se7KZkL1_T6 zOD9&bh!j3da2Ji4gQ4{K5|r~B5sx&HxW%zKF^Ec8c8G?!S?z6wGK#Ci%X9N!0d^b> zJAC&rzyUsh=-PIhu^rq>%4I`==~J~&(yhi7RrhyHY{efc-0n4FjnRzCeJrPsc$A6@ zx*Mg*n;d>xRw+r<7H|6|^_yhwklpFc>8FF`VUut9SUfJl)u+Z!%;s5%uOrVNaA(^n zqSoZoY)@4=mdrC;AniHixoM|7W{U*-Lfxb90zcqF(rixFEw0LveF;@Wr7HVrKXBGL!XDJCC=t3W5jPYoF0BrB%$)m~_GR~WKx zYUZTF+U_wVv8mg*?w;lZQg{&Z5^kI za3*tfv&ZV2hP?TRS-l*yd)5o9E*hI$?GWArX0PofAL>a|>P6 z1$PfcJf?9w|pYEJaO(Q{g;u*9W8ue zHzfG?C1d)SX@*!%%x*1d9NEk%(i&@Q5%uqGze!qb=o~+4t`&pg$v)ZrmWxNuOSE^I zGa))j_T4dPBDcSr+;>a-EBOAUT^1h8A_fa@3A9hd*!`DNAYsm^FJg^vqGHsK# z6Mg=E|Mf?%28pC&dKUcRja~w#qB=h!VYk^l*{Ht0z@%_AUb=x(0ZsNd0dB@HSKB`|85y~N=kRKm z+cNuvqW{Ol+ara;XhiiRo4{NB+x}T%EhA>-(Ax3CbqfXTi~xN*s*Qj?rTT9SDVUAU zogdaJHwXD8#!4ru9aC3!miV-mbJiTW98w{*O!8{-iBb*%y?{}k=}s#e!Re>`L9*#co^t99c5xA(m!`p6aXlSR!@uX?uK=+k=1>-fTCmve}pT;flqzTx`wEYAj}6Ktah)**e19E)m?pOqM8s zTU5ZtzR&}!VNp~=-W#poUVXL8J#J;rw@gFDn1_MBUWRY((EVpCE`JGcPSL*)mey=5 zu)8G=L(CQ&vfS3urP)#8hPNS5gsQ+plYe>rDnyJcL_ zWun*^R7i*QgtRHEO7QK&goenUfReSW(65 zX~qlqE?_3#6s!>B@smaBcGsbz6m!$6AgFKUYK;F?Wry8!djmvnd6X5c0kx18ap2$V z*smKpsi{@Am`s7*P%+7T!IvpCU|MFK>JY)z7X<>np0XAPJ{g-t()jzuE9?v!bqwOAyLI_p*PtB$BHWO+=aATIWmVnYycKs`V=td zPwyu`S(+T*5#NLazIwbiWm%(|EGQAY`$FmfXTN8&liPmTCX`@TL=m@txnPemBDuvX zSVUIz2lt}}eQdN}+4)q-p&X+BRBpw1Oo#;luAVgo=Hq6Oc~$G3j@3Bi9@kFR)cL26 zVDs6gjM#dk-cQqdA>=crkBYlVf0j(Y0PJvWSq?jY&uT);`e3g-?oS<<6)W$`X(O8Y zz?wfRe>^oINlHqn&vog7q3bf){baMO zpDZ41Cr`^%j)~^roPQB{a!qqprh4&8QIBQvq26vptx&DLN5J!;+xkShx9o<3Cnh

wrG^^LNVW!}V5E<>^n6q)hXJ;lPYrT#yzVQNAV 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 JX#m>A{vVR&67&E7 literal 0 HcmV?d00001 diff --git a/static/image/logo1.png b/static/image/logo1.png new file mode 100644 index 0000000000000000000000000000000000000000..24e9c5f89e78aed62b3a6dd319033da31deea4f2 GIT binary patch literal 3028 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 JlS(w6^dEw6>pK7d literal 0 HcmV?d00001 diff --git a/static/image/none.png b/static/image/none.png new file mode 100644 index 0000000000000000000000000000000000000000..7f26eddc86a6bbf4fe4a4d1ab3ab7c951bd39d8d GIT binary patch literal 7725 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 literal 0 HcmV?d00001 diff --git a/static/image/person-bg.png b/static/image/person-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..c7053ab8c99cf67093d05a78cbfc8c9882ffc908 GIT binary patch literal 26636 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 be>MIBUn|#r#=(WK00000NkvXXu0mjfp4PYi literal 0 HcmV?d00001 diff --git a/static/image/person1.png b/static/image/person1.png new file mode 100644 index 0000000000000000000000000000000000000000..fca16567502c3e36b5d7119695cf4fce24ec0c93 GIT binary patch literal 528 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sQ2{<7u0Wch?mt7re};Ng1QdY? z*1{M-1#m%#;>Q0_y%6yxm;$iI%RgG?0S%We3GxeOs7Vp-|8}E2KG;^O@a2QkoENt( zQPMrS-<)r@xATDz5mp8UMh{OH#}JR>cQ4=WYgQ0xeV8lCB4TsxbJhRrGHjQx9lMsN zujcz~e}>e<-8Y)P^sW=1da+aO$F4cKML)tWZ)#}CX%Arwt})8hWidFqzxj?&NkUTh zR;`OSuN}#E;4;Zn4^vT}dbdY5u9<7Lr52!AZ^CGzk7XT~o-W?Y?JC@axfR$L$P zw0yz`hcC7d)EXz`vT&bCIpj7o@DP(`rQo-IQTCRpu0Q^!vWszeAAA4)AZy~;_s^N0 zcTGHDpdMmWJfr zG&XU0DDY3@fo;b(hrVYFXKtt$FnCpenypqU7I2D@JNJ^%e6JTfSMQTq%J$3rFT<6; V^;s*X%4`Qkt*5J>%Q~loCIFA{=`sKS literal 0 HcmV?d00001 diff --git a/static/image/person2.png b/static/image/person2.png new file mode 100644 index 0000000000000000000000000000000000000000..9d67572bbd11f5db281ea674d5aea7b0ff1496f2 GIT binary patch literal 620 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-r0X`wFK$@Z9KSTY0C<$ReMBr>V z7cK&1z)>Blc8EAkOX7~_)j%ucOM?7@8MrPx>wk?=Hu<@r^xpcq+*F^Z+obndzBzk* zLdSBE$qj0Eg%}tZ=Xkm}hIkx*JN0JKVFeyn*0>JYJ?n3-`v3nlSNAN7g!E-|_dVTX z!7}09)F*~DKXf16$-EoNbZ?QH!X*~*WyjX|aed2BIrqilv6t^@$y8>$ZwV{{3zelS zYuWhkNxabf$mvI*O9zb?!&|XKiNc+GBmn>rn`fZji;-h%Q~loCIHqE B5t9G_ literal 0 HcmV?d00001 diff --git a/static/image/person26.png b/static/image/person26.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecb59c1be33ad8ab0225fd42bca1c2654df3b67 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sfdM`tu0Wch?mt5V7}bMGAQvJ6 zce9a01F5&_krzTyE`}v<=H!{e;cSl6dspijHa-OM7 zu2kUGI93`or%`yZmGc$hx#xnOGfZNi@SkD(&s|?m95>|qpnit?G)sY%OXI;k@A@P* zeyUh<&*tjUbLp@9nO|%&topJ%T595leQvZ5yyPFB4$%ln$*$qNd zm=bjTE_%cr(dTZ6P+?Sf6XNSFv2xNhuZF07Gv%387AP<W#LyG6n%(p`&w^Qf9FL|>yT(34 z^IUM1%bklq*nVifbUn)&G}V3~yTRw;;PkzJx+EDQk{F6!PQUXxp>_`chuLDmRZ;Wv zX2m~@H~A~0!1zQ;LGIVYsR|zsu=~wbc%b-~m7(y^cJ+h)2#RA*S3j3^ HP6$Xxhq z+djj-w!0<)k5}eP?f7_sd!d%~nG0g_G4T@2^RF1(XcxL3ouD`?>{#&CSsDgA7RQ(x zaBg<=3G26-vhzU&-^}Tc=11s#xiFFWtKB`54b|Z)i5y&t(bMZW9s9$QzFnNxy6o4l zrJR?u=lk!Bo%6@Mbl=loe_x5`I)??ndaZp!ktO@=+68^lvc3xxelnR_Z7EjqEYDUl z*%Iq8f#pVswQ0!8g_X$_dzKz=ubXkrP^_uwoN=r0>zivDKQQNVQZYZf{)K|nfSFx~_Sm16ncQpT zAb9Mt!LmGwYTH*UCKmFqxYzomDNZA3@19Nf;=6Kq{?=bVxU|*yll&hB#;KlqGPkvz PK#}R`>gTe~DWM4fJAL41 literal 0 HcmV?d00001 diff --git a/static/image/person4.png b/static/image/person4.png new file mode 100644 index 0000000000000000000000000000000000000000..f4be28c72e264dd49b1310c82c69cddf5404e471 GIT binary patch literal 689 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-slLLH0T!A!0!+(al{~!{G>cJ$C z3t<3BGz3ut6ojb3stjTjvYBv0(6qz3wf`A_2&~LuiOUI~s|-ql{DK)A8qTCXz8d0f zp~?4YirA(V^JZp58Y}MGxvjq=H`Ya(?f3Wdr%oKMDt2EtH9=qZW!}=#_Y4e-b3I)g zLp+Z6UVB;AWFWx$KwGOxrPyJ{h@_#I~ul`U#VEEaA22tqsEdH2A-GY3K0RH zcDmN(KieRyv5O)8dm4xL^hJCHdbiF%Qdvk`&wUdXwN7B9cOAS`se+fS7J9XmM+K&@OFZ=Aha5L`E1e3hsb1|BOh1-w2)3#`aArzi zKi{h4B(d6M!E4H1Etvepce}{Ll*MkB1iT6eB6}&qB p$?=wcUPYpG?yt(#KF>G3;pet{!aC`^R2(SndAj z?=dhiGJCo>hIkx*d-dj~CIbPM3o0E8Hgza1iu<}N|L_0%=_^fHnUdSmZTmyYeJ2Vm zs`I$6v*rFW0Y(S+dGe1P%a5|kXP74Si`xo|RXMB{bQjQ-bJ#ZNj|eM}j`=MoAFxba zZvLIpYi^65<%{M|&N{zV_4VF@kSFZ|FN5zj3y7*cV&YW%wBF;H!vX#Gc?_$!YVD3q z5DfpG+u7f?>QuDnXBB?k*TKf!2X<(+IkvuCa_*wWqfeHz=Ki?P-K_oP;0&WyiJpli z6Hl~h>ge3p+$e9eeCLEk0!vmp9^B^9{5-mkdBU2F4}xmk{e`SLkMn;&cc6B5Roy=3 n;y{(tI~Q7bP0l+XkK9~9%F literal 0 HcmV?d00001 diff --git a/static/image/person6.png b/static/image/person6.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e10252e9364a6b7cc2c8d64311c6ad65ee6fcf GIT binary patch literal 457 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-snE^f_u0Wch?mt8Qe})Dy31n1) z*+4F`IFOCZ1uAPo(gNfHWr13N2rdpc5X|6-{=Nlhmr_ZPUob<%e*5R~JXcbT@2{F) z@A>iU>>klOyW8`E-L+%{)~{PU*{^u9_D7)Vx1KJJAs)xyUb&gqY#_jT!CFq5DV1}= zTF+f~|NlR6EigJGo*q2x^!ECfH+s&K)-3txrIjWddiCN#>y5vp zL?@@ttC-mR-Pl4Y>+EVS7n41CtsI>!PxzSBJh)E$@UCiY&DrI2VJV9jXI|8#jsH3K z)TW%6b;NeUo!{w&v-ooOsve$TbjUw>$Cc@E_u~8O*K0QF8f+1H7{>Fv<$(1DR|_JnjL1Iinte;>6R{&t;ucLK6Ux_sC}e literal 0 HcmV?d00001 diff --git a/static/image/person7.png b/static/image/person7.png new file mode 100644 index 0000000000000000000000000000000000000000..b3639c3f0d32b98188fef1aa61c9bad78f6ce197 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sW&u7Su0Wch;Xgy&e-POOCV`B4 zun0sD$Oa;aAdmzz=A3-q1k@;4666=m;1H_7cjd(XhE1xEx2@_+OXz-QUJR5h^K@|x z@i_kW(n+oZ3OueCpXWS(_P>7Hg`hhYCJz=ZDqmi4z`@{^-g}Lip9K>%CU-KNx+XIr zOKH}XpRx|os|%+%3V1mdrA^>?f7)SB_#!(F+jO}X*=@h0AH~0pWt31WuwyM#@oM0; nNigNtF}7H%avr$*S)d4ngfM`DH88yp1rYV^NP@_QKy)FSQ~RHx8LD_g!K2GSw;7cL`2{mH zIAnR2Nj}>jswsEx*4mZJ7PsZUeR5)xl?u4e zWWOv12F634E{-7{$ERMsS=MAA!1f?M(D7i{oujq)S8elUa1d;Y_zyyN4f~`HV$YO_==r$KKma zhi07m!8`GSVsdp(+ruP#)x}M7q$Gcv22Ee^M0BI%>hQ$J^bp&gP#-LXO*p7 zy%-7EW0% zPee=u4pje~Wyq^~!fevj$+sq~s#lB5<_h<@VqsC*!l)Coecr1dHOX_X9`0?K-8H{B z{mOOWuSeKkKIMJ$%r5o3_a>dqA3X0ygvqy_FzMW>Ed0rSn#yk_W4&*CCvB*2lj1T` z+qrvV-n2c8DaXur^u}#FX)0+K7*L@0zUpLe&Fj9Ti)UBuIL~evr4qLJ%(R$F&oJHj m_a3a?SKU1;Xnx$a^$)}^`rga2&OX2kN~oT$elF{r5}E)6m0A4& literal 0 HcmV?d00001 diff --git a/static/image/person9.png b/static/image/person9.png new file mode 100644 index 0000000000000000000000000000000000000000..3b1ae921bd2a45957716ef54ffbf28a0b75a7981 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^#z1Vq!3-q3UvJt5q(TCGLR^6~L*0Ld`u_|KU=qjx zBDhE!DiY;eW%KjW zypQyF8f&SXmvmVIRJO&_#WBR=_}fdj`I;4Y8WOeC=broASNs3_9W_o(C*jyK!^Qto zPflkG*)w_Pp_I8|F|0)^h10WAlEoF}Wzx#oPMlxbxwHAbnR(CzqkNS~s|qj5IYjM# zVJG0n_nEtRNE4X-Y0l4(gaWIT+rM42HhA{YWFuotv|>T&tJ${tWeZjv T<_(dU1`0k;S3j3^P6c1o;Is)R)A$ed4sxdiZAkiirZ}G9r9;N#45@ zbOETK&C|s(#NzbZE4%rc4R~4~3M;h4?A-GFZ~WE?2Lq**LX*yJzxn^cSqsVh$c=T5 z%WfFNlqO&1P|=+nwMm29Jb8JC+GmmWn7o+!dFpp0s^9H=zJK#R)yNx;k&>%&gg=zU zSEdLSa_R7?_&!|!XVC>?gAFqp<{tg_`}(!1txjo8$wyh44Z|nYGRSM{zVACO{1@bL MPgg&ebxsLQ0Bd=Bx&QzG literal 0 HcmV?d00001 diff --git a/static/image/product.png b/static/image/product.png new file mode 100644 index 0000000000000000000000000000000000000000..5c32c3c7fe274c4df8cea9f970b108c89c66ccd4 GIT binary patch literal 3585 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 literal 0 HcmV?d00001 diff --git a/static/image/product/2.png b/static/image/product/2.png new file mode 100644 index 0000000000000000000000000000000000000000..b69e84bd12030b49d49ef85ba4830da751ccaba7 GIT binary patch literal 434 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z(gJ)!T!FOx-2XPy{@c&{Z#VZp zkPSpuvp}TXy#Edh{+msKiO+$`IsnxJ(QGhx9*ms#-*NVThxz|)=ls`R_204&WFSx_ z5CM&H=Mnk|v`Mif$S;`Tk>JmROQ(z7^VR13`r%|_REUM_m)pB*N{kJp*;uX@B*?m@ zaRU|K@^opZV_0-yYwS-&lAq;b;8B4~$FnCeCK+FA!fTqcAa8NBF?XFKL@3;^NL{&aLj) z?3;a1^nue_4!#)Xr2#h@VlTNpjnJKTCF)(q`)DqejPOUyyL#GR`@NKkFFBDGb0*ff zT0V=-d(S$_rgPG3GD}|M>Rs@<$+Y;S)e?)%6^ooVS1nLCayTOKS9*zr&eF6Eg&}>s xceU#4YyKYYPKeX|Tr}(Yoj-{(KdbyMbN}BUnp$AD#SrLA22WQ%mvv4FO#sqP$kqS= literal 0 HcmV?d00001 diff --git a/static/image/product/3.png b/static/image/product/3.png new file mode 100644 index 0000000000000000000000000000000000000000..f4fe323ae0be5431fadbd97d240983d2868979b8 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Z%mREuT!A!0-G30O2a~m6280b1 zYyb3VwJogu~;(pTj`ONuDl_Ar_~v zUb)S8Sb?J&+SI z1!i5=EmfB^K2BVv7-Z_QN@>c+c+rOpYegsee)-imLF>w@h$rRjCQI8jefgpmynMXC zCffM<>-ch!qwA&5XWlgZI9c!9#Kd~>AM))=E@}2ZRawg}-<04i`_BCJv-#@z>zq!2 OJniY~=d#Wzp$PzrIejbu literal 0 HcmV?d00001 diff --git a/static/image/product/4.png b/static/image/product/4.png new file mode 100644 index 0000000000000000000000000000000000000000..1d975c67cc1ac42315a1d97be2bab58929bc33dd GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Zq5^zET!A!0?SF>4{|q(%8S4Kt zG=bSbE)X?}H_hvL!)&!3^4~RO8f} z%x)(=6AJQ?I@%SXt2nLLfrs_Uk!|X|nXmhR3a5LzIEGl9emn6r-ysD7SN*aq*Ep`+ zwfz77o4cC#bWXmKAti3h?UCk}pqEf-l+0X`>fOJUU9VEz^Z5foXNiWmNj=%Gb*mk# z4(|GXY31i)Hv22{c6AEPf60CF#*aiR^`+9YEnlv4aZn06aM3Gh;g({#8$L%Q7#DLp zT(Y`0xz6M82L>K}pF`HUl?!8+)=v|8{PW-*gT%sjaw3-N=Etn{2ZfZUtDnm{r-UW| DrG1Xz literal 0 HcmV?d00001 diff --git a/static/image/product/5.png b/static/image/product/5.png new file mode 100644 index 0000000000000000000000000000000000000000..5c98aaccbe7c6b4d8204ad61bce95639e22f8698 GIT binary patch literal 641 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`ZCIt9|xB_X0n*R)S{~4;mWc`1J z1~8-cKLd~r6bB+8qY1`_h+vX%#c(Y^5g>w?1{4Gu2t;s=5KAFkpc6Zlg1v9Yy=Hs5A_3=&H;$$h2pLfgszCONoyuKt~PwDyY_4B8PdfJ()9on2Bckc8G zCkd;d;4P0B7#IsZT^vI!P9L3oy{Oqhz%{(}-o}lM40;ddx%~fMK5@^b25+00C!5a; zSMOZ2PK@*3Ni%USsXa!lOdI27^3@xBoNK14XmfD0Qo|=_37LN8_#Y{+ZhG9D->qpJ zU$?16FzMd&ySupF_CB4}7Qa~Y>aC+LiE^$-*_~f3*wir5XZOC|2g!S@%z7uUG(5=O z-m!9$`y6+c0+}mIq@qHX6&zqKzj7|+cCS!(-J9H#RSL$_o>o$OVn*==Y0A~u>Q`RO?z*?zoFUQ%5f!Tt_RoNjD0Y{W%C(@j^oEJsoG!H7er0J36-yzn^kz%dhXe=eB6JhF{s1)Uf>%vv8R6tO7xg6QH!@>FVdQ I&MBb@0M#cd!2kdN literal 0 HcmV?d00001 diff --git a/static/image/product/6.png b/static/image/product/6.png new file mode 100644 index 0000000000000000000000000000000000000000..bf93532797a2b5bd893ac43f51d93679d409cc71 GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX3?zBp#Z3TGW&u7Su0Wch;Xgy|e}?-140T`x zWCIyME<^+<3r8?D6_Pve05uAh1o;IsI3%3EWw>hoB5uZ zuX)>>VbzKH{rlAn<-X)lIh1vE-Shwdy$vx4NrCdk`NGgVK$vMqY)wPR zg%F0h73M~2Vq*$JYQqphk2<4|7a(UJ+jl9)x0(8;9UKSr1}8Znb$xh3MS)M=KGMu1 zawd`d0Nd&k>i|DP*4R|If@1@FF2fHg;_OvRt>RL4ORVEa$UsCCuSL9)OjfaoB%4SG9^DO_ zkI+OFi~7M1Er&MPtC>gM9XMpLRTDdSi6LQ;2O1X5K+2*EsAo|Eurp;Apbdj+j3bl@ zBZVd{;QA11@R!M!FkWSUP0d@B?NHy|8PEl8*`D8^8mdb?;U2yBx_m{(f&g0`FQ!od zIsbyPV}YVNJ^s6!lrHNhlsX{q!t2{=00$XF9YMjGFmk9UZ)F%!uJe;*P@;F|?~n60 iWgr$+&!Q4rREPfs0w7TX7jX^%0000R@%n^ literal 0 HcmV?d00001 diff --git a/static/image/product/ppt.png b/static/image/product/ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..ddd6b10aaeaf1098dd3d358c303014b0310669e3 GIT binary patch literal 347 zcmV-h0i^zkP)rX&CV|NGsn{qo-X;IsM5fc)&z``@qm&V~K-B{@$zWe08`{KCx#&Y(yOAr6Y z%>V!Z1$0tQQ}L`N?Eq!e&`SUS0GvrgK~y-)?bNvrgD?<;;k980h|PWFzTW>KBUz$| z1Q|DU`RlK-Rvt;M5&e-En~F`8lvpuJGa?)XL)!)AOIPJ5aiig^RML#XT@C%`r9 zDAT3s2J{SR)1snCJ7A)y1l}>IrpN;`L-iR>2^uTlwT|*E%{z%W#mcgu`stEaR t7{g8I>;8zKeLtr}n5gNA8nLK3`~a5u99-WG+V}tf002ovPDHLkV1nk1wA26q literal 0 HcmV?d00001 diff --git a/static/image/product/shop-blue.png b/static/image/product/shop-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f55c19e9ad1efa77ca6cf53f22888d2e8a9506 GIT binary patch literal 1007 zcmV;{{{PU>)&Bne{r&y>`~39u_VDoW>+9|F^Ys1w z{rmg;_xJht_xbkr_UP#A;Naxl-Qm{O+yDRn0Dk|1!2ds<|9rjwO{M>q%Kz2s|F75o zjK%*Sj{jJz|3#ty6o~%}g#YgM|Kjog&F24Nu>Wzm|HI+`fJfY6o8ptw?SV)UKlW(b#1tBVbYT+OTST8{$Ez}oD68y{ zB6_{VtTD2+Nksh6dst$0%ZI+`_bQEubk!5RUa1h3DhHx~)~gX+-H8l}x8V6OA)av| zV$Z7-CZsA61?2l`OiJ^uJ5V0bEHSaA=|7`ec#X-e-O_Hr_5tx9wa;irbOV|UuJg6I zy(6Z~xDmUH6p*gRw&&l7sGy}S$O9fUq~=IHs+db3c*GX818&jl_34GgH$=3xBU;d; z7^L1v{1XADrUUuJCGLA}!3!cP`OpN?#w*-+qPrlX742-nWUnB}shc04^^QSmpD@T9 z7x=fwW2m1PRPfF--Z=Mww;*`MpqzJR&}a{Mi3PRkz+?wc=OFlmVY{RQYj`>Z!3&1f z4AMtL(DaLDHxi^cehd4aq&2}`CBJ$P5Kb*(6 z5cxu26~i~4hsCPE#-}o;Pk>Z{GkIZBUBINU(Jo-47`}Z6MB=_zCK40cA0A2++F2`l zXv13JUVQAUnR|J(uea_6++7jaOAL3-;x2;RRh7F;^Vfa;LegKE`b%AZ?d&hc{nfqy d=YswB#|gv&$zU0+XAl4Y002ovPDHLkV1haT6_fw~ literal 0 HcmV?d00001 diff --git a/static/image/product/shop.png b/static/image/product/shop.png new file mode 100644 index 0000000000000000000000000000000000000000..a698effc79ce661ecdeb2d2cb11f6bd37c0e2078 GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-r0X`wFK>F6*CpYgs2a*pTKfQJL z@vS>gKk|4iehErynxW6?Ya(SDl{c}}+mz|3E?MsWYk|G{1Df3diayYrslYxOz&(p;* z#N+thsi&tkD+stmv&esR?Xk)#`SE|hOyG<@3zf5J?=C%#4Oz&_a`{{4R^6iX^CSj@Gj@{Lm@gXFihy;@6FdP>_I_;KlwkirL{z9w@yMoj(c3TDWJHH^dCR-O%aKVNA6zaSf_m9pnQ*;gum~b@4p|&?E literal 0 HcmV?d00001 diff --git a/static/image/product/word.png b/static/image/product/word.png new file mode 100644 index 0000000000000000000000000000000000000000..bedc50481d55c33d09ab561543c40993b7d07f05 GIT binary patch literal 502 zcmV{QdrKtNg3Z{hh}AfVKR^-Tk-K{qXkw=<)v5=Ka#; z{fN5!da?X;uKe@({>tF}yx9Gv%Kezb{Bf-O?ezZT@c!WK{@v^T+3Eh0!2FB5{NnEZ z!P@<@(*3B+{g1u;gtz>DwESEP(lh`700neXPE+x$CG7xZ)X+-+00AONL_t(I%gvP8 zl7k=+MbV_Ms2Gj=9%J_Z|G^moPK|>#`j~z?)gI~s7R~my#ps`6mc3{8j#g@CGmBQs zVr*TK&U$^WG)7UX8)Y<*u2WR~mRtwE{*nVikpPleT#Q0N0>D$~A*7j9O^q9lI8Fh7r>_!o$U0u823nLJ_&IeAc*_zA sF-5pSxb)#qifwQ#=;sW4X-7vRRK5 zvYyCgJXXlKFPHU1q2NA{4HW;b<2?_kj=LntFPNdh{y>7k0)>2m2~le%DglL$db&7< zNL=;}IL+1Uz;kAu$ilcDC;h!T3%9h!>1=}dbqjS<*jFT)I*f+?1D`PP@v#s>?0$-=-JOY^RtZ=A8h`o!5En{Oz7yL`odM^Jc! U)h(@ZpobVdUHx3vIVCg!0EAZ_0#PSO@CsL22~fLmNswPKL&M!PuT86GPbv&mJhsEhSWAp|in2%_P`b*~#W6(V z{N4+<`I;3(TrSo+Fn+xB>d*iEX4~Any@fBcUzg@drw&Fpd=+oD5f^7y)LTX2PCJdHo+Y61*;lzzWv;tHgCS%t2z$f7rsYlfjsHy>gTe~DWM4fEpv2| literal 0 HcmV?d00001 diff --git a/static/image/study-bg.jpg b/static/image/study-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..afe399f695d73521c777b79a93f92f9daff45e95 GIT binary patch literal 49116 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

a$cG8@Zgbp0L>uE;qq5Id1ywaNq1XOCJEY53q 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 literal 0 HcmV?d00001 diff --git a/static/image/tab1-1.png b/static/image/tab1-1.png new file mode 100644 index 0000000000000000000000000000000000000000..819c91517a44b9298f913d6da8e9fa06e47a58fb GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*FxK?*N|=S0K&M@SmX`jM`uf2p3KQ z6#!8qn1rx_Qguj*fl~GVZzVgF0Zo%A3GxeOs51S@K4tHc>+^b=1N9Vz4{urX?&baS zQ9EC5x&l?>42{Hr}BA~){#xtTQx(Z zuVlXn4K9_feWm4hd7hq?pJH5T>CXkl{XLUQe3wZ`Yv%dvXbkFI^TvtU+S+j^i}kK~ zFVt7AoWfV2cgXUmdKI;Vst039ltwg3PC literal 0 HcmV?d00001 diff --git a/static/image/tab1.png b/static/image/tab1.png new file mode 100644 index 0000000000000000000000000000000000000000..6b1255da4afd078f6745f110a61f8484b15a1a79 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NV3?%C=ER6$Fq5(c3u0VRn&K(f6eaFu2yLJNE z&1o0(fD&vaL4LsuUteFXujdJVa0)1r=jq}YqH+Fg|3S_M2ObvxBiaYI>w9nP6HfiD z@2J`?z3IjAYK!>?3^-Lxm6){{MR@&9u9PsU$R@nmB*XV*`yGw+j9CvKxE?<;VGWP7 z)}}2Jk|)$mvZ-~+Y~D04sPgRp6M7zpPkz!fPE`su`g4RaKd3dm_dPGjW(H4JKbLh* G2~7aK=~Nm3 literal 0 HcmV?d00001 diff --git a/static/image/tab2-1.png b/static/image/tab2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5dd59ccf8dcb8753620b403b3b0d26f932674dab GIT binary patch literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NV3?%C=ER6$F5&=FTu0Wch{yz$;{SD+^Q5M(- zlwvOl@(X78_~Z5Qo$kBO?{NbP<$Jm~hG?8mUSO%A-@f_40)Z1r`uh3~f;#P+F0kHo z3}Kw5(BdYV(td$eqv>ftgU$)REegzGj-@+XXKY)%Ggx-^QS0KG}*UlY4xEn+Q(XQRQ zfMDCMZ9w+ky?cS|9lLhy+zFHb$pRIF07MH=5G(?e0x8?MW3{DJEYL*Bk|4iehWGdQ zj~}wq=YA;_8KiM*`>ZL6m)0%rbtOc?HAPNedKYF2r15nEke^DWM_s_X1I$!ZB_W%F@ literal 0 HcmV?d00001 diff --git a/static/image/tab3.png b/static/image/tab3.png new file mode 100644 index 0000000000000000000000000000000000000000..b8560b25dc5739ebfff9668821f254d021fb01bc GIT binary patch literal 331 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU3?z3ec*FxK*8raoS0KG(*N$DgcJ0`?W9QDD zJ9g|iaNq!tyK~o0pg52OF~CwFHjoFD+6^LsDna6VK(d9^KW+dG5-SPv3uf3{`?J4* z%j@a21vc*+qwZvCD2QG*R%{1X>eIrYMyMp8sv1Wxgy? zsC`pr_W!TqOq|BAjHlYfi8tJ@2dq3u?<%Y_vSu zRGs!~h6yZuRxm~3PtbG)hlTGCq$W&c>3x*Sd1+zfx4!lJEVtyYh+k~5J&|SZ{H+1p zuUZ`E`tnx1S@88Qmj}1Q#(ApzEAOtfl094!TJY+*En`cp`|}`9_hO(^89ZJ6T-G@y GGywos&yz9$ literal 0 HcmV?d00001 diff --git a/static/image/tab4-1.png b/static/image/tab4-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e8894676e7e1a1a7b458cd6b04d02a0c76851b81 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NV3?%C=ER6$Fq5(c3u0Wch{yzjU*8gX00I?Ha z^4tN6vy}w-1vC8mxbw-b&WqE%fFebnE{-7@=aUzxdNebo7@Fxc`D8}0+}yyqEKxA! zklG2inF&&6j)prTxSTHV=*?(IQTx~=pf|&1tDH`&u8HtQ)^w(64gN>OWN#>S7WgPR zSvD~4@0Xa^S0KFu2zKt+xf6&%3?SOK zZy!ix7f@^`kc0^C+`V(ht{uB}0Wnk=NERr#d&lnGyMcm0-gY3|15!V4o|iPxXql2A zzhDNwUz=y&n85KR+ThuPvn3g!dsesDtICSJaXaGUq-(+lRCmqO#WBR<^x4a&`I;33 z94-p7xHx{yz5Vn5`<$lE8x{)PYH#lzc;vvu@?-uKX_r=a*E5#F0bE`#LYLmjWu0kW zb+Sb^&1oL@YM&Jb!s|pr9FDBZW7aBc^%v@U@p$R^_xC3iq*?Q(+C75PPOs}*Rdl#t z%Jb$-Wx@S16W2{xQ*@+$;pKGmjTR}T1zrhC(hCl!Je=5OqQie<$wGxXlgMI+lR#zbt+e3e2>9h5}e&72) zHBV#BV zeUbRX-D3MimW8@3GcILJli6(%d-JK*T6ya=RZ`V{`%Aypird$}zkFLNfAfXpN5xFb z_4$@r6dnpceAw3J2&Z#J`}+?E7aH5;-buJKe_>LYe8}NLs}GeN%qQU<2EcFeXMu>-Zf@?shX+e6D1OX_St+owI<)bS^VPfU8v2MosJK QKtmWjUHx3vIVCg!0EDzUfB*mh literal 0 HcmV?d00001 diff --git a/static/image/wechat.png b/static/image/wechat.png new file mode 100644 index 0000000000000000000000000000000000000000..9f8d9464415e2ac2c90625cc9a9124e649992716 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^IzX(i8{Z3{(K01L ze!&bM1)m09QcdJ+(TlQ_UYv7m$CUjWSNB$W-JR`Nym-Yg1_nk?PZ!4!i_@)BZVELk z@VGK>;<~mp%lzMe>(?_3at*J1o^sJytswA+o118eNr7KXsne01yYZpCDU<9^uF{$w zqV%ilwpr)HM-kyF)3nW*zdfyzPn~7%uzclW#@X{lkN8h-NZmbk$2!g9`xY4HJmvM? zI@M&B?vp*cFWy@rV%PICu~4LQd8L-J@0+?O)~oH-Y!;VsUH@^i@pC^RccnJ*llsSa z*Xo5^_dI#=ZGG|*<~W_&6TQ9lH>$rsEnTeO`fgF-+IHUX7~cDrr8-0=*1Ty=`_km!)q+?tc=vR7z;UjVDQ~H!(h$W>jqPnkV_xi)rSW zXuTqgl%FL%qPfynj<={~Yy^ uvMm(Vy!)_6Piu7)!^@+S&3~j;QD literal 0 HcmV?d00001 diff --git a/static/image/workbench/index1.png b/static/image/workbench/index1.png new file mode 100644 index 0000000000000000000000000000000000000000..bdbfa6711d9296c59b6c23e159a2a47e1d0a0491 GIT binary patch literal 39359 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 L`njxgN@xNAu$xsE literal 0 HcmV?d00001 diff --git a/static/image/workbench/index11.png b/static/image/workbench/index11.png new file mode 100644 index 0000000000000000000000000000000000000000..415c90cfd0ab55935e53b88cd4b76d54bced4229 GIT binary patch literal 15624 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 DmmmhQ literal 0 HcmV?d00001 diff --git a/static/image/workbench/index3.png b/static/image/workbench/index3.png new file mode 100644 index 0000000000000000000000000000000000000000..abe97795426271bac40a1fabbb2cc8c3e57a756a GIT binary patch literal 974 zcmeAS@N?(olHy`uVBq!ia0vp^ejv=j3?z4!T+jzn=L38~T!FM=&VPp2F!b_2!>j)c z@1R_e)SLhE1^<p|i`Hjo5Ky@hfW@<4*}MgN)ZgTxiHL56@70L}UTpY0-8 z8Bh?S_vL>DuwK=I|KijC^RNHUbsTKwtN%ctQ1D-L=6}W~{{`0k|M2adEao97cw1HGhM z666=m@a<%k?BQ;%_b(orE6%K8xwmXeq|oP=oAPx2UD}mrA;$iD)5#TWZf;s4@2)i; z&8SIWU|?$Wba4!cIQ(|n&8k%f0u90fks<~6w_bhse2zetW@z;8{r`<+wPO<|B`gx( z`*8oo?w|ki(~KrJaB*?f&0l3+WKiZ7Co1c=-+SN7Z~R*;XDm5z&(UbVA4BPXhP&6; zYCIYz}7$d?D9u_t=p7!e>hq@={CfSwLqBDr}#_z1v&@R#oj3-FD4UV?8(f zoUC+5skE*0G;00-?G66La!q&jY{Rv)jZf-o*82Y28?=k%<=LChB7chivRYK)YPLqB z_u9_udyd+4I!Z-n3esZGeSV__0wVzTm9=T zsRwPOmK~F|`g-xQ&z7%qKdl!!+Wp{)%ltXgyZ0%V)x}FZ*EqU#pRQ%t)uWy>f2lUj zm|CbDa7`oB^xm|gOp;TcE-C=L+>k_vhM z8D4?7Q1k}Oc>AB>JyaZ|_|<%2>+F2+n-ncz0-n)Z$$pKG({ zdhIz7+T&T#Z+X+E;>D~Z3%CljKQ4Dv^)}^rVqjQk?c4lI_t1{eB)_{2?Vr@%FIdB5 zGrihwg?V{^)d$Za9xsPEcT+DfkelVdY_jE?y>`1&H!;|#J^on1^kI*|=98amg1_(3 zj8BZZ@}S!4-XRn9^TyWy4r#rdJ$-kh^`be|%1fCeb<8)l9`!DHz!iS*xulZyrKWCW zrF9A&s@qD63pTl2*V$oUIMM0=PzU_B-p3ax1%jIdMiT zsCDDM=WG1-PnxdtMtFVK+Eu@eb;Be0&)@2OSi1bxgNbQLXTH6hbeHjO@FdMOtr2fR zYk&JM+K{!;Fv+~ABqr?3I>*~r!e{JRv)!Q5P|K%NN_1J1Z|lkgu@wfQvqENY&2nsA z`5+)sDZ1sSYR)9~4E09*o`Oom`Kaf-eGT!`G z2Xi4J|Nn!eu0Q!7-1EO@{)0(C)tn_ke!&cve|~LB=e>UZ{UbdYpx`D?7sn8f(8N$H#$SA8Wy%^O}l zn-|5(p8j#g?9E(^*B%6#XNw9gIAi1Uo%hfOX`hdR3$J+j)NFWnZ?AO&$LAZ3uedr2 zKZQM?>{|ekz9G1?XGPC{VK1YeV#jh5;;<&zAptR+6rpG>& unD@?~EFYG!EV-j_M~`v3^Wp>!W`|?{A)alGfKKx#QbBwN(*9{?4{K2d9*J zn6A&eX}w08fq`*_r;B4q#NoGBZuT`9h%`K8(*50M(I6*w{d@i4LW9iqo~629(kA^A zS5y0S@?g<~lPN}=T+G-1t};z*=Xuumv+ndajtesPZ?#75V?Mp8$T)271Lr(}yjeob z>(>Mw3A*37wIKLJaxTlEM@uHp{?y~B_vq#!&HXYH&I`)CV+gTcQy8~qh3mtA*2mL) zuN%&u7gzWrXaD{~yvIHN-cxv_8U1CIU(%W9Hy)knUmg5Q^Y;a*~z`GD--mUJRs#F8pebgqu{Qr$tnD63`i+39~ Q03(;d)78&qol`;+09e>IQ~&?~ literal 0 HcmV?d00001 diff --git a/static/image/workbench/index7.png b/static/image/workbench/index7.png new file mode 100644 index 0000000000000000000000000000000000000000..1fbd6c4d4eaf7a049163e94deb1e0973a3606840 GIT binary patch literal 283 zcmeAS@N?(olHy`uVBq!ia0vp^Qa~)j!3-ol&c;6kQkDTeA+A80Jg}!Mz!s=es3gcQ zn1MrPzt_9QCz>nn%&`1+c0qrPXGhU;plrRTi(`n!`K#wna~(F|aS5zUy7@`D|J?uj z9A~dPPAsug^oqioc3(K*z0%PyaB?Mbn;NEuMX2vZ^foX bei{?hUC;0zYMLl92joRhS3j3^P6z|2KaB51#)ue*Y4j|22O9D2o3ij{g&#|2BXBB#!?Ro&Pp}{}Y}6G=l#mkN*>$ z|1*C73!(oydjB1h{|%x48kherhW|T!{|ux5JAD5OrT;j5{|}!3|Ns9teE%Di|Fzry z6`21rf&VRq|09n7D2e~$@&B&V|Ebph-tGU?>HqTh|H};T5p=mY#q>uuw$orYENS|6i27+e1&lcl_eaGrQby zfLymxRg3w2QLQ$*kX`F$z!_|Co8fd>(kS_q{NtNoVW}^1Lvl7EjEex?rY7=G!+C z`7b7~iRgyV%t*DwLD&^QS1b$CD4!kPg+iW z&l`_D&!1Xs5*b{ll5tk=uijY7Tkj%f@TWnQ%xLvCJw?-PWFx^U&=8m7$+E21Hu7G!zL{gC?s>qt_m9L<;_a8iwHFVD~ZecwUNo@Q>S{sYBR$7 z`wF)%KFc=z{MF;`fmajAq~e!B<`yWWEX?p=kWiWeqFjj~*~InaPq<7VHHS>Rv4+c1 zb8Zzlt$mT4)4PXs%`17%WfQXN)GJ!SwhLON-T|q9rl*j-WvUJZ00000NkvXXu0mjf D_M(_V literal 0 HcmV?d00001 diff --git a/static/image/workbench/index9.png b/static/image/workbench/index9.png new file mode 100644 index 0000000000000000000000000000000000000000..186de65277f66ec414f2267ac41756a7b139759b GIT binary patch literal 624 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k3?#4J%UA`Zx&nMcT!HleZH)i70ZE4c+Zq0E zW%$1u$YA`xpXvVrrvGagK;&WO|7#gQY@pzJMyU8f=Kt%#f`^&@uVnati0S`6CXimB zG9cIkG?VfFL8kw2_W$3+@c&lB{~MM6|Ni*@{ptUA$Nt~#`oCT3|I;P^kJJB-z;k~5NLSVxM>F?Q`S~h0iNy^wg0bY&oD4#smtGQY+@}@La-k#pgc>)?LT)kfFl5fbBaTWG@ zbp=NM2wbsMP>R*OAZ&%=k@q4@tz{-B*QH)Qlw~a&_nGxkj?q=Qq}C%$oJLngjZD5S z-stmLDR}9FKDTSpE3PjqVpKBux_kD_zRZ#X%Y%~p&zb0}MDQ8aSABWEZ(;Sa*c-04 z@g~Xo2X8NX+LU)p=0M-2fF7mE7t}@dco#M=xA%*m9rW)^^BI4OkY!uSWG@87IrSfQ z>16*bBR^g8*`ouSY)nonwtv0zW!wEcv)g}7OAo$~PkUPYt6XGT0x+@|JYD@<);T3K F0RRcRF-ZUb literal 0 HcmV?d00001 diff --git a/styles/common.scss b/styles/common.scss new file mode 100644 index 0000000..8a817e6 --- /dev/null +++ b/styles/common.scss @@ -0,0 +1,305 @@ +button[type=primary] { + background-color: #007eff; +} +.bg-wh { + background-color: #fff; +} +page { + height: 100%; + background-color: #f5f5f5; +} +ul { + padding-left: 0; + li { + list-style: none; + } +} +.block { + padding: 0 24rpx; + margin: 20rpx 24rpx; + border-radius: 16rpx; + background-color: #fff; +} +.ell { + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; +} +.l-title { + display: flex; + align-items: center; + padding: 28rpx 0; + font-size: 28rpx; + color: #333; + &:before { + content: ''; + width: 6rpx; + height: 28rpx; + margin-right: 12rpx; + vertical-align: middle; + background-color: #4876F9; + } +} +@mixin sort { + margin: 0 20rpx 0 10rpx; + &:before { + content: ''; + display: block; + margin-bottom: 5rpx; + border: 15rpx solid transparent; + border-bottom-color: #B9B9B9; + } + &:after { + content: ''; + display: block; + border: 15rpx solid transparent; + border-top-color: #B9B9B9; + } + &.desc:before { + border-bottom-color: #007EFF; + } + &.asc:after { + border-top-color: #007EFF; + } +} +.filter { + display: flex; + align-items: center; + padding: 10rpx 30rpx 10rpx 10rpx; + background-color: #fff; + .search { + flex: 1; + } + .uni-searchbar__box { + height: 70rpx; + } + .sort { + @include sort; + } +} +.form-list { + border-top: 1px solid #E6E8ED; + .line { + display: flex; + justify-content: space-between; + align-items: center; + padding: 28rpx 0; + border-bottom: 1px solid #E6E8ED; + &:last-child { + border-bottom: 0; + } + } + .ph { + font-size: 28rpx; + color: #999; + } + .name, .val, input { + font-size: 28rpx; + color: #333; + } + input { + flex: 1; + margin-left: 20rpx; + text-align: right; + } + .req { + .name:after { + content: '*'; + margin-left: 6rpx; + color: #F53232; + vertical-align: middle; + } + } + .err { + .name { + color: #f00; + } + } + .inline { + display: inline-flex; + align-items: center; + @extend input; + input { + margin-right: 10rpx; + } + } +} +.picker-input .input-value-border { + line-height: 1; + border: 0; +} +.tab { + display: flex; + justify-content: space-around; + margin-bottom: 20rpx; + background-color: #fff; + li { + padding: 0 20rpx; + font-size: 28rpx; + white-space: nowrap; + line-height: 100rpx; + border-bottom: 3px solid transparent; + } + .active { + color: $uni-primary; + border-bottom-color: $uni-primary; + } + .sort { + @include sort; + } +} +.plus { + position: fixed; + bottom: 40rpx; + right: 40rpx; +} + +.popup-mask { + z-index: 9; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-color: rgba(0, 0, 0, .5); +} +.popup { + z-index: 10; + position: fixed; + bottom: 0%; + width: 100%; + height: 90vh; + background-color: #fff; + border-top-left-radius: 8px; + border-top-right-radius: 8px; + .top { + text-align: center; + line-height: 100rpx; + font-size: 28rpx; + color: #333; + border-bottom: 1px solid #f1f1f1; + } + .close { + position: absolute; + top: 30rpx; + right: 30rpx; + } + .list { + max-height: calc(90vh - 206rpx); + padding: 0 30rpx; + overflow: auto; + .item { + line-height: 80rpx; + font-size: 24rpx; + } + } +} +.type-popup { + z-index: 10; + position: fixed; + top: 100%; + left: 0; + width: 100%; + height: 100%; + padding: 10rpx; + background-color: #fff; + transition: .3s; + overflow: auto; + &.active { + top: 0; + } + .close { + position: absolute; + top: 50rpx; + right: 50rpx; + } + .title { + margin: 150rpx 20rpx 30rpx; + font-size: 30rpx; + color: #333; + } + .types { + display: flex; + flex-wrap: wrap; + } + .item { + width: calc((100% - 80rpx) / 3); + margin: 10rpx; + font-size: 28rpx; + line-height: 3; + text-align: center; + color: #1f1f1f; + background-color: #dbebff; + border-radius: 2px; + &.active { + color: #fff; + background-color: #007EFF; + } + } +} +.btn-wrap { + z-index: 10; + position: fixed; + bottom: env(safe-area-inset-bottom); + bottom: 0; + display: flex; + justify-content: flex-end; + align-items: center; + width: 100%; + padding: 20rpx 24rpx 20rpx 40rpx; + background-color: #fff; + box-shadow: 0px 0px 7rpx 0px rgba(203, 203, 203, 0.55); + box-sizing: border-box; + .btn { + width: 100%; + line-height: 80rpx; + font-size: 30rpx; + text-align: center; + color: #fff; + border-radius: 10rpx; + background-color: #007EFF; + } +} +.per-mask { + z-index: 1000; + position: fixed; + top: 0; + left: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 100%; + height: 100%; + -webkit-user-drag: none; + -webkit-user-select: none; + user-select: none; + .mask { + position: relative; + width: 100%; + height: 100%; + filter: blur(10px); + } + .texts { + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100%; + text-align: center; + } + .text { + margin-bottom: 40rpx; + font-size: 28rpx; + color: #333; + } + .qrcode { + width: 78%; + } +} + +.not-auth { + height: 100vh; + padding-bottom: 0 !important; + overflow: hidden; + filter: blur(10px); +} \ No newline at end of file diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..0bbb54a --- /dev/null +++ b/uni.scss @@ -0,0 +1,3 @@ +@import '@/uni_modules/uni-scss/variables.scss'; +@import '@/styles/common.scss'; +@import '@/static/iconfont/iconfont.css'; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/changelog.md b/uni_modules/Sansnn-uQRCode/changelog.md new file mode 100644 index 0000000..de28dde --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/changelog.md @@ -0,0 +1,44 @@ +## 3.2.2(2022-05-12) +3.2.2 + +修复vue3引入js报错问题; +增加draw可选项,可在每一阶段绘制前后扩展自定义方法,详见文档draw(options); +其他优化。 +## 3.2.1(2022-05-09) +3.2.1 + +已实现导入临时文件方法`toTempFilePath`; +已实现保存二维码到本地或相册方法`save`; +已实现生成完成回调事件`complete`; +文档补充。 +## 3.2.0(2022-05-07) +3.2.0 + +适用所有支持canvas的前端应用和Node.js服务端; +微信小程序端切换为canvas2d; +支持绘制背景图片和前景图片,也就是说可以绘制背景和logo了; +支持对定位角进行样式设置; +支持对分割图案进行样式设置; +支持对对齐图案进行样式设置; +支持对时序图案进行样式设置; +支持对暗块进行样式设置; +支持对版本信息进行样式设置; +解决小块之间出现白线问题。 +## 3.0.1(2022-01-05) +3.0.1 gcanvas引用目录调整。 +## 3.0.0(2022-01-04) +3.0.0 uQRCode 3.0 全新版本来袭。 +## 2.0.4(2021-11-19) +2.0.4 新增绘制模式;新增绘制延时、canvas导入文件延时属性。 +## 2.0.3(2021-10-18) +2.0.3 修复在部分安卓设备生成异常;移除延迟绘制;新增批量生成示例。 +## 2.0.23(2021-08-09) + +## 2.0.22(2021-08-09) + +## 2.0.21(2021-07-28) + +## 2.0.2(2021-07-28) +2.0.2 新增延迟绘制。 +## 2.0.1(2021-07-26) +2.0.1 调整为uni_modules目录规范。 diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/bridge/bridge-weex.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/bridge/bridge-weex.js new file mode 100644 index 0000000..27086ec --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/bridge/bridge-weex.js @@ -0,0 +1,241 @@ +const isWeex = typeof WXEnvironment !== 'undefined'; +const isWeexIOS = isWeex && /ios/i.test(WXEnvironment.platform); +const isWeexAndroid = isWeex && !isWeexIOS; + +import GLmethod from '../context-webgl/GLmethod'; + +const GCanvasModule = + (typeof weex !== 'undefined' && weex.requireModule) ? (weex.requireModule('gcanvas')) : + (typeof __weex_require__ !== 'undefined') ? (__weex_require__('@weex-module/gcanvas')) : {}; + +let isDebugging = false; + +let isComboDisabled = false; + +const logCommand = (function () { + const methodQuery = []; + Object.keys(GLmethod).forEach(key => { + methodQuery[GLmethod[key]] = key; + }) + const queryMethod = (id) => { + return methodQuery[parseInt(id)] || 'NotFoundMethod'; + } + const logCommand = (id, cmds) => { + const mId = cmds.split(',')[0]; + const mName = queryMethod(mId); + console.log(`=== callNative - componentId:${id}; method: ${mName}; cmds: ${cmds}`); + } + return logCommand; +})(); + +function joinArray(arr, sep) { + let res = ''; + for (let i = 0; i < arr.length; i++) { + if (i !== 0) { + res += sep; + } + res += arr[i]; + } + return res; +} + +const commandsCache = {} + +const GBridge = { + + callEnable: (ref, configArray) => { + + commandsCache[ref] = []; + + return GCanvasModule.enable({ + componentId: ref, + config: configArray + }); + }, + + callEnableDebug: () => { + isDebugging = true; + }, + + callEnableDisableCombo: () => { + isComboDisabled = true; + }, + + callSetContextType: function (componentId, context_type) { + GCanvasModule.setContextType(context_type, componentId); + }, + + callReset: function(id){ + GCanvasModule.resetComponent && canvasModule.resetComponent(componentId); + }, + + render: isWeexIOS ? function (componentId) { + return GCanvasModule.extendCallNative({ + contextId: componentId, + type: 0x60000001 + }); + } : function (componentId) { + return callGCanvasLinkNative(componentId, 0x60000001, 'render'); + }, + + render2d: isWeexIOS ? function (componentId, commands, callback) { + + if (isDebugging) { + console.log('>>> >>> render2d ==='); + console.log('>>> commands: ' + commands); + } + + GCanvasModule.render([commands, callback?true:false], componentId, callback); + + } : function (componentId, commands,callback) { + + if (isDebugging) { + console.log('>>> >>> render2d ==='); + console.log('>>> commands: ' + commands); + } + + callGCanvasLinkNative(componentId, 0x20000001, commands); + if(callback){ + callback(); + } + }, + + callExtendCallNative: isWeexIOS ? function (componentId, cmdArgs) { + + throw 'should not be here anymore ' + cmdArgs; + + } : function (componentId, cmdArgs) { + + throw 'should not be here anymore ' + cmdArgs; + + }, + + + flushNative: isWeexIOS ? function (componentId) { + + const cmdArgs = joinArray(commandsCache[componentId], ';'); + commandsCache[componentId] = []; + + if (isDebugging) { + console.log('>>> >>> flush native ==='); + console.log('>>> commands: ' + cmdArgs); + } + + const result = GCanvasModule.extendCallNative({ + "contextId": componentId, + "type": 0x60000000, + "args": cmdArgs + }); + + const res = result && result.result; + + if (isDebugging) { + console.log('>>> result: ' + res); + } + + return res; + + } : function (componentId) { + + const cmdArgs = joinArray(commandsCache[componentId], ';'); + commandsCache[componentId] = []; + + if (isDebugging) { + console.log('>>> >>> flush native ==='); + console.log('>>> commands: ' + cmdArgs); + } + + const result = callGCanvasLinkNative(componentId, 0x60000000, cmdArgs); + + if (isDebugging) { + console.log('>>> result: ' + result); + } + + return result; + }, + + callNative: function (componentId, cmdArgs, cache) { + + if (isDebugging) { + logCommand(componentId, cmdArgs); + } + + commandsCache[componentId].push(cmdArgs); + + if (!cache || isComboDisabled) { + return GBridge.flushNative(componentId); + } else { + return undefined; + } + }, + + texImage2D(componentId, ...args) { + if (isWeexIOS) { + if (args.length === 6) { + const [target, level, internalformat, format, type, image] = args; + GBridge.callNative( + componentId, + GLmethod.texImage2D + ',' + 6 + ',' + target + ',' + level + ',' + internalformat + ',' + format + ',' + type + ',' + image.src + ) + } else if (args.length === 9) { + const [target, level, internalformat, width, height, border, format, type, image] = args; + GBridge.callNative( + componentId, + GLmethod.texImage2D + ',' + 9 + ',' + target + ',' + level + ',' + internalformat + ',' + width + ',' + height + ',' + border + ',' + + + format + ',' + type + ',' + (image ? image.src : 0) + ) + } + } else if (isWeexAndroid) { + if (args.length === 6) { + const [target, level, internalformat, format, type, image] = args; + GCanvasModule.texImage2D(componentId, target, level, internalformat, format, type, image.src); + } else if (args.length === 9) { + const [target, level, internalformat, width, height, border, format, type, image] = args; + GCanvasModule.texImage2D(componentId, target, level, internalformat, width, height, border, format, type, (image ? image.src : 0)); + } + } + }, + + texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image) { + if (isWeexIOS) { + if (arguments.length === 8) { + GBridge.callNative( + componentId, + GLmethod.texSubImage2D + ',' + 6 + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset, + ',' + format + ',' + type + ',' + image.src + ) + } + } else if (isWeexAndroid) { + GCanvasModule.texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image.src); + } + }, + + bindImageTexture(componentId, src, imageId) { + GCanvasModule.bindImageTexture([src, imageId], componentId); + }, + + perloadImage([url, id], callback) { + GCanvasModule.preLoadImage([url, id], function (image) { + image.url = url; + image.id = id; + callback(image); + }); + }, + + measureText(text, fontStyle, componentId) { + return GCanvasModule.measureText([text, fontStyle], componentId); + }, + + getImageData (componentId, x, y, w, h, callback) { + GCanvasModule.getImageData([x, y,w,h],componentId,callback); + }, + + putImageData (componentId, data, x, y, w, h, callback) { + GCanvasModule.putImageData([x, y,w,h,data],componentId,callback); + }, + + toTempFilePath(componentId, x, y, width, height, destWidth, destHeight, fileType, quality, callback){ + GCanvasModule.toTempFilePath([x, y, width,height, destWidth, destHeight, fileType, quality], componentId, callback); + } +} + +export default GBridge; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleLinearGradient.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleLinearGradient.js new file mode 100644 index 0000000..3e7f03a --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleLinearGradient.js @@ -0,0 +1,18 @@ +class FillStyleLinearGradient { + + constructor(x0, y0, x1, y1) { + this._start_pos = { _x: x0, _y: y0 }; + this._end_pos = { _x: x1, _y: y1 }; + this._stop_count = 0; + this._stops = [0, 0, 0, 0, 0]; + } + + addColorStop = function (pos, color) { + if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) { + this._stops[this._stop_count] = { _pos: pos, _color: color }; + this._stop_count++; + } + } +} + +export default FillStyleLinearGradient; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStylePattern.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStylePattern.js new file mode 100644 index 0000000..6e4f646 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStylePattern.js @@ -0,0 +1,8 @@ +class FillStylePattern { + constructor(img, pattern) { + this._style = pattern; + this._img = img; + } +} + +export default FillStylePattern; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleRadialGradient.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleRadialGradient.js new file mode 100644 index 0000000..7790596 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/FillStyleRadialGradient.js @@ -0,0 +1,17 @@ +class FillStyleRadialGradient { + constructor(x0, y0, r0, x1, y1, r1) { + this._start_pos = { _x: x0, _y: y0, _r: r0 }; + this._end_pos = { _x: x1, _y: y1, _r: r1 }; + this._stop_count = 0; + this._stops = [0, 0, 0, 0, 0]; + } + + addColorStop(pos, color) { + if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) { + this._stops[this._stop_count] = { _pos: pos, _color: color }; + this._stop_count++; + } + } +} + +export default FillStyleRadialGradient; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/RenderingContext.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/RenderingContext.js new file mode 100644 index 0000000..e6b8f48 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-2d/RenderingContext.js @@ -0,0 +1,666 @@ +import FillStylePattern from './FillStylePattern'; +import FillStyleLinearGradient from './FillStyleLinearGradient'; +import FillStyleRadialGradient from './FillStyleRadialGradient'; +import GImage from '../env/image.js'; +import { + ArrayBufferToBase64, + Base64ToUint8ClampedArray +} from '../env/tool.js'; + +export default class CanvasRenderingContext2D { + + _drawCommands = ''; + + _globalAlpha = 1.0; + + _fillStyle = 'rgb(0,0,0)'; + _strokeStyle = 'rgb(0,0,0)'; + + _lineWidth = 1; + _lineCap = 'butt'; + _lineJoin = 'miter'; + + _miterLimit = 10; + + _globalCompositeOperation = 'source-over'; + + _textAlign = 'start'; + _textBaseline = 'alphabetic'; + + _font = '10px sans-serif'; + + _savedGlobalAlpha = []; + + timer = null; + componentId = null; + + _notCommitDrawImageCache = []; + _needRedrawImageCache = []; + _redrawCommands = ''; + _autoSaveContext = true; + // _imageMap = new GHashMap(); + // _textureMap = new GHashMap(); + + constructor() { + this.className = 'CanvasRenderingContext2D'; + //this.save() + } + + setFillStyle(value) { + this.fillStyle = value; + } + + set fillStyle(value) { + this._fillStyle = value; + + if (typeof(value) == 'string') { + this._drawCommands = this._drawCommands.concat("F" + value + ";"); + } else if (value instanceof FillStylePattern) { + const image = value._img; + if (!image.complete) { + image.onload = () => { + var index = this._needRedrawImageCache.indexOf(image); + if (index > -1) { + this._needRedrawImageCache.splice(index, 1); + CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id); + this._redrawflush(true); + } + } + this._notCommitDrawImageCache.push(image); + } else { + CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id); + } + + //CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id); + this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";"); + } else if (value instanceof FillStyleLinearGradient) { + var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + + value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + + value._stop_count; + for (var i = 0; i < value._stop_count; ++i) { + command += ("," + value._stops[i]._pos + "," + value._stops[i]._color); + } + this._drawCommands = this._drawCommands.concat(command + ";"); + } else if (value instanceof FillStyleRadialGradient) { + var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r + .toFixed(2) + "," + + value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + value._end_pos._r.toFixed(2) + "," + + value._stop_count; + for (var i = 0; i < value._stop_count; ++i) { + command += ("," + value._stops[i]._pos + "," + value._stops[i]._color); + } + this._drawCommands = this._drawCommands.concat(command + ";"); + } + } + + get fillStyle() { + return this._fillStyle; + } + + get globalAlpha() { + return this._globalAlpha; + } + + setGlobalAlpha(value) { + this.globalAlpha = value; + } + + set globalAlpha(value) { + this._globalAlpha = value; + this._drawCommands = this._drawCommands.concat("a" + value.toFixed(2) + ";"); + } + + + get strokeStyle() { + return this._strokeStyle; + } + + setStrokeStyle(value) { + this.strokeStyle = value; + } + + set strokeStyle(value) { + + this._strokeStyle = value; + + if (typeof(value) == 'string') { + this._drawCommands = this._drawCommands.concat("S" + value + ";"); + } else if (value instanceof FillStylePattern) { + CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id); + this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";"); + } else if (value instanceof FillStyleLinearGradient) { + var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + + value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + + value._stop_count; + + for (var i = 0; i < value._stop_count; ++i) { + command += ("," + value._stops[i]._pos + "," + value._stops[i]._color); + } + this._drawCommands = this._drawCommands.concat(command + ";"); + } else if (value instanceof FillStyleRadialGradient) { + var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r + .toFixed(2) + "," + + value._end_pos._x.toFixed(2) + "," + value._end_pos._y + ",".toFixed(2) + value._end_pos._r.toFixed(2) + "," + + value._stop_count; + + for (var i = 0; i < value._stop_count; ++i) { + command += ("," + value._stops[i]._pos + "," + value._stops[i]._color); + } + this._drawCommands = this._drawCommands.concat(command + ";"); + } + } + + get lineWidth() { + return this._lineWidth; + } + + setLineWidth(value) { + this.lineWidth = value; + } + + set lineWidth(value) { + this._lineWidth = value; + this._drawCommands = this._drawCommands.concat("W" + value + ";"); + } + + get lineCap() { + return this._lineCap; + } + + setLineCap(value) { + this.lineCap = value; + } + + set lineCap(value) { + this._lineCap = value; + this._drawCommands = this._drawCommands.concat("C" + value + ";"); + } + + get lineJoin() { + return this._lineJoin; + } + + setLineJoin(value) { + this.lineJoin = value + } + + set lineJoin(value) { + this._lineJoin = value; + this._drawCommands = this._drawCommands.concat("J" + value + ";"); + } + + get miterLimit() { + return this._miterLimit; + } + + setMiterLimit(value) { + this.miterLimit = value + } + + set miterLimit(value) { + this._miterLimit = value; + this._drawCommands = this._drawCommands.concat("M" + value + ";"); + } + + get globalCompositeOperation() { + return this._globalCompositeOperation; + } + + set globalCompositeOperation(value) { + + this._globalCompositeOperation = value; + let mode = 0; + switch (value) { + case "source-over": + mode = 0; + break; + case "source-atop": + mode = 5; + break; + case "source-in": + mode = 0; + break; + case "source-out": + mode = 2; + break; + case "destination-over": + mode = 4; + break; + case "destination-atop": + mode = 4; + break; + case "destination-in": + mode = 4; + break; + case "destination-out": + mode = 3; + break; + case "lighter": + mode = 1; + break; + case "copy": + mode = 2; + break; + case "xor": + mode = 6; + break; + default: + mode = 0; + } + + this._drawCommands = this._drawCommands.concat("B" + mode + ";"); + } + + get textAlign() { + return this._textAlign; + } + + setTextAlign(value) { + this.textAlign = value + } + + set textAlign(value) { + + this._textAlign = value; + let Align = 0; + switch (value) { + case "start": + Align = 0; + break; + case "end": + Align = 1; + break; + case "left": + Align = 2; + break; + case "center": + Align = 3; + break; + case "right": + Align = 4; + break; + default: + Align = 0; + } + + this._drawCommands = this._drawCommands.concat("A" + Align + ";"); + } + + get textBaseline() { + return this._textBaseline; + } + + setTextBaseline(value) { + this.textBaseline = value + } + + set textBaseline(value) { + this._textBaseline = value; + let baseline = 0; + switch (value) { + case "alphabetic": + baseline = 0; + break; + case "middle": + baseline = 1; + break; + case "top": + baseline = 2; + break; + case "hanging": + baseline = 3; + break; + case "bottom": + baseline = 4; + break; + case "ideographic": + baseline = 5; + break; + default: + baseline = 0; + break; + } + + this._drawCommands = this._drawCommands.concat("E" + baseline + ";"); + } + + get font() { + return this._font; + } + + setFontSize(size) { + var str = this._font; + var strs = str.trim().split(/\s+/); + for (var i = 0; i < strs.length; i++) { + var values = ["normal", "italic", "oblique", "normal", "small-caps", "normal", "bold", + "bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900", + "normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed", + "semi-expanded", "expanded", "extra-expanded", "ultra-expanded" + ]; + + if (-1 == values.indexOf(strs[i].trim())) { + if (typeof size === 'string') { + strs[i] = size; + } else if (typeof size === 'number') { + strs[i] = String(size) + 'px'; + } + break; + } + } + this.font = strs.join(" "); + } + + set font(value) { + this._font = value; + this._drawCommands = this._drawCommands.concat("j" + value + ";"); + } + + setTransform(a, b, c, d, tx, ty) { + this._drawCommands = this._drawCommands.concat("t" + + (a === 1 ? "1" : a.toFixed(2)) + "," + + (b === 0 ? "0" : b.toFixed(2)) + "," + + (c === 0 ? "0" : c.toFixed(2)) + "," + + (d === 1 ? "1" : d.toFixed(2)) + "," + tx.toFixed(2) + "," + ty.toFixed(2) + ";"); + } + + transform(a, b, c, d, tx, ty) { + this._drawCommands = this._drawCommands.concat("f" + + (a === 1 ? "1" : a.toFixed(2)) + "," + + (b === 0 ? "0" : b.toFixed(2)) + "," + + (c === 0 ? "0" : c.toFixed(2)) + "," + + (d === 1 ? "1" : d.toFixed(2)) + "," + tx + "," + ty + ";"); + } + + resetTransform() { + this._drawCommands = this._drawCommands.concat("m;"); + } + + scale(a, d) { + this._drawCommands = this._drawCommands.concat("k" + a.toFixed(2) + "," + + d.toFixed(2) + ";"); + } + + rotate(angle) { + this._drawCommands = this._drawCommands + .concat("r" + angle.toFixed(6) + ";"); + } + + translate(tx, ty) { + this._drawCommands = this._drawCommands.concat("l" + tx.toFixed(2) + "," + ty.toFixed(2) + ";"); + } + + save() { + this._savedGlobalAlpha.push(this._globalAlpha); + this._drawCommands = this._drawCommands.concat("v;"); + } + + restore() { + this._drawCommands = this._drawCommands.concat("e;"); + this._globalAlpha = this._savedGlobalAlpha.pop(); + } + + createPattern(img, pattern) { + if (typeof img === 'string') { + var imgObj = new GImage(); + imgObj.src = img; + img = imgObj; + } + return new FillStylePattern(img, pattern); + } + + createLinearGradient(x0, y0, x1, y1) { + return new FillStyleLinearGradient(x0, y0, x1, y1); + } + + createRadialGradient = function(x0, y0, r0, x1, y1, r1) { + return new FillStyleRadialGradient(x0, y0, r0, x1, y1, r1); + }; + + createCircularGradient = function(x0, y0, r0) { + return new FillStyleRadialGradient(x0, y0, 0, x0, y0, r0); + }; + + strokeRect(x, y, w, h) { + this._drawCommands = this._drawCommands.concat("s" + x + "," + y + "," + w + "," + h + ";"); + } + + + clearRect(x, y, w, h) { + this._drawCommands = this._drawCommands.concat("c" + x + "," + y + "," + w + + "," + h + ";"); + } + + clip() { + this._drawCommands = this._drawCommands.concat("p;"); + } + + resetClip() { + this._drawCommands = this._drawCommands.concat("q;"); + } + + closePath() { + this._drawCommands = this._drawCommands.concat("o;"); + } + + moveTo(x, y) { + this._drawCommands = this._drawCommands.concat("g" + x.toFixed(2) + "," + y.toFixed(2) + ";"); + } + + lineTo(x, y) { + this._drawCommands = this._drawCommands.concat("i" + x.toFixed(2) + "," + y.toFixed(2) + ";"); + } + + quadraticCurveTo = function(cpx, cpy, x, y) { + this._drawCommands = this._drawCommands.concat("u" + cpx + "," + cpy + "," + x + "," + y + ";"); + } + + bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, ) { + this._drawCommands = this._drawCommands.concat( + "z" + cp1x.toFixed(2) + "," + cp1y.toFixed(2) + "," + cp2x.toFixed(2) + "," + cp2y.toFixed(2) + "," + + x.toFixed(2) + "," + y.toFixed(2) + ";"); + } + + arcTo(x1, y1, x2, y2, radius) { + this._drawCommands = this._drawCommands.concat("h" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + radius + ";"); + } + + beginPath() { + this._drawCommands = this._drawCommands.concat("b;"); + } + + + fillRect(x, y, w, h) { + this._drawCommands = this._drawCommands.concat("n" + x + "," + y + "," + w + + "," + h + ";"); + } + + rect(x, y, w, h) { + this._drawCommands = this._drawCommands.concat("w" + x + "," + y + "," + w + "," + h + ";"); + } + + fill() { + this._drawCommands = this._drawCommands.concat("L;"); + } + + stroke(path) { + this._drawCommands = this._drawCommands.concat("x;"); + } + + arc(x, y, radius, startAngle, endAngle, anticlockwise) { + + let ianticlockwise = 0; + if (anticlockwise) { + ianticlockwise = 1; + } + + this._drawCommands = this._drawCommands.concat( + "y" + x.toFixed(2) + "," + y.toFixed(2) + "," + + radius.toFixed(2) + "," + startAngle + "," + endAngle + "," + ianticlockwise + + ";" + ); + } + + fillText(text, x, y) { + let tmptext = text.replace(/!/g, "!!"); + tmptext = tmptext.replace(/,/g, "!,"); + tmptext = tmptext.replace(/;/g, "!;"); + this._drawCommands = this._drawCommands.concat("T" + tmptext + "," + x + "," + y + ",0.0;"); + } + + strokeText = function(text, x, y) { + let tmptext = text.replace(/!/g, "!!"); + tmptext = tmptext.replace(/,/g, "!,"); + tmptext = tmptext.replace(/;/g, "!;"); + this._drawCommands = this._drawCommands.concat("U" + tmptext + "," + x + "," + y + ",0.0;"); + } + + measureText(text) { + return CanvasRenderingContext2D.GBridge.measureText(text, this.font, this.componentId); + } + + isPointInPath = function(x, y) { + throw new Error('GCanvas not supported yet'); + } + + drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) { + if (typeof image === 'string') { + var imgObj = new GImage(); + imgObj.src = image; + image = imgObj; + } + if (image instanceof GImage) { + if (!image.complete) { + imgObj.onload = () => { + var index = this._needRedrawImageCache.indexOf(image); + if (index > -1) { + this._needRedrawImageCache.splice(index, 1); + CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id); + this._redrawflush(true); + } + } + this._notCommitDrawImageCache.push(image); + } else { + CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id); + } + var srcArgs = [image, sx, sy, sw, sh, dx, dy, dw, dh]; + var args = []; + for (var arg in srcArgs) { + if (typeof(srcArgs[arg]) != 'undefined') { + args.push(srcArgs[arg]); + } + } + this.__drawImage.apply(this, args); + //this.__drawImage(image,sx, sy, sw, sh, dx, dy, dw, dh); + } + } + + __drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) { + const numArgs = arguments.length; + + function drawImageCommands() { + + if (numArgs === 3) { + const x = parseFloat(sx) || 0.0; + const y = parseFloat(sy) || 0.0; + + return ("d" + image._id + ",0,0," + + image.width + "," + image.height + "," + + x + "," + y + "," + image.width + "," + image.height + ";"); + } else if (numArgs === 5) { + const x = parseFloat(sx) || 0.0; + const y = parseFloat(sy) || 0.0; + const width = parseInt(sw) || image.width; + const height = parseInt(sh) || image.height; + + return ("d" + image._id + ",0,0," + + image.width + "," + image.height + "," + + x + "," + y + "," + width + "," + height + ";"); + } else if (numArgs === 9) { + sx = parseFloat(sx) || 0.0; + sy = parseFloat(sy) || 0.0; + sw = parseInt(sw) || image.width; + sh = parseInt(sh) || image.height; + dx = parseFloat(dx) || 0.0; + dy = parseFloat(dy) || 0.0; + dw = parseInt(dw) || image.width; + dh = parseInt(dh) || image.height; + + return ("d" + image._id + "," + + sx + "," + sy + "," + sw + "," + sh + "," + + dx + "," + dy + "," + dw + "," + dh + ";"); + } + } + this._drawCommands += drawImageCommands(); + } + + _flush(reserve, callback) { + const commands = this._drawCommands; + this._drawCommands = ''; + CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback); + this._needRender = false; + } + + _redrawflush(reserve, callback) { + const commands = this._redrawCommands; + CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback); + if (this._needRedrawImageCache.length == 0) { + this._redrawCommands = ''; + } + } + + draw(reserve, callback) { + if (!reserve) { + this._globalAlpha = this._savedGlobalAlpha.pop(); + this._savedGlobalAlpha.push(this._globalAlpha); + this._redrawCommands = this._drawCommands; + this._needRedrawImageCache = this._notCommitDrawImageCache; + if (this._autoSaveContext) { + this._drawCommands = ("v;" + this._drawCommands); + this._autoSaveContext = false; + } else { + this._drawCommands = ("e;X;v;" + this._drawCommands); + } + } else { + this._needRedrawImageCache = this._needRedrawImageCache.concat(this._notCommitDrawImageCache); + this._redrawCommands += this._drawCommands; + if (this._autoSaveContext) { + this._drawCommands = ("v;" + this._drawCommands); + this._autoSaveContext = false; + } + } + this._notCommitDrawImageCache = []; + if (this._flush) { + this._flush(reserve, callback); + } + } + + getImageData(x, y, w, h, callback) { + CanvasRenderingContext2D.GBridge.getImageData(this.componentId, x, y, w, h, function(res) { + res.data = Base64ToUint8ClampedArray(res.data); + if (typeof(callback) == 'function') { + callback(res); + } + }); + } + + putImageData(data, x, y, w, h, callback) { + if (data instanceof Uint8ClampedArray) { + data = ArrayBufferToBase64(data); + CanvasRenderingContext2D.GBridge.putImageData(this.componentId, data, x, y, w, h, function(res) { + if (typeof(callback) == 'function') { + callback(res); + } + }); + } + } + + toTempFilePath(x, y, width, height, destWidth, destHeight, fileType, quality, callback) { + CanvasRenderingContext2D.GBridge.toTempFilePath(this.componentId, x, y, width, height, destWidth, destHeight, + fileType, quality, + function(res) { + if (typeof(callback) == 'function') { + callback(res); + } + }); + } +} diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ActiveInfo.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ActiveInfo.js new file mode 100644 index 0000000..b495129 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ActiveInfo.js @@ -0,0 +1,11 @@ +export default class WebGLActiveInfo { + className = 'WebGLActiveInfo'; + + constructor({ + type, name, size + }) { + this.type = type; + this.name = name; + this.size = size; + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Buffer.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Buffer.js new file mode 100644 index 0000000..4800f67 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Buffer.js @@ -0,0 +1,21 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLBuffer'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLBuffer { + className = name; + + constructor(id) { + this.id = id; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Framebuffer.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Framebuffer.js new file mode 100644 index 0000000..28b46d3 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Framebuffer.js @@ -0,0 +1,21 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLFrameBuffer'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLFramebuffer { + className = name; + + constructor(id) { + this.id = id; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLenum.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLenum.js new file mode 100644 index 0000000..ac5544d --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLenum.js @@ -0,0 +1,298 @@ +export default { + "DEPTH_BUFFER_BIT": 256, + "STENCIL_BUFFER_BIT": 1024, + "COLOR_BUFFER_BIT": 16384, + "POINTS": 0, + "LINES": 1, + "LINE_LOOP": 2, + "LINE_STRIP": 3, + "TRIANGLES": 4, + "TRIANGLE_STRIP": 5, + "TRIANGLE_FAN": 6, + "ZERO": 0, + "ONE": 1, + "SRC_COLOR": 768, + "ONE_MINUS_SRC_COLOR": 769, + "SRC_ALPHA": 770, + "ONE_MINUS_SRC_ALPHA": 771, + "DST_ALPHA": 772, + "ONE_MINUS_DST_ALPHA": 773, + "DST_COLOR": 774, + "ONE_MINUS_DST_COLOR": 775, + "SRC_ALPHA_SATURATE": 776, + "FUNC_ADD": 32774, + "BLEND_EQUATION": 32777, + "BLEND_EQUATION_RGB": 32777, + "BLEND_EQUATION_ALPHA": 34877, + "FUNC_SUBTRACT": 32778, + "FUNC_REVERSE_SUBTRACT": 32779, + "BLEND_DST_RGB": 32968, + "BLEND_SRC_RGB": 32969, + "BLEND_DST_ALPHA": 32970, + "BLEND_SRC_ALPHA": 32971, + "CONSTANT_COLOR": 32769, + "ONE_MINUS_CONSTANT_COLOR": 32770, + "CONSTANT_ALPHA": 32771, + "ONE_MINUS_CONSTANT_ALPHA": 32772, + "BLEND_COLOR": 32773, + "ARRAY_BUFFER": 34962, + "ELEMENT_ARRAY_BUFFER": 34963, + "ARRAY_BUFFER_BINDING": 34964, + "ELEMENT_ARRAY_BUFFER_BINDING": 34965, + "STREAM_DRAW": 35040, + "STATIC_DRAW": 35044, + "DYNAMIC_DRAW": 35048, + "BUFFER_SIZE": 34660, + "BUFFER_USAGE": 34661, + "CURRENT_VERTEX_ATTRIB": 34342, + "FRONT": 1028, + "BACK": 1029, + "FRONT_AND_BACK": 1032, + "TEXTURE_2D": 3553, + "CULL_FACE": 2884, + "BLEND": 3042, + "DITHER": 3024, + "STENCIL_TEST": 2960, + "DEPTH_TEST": 2929, + "SCISSOR_TEST": 3089, + "POLYGON_OFFSET_FILL": 32823, + "SAMPLE_ALPHA_TO_COVERAGE": 32926, + "SAMPLE_COVERAGE": 32928, + "NO_ERROR": 0, + "INVALID_ENUM": 1280, + "INVALID_VALUE": 1281, + "INVALID_OPERATION": 1282, + "OUT_OF_MEMORY": 1285, + "CW": 2304, + "CCW": 2305, + "LINE_WIDTH": 2849, + "ALIASED_POINT_SIZE_RANGE": 33901, + "ALIASED_LINE_WIDTH_RANGE": 33902, + "CULL_FACE_MODE": 2885, + "FRONT_FACE": 2886, + "DEPTH_RANGE": 2928, + "DEPTH_WRITEMASK": 2930, + "DEPTH_CLEAR_VALUE": 2931, + "DEPTH_FUNC": 2932, + "STENCIL_CLEAR_VALUE": 2961, + "STENCIL_FUNC": 2962, + "STENCIL_FAIL": 2964, + "STENCIL_PASS_DEPTH_FAIL": 2965, + "STENCIL_PASS_DEPTH_PASS": 2966, + "STENCIL_REF": 2967, + "STENCIL_VALUE_MASK": 2963, + "STENCIL_WRITEMASK": 2968, + "STENCIL_BACK_FUNC": 34816, + "STENCIL_BACK_FAIL": 34817, + "STENCIL_BACK_PASS_DEPTH_FAIL": 34818, + "STENCIL_BACK_PASS_DEPTH_PASS": 34819, + "STENCIL_BACK_REF": 36003, + "STENCIL_BACK_VALUE_MASK": 36004, + "STENCIL_BACK_WRITEMASK": 36005, + "VIEWPORT": 2978, + "SCISSOR_BOX": 3088, + "COLOR_CLEAR_VALUE": 3106, + "COLOR_WRITEMASK": 3107, + "UNPACK_ALIGNMENT": 3317, + "PACK_ALIGNMENT": 3333, + "MAX_TEXTURE_SIZE": 3379, + "MAX_VIEWPORT_DIMS": 3386, + "SUBPIXEL_BITS": 3408, + "RED_BITS": 3410, + "GREEN_BITS": 3411, + "BLUE_BITS": 3412, + "ALPHA_BITS": 3413, + "DEPTH_BITS": 3414, + "STENCIL_BITS": 3415, + "POLYGON_OFFSET_UNITS": 10752, + "POLYGON_OFFSET_FACTOR": 32824, + "TEXTURE_BINDING_2D": 32873, + "SAMPLE_BUFFERS": 32936, + "SAMPLES": 32937, + "SAMPLE_COVERAGE_VALUE": 32938, + "SAMPLE_COVERAGE_INVERT": 32939, + "COMPRESSED_TEXTURE_FORMATS": 34467, + "DONT_CARE": 4352, + "FASTEST": 4353, + "NICEST": 4354, + "GENERATE_MIPMAP_HINT": 33170, + "BYTE": 5120, + "UNSIGNED_BYTE": 5121, + "SHORT": 5122, + "UNSIGNED_SHORT": 5123, + "INT": 5124, + "UNSIGNED_INT": 5125, + "FLOAT": 5126, + "DEPTH_COMPONENT": 6402, + "ALPHA": 6406, + "RGB": 6407, + "RGBA": 6408, + "LUMINANCE": 6409, + "LUMINANCE_ALPHA": 6410, + "UNSIGNED_SHORT_4_4_4_4": 32819, + "UNSIGNED_SHORT_5_5_5_1": 32820, + "UNSIGNED_SHORT_5_6_5": 33635, + "FRAGMENT_SHADER": 35632, + "VERTEX_SHADER": 35633, + "MAX_VERTEX_ATTRIBS": 34921, + "MAX_VERTEX_UNIFORM_VECTORS": 36347, + "MAX_VARYING_VECTORS": 36348, + "MAX_COMBINED_TEXTURE_IMAGE_UNITS": 35661, + "MAX_VERTEX_TEXTURE_IMAGE_UNITS": 35660, + "MAX_TEXTURE_IMAGE_UNITS": 34930, + "MAX_FRAGMENT_UNIFORM_VECTORS": 36349, + "SHADER_TYPE": 35663, + "DELETE_STATUS": 35712, + "LINK_STATUS": 35714, + "VALIDATE_STATUS": 35715, + "ATTACHED_SHADERS": 35717, + "ACTIVE_UNIFORMS": 35718, + "ACTIVE_ATTRIBUTES": 35721, + "SHADING_LANGUAGE_VERSION": 35724, + "CURRENT_PROGRAM": 35725, + "NEVER": 512, + "LESS": 513, + "EQUAL": 514, + "LEQUAL": 515, + "GREATER": 516, + "NOTEQUAL": 517, + "GEQUAL": 518, + "ALWAYS": 519, + "KEEP": 7680, + "REPLACE": 7681, + "INCR": 7682, + "DECR": 7683, + "INVERT": 5386, + "INCR_WRAP": 34055, + "DECR_WRAP": 34056, + "VENDOR": 7936, + "RENDERER": 7937, + "VERSION": 7938, + "NEAREST": 9728, + "LINEAR": 9729, + "NEAREST_MIPMAP_NEAREST": 9984, + "LINEAR_MIPMAP_NEAREST": 9985, + "NEAREST_MIPMAP_LINEAR": 9986, + "LINEAR_MIPMAP_LINEAR": 9987, + "TEXTURE_MAG_FILTER": 10240, + "TEXTURE_MIN_FILTER": 10241, + "TEXTURE_WRAP_S": 10242, + "TEXTURE_WRAP_T": 10243, + "TEXTURE": 5890, + "TEXTURE_CUBE_MAP": 34067, + "TEXTURE_BINDING_CUBE_MAP": 34068, + "TEXTURE_CUBE_MAP_POSITIVE_X": 34069, + "TEXTURE_CUBE_MAP_NEGATIVE_X": 34070, + "TEXTURE_CUBE_MAP_POSITIVE_Y": 34071, + "TEXTURE_CUBE_MAP_NEGATIVE_Y": 34072, + "TEXTURE_CUBE_MAP_POSITIVE_Z": 34073, + "TEXTURE_CUBE_MAP_NEGATIVE_Z": 34074, + "MAX_CUBE_MAP_TEXTURE_SIZE": 34076, + "TEXTURE0": 33984, + "TEXTURE1": 33985, + "TEXTURE2": 33986, + "TEXTURE3": 33987, + "TEXTURE4": 33988, + "TEXTURE5": 33989, + "TEXTURE6": 33990, + "TEXTURE7": 33991, + "TEXTURE8": 33992, + "TEXTURE9": 33993, + "TEXTURE10": 33994, + "TEXTURE11": 33995, + "TEXTURE12": 33996, + "TEXTURE13": 33997, + "TEXTURE14": 33998, + "TEXTURE15": 33999, + "TEXTURE16": 34000, + "TEXTURE17": 34001, + "TEXTURE18": 34002, + "TEXTURE19": 34003, + "TEXTURE20": 34004, + "TEXTURE21": 34005, + "TEXTURE22": 34006, + "TEXTURE23": 34007, + "TEXTURE24": 34008, + "TEXTURE25": 34009, + "TEXTURE26": 34010, + "TEXTURE27": 34011, + "TEXTURE28": 34012, + "TEXTURE29": 34013, + "TEXTURE30": 34014, + "TEXTURE31": 34015, + "ACTIVE_TEXTURE": 34016, + "REPEAT": 10497, + "CLAMP_TO_EDGE": 33071, + "MIRRORED_REPEAT": 33648, + "FLOAT_VEC2": 35664, + "FLOAT_VEC3": 35665, + "FLOAT_VEC4": 35666, + "INT_VEC2": 35667, + "INT_VEC3": 35668, + "INT_VEC4": 35669, + "BOOL": 35670, + "BOOL_VEC2": 35671, + "BOOL_VEC3": 35672, + "BOOL_VEC4": 35673, + "FLOAT_MAT2": 35674, + "FLOAT_MAT3": 35675, + "FLOAT_MAT4": 35676, + "SAMPLER_2D": 35678, + "SAMPLER_CUBE": 35680, + "VERTEX_ATTRIB_ARRAY_ENABLED": 34338, + "VERTEX_ATTRIB_ARRAY_SIZE": 34339, + "VERTEX_ATTRIB_ARRAY_STRIDE": 34340, + "VERTEX_ATTRIB_ARRAY_TYPE": 34341, + "VERTEX_ATTRIB_ARRAY_NORMALIZED": 34922, + "VERTEX_ATTRIB_ARRAY_POINTER": 34373, + "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": 34975, + "IMPLEMENTATION_COLOR_READ_TYPE": 35738, + "IMPLEMENTATION_COLOR_READ_FORMAT": 35739, + "COMPILE_STATUS": 35713, + "LOW_FLOAT": 36336, + "MEDIUM_FLOAT": 36337, + "HIGH_FLOAT": 36338, + "LOW_INT": 36339, + "MEDIUM_INT": 36340, + "HIGH_INT": 36341, + "FRAMEBUFFER": 36160, + "RENDERBUFFER": 36161, + "RGBA4": 32854, + "RGB5_A1": 32855, + "RGB565": 36194, + "DEPTH_COMPONENT16": 33189, + "STENCIL_INDEX8": 36168, + "DEPTH_STENCIL": 34041, + "RENDERBUFFER_WIDTH": 36162, + "RENDERBUFFER_HEIGHT": 36163, + "RENDERBUFFER_INTERNAL_FORMAT": 36164, + "RENDERBUFFER_RED_SIZE": 36176, + "RENDERBUFFER_GREEN_SIZE": 36177, + "RENDERBUFFER_BLUE_SIZE": 36178, + "RENDERBUFFER_ALPHA_SIZE": 36179, + "RENDERBUFFER_DEPTH_SIZE": 36180, + "RENDERBUFFER_STENCIL_SIZE": 36181, + "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": 36048, + "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": 36049, + "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": 36050, + "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": 36051, + "COLOR_ATTACHMENT0": 36064, + "DEPTH_ATTACHMENT": 36096, + "STENCIL_ATTACHMENT": 36128, + "DEPTH_STENCIL_ATTACHMENT": 33306, + "NONE": 0, + "FRAMEBUFFER_COMPLETE": 36053, + "FRAMEBUFFER_INCOMPLETE_ATTACHMENT": 36054, + "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": 36055, + "FRAMEBUFFER_INCOMPLETE_DIMENSIONS": 36057, + "FRAMEBUFFER_UNSUPPORTED": 36061, + "FRAMEBUFFER_BINDING": 36006, + "RENDERBUFFER_BINDING": 36007, + "MAX_RENDERBUFFER_SIZE": 34024, + "INVALID_FRAMEBUFFER_OPERATION": 1286, + "UNPACK_FLIP_Y_WEBGL": 37440, + "UNPACK_PREMULTIPLY_ALPHA_WEBGL": 37441, + "CONTEXT_LOST_WEBGL": 37442, + "UNPACK_COLORSPACE_CONVERSION_WEBGL": 37443, + "BROWSER_DEFAULT_WEBGL": 37444 +}; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLmethod.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLmethod.js new file mode 100644 index 0000000..f2659be --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLmethod.js @@ -0,0 +1,142 @@ +let i = 1; + +const GLmethod = {}; + +GLmethod.activeTexture = i++; //1 +GLmethod.attachShader = i++; +GLmethod.bindAttribLocation = i++; +GLmethod.bindBuffer = i++; +GLmethod.bindFramebuffer = i++; +GLmethod.bindRenderbuffer = i++; +GLmethod.bindTexture = i++; +GLmethod.blendColor = i++; +GLmethod.blendEquation = i++; +GLmethod.blendEquationSeparate = i++; //10 +GLmethod.blendFunc = i++; +GLmethod.blendFuncSeparate = i++; +GLmethod.bufferData = i++; +GLmethod.bufferSubData = i++; +GLmethod.checkFramebufferStatus = i++; +GLmethod.clear = i++; +GLmethod.clearColor = i++; +GLmethod.clearDepth = i++; +GLmethod.clearStencil = i++; +GLmethod.colorMask = i++; //20 +GLmethod.compileShader = i++; +GLmethod.compressedTexImage2D = i++; +GLmethod.compressedTexSubImage2D = i++; +GLmethod.copyTexImage2D = i++; +GLmethod.copyTexSubImage2D = i++; +GLmethod.createBuffer = i++; +GLmethod.createFramebuffer = i++; +GLmethod.createProgram = i++; +GLmethod.createRenderbuffer = i++; +GLmethod.createShader = i++; //30 +GLmethod.createTexture = i++; +GLmethod.cullFace = i++; +GLmethod.deleteBuffer = i++; +GLmethod.deleteFramebuffer = i++; +GLmethod.deleteProgram = i++; +GLmethod.deleteRenderbuffer = i++; +GLmethod.deleteShader = i++; +GLmethod.deleteTexture = i++; +GLmethod.depthFunc = i++; +GLmethod.depthMask = i++; //40 +GLmethod.depthRange = i++; +GLmethod.detachShader = i++; +GLmethod.disable = i++; +GLmethod.disableVertexAttribArray = i++; +GLmethod.drawArrays = i++; +GLmethod.drawArraysInstancedANGLE = i++; +GLmethod.drawElements = i++; +GLmethod.drawElementsInstancedANGLE = i++; +GLmethod.enable = i++; +GLmethod.enableVertexAttribArray = i++; //50 +GLmethod.flush = i++; +GLmethod.framebufferRenderbuffer = i++; +GLmethod.framebufferTexture2D = i++; +GLmethod.frontFace = i++; +GLmethod.generateMipmap = i++; +GLmethod.getActiveAttrib = i++; +GLmethod.getActiveUniform = i++; +GLmethod.getAttachedShaders = i++; +GLmethod.getAttribLocation = i++; +GLmethod.getBufferParameter = i++; //60 +GLmethod.getContextAttributes = i++; +GLmethod.getError = i++; +GLmethod.getExtension = i++; +GLmethod.getFramebufferAttachmentParameter = i++; +GLmethod.getParameter = i++; +GLmethod.getProgramInfoLog = i++; +GLmethod.getProgramParameter = i++; +GLmethod.getRenderbufferParameter = i++; +GLmethod.getShaderInfoLog = i++; +GLmethod.getShaderParameter = i++; //70 +GLmethod.getShaderPrecisionFormat = i++; +GLmethod.getShaderSource = i++; +GLmethod.getSupportedExtensions = i++; +GLmethod.getTexParameter = i++; +GLmethod.getUniform = i++; +GLmethod.getUniformLocation = i++; +GLmethod.getVertexAttrib = i++; +GLmethod.getVertexAttribOffset = i++; +GLmethod.isBuffer = i++; +GLmethod.isContextLost = i++; //80 +GLmethod.isEnabled = i++; +GLmethod.isFramebuffer = i++; +GLmethod.isProgram = i++; +GLmethod.isRenderbuffer = i++; +GLmethod.isShader = i++; +GLmethod.isTexture = i++; +GLmethod.lineWidth = i++; +GLmethod.linkProgram = i++; +GLmethod.pixelStorei = i++; +GLmethod.polygonOffset = i++; //90 +GLmethod.readPixels = i++; +GLmethod.renderbufferStorage = i++; +GLmethod.sampleCoverage = i++; +GLmethod.scissor = i++; +GLmethod.shaderSource = i++; +GLmethod.stencilFunc = i++; +GLmethod.stencilFuncSeparate = i++; +GLmethod.stencilMask = i++; +GLmethod.stencilMaskSeparate = i++; +GLmethod.stencilOp = i++; //100 +GLmethod.stencilOpSeparate = i++; +GLmethod.texImage2D = i++; +GLmethod.texParameterf = i++; +GLmethod.texParameteri = i++; +GLmethod.texSubImage2D = i++; +GLmethod.uniform1f = i++; +GLmethod.uniform1fv = i++; +GLmethod.uniform1i = i++; +GLmethod.uniform1iv = i++; +GLmethod.uniform2f = i++; //110 +GLmethod.uniform2fv = i++; +GLmethod.uniform2i = i++; +GLmethod.uniform2iv = i++; +GLmethod.uniform3f = i++; +GLmethod.uniform3fv = i++; +GLmethod.uniform3i = i++; +GLmethod.uniform3iv = i++; +GLmethod.uniform4f = i++; +GLmethod.uniform4fv = i++; +GLmethod.uniform4i = i++; //120 +GLmethod.uniform4iv = i++; +GLmethod.uniformMatrix2fv = i++; +GLmethod.uniformMatrix3fv = i++; +GLmethod.uniformMatrix4fv = i++; +GLmethod.useProgram = i++; +GLmethod.validateProgram = i++; +GLmethod.vertexAttrib1f = i++; //new +GLmethod.vertexAttrib2f = i++; //new +GLmethod.vertexAttrib3f = i++; //new +GLmethod.vertexAttrib4f = i++; //new //130 +GLmethod.vertexAttrib1fv = i++; //new +GLmethod.vertexAttrib2fv = i++; //new +GLmethod.vertexAttrib3fv = i++; //new +GLmethod.vertexAttrib4fv = i++; //new +GLmethod.vertexAttribPointer = i++; +GLmethod.viewport = i++; + +export default GLmethod; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLtype.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLtype.js new file mode 100644 index 0000000..695abcb --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/GLtype.js @@ -0,0 +1,23 @@ +const GLtype = {}; + +[ + "GLbitfield", + "GLboolean", + "GLbyte", + "GLclampf", + "GLenum", + "GLfloat", + "GLint", + "GLintptr", + "GLsizei", + "GLsizeiptr", + "GLshort", + "GLubyte", + "GLuint", + "GLushort" +].sort().map((typeName, i) => GLtype[typeName] = 1 >> (i + 1)); + +export default GLtype; + + + diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Program.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Program.js new file mode 100644 index 0000000..6f5691c --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Program.js @@ -0,0 +1,21 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLProgram'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLProgram { + className = name; + + constructor(id) { + this.id = id; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Renderbuffer.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Renderbuffer.js new file mode 100644 index 0000000..d3182ae --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Renderbuffer.js @@ -0,0 +1,21 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLRenderBuffer'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLRenderbuffer { + className = name; + + constructor(id) { + this.id = id; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/RenderingContext.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/RenderingContext.js new file mode 100644 index 0000000..5f9608f --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/RenderingContext.js @@ -0,0 +1,1191 @@ +import GLenum from './GLenum'; +import ActiveInfo from './ActiveInfo'; +import Buffer from './Buffer'; +import Framebuffer from './Framebuffer'; +import Renderbuffer from './Renderbuffer'; +import Texture from './Texture'; +import Program from './Program'; +import Shader from './Shader'; +import ShaderPrecisionFormat from './ShaderPrecisionFormat'; +import UniformLocation from './UniformLocation'; +import GLmethod from './GLmethod'; + +const processArray = (array, checkArrayType = false) => { + + function joinArray(arr, sep) { + let res = ''; + for (let i = 0; i < arr.length; i++) { + if (i !== 0) { + res += sep; + } + res += arr[i]; + } + return res; + } + + let type = 'Float32Array'; + if (checkArrayType) { + if (array instanceof Uint8Array) { + type = 'Uint8Array' + } else if (array instanceof Uint16Array) { + type = 'Uint16Array'; + } else if (array instanceof Uint32Array) { + type = 'Uint32Array'; + } else if (array instanceof Float32Array) { + type = 'Float32Array'; + } else { + throw new Error('Check array type failed. Array type is ' + typeof array); + } + } + + const ArrayTypes = { + Uint8Array: 1, + Uint16Array: 2, + Uint32Array: 4, + Float32Array: 14 + }; + return ArrayTypes[type] + ',' + btoa(joinArray(array, ',')) +} + +export default class WebGLRenderingContext { + + // static GBridge = null; + + className = 'WebGLRenderingContext'; + + constructor(canvas, type, attrs) { + this._canvas = canvas; + this._type = type; + this._version = 'WebGL 1.0'; + this._attrs = attrs; + this._map = new Map(); + + Object.keys(GLenum) + .forEach(name => Object.defineProperty(this, name, { + value: GLenum[name] + })); + } + + get canvas() { + return this._canvas; + } + + activeTexture = function (textureUnit) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.activeTexture + ',' + textureUnit, + true + ); + } + + attachShader = function (progarm, shader) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.attachShader + ',' + progarm.id + ',' + shader.id, + true + ); + } + + bindAttribLocation = function (program, index, name) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bindAttribLocation + ',' + program.id + ',' + index + ',' + name, + true + ) + } + + bindBuffer = function (target, buffer) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bindBuffer + ',' + target + ',' + (buffer ? buffer.id : 0), + true + ); + } + + bindFramebuffer = function (target, framebuffer) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bindFramebuffer + ',' + target + ',' + (framebuffer ? framebuffer.id : 0), + true + ) + } + + bindRenderbuffer = function (target, renderBuffer) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bindRenderbuffer + ',' + target + ',' + (renderBuffer ? renderBuffer.id : 0), + true + ) + } + + bindTexture = function (target, texture) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bindTexture + ',' + target + ',' + (texture ? texture.id : 0), + true + ) + } + + blendColor = function (r, g, b, a) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.blendColor + ',' + target + ',' + r + ',' + g + ',' + b + ',' + a, + true + ) + } + + blendEquation = function (mode) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.blendEquation + ',' + mode, + true + ) + } + + blendEquationSeparate = function (modeRGB, modeAlpha) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.blendEquationSeparate + ',' + modeRGB + ',' + modeAlpha, + true + ) + } + + + blendFunc = function (sfactor, dfactor) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.blendFunc + ',' + sfactor + ',' + dfactor, + true + ); + } + + blendFuncSeparate = function (srcRGB, dstRGB, srcAlpha, dstAlpha) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.blendFuncSeparate + ',' + srcRGB + ',' + dstRGB + ',' + srcAlpha + ',' + dstAlpha, + true + ); + } + + bufferData = function (target, data, usage) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bufferData + ',' + target + ',' + processArray(data, true) + ',' + usage, + true + ) + } + + bufferSubData = function (target, offset, data) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.bufferSubData + ',' + target + ',' + offset + ',' + processArray(data, true), + true + ) + } + + checkFramebufferStatus = function (target) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.checkFramebufferStatus + ',' + target + ); + return Number(result); + } + + clear = function (mask) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.clear + ',' + mask + ); + this._canvas._needRender = true; + } + + clearColor = function (r, g, b, a) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.clearColor + ',' + r + ',' + g + ',' + b, + true + ) + } + + clearDepth = function (depth) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.clearDepth + ',' + depth, + true + ) + } + + clearStencil = function (s) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.clearStencil + ',' + s + ); + } + + colorMask = function (r, g, b, a) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.colorMask + ',' + r + ',' + g + ',' + b + ',' + a + ) + } + + compileShader = function (shader) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.compileShader + ',' + shader.id, + true + ) + } + + compressedTexImage2D = function (target, level, internalformat, width, height, border, pixels) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.compressedTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + + width + ',' + height + ',' + border + ',' + processArray(pixels), + true + ) + } + + compressedTexSubImage2D = function (target, level, xoffset, yoffset, width, height, format, pixels) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.compressedTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + + width + ',' + height + ',' + format + ',' + processArray(pixels), + true + ) + } + + + copyTexImage2D = function (target, level, internalformat, x, y, width, height, border) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.copyTexImage2D + ',' + target + ',' + level + ',' + internalformat + ',' + x + ',' + y + ',' + + width + ',' + height + ',' + border, + true + ); + } + + copyTexSubImage2D = function (target, level, xoffset, yoffset, x, y, width, height) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.copyTexSubImage2D + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset + ',' + x + ',' + y + ',' + + width + ',' + height + ); + } + + createBuffer = function () { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.createBuffer + '' + ); + const buffer = new Buffer(result); + this._map.set(buffer.uuid(), buffer); + return buffer; + } + + createFramebuffer = function () { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.createFramebuffer + '' + ); + const framebuffer = new Framebuffer(result); + this._map.set(framebuffer.uuid(), framebuffer); + return framebuffer; + } + + + createProgram = function () { + const id = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.createProgram + '' + ); + const program = new Program(id); + this._map.set(program.uuid(), program); + return program; + } + + createRenderbuffer = function () { + const id = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.createRenderbuffer + '' + ) + const renderBuffer = new Renderbuffer(id); + this._map.set(renderBuffer.uuid(), renderBuffer); + return renderBuffer; + } + + createShader = function (type) { + const id = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.createShader + ',' + type + ) + const shader = new Shader(id, type); + this._map.set(shader.uuid(), shader); + return shader; + } + + createTexture = function () { + const id = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.createTexture + '' + ); + const texture = new Texture(id); + this._map.set(texture.uuid(), texture); + return texture; + } + + cullFace = function (mode) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.cullFace + ',' + mode, + true + ) + } + + + deleteBuffer = function (buffer) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.deleteBuffer + ',' + buffer.id, + true + ) + } + + deleteFramebuffer = function (framebuffer) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.deleteFramebuffer + ',' + framebuffer.id, + true + ) + } + + deleteProgram = function (program) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.deleteProgram + ',' + program.id, + true + ) + } + + deleteRenderbuffer = function (renderbuffer) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.deleteRenderbuffer + ',' + renderbuffer.id, + true + ) + } + + deleteShader = function (shader) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.deleteShader + ',' + shader.id, + true + ) + } + + deleteTexture = function (texture) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.deleteTexture + ',' + texture.id, + true + ) + } + + depthFunc = function (func) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.depthFunc + ',' + func + ) + } + + depthMask = function (flag) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.depthMask + ',' + Number(flag), + true + ) + } + + depthRange = function (zNear, zFar) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.depthRange + ',' + zNear + ',' + zFar, + true + ) + } + + detachShader = function (program, shader) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.detachShader + ',' + program.id + ',' + shader.id, + true + ) + } + + disable = function (cap) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.disable + ',' + cap, + true + ) + } + + disableVertexAttribArray = function (index) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.disableVertexAttribArray + ',' + index, + true + ); + } + + drawArrays = function (mode, first, count) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.drawArrays + ',' + mode + ',' + first + ',' + count + ) + this._canvas._needRender = true; + } + + drawElements = function (mode, count, type, offset) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.drawElements + ',' + mode + ',' + count + ',' + type + ',' + offset + ';' + ); + this._canvas._needRender = true; + } + + enable = function (cap) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.enable + ',' + cap, + true + ); + } + + enableVertexAttribArray = function (index) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.enableVertexAttribArray + ',' + index, + true + ) + } + + + flush = function () { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.flush + '' + ) + } + + framebufferRenderbuffer = function (target, attachment, textarget, texture, level) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.framebufferRenderbuffer + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level, + true + ) + } + + framebufferTexture2D = function (target, attachment, textarget, texture, level) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.framebufferTexture2D + ',' + target + ',' + attachment + ',' + textarget + ',' + (texture ? texture.id : 0) + ',' + level, + true + ) + } + + frontFace = function (mode) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.frontFace + ',' + mode, + true + ) + } + + generateMipmap = function (target) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.generateMipmap + ',' + target, + true + ) + } + + getActiveAttrib = function (progarm, index) { + const resultString = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getActiveAttrib + ',' + progarm.id + ',' + index + ) + const [type, size, name] = resultString.split(','); + return new ActiveInfo({ + type: Number(type), + size: Number(size), + name + }); + } + + getActiveUniform = function (progarm, index) { + const resultString = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getActiveUniform + ',' + progarm.id + ',' + index + ); + const [type, size, name] = resultString.split(','); + return new ActiveInfo({ + type: Number(type), + size: Number(size), + name + }) + } + + getAttachedShaders = function (progarm) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getAttachedShaders + ',' + progarm.id + ); + const [type, ...ids] = result; + return ids.map(id => this._map.get(Shader.uuid(id))); + } + + getAttribLocation = function (progarm, name) { + return WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getAttribLocation + ',' + progarm.id + ',' + name + ) + } + + getBufferParameter = function (target, pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getBufferParameter + ',' + target + ',' + pname + ); + const [type, res] = getBufferParameter; + return res; + } + + getError = function () { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getError + '' + ) + return result; + } + + getExtension = function (name) { + return null; + } + + getFramebufferAttachmentParameter = function (target, attachment, pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getFramebufferAttachmentParameter + ',' + target + ',' + attachment + ',' + pname + ) + switch (pname) { + case GLenum.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: + return this._map.get(Renderbuffer.uuid(result)) || this._map.get(Texture.uuid(result)) || null; + default: + return result; + } + } + + getParameter = function (pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getParameter + ',' + pname + ) + switch (pname) { + case GLenum.VERSION: + return this._version; + case GLenum.ARRAY_BUFFER_BINDING: // buffer + case GLenum.ELEMENT_ARRAY_BUFFER_BINDING: // buffer + return this._map.get(Buffer.uuid(result)) || null; + case GLenum.CURRENT_PROGRAM: // program + return this._map.get(Program.uuid(result)) || null; + case GLenum.FRAMEBUFFER_BINDING: // framebuffer + return this._map.get(Framebuffer.uuid(result)) || null; + case GLenum.RENDERBUFFER_BINDING: // renderbuffer + return this._map.get(Renderbuffer.uuid(result)) || null; + case GLenum.TEXTURE_BINDING_2D: // texture + case GLenum.TEXTURE_BINDING_CUBE_MAP: // texture + return this._map.get(Texture.uuid(result)) || null; + case GLenum.ALIASED_LINE_WIDTH_RANGE: // Float32Array + case GLenum.ALIASED_POINT_SIZE_RANGE: // Float32Array + case GLenum.BLEND_COLOR: // Float32Array + case GLenum.COLOR_CLEAR_VALUE: // Float32Array + case GLenum.DEPTH_RANGE: // Float32Array + case GLenum.MAX_VIEWPORT_DIMS: // Int32Array + case GLenum.SCISSOR_BOX: // Int32Array + case GLenum.VIEWPORT: // Int32Array + case GLenum.COMPRESSED_TEXTURE_FORMATS: // Uint32Array + default: + const [type, ...res] = result.split(','); + if (res.length === 1) { + return Number(res[0]); + } else { + return res.map(Number); + } + } + } + + getProgramInfoLog = function (progarm) { + return WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getProgramInfoLog + ',' + progarm.id + ) + } + + getProgramParameter = function (program, pname) { + const res = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getProgramParameter + ',' + program.id + ',' + pname + ); + + const [type, result] = res.split(',').map(i => parseInt(i)); + + if (type === 1) { + return Boolean(result); + } else if (type === 2) { + return result; + } else { + throw new Error('Unrecongized program paramater ' + res + ', type: ' + typeof res); + } + } + + + getRenderbufferParameter = function (target, pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getRenderbufferParameter + ',' + target + ',' + pname + ) + return result; + } + + + getShaderInfoLog = function (shader) { + return WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getShaderInfoLog + ',' + shader.id + ); + } + + getShaderParameter = function (shader, pname) { + return WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getShaderParameter + ',' + shader.id + ',' + pname + ) + } + + getShaderPrecisionFormat = function (shaderType, precisionType) { + const [rangeMin, rangeMax, precision] = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getShaderPrecisionFormat + ',' + shaderType + ',' + precisionType + ); + const shaderPrecisionFormat = new ShaderPrecisionFormat({ + rangeMin: Number(rangeMin), + rangeMax: Number(rangeMax), + precision: Number(precision) + }); + return shaderPrecisionFormat; + } + + getShaderSource = function (shader) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getShaderSource + ',' + shader.id + ); + return result; + } + + getSupportedExtensions = function () { + return Object.keys({}); + } + + getTexParameter = function (target, pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getTexParameter + ',' + target + ',' + pname + ) + return result; + } + + getUniformLocation = function (program, name) { + const id = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getUniformLocation + ',' + program.id + ',' + name + ); + if (id === -1) { + return null; + } else { + return new UniformLocation(Number(id)); + } + } + + getVertexAttrib = function (index, pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getVertexAttrib + ',' + index + ',' + pname + ); + switch (pname) { + case GLenum.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING: + return this._map.get(Buffer.uuid(result)) || null; + case GLenum.CURRENT_VERTEX_ATTRIB: // Float32Array + default: + return result; + } + } + + getVertexAttribOffset = function (index, pname) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.getVertexAttribOffset + ',' + index + ',' + pname + ) + return Number(result); + } + + isBuffer = function (buffer) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isBuffer + ',' + buffer.id + ) + return Boolean(result); + } + + isContextLost = function () { + return false; + } + + isEnabled = function (cap) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isEnabled + ',' + cap + ) + return Boolean(result); + } + + isFramebuffer = function (framebuffer) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isFramebuffer + ',' + framebuffer.id + ) + return Boolean(result); + } + + isProgram = function (program) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isProgram + ',' + program.id + ) + return Boolean(result); + } + + isRenderbuffer = function (renderBuffer) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isRenderbuffer + ',' + renderbuffer.id + ) + return Boolean(result); + } + + isShader = function (shader) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isShader + ',' + shader.id + ) + return Boolean(result); + } + + isTexture = function (texture) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.isTexture + ',' + texture.id + ); + return Boolean(result); + } + + lineWidth = function (width) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.lineWidth + ',' + width, + true + ) + } + + linkProgram = function (program) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.linkProgram + ',' + program.id, + true + ); + } + + + pixelStorei = function (pname, param) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.pixelStorei + ',' + pname + ',' + Number(param) + ) + } + + polygonOffset = function (factor, units) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.polygonOffset + ',' + factor + ',' + units + ) + } + + readPixels = function (x, y, width, height, format, type, pixels) { + const result = WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.readPixels + ',' + x + ',' + y + ',' + width + ',' + height + ',' + format + ',' + type + ) + return result; + } + + renderbufferStorage = function (target, internalFormat, width, height) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.renderbufferStorage + ',' + target + ',' + internalFormat + ',' + width + ',' + height, + true + ) + } + + sampleCoverage = function (value, invert) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.sampleCoverage + ',' + value + ',' + Number(invert), + true + ) + } + + scissor = function (x, y, width, height) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.scissor + ',' + x + ',' + y + ',' + width + ',' + height, + true + ) + } + + shaderSource = function (shader, source) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.shaderSource + ',' + shader.id + ',' + source + ) + } + + stencilFunc = function (func, ref, mask) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.stencilFunc + ',' + func + ',' + ref + ',' + mask, + true + ) + } + + stencilFuncSeparate = function (face, func, ref, mask) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.stencilFuncSeparate + ',' + face + ',' + func + ',' + ref + ',' + mask, + true + ) + } + + stencilMask = function (mask) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.stencilMask + ',' + mask, + true + ) + } + + stencilMaskSeparate = function (face, mask) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.stencilMaskSeparate + ',' + face + ',' + mask, + true + ) + } + + stencilOp = function (fail, zfail, zpass) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.stencilOp + ',' + fail + ',' + zfail + ',' + zpass + ) + } + + stencilOpSeparate = function (face, fail, zfail, zpass) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.stencilOp + ',' + face + ',' + fail + ',' + zfail + ',' + zpass, + true + ) + } + + texImage2D = function (...args) { + WebGLRenderingContext.GBridge.texImage2D(this._canvas.id, ...args); + } + + + texParameterf = function (target, pname, param) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.texParameterf + ',' + target + ',' + pname + ',' + param, + true + ) + } + + texParameteri = function (target, pname, param) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.texParameteri + ',' + target + ',' + pname + ',' + param + ) + } + + texSubImage2D = function (...args) { + WebGLRenderingContext.GBridge.texSubImage2D(this._canvas.id, ...args); + } + + uniform1f = function (location, v0) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform1f + ',' + location.id + ',' + v0 + ) + } + + uniform1fv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform1fv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform1i = function (location, v0) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform1i + ',' + location.id + ',' + v0, + // true + ) + } + + uniform1iv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform1iv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform2f = function (location, v0, v1) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform2f + ',' + location.id + ',' + v0 + ',' + v1, + true + ) + } + + uniform2fv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform2fv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform2i = function (location, v0, v1) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform2i + ',' + location.id + ',' + v0 + ',' + v1, + true + ) + } + + uniform2iv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform2iv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform3f = function (location, v0, v1, v2) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform3f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2, + true + ) + } + + uniform3fv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform3fv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform3i = function (location, v0, v1, v2) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform3i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2, + true + ) + } + + uniform3iv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform3iv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform4f = function (location, v0, v1, v2, v3) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform4f + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3, + true + ) + } + + uniform4fv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform4fv + ',' + location.id + ',' + processArray(value), + true + ) + } + + uniform4i = function (location, v0, v1, v2, v3) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform4i + ',' + location.id + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3, + true + ) + } + + uniform4iv = function (location, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniform4iv + ',' + location.id + ',' + processArray(value, true), + true + ) + } + + uniformMatrix2fv = function (location, transpose, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniformMatrix2fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value), + true + ) + } + + uniformMatrix3fv = function (location, transpose, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniformMatrix3fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value), + true + ) + } + + uniformMatrix4fv = function (location, transpose, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.uniformMatrix4fv + ',' + location.id + ',' + Number(transpose) + ',' + processArray(value), + true + ); + } + + useProgram = function (progarm) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.useProgram + ',' + progarm.id + '', + true + ) + } + + + validateProgram = function (program) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.validateProgram + ',' + program.id, + true + ) + } + + vertexAttrib1f = function (index, v0) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib1f + ',' + index + ',' + v0, + true + ) + } + + vertexAttrib2f = function (index, v0, v1) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib2f + ',' + index + ',' + v0 + ',' + v1, + true + ) + } + + vertexAttrib3f = function (index, v0, v1, v2) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib3f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2, + true + ) + } + + vertexAttrib4f = function (index, v0, v1, v2, v3) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib4f + ',' + index + ',' + v0 + ',' + v1 + ',' + v2 + ',' + v3, + true + ) + } + + vertexAttrib1fv = function (index, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib1fv + ',' + index + ',' + processArray(value), + true + ) + } + + vertexAttrib2fv = function (index, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib2fv + ',' + index + ',' + processArray(value), + true + ) + } + + vertexAttrib3fv = function (index, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib3fv + ',' + index + ',' + processArray(value), + true + ) + } + + vertexAttrib4fv = function (index, value) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttrib4fv + ',' + index + ',' + processArray(value), + true + ) + } + + vertexAttribPointer = function (index, size, type, normalized, stride, offset) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.vertexAttribPointer + ',' + index + ',' + size + ',' + type + ',' + Number(normalized) + ',' + stride + ',' + offset, + true + ) + } + + viewport = function (x, y, width, height) { + WebGLRenderingContext.GBridge.callNative( + this._canvas.id, + GLmethod.viewport + ',' + x + ',' + y + ',' + width + ',' + height, + true + ) + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Shader.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Shader.js new file mode 100644 index 0000000..a763886 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Shader.js @@ -0,0 +1,22 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLShader'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLShader { + className = name; + + constructor(id, type) { + this.id = id; + this.type = type; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ShaderPrecisionFormat.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ShaderPrecisionFormat.js new file mode 100644 index 0000000..208d6c1 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/ShaderPrecisionFormat.js @@ -0,0 +1,11 @@ +export default class WebGLShaderPrecisionFormat { + className = 'WebGLShaderPrecisionFormat'; + + constructor({ + rangeMin, rangeMax, precision + }) { + this.rangeMin = rangeMin; + this.rangeMax = rangeMax; + this.precision = precision; + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Texture.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Texture.js new file mode 100644 index 0000000..de4d806 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/Texture.js @@ -0,0 +1,22 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLTexture'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLTexture { + className = name; + + constructor(id, type) { + this.id = id; + this.type = type; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/UniformLocation.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/UniformLocation.js new file mode 100644 index 0000000..f5e99dc --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/UniformLocation.js @@ -0,0 +1,22 @@ +import {getTransferedObjectUUID} from './classUtils'; + +const name = 'WebGLUniformLocation'; + +function uuid(id) { + return getTransferedObjectUUID(name, id); +} + +export default class WebGLUniformLocation { + className = name; + + constructor(id, type) { + this.id = id; + this.type = type; + } + + static uuid = uuid; + + uuid() { + return uuid(this.id); + } +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/classUtils.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/classUtils.js new file mode 100644 index 0000000..88716be --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/context-webgl/classUtils.js @@ -0,0 +1,3 @@ +export function getTransferedObjectUUID(name, id) { + return `${name.toLowerCase()}-${id}`; +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/canvas.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/canvas.js new file mode 100644 index 0000000..a8d9bb9 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/canvas.js @@ -0,0 +1,74 @@ +import GContext2D from '../context-2d/RenderingContext'; +import GContextWebGL from '../context-webgl/RenderingContext'; + +export default class GCanvas { + + // static GBridge = null; + + id = null; + + _needRender = true; + + constructor(id, { disableAutoSwap }) { + this.id = id; + + this._disableAutoSwap = disableAutoSwap; + if (disableAutoSwap) { + this._swapBuffers = () => { + GCanvas.GBridge.render(this.id); + } + } + } + + getContext(type) { + + let context = null; + + if (type.match(/webgl/i)) { + context = new GContextWebGL(this); + + context.componentId = this.id; + + if (!this._disableAutoSwap) { + const render = () => { + if (this._needRender) { + GCanvas.GBridge.render(this.id); + this._needRender = false; + } + } + setInterval(render, 16); + } + + GCanvas.GBridge.callSetContextType(this.id, 1); // 0 for 2d; 1 for webgl + } else if (type.match(/2d/i)) { + context = new GContext2D(this); + + context.componentId = this.id; + +// const render = ( callback ) => { +// +// const commands = context._drawCommands; +// context._drawCommands = ''; +// +// GCanvas.GBridge.render2d(this.id, commands, callback); +// this._needRender = false; +// } +// //draw方法触发 +// context._flush = render; +// //setInterval(render, 16); + + GCanvas.GBridge.callSetContextType(this.id, 0); + } else { + throw new Error('not supported context ' + type); + } + + return context; + + } + + reset() { + GCanvas.GBridge.callReset(this.id); + } + + +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/image.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/image.js new file mode 100644 index 0000000..9499a51 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/image.js @@ -0,0 +1,96 @@ +let incId = 1; + +const noop = function () { }; + +class GImage { + + static GBridge = null; + + constructor() { + this._id = incId++; + this._width = 0; + this._height = 0; + this._src = undefined; + this._onload = noop; + this._onerror = noop; + this.complete = false; + } + + get width() { + return this._width; + } + set width(v) { + this._width = v; + } + + get height() { + return this._height; + } + + set height(v) { + this._height = v; + } + + get src() { + return this._src; + } + + set src(v) { + + if (v.startsWith('//')) { + v = 'http:' + v; + } + + this._src = v; + + GImage.GBridge.perloadImage([this._src, this._id], (data) => { + if (typeof data === 'string') { + data = JSON.parse(data); + } + if (data.error) { + var evt = { type: 'error', target: this }; + this.onerror(evt); + } else { + this.complete = true; + this.width = typeof data.width === 'number' ? data.width : 0; + this.height = typeof data.height === 'number' ? data.height : 0; + var evt = { type: 'load', target: this }; + this.onload(evt); + } + }); + } + + addEventListener(name, listener) { + if (name === 'load') { + this.onload = listener; + } else if (name === 'error') { + this.onerror = listener; + } + } + + removeEventListener(name, listener) { + if (name === 'load') { + this.onload = noop; + } else if (name === 'error') { + this.onerror = noop; + } + } + + get onload() { + return this._onload; + } + + set onload(v) { + this._onload = v; + } + + get onerror() { + return this._onerror; + } + + set onerror(v) { + this._onerror = v; + } +} + +export default GImage; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/tool.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/tool.js new file mode 100644 index 0000000..d3fb398 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/env/tool.js @@ -0,0 +1,24 @@ + +export function ArrayBufferToBase64 (buffer) { + var binary = ''; + var bytes = new Uint8ClampedArray(buffer); + for (var len = bytes.byteLength, i = 0; i < len; i++) { + binary += String.fromCharCode(bytes[i]); + } + return btoa(binary); +} + +export function Base64ToUint8ClampedArray(base64String) { + const padding = '='.repeat((4 - base64String.length % 4) % 4); + const base64 = (base64String + padding) + .replace(/\-/g, '+') + .replace(/_/g, '/'); + + const rawData = atob(base64); + const outputArray = new Uint8ClampedArray(rawData.length); + + for (let i = 0; i < rawData.length; ++i) { + outputArray[i] = rawData.charCodeAt(i); + } + return outputArray; +} \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/index.js b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/index.js new file mode 100644 index 0000000..a34ad58 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/gcanvas/index.js @@ -0,0 +1,39 @@ +import GCanvas from './env/canvas'; +import GImage from './env/image'; + +import GWebGLRenderingContext from './context-webgl/RenderingContext'; +import GContext2D from './context-2d/RenderingContext'; + +import GBridgeWeex from './bridge/bridge-weex'; + +export let Image = GImage; + +export let WeexBridge = GBridgeWeex; + +export function enable(el, { bridge, debug, disableAutoSwap, disableComboCommands } = {}) { + + const GBridge = GImage.GBridge = GCanvas.GBridge = GWebGLRenderingContext.GBridge = GContext2D.GBridge = bridge; + + GBridge.callEnable(el.ref, [ + 0, // renderMode: 0--RENDERMODE_WHEN_DIRTY, 1--RENDERMODE_CONTINUOUSLY + -1, // hybridLayerType: 0--LAYER_TYPE_NONE 1--LAYER_TYPE_SOFTWARE 2--LAYER_TYPE_HARDWARE + false, // supportScroll + false, // newCanvasMode + 1, // compatible + 'white',// clearColor + false // sameLevel: newCanvasMode = true && true => GCanvasView and Webview is same level + ]); + + if (debug === true) { + GBridge.callEnableDebug(); + } + if (disableComboCommands) { + GBridge.callEnableDisableCombo(); + } + + var canvas = new GCanvas(el.ref, { disableAutoSwap }); + canvas.width = el.style.width; + canvas.height = el.style.height; + + return canvas; +}; \ No newline at end of file diff --git a/uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue b/uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue new file mode 100644 index 0000000..d9e7ad2 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/components/u-qrcode/u-qrcode.vue @@ -0,0 +1,684 @@ + + + + + + diff --git a/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/license.md b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/license.md new file mode 100644 index 0000000..261eeb9 --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/license.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/module.js b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/module.js new file mode 100644 index 0000000..a3cbfca --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/module.js @@ -0,0 +1,2285 @@ +//--------------------------------------------------------------------- +// uQRCode 二维码生成插件 v3.2.2 +// +// uQRCode 是一款使用方式简单,高扩展的二维码生成插件。支持全端生成,支持canvas的地方就可以使用uQRCode。 +// +// Copyright (c) Sansnn uQRCode All rights reserved. +// Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// 复制使用请保留本段注释,感谢支持开源! +// +// 开源地址: +// https://github.com/Sansnn/uQRCode +// +// uni-app插件市场地址: +// https://ext.dcloud.net.cn/plugin?id=1287 +//--------------------------------------------------------------------- + +"use strict"; + +function uQRCode(options, canvasContext, loadImage) { + this.options = uQRCode.getOptions(options); + this.canvasContext = uQRCode.getCanvasContext(canvasContext); + this.loadImage = uQRCode.getLoadImage(loadImage); +} + +(function() { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + + //--------------------------------------------------------------------- + // QR8bitByte + //--------------------------------------------------------------------- + + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + } + + QR8bitByte.prototype = { + + getLength: function(buffer) { + return this.data.length; + }, + + write: function(buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } + }; + + //--------------------------------------------------------------------- + // QRCode + //--------------------------------------------------------------------- + + function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); + } + + QRCode.prototype = { + + addData: function(data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark: function(row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount: function() { + return this.moduleCount; + }, + + make: function() { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1) { + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) + break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern()); + }, + + makeImpl: function(test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null; //(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern: function(row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern: function() { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip: function(target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern: function() { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = (c % 2 == 0); + } + }, + + setupPositionAdjustPattern: function() { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 || + (r == 0 && c == 0)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber: function(test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo: function(test, maskPattern) { + + var data = (this.errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = (!test); + + }, + + mapData: function(data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = (((data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + + } + + }; + + QRCode.PAD0 = 0xEC; + QRCode.PAD1 = 0x11; + + QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + + buffer.getLengthInBits() + + ">" + + totalDataCount * 8 + + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); + } + + QRCode.createBytes = function(buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0; + } + + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; + + } + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 + }; + + //--------------------------------------------------------------------- + // QRErrorCorrectLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 + }; + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 + }; + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var QRUtil = { + + PATTERN_POSITION_TABLE: [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + + G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + + getBCHTypeInfo: function(data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15))); + } + return ((data << 10) | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber: function(data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18))); + } + return (data << 12) | d; + }, + + getBCHDigit: function(data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition: function(typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask: function(maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000: + return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001: + return i % 2 == 0; + case QRMaskPattern.PATTERN010: + return j % 3 == 0; + case QRMaskPattern.PATTERN011: + return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100: + return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; + case QRMaskPattern.PATTERN101: + return (i * j) % 2 + (i * j) % 3 == 0; + case QRMaskPattern.PATTERN110: + return ((i * j) % 2 + (i * j) % 3) % 2 == 0; + case QRMaskPattern.PATTERN111: + return ((i * j) % 3 + (i + j) % 2) % 2 == 0; + + default: + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial: function(errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); + } + + return a; + }, + + getLengthInBits: function(mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 10; + case QRMode.MODE_ALPHA_NUM: + return 9; + case QRMode.MODE_8BIT_BYTE: + return 8; + case QRMode.MODE_KANJI: + return 8; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 12; + case QRMode.MODE_ALPHA_NUM: + return 11; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 10; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 14; + case QRMode.MODE_ALPHA_NUM: + return 13; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 12; + default: + throw new Error("mode:" + mode); + } + + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint: function(qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c)) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col)) count++; + if (qrCode.isDark(row + 1, col)) count++; + if (qrCode.isDark(row, col + 1)) count++; + if (qrCode.isDark(row + 1, col + 1)) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row, col + 1) && + qrCode.isDark(row, col + 2) && + qrCode.isDark(row, col + 3) && + qrCode.isDark(row, col + 4) && + !qrCode.isDark(row, col + 5) && + qrCode.isDark(row, col + 6)) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row + 1, col) && + qrCode.isDark(row + 2, col) && + qrCode.isDark(row + 3, col) && + qrCode.isDark(row + 4, col) && + !qrCode.isDark(row + 5, col) && + qrCode.isDark(row + 6, col)) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col)) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + + }; + + + //--------------------------------------------------------------------- + // QRMath + //--------------------------------------------------------------------- + + var QRMath = { + + glog: function(n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp: function(n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE: new Array(256), + + LOG_TABLE: new Array(256) + + }; + + for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; + } + for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ + QRMath.EXP_TABLE[i - 5] ^ + QRMath.EXP_TABLE[i - 6] ^ + QRMath.EXP_TABLE[i - 8]; + } + for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; + } + + //--------------------------------------------------------------------- + // QRPolynomial + //--------------------------------------------------------------------- + + function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } + } + + QRPolynomial.prototype = { + + get: function(index) { + return this.num[index]; + }, + + getLength: function() { + return this.num.length; + }, + + multiply: function(e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); + } + } + + return new QRPolynomial(num, 0); + }, + + mod: function(e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); + + var num = new Array(this.getLength()); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } + }; + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; + } + + QRRSBlock.RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ]; + + QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount)); + } + } + + return list; + } + + QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) { + + switch (errorCorrectLevel) { + case QRErrorCorrectLevel.L: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default: + return undefined; + } + } + + //--------------------------------------------------------------------- + // QRBitBuffer + //--------------------------------------------------------------------- + + function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; + } + + QRBitBuffer.prototype = { + + get: function(index) { + var bufIndex = Math.floor(index / 8); + return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1; + }, + + put: function(num, length) { + for (var i = 0; i < length; i++) { + this.putBit(((num >>> (length - i - 1)) & 1) == 1); + } + }, + + getLengthInBits: function() { + return this.length; + }, + + putBit: function(bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= (0x80 >>> (this.length % 8)); + } + + this.length++; + } + }; + + //--------------------------------------------------------------------- + // Support Chinese 字符编码支持中文 + // 使用mode 4 8bit + //--------------------------------------------------------------------- + function utf16To8(text) { + var result = ''; + var c; + for (var i = 0; i < text.length; i++) { + c = text.charCodeAt(i); + if (c >= 0x0001 && c <= 0x007F) { + result += text.charAt(i); + } else if (c > 0x07FF) { + result += String.fromCharCode(0xE0 | c >> 12 & 0x0F); + result += String.fromCharCode(0x80 | c >> 6 & 0x3F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } else { + result += String.fromCharCode(0xC0 | c >> 6 & 0x1F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } + } + return result; + } + + /** + * 队列 + */ + class Queue { + constructor() { + let waitingQueue = []; + let isRunning = false; //记录是否有未完成的任务 + function execute(task, resolve, reject) { + task() + .then((data) => { + resolve(data); + }) + .catch((e) => { + reject(e); + }) + .finally(() => { + //等待任务队列中如果有任务,则触发它;否则设置isRunning = false,表示无任务状态 + if (waitingQueue.length) { + const next = waitingQueue.shift(); + execute(next.task, next.resolve, next.reject); + } else { + isRunning = false; + } + }); + } + return function(task) { + return new Promise((resolve, reject) => { + if (isRunning) { + waitingQueue.push({ + task, + resolve, + reject + }); + } else { + isRunning = true; + execute(task, resolve, reject); + } + }); + }; + } + } + // const queue = new Queue(); + // queue(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // resolve('task1'); + // }, 1000); + // })).then(data => console.log(data)); + // queue(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // resolve('task2'); + // }, 100); + // })).then(data => console.log(data)); + // queue(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // resolve('task3'); + // }, 300); + // })).then(data => console.log(data)); + + /** + * 纠错等级 + */ + uQRCode.errorCorrectLevel = QRErrorCorrectLevel; + + /** + * 预设默认值(基本,不包含各部分和艺术码参数) + */ + uQRCode.defaults = { + typeNumber: -1, // 版本,-1为自动计算,字符越多,版本越高 + errorCorrectLevel: QRErrorCorrectLevel.H, // 纠错等级 + text: '', // 二维码内容 + size: 354, // 大小 + useDynamicSize: false, // 使用动态尺寸,可以去掉方块小数点,绘制出来后没有白色细线 + margin: 0, // 边距 + background: { + color: '#FFFFFF' // 背景色 + }, + foreground: { + color: '#000000' // 前景色 + } + } + + /** + * 对象属性深度替换 + * @param {Object} o 原始对象/默认对象/被替换的对象 + * @param {Object} r 从这个对象里取值替换到o对象里 + * @return {Object} 替换后的新对象 + */ + uQRCode.deepReplace = function(o = {}, r = {}) { + let obj = { + ...o + } + for (let k in r) { + var vr = r[k]; + if (vr.constructor == Object) { + obj[k] = this.deepReplace(obj[k], vr); + } else if (vr.constructor == String && !vr) { + obj[k] = obj[k]; + } else { + obj[k] = vr; + } + } + return obj; + } + + /** + * 获取选项值 + */ + uQRCode.getOptions = function(options) { + options = uQRCode.deepReplace(uQRCode.defaults, options); + + /* 背景 */ + options.background = uQRCode.deepReplace({ + color: options.background.color, // 背景色 + image: { + src: '', + width: 1, // 图片宽 + height: 1, // 图片高 + align: ['center', 'center'], // 图片对齐方式水平,垂直 + anchor: [0, 0], // 图片位置,X坐标,Y坐标 + alpha: 1 // 透明度 + } + }, options.background); + /* 前景 */ + options.foreground = uQRCode.deepReplace({ + color: options.foreground.color, // 前景色 + image: { + src: '', + width: 1 / 4, // 图片宽 + height: 1 / 4, // 图片高 + align: ['center', 'center'], // 图片对齐方式水平,垂直 + anchor: [0, 0] // 图片位置,X坐标,Y坐标 + } + }, options.foreground); + /* 定位角 */ + options.positionDetection = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 定位角区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 定位角小块颜色,默认值跟随前景色 + }, options.positionDetection); + /* 分割图案 */ + options.separator = uQRCode.deepReplace({ + color: options.background.color // 分割区域颜色,默认值跟随背景色 + }, options.separator); + /* 对齐图案 */ + options.alignment = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 对齐区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 对齐小块颜色,默认值跟随前景色 + }, options.alignment); + /* 时序图案 */ + options.timing = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 时序区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 时序小块颜色,默认值跟随前景色 + }, options.timing); + /* 暗块 */ + options.darkBlock = uQRCode.deepReplace({ + color: options.foreground.color // 暗块颜色 + }, options.darkBlock); + /* 版本信息 */ + options.versionInformation = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 版本信息区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 版本信息小块颜色,默认值跟随前景色 + }, options.versionInformation); + + return options; + } + + /** + * 获取canvas实例 + */ + uQRCode.getCanvasContext = function(ctx) { + /* 兼容setFillStyle写法,主要在uni-app nvue gcanvas */ + ctx.setFillStyle = ctx.setFillStyle || function(color) { + ctx.fillStyle = color; + } + /* 兼容setFontSize写法,主要在微信小程序canvas2d */ + ctx.setFontSize = ctx.setFontSize || function(fontSize) { + ctx.font = `${fontSize}px`; + } + /* 兼容setTextAlign写法,主要在微信小程序canvas2d */ + ctx.setTextAlign = ctx.setTextAlign || function(align) { + ctx.textAlign = align; + } + /* 兼容setTextBaseline写法,主要在微信小程序canvas2d */ + ctx.setTextBaseline = ctx.setTextBaseline || function(textBaseline) { + ctx.textBaseline = textBaseline; + } + /* 若实例不包含draw方法则创建一个 */ + ctx.draw = ctx.draw || function(reserve, callback) { + callback && callback(); + } + return ctx; + } + + /* 队列实例,某些平台一起使用多个组件时需要通过队列逐一绘制,否则部分绘制方法异常,nvue端的iOS gcanvas尤其明显,在不通过队列绘制时会出现图片丢失的情况 */ + uQRCode.Queue = new Queue(); + uQRCode.QueueLoadImage = new Queue(); + + /* 缓存loadImage图片 */ + uQRCode.loadImageCache = []; + + /** + * 获取加载图片方法 + */ + uQRCode.getLoadImage = function(loadImage) { + if (typeof loadImage == 'function') { + return function(src) { + /* 解决iOS APP||NVUE同时绘制多个二维码导致图片丢失需使用队列 */ + return uQRCode.QueueLoadImage(() => new Promise((resolve, reject) => { + setTimeout(() => { + const cache = uQRCode.loadImageCache.find(x => x.src == src); + if (cache) { + resolve(cache.img); + } else { + loadImage(src).then(img => { + uQRCode.loadImageCache.push({ + src, + img + }); + resolve(img); + }); + } + }, 150); + })); + } + } else { + return function(src) { + return Promise.resolve(src); + } + } + } + + uQRCode.prototype = { + /** + * 实例化传入的选项值 + */ + options: {}, + + /** + * 画布实例 + */ + canvasContext: {}, + + /** + * 制作二维码全部数据 + */ + makeData: {}, + + /** + * 制作二维码主要模块数据,基于makeData的modules但数据格式不一致,这里的modules是定制过的 + */ + modules: [], + + /** + * 模块数量 + */ + moduleCount: 0, + + /** + * 获取制作二维码数据 + */ + getMakeData() { + let { + typeNumber, + errorCorrectLevel, + text + } = this.options; + var qrcode = new QRCode(typeNumber, errorCorrectLevel); + qrcode.addData(utf16To8(text.toString())); + qrcode.make(); + return qrcode; + }, + + /** + * 制作二维码方法 + */ + make() { + let makeData = this.makeData = this.getMakeData(); + this.modules = JSON.parse(JSON.stringify(makeData.modules)); + this.moduleCount = makeData.moduleCount; + this.options.typeNumber = makeData.typeNumber; + + /* 数据码 data */ + this.paintData(); + /* 定位图案 position detection */ + this.paintPositionDetection(); + /* 分隔图案 separator */ + this.paintSeparator(); + /* 对齐图案 alignment */ + this.paintAlignment(); + /* 时序图案 timing */ + this.paintTiming(); + /* 暗块 darkBlock */ + this.paintDarkBlock(); + /* 预留版本信息 version information */ + this.paintVersionInformation(); + }, + + paintData() { + let modules = this.modules; + let moduleCount = this.moduleCount; + let { + size, + margin, + background, + foreground, + useDynamicSize + } = this.options; + + /* dynamicSize自动计算出最适合绘制的尺寸,并按这个尺寸去绘制,可以解决canvas绘制小块间产生白线的问题(其实就是小数点精度问题),useDynamicSize=false可以取消这个设定 */ + // let dynamicSize = this.options.dynamicSize = Math.floor((size - margin * 2) / moduleCount) * moduleCount + margin * 2; // Math.floor向下取整缩放会模糊 + let dynamicSize = this.options.dynamicSize = Math.ceil((size - margin * 2) / moduleCount) * moduleCount + margin * 2; // Math.ceil向上取整缩放效果比floor清晰 + if (!useDynamicSize) { + dynamicSize = this.options.dynamicSize = size; + } + let tileSize = (dynamicSize - margin * 2) / moduleCount; + + for (var rowI = 0; rowI < modules.length; rowI++) { + for (var colI = 0; colI < modules.length; colI++) { + var tile = modules[rowI][colI]; + if (tile) { + modules[rowI][colI] = { + size: tileSize, + x: colI * tileSize + margin, + y: rowI * tileSize + margin, + type: ['foreground'], + color: foreground.color, + isBlack: true, + isDrawn: false + }; + } else { + modules[rowI][colI] = { + size: tileSize, + x: colI * tileSize + margin, + y: rowI * tileSize + margin, + type: ['background'], + color: background.color, + isBlack: false, + isDrawn: false + }; + } + } + } + }, + + paintPositionDetection() { + let modules = this.modules; + let size = this.moduleCount; + let { + positionDetection + } = this.options; + + //1) 定义基础图形索引(左上角)x ,y,v + let basePart = [ + [0, 0, 1], + [1, 0, 1], + [2, 0, 1], + [3, 0, 1], + [4, 0, 1], + [5, 0, 1], + [6, 0, 1], + [0, 1, 1], + [1, 1, 0], + [2, 1, 0], + [3, 1, 0], + [4, 1, 0], + [5, 1, 0], + [6, 1, 1], + [0, 2, 1], + [1, 2, 0], + [2, 2, 1], + [3, 2, 1], + [4, 2, 1], + [5, 2, 0], + [6, 2, 1], + [0, 3, 1], + [1, 3, 0], + [2, 3, 1], + [3, 3, 1], + [4, 3, 1], + [5, 3, 0], + [6, 3, 1], + [0, 4, 1], + [1, 4, 0], + [2, 4, 1], + [3, 4, 1], + [4, 4, 1], + [5, 4, 0], + [6, 4, 1], + [0, 5, 1], + [1, 5, 0], + [2, 5, 0], + [3, 5, 0], + [4, 5, 0], + [5, 5, 0], + [6, 5, 1], + [0, 6, 1], + [1, 6, 1], + [2, 6, 1], + [3, 6, 1], + [4, 6, 1], + [5, 6, 1], + [6, 6, 1] + ]; + let disc = size - 7; //size -7 + basePart.forEach(d => { + var ltItem = modules[d[0]][d[1]]; + var rtItem = modules[d[0] + disc][d[1]]; + var lbItem = modules[d[0]][d[1] + disc]; + lbItem.type.push('positionDetection'); + rtItem.type.push('positionDetection'); + ltItem.type.push('positionDetection'); + //绘制左上角 + ltItem.color = d[2] == 1 ? positionDetection.foregroundColor : positionDetection.backgroundColor; + //绘制右 + rtItem.color = d[2] == 1 ? positionDetection.foregroundColor : positionDetection.backgroundColor; + //绘制左 + lbItem.color = d[2] == 1 ? positionDetection.foregroundColor : positionDetection.backgroundColor; + }); + }, + + paintSeparator() { + let modules = this.modules; + let size = this.moduleCount; + let { + separator + } = this.options; + + //1) 定义基础图形索引(左上角) + [ + [7, 0], + [7, 1], + [7, 2], + [7, 3], + [7, 4], + [7, 5], + [7, 6], + [7, 7], + [0, 7], + [1, 7], + [2, 7], + [3, 7], + [4, 7], + [5, 7], + [6, 7] + ].forEach(d => { + var ltItem = modules[d[0]][d[1]]; + var rtItem = modules[size - d[0] - 1][d[1]]; + var lbItem = modules[d[0]][size - d[1] - 1]; + lbItem.type.push('separator'); + rtItem.type.push('separator'); + ltItem.type.push('separator'); + //绘制左上 + ltItem.color = separator.color; + //绘制右 + rtItem.color = separator.color; + //绘制左 + lbItem.color = separator.color; + }); + }, + + paintAlignment() { + let modules = this.modules; + let size = this.moduleCount; + let { + alignment, + typeNumber + } = this.options; + + //不同版本的对齐图案组合位置 + const ALIGNMENT_OF_VERSION = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ]; + // 对齐图案数量和中心位置根据版本定义 + const alignments = ALIGNMENT_OF_VERSION[typeNumber - 1]; + if (alignments) { + const calcMatrix = [ + [-2, -2, 1], + [-1, -2, 1], + [0, -2, 1], + [1, -2, 1], + [2, -2, 1], + [-2, -1, 1], + [-1, -1, 0], + [0, -1, 0], + [1, -1, 0], + [2, -1, 1], + [-2, 0, 1], + [-1, 0, 0], + [0, 0, 1], + [1, 0, 0], + [2, 0, 1], + [-2, 1, 1], + [-1, 1, 0], + [0, 1, 0], + [1, 1, 0], + [2, 1, 1], + [-2, 2, 1], + [-1, 2, 1], + [0, 2, 1], + [1, 2, 1], + [2, 2, 1] + ]; + const group_len = alignments.length; + for (let i = 0; i < group_len; i++) { + for (let j = 0; j < group_len; j++) { + //对齐图案不能污染 定位器和分隔器 + let { + x, + y + } = { + x: alignments[i], + y: alignments[j] + }; + if (!((x < 9 && y < 9) || (x > size - 9 - 1 && y < 9) || (y > size - 9 - 1 && x < 9))) { + calcMatrix.forEach(d => { + var alignmentItem = modules[x + d[0]][y + d[1]]; + alignmentItem.type.push('alignment'); + alignmentItem.color = d[2] == 1 ? alignment.foregroundColor : alignment.backgroundColor; + }); + } + } + } + } + }, + + paintTiming() { + let modules = this.modules; + let { + timing + } = this.options; + + let timingPartLen = modules.length - 16; + for (let i = 0; i < timingPartLen; i++) { + var xItem = modules[6][8 + i]; + var yItem = modules[8 + i][6]; + xItem.type.push('timing'); + yItem.type.push('timing'); + xItem.color = (1 & i) ^ 1 ? timing.foregroundColor : timing.backgroundColor; + yItem.color = (1 & i) ^ 1 ? timing.foregroundColor : timing.backgroundColor; + } + }, + + paintDarkBlock() { + let modules = this.modules; + let size = this.moduleCount; + let { + darkBlock + } = this.options; + + //创建暗模块 + var darkBlockItem = modules[size - 7 - 1][8]; + darkBlockItem.type.push('darkBlock'); + darkBlockItem.color = darkBlock.color; + }, + + paintVersionInformation() { + let modules = this.modules; + let size = this.moduleCount; + let { + versionInformation, + typeNumber: version + } = this.options; + + if (version < 7) { + return modules; + } + //预留版本信息 0 为补位,预留版本信息 是从索引7开始 + const VERSIONS = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + '000111110010010100', + '001000010110111100', + '001001101010011001', + '001010010011010011', + '001011101111110110', + '001100011101100010', + '001101100001000111', + '001110011000001101', + '001111100100101000', + '010000101101111000', + '010001010001011101', + '010010101000010111', + '010011010100110010', + '010100100110100110', + '010101011010000011', + '010110100011001001', + '010111011111101100', + '011000111011000100', + '011001000111100001', + '011010111110101011', + '011011000010001110', + '011100110000011010', + '011101001100111111', + '011110110101110101', + '011111001001010000', + '100000100111010101', + '100001011011110000', + '100010100010111010', + '100011011110011111', + '100100101100001011', + '100101010000101110', + '100110101001100100', + '100111010101000001', + '101000110001101001' + ]; + + //两种方式获取预留格式信息,临时计算或者查字典 + //let version_codes = _v.correctVersionData(_v.version); + let version_codes = VERSIONS[version] + VERSIONS[version]; + //创建预留版本信息 + let disc = [size - 11, size - 10, size - 9]; + // 左+右 + let version_cells = [ + //左 + [5, disc[2]], + [5, disc[1]], + [5, disc[0]], + [4, disc[2]], + [4, disc[1]], + [4, disc[0]], + [3, disc[2]], + [3, disc[1]], + [3, disc[0]], + [2, disc[2]], + [2, disc[1]], + [2, disc[0]], + [1, disc[2]], + [1, disc[1]], + [1, disc[0]], + [0, disc[2]], + [0, disc[1]], + [0, disc[0]], + //右 + [disc[2], 5], + [disc[1], 5], + [disc[0], 5], + [disc[2], 4], + [disc[1], 4], + [disc[0], 4], + [disc[2], 3], + [disc[1], 3], + [disc[0], 3], + [disc[2], 2], + [disc[1], 2], + [disc[0], 2], + [disc[2], 1], + [disc[1], 1], + [disc[0], 1], + [disc[2], 0], + [disc[1], 0], + [disc[0], 0] + ]; + version_cells.forEach((d, index) => { + var versionInformationItem = modules[d[0]][d[1]]; + versionInformationItem.type.push('versionInformation'); + versionInformationItem.color = version_codes[index] == '1' ? versionInformation.foregroundColor : versionInformation.backgroundColor; + }); + }, + + /** + * 绘制二维码方法 + */ + draw(options) { + options = uQRCode.deepReplace({ + drawBackground: { + before: () => {}, + after: () => {} + }, + drawBackgroundImage: { + before: () => {}, + after: () => {} + }, + drawForeground: { + before: () => {}, + after: () => {} + }, + drawForegroundImage: { + before: () => {}, + after: () => {} + } + }, options); + + /* 绘制层级关系,最底层背景 -> 背景图片 -> 前景 -> 最顶层前景图片 */ + return new Promise((resolve, reject) => { + let ctx = this.canvasContext; + + const startup = () => { + /* 同时绘制多个二维码时使用队列绘制,防止内部方法冲突导致绘制失败 */ + return uQRCode.Queue(() => new Promise((queueResolve, queueReject) => { + setTimeout(() => { + ctx.draw(false); // 第一个draw false可以清空画布 + queueResolve(); + }, 150); + })); + } + startup() + .then(() => { + /* 绘制背景 */ + return this.drawBackground({ + before: options.drawBackground.before, + after: options.drawBackground.after + }); + }) + .then(() => { + /* 绘制背景图片 */ + return this.drawBackgroundImage({ + before: options.drawBackgroundImage.before, + after: options.drawBackgroundImage.after + }); + }) + .then(() => { + /* 绘制前景 */ + return this.drawForeground({ + before: options.drawForeground.before, + after: options.drawForeground.after + }); + }) + .then(() => { + /* 绘制前景图片 */ + return this.drawForegroundImage({ + before: options.drawForegroundImage.before, + after: options.drawForegroundImage.after + }); + }) + .then(() => { + /* 完成绘制 */ + resolve(); + }); + }); + }, + + drawBackground({ + before, + after + }) { + let { + dynamicSize: size, + background + } = this.options; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + ctx.save(); + /* 填充背景色 */ + ctx.setFillStyle(background.color); + ctx.fillRect(0, 0, size, size); + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + + await after(this); + resolve(); + })(); + }); + }, + + drawBackgroundImage({ + before, + after + }) { + let { + dynamicSize: size, + background + } = this.options; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + if (background.image.src) { + ctx.save(); + + let x = 0; + let y = 0; + + let w = background.image.width * size; + let h = background.image.height * size; + let align = background.image.align; + let anchor = background.image.anchor; + let alpha = background.image.alpha; + + switch (align[0]) { + case 'left': + x = 0; + break; + case 'center': + x = size / 2 - w / 2; + break; + case 'right': + x = size - w; + break; + } + x += Number(anchor[0]); + + switch (align[1]) { + case 'top': + y = 0; + break; + case 'center': + y = size / 2 - h / 2; + break; + case 'bottom': + y = size - h; + break; + } + y += Number(anchor[1]); + + /* 设置透明度 */ + ctx.globalAlpha = alpha; + + /* 绘制图片 */ + const img = await this.loadImage(background.image.src); + ctx.drawImage(img, x, y, w, h); + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + } + + await after(this); + resolve(); + })(); + }); + }, + + drawForeground({ + before, + after + }) { + let { + background + } = this.options; + let modules = this.modules; + let moduleCount = this.moduleCount; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + ctx.save(); + for (var rowI = 0; rowI < moduleCount; rowI++) { + for (var colI = 0; colI < moduleCount; colI++) { + var tile = modules[rowI][colI]; + if (!tile.isDrawn && tile.color != background.color) { // 颜色不能与背景色一致,否则可能发生颜色重叠 + var color = tile.color; + ctx.setFillStyle(color); + ctx.fillRect(tile.x, tile.y, tile.size, tile.size); + tile.isDrawn = true; + } + } + } + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + + await after(this); + resolve(); + })(); + }); + }, + + drawForegroundImage({ + before, + after + }) { + let { + dynamicSize: size, + foreground + } = this.options; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + if (foreground.image.src) { + ctx.save(); + + // 绘制前景图 + let x = 0; + let y = 0; + + let w = foreground.image.width * size; + let h = foreground.image.height * size; + let align = foreground.image.align; + let anchor = foreground.image.anchor; + let alpha = foreground.image.alpha; + let shadow = foreground.image.shadow; + let border = foreground.image.border; + + switch (align[0]) { + case 'left': + x = 0; + break; + case 'center': + x = size / 2 - w / 2; + break; + case 'right': + x = size - w; + break; + } + x += Number(anchor[0]); + + switch (align[1]) { + case 'top': + y = 0; + break; + case 'center': + y = size / 2 - h / 2; + break; + case 'bottom': + y = size - h; + break; + } + y += Number(anchor[1]); + + /* 绘制图片 */ + const img = await this.loadImage(foreground.image.src); + ctx.drawImage(img, x, y, w, h); + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + } + + await after(this); + resolve(); + })(); + }); + } + + } + +})(); + +module.exports = uQRCode; diff --git a/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/package.json b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/package.json new file mode 100644 index 0000000..86328da --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/package.json @@ -0,0 +1,24 @@ +{ + "name": "u-qrcode", + "version": "3.2.2", + "description": "uQRCode 二维码生成插件", + "main": "u-qrcode.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Sansnn/uQRCode.git" + }, + "keywords": [ + "QR", + "QRCode", + "uQRCode" + ], + "author": "Sansnn", + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/Sansnn/uQRCode/issues" + }, + "homepage": "https://github.com/Sansnn/uQRCode#readme" +} diff --git a/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/readme.md b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/readme.md new file mode 100644 index 0000000..e5935be --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/readme.md @@ -0,0 +1,274 @@ +# uQRCode + +**点击群号加入群聊【uQRCode交流群】:[695070434](https://jq.qq.com/?_wv=1027&k=JRjzDqiw)** + +uQRCode 生成方式简单,可扩展性高,适用所有前端应用和Node.js服务端,可运行到所有支持canvas的平台。支持NVUE(NVUE中使用GCanvas)。 + +支持自定义二维码渲染规则,可通过uQRCode API得到矩阵信息后,自行实现canvas或view+css渲染二维码,如随机颜色、圆点、方块、块与块之间的间距等,详情参考示例项目。 + +### 插件市场 +[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287) + +### github +[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode) + +### npm +[https://www.npmjs.com/package/u-qrcode](https://www.npmjs.com/package/u-qrcode) + +### 示例预览 +[https://static-c15f4b57-ef97-4d2b-b939-f580f910d7e2.bspapp.com](https://static-c15f4b57-ef97-4d2b-b939-f580f910d7e2.bspapp.com) + +### 二维码 +**什么是QR码** + +QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。 + +**QR码的特点** + +一是高速读取(QR就是取自“Quick Response”的首字母),通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求; + +二是高容量、高密度,理论上内容经过压缩处理后可以存7089个数字,4296个字母和数字混合字符,2953个8位字节数据,1817个汉字; + +三是支持纠错处理,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是: +- level L : 最大 7% 的错误能够被纠正; +- level M : 最大 15% 的错误能够被纠正; +- level Q : 最大 25% 的错误能够被纠正; +- level H : 最大 30% 的错误能够被纠正; + +四是结构化,看似无规则的图形,其实对区域有严格的定义。 + +更多二维码介绍及原理:[https://blog.csdn.net/jason_ldh/article/details/11801355](https://blog.csdn.net/jason_ldh/article/details/11801355) + +### 组件使用 + +导入`u-qrcode`组件后,在 `template` 中创建 `` 组件 + +```html + +``` + +### 属性说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|canvasId |String |- |- |是 |组件标识/canvasId | +|value |String |- |- |是 |二维码内容 | +|size |Number |- |354 |否 |二维码大小,默认单位px,rpx需要使用uni.upx2px()转换| +|options |Object |- |- |否 |参数可选项,详见下方options说明 | + +### 事件说明 +|事件名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|click |- |void |点击事件 | +|complete |- |Object |生成完成事件,返回值success: true表示生成成功,false生成失败 | + +### 方法说明 +|方法名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|remake |- |void |重新生成 | +|toTempFilePath |Object:callback|void |导出临时路径 | +|save |Object:callback|void |保存 | + +#### options说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|typeNumber |Number |- |-1 |否 |二维码版本 | +|errorCorrectLevel |String/Number|L/M/Q/H/1/0/3/2|H |否 |纠错等级L/M/Q/H分别对应1/0/3/2 | +|useDynamicSize |Boolean |- |false |否 |是否使用动态尺寸,可以去除二维码小块白色细线 | +|margin |Number |- |0 |否 |填充边距,默认单位px | +|background |Object |- |- |否 |背景设置,详见下方options.background说明 | +|foreground |Object |- |- |否 |前景设置,详见下方options.foreground说明 | +|positionDetection |Object |- |- |否 |定位角设置,详见下方options.positionDetection说明 | +|separator |Object |- |- |否 |分割图案设置,详见下方options.separator说明 | +|alignment |Object |- |- |否 |对齐图案设置,详见下方options.alignment说明 | +|timing |Object |- |- |否 |时序图案设置,详见下方options.timing说明 | +|darkBlock |Object |- |- |否 |暗块设置,详见下方options.darkBlock说明 | +|versionInformation |Object |- |- |否 |版本信息设置,详见下方options.versionInformation说明 | + +#### options.background说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |#FFFFFF|否 |背景色,若需要透明背景可设置为rgba(0,0,0,0)| +|image |Object |- |- |否 |背景图片设置,详见下方options.background.image说明| + +#### options.background.image说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|src |String |- |- |否 |背景图片路径 | +|width |Number |- |1 |否 |指定背景图片宽度,1为二维码size的100% | +|height |Number |- |1 |否 |指定背景图片高度,1为二维码size的100% | +|align |Array|['left'/'center'/'right', 'top'/'center'/'bottom'] |['center', 'center'] |否 |指定背景图片对齐方式,[0]为水平方位,[1]为垂直方位 | +|anchor |Array|- |[0, 0] |否 |指定背景图片锚点,[0]为X轴偏移量,[1]为Y轴偏移量 | +|alpha |Number |0-1 |1 |否 |指定背景图片透明度 | + +#### options.foreground说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |#FFFFFF|否 |前景色 | +|image |Object |- |- |否 |前景图片设置,详见下方options.foreground.image说明 | + +#### options.foreground.image说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|src |String |- |- |否 |前景图片路径 | +|width |Number |- |1/4 |否 |指定前景图片宽度,1为二维码size的100% | +|height |Number |- |1/4 |否 |指定前景图片高度,1为二维码size的100% | +|align |Array|['left'/'center'/'right', 'top'/'center'/'bottom'] |['center', 'center'] |否 |指定前景图片对齐方式,[0]为水平方位,[1]为垂直方位 | +|anchor |Array|- |[0, 0] |否 |指定前景图片锚点,[0]为X轴偏移量,[1]为Y轴偏移量 | + +#### options.positionDetection说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |定位角区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |定位角小块颜色,默认值跟随前景色 | + +#### options.separator说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |options.background.color |否 |分割区域颜色,默认值跟随背景色 | + +#### options.alignment说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |对齐区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |对齐小块颜色,默认值跟随前景色 | + +#### options.timing说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |时序区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |时序小块颜色,默认值跟随前景色 | + +#### options.darkBlock说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |options.foreground.color |否 |暗块颜色,默认值跟随前景色 | + +#### options.versionInformation说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |版本信息区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |版本信息小块颜色,默认值跟随前景色 | + +### u-qrcode.js使用 + +引入u-qrcode.js + +``` javascript +import uQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode'; +``` + +或者使用npm安装 + +> npm i u-qrcode + +``` javascript +import uQRCode from 'u-qrcode'; +``` + +nodejs引入 + +``` javascript +import uQRCode from 'u-qrcode/module'; +``` + +在 `template` 中创建 `` 组件并设置 `id`,画布宽高 + +```html + +``` + +在 `script` 中调用生成方法 + +```javascript +import uQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode'; + +export default { + data() { + return { + text: 'uQRCode', + size: 256 + } + }, + onReady() { + const ctx = uni.createCanvasContext('qrcode'); + const uqrcode = new uQRCode( + { + text: this.text, + size: this.size + }, + ctx + ); + uqrcode.make(); + uqrcode.draw(); + } +} +``` + +### new uQRCode(options, canvasContext, loadImage)说明 + +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|options |Object |- |- |是 |包含组件属性中的options的所有属性,详见下方options说明 | +|canvasContext|Object |- |- |是 |canvas绘画上下文 | +|loadImage |Promise|- |- |否 |绘制图片时,某些平台必传,例如微信小程序2d绘图需要创建Image对象,不能直接使用路径,这时就需要传入canvas.createImage给loadImage方法,否则无法绘制图片 | + +#### options说明,包含组件属性中的options的所有属性,下方仅列举未包含的属性,其余属性请移步到组件属性options说明查看 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|text |String |- |- |是 |二维码内容 | +|size |Number |- |354 |否 |二维码大小 | + +### uQRCode实例属性 +|属性名 |类型 |说明 | +|--- |--- |:--- | +|options |Object |实例化传入的选项值 | +|canvasContext|Object |画布实例 | +|makeData |Object |制作二维码全部数据 | +|modules |Array |制作二维码主要模块数据 | +|moduleCount |Number |模块数量 | + +### uQRCode实例方法 +|方法名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|make |- |void |制作二维码方法 | +|draw |options|Promise|绘制二维码方法,绘制层级关系,最底层背景 -> 背景图片 -> 前景 -> 最顶层前景图片,options见下方说明 | + +#### draw(options)说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|drawBackground |Object: {before, after}|- |- |否 |绘制背景前后可执行自定义方法before,after | +|drawBackgroundImage|Object: {before, after}|- |- |否 |绘制背景图前后可执行自定义方法before,after| +|drawForeground |Object: {before, after}|- |- |否 |绘制前景前后可执行自定义方法before,after | +|drawForegroundImage|Object: {before, after}|- |- |否 |绘制前景图前后可执行自定义方法before,after| + +### uQRCode静态属性 +|属性名 |类型 |说明 | +|--- |--- |:--- | +|errorCorrectLevel|Object |纠错等级 | +|defaults |Object |预设默认值 | + +### uQRCode静态方法 +|方法名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|deepReplace|o, r |替换后的新对象 |对象属性深度替换 | + +### 常见问题 + +**如何扫码跳转指定网页** + +二维码内容直接放入完整的网页地址即可,例如:`https://ext.dcloud.net.cn/plugin?id=1287`。微信客户端不能是ip地址。 + +**nvue打包后生成失败** + +Canvas是作为独立的模块,打包时需要选择使用Canvas模块才能正常使用相关的功能。 需要在manifest.json的代码视图中配置如下(暂时还不支持可视化界面操作): +```javascript +"app-plus" : { + /* 模块配置 */ + "modules" : { + "Canvas" : "nvue canvas" //使用Canvas模块 + }, + //... +}, +//... +``` +保存好提交云端打包。 diff --git a/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/u-qrcode.js b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/u-qrcode.js new file mode 100644 index 0000000..fa67ceb --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode/u-qrcode.js @@ -0,0 +1,2285 @@ +//--------------------------------------------------------------------- +// uQRCode 二维码生成插件 v3.2.2 +// +// uQRCode 是一款使用方式简单,高扩展的二维码生成插件。支持全端生成,支持canvas的地方就可以使用uQRCode。 +// +// Copyright (c) Sansnn uQRCode All rights reserved. +// Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) +// 复制使用请保留本段注释,感谢支持开源! +// +// 开源地址: +// https://github.com/Sansnn/uQRCode +// +// uni-app插件市场地址: +// https://ext.dcloud.net.cn/plugin?id=1287 +//--------------------------------------------------------------------- + +"use strict"; + +function uQRCode(options, canvasContext, loadImage) { + this.options = uQRCode.getOptions(options); + this.canvasContext = uQRCode.getCanvasContext(canvasContext); + this.loadImage = uQRCode.getLoadImage(loadImage); +} + +(function() { + //--------------------------------------------------------------------- + // QRCode for JavaScript + // + // Copyright (c) 2009 Kazuhiko Arase + // + // URL: http://www.d-project.com/ + // + // Licensed under the MIT license: + // http://www.opensource.org/licenses/mit-license.php + // + // The word "QR Code" is registered trademark of + // DENSO WAVE INCORPORATED + // http://www.denso-wave.com/qrcode/faqpatent-e.html + // + //--------------------------------------------------------------------- + + //--------------------------------------------------------------------- + // QR8bitByte + //--------------------------------------------------------------------- + + function QR8bitByte(data) { + this.mode = QRMode.MODE_8BIT_BYTE; + this.data = data; + } + + QR8bitByte.prototype = { + + getLength: function(buffer) { + return this.data.length; + }, + + write: function(buffer) { + for (var i = 0; i < this.data.length; i++) { + // not JIS ... + buffer.put(this.data.charCodeAt(i), 8); + } + } + }; + + //--------------------------------------------------------------------- + // QRCode + //--------------------------------------------------------------------- + + function QRCode(typeNumber, errorCorrectLevel) { + this.typeNumber = typeNumber; + this.errorCorrectLevel = errorCorrectLevel; + this.modules = null; + this.moduleCount = 0; + this.dataCache = null; + this.dataList = new Array(); + } + + QRCode.prototype = { + + addData: function(data) { + var newData = new QR8bitByte(data); + this.dataList.push(newData); + this.dataCache = null; + }, + + isDark: function(row, col) { + if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { + throw new Error(row + "," + col); + } + return this.modules[row][col]; + }, + + getModuleCount: function() { + return this.moduleCount; + }, + + make: function() { + // Calculate automatically typeNumber if provided is < 1 + if (this.typeNumber < 1) { + var typeNumber = 1; + for (typeNumber = 1; typeNumber < 40; typeNumber++) { + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); + + var buffer = new QRBitBuffer(); + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + for (var i = 0; i < this.dataList.length; i++) { + var data = this.dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + if (buffer.getLengthInBits() <= totalDataCount * 8) + break; + } + this.typeNumber = typeNumber; + } + this.makeImpl(false, this.getBestMaskPattern()); + }, + + makeImpl: function(test, maskPattern) { + + this.moduleCount = this.typeNumber * 4 + 17; + this.modules = new Array(this.moduleCount); + + for (var row = 0; row < this.moduleCount; row++) { + + this.modules[row] = new Array(this.moduleCount); + + for (var col = 0; col < this.moduleCount; col++) { + this.modules[row][col] = null; //(col + row) % 3; + } + } + + this.setupPositionProbePattern(0, 0); + this.setupPositionProbePattern(this.moduleCount - 7, 0); + this.setupPositionProbePattern(0, this.moduleCount - 7); + this.setupPositionAdjustPattern(); + this.setupTimingPattern(); + this.setupTypeInfo(test, maskPattern); + + if (this.typeNumber >= 7) { + this.setupTypeNumber(test); + } + + if (this.dataCache == null) { + this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); + } + + this.mapData(this.dataCache, maskPattern); + }, + + setupPositionProbePattern: function(row, col) { + + for (var r = -1; r <= 7; r++) { + + if (row + r <= -1 || this.moduleCount <= row + r) continue; + + for (var c = -1; c <= 7; c++) { + + if (col + c <= -1 || this.moduleCount <= col + c) continue; + + if ((0 <= r && r <= 6 && (c == 0 || c == 6)) || + (0 <= c && c <= 6 && (r == 0 || r == 6)) || + (2 <= r && r <= 4 && 2 <= c && c <= 4)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + }, + + getBestMaskPattern: function() { + + var minLostPoint = 0; + var pattern = 0; + + for (var i = 0; i < 8; i++) { + + this.makeImpl(true, i); + + var lostPoint = QRUtil.getLostPoint(this); + + if (i == 0 || minLostPoint > lostPoint) { + minLostPoint = lostPoint; + pattern = i; + } + } + + return pattern; + }, + + createMovieClip: function(target_mc, instance_name, depth) { + + var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth); + var cs = 1; + + this.make(); + + for (var row = 0; row < this.modules.length; row++) { + + var y = row * cs; + + for (var col = 0; col < this.modules[row].length; col++) { + + var x = col * cs; + var dark = this.modules[row][col]; + + if (dark) { + qr_mc.beginFill(0, 100); + qr_mc.moveTo(x, y); + qr_mc.lineTo(x + cs, y); + qr_mc.lineTo(x + cs, y + cs); + qr_mc.lineTo(x, y + cs); + qr_mc.endFill(); + } + } + } + + return qr_mc; + }, + + setupTimingPattern: function() { + + for (var r = 8; r < this.moduleCount - 8; r++) { + if (this.modules[r][6] != null) { + continue; + } + this.modules[r][6] = (r % 2 == 0); + } + + for (var c = 8; c < this.moduleCount - 8; c++) { + if (this.modules[6][c] != null) { + continue; + } + this.modules[6][c] = (c % 2 == 0); + } + }, + + setupPositionAdjustPattern: function() { + + var pos = QRUtil.getPatternPosition(this.typeNumber); + + for (var i = 0; i < pos.length; i++) { + + for (var j = 0; j < pos.length; j++) { + + var row = pos[i]; + var col = pos[j]; + + if (this.modules[row][col] != null) { + continue; + } + + for (var r = -2; r <= 2; r++) { + + for (var c = -2; c <= 2; c++) { + + if (r == -2 || r == 2 || c == -2 || c == 2 || + (r == 0 && c == 0)) { + this.modules[row + r][col + c] = true; + } else { + this.modules[row + r][col + c] = false; + } + } + } + } + } + }, + + setupTypeNumber: function(test) { + + var bits = QRUtil.getBCHTypeNumber(this.typeNumber); + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod; + } + + for (var i = 0; i < 18; i++) { + var mod = (!test && ((bits >> i) & 1) == 1); + this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod; + } + }, + + setupTypeInfo: function(test, maskPattern) { + + var data = (this.errorCorrectLevel << 3) | maskPattern; + var bits = QRUtil.getBCHTypeInfo(data); + + // vertical + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 6) { + this.modules[i][8] = mod; + } else if (i < 8) { + this.modules[i + 1][8] = mod; + } else { + this.modules[this.moduleCount - 15 + i][8] = mod; + } + } + + // horizontal + for (var i = 0; i < 15; i++) { + + var mod = (!test && ((bits >> i) & 1) == 1); + + if (i < 8) { + this.modules[8][this.moduleCount - i - 1] = mod; + } else if (i < 9) { + this.modules[8][15 - i - 1 + 1] = mod; + } else { + this.modules[8][15 - i - 1] = mod; + } + } + + // fixed module + this.modules[this.moduleCount - 8][8] = (!test); + + }, + + mapData: function(data, maskPattern) { + + var inc = -1; + var row = this.moduleCount - 1; + var bitIndex = 7; + var byteIndex = 0; + + for (var col = this.moduleCount - 1; col > 0; col -= 2) { + + if (col == 6) col--; + + while (true) { + + for (var c = 0; c < 2; c++) { + + if (this.modules[row][col - c] == null) { + + var dark = false; + + if (byteIndex < data.length) { + dark = (((data[byteIndex] >>> bitIndex) & 1) == 1); + } + + var mask = QRUtil.getMask(maskPattern, row, col - c); + + if (mask) { + dark = !dark; + } + + this.modules[row][col - c] = dark; + bitIndex--; + + if (bitIndex == -1) { + byteIndex++; + bitIndex = 7; + } + } + } + + row += inc; + + if (row < 0 || this.moduleCount <= row) { + row -= inc; + inc = -inc; + break; + } + } + } + + } + + }; + + QRCode.PAD0 = 0xEC; + QRCode.PAD1 = 0x11; + + QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { + + var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel); + + var buffer = new QRBitBuffer(); + + for (var i = 0; i < dataList.length; i++) { + var data = dataList[i]; + buffer.put(data.mode, 4); + buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber)); + data.write(buffer); + } + + // calc num max data. + var totalDataCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalDataCount += rsBlocks[i].dataCount; + } + + if (buffer.getLengthInBits() > totalDataCount * 8) { + throw new Error("code length overflow. (" + + buffer.getLengthInBits() + + ">" + + totalDataCount * 8 + + ")"); + } + + // end code + if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { + buffer.put(0, 4); + } + + // padding + while (buffer.getLengthInBits() % 8 != 0) { + buffer.putBit(false); + } + + // padding + while (true) { + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD0, 8); + + if (buffer.getLengthInBits() >= totalDataCount * 8) { + break; + } + buffer.put(QRCode.PAD1, 8); + } + + return QRCode.createBytes(buffer, rsBlocks); + } + + QRCode.createBytes = function(buffer, rsBlocks) { + + var offset = 0; + + var maxDcCount = 0; + var maxEcCount = 0; + + var dcdata = new Array(rsBlocks.length); + var ecdata = new Array(rsBlocks.length); + + for (var r = 0; r < rsBlocks.length; r++) { + + var dcCount = rsBlocks[r].dataCount; + var ecCount = rsBlocks[r].totalCount - dcCount; + + maxDcCount = Math.max(maxDcCount, dcCount); + maxEcCount = Math.max(maxEcCount, ecCount); + + dcdata[r] = new Array(dcCount); + + for (var i = 0; i < dcdata[r].length; i++) { + dcdata[r][i] = 0xff & buffer.buffer[i + offset]; + } + offset += dcCount; + + var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); + var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1); + + var modPoly = rawPoly.mod(rsPoly); + ecdata[r] = new Array(rsPoly.getLength() - 1); + for (var i = 0; i < ecdata[r].length; i++) { + var modIndex = i + modPoly.getLength() - ecdata[r].length; + ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0; + } + + } + + var totalCodeCount = 0; + for (var i = 0; i < rsBlocks.length; i++) { + totalCodeCount += rsBlocks[i].totalCount; + } + + var data = new Array(totalCodeCount); + var index = 0; + + for (var i = 0; i < maxDcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < dcdata[r].length) { + data[index++] = dcdata[r][i]; + } + } + } + + for (var i = 0; i < maxEcCount; i++) { + for (var r = 0; r < rsBlocks.length; r++) { + if (i < ecdata[r].length) { + data[index++] = ecdata[r][i]; + } + } + } + + return data; + + } + + //--------------------------------------------------------------------- + // QRMode + //--------------------------------------------------------------------- + + var QRMode = { + MODE_NUMBER: 1 << 0, + MODE_ALPHA_NUM: 1 << 1, + MODE_8BIT_BYTE: 1 << 2, + MODE_KANJI: 1 << 3 + }; + + //--------------------------------------------------------------------- + // QRErrorCorrectLevel + //--------------------------------------------------------------------- + + var QRErrorCorrectLevel = { + L: 1, + M: 0, + Q: 3, + H: 2 + }; + + //--------------------------------------------------------------------- + // QRMaskPattern + //--------------------------------------------------------------------- + + var QRMaskPattern = { + PATTERN000: 0, + PATTERN001: 1, + PATTERN010: 2, + PATTERN011: 3, + PATTERN100: 4, + PATTERN101: 5, + PATTERN110: 6, + PATTERN111: 7 + }; + + //--------------------------------------------------------------------- + // QRUtil + //--------------------------------------------------------------------- + + var QRUtil = { + + PATTERN_POSITION_TABLE: [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ], + + G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0), + G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0), + G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1), + + getBCHTypeInfo: function(data) { + var d = data << 10; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) { + d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15))); + } + return ((data << 10) | d) ^ QRUtil.G15_MASK; + }, + + getBCHTypeNumber: function(data) { + var d = data << 12; + while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) { + d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18))); + } + return (data << 12) | d; + }, + + getBCHDigit: function(data) { + + var digit = 0; + + while (data != 0) { + digit++; + data >>>= 1; + } + + return digit; + }, + + getPatternPosition: function(typeNumber) { + return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; + }, + + getMask: function(maskPattern, i, j) { + + switch (maskPattern) { + + case QRMaskPattern.PATTERN000: + return (i + j) % 2 == 0; + case QRMaskPattern.PATTERN001: + return i % 2 == 0; + case QRMaskPattern.PATTERN010: + return j % 3 == 0; + case QRMaskPattern.PATTERN011: + return (i + j) % 3 == 0; + case QRMaskPattern.PATTERN100: + return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0; + case QRMaskPattern.PATTERN101: + return (i * j) % 2 + (i * j) % 3 == 0; + case QRMaskPattern.PATTERN110: + return ((i * j) % 2 + (i * j) % 3) % 2 == 0; + case QRMaskPattern.PATTERN111: + return ((i * j) % 3 + (i + j) % 2) % 2 == 0; + + default: + throw new Error("bad maskPattern:" + maskPattern); + } + }, + + getErrorCorrectPolynomial: function(errorCorrectLength) { + + var a = new QRPolynomial([1], 0); + + for (var i = 0; i < errorCorrectLength; i++) { + a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0)); + } + + return a; + }, + + getLengthInBits: function(mode, type) { + + if (1 <= type && type < 10) { + + // 1 - 9 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 10; + case QRMode.MODE_ALPHA_NUM: + return 9; + case QRMode.MODE_8BIT_BYTE: + return 8; + case QRMode.MODE_KANJI: + return 8; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 27) { + + // 10 - 26 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 12; + case QRMode.MODE_ALPHA_NUM: + return 11; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 10; + default: + throw new Error("mode:" + mode); + } + + } else if (type < 41) { + + // 27 - 40 + + switch (mode) { + case QRMode.MODE_NUMBER: + return 14; + case QRMode.MODE_ALPHA_NUM: + return 13; + case QRMode.MODE_8BIT_BYTE: + return 16; + case QRMode.MODE_KANJI: + return 12; + default: + throw new Error("mode:" + mode); + } + + } else { + throw new Error("type:" + type); + } + }, + + getLostPoint: function(qrCode) { + + var moduleCount = qrCode.getModuleCount(); + + var lostPoint = 0; + + // LEVEL1 + + for (var row = 0; row < moduleCount; row++) { + + for (var col = 0; col < moduleCount; col++) { + + var sameCount = 0; + var dark = qrCode.isDark(row, col); + + for (var r = -1; r <= 1; r++) { + + if (row + r < 0 || moduleCount <= row + r) { + continue; + } + + for (var c = -1; c <= 1; c++) { + + if (col + c < 0 || moduleCount <= col + c) { + continue; + } + + if (r == 0 && c == 0) { + continue; + } + + if (dark == qrCode.isDark(row + r, col + c)) { + sameCount++; + } + } + } + + if (sameCount > 5) { + lostPoint += (3 + sameCount - 5); + } + } + } + + // LEVEL2 + + for (var row = 0; row < moduleCount - 1; row++) { + for (var col = 0; col < moduleCount - 1; col++) { + var count = 0; + if (qrCode.isDark(row, col)) count++; + if (qrCode.isDark(row + 1, col)) count++; + if (qrCode.isDark(row, col + 1)) count++; + if (qrCode.isDark(row + 1, col + 1)) count++; + if (count == 0 || count == 4) { + lostPoint += 3; + } + } + } + + // LEVEL3 + + for (var row = 0; row < moduleCount; row++) { + for (var col = 0; col < moduleCount - 6; col++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row, col + 1) && + qrCode.isDark(row, col + 2) && + qrCode.isDark(row, col + 3) && + qrCode.isDark(row, col + 4) && + !qrCode.isDark(row, col + 5) && + qrCode.isDark(row, col + 6)) { + lostPoint += 40; + } + } + } + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount - 6; row++) { + if (qrCode.isDark(row, col) && + !qrCode.isDark(row + 1, col) && + qrCode.isDark(row + 2, col) && + qrCode.isDark(row + 3, col) && + qrCode.isDark(row + 4, col) && + !qrCode.isDark(row + 5, col) && + qrCode.isDark(row + 6, col)) { + lostPoint += 40; + } + } + } + + // LEVEL4 + + var darkCount = 0; + + for (var col = 0; col < moduleCount; col++) { + for (var row = 0; row < moduleCount; row++) { + if (qrCode.isDark(row, col)) { + darkCount++; + } + } + } + + var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; + lostPoint += ratio * 10; + + return lostPoint; + } + + }; + + + //--------------------------------------------------------------------- + // QRMath + //--------------------------------------------------------------------- + + var QRMath = { + + glog: function(n) { + + if (n < 1) { + throw new Error("glog(" + n + ")"); + } + + return QRMath.LOG_TABLE[n]; + }, + + gexp: function(n) { + + while (n < 0) { + n += 255; + } + + while (n >= 256) { + n -= 255; + } + + return QRMath.EXP_TABLE[n]; + }, + + EXP_TABLE: new Array(256), + + LOG_TABLE: new Array(256) + + }; + + for (var i = 0; i < 8; i++) { + QRMath.EXP_TABLE[i] = 1 << i; + } + for (var i = 8; i < 256; i++) { + QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ + QRMath.EXP_TABLE[i - 5] ^ + QRMath.EXP_TABLE[i - 6] ^ + QRMath.EXP_TABLE[i - 8]; + } + for (var i = 0; i < 255; i++) { + QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i; + } + + //--------------------------------------------------------------------- + // QRPolynomial + //--------------------------------------------------------------------- + + function QRPolynomial(num, shift) { + + if (num.length == undefined) { + throw new Error(num.length + "/" + shift); + } + + var offset = 0; + + while (offset < num.length && num[offset] == 0) { + offset++; + } + + this.num = new Array(num.length - offset + shift); + for (var i = 0; i < num.length - offset; i++) { + this.num[i] = num[i + offset]; + } + } + + QRPolynomial.prototype = { + + get: function(index) { + return this.num[index]; + }, + + getLength: function() { + return this.num.length; + }, + + multiply: function(e) { + + var num = new Array(this.getLength() + e.getLength() - 1); + + for (var i = 0; i < this.getLength(); i++) { + for (var j = 0; j < e.getLength(); j++) { + num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j))); + } + } + + return new QRPolynomial(num, 0); + }, + + mod: function(e) { + + if (this.getLength() - e.getLength() < 0) { + return this; + } + + var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0)); + + var num = new Array(this.getLength()); + + for (var i = 0; i < this.getLength(); i++) { + num[i] = this.get(i); + } + + for (var i = 0; i < e.getLength(); i++) { + num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio); + } + + // recursive call + return new QRPolynomial(num, 0).mod(e); + } + }; + + //--------------------------------------------------------------------- + // QRRSBlock + //--------------------------------------------------------------------- + + function QRRSBlock(totalCount, dataCount) { + this.totalCount = totalCount; + this.dataCount = dataCount; + } + + QRRSBlock.RS_BLOCK_TABLE = [ + + // L + // M + // Q + // H + + // 1 + [1, 26, 19], + [1, 26, 16], + [1, 26, 13], + [1, 26, 9], + + // 2 + [1, 44, 34], + [1, 44, 28], + [1, 44, 22], + [1, 44, 16], + + // 3 + [1, 70, 55], + [1, 70, 44], + [2, 35, 17], + [2, 35, 13], + + // 4 + [1, 100, 80], + [2, 50, 32], + [2, 50, 24], + [4, 25, 9], + + // 5 + [1, 134, 108], + [2, 67, 43], + [2, 33, 15, 2, 34, 16], + [2, 33, 11, 2, 34, 12], + + // 6 + [2, 86, 68], + [4, 43, 27], + [4, 43, 19], + [4, 43, 15], + + // 7 + [2, 98, 78], + [4, 49, 31], + [2, 32, 14, 4, 33, 15], + [4, 39, 13, 1, 40, 14], + + // 8 + [2, 121, 97], + [2, 60, 38, 2, 61, 39], + [4, 40, 18, 2, 41, 19], + [4, 40, 14, 2, 41, 15], + + // 9 + [2, 146, 116], + [3, 58, 36, 2, 59, 37], + [4, 36, 16, 4, 37, 17], + [4, 36, 12, 4, 37, 13], + + // 10 + [2, 86, 68, 2, 87, 69], + [4, 69, 43, 1, 70, 44], + [6, 43, 19, 2, 44, 20], + [6, 43, 15, 2, 44, 16], + + // 11 + [4, 101, 81], + [1, 80, 50, 4, 81, 51], + [4, 50, 22, 4, 51, 23], + [3, 36, 12, 8, 37, 13], + + // 12 + [2, 116, 92, 2, 117, 93], + [6, 58, 36, 2, 59, 37], + [4, 46, 20, 6, 47, 21], + [7, 42, 14, 4, 43, 15], + + // 13 + [4, 133, 107], + [8, 59, 37, 1, 60, 38], + [8, 44, 20, 4, 45, 21], + [12, 33, 11, 4, 34, 12], + + // 14 + [3, 145, 115, 1, 146, 116], + [4, 64, 40, 5, 65, 41], + [11, 36, 16, 5, 37, 17], + [11, 36, 12, 5, 37, 13], + + // 15 + [5, 109, 87, 1, 110, 88], + [5, 65, 41, 5, 66, 42], + [5, 54, 24, 7, 55, 25], + [11, 36, 12], + + // 16 + [5, 122, 98, 1, 123, 99], + [7, 73, 45, 3, 74, 46], + [15, 43, 19, 2, 44, 20], + [3, 45, 15, 13, 46, 16], + + // 17 + [1, 135, 107, 5, 136, 108], + [10, 74, 46, 1, 75, 47], + [1, 50, 22, 15, 51, 23], + [2, 42, 14, 17, 43, 15], + + // 18 + [5, 150, 120, 1, 151, 121], + [9, 69, 43, 4, 70, 44], + [17, 50, 22, 1, 51, 23], + [2, 42, 14, 19, 43, 15], + + // 19 + [3, 141, 113, 4, 142, 114], + [3, 70, 44, 11, 71, 45], + [17, 47, 21, 4, 48, 22], + [9, 39, 13, 16, 40, 14], + + // 20 + [3, 135, 107, 5, 136, 108], + [3, 67, 41, 13, 68, 42], + [15, 54, 24, 5, 55, 25], + [15, 43, 15, 10, 44, 16], + + // 21 + [4, 144, 116, 4, 145, 117], + [17, 68, 42], + [17, 50, 22, 6, 51, 23], + [19, 46, 16, 6, 47, 17], + + // 22 + [2, 139, 111, 7, 140, 112], + [17, 74, 46], + [7, 54, 24, 16, 55, 25], + [34, 37, 13], + + // 23 + [4, 151, 121, 5, 152, 122], + [4, 75, 47, 14, 76, 48], + [11, 54, 24, 14, 55, 25], + [16, 45, 15, 14, 46, 16], + + // 24 + [6, 147, 117, 4, 148, 118], + [6, 73, 45, 14, 74, 46], + [11, 54, 24, 16, 55, 25], + [30, 46, 16, 2, 47, 17], + + // 25 + [8, 132, 106, 4, 133, 107], + [8, 75, 47, 13, 76, 48], + [7, 54, 24, 22, 55, 25], + [22, 45, 15, 13, 46, 16], + + // 26 + [10, 142, 114, 2, 143, 115], + [19, 74, 46, 4, 75, 47], + [28, 50, 22, 6, 51, 23], + [33, 46, 16, 4, 47, 17], + + // 27 + [8, 152, 122, 4, 153, 123], + [22, 73, 45, 3, 74, 46], + [8, 53, 23, 26, 54, 24], + [12, 45, 15, 28, 46, 16], + + // 28 + [3, 147, 117, 10, 148, 118], + [3, 73, 45, 23, 74, 46], + [4, 54, 24, 31, 55, 25], + [11, 45, 15, 31, 46, 16], + + // 29 + [7, 146, 116, 7, 147, 117], + [21, 73, 45, 7, 74, 46], + [1, 53, 23, 37, 54, 24], + [19, 45, 15, 26, 46, 16], + + // 30 + [5, 145, 115, 10, 146, 116], + [19, 75, 47, 10, 76, 48], + [15, 54, 24, 25, 55, 25], + [23, 45, 15, 25, 46, 16], + + // 31 + [13, 145, 115, 3, 146, 116], + [2, 74, 46, 29, 75, 47], + [42, 54, 24, 1, 55, 25], + [23, 45, 15, 28, 46, 16], + + // 32 + [17, 145, 115], + [10, 74, 46, 23, 75, 47], + [10, 54, 24, 35, 55, 25], + [19, 45, 15, 35, 46, 16], + + // 33 + [17, 145, 115, 1, 146, 116], + [14, 74, 46, 21, 75, 47], + [29, 54, 24, 19, 55, 25], + [11, 45, 15, 46, 46, 16], + + // 34 + [13, 145, 115, 6, 146, 116], + [14, 74, 46, 23, 75, 47], + [44, 54, 24, 7, 55, 25], + [59, 46, 16, 1, 47, 17], + + // 35 + [12, 151, 121, 7, 152, 122], + [12, 75, 47, 26, 76, 48], + [39, 54, 24, 14, 55, 25], + [22, 45, 15, 41, 46, 16], + + // 36 + [6, 151, 121, 14, 152, 122], + [6, 75, 47, 34, 76, 48], + [46, 54, 24, 10, 55, 25], + [2, 45, 15, 64, 46, 16], + + // 37 + [17, 152, 122, 4, 153, 123], + [29, 74, 46, 14, 75, 47], + [49, 54, 24, 10, 55, 25], + [24, 45, 15, 46, 46, 16], + + // 38 + [4, 152, 122, 18, 153, 123], + [13, 74, 46, 32, 75, 47], + [48, 54, 24, 14, 55, 25], + [42, 45, 15, 32, 46, 16], + + // 39 + [20, 147, 117, 4, 148, 118], + [40, 75, 47, 7, 76, 48], + [43, 54, 24, 22, 55, 25], + [10, 45, 15, 67, 46, 16], + + // 40 + [19, 148, 118, 6, 149, 119], + [18, 75, 47, 31, 76, 48], + [34, 54, 24, 34, 55, 25], + [20, 45, 15, 61, 46, 16] + ]; + + QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { + + var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); + + if (rsBlock == undefined) { + throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + + errorCorrectLevel); + } + + var length = rsBlock.length / 3; + + var list = new Array(); + + for (var i = 0; i < length; i++) { + + var count = rsBlock[i * 3 + 0]; + var totalCount = rsBlock[i * 3 + 1]; + var dataCount = rsBlock[i * 3 + 2]; + + for (var j = 0; j < count; j++) { + list.push(new QRRSBlock(totalCount, dataCount)); + } + } + + return list; + } + + QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) { + + switch (errorCorrectLevel) { + case QRErrorCorrectLevel.L: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; + case QRErrorCorrectLevel.M: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; + case QRErrorCorrectLevel.Q: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; + case QRErrorCorrectLevel.H: + return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; + default: + return undefined; + } + } + + //--------------------------------------------------------------------- + // QRBitBuffer + //--------------------------------------------------------------------- + + function QRBitBuffer() { + this.buffer = new Array(); + this.length = 0; + } + + QRBitBuffer.prototype = { + + get: function(index) { + var bufIndex = Math.floor(index / 8); + return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1; + }, + + put: function(num, length) { + for (var i = 0; i < length; i++) { + this.putBit(((num >>> (length - i - 1)) & 1) == 1); + } + }, + + getLengthInBits: function() { + return this.length; + }, + + putBit: function(bit) { + + var bufIndex = Math.floor(this.length / 8); + if (this.buffer.length <= bufIndex) { + this.buffer.push(0); + } + + if (bit) { + this.buffer[bufIndex] |= (0x80 >>> (this.length % 8)); + } + + this.length++; + } + }; + + //--------------------------------------------------------------------- + // Support Chinese 字符编码支持中文 + // 使用mode 4 8bit + //--------------------------------------------------------------------- + function utf16To8(text) { + var result = ''; + var c; + for (var i = 0; i < text.length; i++) { + c = text.charCodeAt(i); + if (c >= 0x0001 && c <= 0x007F) { + result += text.charAt(i); + } else if (c > 0x07FF) { + result += String.fromCharCode(0xE0 | c >> 12 & 0x0F); + result += String.fromCharCode(0x80 | c >> 6 & 0x3F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } else { + result += String.fromCharCode(0xC0 | c >> 6 & 0x1F); + result += String.fromCharCode(0x80 | c >> 0 & 0x3F); + } + } + return result; + } + + /** + * 队列 + */ + class Queue { + constructor() { + let waitingQueue = []; + let isRunning = false; //记录是否有未完成的任务 + function execute(task, resolve, reject) { + task() + .then((data) => { + resolve(data); + }) + .catch((e) => { + reject(e); + }) + .finally(() => { + //等待任务队列中如果有任务,则触发它;否则设置isRunning = false,表示无任务状态 + if (waitingQueue.length) { + const next = waitingQueue.shift(); + execute(next.task, next.resolve, next.reject); + } else { + isRunning = false; + } + }); + } + return function(task) { + return new Promise((resolve, reject) => { + if (isRunning) { + waitingQueue.push({ + task, + resolve, + reject + }); + } else { + isRunning = true; + execute(task, resolve, reject); + } + }); + }; + } + } + // const queue = new Queue(); + // queue(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // resolve('task1'); + // }, 1000); + // })).then(data => console.log(data)); + // queue(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // resolve('task2'); + // }, 100); + // })).then(data => console.log(data)); + // queue(() => new Promise((resolve, reject) => { + // setTimeout(() => { + // resolve('task3'); + // }, 300); + // })).then(data => console.log(data)); + + /** + * 纠错等级 + */ + uQRCode.errorCorrectLevel = QRErrorCorrectLevel; + + /** + * 预设默认值(基本,不包含各部分和艺术码参数) + */ + uQRCode.defaults = { + typeNumber: -1, // 版本,-1为自动计算,字符越多,版本越高 + errorCorrectLevel: QRErrorCorrectLevel.H, // 纠错等级 + text: '', // 二维码内容 + size: 354, // 大小 + useDynamicSize: false, // 使用动态尺寸,可以去掉方块小数点,绘制出来后没有白色细线 + margin: 0, // 边距 + background: { + color: '#FFFFFF' // 背景色 + }, + foreground: { + color: '#000000' // 前景色 + } + } + + /** + * 对象属性深度替换 + * @param {Object} o 原始对象/默认对象/被替换的对象 + * @param {Object} r 从这个对象里取值替换到o对象里 + * @return {Object} 替换后的新对象 + */ + uQRCode.deepReplace = function(o = {}, r = {}) { + let obj = { + ...o + } + for (let k in r) { + var vr = r[k]; + if (vr.constructor == Object) { + obj[k] = this.deepReplace(obj[k], vr); + } else if (vr.constructor == String && !vr) { + obj[k] = obj[k]; + } else { + obj[k] = vr; + } + } + return obj; + } + + /** + * 获取选项值 + */ + uQRCode.getOptions = function(options) { + options = uQRCode.deepReplace(uQRCode.defaults, options); + + /* 背景 */ + options.background = uQRCode.deepReplace({ + color: options.background.color, // 背景色 + image: { + src: '', + width: 1, // 图片宽 + height: 1, // 图片高 + align: ['center', 'center'], // 图片对齐方式水平,垂直 + anchor: [0, 0], // 图片位置,X坐标,Y坐标 + alpha: 1 // 透明度 + } + }, options.background); + /* 前景 */ + options.foreground = uQRCode.deepReplace({ + color: options.foreground.color, // 前景色 + image: { + src: '', + width: 1 / 4, // 图片宽 + height: 1 / 4, // 图片高 + align: ['center', 'center'], // 图片对齐方式水平,垂直 + anchor: [0, 0] // 图片位置,X坐标,Y坐标 + } + }, options.foreground); + /* 定位角 */ + options.positionDetection = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 定位角区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 定位角小块颜色,默认值跟随前景色 + }, options.positionDetection); + /* 分割图案 */ + options.separator = uQRCode.deepReplace({ + color: options.background.color // 分割区域颜色,默认值跟随背景色 + }, options.separator); + /* 对齐图案 */ + options.alignment = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 对齐区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 对齐小块颜色,默认值跟随前景色 + }, options.alignment); + /* 时序图案 */ + options.timing = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 时序区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 时序小块颜色,默认值跟随前景色 + }, options.timing); + /* 暗块 */ + options.darkBlock = uQRCode.deepReplace({ + color: options.foreground.color // 暗块颜色 + }, options.darkBlock); + /* 版本信息 */ + options.versionInformation = uQRCode.deepReplace({ + backgroundColor: options.background.color, // 版本信息区域背景色,默认值跟随背景色 + foregroundColor: options.foreground.color // 版本信息小块颜色,默认值跟随前景色 + }, options.versionInformation); + + return options; + } + + /** + * 获取canvas实例 + */ + uQRCode.getCanvasContext = function(ctx) { + /* 兼容setFillStyle写法,主要在uni-app nvue gcanvas */ + ctx.setFillStyle = ctx.setFillStyle || function(color) { + ctx.fillStyle = color; + } + /* 兼容setFontSize写法,主要在微信小程序canvas2d */ + ctx.setFontSize = ctx.setFontSize || function(fontSize) { + ctx.font = `${fontSize}px`; + } + /* 兼容setTextAlign写法,主要在微信小程序canvas2d */ + ctx.setTextAlign = ctx.setTextAlign || function(align) { + ctx.textAlign = align; + } + /* 兼容setTextBaseline写法,主要在微信小程序canvas2d */ + ctx.setTextBaseline = ctx.setTextBaseline || function(textBaseline) { + ctx.textBaseline = textBaseline; + } + /* 若实例不包含draw方法则创建一个 */ + ctx.draw = ctx.draw || function(reserve, callback) { + callback && callback(); + } + return ctx; + } + + /* 队列实例,某些平台一起使用多个组件时需要通过队列逐一绘制,否则部分绘制方法异常,nvue端的iOS gcanvas尤其明显,在不通过队列绘制时会出现图片丢失的情况 */ + uQRCode.Queue = new Queue(); + uQRCode.QueueLoadImage = new Queue(); + + /* 缓存loadImage图片 */ + uQRCode.loadImageCache = []; + + /** + * 获取加载图片方法 + */ + uQRCode.getLoadImage = function(loadImage) { + if (typeof loadImage == 'function') { + return function(src) { + /* 解决iOS APP||NVUE同时绘制多个二维码导致图片丢失需使用队列 */ + return uQRCode.QueueLoadImage(() => new Promise((resolve, reject) => { + setTimeout(() => { + const cache = uQRCode.loadImageCache.find(x => x.src == src); + if (cache) { + resolve(cache.img); + } else { + loadImage(src).then(img => { + uQRCode.loadImageCache.push({ + src, + img + }); + resolve(img); + }); + } + }, 150); + })); + } + } else { + return function(src) { + return Promise.resolve(src); + } + } + } + + uQRCode.prototype = { + /** + * 实例化传入的选项值 + */ + options: {}, + + /** + * 画布实例 + */ + canvasContext: {}, + + /** + * 制作二维码全部数据 + */ + makeData: {}, + + /** + * 制作二维码主要模块数据,基于makeData的modules但数据格式不一致,这里的modules是定制过的 + */ + modules: [], + + /** + * 模块数量 + */ + moduleCount: 0, + + /** + * 获取制作二维码数据 + */ + getMakeData() { + let { + typeNumber, + errorCorrectLevel, + text + } = this.options; + var qrcode = new QRCode(typeNumber, errorCorrectLevel); + qrcode.addData(utf16To8(text.toString())); + qrcode.make(); + return qrcode; + }, + + /** + * 制作二维码方法 + */ + make() { + let makeData = this.makeData = this.getMakeData(); + this.modules = JSON.parse(JSON.stringify(makeData.modules)); + this.moduleCount = makeData.moduleCount; + this.options.typeNumber = makeData.typeNumber; + + /* 数据码 data */ + this.paintData(); + /* 定位图案 position detection */ + this.paintPositionDetection(); + /* 分隔图案 separator */ + this.paintSeparator(); + /* 对齐图案 alignment */ + this.paintAlignment(); + /* 时序图案 timing */ + this.paintTiming(); + /* 暗块 darkBlock */ + this.paintDarkBlock(); + /* 预留版本信息 version information */ + this.paintVersionInformation(); + }, + + paintData() { + let modules = this.modules; + let moduleCount = this.moduleCount; + let { + size, + margin, + background, + foreground, + useDynamicSize + } = this.options; + + /* dynamicSize自动计算出最适合绘制的尺寸,并按这个尺寸去绘制,可以解决canvas绘制小块间产生白线的问题(其实就是小数点精度问题),useDynamicSize=false可以取消这个设定 */ + // let dynamicSize = this.options.dynamicSize = Math.floor((size - margin * 2) / moduleCount) * moduleCount + margin * 2; // Math.floor向下取整缩放会模糊 + let dynamicSize = this.options.dynamicSize = Math.ceil((size - margin * 2) / moduleCount) * moduleCount + margin * 2; // Math.ceil向上取整缩放效果比floor清晰 + if (!useDynamicSize) { + dynamicSize = this.options.dynamicSize = size; + } + let tileSize = (dynamicSize - margin * 2) / moduleCount; + + for (var rowI = 0; rowI < modules.length; rowI++) { + for (var colI = 0; colI < modules.length; colI++) { + var tile = modules[rowI][colI]; + if (tile) { + modules[rowI][colI] = { + size: tileSize, + x: colI * tileSize + margin, + y: rowI * tileSize + margin, + type: ['foreground'], + color: foreground.color, + isBlack: true, + isDrawn: false + }; + } else { + modules[rowI][colI] = { + size: tileSize, + x: colI * tileSize + margin, + y: rowI * tileSize + margin, + type: ['background'], + color: background.color, + isBlack: false, + isDrawn: false + }; + } + } + } + }, + + paintPositionDetection() { + let modules = this.modules; + let size = this.moduleCount; + let { + positionDetection + } = this.options; + + //1) 定义基础图形索引(左上角)x ,y,v + let basePart = [ + [0, 0, 1], + [1, 0, 1], + [2, 0, 1], + [3, 0, 1], + [4, 0, 1], + [5, 0, 1], + [6, 0, 1], + [0, 1, 1], + [1, 1, 0], + [2, 1, 0], + [3, 1, 0], + [4, 1, 0], + [5, 1, 0], + [6, 1, 1], + [0, 2, 1], + [1, 2, 0], + [2, 2, 1], + [3, 2, 1], + [4, 2, 1], + [5, 2, 0], + [6, 2, 1], + [0, 3, 1], + [1, 3, 0], + [2, 3, 1], + [3, 3, 1], + [4, 3, 1], + [5, 3, 0], + [6, 3, 1], + [0, 4, 1], + [1, 4, 0], + [2, 4, 1], + [3, 4, 1], + [4, 4, 1], + [5, 4, 0], + [6, 4, 1], + [0, 5, 1], + [1, 5, 0], + [2, 5, 0], + [3, 5, 0], + [4, 5, 0], + [5, 5, 0], + [6, 5, 1], + [0, 6, 1], + [1, 6, 1], + [2, 6, 1], + [3, 6, 1], + [4, 6, 1], + [5, 6, 1], + [6, 6, 1] + ]; + let disc = size - 7; //size -7 + basePart.forEach(d => { + var ltItem = modules[d[0]][d[1]]; + var rtItem = modules[d[0] + disc][d[1]]; + var lbItem = modules[d[0]][d[1] + disc]; + lbItem.type.push('positionDetection'); + rtItem.type.push('positionDetection'); + ltItem.type.push('positionDetection'); + //绘制左上角 + ltItem.color = d[2] == 1 ? positionDetection.foregroundColor : positionDetection.backgroundColor; + //绘制右 + rtItem.color = d[2] == 1 ? positionDetection.foregroundColor : positionDetection.backgroundColor; + //绘制左 + lbItem.color = d[2] == 1 ? positionDetection.foregroundColor : positionDetection.backgroundColor; + }); + }, + + paintSeparator() { + let modules = this.modules; + let size = this.moduleCount; + let { + separator + } = this.options; + + //1) 定义基础图形索引(左上角) + [ + [7, 0], + [7, 1], + [7, 2], + [7, 3], + [7, 4], + [7, 5], + [7, 6], + [7, 7], + [0, 7], + [1, 7], + [2, 7], + [3, 7], + [4, 7], + [5, 7], + [6, 7] + ].forEach(d => { + var ltItem = modules[d[0]][d[1]]; + var rtItem = modules[size - d[0] - 1][d[1]]; + var lbItem = modules[d[0]][size - d[1] - 1]; + lbItem.type.push('separator'); + rtItem.type.push('separator'); + ltItem.type.push('separator'); + //绘制左上 + ltItem.color = separator.color; + //绘制右 + rtItem.color = separator.color; + //绘制左 + lbItem.color = separator.color; + }); + }, + + paintAlignment() { + let modules = this.modules; + let size = this.moduleCount; + let { + alignment, + typeNumber + } = this.options; + + //不同版本的对齐图案组合位置 + const ALIGNMENT_OF_VERSION = [ + [], + [6, 18], + [6, 22], + [6, 26], + [6, 30], + [6, 34], + [6, 22, 38], + [6, 24, 42], + [6, 26, 46], + [6, 28, 50], + [6, 30, 54], + [6, 32, 58], + [6, 34, 62], + [6, 26, 46, 66], + [6, 26, 48, 70], + [6, 26, 50, 74], + [6, 30, 54, 78], + [6, 30, 56, 82], + [6, 30, 58, 86], + [6, 34, 62, 90], + [6, 28, 50, 72, 94], + [6, 26, 50, 74, 98], + [6, 30, 54, 78, 102], + [6, 28, 54, 80, 106], + [6, 32, 58, 84, 110], + [6, 30, 58, 86, 114], + [6, 34, 62, 90, 118], + [6, 26, 50, 74, 98, 122], + [6, 30, 54, 78, 102, 126], + [6, 26, 52, 78, 104, 130], + [6, 30, 56, 82, 108, 134], + [6, 34, 60, 86, 112, 138], + [6, 30, 58, 86, 114, 142], + [6, 34, 62, 90, 118, 146], + [6, 30, 54, 78, 102, 126, 150], + [6, 24, 50, 76, 102, 128, 154], + [6, 28, 54, 80, 106, 132, 158], + [6, 32, 58, 84, 110, 136, 162], + [6, 26, 54, 82, 110, 138, 166], + [6, 30, 58, 86, 114, 142, 170] + ]; + // 对齐图案数量和中心位置根据版本定义 + const alignments = ALIGNMENT_OF_VERSION[typeNumber - 1]; + if (alignments) { + const calcMatrix = [ + [-2, -2, 1], + [-1, -2, 1], + [0, -2, 1], + [1, -2, 1], + [2, -2, 1], + [-2, -1, 1], + [-1, -1, 0], + [0, -1, 0], + [1, -1, 0], + [2, -1, 1], + [-2, 0, 1], + [-1, 0, 0], + [0, 0, 1], + [1, 0, 0], + [2, 0, 1], + [-2, 1, 1], + [-1, 1, 0], + [0, 1, 0], + [1, 1, 0], + [2, 1, 1], + [-2, 2, 1], + [-1, 2, 1], + [0, 2, 1], + [1, 2, 1], + [2, 2, 1] + ]; + const group_len = alignments.length; + for (let i = 0; i < group_len; i++) { + for (let j = 0; j < group_len; j++) { + //对齐图案不能污染 定位器和分隔器 + let { + x, + y + } = { + x: alignments[i], + y: alignments[j] + }; + if (!((x < 9 && y < 9) || (x > size - 9 - 1 && y < 9) || (y > size - 9 - 1 && x < 9))) { + calcMatrix.forEach(d => { + var alignmentItem = modules[x + d[0]][y + d[1]]; + alignmentItem.type.push('alignment'); + alignmentItem.color = d[2] == 1 ? alignment.foregroundColor : alignment.backgroundColor; + }); + } + } + } + } + }, + + paintTiming() { + let modules = this.modules; + let { + timing + } = this.options; + + let timingPartLen = modules.length - 16; + for (let i = 0; i < timingPartLen; i++) { + var xItem = modules[6][8 + i]; + var yItem = modules[8 + i][6]; + xItem.type.push('timing'); + yItem.type.push('timing'); + xItem.color = (1 & i) ^ 1 ? timing.foregroundColor : timing.backgroundColor; + yItem.color = (1 & i) ^ 1 ? timing.foregroundColor : timing.backgroundColor; + } + }, + + paintDarkBlock() { + let modules = this.modules; + let size = this.moduleCount; + let { + darkBlock + } = this.options; + + //创建暗模块 + var darkBlockItem = modules[size - 7 - 1][8]; + darkBlockItem.type.push('darkBlock'); + darkBlockItem.color = darkBlock.color; + }, + + paintVersionInformation() { + let modules = this.modules; + let size = this.moduleCount; + let { + versionInformation, + typeNumber: version + } = this.options; + + if (version < 7) { + return modules; + } + //预留版本信息 0 为补位,预留版本信息 是从索引7开始 + const VERSIONS = [ + 0, + 0, + 0, + 0, + 0, + 0, + 0, + '000111110010010100', + '001000010110111100', + '001001101010011001', + '001010010011010011', + '001011101111110110', + '001100011101100010', + '001101100001000111', + '001110011000001101', + '001111100100101000', + '010000101101111000', + '010001010001011101', + '010010101000010111', + '010011010100110010', + '010100100110100110', + '010101011010000011', + '010110100011001001', + '010111011111101100', + '011000111011000100', + '011001000111100001', + '011010111110101011', + '011011000010001110', + '011100110000011010', + '011101001100111111', + '011110110101110101', + '011111001001010000', + '100000100111010101', + '100001011011110000', + '100010100010111010', + '100011011110011111', + '100100101100001011', + '100101010000101110', + '100110101001100100', + '100111010101000001', + '101000110001101001' + ]; + + //两种方式获取预留格式信息,临时计算或者查字典 + //let version_codes = _v.correctVersionData(_v.version); + let version_codes = VERSIONS[version] + VERSIONS[version]; + //创建预留版本信息 + let disc = [size - 11, size - 10, size - 9]; + // 左+右 + let version_cells = [ + //左 + [5, disc[2]], + [5, disc[1]], + [5, disc[0]], + [4, disc[2]], + [4, disc[1]], + [4, disc[0]], + [3, disc[2]], + [3, disc[1]], + [3, disc[0]], + [2, disc[2]], + [2, disc[1]], + [2, disc[0]], + [1, disc[2]], + [1, disc[1]], + [1, disc[0]], + [0, disc[2]], + [0, disc[1]], + [0, disc[0]], + //右 + [disc[2], 5], + [disc[1], 5], + [disc[0], 5], + [disc[2], 4], + [disc[1], 4], + [disc[0], 4], + [disc[2], 3], + [disc[1], 3], + [disc[0], 3], + [disc[2], 2], + [disc[1], 2], + [disc[0], 2], + [disc[2], 1], + [disc[1], 1], + [disc[0], 1], + [disc[2], 0], + [disc[1], 0], + [disc[0], 0] + ]; + version_cells.forEach((d, index) => { + var versionInformationItem = modules[d[0]][d[1]]; + versionInformationItem.type.push('versionInformation'); + versionInformationItem.color = version_codes[index] == '1' ? versionInformation.foregroundColor : versionInformation.backgroundColor; + }); + }, + + /** + * 绘制二维码方法 + */ + draw(options) { + options = uQRCode.deepReplace({ + drawBackground: { + before: () => {}, + after: () => {} + }, + drawBackgroundImage: { + before: () => {}, + after: () => {} + }, + drawForeground: { + before: () => {}, + after: () => {} + }, + drawForegroundImage: { + before: () => {}, + after: () => {} + } + }, options); + + /* 绘制层级关系,最底层背景 -> 背景图片 -> 前景 -> 最顶层前景图片 */ + return new Promise((resolve, reject) => { + let ctx = this.canvasContext; + + const startup = () => { + /* 同时绘制多个二维码时使用队列绘制,防止内部方法冲突导致绘制失败 */ + return uQRCode.Queue(() => new Promise((queueResolve, queueReject) => { + setTimeout(() => { + ctx.draw(false); // 第一个draw false可以清空画布 + queueResolve(); + }, 150); + })); + } + startup() + .then(() => { + /* 绘制背景 */ + return this.drawBackground({ + before: options.drawBackground.before, + after: options.drawBackground.after + }); + }) + .then(() => { + /* 绘制背景图片 */ + return this.drawBackgroundImage({ + before: options.drawBackgroundImage.before, + after: options.drawBackgroundImage.after + }); + }) + .then(() => { + /* 绘制前景 */ + return this.drawForeground({ + before: options.drawForeground.before, + after: options.drawForeground.after + }); + }) + .then(() => { + /* 绘制前景图片 */ + return this.drawForegroundImage({ + before: options.drawForegroundImage.before, + after: options.drawForegroundImage.after + }); + }) + .then(() => { + /* 完成绘制 */ + resolve(); + }); + }); + }, + + drawBackground({ + before, + after + }) { + let { + dynamicSize: size, + background + } = this.options; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + ctx.save(); + /* 填充背景色 */ + ctx.setFillStyle(background.color); + ctx.fillRect(0, 0, size, size); + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + + await after(this); + resolve(); + })(); + }); + }, + + drawBackgroundImage({ + before, + after + }) { + let { + dynamicSize: size, + background + } = this.options; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + if (background.image.src) { + ctx.save(); + + let x = 0; + let y = 0; + + let w = background.image.width * size; + let h = background.image.height * size; + let align = background.image.align; + let anchor = background.image.anchor; + let alpha = background.image.alpha; + + switch (align[0]) { + case 'left': + x = 0; + break; + case 'center': + x = size / 2 - w / 2; + break; + case 'right': + x = size - w; + break; + } + x += Number(anchor[0]); + + switch (align[1]) { + case 'top': + y = 0; + break; + case 'center': + y = size / 2 - h / 2; + break; + case 'bottom': + y = size - h; + break; + } + y += Number(anchor[1]); + + /* 设置透明度 */ + ctx.globalAlpha = alpha; + + /* 绘制图片 */ + const img = await this.loadImage(background.image.src); + ctx.drawImage(img, x, y, w, h); + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + } + + await after(this); + resolve(); + })(); + }); + }, + + drawForeground({ + before, + after + }) { + let { + background + } = this.options; + let modules = this.modules; + let moduleCount = this.moduleCount; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + ctx.save(); + for (var rowI = 0; rowI < moduleCount; rowI++) { + for (var colI = 0; colI < moduleCount; colI++) { + var tile = modules[rowI][colI]; + if (!tile.isDrawn && tile.color != background.color) { // 颜色不能与背景色一致,否则可能发生颜色重叠 + var color = tile.color; + ctx.setFillStyle(color); + ctx.fillRect(tile.x, tile.y, tile.size, tile.size); + tile.isDrawn = true; + } + } + } + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + + await after(this); + resolve(); + })(); + }); + }, + + drawForegroundImage({ + before, + after + }) { + let { + dynamicSize: size, + foreground + } = this.options; + let ctx = this.canvasContext; + + return new Promise((resolve, reject) => { + (async () => { + await before(this); + + if (foreground.image.src) { + ctx.save(); + + // 绘制前景图 + let x = 0; + let y = 0; + + let w = foreground.image.width * size; + let h = foreground.image.height * size; + let align = foreground.image.align; + let anchor = foreground.image.anchor; + let alpha = foreground.image.alpha; + let shadow = foreground.image.shadow; + let border = foreground.image.border; + + switch (align[0]) { + case 'left': + x = 0; + break; + case 'center': + x = size / 2 - w / 2; + break; + case 'right': + x = size - w; + break; + } + x += Number(anchor[0]); + + switch (align[1]) { + case 'top': + y = 0; + break; + case 'center': + y = size / 2 - h / 2; + break; + case 'bottom': + y = size - h; + break; + } + y += Number(anchor[1]); + + /* 绘制图片 */ + const img = await this.loadImage(foreground.image.src); + ctx.drawImage(img, x, y, w, h); + ctx.restore(); + ctx.draw(true); // gcanvas需要每一阶段都draw一下,否则重绘有问题,例如uni-app nvue绘制图片会失败 + } + + await after(this); + resolve(); + })(); + }); + } + + } + +})(); + +export default uQRCode; diff --git a/uni_modules/Sansnn-uQRCode/package.json b/uni_modules/Sansnn-uQRCode/package.json new file mode 100644 index 0000000..5966ddd --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/package.json @@ -0,0 +1,83 @@ +{ + "id": "Sansnn-uQRCode", + "displayName": "uQRCode 二维码生成插件 支持nvue 支持nodejs服务端", + "version": "3.2.2", + "description": "uQRCode 是一款使用方式简单,高扩展的二维码生成插件。支持全端生成,支持canvas的地方就可以使用uQRCode。", + "keywords": [ + "uQRCode", + "二维码", + "qrcode", + "qr" +], + "repository": "https://github.com/Sansnn/uQRCode", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/u-qrcode" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/Sansnn-uQRCode/readme.md b/uni_modules/Sansnn-uQRCode/readme.md new file mode 100644 index 0000000..e5935be --- /dev/null +++ b/uni_modules/Sansnn-uQRCode/readme.md @@ -0,0 +1,274 @@ +# uQRCode + +**点击群号加入群聊【uQRCode交流群】:[695070434](https://jq.qq.com/?_wv=1027&k=JRjzDqiw)** + +uQRCode 生成方式简单,可扩展性高,适用所有前端应用和Node.js服务端,可运行到所有支持canvas的平台。支持NVUE(NVUE中使用GCanvas)。 + +支持自定义二维码渲染规则,可通过uQRCode API得到矩阵信息后,自行实现canvas或view+css渲染二维码,如随机颜色、圆点、方块、块与块之间的间距等,详情参考示例项目。 + +### 插件市场 +[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287) + +### github +[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode) + +### npm +[https://www.npmjs.com/package/u-qrcode](https://www.npmjs.com/package/u-qrcode) + +### 示例预览 +[https://static-c15f4b57-ef97-4d2b-b939-f580f910d7e2.bspapp.com](https://static-c15f4b57-ef97-4d2b-b939-f580f910d7e2.bspapp.com) + +### 二维码 +**什么是QR码** + +QR码属于矩阵式二维码中的一个种类,由DENSO(日本电装)公司开发,由JIS和ISO将其标准化。 + +**QR码的特点** + +一是高速读取(QR就是取自“Quick Response”的首字母),通过摄像头从拍摄到解码到显示内容也就三秒左右,对摄像的角度也没有什么要求; + +二是高容量、高密度,理论上内容经过压缩处理后可以存7089个数字,4296个字母和数字混合字符,2953个8位字节数据,1817个汉字; + +三是支持纠错处理,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是: +- level L : 最大 7% 的错误能够被纠正; +- level M : 最大 15% 的错误能够被纠正; +- level Q : 最大 25% 的错误能够被纠正; +- level H : 最大 30% 的错误能够被纠正; + +四是结构化,看似无规则的图形,其实对区域有严格的定义。 + +更多二维码介绍及原理:[https://blog.csdn.net/jason_ldh/article/details/11801355](https://blog.csdn.net/jason_ldh/article/details/11801355) + +### 组件使用 + +导入`u-qrcode`组件后,在 `template` 中创建 `` 组件 + +```html + +``` + +### 属性说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|canvasId |String |- |- |是 |组件标识/canvasId | +|value |String |- |- |是 |二维码内容 | +|size |Number |- |354 |否 |二维码大小,默认单位px,rpx需要使用uni.upx2px()转换| +|options |Object |- |- |否 |参数可选项,详见下方options说明 | + +### 事件说明 +|事件名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|click |- |void |点击事件 | +|complete |- |Object |生成完成事件,返回值success: true表示生成成功,false生成失败 | + +### 方法说明 +|方法名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|remake |- |void |重新生成 | +|toTempFilePath |Object:callback|void |导出临时路径 | +|save |Object:callback|void |保存 | + +#### options说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|typeNumber |Number |- |-1 |否 |二维码版本 | +|errorCorrectLevel |String/Number|L/M/Q/H/1/0/3/2|H |否 |纠错等级L/M/Q/H分别对应1/0/3/2 | +|useDynamicSize |Boolean |- |false |否 |是否使用动态尺寸,可以去除二维码小块白色细线 | +|margin |Number |- |0 |否 |填充边距,默认单位px | +|background |Object |- |- |否 |背景设置,详见下方options.background说明 | +|foreground |Object |- |- |否 |前景设置,详见下方options.foreground说明 | +|positionDetection |Object |- |- |否 |定位角设置,详见下方options.positionDetection说明 | +|separator |Object |- |- |否 |分割图案设置,详见下方options.separator说明 | +|alignment |Object |- |- |否 |对齐图案设置,详见下方options.alignment说明 | +|timing |Object |- |- |否 |时序图案设置,详见下方options.timing说明 | +|darkBlock |Object |- |- |否 |暗块设置,详见下方options.darkBlock说明 | +|versionInformation |Object |- |- |否 |版本信息设置,详见下方options.versionInformation说明 | + +#### options.background说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |#FFFFFF|否 |背景色,若需要透明背景可设置为rgba(0,0,0,0)| +|image |Object |- |- |否 |背景图片设置,详见下方options.background.image说明| + +#### options.background.image说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|src |String |- |- |否 |背景图片路径 | +|width |Number |- |1 |否 |指定背景图片宽度,1为二维码size的100% | +|height |Number |- |1 |否 |指定背景图片高度,1为二维码size的100% | +|align |Array|['left'/'center'/'right', 'top'/'center'/'bottom'] |['center', 'center'] |否 |指定背景图片对齐方式,[0]为水平方位,[1]为垂直方位 | +|anchor |Array|- |[0, 0] |否 |指定背景图片锚点,[0]为X轴偏移量,[1]为Y轴偏移量 | +|alpha |Number |0-1 |1 |否 |指定背景图片透明度 | + +#### options.foreground说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |#FFFFFF|否 |前景色 | +|image |Object |- |- |否 |前景图片设置,详见下方options.foreground.image说明 | + +#### options.foreground.image说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|src |String |- |- |否 |前景图片路径 | +|width |Number |- |1/4 |否 |指定前景图片宽度,1为二维码size的100% | +|height |Number |- |1/4 |否 |指定前景图片高度,1为二维码size的100% | +|align |Array|['left'/'center'/'right', 'top'/'center'/'bottom'] |['center', 'center'] |否 |指定前景图片对齐方式,[0]为水平方位,[1]为垂直方位 | +|anchor |Array|- |[0, 0] |否 |指定前景图片锚点,[0]为X轴偏移量,[1]为Y轴偏移量 | + +#### options.positionDetection说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |定位角区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |定位角小块颜色,默认值跟随前景色 | + +#### options.separator说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |options.background.color |否 |分割区域颜色,默认值跟随背景色 | + +#### options.alignment说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |对齐区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |对齐小块颜色,默认值跟随前景色 | + +#### options.timing说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |时序区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |时序小块颜色,默认值跟随前景色 | + +#### options.darkBlock说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|color |String |- |options.foreground.color |否 |暗块颜色,默认值跟随前景色 | + +#### options.versionInformation说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|backgroundColor|String |- |options.background.color |否 |版本信息区域背景色,默认值跟随背景色 | +|foregroundColor|String |- |options.foreground.color |否 |版本信息小块颜色,默认值跟随前景色 | + +### u-qrcode.js使用 + +引入u-qrcode.js + +``` javascript +import uQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode'; +``` + +或者使用npm安装 + +> npm i u-qrcode + +``` javascript +import uQRCode from 'u-qrcode'; +``` + +nodejs引入 + +``` javascript +import uQRCode from 'u-qrcode/module'; +``` + +在 `template` 中创建 `` 组件并设置 `id`,画布宽高 + +```html + +``` + +在 `script` 中调用生成方法 + +```javascript +import uQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/u-qrcode'; + +export default { + data() { + return { + text: 'uQRCode', + size: 256 + } + }, + onReady() { + const ctx = uni.createCanvasContext('qrcode'); + const uqrcode = new uQRCode( + { + text: this.text, + size: this.size + }, + ctx + ); + uqrcode.make(); + uqrcode.draw(); + } +} +``` + +### new uQRCode(options, canvasContext, loadImage)说明 + +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|options |Object |- |- |是 |包含组件属性中的options的所有属性,详见下方options说明 | +|canvasContext|Object |- |- |是 |canvas绘画上下文 | +|loadImage |Promise|- |- |否 |绘制图片时,某些平台必传,例如微信小程序2d绘图需要创建Image对象,不能直接使用路径,这时就需要传入canvas.createImage给loadImage方法,否则无法绘制图片 | + +#### options说明,包含组件属性中的options的所有属性,下方仅列举未包含的属性,其余属性请移步到组件属性options说明查看 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|text |String |- |- |是 |二维码内容 | +|size |Number |- |354 |否 |二维码大小 | + +### uQRCode实例属性 +|属性名 |类型 |说明 | +|--- |--- |:--- | +|options |Object |实例化传入的选项值 | +|canvasContext|Object |画布实例 | +|makeData |Object |制作二维码全部数据 | +|modules |Array |制作二维码主要模块数据 | +|moduleCount |Number |模块数量 | + +### uQRCode实例方法 +|方法名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|make |- |void |制作二维码方法 | +|draw |options|Promise|绘制二维码方法,绘制层级关系,最底层背景 -> 背景图片 -> 前景 -> 最顶层前景图片,options见下方说明 | + +#### draw(options)说明 +|属性名 |类型 |可选值 |默认值 |是否必填 |说明 | +|--- |--- |--- |--- |--- |:--- | +|drawBackground |Object: {before, after}|- |- |否 |绘制背景前后可执行自定义方法before,after | +|drawBackgroundImage|Object: {before, after}|- |- |否 |绘制背景图前后可执行自定义方法before,after| +|drawForeground |Object: {before, after}|- |- |否 |绘制前景前后可执行自定义方法before,after | +|drawForegroundImage|Object: {before, after}|- |- |否 |绘制前景图前后可执行自定义方法before,after| + +### uQRCode静态属性 +|属性名 |类型 |说明 | +|--- |--- |:--- | +|errorCorrectLevel|Object |纠错等级 | +|defaults |Object |预设默认值 | + +### uQRCode静态方法 +|方法名 |参数 |返回值 |说明 | +|--- |--- |--- |:--- | +|deepReplace|o, r |替换后的新对象 |对象属性深度替换 | + +### 常见问题 + +**如何扫码跳转指定网页** + +二维码内容直接放入完整的网页地址即可,例如:`https://ext.dcloud.net.cn/plugin?id=1287`。微信客户端不能是ip地址。 + +**nvue打包后生成失败** + +Canvas是作为独立的模块,打包时需要选择使用Canvas模块才能正常使用相关的功能。 需要在manifest.json的代码视图中配置如下(暂时还不支持可视化界面操作): +```javascript +"app-plus" : { + /* 模块配置 */ + "modules" : { + "Canvas" : "nvue canvas" //使用Canvas模块 + }, + //... +}, +//... +``` +保存好提交云端打包。 diff --git a/uni_modules/hpy-form-select/changelog.md b/uni_modules/hpy-form-select/changelog.md new file mode 100644 index 0000000..01f2a3e --- /dev/null +++ b/uni_modules/hpy-form-select/changelog.md @@ -0,0 +1,2 @@ +## 0.0.10(2022-04-26) +- 适配uni-forms校验 diff --git a/uni_modules/hpy-form-select/components/hpy-form-select/hpy-form-select.vue b/uni_modules/hpy-form-select/components/hpy-form-select/hpy-form-select.vue new file mode 100644 index 0000000..78de734 --- /dev/null +++ b/uni_modules/hpy-form-select/components/hpy-form-select/hpy-form-select.vue @@ -0,0 +1,255 @@ + + + + + diff --git a/uni_modules/hpy-form-select/package.json b/uni_modules/hpy-form-select/package.json new file mode 100644 index 0000000..c40ce8a --- /dev/null +++ b/uni_modules/hpy-form-select/package.json @@ -0,0 +1,87 @@ +{ + "id": "hpy-form-select", + "displayName": "picker选择器、下拉框,选择器", + "version": "0.0.10", + "description": "下拉选择器 基于 picker 简单封装", + "keywords": [ + "picker", + "选择器", + "下拉选择" +], + "repository": "", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uni-load-more" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "u", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/hpy-form-select/readme.md b/uni_modules/hpy-form-select/readme.md new file mode 100644 index 0000000..30f721e --- /dev/null +++ b/uni_modules/hpy-form-select/readme.md @@ -0,0 +1,169 @@ + +## hpy-form-select 下拉选择器 基于 [picker](https://uniapp.dcloud.io/component/picker?id=picker) 简单封装 + +> **组件名:hpy-form-select + +从底部弹起的滚动选择器。支持五种选择器,通过mode来区分,分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通选择器 + +## API + +### FilePicker Props + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
属性名类型默认值说明
islotBoolean | Stringfalse是否使用插槽
titleString请选择默认标题
modeString选择模式selector | multiSelector
startString表示有效日期范围的开始,字符串格式为"YYYY-MM-DD"
endString表示有效日期范围的结束,字符串格式为"YYYY-MM-DD"
fieldsStringday有效值 year、month、day,表示选择器的粒度,默认为 day,App 端未配置此项时使用系统 UI
customItemString可为每一列的顶部添加一个自定义的项
dataListArray选择器数据
textString显示值的key
nameString保存值的key
v-model | valueArray | Object绑定的数据
disabledBoolean | Stringfalse是否禁用
hideBorderBoolean | Stringfalse是否隐藏边框
hideArrowBoolean | Stringfalse是否隐藏箭头
+ + +## 使用示例 +## dataList 为对象数组时,name为实际保存的value值,text为显示的值 +## dataList 为对象数组[{name:'张三', age:'18'}, {name:'李四', age:'19'}]时,需要设置name、text属性,name为实际保存的value值,text为显示的值 +## +## ====================================================================================================== +## dataList 为普通数组['张三', '李四'] name、text可不设置 +## +## 类似: +## + + +```html + + + + + + + + + + + + + + 可自定义显示 + + + + + + + +``` + +```javascript +export default { + data() { + return { + formData:{ + hobbySelect:'' + }, + hobbyList: [{ + text: '足球', + value: 1 + }, { + text: '篮球', + value: 2 + }, { + text: '游泳', + value: 3 + }], + } + }, + methods:{ + change(e){ + console.log(e.index); + console.log(e.value); + console.log(e.data); + } + } +} + +``` \ No newline at end of file diff --git a/uni_modules/mp-html/README.md b/uni_modules/mp-html/README.md new file mode 100644 index 0000000..f825383 --- /dev/null +++ b/uni_modules/mp-html/README.md @@ -0,0 +1,191 @@ +## 为减小组件包的大小,默认组件包中不包含编辑、latex 公式等扩展功能,需要使用扩展功能的请参考下方的 插件扩展 栏的说明 + +## 功能介绍 +- 全端支持(含 `v3、NVUE`) +- 支持丰富的标签(包括 `table`、`video`、`svg` 等) +- 支持丰富的事件效果(自动预览图片、链接处理等) +- 支持设置占位图(加载中、出错时、预览时) +- 支持锚点跳转、长按复制等丰富功能 +- 支持大部分 *html* 实体 +- 丰富的插件(关键词搜索、内容编辑、`latex` 公式等) +- 效率高、容错性强且轻量化 + +查看 [功能介绍](https://jin-yufeng.gitee.io/mp-html/#/overview/feature) 了解更多 + +## 使用方法 +- `uni_modules` 方式 + 1. 点击右上角的 `使用 HBuilder X 导入插件` 按钮直接导入项目或点击 `下载插件 ZIP` 按钮下载插件包并解压到项目的 `uni_modules/mp-html` 目录下 + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + + ``` + ```javascript + export default { + data() { + return { + html: '

' + } + } + } + ``` + 3. 需要更新版本时在 `HBuilder X` 中右键 `uni_modules/mp-html` 目录选择 `从插件市场更新` 即可 + +- 源码方式 + 1. 从 [github](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 或 [gitee](https://gitee.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 下载源码 + 插件市场的 **非 uni_modules 版本** 无法更新,不建议从插件市场获取 + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + ``` + ```javascript + import mpHtml from '@/components/mp-html/mp-html' + export default { + // HBuilderX 2.5.5+ 可以通过 easycom 自动引入 + components: { + mpHtml + }, + data() { + return { + html: '
Hello World!
' + } + } + } + ``` + +- npm 方式 + 1. 在项目根目录下执行 + ```bash + npm install mp-html + ``` + 2. 在需要使用页面的 `(n)vue` 文件中添加 + ```html + + ``` + ```javascript + import mpHtml from 'mp-html/dist/uni-app/components/mp-html/mp-html' + export default { + // 不可省略 + components: { + mpHtml + }, + data() { + return { + html: '
Hello World!
' + } + } + } + ``` + 3. 需要更新版本时执行以下命令即可 + ```bash + npm update mp-html + ``` + + 使用 *cli* 方式运行的项目,通过 *npm* 方式引入时,需要在 *vue.config.js* 中配置 *transpileDependencies*,详情可见 [#330](https://github.com/jin-yufeng/mp-html/issues/330#issuecomment-913617687) + 如果在 **nvue** 中使用还要将 `dist/uni-app/static` 目录下的内容拷贝到项目的 `static` 目录下,否则无法运行 + +查看 [快速开始](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart) 了解更多 + +## 组件属性 + +| 属性 | 类型 | 默认值 | 说明 | +|:---:|:---:|:---:|---| +| container-style | String | | 容器的样式([2.1.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v210)) | +| content | String | | 用于渲染的 html 字符串 | +| copy-link | Boolean | true | 是否允许外部链接被点击时自动复制 | +| domain | String | | 主域名(用于链接拼接) | +| error-img | String | | 图片出错时的占位图链接 | +| lazy-load | Boolean | false | 是否开启图片懒加载 | +| loading-img | String | | 图片加载过程中的占位图链接 | +| pause-video | Boolean | true | 是否在播放一个视频时自动暂停其他视频 | +| preview-img | Boolean | true | 是否允许图片被点击时自动预览 | +| scroll-table | Boolean | false | 是否给每个表格添加一个滚动层使其能单独横向滚动 | +| selectable | Boolean | false | 是否开启文本长按复制 | +| set-title | Boolean | true | 是否将 title 标签的内容设置到页面标题 | +| show-img-menu | Boolean | true | 是否允许图片被长按时显示菜单 | +| tag-style | Object | | 设置标签的默认样式 | +| use-anchor | Boolean | false | 是否使用锚点链接 | + +查看 [属性](https://jin-yufeng.gitee.io/mp-html/#/basic/prop) 了解更多 + +## 组件事件 + +| 名称 | 触发时机 | +|:---:|---| +| load | dom 树加载完毕时 | +| ready | 图片加载完毕时 | +| error | 发生渲染错误时 | +| imgtap | 图片被点击时 | +| linktap | 链接被点击时 | +| play | 音视频播放时 | + +查看 [事件](https://jin-yufeng.gitee.io/mp-html/#/basic/event) 了解更多 + +## api +组件实例上提供了一些 `api` 方法可供调用 + +| 名称 | 作用 | +|:---:|---| +| in | 将锚点跳转的范围限定在一个 scroll-view 内 | +| navigateTo | 锚点跳转 | +| getText | 获取文本内容 | +| getRect | 获取富文本内容的位置和大小 | +| setContent | 设置富文本内容 | +| imgList | 获取所有图片的数组 | +| pauseMedia | 暂停播放音视频([2.2.2+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v222)) | +| setPlaybackRate | 设置音视频播放速率([2.4.0+](https://jin-yufeng.gitee.io/mp-html/#/changelog/changelog#v240)) | + +查看 [api](https://jin-yufeng.gitee.io/mp-html/#/advanced/api) 了解更多 + +## 插件扩展 +除基本功能外,本组件还提供了丰富的扩展,可按照需要选用 + +| 名称 | 作用 | +|:---:|---| +| audio | 音乐播放器 | +| editable | 富文本 **编辑**([示例项目](https://mp-html.oss-cn-hangzhou.aliyuncs.com/editable.zip)) | +| emoji | 解析 emoji | +| highlight | 代码块高亮显示 | +| markdown | 渲染 markdown | +| search | 关键词搜索 | +| style | 匹配 style 标签中的样式 | +| txv-video | 使用腾讯视频 | +| img-cache | 图片缓存 by [@PentaTea](https://github.com/PentaTea) | +| latex | 渲染 latex 公式 by [@Zeng-J](https://github.com/Zeng-J) | + +从插件市场导入的包中 **不含有** 扩展插件,使用插件需通过微信小程序 `富文本插件` 获取或参考以下方法进行打包: +1. 获取完整组件包 + ```bash + npm install mp-html + ``` +2. 编辑 `tools/config.js` 中的 `plugins` 项,选择需要的插件 +3. 生成新的组件包 + 在 `node_modules/mp-html` 目录下执行 + ```bash + npm install + npm run build:uni-app + ``` +4. 拷贝 `dist/uni-app` 中的内容到项目根目录 + +查看 [插件](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin) 了解更多 + +## 关于 nvue +`nvue` 使用原生渲染,不支持部分 `css` 样式,为实现和 `html` 相同的效果,组件内部通过 `web-view` 进行渲染,性能上差于原生,根据 `weex` 官方建议,`web` 标签仅应用在非常规的降级场景。因此,如果通过原生的方式(如 `richtext`)能够满足需要,则不建议使用本组件,如果有较多的富文本内容,则可以直接使用 `vue` 页面 +由于渲染方式与其他端不同,有以下限制: +1. 不支持 `lazy-load` 属性 +2. 视频不支持全屏播放 +3. 如果在 `flex-direction: row` 的容器中使用,需要给组件设置宽度或设置 `flex: 1` 占满剩余宽度 + +纯 `nvue` 模式下,[此问题](https://ask.dcloud.net.cn/question/119678) 修复前,不支持通过 `uni_modules` 引入,需要本地引入(将 [dist/uni-app](https://github.com/jin-yufeng/mp-html/tree/master/dist/uni-app) 中的内容拷贝到项目根目录下) + +## 立即体验 +![富文本插件](https://mp-html.oss-cn-hangzhou.aliyuncs.com/qrcode.jpg) + +## 问题反馈 +遇到问题时,请先查阅 [常见问题](https://jin-yufeng.gitee.io/mp-html/#/question/faq) 和 [issue](https://github.com/jin-yufeng/mp-html/issues) 中是否已有相同的问题 +可通过 [issue](https://github.com/jin-yufeng/mp-html/issues/new/choose) 、插件问答或发送邮件到 [mp_html@126.com](mailto:mp_html@126.com) 提问,不建议在评论区提问(不方便回复) +提问请严格按照 [issue 模板](https://github.com/jin-yufeng/mp-html/issues/new/choose) ,描述清楚使用环境、`html` 内容或可复现的 `demo` 项目以及复现方式,对于 **描述不清**、**无法复现** 或重复的问题将不予回复 + +欢迎加入 `QQ` 交流群:`699734691` + +查看 [问题反馈](https://jin-yufeng.gitee.io/mp-html/#/question/feedback) 了解更多 diff --git a/uni_modules/mp-html/changelog.md b/uni_modules/mp-html/changelog.md new file mode 100644 index 0000000..51d049e --- /dev/null +++ b/uni_modules/mp-html/changelog.md @@ -0,0 +1,121 @@ +## v2.4.1(2022-12-25) +1. `F` 修复了没有图片时 `ready` 事件可能不触发的问题 +2. `F` 修复了加载过程中可能出现 `Root label not found` 错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/470) +3. `F` 修复了 `audio` 插件退出页面可能会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/457) +4. `F` 修复了 `vue3` 运行到 `app` 在 `HBuilder X 3.6.10` 以上报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/480) +5. `F` 修复了 `nvue` 端链接中包含 `%22` 时可能无法显示的问题 +6. `F` 修复了 `vue3` 使用 `highlight` 插件可能报错的问题 +## v2.4.0(2022-08-27) +1. `A` 增加了 [setPlaybackRate](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#setPlaybackRate) 的 `api`,可以设置音视频的播放速率 [详细](https://github.com/jin-yufeng/mp-html/issues/452) +2. `A` 示例小程序代码开源 [详细](https://github.com/jin-yufeng/mp-html-demo) +3. `U` 优化 `ready` 事件触发时机,未设置懒加载的情况下基本可以准确触发 [详细](https://github.com/jin-yufeng/mp-html/issues/195) +4. `U` `highlight` 插件在编辑状态下不进行高亮处理,便于编辑 +5. `F` 修复了 `flex` 布局下图片大小可能不正确的问题 +6. `F` 修复了 `selectable` 属性没有设置 `force` 也可能出现渲染异常的问题 +7. `F` 修复了表格中的图片大小可能不正确的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/448) +8. `F` 修复了含有合并单元格的表格可能无法设置竖直对齐的问题 +9. `F` 修复了 `editable` 插件在 `scroll-view` 中使用时工具条位置可能不正确的问题 +10. `F` 修复了 `vue3` 使用 [search](advanced/plugin#search) 插件可能导致错误换行的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/449) +## v2.3.2(2022-08-13) +1. `A` 增加 [latex](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#latex) 插件,可以渲染数学公式 [详细](https://github.com/jin-yufeng/mp-html/pull/447) by [@Zeng-J](https://github.com/Zeng-J) +2. `U` 优化根节点下有很多标签的长内容渲染速度 +3. `U` `highlight` 插件适配 `lang-xxx` 格式 +4. `F` 修复了 `table` 标签设置 `border` 属性后可能无法修改边框样式的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/439) by [@zouxingjie](https://github.com/zouxingjie) +5. `F` 修复了 `editable` 插件输入连续空格无效的问题 +6. `F` 修复了 `vue3` 图片设置 `inline` 会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/438) +7. `F` 修复了 `vue3` 使用 `table` 可能报错的问题 +## v2.3.1(2022-05-20) +1. `U` `app` 端支持使用本地图片 +2. `U` 优化了微信小程序 `selectable` 属性在 `ios` 端的处理 [详细](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) +3. `F` 修复了 `editable` 插件不在顶部时 `tooltip` 位置可能错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/430) +4. `F` 修复了 `vue3` 运行到微信小程序可能报错丢失内容的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/414) +5. `F` 修复了 `vue3` 部分标签可能被错误换行的问题 +6. `F` 修复了 `editable` 插件 `app` 端插入视频无法预览的问题 +## v2.3.0(2022-04-01) +1. `A` 增加了 `play` 事件,音视频播放时触发,可用于与页面其他音视频进行互斥播放 [详细](basic/event#play) +2. `U` `show-img-menu` 属性支持控制预览时是否长按弹出菜单 +3. `U` 优化 `wxs` 处理,提高渲染性能 [详细](https://developers.weixin.qq.com/community/develop/article/doc/0006cc2b204740f601bd43fa25a413) +4. `U` `video` 标签支持 `object-fit` 属性 +5. `U` 增加支持一些常用实体编码 [详细](https://github.com/jin-yufeng/mp-html/issues/418) +6. `F` 修复了图片仅设置高度可能不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/410) +7. `F` 修复了 `video` 标签高度设置为 `auto` 不显示的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/411) +8. `F` 修复了使用 `grid` 布局时可能样式错误的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/413) +9. `F` 修复了含有合并单元格的表格部分情况下显示异常的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/417) +10. `F` 修复了 `editable` 插件连续插入内容时顺序不正确的问题 +11. `F` 修复了 `uni-app` 包 `vue3` 使用 `audio` 插件报错的问题 +12. `F` 修复了 `uni-app` 包 `highlight` 插件使用自定义的 `prism.min.js` 报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/416) +## v2.2.2(2022-02-26) +1. `A` 增加了 [pauseMedia](https://jin-yufeng.gitee.io/mp-html/#/advanced/api#pauseMedia) 的 `api`,可用于暂停播放音视频 [详细](https://github.com/jin-yufeng/mp-html/issues/317) +2. `U` 优化了长内容的加载速度 +3. `U` 适配 `vue3` [#389](https://github.com/jin-yufeng/mp-html/issues/389)、[#398](https://github.com/jin-yufeng/mp-html/pull/398) by [@zhouhuafei](https://github.com/zhouhuafei)、[#400](https://github.com/jin-yufeng/mp-html/issues/400) +4. `F` 修复了小程序端图片高度设置为百分比时可能不显示的问题 +5. `F` 修复了 `highlight` 插件部分情况下可能显示不完整的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/403) +## v2.2.1(2021-12-24) +1. `A` `editable` 插件增加上下移动标签功能 +2. `U` `editable` 插件支持在文本中间光标处插入内容 +3. `F` 修复了 `nvue` 端设置 `margin` 后可能导致高度不正确的问题 +4. `F` 修复了 `highlight` 插件使用压缩版的 `prism.css` 可能导致背景失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/367) +5. `F` 修复了编辑状态下使用 `emoji` 插件内容为空时可能报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/371) +6. `F` 修复了使用 `editable` 插件后将 `selectable` 属性设置为 `force` 不生效的问题 +## v2.2.0(2021-10-12) +1. `A` 增加 `customElements` 配置项,便于添加自定义功能性标签 [详细](https://github.com/jin-yufeng/mp-html/issues/350) +2. `A` `editable` 插件增加切换音视频自动播放状态的功能 [详细](https://github.com/jin-yufeng/mp-html/pull/341) by [@leeseett](https://github.com/leeseett) +3. `A` `editable` 插件删除媒体标签时触发 `remove` 事件,便于删除已上传的文件 +4. `U` `editable` 插件 `insertImg` 方法支持同时插入多张图片 [详细](https://github.com/jin-yufeng/mp-html/issues/342) +5. `U` `editable` 插入图片和音视频时支持拼接 `domian` 主域名 +6. `F` 修复了内部链接参数中包含 `://` 时被认为是外部链接的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/356) +7. `F` 修复了部分 `svg` 标签名或属性名大小写不正确时不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/351) +8. `F` 修复了 `nvue` 页面运行到非 `app` 平台时可能样式错误的问题 +## v2.1.5(2021-08-13) +1. `A` 增加支持标签的 `dir` 属性 +2. `F` 修复了 `ruby` 标签文字与拼音没有居中对齐的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/325) +3. `F` 修复了音视频标签内有 `a` 标签时可能无法播放的问题 +4. `F` 修复了 `externStyle` 中的 `class` 名包含下划线或数字时可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326) +5. `F` 修复了 `h5` 端引入 `externStyle` 可能不生效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/326) +## v2.1.4(2021-07-14) +1. `F` 修复了 `rt` 标签无法设置样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/318) +2. `F` 修复了表格中有单元格同时合并行和列时可能显示不正确的问题 +3. `F` 修复了 `app` 端无法关闭图片长按菜单的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/322) +4. `F` 修复了 `editable` 插件只能添加图片链接不能修改的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/312) by [@leeseett](https://github.com/leeseett) +## v2.1.3(2021-06-12) +1. `A` `editable` 插件增加 `insertTable` 方法 +2. `U` `editable` 插件支持编辑表格中的空白单元格 [详细](https://github.com/jin-yufeng/mp-html/issues/310) +3. `F` 修复了 `externStyle` 中使用伪类可能失效的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/298) +4. `F` 修复了多个组件同时使用时 `tag-style` 属性时可能互相影响的问题 [详细](https://github.com/jin-yufeng/mp-html/pull/305) by [@woodguoyu](https://github.com/woodguoyu) +5. `F` 修复了包含 `linearGradient` 的 `svg` 可能无法显示的问题 +6. `F` 修复了编译到头条小程序时可能报错的问题 +7. `F` 修复了 `nvue` 端不触发 `click` 事件的问题 +8. `F` 修复了 `editable` 插件尾部插入时无法撤销的问题 +9. `F` 修复了 `editable` 插件的 `insertHtml` 方法只能在末尾插入的问题 +10. `F` 修复了 `editable` 插件插入音频不显示的问题 +## v2.1.2(2021-04-24) +1. `A` 增加了 [img-cache](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#img-cache) 插件,可以在 `app` 端缓存图片 [详细](https://github.com/jin-yufeng/mp-html/issues/292) by [@PentaTea](https://github.com/PentaTea) +2. `U` 支持通过 `container-style` 属性设置 `white-space` 来保留连续空格和换行符 [详细](https://jin-yufeng.gitee.io/mp-html/#/question/faq#space) +3. `U` 代码风格符合 [standard](https://standardjs.com) 标准 +4. `U` `editable` 插件编辑状态下支持预览视频 [详细](https://github.com/jin-yufeng/mp-html/issues/286) +5. `F` 修复了 `svg` 标签内嵌 `svg` 时无法显示的问题 +6. `F` 修复了编译到支付宝和头条小程序时部分区域不可复制的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/291) +## v2.1.1(2021-04-09) +1. 修复了对 `p` 标签设置 `tag-style` 可能不生效的问题 +2. 修复了 `svg` 标签中的文本无法显示的问题 +3. 修复了使用 `editable` 插件编辑表格时可能报错的问题 +4. 修复了使用 `highlight` 插件运行到头条小程序时可能没有样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/280) +5. 修复了使用 `editable` 插件 `editable` 属性为 `false` 时会报错的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/284) +6. 修复了 `style` 插件连续子选择器失效的问题 +7. 修复了 `editable` 插件无法修改图片和字体大小的问题 +## v2.1.0.2(2021-03-21) +修复了 `nvue` 端使用可能报错的问题 +## v2.1.0(2021-03-20) +1. `A` 增加了 [container-style](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#container-style) 属性 [详细](https://gitee.com/jin-yufeng/mp-html/pulls/1) +2. `A` 增加支持 `strike` 标签 +3. `A` `editable` 插件增加 `placeholder` 属性 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable) +4. `A` `editable` 插件增加 `insertHtml` 方法 [详细](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#editable) +5. `U` 外部样式支持标签名选择器 [详细](https://jin-yufeng.gitee.io/mp-html/#/overview/quickstart#setting) +6. `F` 修复了 `nvue` 端部分情况下可能不显示的问题 +## v2.0.5(2021-03-12) +1. `U` [linktap](https://jin-yufeng.gitee.io/mp-html/#/basic/event#linktap) 事件增加返回内部文本内容 `innerText` [详细](https://github.com/jin-yufeng/mp-html/issues/271) +2. `U` [selectable](https://jin-yufeng.gitee.io/mp-html/#/basic/prop#selectable) 属性设置为 `force` 时能够在微信 `iOS` 端生效(文本块会变成 `inline-block`) [详细](https://github.com/jin-yufeng/mp-html/issues/267) +3. `F` 修复了部分情况下竖向无法滚动的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/182) +4. `F` 修复了多次修改富文本数据时部分内容可能不显示的问题 +5. `F` 修复了 [腾讯视频](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#txv-video) 插件可能无法播放的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/265) +6. `F` 修复了 [highlight](https://jin-yufeng.gitee.io/mp-html/#/advanced/plugin#highlight) 插件没有设置高亮语言时没有应用默认样式的问题 [详细](https://github.com/jin-yufeng/mp-html/issues/276) by [@fuzui](https://github.com/fuzui) diff --git a/uni_modules/mp-html/components/mp-html/mp-html.vue b/uni_modules/mp-html/components/mp-html/mp-html.vue new file mode 100644 index 0000000..a9b5dec --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/mp-html.vue @@ -0,0 +1,498 @@ + + + + + diff --git a/uni_modules/mp-html/components/mp-html/node/node.vue b/uni_modules/mp-html/components/mp-html/node/node.vue new file mode 100644 index 0000000..372bcd1 --- /dev/null +++ b/uni_modules/mp-html/components/mp-html/node/node.vue @@ -0,0 +1,576 @@ +