From 71e5f0660580a5a9cbd76cb39ca8cc29f516246b Mon Sep 17 00:00:00 2001 From: clibing Date: Mon, 2 Oct 2023 14:34:22 +0800 Subject: [PATCH] fix(code): code code Signed-off-by: clibing --- .DS_Store | Bin 6148 -> 6148 bytes LICENSE | 21 + README.md | 106 ++ components/u-action-sheet/u-action-sheet.vue | 190 +++ components/u-alert-tips/u-alert-tips.vue | 256 ++++ .../u-avatar-cropper/u-avatar-cropper.vue | 290 ++++ components/u-avatar-cropper/weCropper.js | 1265 +++++++++++++++ components/u-avatar/u-avatar.vue | 244 +++ components/u-back-top/u-back-top.vue | 153 ++ components/u-badge/u-badge.vue | 216 +++ components/u-button/u-button.vue | 596 ++++++++ components/u-calendar/u-calendar.vue | 643 ++++++++ components/u-car-keyboard/u-car-keyboard.vue | 257 ++++ components/u-card/u-card.vue | 299 ++++ components/u-cell-group/u-cell-group.vue | 70 + components/u-cell-item/u-cell-item.vue | 316 ++++ .../u-checkbox-group/u-checkbox-group.vue | 123 ++ components/u-checkbox/u-checkbox.vue | 284 ++++ .../u-circle-progress/u-circle-progress.vue | 220 +++ .../u-line-progress/u-line-progress.vue | 147 ++ components/u-col/u-col.vue | 156 ++ .../u-collapse-item/u-collapse-item.vue | 205 +++ components/u-collapse/u-collapse.vue | 99 ++ .../u-column-notice/u-column-notice.vue | 237 +++ components/u-count-down/u-count-down.vue | 318 ++++ components/u-count-to/u-count-to.vue | 241 +++ components/u-divider/u-divider.vue | 153 ++ .../u-dropdown-item/u-dropdown-item.vue | 132 ++ components/u-dropdown/u-dropdown.vue | 298 ++++ components/u-empty/u-empty.vue | 193 +++ components/u-field/u-field.vue | 384 +++++ components/u-form-item/u-form-item.vue | 431 ++++++ components/u-form/u-form.vue | 134 ++ components/u-full-screen/u-full-screen.vue | 52 + components/u-gap/u-gap.vue | 54 + components/u-grid-item/u-grid-item.vue | 126 ++ components/u-grid/u-grid.vue | 108 ++ components/u-icon/u-icon.vue | 336 ++++ components/u-image/u-image.vue | 268 ++++ components/u-index-anchor/u-index-anchor.vue | 89 ++ components/u-index-list/u-index-list.vue | 315 ++++ components/u-input/u-input.vue | 394 +++++ components/u-keyboard/u-keyboard.vue | 217 +++ components/u-lazy-load/u-lazy-load.vue | 244 +++ .../u-line-progress/u-line-progress.vue | 147 ++ components/u-line/u-line.vue | 84 + components/u-link/u-link.vue | 89 ++ components/u-loading-page/u-loading-page.vue | 25 + components/u-loading/u-loading.vue | 103 ++ components/u-loadmore/u-loadmore.vue | 203 +++ components/u-mask/u-mask.vue | 123 ++ .../u-message-input/u-message-input.vue | 311 ++++ components/u-modal/u-modal.vue | 283 ++++ components/u-navbar/u-navbar.vue | 315 ++++ components/u-no-network/u-no-network.vue | 233 +++ components/u-notice-bar/u-notice-bar.vue | 272 ++++ components/u-number-box/u-number-box.vue | 363 +++++ .../u-number-keyboard/u-number-keyboard.vue | 158 ++ components/u-parse/libs/CssHandler.js | 100 ++ components/u-parse/libs/MpHtmlParser.js | 580 +++++++ components/u-parse/libs/config.js | 80 + components/u-parse/libs/handler.wxs | 22 + components/u-parse/libs/trees.vue | 505 ++++++ components/u-parse/u-parse.vue | 645 ++++++++ components/u-picker/u-picker.vue | 676 ++++++++ components/u-popup/u-popup.vue | 456 ++++++ components/u-radio-group/u-radio-group.vue | 128 ++ components/u-radio/u-radio.vue | 271 ++++ components/u-rate/u-rate.vue | 275 ++++ components/u-read-more/u-read-more.vue | 179 +++ components/u-row-notice/u-row-notice.vue | 269 ++++ components/u-row/u-row.vue | 84 + components/u-search/u-search.vue | 342 +++++ components/u-section/u-section.vue | 154 ++ components/u-select/u-select.vue | 420 +++++ components/u-skeleton/u-skeleton.vue | 199 +++ components/u-slider/u-slider.vue | 257 ++++ components/u-steps/u-steps.vue | 200 +++ components/u-sticky/u-sticky.vue | 157 ++ components/u-subsection/u-subsection.vue | 355 +++++ components/u-swipe-action/u-swipe-action.vue | 255 ++++ components/u-swiper/u-swiper.vue | 340 +++++ components/u-switch/u-switch.vue | 163 ++ components/u-tabbar/u-tabbar.vue | 330 ++++ components/u-table/u-table.vue | 84 + components/u-tabs-swiper/u-tabs-swiper.vue | 488 ++++++ components/u-tabs/u-tabs.vue | 369 +++++ components/u-tag/u-tag.vue | 294 ++++ components/u-td/u-td.vue | 66 + components/u-th/u-th.vue | 62 + .../u-time-line-item/u-time-line-item.vue | 83 + components/u-time-line/u-time-line.vue | 43 + components/u-toast/u-toast.vue | 220 +++ components/u-top-tips/u-top-tips.vue | 121 ++ components/u-tr/u-tr.vue | 25 + components/u-upload/u-upload.vue | 657 ++++++++ .../u-verification-code.vue | 164 ++ components/u-waterfall/u-waterfall.vue | 176 +++ components/uview-v1/uview-v1.vue | 0 iconfont.css | 910 +++++++++++ index.js | 141 ++ index.scss | 23 + libs/config/config.js | 15 + libs/config/zIndex.js | 20 + libs/css/color.scss | 155 ++ libs/css/common.scss | 176 +++ libs/css/style.components.scss | 7 + libs/css/style.h5.scss | 8 + libs/css/style.mp.scss | 72 + libs/css/style.nvue.scss | 3 + libs/css/style.vue.scss | 175 +++ libs/function/$parent.js | 18 + libs/function/addUnit.js | 8 + libs/function/bem.js | 5 + libs/function/color.js | 37 + libs/function/colorGradient.js | 134 ++ libs/function/debounce.js | 29 + libs/function/deepClone.js | 23 + libs/function/deepMerge.js | 30 + libs/function/getParent.js | 47 + libs/function/guid.js | 41 + libs/function/md5.js | 385 +++++ libs/function/queryParams.js | 58 + libs/function/random.js | 10 + libs/function/randomArray.js | 7 + libs/function/route.js | 122 ++ libs/function/sys.js | 9 + libs/function/test.js | 232 +++ libs/function/throttle.js | 32 + libs/function/timeFormat.js | 51 + libs/function/timeFrom.js | 47 + libs/function/toast.js | 9 + libs/function/trim.js | 15 + libs/function/type2icon.js | 35 + libs/mixin/mixin.js | 64 + libs/mixin/mpShare.js | 18 + libs/request/index.js | 169 ++ libs/store/index.js | 19 + libs/util/area.js | 1 + libs/util/async-validator.js | 1356 +++++++++++++++++ libs/util/city.js | 1 + libs/util/emitter.js | 51 + libs/util/province.js | 1 + main.js | 14 +- manifest.json | 10 +- package.json | 31 + .../add_irrigation_group.vue | 2 +- pages/editSite/editSite.vue | 8 +- .../fertilizer_machine/fertilizer_machine.vue | 36 +- pages/login/login.vue | 12 +- .../preciseWaterAndFertilizer.vue | 4 +- pages/siteAdmin/siteAdmin.vue | 2 +- .../target_water_fertilizer_PH.vue | 6 +- pages/timeEnvironment/timeEnvironment.vue | 54 +- pages/timeVideo/timeVideo.vue | 8 +- pages/userCenter/userCenter.vue | 24 +- pages/videoLive/videoLive.vue | 36 +- project.config.json | 3 +- theme.scss | 38 + unpackage/.DS_Store | Bin 6148 -> 6148 bytes .../.sourcemap/mp-weixin/common/main.js.map | 2 +- .../.sourcemap/mp-weixin/common/vendor.js.map | 2 +- .../components/u-avatar/u-avatar.js.map | 2 +- .../components/u-button/u-button.js.map | 2 +- .../components/u-checkbox/u-checkbox.js.map | 2 +- .../components/u-field/u-field.js.map | 2 +- .../components/u-form-item/u-form-item.js.map | 2 +- .../uview-ui/components/u-form/u-form.js.map | 2 +- .../uview-ui/components/u-icon/u-icon.js.map | 2 +- .../components/u-input/u-input.js.map | 2 +- .../uview-ui/components/u-mask/u-mask.js.map | 2 +- .../components/u-navbar/u-navbar.js.map | 2 +- .../components/u-popup/u-popup.js.map | 2 +- .../components/u-toast/u-toast.js.map | 2 +- .../add_irrigation_group.js.map | 2 +- .../change_password/change_password.js.map | 2 +- .../mp-weixin/pages/editSite/editSite.js.map | 2 +- .../fertilizer_machine.js.map | 2 +- .../greenhouseDevice/greenhouseDevice.js.map | 2 +- .../mp-weixin/pages/login/login.js.map | 2 +- .../preciseWaterAndFertilizer.js.map | 2 +- .../pages/siteAdmin/siteAdmin.js.map | 2 +- .../target_water_fertilizer_PH.js.map | 2 +- .../timeEnvironment/timeEnvironment.js.map | 2 +- .../pages/timeVideo/timeVideo.js.map | 2 +- .../pages/userCenter/userCenter.js.map | 2 +- .../pages/videoLive/videoLive.js.map | 2 +- .../qiun-data-charts/qiun-data-charts.js.map | 2 +- .../components/qiun-error/qiun-error.js.map | 2 +- .../components/qiun-loading/loading1.js.map | 2 +- .../components/qiun-loading/loading2.js.map | 2 +- .../components/qiun-loading/loading3.js.map | 2 +- .../components/qiun-loading/loading4.js.map | 2 +- .../components/qiun-loading/loading5.js.map | 2 +- .../qiun-loading/qiun-loading.js.map | 2 +- unpackage/dist/dev/mp-weixin/.DS_Store | Bin 8196 -> 8196 bytes unpackage/dist/dev/mp-weixin/common/main.js | 68 +- unpackage/dist/dev/mp-weixin/common/vendor.js | 1006 ++++++------ .../uview-ui/components/u-avatar/u-avatar.js | 72 +- .../uview-ui/components/u-button/u-button.js | 72 +- .../components/u-checkbox/u-checkbox.js | 72 +- .../uview-ui/components/u-field/u-field.js | 72 +- .../components/u-form-item/u-form-item.js | 72 +- .../uview-ui/components/u-form/u-form.js | 72 +- .../uview-ui/components/u-icon/u-icon.js | 72 +- .../uview-ui/components/u-input/u-input.js | 72 +- .../uview-ui/components/u-mask/u-mask.js | 72 +- .../uview-ui/components/u-navbar/u-navbar.js | 72 +- .../uview-ui/components/u-popup/u-popup.js | 72 +- .../uview-ui/components/u-toast/u-toast.js | 72 +- .../add_irrigation_group.js | 78 +- .../add_irrigation_group.wxml | 2 +- .../pages/change_password/change_password.js | 78 +- .../dev/mp-weixin/pages/editSite/editSite.js | 78 +- .../mp-weixin/pages/editSite/editSite.wxml | 2 +- .../fertilizer_machine/fertilizer_machine.js | 90 +- .../fertilizer_machine.wxml | 2 +- .../greenhouseDevice/greenhouseDevice.js | 58 +- .../dist/dev/mp-weixin/pages/login/login.js | 84 +- .../dist/dev/mp-weixin/pages/login/login.wxml | 2 +- .../preciseWaterAndFertilizer.js | 78 +- .../preciseWaterAndFertilizer.wxml | 2 +- .../mp-weixin/pages/siteAdmin/siteAdmin.js | 78 +- .../mp-weixin/pages/siteAdmin/siteAdmin.wxml | 2 +- .../target_water_fertilizer_PH.js | 78 +- .../target_water_fertilizer_PH.wxml | 2 +- .../pages/timeEnvironment/timeEnvironment.js | 116 +- .../timeEnvironment/timeEnvironment.wxml | 2 +- .../mp-weixin/pages/timeVideo/timeVideo.js | 78 +- .../mp-weixin/pages/timeVideo/timeVideo.wxml | 2 +- .../mp-weixin/pages/userCenter/userCenter.js | 80 +- .../pages/userCenter/userCenter.wxml | 2 +- .../mp-weixin/pages/videoLive/videoLive.js | 78 +- .../mp-weixin/pages/videoLive/videoLive.wxml | 2 +- .../dist/dev/mp-weixin/project.config.json | 5 +- .../dev/mp-weixin/project.private.config.json | 2 +- unpackage/dist/dev/mp-weixin/static/.DS_Store | Bin 6148 -> 0 bytes .../qiun-data-charts/qiun-data-charts.js | 80 +- .../components/qiun-error/qiun-error.js | 72 +- .../components/qiun-loading/loading1.js | 72 +- .../components/qiun-loading/loading2.js | 72 +- .../components/qiun-loading/loading3.js | 72 +- .../components/qiun-loading/loading4.js | 72 +- .../components/qiun-loading/loading5.js | 72 +- .../components/qiun-loading/qiun-loading.js | 52 +- 245 files changed, 30671 insertions(+), 1922 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 components/u-action-sheet/u-action-sheet.vue create mode 100644 components/u-alert-tips/u-alert-tips.vue create mode 100644 components/u-avatar-cropper/u-avatar-cropper.vue create mode 100644 components/u-avatar-cropper/weCropper.js create mode 100644 components/u-avatar/u-avatar.vue create mode 100644 components/u-back-top/u-back-top.vue create mode 100644 components/u-badge/u-badge.vue create mode 100644 components/u-button/u-button.vue create mode 100644 components/u-calendar/u-calendar.vue create mode 100644 components/u-car-keyboard/u-car-keyboard.vue create mode 100644 components/u-card/u-card.vue create mode 100644 components/u-cell-group/u-cell-group.vue create mode 100644 components/u-cell-item/u-cell-item.vue create mode 100644 components/u-checkbox-group/u-checkbox-group.vue create mode 100644 components/u-checkbox/u-checkbox.vue create mode 100644 components/u-circle-progress/u-circle-progress.vue create mode 100644 components/u-circle-progress/u-line-progress/u-line-progress.vue create mode 100644 components/u-col/u-col.vue create mode 100644 components/u-collapse-item/u-collapse-item.vue create mode 100644 components/u-collapse/u-collapse.vue create mode 100644 components/u-column-notice/u-column-notice.vue create mode 100644 components/u-count-down/u-count-down.vue create mode 100644 components/u-count-to/u-count-to.vue create mode 100644 components/u-divider/u-divider.vue create mode 100644 components/u-dropdown-item/u-dropdown-item.vue create mode 100644 components/u-dropdown/u-dropdown.vue create mode 100644 components/u-empty/u-empty.vue create mode 100644 components/u-field/u-field.vue create mode 100644 components/u-form-item/u-form-item.vue create mode 100644 components/u-form/u-form.vue create mode 100644 components/u-full-screen/u-full-screen.vue create mode 100644 components/u-gap/u-gap.vue create mode 100644 components/u-grid-item/u-grid-item.vue create mode 100644 components/u-grid/u-grid.vue create mode 100644 components/u-icon/u-icon.vue create mode 100644 components/u-image/u-image.vue create mode 100644 components/u-index-anchor/u-index-anchor.vue create mode 100644 components/u-index-list/u-index-list.vue create mode 100644 components/u-input/u-input.vue create mode 100644 components/u-keyboard/u-keyboard.vue create mode 100644 components/u-lazy-load/u-lazy-load.vue create mode 100644 components/u-line-progress/u-line-progress.vue create mode 100644 components/u-line/u-line.vue create mode 100644 components/u-link/u-link.vue create mode 100644 components/u-loading-page/u-loading-page.vue create mode 100644 components/u-loading/u-loading.vue create mode 100644 components/u-loadmore/u-loadmore.vue create mode 100644 components/u-mask/u-mask.vue create mode 100644 components/u-message-input/u-message-input.vue create mode 100644 components/u-modal/u-modal.vue create mode 100644 components/u-navbar/u-navbar.vue create mode 100644 components/u-no-network/u-no-network.vue create mode 100644 components/u-notice-bar/u-notice-bar.vue create mode 100644 components/u-number-box/u-number-box.vue create mode 100644 components/u-number-keyboard/u-number-keyboard.vue create mode 100644 components/u-parse/libs/CssHandler.js create mode 100644 components/u-parse/libs/MpHtmlParser.js create mode 100644 components/u-parse/libs/config.js create mode 100644 components/u-parse/libs/handler.wxs create mode 100644 components/u-parse/libs/trees.vue create mode 100644 components/u-parse/u-parse.vue create mode 100644 components/u-picker/u-picker.vue create mode 100644 components/u-popup/u-popup.vue create mode 100644 components/u-radio-group/u-radio-group.vue create mode 100644 components/u-radio/u-radio.vue create mode 100644 components/u-rate/u-rate.vue create mode 100644 components/u-read-more/u-read-more.vue create mode 100644 components/u-row-notice/u-row-notice.vue create mode 100644 components/u-row/u-row.vue create mode 100644 components/u-search/u-search.vue create mode 100644 components/u-section/u-section.vue create mode 100644 components/u-select/u-select.vue create mode 100644 components/u-skeleton/u-skeleton.vue create mode 100644 components/u-slider/u-slider.vue create mode 100644 components/u-steps/u-steps.vue create mode 100644 components/u-sticky/u-sticky.vue create mode 100644 components/u-subsection/u-subsection.vue create mode 100644 components/u-swipe-action/u-swipe-action.vue create mode 100644 components/u-swiper/u-swiper.vue create mode 100644 components/u-switch/u-switch.vue create mode 100644 components/u-tabbar/u-tabbar.vue create mode 100644 components/u-table/u-table.vue create mode 100644 components/u-tabs-swiper/u-tabs-swiper.vue create mode 100644 components/u-tabs/u-tabs.vue create mode 100644 components/u-tag/u-tag.vue create mode 100644 components/u-td/u-td.vue create mode 100644 components/u-th/u-th.vue create mode 100644 components/u-time-line-item/u-time-line-item.vue create mode 100644 components/u-time-line/u-time-line.vue create mode 100644 components/u-toast/u-toast.vue create mode 100644 components/u-top-tips/u-top-tips.vue create mode 100644 components/u-tr/u-tr.vue create mode 100644 components/u-upload/u-upload.vue create mode 100644 components/u-verification-code/u-verification-code.vue create mode 100644 components/u-waterfall/u-waterfall.vue create mode 100755 components/uview-v1/uview-v1.vue create mode 100644 iconfont.css create mode 100644 index.js create mode 100644 index.scss create mode 100644 libs/config/config.js create mode 100644 libs/config/zIndex.js create mode 100644 libs/css/color.scss create mode 100644 libs/css/common.scss create mode 100644 libs/css/style.components.scss create mode 100644 libs/css/style.h5.scss create mode 100644 libs/css/style.mp.scss create mode 100644 libs/css/style.nvue.scss create mode 100644 libs/css/style.vue.scss create mode 100644 libs/function/$parent.js create mode 100644 libs/function/addUnit.js create mode 100644 libs/function/bem.js create mode 100644 libs/function/color.js create mode 100644 libs/function/colorGradient.js create mode 100644 libs/function/debounce.js create mode 100644 libs/function/deepClone.js create mode 100644 libs/function/deepMerge.js create mode 100644 libs/function/getParent.js create mode 100644 libs/function/guid.js create mode 100644 libs/function/md5.js create mode 100644 libs/function/queryParams.js create mode 100644 libs/function/random.js create mode 100644 libs/function/randomArray.js create mode 100644 libs/function/route.js create mode 100644 libs/function/sys.js create mode 100644 libs/function/test.js create mode 100644 libs/function/throttle.js create mode 100644 libs/function/timeFormat.js create mode 100644 libs/function/timeFrom.js create mode 100644 libs/function/toast.js create mode 100644 libs/function/trim.js create mode 100644 libs/function/type2icon.js create mode 100644 libs/mixin/mixin.js create mode 100644 libs/mixin/mpShare.js create mode 100644 libs/request/index.js create mode 100644 libs/store/index.js create mode 100644 libs/util/area.js create mode 100644 libs/util/async-validator.js create mode 100644 libs/util/city.js create mode 100644 libs/util/emitter.js create mode 100644 libs/util/province.js create mode 100644 package.json create mode 100644 theme.scss delete mode 100644 unpackage/dist/dev/mp-weixin/static/.DS_Store diff --git a/.DS_Store b/.DS_Store index 04db62a5450146bf7481b3544bac43b6e738fccd..bb4dd3781ed1d8b784a298a1bd19bb790bbecb10 100644 GIT binary patch delta 41 vcmZoMXfc@J&&W10U^gS%WFAHrUN(keh7yKEAkJh+-t5A-ifuDH$6tN` + logo +

+

uView

+

多平台快速开发的UI框架

+ + +## 说明 + +uView UI,是[uni-app](https://uniapp.dcloud.io/)生态优秀的UI框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水 + +## 特性 + +- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序 +- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用 +- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨 +- 众多的常用页面和布局,让您专注逻辑,事半功倍 +- 详尽的文档支持,现代化的演示效果 +- 按需引入,精简打包体积 + + +## 安装 + +```bash +# npm方式安装 +npm i uview-ui +``` + +## 快速上手 + +1. `main.js`引入uView库 +```js +// main.js +import uView from 'uview-ui'; +Vue.use(uView); +``` + +2. `App.vue`引入基础样式(注意style标签需声明scss属性支持) +```css +/* App.vue */ + +``` + +3. `uni.scss`引入全局scss变量文件 +```css +/* uni.scss */ +@import "uview-ui/theme.scss"; +``` + +4. `pages.json`配置easycom规则(按需引入) + +```js +// pages.json +{ + "easycom": { + // npm安装的方式不需要前面的"@/",下载安装的方式需要"@/" + // npm安装方式 + "^u-(.*)": "uview-ui/components/u-$1/u-$1.vue" + // 下载安装方式 + // "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue" + }, + // 此为本身已有的内容 + "pages": [ + // ...... + ] +} +``` + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 使用方法 +配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。 + +```html + +``` + +请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容 + +## 链接 + +- [官方文档](https://uviewui.com/) +- [更新日志](https://uviewui.com/components/changelog.html) +- [升级指南](https://uviewui.com/components/changelog.html) +- [关于我们](https://uviewui.com/cooperation/about.html) + +## 预览 + +您可以通过**微信**扫码,查看最佳的演示效果。 +
+
+ + + +## 版权信息 +uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。 diff --git a/components/u-action-sheet/u-action-sheet.vue b/components/u-action-sheet/u-action-sheet.vue new file mode 100644 index 0000000..722b668 --- /dev/null +++ b/components/u-action-sheet/u-action-sheet.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/components/u-alert-tips/u-alert-tips.vue b/components/u-alert-tips/u-alert-tips.vue new file mode 100644 index 0000000..e81fc37 --- /dev/null +++ b/components/u-alert-tips/u-alert-tips.vue @@ -0,0 +1,256 @@ + + + + + diff --git a/components/u-avatar-cropper/u-avatar-cropper.vue b/components/u-avatar-cropper/u-avatar-cropper.vue new file mode 100644 index 0000000..a48dd54 --- /dev/null +++ b/components/u-avatar-cropper/u-avatar-cropper.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/components/u-avatar-cropper/weCropper.js b/components/u-avatar-cropper/weCropper.js new file mode 100644 index 0000000..df02483 --- /dev/null +++ b/components/u-avatar-cropper/weCropper.js @@ -0,0 +1,1265 @@ +/** + * we-cropper v1.3.9 + * (c) 2020 dlhandsome + * @license MIT + */ +(function(global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.WeCropper = factory()); +}(this, (function() { + 'use strict'; + + var device = void 0; + var TOUCH_STATE = ['touchstarted', 'touchmoved', 'touchended']; + + function firstLetterUpper(str) { + return str.charAt(0).toUpperCase() + str.slice(1) + } + + function setTouchState(instance) { + var arg = [], + len = arguments.length - 1; + while (len-- > 0) arg[len] = arguments[len + 1]; + + TOUCH_STATE.forEach(function(key, i) { + if (arg[i] !== undefined) { + instance[key] = arg[i]; + } + }); + } + + function validator(instance, o) { + Object.defineProperties(instance, o); + } + + function getDevice() { + if (!device) { + device = uni.getSystemInfoSync(); + } + return device + } + + var tmp = {}; + + var ref = getDevice(); + var pixelRatio = ref.pixelRatio; + + var DEFAULT = { + id: { + default: 'cropper', + get: function get() { + return tmp.id + }, + set: function set(value) { + if (typeof(value) !== 'string') { + console.error(("id:" + value + " is invalid")); + } + tmp.id = value; + } + }, + width: { + default: 750, + get: function get() { + return tmp.width + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("width:" + value + " is invalid")); + } + tmp.width = value; + } + }, + height: { + default: 750, + get: function get() { + return tmp.height + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("height:" + value + " is invalid")); + } + tmp.height = value; + } + }, + pixelRatio: { + default: pixelRatio, + get: function get() { + return tmp.pixelRatio + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("pixelRatio:" + value + " is invalid")); + } + tmp.pixelRatio = value; + } + }, + scale: { + default: 2.5, + get: function get() { + return tmp.scale + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("scale:" + value + " is invalid")); + } + tmp.scale = value; + } + }, + zoom: { + default: 5, + get: function get() { + return tmp.zoom + }, + set: function set(value) { + if (typeof(value) !== 'number') { + console.error(("zoom:" + value + " is invalid")); + } else if (value < 0 || value > 10) { + console.error("zoom should be ranged in 0 ~ 10"); + } + tmp.zoom = value; + } + }, + src: { + default: '', + get: function get() { + return tmp.src + }, + set: function set(value) { + if (typeof(value) !== 'string') { + console.error(("src:" + value + " is invalid")); + } + tmp.src = value; + } + }, + cut: { + default: {}, + get: function get() { + return tmp.cut + }, + set: function set(value) { + if (typeof(value) !== 'object') { + console.error(("cut:" + value + " is invalid")); + } + tmp.cut = value; + } + }, + boundStyle: { + default: {}, + get: function get() { + return tmp.boundStyle + }, + set: function set(value) { + if (typeof(value) !== 'object') { + console.error(("boundStyle:" + value + " is invalid")); + } + tmp.boundStyle = value; + } + }, + onReady: { + default: null, + get: function get() { + return tmp.ready + }, + set: function set(value) { + tmp.ready = value; + } + }, + onBeforeImageLoad: { + default: null, + get: function get() { + return tmp.beforeImageLoad + }, + set: function set(value) { + tmp.beforeImageLoad = value; + } + }, + onImageLoad: { + default: null, + get: function get() { + return tmp.imageLoad + }, + set: function set(value) { + tmp.imageLoad = value; + } + }, + onBeforeDraw: { + default: null, + get: function get() { + return tmp.beforeDraw + }, + set: function set(value) { + tmp.beforeDraw = value; + } + } + }; + + var ref$1 = getDevice(); + var windowWidth = ref$1.windowWidth; + + function prepare() { + var self = this; + + // v1.4.0 版本中将不再自动绑定we-cropper实例 + self.attachPage = function() { + var pages = getCurrentPages(); + // 获取到当前page上下文 + var pageContext = pages[pages.length - 1]; + // 把this依附在Page上下文的wecropper属性上,便于在page钩子函数中访问 + Object.defineProperty(pageContext, 'wecropper', { + get: function get() { + console.warn( + 'Instance will not be automatically bound to the page after v1.4.0\n\n' + + 'Please use a custom instance name instead\n\n' + + 'Example: \n' + + 'this.mycropper = new WeCropper(options)\n\n' + + '// ...\n' + + 'this.mycropper.getCropperImage()' + ); + return self + }, + configurable: true + }); + }; + + self.createCtx = function() { + var id = self.id; + var targetId = self.targetId; + + if (id) { + self.ctx = self.ctx || uni.createCanvasContext(id); + self.targetCtx = self.targetCtx || uni.createCanvasContext(targetId); + } else { + console.error("constructor: create canvas context failed, 'id' must be valuable"); + } + }; + + self.deviceRadio = windowWidth / 750; + } + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== + 'undefined' ? self : {}; + + + + + + function createCommonjsModule(fn, module) { + return module = { + exports: {} + }, fn(module, module.exports), module.exports; + } + + var tools = createCommonjsModule(function(module, exports) { + /** + * String type check + */ + exports.isStr = function(v) { + return typeof v === 'string'; + }; + /** + * Number type check + */ + exports.isNum = function(v) { + return typeof v === 'number'; + }; + /** + * Array type check + */ + exports.isArr = Array.isArray; + /** + * undefined type check + */ + exports.isUndef = function(v) { + return v === undefined; + }; + + exports.isTrue = function(v) { + return v === true; + }; + + exports.isFalse = function(v) { + return v === false; + }; + /** + * Function type check + */ + exports.isFunc = function(v) { + return typeof v === 'function'; + }; + /** + * Quick object check - this is primarily used to tell + * Objects from primitive values when we know the value + * is a JSON-compliant type. + */ + exports.isObj = exports.isObject = function(obj) { + return obj !== null && typeof obj === 'object' + }; + + /** + * Strict object type check. Only returns true + * for plain JavaScript objects. + */ + var _toString = Object.prototype.toString; + exports.isPlainObject = function(obj) { + return _toString.call(obj) === '[object Object]' + }; + + /** + * Check whether the object has the property. + */ + var hasOwnProperty = Object.prototype.hasOwnProperty; + exports.hasOwn = function(obj, key) { + return hasOwnProperty.call(obj, key) + }; + + /** + * Perform no operation. + * Stubbing args to make Flow happy without leaving useless transpiled code + * with ...rest (https://flow.org/blog/2017/05/07/Strict-Function-Call-Arity/) + */ + exports.noop = function(a, b, c) {}; + + /** + * Check if val is a valid array index. + */ + exports.isValidArrayIndex = function(val) { + var n = parseFloat(String(val)); + return n >= 0 && Math.floor(n) === n && isFinite(val) + }; + }); + + var tools_7 = tools.isFunc; + var tools_10 = tools.isPlainObject; + + var EVENT_TYPE = ['ready', 'beforeImageLoad', 'beforeDraw', 'imageLoad']; + + function observer() { + var self = this; + + self.on = function(event, fn) { + if (EVENT_TYPE.indexOf(event) > -1) { + if (tools_7(fn)) { + event === 'ready' ? + fn(self) : + self[("on" + (firstLetterUpper(event)))] = fn; + } + } else { + console.error(("event: " + event + " is invalid")); + } + return self + }; + } + + function wxPromise(fn) { + return function(obj) { + var args = [], + len = arguments.length - 1; + while (len-- > 0) args[len] = arguments[len + 1]; + + if (obj === void 0) obj = {}; + return new Promise(function(resolve, reject) { + obj.success = function(res) { + resolve(res); + }; + obj.fail = function(err) { + reject(err); + }; + fn.apply(void 0, [obj].concat(args)); + }) + } + } + + function draw(ctx, reserve) { + if (reserve === void 0) reserve = false; + + return new Promise(function(resolve) { + ctx.draw(reserve, resolve); + }) + } + + var getImageInfo = wxPromise(uni.getImageInfo); + + var canvasToTempFilePath = wxPromise(uni.canvasToTempFilePath); + + var base64 = createCommonjsModule(function(module, exports) { + /*! http://mths.be/base64 v0.1.0 by @mathias | MIT license */ + (function(root) { + + // Detect free variables `exports`. + var freeExports = 'object' == 'object' && exports; + + // Detect free variable `module`. + var freeModule = 'object' == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, and use + // it as `root`. + var freeGlobal = typeof commonjsGlobal == 'object' && commonjsGlobal; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var InvalidCharacterError = function(message) { + this.message = message; + }; + InvalidCharacterError.prototype = new Error; + InvalidCharacterError.prototype.name = 'InvalidCharacterError'; + + var error = function(message) { + // Note: the error messages used throughout this file match those used by + // the native `atob`/`btoa` implementation in Chromium. + throw new InvalidCharacterError(message); + }; + + var TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + // http://whatwg.org/html/common-microsyntaxes.html#space-character + var REGEX_SPACE_CHARACTERS = /[\t\n\f\r ]/g; + + // `decode` is designed to be fully compatible with `atob` as described in the + // HTML Standard. http://whatwg.org/html/webappapis.html#dom-windowbase64-atob + // The optimized base64-decoding algorithm used is based on @atk’s excellent + // implementation. https://gist.github.com/atk/1020396 + var decode = function(input) { + input = String(input) + .replace(REGEX_SPACE_CHARACTERS, ''); + var length = input.length; + if (length % 4 == 0) { + input = input.replace(/==?$/, ''); + length = input.length; + } + if ( + length % 4 == 1 || + // http://whatwg.org/C#alphanumeric-ascii-characters + /[^+a-zA-Z0-9/]/.test(input) + ) { + error( + 'Invalid character: the string to be decoded is not correctly encoded.' + ); + } + var bitCounter = 0; + var bitStorage; + var buffer; + var output = ''; + var position = -1; + while (++position < length) { + buffer = TABLE.indexOf(input.charAt(position)); + bitStorage = bitCounter % 4 ? bitStorage * 64 + buffer : buffer; + // Unless this is the first of a group of 4 characters… + if (bitCounter++ % 4) { + // …convert the first 8 bits to a single ASCII character. + output += String.fromCharCode( + 0xFF & bitStorage >> (-2 * bitCounter & 6) + ); + } + } + return output; + }; + + // `encode` is designed to be fully compatible with `btoa` as described in the + // HTML Standard: http://whatwg.org/html/webappapis.html#dom-windowbase64-btoa + var encode = function(input) { + input = String(input); + if (/[^\0-\xFF]/.test(input)) { + // Note: no need to special-case astral symbols here, as surrogates are + // matched, and the input is supposed to only contain ASCII anyway. + error( + 'The string to be encoded contains characters outside of the ' + + 'Latin1 range.' + ); + } + var padding = input.length % 3; + var output = ''; + var position = -1; + var a; + var b; + var c; + var buffer; + // Make sure any padding is handled outside of the loop. + var length = input.length - padding; + + while (++position < length) { + // Read three bytes, i.e. 24 bits. + a = input.charCodeAt(position) << 16; + b = input.charCodeAt(++position) << 8; + c = input.charCodeAt(++position); + buffer = a + b + c; + // Turn the 24 bits into four chunks of 6 bits each, and append the + // matching character for each of them to the output. + output += ( + TABLE.charAt(buffer >> 18 & 0x3F) + + TABLE.charAt(buffer >> 12 & 0x3F) + + TABLE.charAt(buffer >> 6 & 0x3F) + + TABLE.charAt(buffer & 0x3F) + ); + } + + if (padding == 2) { + a = input.charCodeAt(position) << 8; + b = input.charCodeAt(++position); + buffer = a + b; + output += ( + TABLE.charAt(buffer >> 10) + + TABLE.charAt((buffer >> 4) & 0x3F) + + TABLE.charAt((buffer << 2) & 0x3F) + + '=' + ); + } else if (padding == 1) { + buffer = input.charCodeAt(position); + output += ( + TABLE.charAt(buffer >> 2) + + TABLE.charAt((buffer << 4) & 0x3F) + + '==' + ); + } + + return output; + }; + + var base64 = { + 'encode': encode, + 'decode': decode, + 'version': '0.1.0' + }; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof undefined == 'function' && + typeof undefined.amd == 'object' && + undefined.amd + ) { + undefined(function() { + return base64; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = base64; + } else { // in Narwhal or RingoJS v0.7.0- + for (var key in base64) { + base64.hasOwnProperty(key) && (freeExports[key] = base64[key]); + } + } + } else { // in Rhino or a web browser + root.base64 = base64; + } + + }(commonjsGlobal)); + }); + + function makeURI(strData, type) { + return 'data:' + type + ';base64,' + strData + } + + function fixType(type) { + type = type.toLowerCase().replace(/jpg/i, 'jpeg'); + var r = type.match(/png|jpeg|bmp|gif/)[0]; + return 'image/' + r + } + + function encodeData(data) { + var str = ''; + if (typeof data === 'string') { + str = data; + } else { + for (var i = 0; i < data.length; i++) { + str += String.fromCharCode(data[i]); + } + } + return base64.encode(str) + } + + /** + * 获取图像区域隐含的像素数据 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param done 完成回调 + */ + function getImageData(canvasId, x, y, width, height, done) { + uni.canvasGetImageData({ + canvasId: canvasId, + x: x, + y: y, + width: width, + height: height, + success: function success(res) { + done(res, null); + }, + fail: function fail(res) { + done(null, res); + } + }); + } + + /** + * 生成bmp格式图片 + * 按照规则生成图片响应头和响应体 + * @param oData 用来描述 canvas 区域隐含的像素数据 { data, width, height } = oData + * @returns {*} base64字符串 + */ + function genBitmapImage(oData) { + // + // BITMAPFILEHEADER: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183374(v=vs.85).aspx + // BITMAPINFOHEADER: http://msdn.microsoft.com/en-us/library/dd183376.aspx + // + var biWidth = oData.width; + var biHeight = oData.height; + var biSizeImage = biWidth * biHeight * 3; + var bfSize = biSizeImage + 54; // total header size = 54 bytes + + // + // typedef struct tagBITMAPFILEHEADER { + // WORD bfType; + // DWORD bfSize; + // WORD bfReserved1; + // WORD bfReserved2; + // DWORD bfOffBits; + // } BITMAPFILEHEADER; + // + var BITMAPFILEHEADER = [ + // WORD bfType -- The file type signature; must be "BM" + 0x42, 0x4D, + // DWORD bfSize -- The size, in bytes, of the bitmap file + bfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff, + // WORD bfReserved1 -- Reserved; must be zero + 0, 0, + // WORD bfReserved2 -- Reserved; must be zero + 0, 0, + // DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits. + 54, 0, 0, 0 + ]; + + // + // typedef struct tagBITMAPINFOHEADER { + // DWORD biSize; + // LONG biWidth; + // LONG biHeight; + // WORD biPlanes; + // WORD biBitCount; + // DWORD biCompression; + // DWORD biSizeImage; + // LONG biXPelsPerMeter; + // LONG biYPelsPerMeter; + // DWORD biClrUsed; + // DWORD biClrImportant; + // } BITMAPINFOHEADER, *PBITMAPINFOHEADER; + // + var BITMAPINFOHEADER = [ + // DWORD biSize -- The number of bytes required by the structure + 40, 0, 0, 0, + // LONG biWidth -- The width of the bitmap, in pixels + biWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff, + // LONG biHeight -- The height of the bitmap, in pixels + biHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff, + // WORD biPlanes -- The number of planes for the target device. This value must be set to 1 + 1, 0, + // WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap + // has a maximum of 2^24 colors (16777216, Truecolor) + 24, 0, + // DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed + 0, 0, 0, 0, + // DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmaps + biSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff, + // LONG biXPelsPerMeter, unused + 0, 0, 0, 0, + // LONG biYPelsPerMeter, unused + 0, 0, 0, 0, + // DWORD biClrUsed, the number of color indexes of palette, unused + 0, 0, 0, 0, + // DWORD biClrImportant, unused + 0, 0, 0, 0 + ]; + + var iPadding = (4 - ((biWidth * 3) % 4)) % 4; + + var aImgData = oData.data; + + var strPixelData = ''; + var biWidth4 = biWidth << 2; + var y = biHeight; + var fromCharCode = String.fromCharCode; + + do { + var iOffsetY = biWidth4 * (y - 1); + var strPixelRow = ''; + for (var x = 0; x < biWidth; x++) { + var iOffsetX = x << 2; + strPixelRow += fromCharCode(aImgData[iOffsetY + iOffsetX + 2]) + + fromCharCode(aImgData[iOffsetY + iOffsetX + 1]) + + fromCharCode(aImgData[iOffsetY + iOffsetX]); + } + + for (var c = 0; c < iPadding; c++) { + strPixelRow += String.fromCharCode(0); + } + + strPixelData += strPixelRow; + } while (--y) + + var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData); + + return strEncoded + } + + /** + * 转换为图片base64 + * @param canvasId canvas标识 + * @param x 将要被提取的图像数据矩形区域的左上角 x 坐标 + * @param y 将要被提取的图像数据矩形区域的左上角 y 坐标 + * @param width 将要被提取的图像数据矩形区域的宽度 + * @param height 将要被提取的图像数据矩形区域的高度 + * @param type 转换图片类型 + * @param done 完成回调 + */ + function convertToImage(canvasId, x, y, width, height, type, done) { + if (done === void 0) done = function() {}; + + if (type === undefined) { + type = 'png'; + } + type = fixType(type); + if (/bmp/.test(type)) { + getImageData(canvasId, x, y, width, height, function(data, err) { + var strData = genBitmapImage(data); + tools_7(done) && done(makeURI(strData, 'image/' + type), err); + }); + } else { + console.error('暂不支持生成\'' + type + '\'类型的base64图片'); + } + } + + var CanvasToBase64 = { + convertToImage: convertToImage, + // convertToPNG: function (width, height, done) { + // return convertToImage(width, height, 'png', done) + // }, + // convertToJPEG: function (width, height, done) { + // return convertToImage(width, height, 'jpeg', done) + // }, + // convertToGIF: function (width, height, done) { + // return convertToImage(width, height, 'gif', done) + // }, + convertToBMP: function(ref, done) { + if (ref === void 0) ref = {}; + var canvasId = ref.canvasId; + var x = ref.x; + var y = ref.y; + var width = ref.width; + var height = ref.height; + if (done === void 0) done = function() {}; + + return convertToImage(canvasId, x, y, width, height, 'bmp', done) + } + }; + + function methods() { + var self = this; + + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; // 裁剪框默认高度,即整个画布高度 + + var id = self.id; + var targetId = self.targetId; + var pixelRatio = self.pixelRatio; + + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + self.updateCanvas = function(done) { + if (self.croperTarget) { + // 画布绘制图片 + self.ctx.drawImage( + self.croperTarget, + self.imgLeft, + self.imgTop, + self.scaleWidth, + self.scaleHeight + ); + } + tools_7(self.onBeforeDraw) && self.onBeforeDraw(self.ctx, self); + + self.setBoundStyle(self.boundStyle); // 设置边界样式 + + self.ctx.draw(false, done); + return self + }; + + self.pushOrigin = self.pushOrign = function(src) { + self.src = src; + + tools_7(self.onBeforeImageLoad) && self.onBeforeImageLoad(self.ctx, self); + + return getImageInfo({ + src: src + }) + .then(function(res) { + var innerAspectRadio = res.width / res.height; + var customAspectRadio = width / height; + + self.croperTarget = res.path; + + if (innerAspectRadio < customAspectRadio) { + self.rectX = x; + self.baseWidth = width; + self.baseHeight = width / innerAspectRadio; + self.rectY = y - Math.abs((height - self.baseHeight) / 2); + } else { + self.rectY = y; + self.baseWidth = height * innerAspectRadio; + self.baseHeight = height; + self.rectX = x - Math.abs((width - self.baseWidth) / 2); + } + + self.imgLeft = self.rectX; + self.imgTop = self.rectY; + self.scaleWidth = self.baseWidth; + self.scaleHeight = self.baseHeight; + + self.update(); + + return new Promise(function(resolve) { + self.updateCanvas(resolve); + }) + }) + .then(function() { + tools_7(self.onImageLoad) && self.onImageLoad(self.ctx, self); + }) + }; + + self.removeImage = function() { + self.src = ''; + self.croperTarget = ''; + return draw(self.ctx) + }; + + self.getCropperBase64 = function(done) { + if (done === void 0) done = function() {}; + + CanvasToBase64.convertToBMP({ + canvasId: id, + x: x, + y: y, + width: width, + height: height + }, done); + }; + + self.getCropperImage = function(opt, fn) { + var customOptions = opt; + + var canvasOptions = { + canvasId: id, + x: x, + y: y, + width: width, + height: height + }; + + var task = function() { + return Promise.resolve(); + }; + + if ( + tools_10(customOptions) && + customOptions.original + ) { + // original mode + task = function() { + self.targetCtx.drawImage( + self.croperTarget, + self.imgLeft * pixelRatio, + self.imgTop * pixelRatio, + self.scaleWidth * pixelRatio, + self.scaleHeight * pixelRatio + ); + + canvasOptions = { + canvasId: targetId, + x: x * pixelRatio, + y: y * pixelRatio, + width: width * pixelRatio, + height: height * pixelRatio + }; + + return draw(self.targetCtx) + }; + } + + return task() + .then(function() { + if (tools_10(customOptions)) { + canvasOptions = Object.assign({}, canvasOptions, customOptions); + } + + if (tools_7(customOptions)) { + fn = customOptions; + } + + var arg = canvasOptions.componentContext ? + [canvasOptions, canvasOptions.componentContext] : + [canvasOptions]; + + return canvasToTempFilePath.apply(null, arg) + }) + .then(function(res) { + var tempFilePath = res.tempFilePath; + + return tools_7(fn) ? + fn.call(self, tempFilePath, null) : + tempFilePath + }) + .catch(function(err) { + if (tools_7(fn)) { + fn.call(self, null, err); + } else { + throw err + } + }) + }; + } + + /** + * 获取最新缩放值 + * @param oldScale 上一次触摸结束后的缩放值 + * @param oldDistance 上一次触摸结束后的双指距离 + * @param zoom 缩放系数 + * @param touch0 第一指touch对象 + * @param touch1 第二指touch对象 + * @returns {*} + */ + var getNewScale = function(oldScale, oldDistance, zoom, touch0, touch1) { + var xMove, yMove, newDistance; + // 计算二指最新距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + newDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + return oldScale + 0.001 * zoom * (newDistance - oldDistance) + }; + + function update() { + var self = this; + + if (!self.src) { + return + } + + self.__oneTouchStart = function(touch) { + self.touchX0 = Math.round(touch.x); + self.touchY0 = Math.round(touch.y); + }; + + self.__oneTouchMove = function(touch) { + var xMove, yMove; + // 计算单指移动的距离 + if (self.touchended) { + return self.updateCanvas() + } + xMove = Math.round(touch.x - self.touchX0); + yMove = Math.round(touch.y - self.touchY0); + + var imgLeft = Math.round(self.rectX + xMove); + var imgTop = Math.round(self.rectY + yMove); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__twoTouchStart = function(touch0, touch1) { + var xMove, yMove, oldDistance; + + self.touchX1 = Math.round(self.rectX + self.scaleWidth / 2); + self.touchY1 = Math.round(self.rectY + self.scaleHeight / 2); + + // 计算两指距离 + xMove = Math.round(touch1.x - touch0.x); + yMove = Math.round(touch1.y - touch0.y); + oldDistance = Math.round(Math.sqrt(xMove * xMove + yMove * yMove)); + + self.oldDistance = oldDistance; + }; + + self.__twoTouchMove = function(touch0, touch1) { + var oldScale = self.oldScale; + var oldDistance = self.oldDistance; + var scale = self.scale; + var zoom = self.zoom; + + self.newScale = getNewScale(oldScale, oldDistance, zoom, touch0, touch1); + + // 设定缩放范围 + self.newScale <= 1 && (self.newScale = 1); + self.newScale >= scale && (self.newScale = scale); + + self.scaleWidth = Math.round(self.newScale * self.baseWidth); + self.scaleHeight = Math.round(self.newScale * self.baseHeight); + var imgLeft = Math.round(self.touchX1 - self.scaleWidth / 2); + var imgTop = Math.round(self.touchY1 - self.scaleHeight / 2); + + self.outsideBound(imgLeft, imgTop); + + self.updateCanvas(); + }; + + self.__xtouchEnd = function() { + self.oldScale = self.newScale; + self.rectX = self.imgLeft; + self.rectY = self.imgTop; + }; + } + + var handle = { + // 图片手势初始监测 + touchStart: function touchStart(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, true, null, null); + + // 计算第一个触摸点的位置,并参照改点进行缩放 + self.__oneTouchStart(touch0); + + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchStart(touch0, touch1); + } + }, + + // 图片手势动态缩放 + touchMove: function touchMove(e) { + var self = this; + var ref = e.touches; + var touch0 = ref[0]; + var touch1 = ref[1]; + + if (!self.src) { + return + } + + setTouchState(self, null, true); + + // 单指手势时触发 + if (e.touches.length === 1) { + self.__oneTouchMove(touch0); + } + // 两指手势触发 + if (e.touches.length >= 2) { + self.__twoTouchMove(touch0, touch1); + } + }, + + touchEnd: function touchEnd(e) { + var self = this; + + if (!self.src) { + return + } + + setTouchState(self, false, false, true); + self.__xtouchEnd(); + } + }; + + function cut() { + var self = this; + var boundWidth = self.width; // 裁剪框默认宽度,即整个画布宽度 + var boundHeight = self.height; + // 裁剪框默认高度,即整个画布高度 + var ref = self.cut; + var x = ref.x; + if (x === void 0) x = 0; + var y = ref.y; + if (y === void 0) y = 0; + var width = ref.width; + if (width === void 0) width = boundWidth; + var height = ref.height; + if (height === void 0) height = boundHeight; + + /** + * 设置边界 + * @param imgLeft 图片左上角横坐标值 + * @param imgTop 图片左上角纵坐标值 + */ + self.outsideBound = function(imgLeft, imgTop) { + self.imgLeft = imgLeft >= x ? + x : + self.scaleWidth + imgLeft - x <= width ? + x + width - self.scaleWidth : + imgLeft; + + self.imgTop = imgTop >= y ? + y : + self.scaleHeight + imgTop - y <= height ? + y + height - self.scaleHeight : + imgTop; + }; + + /** + * 设置边界样式 + * @param color 边界颜色 + */ + self.setBoundStyle = function(ref) { + if (ref === void 0) ref = {}; + var color = ref.color; + if (color === void 0) color = '#04b00f'; + var mask = ref.mask; + if (mask === void 0) mask = 'rgba(0, 0, 0, 0.3)'; + var lineWidth = ref.lineWidth; + if (lineWidth === void 0) lineWidth = 1; + + var half = lineWidth / 2; + var boundOption = [{ + start: { + x: x - half, + y: y + 10 - half + }, + step1: { + x: x - half, + y: y - half + }, + step2: { + x: x + 10 - half, + y: y - half + } + }, + { + start: { + x: x - half, + y: y + height - 10 + half + }, + step1: { + x: x - half, + y: y + height + half + }, + step2: { + x: x + 10 - half, + y: y + height + half + } + }, + { + start: { + x: x + width - 10 + half, + y: y - half + }, + step1: { + x: x + width + half, + y: y - half + }, + step2: { + x: x + width + half, + y: y + 10 - half + } + }, + { + start: { + x: x + width + half, + y: y + height - 10 + half + }, + step1: { + x: x + width + half, + y: y + height + half + }, + step2: { + x: x + width - 10 + half, + y: y + height + half + } + } + ]; + + // 绘制半透明层 + self.ctx.beginPath(); + self.ctx.setFillStyle(mask); + self.ctx.fillRect(0, 0, x, boundHeight); + self.ctx.fillRect(x, 0, width, y); + self.ctx.fillRect(x, y + height, width, boundHeight - y - height); + self.ctx.fillRect(x + width, 0, boundWidth - x - width, boundHeight); + self.ctx.fill(); + + boundOption.forEach(function(op) { + self.ctx.beginPath(); + self.ctx.setStrokeStyle(color); + self.ctx.setLineWidth(lineWidth); + self.ctx.moveTo(op.start.x, op.start.y); + self.ctx.lineTo(op.step1.x, op.step1.y); + self.ctx.lineTo(op.step2.x, op.step2.y); + self.ctx.stroke(); + }); + }; + } + + var version = "1.3.9"; + + var WeCropper = function WeCropper(params) { + var self = this; + var _default = {}; + + validator(self, DEFAULT); + + Object.keys(DEFAULT).forEach(function(key) { + _default[key] = DEFAULT[key].default; + }); + Object.assign(self, _default, params); + + self.prepare(); + self.attachPage(); + self.createCtx(); + self.observer(); + self.cutt(); + self.methods(); + self.init(); + self.update(); + + return self + }; + + WeCropper.prototype.init = function init() { + var self = this; + var src = self.src; + + self.version = version; + + typeof self.onReady === 'function' && self.onReady(self.ctx, self); + + if (src) { + self.pushOrign(src); + } else { + self.updateCanvas(); + } + setTouchState(self, false, false, false); + + self.oldScale = 1; + self.newScale = 1; + + return self + }; + + Object.assign(WeCropper.prototype, handle); + + WeCropper.prototype.prepare = prepare; + WeCropper.prototype.observer = observer; + WeCropper.prototype.methods = methods; + WeCropper.prototype.cutt = cut; + WeCropper.prototype.update = update; + + return WeCropper; + +}))); diff --git a/components/u-avatar/u-avatar.vue b/components/u-avatar/u-avatar.vue new file mode 100644 index 0000000..289b9b0 --- /dev/null +++ b/components/u-avatar/u-avatar.vue @@ -0,0 +1,244 @@ + + + + + diff --git a/components/u-back-top/u-back-top.vue b/components/u-back-top/u-back-top.vue new file mode 100644 index 0000000..7970fc7 --- /dev/null +++ b/components/u-back-top/u-back-top.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/components/u-badge/u-badge.vue b/components/u-badge/u-badge.vue new file mode 100644 index 0000000..e85b133 --- /dev/null +++ b/components/u-badge/u-badge.vue @@ -0,0 +1,216 @@ + + + + + \ No newline at end of file diff --git a/components/u-button/u-button.vue b/components/u-button/u-button.vue new file mode 100644 index 0000000..82c3a6f --- /dev/null +++ b/components/u-button/u-button.vue @@ -0,0 +1,596 @@ + + + + + diff --git a/components/u-calendar/u-calendar.vue b/components/u-calendar/u-calendar.vue new file mode 100644 index 0000000..70059cb --- /dev/null +++ b/components/u-calendar/u-calendar.vue @@ -0,0 +1,643 @@ + + + + diff --git a/components/u-car-keyboard/u-car-keyboard.vue b/components/u-car-keyboard/u-car-keyboard.vue new file mode 100644 index 0000000..84b1467 --- /dev/null +++ b/components/u-car-keyboard/u-car-keyboard.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/components/u-card/u-card.vue b/components/u-card/u-card.vue new file mode 100644 index 0000000..a3cb2aa --- /dev/null +++ b/components/u-card/u-card.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/components/u-cell-group/u-cell-group.vue b/components/u-cell-group/u-cell-group.vue new file mode 100644 index 0000000..3fbca72 --- /dev/null +++ b/components/u-cell-group/u-cell-group.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/components/u-cell-item/u-cell-item.vue b/components/u-cell-item/u-cell-item.vue new file mode 100644 index 0000000..055af3a --- /dev/null +++ b/components/u-cell-item/u-cell-item.vue @@ -0,0 +1,316 @@ + + + + + diff --git a/components/u-checkbox-group/u-checkbox-group.vue b/components/u-checkbox-group/u-checkbox-group.vue new file mode 100644 index 0000000..6a149b3 --- /dev/null +++ b/components/u-checkbox-group/u-checkbox-group.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/components/u-checkbox/u-checkbox.vue b/components/u-checkbox/u-checkbox.vue new file mode 100644 index 0000000..9414461 --- /dev/null +++ b/components/u-checkbox/u-checkbox.vue @@ -0,0 +1,284 @@ + + + + + diff --git a/components/u-circle-progress/u-circle-progress.vue b/components/u-circle-progress/u-circle-progress.vue new file mode 100644 index 0000000..46e7c18 --- /dev/null +++ b/components/u-circle-progress/u-circle-progress.vue @@ -0,0 +1,220 @@ + + + + + diff --git a/components/u-circle-progress/u-line-progress/u-line-progress.vue b/components/u-circle-progress/u-line-progress/u-line-progress.vue new file mode 100644 index 0000000..77e2da2 --- /dev/null +++ b/components/u-circle-progress/u-line-progress/u-line-progress.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/components/u-col/u-col.vue b/components/u-col/u-col.vue new file mode 100644 index 0000000..3b6cc64 --- /dev/null +++ b/components/u-col/u-col.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/components/u-collapse-item/u-collapse-item.vue b/components/u-collapse-item/u-collapse-item.vue new file mode 100644 index 0000000..6656657 --- /dev/null +++ b/components/u-collapse-item/u-collapse-item.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/components/u-collapse/u-collapse.vue b/components/u-collapse/u-collapse.vue new file mode 100644 index 0000000..8572957 --- /dev/null +++ b/components/u-collapse/u-collapse.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/components/u-column-notice/u-column-notice.vue b/components/u-column-notice/u-column-notice.vue new file mode 100644 index 0000000..dd8bd31 --- /dev/null +++ b/components/u-column-notice/u-column-notice.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/components/u-count-down/u-count-down.vue b/components/u-count-down/u-count-down.vue new file mode 100644 index 0000000..7285d67 --- /dev/null +++ b/components/u-count-down/u-count-down.vue @@ -0,0 +1,318 @@ + + + + + diff --git a/components/u-count-to/u-count-to.vue b/components/u-count-to/u-count-to.vue new file mode 100644 index 0000000..053dc5f --- /dev/null +++ b/components/u-count-to/u-count-to.vue @@ -0,0 +1,241 @@ + + + + + diff --git a/components/u-divider/u-divider.vue b/components/u-divider/u-divider.vue new file mode 100644 index 0000000..6f8d7e6 --- /dev/null +++ b/components/u-divider/u-divider.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/components/u-dropdown-item/u-dropdown-item.vue b/components/u-dropdown-item/u-dropdown-item.vue new file mode 100644 index 0000000..ba60d8f --- /dev/null +++ b/components/u-dropdown-item/u-dropdown-item.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/components/u-dropdown/u-dropdown.vue b/components/u-dropdown/u-dropdown.vue new file mode 100644 index 0000000..a62e469 --- /dev/null +++ b/components/u-dropdown/u-dropdown.vue @@ -0,0 +1,298 @@ + + + + + diff --git a/components/u-empty/u-empty.vue b/components/u-empty/u-empty.vue new file mode 100644 index 0000000..2c77b24 --- /dev/null +++ b/components/u-empty/u-empty.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/components/u-field/u-field.vue b/components/u-field/u-field.vue new file mode 100644 index 0000000..b562798 --- /dev/null +++ b/components/u-field/u-field.vue @@ -0,0 +1,384 @@ +