From f26f29d84e0a68831a6af14dab3eec5500496d2e Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期三, 28 五月 2025 16:48:52 +0800
Subject: [PATCH] 初始化项目

---
 uni_modules/wu-ui-tools/libs/function/test.js                                                |  287 
 uni_modules/uni-section/components/uni-section/uni-section.vue                               |  167 
 pages/common/common.scss                                                                     |  156 
 uni_modules/wu-ui-tools/libs/config/config.js                                                |   34 
 uni_modules/wu-button/components/wu-button/props.js                                          |  158 
 static/custom/daily/icon_right.png                                                           |    0 
 static/custom/outsource/icon_delete.png                                                      |    0 
 uni_modules/uni-fab/changelog.md                                                             |   23 
 util/ble/encoding-indexes.js                                                                 |   47 
 pages/wareHouse/packing/personnelList.vue                                                    |  290 
 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js                             |    8 
 pages/product/pick/materialTransfer.vue                                                      |  582 
 uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/README.md                         |   39 
 static/iconfont/iconfont.woff2                                                               |    0 
 static/custom/materialReturn/selected-btn.png                                                |    0 
 uview-ui/components/u-keyboard/u-keyboard.vue                                                |  217 
 uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue |  146 
 main.js                                                                                      |   60 
 uni_modules/wu-ui-tools/libs/function/color/is-arrayish/LICENSE                              |   21 
 uview-ui/libs/function/route.js                                                              |  122 
 static/custom/materialReturn/scan.png                                                        |    0 
 pages/wareHouse/outsource/index.vue                                                          |  162 
 static/custom/moveWareHouse/label-icon-1.png                                                 |    0 
 pages/product/pick/index.vue                                                                 |  126 
 static/uview/example/js.png                                                                  |    0 
 pages/sys/login/userPassword.vue                                                             |  177 
 static/custom/materialReturn/unselected-btn.png                                              |    0 
 common/moment.js                                                                             | 1848 +
 pages/daily/common/work-order-list.vue                                                       |  359 
 uview-ui/components/u-row/u-row.vue                                                          |   84 
 uni.scss                                                                                     |   41 
 uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue                      |  431 
 static/custom/daily/icon_8.png                                                               |    0 
 uni_modules/wu-icon/components/wu-icon/wu-icon.vue                                           |  225 
 uni_modules/uni-collapse/changelog.md                                                        |   38 
 uview-ui/components/u-column-notice/u-column-notice.vue                                      |  237 
 yarn.lock                                                                                    |   68 
 static/custom/daily/icon_1.png                                                               |    0 
 static/custom/finishProductIn/label-icon-3.png                                               |    0 
 static/custom/operationTask/workstation/icon_batch_submit.png                                |    0 
 uview-ui/components/u-parse/libs/handler.wxs                                                 |   22 
 static/custom/packing/backBg.png                                                             |    0 
 uni_modules/uni-list/components/uni-list/uni-refresh.wxs                                     |   87 
 uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue                                          |  488 
 static/custom/daily/icon_zl.png                                                              |    0 
 static/iconfont/iconfont.woff                                                                |    0 
 uni_modules/wu-ui-tools/libs/luch-request/core/dispatchRequest.js                            |    3 
 uni_modules/uni-scss/styles/setting/_text.scss                                               |   24 
 static/custom/outsource/bg2.png                                                              |    0 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json             |   22 
 static/custom/operationTask/workstation/icon_batch_save.png                                  |    0 
 uview-ui/components/u-number-box/u-number-box.vue                                            |  363 
 static/custom/tailHandle/label-icon-2.png                                                    |    0 
 uview-ui/components/u-search/u-search.vue                                                    |  342 
 static/custom/operationTask/in-progress-state-icon.png                                       |    0 
 uni_modules/uni-icons/readme.md                                                              |    8 
 uview-ui/components/u-form-item/u-form-item.vue                                              |  431 
 uni_modules/wu-icon/components/wu-icon/icons.js                                              |  159 
 uni_modules/wu-loading-icon/components/wu-loading-icon/wu-loading-icon.vue                   |  345 
 static/custom/productBack/label-icon-2.png                                                   |    0 
 static/common/js/touch-emulator.js                                                           |  363 
 pages/sys/login/index.scss                                                                   |  115 
 static/custom/inventory/icon4.png                                                            |    0 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue             |  177 
 uni_modules/uni-notice-bar/changelog.md                                                      |   20 
 uview-ui/libs/css/common.scss                                                                |  177 
 uni_modules/wu-ui-tools/package.json                                                         |   86 
 static/custom/packing/icon_2.png                                                             |    0 
 uview-ui/components/u-grid/u-grid.vue                                                        |  108 
 uni_modules/wu-icon/package.json                                                             |   87 
 uni_modules/wu-ui-tools/libs/function/color/color-name/LICENSE                               |    8 
 uni_modules/wu-ui-tools/libs/luch-request/utils.js                                           |  131 
 uview-ui/libs/util/province.js                                                               |    1 
 uni_modules/uni-list/readme.md                                                               |  346 
 uview-ui/libs/function/deepMerge.js                                                          |   30 
 static/custom/login/login-bg.png                                                             |    0 
 uni_modules/wu-ui-tools/changelog.md                                                         |   22 
 pages/sys/user/pwd.vue                                                                       |  121 
 uview-ui/components/u-line-progress/u-line-progress.vue                                      |  147 
 uview-ui/components/u-line/u-line.vue                                                        |   84 
 common/locales/zh_CN.js                                                                      |   36 
 uni_modules/wu-ui-tools/libs/luch-request/utils/clone.js                                     |  264 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js                 |    8 
 static/common/img/iPhoneX.png                                                                |    0 
 uview-ui/libs/css/style.nvue.scss                                                            |    3 
 pages/product/pick/ifsLocationList.vue                                                       |  132 
 pages/sys/pigxParam/form.vue                                                                 |  171 
 uview-ui/libs/function/debounce.js                                                           |   29 
 static/custom/inventory/label-icon-1.png                                                     |    0 
 static/custom/login/blue.png                                                                 |    0 
 uni_modules/uni-scss/styles/setting/_variables.scss                                          |  146 
 static/custom/banner/4.png                                                                   |    0 
 pages/oa/task.vue                                                                            |   73 
 static/custom/outsource/scan.png                                                             |    0 
 uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue                                    |  290 
 static/custom/daily/icon_report.png                                                          |    0 
 uni_modules/wu-ui-tools/libs/function/color/is-arrayish/package.json                         |   45 
 uni_modules/wu-ui-tools/libs/mixin/button.js                                                 |   13 
 uni_modules/wu-ui-tools/libs/mixin/touch.js                                                  |   59 
 store/$u.mixin.js                                                                            |   27 
 uview-ui/libs/function/sys.js                                                                |    9 
 uview-ui/libs/util/async-validator.js                                                        | 1356 
 uview-ui/components/u-count-to/u-count-to.vue                                                |  241 
 uview-ui/components/u-dropdown-item/u-dropdown-item.vue                                      |  132 
 static/custom/moveWareHouse/icon_dele.png                                                    |    0 
 static/custom/materialReturn/icon_edit.png                                                   |    0 
 static/custom/operationTask/book-icon.png                                                    |    0 
 static/custom/daily/icon_7.png                                                               |    0 
 uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/index.js                          |   29 
 uni_modules/wu-ui-tools/libs/mixin/openType.js                                               |   44 
 uview-ui/components/u-radio/u-radio.vue                                                      |  276 
 static/custom/inventory/header_icon.png                                                      |    0 
 uview-ui/components/u-action-sheet/u-action-sheet.vue                                        |  190 
 static/custom/packing/row_bg.png                                                             |    0 
 static/custom/daily/icon_2.png                                                               |    0 
 uview-ui/components/u-cell-group/u-cell-group.vue                                            |   70 
 uni_modules/wu-ui-tools/libs/css/components.scss                                             |   23 
 uni_modules/wu-ui-tools/theme.scss                                                           |   43 
 uview-ui/libs/function/getParent.js                                                          |   47 
 pages/product/pick/requirePartRecordList.vue                                                 |   95 
 uni_modules/wu-ui-tools/libs/luch-request/adapters/index.js                                  |   97 
 pages/sys/pigxTenant/index.vue                                                               |  121 
 uni_modules/wu-ui-tools/libs/function/color/color-string/LICENSE                             |   21 
 components/dict-tag/dict-tag.vue                                                             |   75 
 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue                   |  572 
 static/custom/inventory/locNoBg.png                                                          |    0 
 static/custom/home/inventory.png                                                             |    0 
 uview-ui/package.json                                                                        |   39 
 pages/product/produce/editReportWork.vue                                                     |  292 
 uview-ui/components/u-sticky/u-sticky.vue                                                    |  157 
 uni_modules/uni-load-more/readme.md                                                          |   14 
 uni_modules/uni-scss/readme.md                                                               |    4 
 uview-ui/components/u-parse/libs/config.js                                                   |   80 
 uni_modules/wu-ui-tools/libs/function/index.js                                               |  738 
 pages/product/outputRegister/productInList.vue                                               |  293 
 pages/product/produce/workstationList/index.vue                                              |  795 
 uview-ui/components/u-divider/u-divider.vue                                                  |  153 
 static/custom/finishProductIn/label-icon-2.png                                               |    0 
 pages/sys/pigxPost/form.vue                                                                  |  130 
 common/config.js                                                                             |   42 
 static/custom/finishProductIn/header_icon.png                                                |    0 
 pages/daily/production-person/production-person.vue                                          |  297 
 static/custom/inventory/icon3.png                                                            |    0 
 uni_modules/wu-button/components/wu-button/vue.scss                                          |   82 
 uview-ui/components/u-checkbox-group/u-checkbox-group.vue                                    |  123 
 components/scan/scan.vue                                                                     |   93 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/CHANGELOG.md                       |   54 
 static/custom/daily/icon_num.png                                                             |    0 
 static/custom/tabbar/msg_2.png                                                               |    0 
 static/custom/outsource/bg3.png                                                              |    0 
 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss                             |   58 
 uview-ui/components/u-verification-code/u-verification-code.vue                              |  164 
 pages/daily/tag-list/index.vue                                                               |  876 
 static/custom/tailHandle/label-icon-3.png                                                    |    0 
 static/custom/product/icon_dele.png                                                          |    0 
 uview-ui/iconfont.css                                                                        |  910 
 static/custom/tabbar/home_2.png                                                              |    0 
 uni_modules/uni-list/components/uni-list/uni-refresh.vue                                     |   65 
 uview-ui/components/u-waterfall/u-waterfall.vue                                              |  176 
 static/custom/product/label-icon-1.png                                                       |    0 
 util/ble/tsc.js                                                                              |  237 
 pages/product/produce/workstationList/dutyRecordWorkstation.vue                              |  342 
 uni_modules/uni-scss/styles/setting/_border.scss                                             |    3 
 uni_modules/wu-ui-tools/libs/function/color/color-name/README.md                             |   11 
 static/uview/common/favicon.ico                                                              |    0 
 uni_modules/wu-ui-tools/libs/mixin/mpMixin.js                                                |    8 
 uview-ui/components/u-picker/u-picker.vue                                                    |  676 
 static/uview/example/js_bak.png                                                              |    0 
 static/custom/moveWareHouse/del-icon.png                                                     |    0 
 pages/product/pick/moveDetailRecordList.vue                                                  |   98 
 package.json                                                                                 |   18 
 static/custom/finishProductIn/icon_dele.png                                                  |    0 
 static/custom/product/productBg.png                                                          |    0 
 static/y1253.mp3                                                                             |    0 
 uview-ui/components/u-icon/u-icon.vue                                                        |  336 
 static/custom/home/materialReturn.png                                                        |    0 
 uni_modules/wu-icon/components/wu-icon/props.js                                              |   90 
 common/http.interceptor.js                                                                   |  163 
 pages/product/labelPrint/labelPrint.vue                                                      |  711 
 uview-ui/theme.scss                                                                          |   38 
 pages/product/outputRegister/dutyPersonList.vue                                              |  133 
 uni_modules/uni-badge/changelog.md                                                           |   33 
 pages/wareHouse/jumpFinishProductIn/index.vue                                                |  296 
 static/custom/login/img_bg.png                                                               |    0 
 pages/sys/pigxUser/index.vue                                                                 |  126 
 components/js-lang/js-lang.vue                                                               |   69 
 static/custom/tabbar/kefu_1.png                                                              |    0 
 pages/product/outputRegister/optaskList.vue                                                  |   96 
 uview-ui/components/u-radio-group/u-radio-group.vue                                          |  128 
 static/uview/example/template.png                                                            |    0 
 static/custom/inventory/label-icon-2.png                                                     |    0 
 uview-ui/components/u-tabs/u-tabs.vue                                                        |  369 
 uview-ui/components/u-empty/u-empty.vue                                                      |  193 
 uni_modules/uni-icons/components/uni-icons/uniicons.ttf                                      |    0 
 pages/wareHouse/packing/index.vue                                                            |  213 
 uni_modules/uni-scss/styles/setting/_color.scss                                              |   66 
 pages/oa/history.vue                                                                         |  140 
 uni_modules/wu-loading-icon/readme.md                                                        |   16 
 uni_modules/wu-ui-tools/libs/function/color/is-arrayish/index.js                             |    9 
 uview-ui/index.js                                                                            |  141 
 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json                         |    5 
 common/spark-md5.js                                                                          |  751 
 uni_modules/uni-icons/changelog.md                                                           |   40 
 uni_modules/uni-section/package.json                                                         |   87 
 uni_modules/wu-ui-tools/libs/function/color/color-name/package.json                          |   28 
 uview-ui/libs/function/addUnit.js                                                            |    8 
 static/custom/daily/icon_camera.png                                                          |    0 
 static/custom/outsource/index_bg.png                                                         |    0 
 uni_modules/wu-button/components/wu-button/wu-button.vue                                     |  458 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue       | 1057 
 pages/product/feed/optaskList.vue                                                            |  269 
 static/custom/daily/icon_person.png                                                          |    0 
 uni_modules/wu-ui-tools/libs/function/color/is-arrayish/README.md                            |   16 
 uview-ui/libs/request/index.js                                                               |  172 
 uni_modules/uni-list/components/uni-list/uni-list.vue                                        |  123 
 uni_modules/uni-scss/styles/tools/functions.scss                                             |   19 
 uni_modules/wu-ui-tools/index.scss                                                           |    7 
 static/custom/home/icon_number.png                                                           |    0 
 static/custom/delete.png                                                                     |    0 
 static/custom/daily/icon_3.png                                                               |    0 
 static/custom/operationTask/workstation/icon_delete.png                                      |    0 
 uni_modules/wu-ui-tools/libs/luch-request/helpers/combineURLs.js                             |   14 
 uview-ui/libs/function/$parent.js                                                            |   18 
 uview-ui/libs/function/bem.js                                                                |    5 
 uni_modules/wu-ui-tools/libs/function/color/color-string/index.js                            |  244 
 uni_modules/wu-ui-tools/libs/luch-request/core/settle.js                                     |   16 
 uview-ui/components/u-index-list/u-index-list.vue                                            |  315 
 pages/product/feed/index.vue                                                                 |  756 
 static/custom/tabbar/home_1.png                                                              |    0 
 uview-ui/libs/function/timeFrom.js                                                           |   47 
 uview-ui/components/u-gap/u-gap.vue                                                          |   54 
 uni_modules/wu-ui-tools/libs/function/debounce.js                                            |   29 
 pages/product/outputRegister/printProductOutLabel.vue                                        |  495 
 uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue                  |  402 
 uni_modules/wu-ui-tools/libs/util/async-validator.js                                         | 1343 
 static/custom/outsource/bg4.png                                                              |    0 
 uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue                              |  593 
 uview-ui/components/u-parse/libs/MpHtmlParser.js                                             |  580 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json                  |   22 
 pages/sys/user/index-old.scss                                                                |   94 
 uni_modules/uni-icons/components/uni-icons/uniicons.css                                      |  664 
 uview-ui/components/u-td/u-td.vue                                                            |   66 
 uview-ui/libs/css/style.h5.scss                                                              |    8 
 uni_modules/uni-list/package.json                                                            |   88 
 static/custom/moveWareHouse/label-icon-3.png                                                 |    0 
 static/custom/product/label-icon-2.png                                                       |    0 
 static/uview/example/js_select.png                                                           |    0 
 uni_modules/uni-scss/theme.scss                                                              |   31 
 uview-ui/components/u-number-keyboard/u-number-keyboard.vue                                  |  158 
 uni_modules/wu-ui-tools/libs/function/color/color-string/README.md                           |   62 
 uview-ui/components/u-circle-progress/u-circle-progress.vue                                  |  220 
 uview-ui/components/u-section/u-section.vue                                                  |  154 
 uni_modules/wu-ui-tools/libs/mixin/mpShare.js                                                |   13 
 static/custom/operationTask/workstation/icon_clear.png                                       |    0 
 uview-ui/components/u-switch/u-switch.vue                                                    |  163 
 components/js-radio/js-radio.vue                                                             |   93 
 util/ble/encoding.js                                                                         | 3313 ++
 uni_modules/uni-icons/components/uni-icons/uni-icons.vue                                     |  110 
 uni_modules/uni-section/readme.md                                                            |    8 
 common/vue-i18n.min.js                                                                       |    6 
 uni_modules/wu-button/changelog.md                                                           |    6 
 static/custom/favicon.png                                                                    |    0 
 uview-ui/components/u-upload/u-upload.vue                                                    |  660 
 uni_modules/wu-ui-tools/libs/function/digit.js                                               |  167 
 uview-ui/components/u-th/u-th.vue                                                            |   62 
 static/custom/tabbar/kefu_2.png                                                              |    0 
 pages/wareHouse/outsource/packing.vue                                                        |  207 
 uni_modules/wu-ui-tools/libs/luch-request/core/defaults.js                                   |   29 
 pages/product/outputRegister/index.vue                                                       |  816 
 pages/sys/user/index-old.vue                                                                 |  122 
 static/custom/home/feeding.png                                                               |    0 
 uni_modules/wu-ui-tools/libs/css/vue.scss                                                    |   40 
 pages/sys/logs/index.vue                                                                     |  115 
 uni_modules/uni-icons/components/uni-icons/uni-icons.uvue                                    |   91 
 uview-ui/components/u-steps/u-steps.vue                                                      |  200 
 pages/daily/workstation/index.vue                                                            |  166 
 pages/wareHouse/outsource/check.vue                                                          |  209 
 static/custom/home/finishProductIn.png                                                       |    0 
 pages/wareHouse/inventory/detail.vue                                                         |  640 
 uni_modules/wu-icon/components/wu-icon/wuicons.ttf                                           |    0 
 uview-ui/components/u-swipe-action/u-swipe-action.vue                                        |  257 
 pages/product/outputRegister/shiftProductOut.vue                                             |  392 
 static/index.html                                                                            |   52 
 uni_modules/wu-ui-tools/libs/css/color.scss                                                  |   32 
 uview-ui/libs/function/toast.js                                                              |    9 
 uview-ui/components/u-no-network/u-no-network.vue                                            |  233 
 uview-ui/components/u-back-top/u-back-top.vue                                                |  153 
 static/custom/daily/icon_4.png                                                               |    0 
 uni_modules/uni-fab/package.json                                                             |   84 
 uni_modules/uni-collapse/package.json                                                        |   86 
 uni_modules/wu-button/readme.md                                                              |   16 
 uview-ui/components/u-dropdown/u-dropdown.vue                                                |  298 
 uni_modules/uni-datetime-picker/readme.md                                                    |   21 
 unpackage/debug/android_debug.apk                                                            |    0 
 uview-ui/components/u-car-keyboard/u-car-keyboard.vue                                        |  257 
 pages/product/produce/createReportWork.vue                                                   |  664 
 static/custom/inventory/icon_5.png                                                           |    0 
 uni_modules/wu-loading-icon/package.json                                                     |   88 
 utils/index.js                                                                               |   30 
 uview-ui/libs/function/throttle.js                                                           |   32 
 static/custom/packing/icon_1.png                                                             |    0 
 uview-ui/libs/function/colorGradient.js                                                      |  134 
 static/uview/common/logo.png                                                                 |    0 
 static/custom/tailHandle/label-icon-1.png                                                    |    0 
 uni_modules/uni-scss/changelog.md                                                            |    8 
 static/custom/tailHandle/header_icon.png                                                     |    0 
 uni_modules/wu-ui-tools/libs/css/common.scss                                                 |  100 
 static/custom/materialReturn/selected-btn-1.png                                              |    0 
 uni_modules/uni-data-select/changelog.md                                                     |   39 
 uview-ui/libs/function/randomArray.js                                                        |    7 
 uview-ui/libs/config/zIndex.js                                                               |   20 
 pages/sys/user/info.vue                                                                      |  161 
 uni_modules/wu-ui-tools/libs/function/color/color-string/package.json                        |   39 
 static/custom/operationTask/unsubmit-state-icon.png                                          |    0 
 static/custom/moveWareHouse/label-icon-2.png                                                 |    0 
 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue                         |  399 
 uni_modules/uni-scss/styles/index.scss                                                       |    7 
 uni_modules/wu-button/components/wu-button/nvue.scss                                         |   46 
 pages/wareHouse/inventory/partchoose.vue                                                     |  238 
 static/custom/finishProductIn/icon_edit.png                                                  |    0 
 uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue                                  |  107 
 uview-ui/libs/util/area.js                                                                   |    1 
 pages/wareHouse/materialReturn/index.vue                                                     |  641 
 pages/product/pick/materialNeed.vue                                                          |  179 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/conversions.js                     |  839 
 static/custom/daily/img8.png                                                                 |    0 
 static/custom/tailHandle/locNoBg.png                                                         |    0 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue               |  940 
 uview-ui/libs/function/test.js                                                               |  232 
 uni_modules/uni-list/changelog.md                                                            |   46 
 static/custom/home/moveWareHouse.png                                                         |    0 
 static/custom/operationTask/revoke-icon.png                                                  |    0 
 static/custom/productBack/icon_edit.png                                                      |    0 
 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json                         |    5 
 uview-ui/libs/config/config.js                                                               |   15 
 uni_modules/uni-icons/package.json                                                           |   88 
 static/custom/packing/click-unselected.png                                                   |    0 
 uview-ui/components/u-lazy-load/u-lazy-load.vue                                              |  244 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/package.json                       |   48 
 uni_modules/uni-scss/variables.scss                                                          |   62 
 uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue                            |  147 
 uni_modules/uni-datetime-picker/package.json                                                 |   88 
 pages/sys/login/smsCode.vue                                                                  |  214 
 pages/product/report/index.scss                                                              |  113 
 uview-ui/README.md                                                                           |  106 
 static/custom/finishProductIn/locNoBg.png                                                    |    0 
 uview-ui/components/u-row-notice/u-row-notice.vue                                            |  269 
 components/js-uploadfile/js-uploadfile.vue                                                   |  296 
 pages/wareHouse/finishProductIn/index.vue                                                    |  718 
 static/custom/home/packing.png                                                               |    0 
 pages/wareHouse/inventory/locNoList.vue                                                      |  281 
 uni_modules/uni-scss/styles/setting/_space.scss                                              |   56 
 uni_modules/uni-scss/styles/setting/_styles.scss                                             |  167 
 static/custom/banner/2.svg                                                                   |   88 
 uni_modules/uni-load-more/changelog.md                                                       |   19 
 uview-ui/components/u-cell-item/u-cell-item.vue                                              |  316 
 uview-ui/components/u-loadmore/u-loadmore.vue                                                |  203 
 pages/product/pick/ifsStock.vue                                                              |  180 
 uview-ui/components/u-popup/u-popup.vue                                                      |  456 
 static/custom/operationTask/submit-state-icon.png                                            |    0 
 pages/daily/tool/tool.vue                                                                    |  207 
 static/custom/daily/icon_history.png                                                         |    0 
 uni_modules/uni-segmented-control/package.json                                               |   85 
 common/http.api.js                                                                           |  498 
 pages/daily/common/work-reporting.vue                                                        | 1644 +
 uview-ui/components/u-input/u-input.vue                                                      |  387 
 uni_modules/wu-ui-tools/libs/luch-request/core/Request.js                                    |  198 
 uni_modules/wu-ui-tools/libs/luch-request/helpers/buildURL.js                                |   69 
 uview-ui/components/u-mask/u-mask.vue                                                        |  123 
 uview-ui/libs/function/random.js                                                             |   10 
 uview-ui/LICENSE                                                                             |   21 
 static/uview/example/min_button_select.png                                                   |    0 
 uview-ui/components/u-avatar-cropper/weCropper.js                                            | 1265 
 uni_modules/wu-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js                           |   14 
 uview-ui/components/u-skeleton/u-skeleton.vue                                                |  199 
 uview-ui/components/u-button/u-button.vue                                                    |  596 
 uview-ui/index.scss                                                                          |   23 
 static/custom/daily/icon_save.png                                                            |    0 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/README.md                          |   68 
 uni_modules/uni-badge/package.json                                                           |   85 
 pages/wareHouse/packing/form.vue                                                             |  224 
 static/custom/operationTask/red-delete-icon.png                                              |    0 
 static/uview/example/component_select.png                                                    |    0 
 uview-ui/libs/css/style.mp.scss                                                              |   72 
 uview-ui/components/u-modal/u-modal.vue                                                      |  283 
 static/uview/example/min_button.png                                                          |    0 
 pages/sys/login/bindUser.vue                                                                 |   86 
 static/custom/inventory/label-icon-3.png                                                     |    0 
 uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue                    |  147 
 uni_modules/wu-loading-icon/components/wu-loading-icon/props.js                              |   60 
 uview-ui/components/u-image/u-image.vue                                                      |  267 
 pages/sys/pigxTenant/form.vue                                                                |  128 
 static/custom/daily/icon_bt_bg.png                                                           |    0 
 utils/date.js                                                                                |   86 
 uni_modules/uni-scss/styles/setting/_radius.scss                                             |   55 
 uview-ui/components/u-grid-item/u-grid-item.vue                                              |  126 
 uview-ui/components/u-field/u-field.vue                                                      |  384 
 pages/product/produce/workstationList/dutyRecordHistory.vue                                  |  403 
 static/uview/example/template_select.png                                                     |    0 
 static/custom/packing/num-bg.png                                                             |    0 
 static/custom/user/img_tx.png                                                                |    0 
 uview-ui/components/u-navbar/u-navbar.vue                                                    |  315 
 static/custom/operationTask/edit-icon.png                                                    |    0 
 uni_modules/wu-ui-tools/libs/mixin/mixin.js                                                  |  188 
 static/custom/operationTask/time-icon.png                                                    |    0 
 static/custom/daily/icon_5.png                                                               |    0 
 uni_modules/uni-fab/readme.md                                                                |    9 
 static/custom/productBack/backBg.png                                                         |    0 
 pages/sys/user/index.vue                                                                     |  100 
 uview-ui/libs/function/guid.js                                                               |   41 
 static/custom/finishProductIn/info-bg.png                                                    |    0 
 pages/sys/pigxPost/index.vue                                                                 |  113 
 uview-ui/components/u-swiper/u-swiper.vue                                                    |  340 
 static/custom/operationTask/black-edit-icon.png                                              |    0 
 uview-ui/components/u-slider/u-slider.vue                                                    |  257 
 uview-ui/components/u-notice-bar/u-notice-bar.vue                                            |  272 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/LICENSE                            |   21 
 static/custom/user/bg2.png                                                                   |    0 
 pages/product/produce/operationTaskInfo.vue                                                  |   70 
 h5.html                                                                                      |   50 
 uview-ui/components/u-collapse/u-collapse.vue                                                |   99 
 pages/product/feed/locationList.vue                                                          |  196 
 uview-ui/components/u-parse/libs/CssHandler.js                                               |  100 
 uview-ui/components/u-full-screen/u-full-screen.vue                                          |   52 
 uni_modules/wu-ui-tools/components/wu-ui-tools/wu-ui-tools.vue                               |    6 
 pages/sys/home/index.vue                                                                     |  122 
 static/custom/daily/icon_del.png                                                             |    0 
 uni_modules/uni-list/components/uni-list-item/uni-list-item.vue                              |  534 
 static/custom/tabbar/my_2.png                                                                |    0 
 uview-ui/libs/function/md5.js                                                                |  385 
 static/custom/operationTask/enter-icon.png                                                   |    0 
 uni_modules/wu-ui-tools/libs/function/color/color-name/index.js                              |  152 
 static/custom/home/home_img_bg.png                                                           |    0 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js                       |  421 
 pages/wareHouse/inventory/index.vue                                                          |  272 
 static/custom/banner/3.svg                                                                   |   56 
 uni_modules/uni-section/changelog.md                                                         |    2 
 uni_modules/wu-ui-tools/libs/util/dayjs.js                                                   |  218 
 pages/sys/pigxParam/index.vue                                                                |  122 
 static/custom/packing/icon_dele.png                                                          |    0 
 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json                              |    5 
 .gitignore                                                                                   |   10 
 common/base64.js                                                                             |   74 
 uview-ui/components/u-parse/u-parse.vue                                                      |  645 
 static/custom/materialReturn/unselected-btn-1.png                                            |    0 
 pages/oa/todos.vue                                                                           |  128 
 uview-ui/libs/mixin/mixin.js                                                                 |   64 
 static/custom/operationTask/black-del-icon.png                                               |    0 
 static/iconfont/iconfont.css                                                                 |  463 
 pages/wareHouse/jumpZTE/jumpZTE.vue                                                          |  285 
 uni_modules/wu-ui-tools/libs/function/platform.js                                            |   75 
 uni_modules/uni-collapse/readme.md                                                           |   12 
 uni_modules/wu-ui-tools/libs/luch-request/index.d.ts                                         |  116 
 static/custom/operationTask/black-revoke-icon.png                                            |    0 
 uview-ui/components/u-alert-tips/u-alert-tips.vue                                            |  256 
 uni_modules/wu-icon/readme.md                                                                |   10 
 components/js-select/js-select.vue                                                           |   93 
 pages/wareHouse/outsource/sampling.vue                                                       |  173 
 static/custom/home/feed.png                                                                  |    0 
 static/custom/outsource/content_bg.png                                                       |    0 
 pages/common/webview.vue                                                                     |   33 
 uview-ui/libs/util/emitter.js                                                                |   51 
 static/custom/materialReturn/backBg.png                                                      |    0 
 pages/product/tailHandle/index.vue                                                           |  412 
 static/custom/daily/icon_6.png                                                               |    0 
 uview-ui/components/u-index-anchor/u-index-anchor.vue                                        |   89 
 uview-ui/components/u-time-line/u-time-line.vue                                              |   43 
 uview-ui/components/u-tabbar/u-tabbar.vue                                                    |  330 
 pages/wareHouse/packing/registration.vue                                                     |  579 
 static/iconfont/iconfont.ttf                                                                 |    0 
 static/custom/packing/person_row_bg.png                                                      |    0 
 uview-ui/components/u-loading-page/u-loading-page.vue                                        |   25 
 uview-ui/libs/css/style.components.scss                                                      |    7 
 manifest.json                                                                                |  192 
 static/custom/materialReturn/label-icon-2.png                                                |    0 
 pages/wareHouse/finishProductIn/locNoList.vue                                                |  257 
 uni_modules/uni-badge/components/uni-badge/uni-badge.vue                                     |  268 
 uni_modules/uni-fab/components/uni-fab/uni-fab.vue                                           |  491 
 uview-ui/components/u-parse/libs/trees.vue                                                   |  505 
 uview-ui/components/u-message-input/u-message-input.vue                                      |  311 
 uview-ui/libs/function/queryParams.js                                                        |   58 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/index.js                           |   81 
 static/custom/daily/icon_dy.png                                                              |    0 
 uni_modules/wu-ui-tools/libs/luch-request/index.js                                           |    3 
 uni_modules/wu-ui-tools/libs/css/variable.scss                                               |  111 
 uview-ui/components/u-subsection/u-subsection.vue                                            |  355 
 static/custom/moveWareHouse/locNoBg.png                                                      |    0 
 uni_modules/uni-notice-bar/package.json                                                      |   87 
 uni_modules/uni-notice-bar/readme.md                                                         |   13 
 static/custom/tabbar/my_1.png                                                                |    0 
 uview-ui/libs/css/color.scss                                                                 |  155 
 static/custom/home/productBack.png                                                           |    0 
 pages/product/outputRegister/workstationFeedList.vue                                         |  211 
 store/bluetooth/index.js                                                                     |   23 
 uni_modules/uni-data-select/readme.md                                                        |    8 
 uni_modules/wu-ui-tools/libs/luch-request/core/InterceptorManager.js                         |   50 
 uview-ui/components/u-card/u-card.vue                                                        |  299 
 pages/product/produce/workstationList/workstationList.vue                                    |  287 
 uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/LICENSE                           |   21 
 uni_modules/uni-segmented-control/changelog.md                                               |   15 
 uni_modules/wu-ui-tools/libs/function/throttle.js                                            |   30 
 uview-ui/libs/function/type2icon.js                                                          |   35 
 pages/product/feed/workstationList.vue                                                       |  285 
 static/uview/example/component.png                                                           |    0 
 pages/product/produce/index.vue                                                              |  698 
 pages/wareHouse/outsource/instock.vue                                                        |  206 
 uview-ui/libs/function/timeFormat.js                                                         |   51 
 static/custom/packing/click-selected.png                                                     |    0 
 pages/product/report/index.vue                                                               |  489 
 uni_modules/uni-load-more/package.json                                                       |   86 
 uni_modules/wu-ui-tools/libs/function/color/index.js                                         |  158 
 project.config.json                                                                          |   75 
 static/custom/daily/icon_edit.png                                                            |    0 
 static/custom/operationTask/label-icon-1.png                                                 |    0 
 pages/daily/common/work-reporting-detail.vue                                                 |  710 
 static/custom/finishProductIn/del-icon.png                                                   |    0 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue                  |  947 
 pages/product/outputRegister/addProductOut.vue                                               |  506 
 uview-ui/libs/store/index.js                                                                 |   19 
 uni_modules/uni-datetime-picker/changelog.md                                                 |  160 
 store/index.js                                                                               |   78 
 pages/wareHouse/moveWareHouse/locNoList.vue                                                  |  263 
 static/custom/finishProductIn/label-icon-1.png                                               |    0 
 components/tki-qrcode/tki-qrcode.vue                                                         |  210 
 static/custom/login/eye_close.png                                                            |    0 
 components/js-checkbox/js-checkbox.vue                                                       |  100 
 uview-ui/components/u-top-tips/u-top-tips.vue                                                |  121 
 pages/sys/pigxUser/form.vue                                                                  |  156 
 uni_modules/wu-ui-tools/libs/function/color/color.js                                         |  496 
 pages/wareHouse/outsource/layout.vue                                                         |  111 
 static/custom/inventory/carmera.png                                                          |    0 
 uview-ui/components/u-badge/u-badge.vue                                                      |  217 
 pages/daily/tag-list/add.vue                                                                 |  168 
 common/errorCode.js                                                                          |   13 
 static/custom/tabbar/msg_1.png                                                               |    0 
 pages/wareHouse/outsource/report.vue                                                         |  160 
 static/custom/materialReturn/label-icon-1.png                                                |    0 
 uni_modules/wu-ui-tools/readme.md                                                            |   18 
 uni_modules/wu-ui-tools/libs/util/route.js                                                   |  124 
 uview-ui/components/u-rate/u-rate.vue                                                        |  275 
 uview-ui/components/u-read-more/u-read-more.vue                                              |  179 
 pages/wareHouse/productBack/index.vue                                                        |  487 
 pages/product/feed/feedRecordList.vue                                                        |  179 
 static/custom/home/banner.png                                                                |    0 
 uview-ui/components/u-col/u-col.vue                                                          |  156 
 uni_modules/wu-icon/changelog.md                                                             |   10 
 pages/sys/login/index.vue                                                                    |  322 
 uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js                              |  649 
 uview-ui/components/u-form/u-form.vue                                                        |  134 
 uni_modules/wu-ui-tools/libs/luch-request/core/buildFullPath.js                              |   20 
 uni_modules/wu-ui-tools/libs/function/color/is-arrayish/yarn-error.log                       | 1443 
 uview-ui/components/u-collapse-item/u-collapse-item.vue                                      |  204 
 util/ble/util.js                                                                             |   19 
 uview-ui/components/u-toast/u-toast.vue                                                      |  220 
 common/locales/en.js                                                                         |   35 
 uview-ui/libs/util/city.js                                                                   |    1 
 uni_modules/wu-ui-tools/libs/function/color/color-convert/route.js                           |   97 
 uview-ui/libs/mixin/mpShare.js                                                               |   18 
 uview-ui/components/u-time-line-item/u-time-line-item.vue                                    |   83 
 uni_modules/uni-icons/components/uni-icons/uniicons_file.ts                                  |  664 
 pages/wareHouse/packing/detail.vue                                                           |  398 
 static/custom/daily/icon_number.png                                                          |    0 
 static/custom/login/eye_open.png                                                             |    0 
 static/custom/banner/1.svg                                                                   |  158 
 pages/product/produce/reportWork.vue                                                         |  865 
 uview-ui/components/u-checkbox/u-checkbox.vue                                                |  284 
 uview-ui/components/u-loading/u-loading.vue                                                  |  103 
 uview-ui/components/u-tag/u-tag.vue                                                          |  294 
 pages/sys/pigxRole/index.vue                                                                 |  124 
 pages/daily/daily/daily-list.vue                                                             |  228 
 util/ble/esc.js                                                                              |  355 
 pages.json                                                                                   |  802 
 pages/sys/token/index.vue                                                                    |   99 
 static/custom/daily/icon_choose.png                                                          |    0 
 static/custom/moveWareHouse/header_icon.png                                                  |    0 
 uview-ui/components/u-avatar/u-avatar.vue                                                    |  244 
 pages/product/produce/workstationList/unSubmitDutyRecord.vue                                 |  369 
 pages/product/outputRegister/editProductOut.vue                                              |  270 
 pages/sys/pigxRole/form.vue                                                                  |  142 
 pages/wareHouse/moveWareHouse/index.vue                                                      |  525 
 pages/util/bleConnect.vue                                                                    |  376 
 uni_modules/wu-button/package.json                                                           |   90 
 uview-ui/components/u-count-down/u-count-down.vue                                            |  318 
 uni_modules/uni-segmented-control/readme.md                                                  |   13 
 components/tki-qrcode/qrcode.js                                                              | 1201 
 pages/oa/form.vue                                                                            |  116 
 uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/package.json                      |   36 
 static/custom/outsource/bg1.png                                                              |    0 
 pages/sys/logs/form.vue                                                                      |   54 
 uni_modules/uni-badge/readme.md                                                              |   10 
 uni_modules/uni-data-select/package.json                                                     |   86 
 uview-ui/libs/css/style.vue.scss                                                             |  175 
 uview-ui/components/u-link/u-link.vue                                                        |   89 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json             |   22 
 static/custom/home/icon_edit.png                                                             |    0 
 App.vue                                                                                      |   80 
 static/custom/operationTask/blue-submit-icon.png                                             |    0 
 static/custom/productBack/label-icon-1.png                                                   |    0 
 uview-ui/libs/function/trim.js                                                               |   15 
 pages/product/tailHandle/workstationList.vue                                                 |  285 
 static/custom/daily/background.png                                                           |    0 
 uni_modules/uni-scss/index.scss                                                              |    1 
 uni_modules/wu-ui-tools/index.js                                                             |   73 
 uview-ui/components/u-select/u-select.vue                                                    |  424 
 pages/product/outputRegister/workstationList.vue                                             |  156 
 uni_modules/uni-scss/package.json                                                            |   82 
 uview-ui/components/u-table/u-table.vue                                                      |   84 
 uview-ui/libs/function/deepClone.js                                                          |   23 
 uni_modules/wu-ui-tools/libs/luch-request/core/mergeConfig.js                                |  103 
 uview-ui/components/u-tr/u-tr.vue                                                            |   25 
 static/uview/example/js_select_bak.png                                                       |    0 
 uview-ui/components/u-calendar/u-calendar.vue                                                |  639 
 uview-ui/libs/function/color.js                                                              |   37 
 pages/daily/handyman/handyman.vue                                                            |  268 
 static/custom/operationTask/workstation/icon_history.png                                     |    0 
 static/custom/product/del-icon.png                                                           |    0 
 uni_modules/wu-loading-icon/changelog.md                                                     |   12 
 617 files changed, 95,564 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..aca93bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,10 @@
+/unpackage/dist/*
+/unpackage/cache/*
+/unpackage/release/*
+/unpackage/res/*
+/node_modules/*
+/.hbuilderx/*
+/.vscode/*
+/.idea/*
+deploy.sh
+/package-lock.json
\ No newline at end of file
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..a8e4254
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,80 @@
+<script>
+	import config from '@/common/config.js';
+	export default {
+		onLaunch() {
+			// #ifdef APP-PLUS
+			// 妫�娴嬪崌绾�
+			// let appid = plus.runtime.appid;
+			// let version = plus.runtime.version;
+			// uni.showToast({
+			// 	title:plus.runtime.version
+			// })
+			/*uni.request({
+				url: 'https://www.pgyer.com/apiv2/app/check', //妫�鏌ユ洿鏂扮殑鏈嶅姟鍣ㄥ湴鍧�锛堣挷鍏嫳锛�
+				data: {
+					_api_key: config._api_key,
+					appKey: config.appKey,
+					buildVersion: plus.runtime.version
+				},
+				success: (res) => {
+					// uni.showToast({
+					// 	title: JSON.stringify(res.data.data.downloadURL)
+					// })
+					if (res.data.code == 0 && res.data.data.buildHaveNewVersion) {
+						// let openUrl = plus.os.name === 'iOS' ? res.data.iOS : res.data.Android;
+						let openUrl = res.data.data.downloadURL;
+						// 鎻愰啋鐢ㄦ埛鏇存柊
+						uni.showModal({
+							title: '鏇存柊鎻愮ず',
+							confirmText:'鏇存柊',
+							content: res.data.buildUpdateDescription ? res.data.buildUpdateDescription : '鏄惁閫夋嫨鏇存柊?',
+							success: (showResult) => {
+								if (showResult.confirm) {
+									if (uni.getSystemInfoSync().platform == "android") {
+										uni.showToast({
+											title: '姝e湪鍚庡彴杩涜涓嬭浇...',  
+											icon:'none',
+											mask: false,
+											duration: 1500  
+										});  
+										var dtask = plus.downloader.createDownload( openUrl, {}, function ( d, status ) {  
+											// 涓嬭浇瀹屾垚  
+											if ( status == 200 ) {   
+												plus.runtime.install(plus.io.convertLocalFileSystemURL(d.filename),{},{},function(error){  
+													uni.showToast({  
+														title: '瀹夎澶辫触',  
+														icon:'none',
+														mask: false,  
+														duration: 1500  
+													});  
+												})  
+											} else {  
+												 uni.showToast({  
+													title: '鏇存柊澶辫触', 
+													icon:'none',
+													mask: false,  
+													duration: 1500  
+												 });  
+											}    
+										});  
+										dtask.start();  
+									} else {
+										plus.runtime.openURL(openUrl);
+									}
+								}
+							}
+						})
+					}
+				}
+			})*/
+			// #endif
+		}
+	}
+</script>
+<style>
+	@import url("@/static/iconfont/iconfont.css");
+</style>
+<style lang="scss">
+	@import "uview-ui/index.scss";
+	@import "pages/common/common.scss";
+</style>
diff --git a/common/base64.js b/common/base64.js
new file mode 100644
index 0000000..3edc008
--- /dev/null
+++ b/common/base64.js
@@ -0,0 +1,74 @@
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define([], function() {factory(root);});
+    } else factory(root);
+// node.js has always supported base64 conversions, while browsers that support
+// web workers support base64 too, but you may never know.
+})(typeof exports !== "undefined" ? exports : this, function(root) {
+    if (root.atob) {
+        // Some browsers' implementation of atob doesn't support whitespaces
+        // in the encoded string (notably, IE). This wraps the native atob
+        // in a function that strips the whitespaces.
+        // The original function can be retrieved in atob.original
+        try {
+            root.atob(" ");
+        } catch(e) {
+            root.atob = (function(atob) {
+                var func = function(string) {
+                    return atob(String(string).replace(/[\t\n\f\r ]+/g, ""));
+                };
+                func.original = atob;
+                return func;
+            })(root.atob);
+        }
+        return;
+    }
+
+        // base64 character set, plus padding character (=)
+    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",
+        // Regular expression to check formal correctness of base64 encoded strings
+        b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;
+
+    root.btoa = function(string) {
+        string = String(string);
+        var bitmap, a, b, c,
+            result = "", i = 0,
+            rest = string.length % 3; // To determine the final padding
+
+        for (; i < string.length;) {
+            if ((a = string.charCodeAt(i++)) > 255
+                    || (b = string.charCodeAt(i++)) > 255
+                    || (c = string.charCodeAt(i++)) > 255)
+                throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.");
+
+            bitmap = (a << 16) | (b << 8) | c;
+            result += b64.charAt(bitmap >> 18 & 63) + b64.charAt(bitmap >> 12 & 63)
+                    + b64.charAt(bitmap >> 6 & 63) + b64.charAt(bitmap & 63);
+        }
+
+        // If there's need of padding, replace the last 'A's with equal signs
+        return rest ? result.slice(0, rest - 3) + "===".substring(rest) : result;
+    };
+
+    root.atob = function(string) {
+        // atob can work with strings with whitespaces, even inside the encoded part,
+        // but only \t, \n, \f, \r and ' ', which can be stripped.
+        string = String(string).replace(/[\t\n\f\r ]+/g, "");
+        if (!b64re.test(string))
+            throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");
+
+        // Adding the padding if missing, for semplicity
+        string += "==".slice(2 - (string.length & 3));
+        var bitmap, result = "", r1, r2, i = 0;
+        for (; i < string.length;) {
+            bitmap = b64.indexOf(string.charAt(i++)) << 18 | b64.indexOf(string.charAt(i++)) << 12
+                    | (r1 = b64.indexOf(string.charAt(i++))) << 6 | (r2 = b64.indexOf(string.charAt(i++)));
+
+            result += r1 === 64 ? String.fromCharCode(bitmap >> 16 & 255)
+                    : r2 === 64 ? String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255)
+                    : String.fromCharCode(bitmap >> 16 & 255, bitmap >> 8 & 255, bitmap & 255);
+        }
+        return result;
+    };
+});
\ No newline at end of file
diff --git a/common/config.js b/common/config.js
new file mode 100644
index 0000000..3f42fa4
--- /dev/null
+++ b/common/config.js
@@ -0,0 +1,42 @@
+const config = {
+  // 浜у搧鍚嶇О
+  productName: "Pig Mobile",
+
+  // 鍏徃鍚嶇О
+  companyName: "Pig4cloud",
+
+  // 浜у搧鐗堟湰鍙�
+  productVersion: "V4.3.2",
+
+  // 鐗堟湰妫�鏌ユ爣璇�
+  appCode: "android",
+
+  // 鍐呴儴鐗堟湰鍙风爜
+  appVersion: 1,
+
+  // 绠$悊鍩虹璺緞
+  adminPath: "/admin",
+};
+
+// 璁剧疆鍚庡彴鎺ュ彛鏈嶅姟鐨勫熀纭�鍦板潃
+config.env = "development";
+// config.baseUrl = 'https://mes-demo.asun.cloud';
+// config.baseUrl = "http://192.168.32.65:9999";
+config.baseUrl = "";
+config._api_key = "7a0e8d2d441f8233ef0f3683ca2fc848";
+config.appKey = "55e70d3b74c1c8a70481173bf233a5e1";
+config.downLoadEnv = "development";
+
+config.appv = "4.0.2";
+
+//config.env='production'
+//config.baseUrl = 'http://192.168.20.116:9999'
+//config._api_key='de69e16f6b5432792ad40e52892b251e'
+//config.appKey='e710f4d0503c3ce0d5d20e060691f189'
+//config.downLoadEnv='production'
+
+// 寤鸿锛氭墦寮�涓嬮潰娉ㄩ噴锛屾柟渚挎牴鎹幆澧冿紝鑷姩璁惧畾鏈嶅姟鍦板潃
+if (process.env.NODE_ENV === "development") {
+}
+
+export default config;
diff --git a/common/errorCode.js b/common/errorCode.js
new file mode 100644
index 0000000..4805023
--- /dev/null
+++ b/common/errorCode.js
@@ -0,0 +1,13 @@
+export default {
+  '000': '鎿嶄綔澶绻侊紝璇峰嬁閲嶅璇锋眰',
+  '401': '褰撳墠鎿嶄綔娌℃湁鏉冮檺',
+  '403': '褰撳墠鎿嶄綔娌℃湁鏉冮檺',
+  '404': '璧勬簮涓嶅瓨鍦�',
+  '417': '鏈粦瀹氱櫥褰曡处鍙凤紝璇蜂娇鐢ㄥ瘑鐮佺櫥褰曞悗缁戝畾',
+  '423': '婕旂ず鐜涓嶈兘鎿嶄綔锛屽闇�浜嗚В鑱旂郴鎴戜滑',
+  '426': '鐢ㄦ埛鍚嶄笉瀛樺湪鎴栧瘑鐮侀敊璇�',
+  '428': '楠岃瘉鐮侀敊璇�,璇烽噸鏂拌緭鍏�',
+  '429': '璇锋眰杩囬绻�',
+  '479': '婕旂ず鐜锛屾病鏈夋潈闄愭搷浣�',
+  'default': '绯荤粺鏈煡閿欒,璇峰弽棣堢粰绠$悊鍛�'
+}
diff --git a/common/http.api.js b/common/http.api.js
new file mode 100644
index 0000000..0434dd3
--- /dev/null
+++ b/common/http.api.js
@@ -0,0 +1,498 @@
+const install = (Vue, vm) => {
+	// 灏嗗悇涓畾涔夌殑鎺ュ彛鍚嶇О锛岀粺涓�鏀捐繘瀵硅薄鎸傝浇鍒皏m.$u.api(鍥犱负vm灏辨槸this锛屼篃鍗硉his.$u.api)涓�
+	vm.$u.api = {
+		// 鐧诲綍璁よ瘉鐩稿叧鎺ュ彛
+		login: (params = {}, formData = {}, header = {}) => vm.$u.post('/auth/oauth/token?randomStr=' + params
+			.randomStr + '&code=' + params.code + '&grant_type=' + params.grant_type, formData, header),
+		refreshToken: (params = {}, formData = {}, header = {}) => vm.$u.post('/auth/oauth/token?grant_type=' +
+			params.grant_type + '&refresh_token=' + params.refresh_token + '&client_id=' + params
+			.client_id + '&client_secret=' + params.client_secret, formData, header),
+		vxLogin: (params = {}, header = {}) => vm.$u.post('/auth/oauth/token?grant_type=mobile&mobile=MINI@' +
+			params.code + '&code=' + params.code, {}, header),
+		bingUser: (params = {}, header = {}) => vm.$u.post('/admin/social/bind?state=MINI&code=' + params
+			.code, {}, header),
+		smsLogin: (params = {}, header = {}) => vm.$u.post('/auth/oauth/token?mobile=SMS@' + params.mobile +
+			'&code=' + params.code + '&grant_type=mobile', {}, header),
+		sendCode: (params = {}, header = {}) => vm.$u.get('/admin/mobile/' + params.mobile, {}, header),
+		logout: (params = {}) => vm.$u.delete('/auth/token/logout', params),
+
+		// 瀛楀吀
+		dictData: (params = {}) => vm.$u.get('/admin/dict/type/' + params.dictType),
+
+		// 涓汉淇℃伅
+		user: {
+			getUserInfo: () => vm.$u.get('/admin/user/info'),
+			updateUserInfo: (params = {}) => vm.$u.put('/admin/user/edit', params),
+			infoSaveBase: (params = {}) => vm.$u.post('/admin/sys/user/infoSaveBase', params),
+			infoSavePwd: (params = {}) => vm.$u.post('/admin/sys/user/infoSavePwd', params),
+		},
+
+		// 瀛楀吀
+		dict: {
+			type: (params = {}) => vm.$u.get('/admin/dict/type/' + params)
+		},
+
+		// pigx鏂囦欢绠$悊
+		pigxFile: {
+			upload: (params = {}) => vm.$u.post('/admin/sys-file/upload')
+		},
+
+		// pigx 閮ㄩ棬绠$悊
+		pigxDept: {
+			list: (params = {}) => vm.$u.get('/admin/dept/list', params)
+		},
+
+		// pigx 宀椾綅绠$悊
+		pigxPost: {
+			// 鍒楀嚭鎵�鏈�
+			list: (params = {}) => vm.$u.get('/admin/post/list', params),
+
+			// 鍒嗛〉
+			fetchList: (params = {}) => vm.$u.get('/admin/post/page', params),
+
+			// 鏂板
+			addObj: (obj = {}) => vm.$u.post('/admin/post', obj),
+
+			// 淇敼
+			putObj: (obj = {}) => vm.$u.put('/admin/post', obj),
+
+			// 鍒犻櫎
+			delObj: (params) => vm.$u.delete('/admin/post/' + params.id),
+
+			// 鏌ヨ
+			getObj: (params) => vm.$u.get('/admin/post/' + params.id)
+		},
+
+		// pigx 瑙掕壊绠$悊
+		pigxRole: {
+			// 鍒楀嚭鎵�鏈�
+			list: (params = {}) => vm.$u.get('/admin/role/list', params),
+
+			// 鍒嗛〉
+			fetchList: (params = {}) => vm.$u.get('/admin/role/page', params),
+
+			// 鏂板
+			addObj: (obj = {}) => vm.$u.post('/admin/role', obj),
+
+			// 淇敼
+			putObj: (obj = {}) => vm.$u.put('/admin/role', obj),
+
+			// 鍒犻櫎
+			delObj: (params) => vm.$u.delete('/admin/role/' + params.id),
+
+			// 鏌ヨ
+			getObj: (params) => vm.$u.get('/admin/role/' + params.id)
+		},
+
+		// pigx 鐢ㄦ埛绠$悊
+		pigxUser: {
+			page: (params = {}) => vm.$u.get('/admin/user/page', params),
+			delete: (params = {}) => vm.$u.delete('/admin/user/' + params.id),
+			getOne: (params = {}) => vm.$u.get('/admin/user/' + params.id),
+			putObj: (params = {}) => vm.$u.put('/admin/user', params)
+		},
+
+		//pigx 浠ょ墝绠$悊
+		pigxToken: {
+			page: (params = {}) => vm.$u.get('/admin/token/page', params),
+			delete: (params = {}) => vm.$u.delete('/admin/token/' + params.token),
+		},
+
+		//pigx 鏃ュ織绠$悊
+		pigxLog: {
+			page: (params = {}) => vm.$u.get('/admin/log/page', params),
+			delete: (params = {}) => vm.$u.delete('/admin/log/' + params.id),
+		},
+
+		// pigx 宸ヤ綔娴�
+		pigxOA: {
+			queryTodos: (params = {}) => vm.$u.get('/act/task/todo', params),
+			queryBill: (params = {}) => vm.$u.get('/act/leave-bill/' + params.leaveId),
+			delBill: (params = {}) => vm.$u.delete('/act/leave-bill/' + params.leaveId),
+			submitBill: (params = {}) => vm.$u.get('/act/leave-bill/submit/' + params.leaveId),
+			queryBillPage: (params = {}) => vm.$u.get('/act/leave-bill/page', params),
+			getTask: (params = {}) => vm.$u.get('/act/task/' + params.taskId),
+			addTask: (params = {}) => vm.$u.post('/act/leave-bill', params),
+			doTask: (params = {}) => vm.$u.post('/act/task', params),
+		},
+
+		// pigx 绉熸埛绠$悊
+		pigxTenant: {
+			// 鍒嗛〉
+			fetchList: (params = {}) => vm.$u.get('/admin/tenant/page', params),
+
+			// 鏂板
+			addObj: (obj = {}) => vm.$u.post('/admin/tenant', obj),
+
+			// 淇敼
+			putObj: (obj = {}) => vm.$u.put('/admin/tenant', obj),
+
+			// 鍒犻櫎
+			delObj: (params) => vm.$u.delete('/admin/tenant/' + params.id),
+
+			// 鏌ヨ
+			getObj: (params) => vm.$u.get('/admin/tenant/', params)
+		},
+
+		// pigx 鍙傛暟绠$悊
+		pigxParam: {
+			// 鍒嗛〉
+			fetchList: (params = {}) => vm.$u.get('/admin/param/page', params),
+
+			// 鏂板
+			addObj: (obj = {}) => vm.$u.post('/admin/param', obj),
+
+			// 淇敼
+			putObj: (obj = {}) => vm.$u.put('/admin/param', obj),
+
+			// 鍒犻櫎
+			delObj: (params) => vm.$u.delete('/admin/param/' + params.id),
+
+			// 鏌ヨ
+			getObj: (params) => vm.$u.get('/admin/param/' + params.id)
+		},
+
+		// 鐢熶骇棰嗘枡--璐х洏杩愯緭浠诲姟
+		palletTransports: {
+			page: (params = {}) => vm.$u.get('/mes/palletTransports/page', params),
+			executeMove: (params = {}) => vm.$u.post('/mes/palletTransportsDetail/executeMoveLocation', params)
+		},
+
+		// 鐢熶骇棰嗘枡--鐗╂枡闇�姹�
+		palletTransportsMaterial: {
+			page: (params = {}) => vm.$u.get('/mes/palletTransportsMaterial/page', params)
+		},
+
+		// 鐢熶骇棰嗘枡--绉诲簱鏄庣粏
+		palletTransportsDetail: {
+			page: (params = {}) => vm.$u.get('/mes/palletTransportsDetail/page', params),
+			// 鏂板
+			addDetail: (params = {}) => vm.$u.post('/mes/palletTransportsDetail', params),
+			updateDetail: (params = {}) => vm.$u.put('/mes/palletTransportsDetail', params),
+			updateBatch: (params = {}) => vm.$u.put('/mes/palletTransportsDetail/updateBatch', params),
+			// 鍒犻櫎
+			delObj: (params) => vm.$u.delete('/mes/palletTransportsDetail/' + params.id)
+		},
+
+		// 鐢熶骇棰嗘枡--IFS搴撲綅
+		ifsLocation: {
+			page: (params = {}) => vm.$u.get('/mes/location/getIfsLocation', params)
+		},
+
+		// 鐢熶骇棰嗘枡--IFS搴撳瓨
+		ifsStock: {
+			page: (params = {}) => vm.$u.get('/mes/palletTransportsDetail/checkScanPalletTransportsDetail',
+				params)
+		},
+
+		//浜у嚭鐧昏
+		outputRegister: {
+			// 鏌ヨ宸ヤ綔绔� 鍒嗛〉
+			fetchWorkstationList: (params = {}) => vm.$u.get('/mes/workstation/page', params),
+			//鏌ヨ宸ュ崟
+			getOperationTask: (params = {}) => vm.$u.get('/mes/operationTask/getOperationTask', params),
+			//鏍规嵁宸ヤ綔绔欙紝鍔犺浇鐝
+			getDutyRecordByWorkstationId: (params = {}) => vm.$u.get(
+				'/mes/dutyRecord/getDutyRecordByWorkstationId/' + params.id),
+			//鏍规嵁鐝 鑾峰彇褰撶彮浜哄憳
+			getPersonByDutyRecordId: (params = {}) => vm.$u.get('/mes/dutyRecord/getPersonByDutyRecordId/' +
+				params.id),
+			// 鎵归噺浜у嚭
+			batchSaveProductMain: (params = {}) => vm.$u.post('/mes/product/batchSaveProductMain', params),
+			//鏌ヨ浜ゆ帴鐝殑浜у嚭
+			getShiftProductOutByOpIdAndWsId: (params = {}) => vm.$u.get(
+				'/mes/product/getShiftProductOutByOpIdAndWsId/' + params.workstationId + '/' + params
+				.opeartionTaskId),
+			//鎵归噺浜у嚭
+			saveProductOutput: (params = {}) => vm.$u.post('/mes/product/saveProductOutput', params),
+			//鎶曟枡鍒楄〃
+			getProductMainV1: (params = {}) => vm.$u.get('/mes/product/getProductMainV1', params),
+			//鎵归噺缂栬緫
+			batchUpdateProductMain: (params = {}) => vm.$u.put('/mes/product/batchUpdateProductMain', params),
+			//鎵归噺鎻愪氦銆佹挙閿�
+			batchChange: (params = {}) => vm.$u.post('/mes/product/state/batchChange/' + params.event, params
+				.ids),
+			// 鍒犻櫎鎶曞叆
+			deleteProductInputById: (params) => vm.$u.delete('/mes/product/deleteProductInputById/' + params
+				.id),
+			//鏌ヨ鎶ュ伐鐢熶骇鏄庣粏
+			queryProductMainDetail: (params = {}) => vm.$u.get('/mes/product/getProductMain/' + params.id),
+			//淇濆瓨鎶曞叆
+			saveProductInput: (params = {}) => vm.$u.post('/mes/product/saveProductInput', params),
+			//淇敼鎶曞叆
+			updateProductInput: (params = {}) => vm.$u.post('/mes/product/updateProductInput', params),
+			//淇敼鐘舵��
+			productOutPutStateByMainId: (params = {}) => vm.$u.post('/mes/product/productOutPutStateByMainId/' +
+				params.id + '/' + params.event),
+			// 鍒犻櫎鎶ュ伐
+			batchCancelProductMain: (params) => vm.$u.delete('/mes/product/batchCancelProductMain', params)
+		},
+
+		// pigx 绉诲簱
+		pigxWareHouse: {
+			// 鏌ヨ鍒楄〃 涓嶅垎椤�
+			fetchList: (params = {}) => vm.$u.get('/mes/stock/getEnableLocationObjList', params),
+
+			// 鏌ヨ
+			list: (params = {}) => vm.$u.get('/mes/stock/getEnableStockObjList/' + params.sn),
+
+			// 鏂板
+			addList: (params = {}) => vm.$u.post('/mes/stock/pdaMoveStockSubmit', params),
+		},
+		// 閫�搴�
+		backWareHouse: {
+			// 閫氳繃SN鍙锋煡鍒板叾鍏ュ簱鍓嶇殑搴撲綅
+			getTransactionBySn: (params) => vm.$u.get('/mes/stock/getTransactionBySn', params),
+			// pda閫�搴�
+			returnStockBySn: (params) => vm.$u.get('/mes/stock/returnStockBySn', params),
+		},
+		// 鎴愬搧鍏ュ簱
+		finishProductIn: {
+			// 鑾峰彇鎴愬搧搴撲綅
+			fetchList: (params = {}) => vm.$u.get('/mes/stock/getFinishProductLocation', params),
+
+			// 鑾峰彇搴撳瓨鏁版嵁
+			list: (params = {}) => vm.$u.get('/mes/stock/getFinishProductStock', params),
+
+			// 鎻愪氦绉诲簱璇锋眰
+			addList: (params = {}) => vm.$u.post('/mes/stock/pdaMoveStockSubmit', params),
+			// 鏍规嵁绠辩爜寰楀埌鍖呰涓昏〃淇℃伅--璺崇嚎
+			getPackagingAndSizeByPackagingNo: (params = {}) => vm.$u.get(
+				'/mes/packaging/getPackagingAndSizeByPackagingNo', params),
+			// 鎻愪氦绉诲簱璇锋眰--璺崇嚎
+			addListJump: (params = {}) => vm.$u.get('/mes/packaging/updateInLocationByPda', params),
+		},
+		// 璺崇嚎涓叴闃插憜
+		finishZTE: {
+			// 鑾峰彇鎴愬搧搴撲綅
+			validateJump: (params = {}) => vm.$u.get('/mes/packaging/validatePackagingCodeRepeat', params),
+
+			// 鑾峰彇搴撳瓨鏁版嵁
+			addJumpZTE: (params = {}) => vm.$u.get('/mes/packaging/updateZxInLocationByPda', params),
+
+		},
+		// pigx 鍖呰
+		pigxPacking: {
+			// 鍒嗛〉
+			fetchList: (params = {}) => vm.$u.get('/mes/packaging/page', params),
+
+			// 鏌ヨ
+			packHeadBasicInfoList: (params = {}) => vm.$u.get('/mes/packaging/getPackHeadBasicInfoList'),
+
+			//  鏂板鍖呰涓昏〃
+			addObj: (obj = {}) => vm.$u.post('/mes/packaging', obj),
+
+			//鑾峰彇搴撲綅淇℃伅
+			getStockInfo: (params = {}) => vm.$u.get('/mes/stock/page?systemNo=' + params.systemNo),
+
+			//鑾峰彇搴撲綅淇℃伅
+			getStockInfoByBatchNo: (params = {}) => vm.$u.get('/mes/stock/page?partBatchNo=' + params
+				.partBatchNo),
+
+			//鏂板鍖呰鏄庣粏
+			addPackagingItem: (obj = {}) => vm.$u.post('/mes/packaging/addPackagingStock', obj),
+
+			// 鍒犻櫎鍖呰鏄庣粏
+			delPackagingItem: (params) => vm.$u.delete('/mes/packaging/removePackagingItemById/' + params.id),
+
+			//鑾峰彇鍖呰鏄庣粏鍒楄〃
+			getPackagingItemList: (params = {}) => vm.$u.get('/mes/packaging/getPackagingItemPage', params),
+
+			//绉伴噸
+			updWeight: (obj = {}) => vm.$u.post('/mes/packaging/getWeight', obj),
+
+			//鑾峰彇鍩虹鏁版嵁
+			getBasicLocation: (params = {}) => vm.$u.get('/mes/location/page', params),
+
+			//鑾峰彇鐝
+			getShiftList: (params = {}) => vm.$u.get('/mes/shift/page', params),
+
+			//  鏂板鍖呰涓昏〃
+			addPackageRegister: (obj = {}) => vm.$u.post('/mes/packageRegister', obj),
+
+			//鑾峰彇鍖呰浜哄垪琛�
+			getStaff: (params = {}) => vm.$u.get('/mes/staff/staff', params),
+
+			//鑾峰彇褰撳墠鐧诲綍浜�
+			getCurrUser: (params = {}) => vm.$u.get('/mes/packageRegister', params)
+		},
+		// pigx 鎶曟枡
+		pigxFeed: {
+			// 鏌ヨ宸ヤ綔绔� 鍒嗛〉
+			fetchWorkstationList: (params = {}) => vm.$u.get('/mes/workstation/page', params),
+
+			// 鏍规嵁宸ヤ綔绔欑紪鍙疯幏鍙栬繘琛屼腑鐨勫伐鍗�&&瀵瑰簲鐨勭嚎杈逛粨
+			getBasicInfoForPdaFeedByWorkstationNo: (params = {}) => vm.$u.get(
+				'/mes/operationTask/getBasicInfoForPdaFeedByWorkstationNo?workstationNo=' + params
+				.workstationNo),
+
+			// 宸叉姇鏈秷鑰� 鍒嗛〉
+			getFeedingStock: (params = {}) => vm.$u.get('/mes/stock/getFeedingStock/' + params.workstationId),
+
+			// 鏂板鎶曟枡
+			addFeedList: (params = {}) => vm.$u.post('/mes/feeding/pda/add', params),
+
+			// 鏂板鎶曟枡
+			addFeed: (params = {}) => vm.$u.post('/mes/feeding', params),
+
+			// 鏍规嵁宸ヤ綔绔檌d鏌ヨ绾胯竟浠�
+			getStockByWorkstationId: (params = {}) => vm.$u.get('/mes/stock/getStockByWorkstationId', params),
+
+			//閰嶇洏鎶曟枡锛岃幏鍙栭厤鐩樼墿鏂�
+			fetchJoinStockOrderList: (params = {}) => vm.$u.get('/mes/joinStockOrder/page', params),
+		},
+		// 澶栧崗鎴愬搧
+		outsource: {
+			//鏌ヨ棣栭〉鏁版嵁缁熻
+			// queryIndexData: (params = {}) => vm.$u.get('/mes/workstation/page', params),
+
+			// 鏌ヨ鏄惁瀛樺湪鎶ユ
+			// queryReportExist: (params = {}) => vm.$u.get('/mes/workstation/page', params),
+
+			// 鎻愪氦
+			submitReport: (params = {}, path) => vm.$u.post('/mes/outsource/insp/' + path, params),
+
+			// 鏌ヨ鏁版嵁
+			queryData: (params = {}) => vm.$u.get('/mes/outsource/page', params),
+		},
+		inventory: {
+			//鑾峰彇鐩樼偣涓昏〃
+			getMain: (params = {}) => vm.$u.get('/mes/inventoryMain/page', params),
+			goCheck: (params = {}) => vm.$u.post('/mes/inventoryMain/checkSavePda', params),
+			//鏂板鐩樼偣鏄庣粏
+			addDetail: (params = {}) => vm.$u.post('/mes/inventoryMain/pda', params),
+			//鏍规嵁搴撳瓨No鍜孲N鍙疯幏鍙栧簱瀛�
+			getStockByLocNoAndSn: (params = {}) => vm.$u.get('/mes/stock/getStockByLocNoAndSn', params),
+			//鏍规嵁搴撳瓨No鍜孲N鍙疯幏鍙栧簱瀛�--鑷姩鎻愪氦
+			getInventoryDetailByLocNoAndSn: (params = {}) => vm.$u.get(
+				'/mes/inventoryMain/getInventoryDetailByLocNoAndSn', params),
+
+			//鑾峰彇闆朵欢鍙峰垪琛�
+			getPart: (params = {}) => vm.$u.get('/mes/part/page', params),
+			getPartNo: (params = {}) => vm.$u.get('/mes/inventoryMain/getPartNo', params),
+		},
+		// pigx 灏炬枡澶勭悊
+		pigxTailHandle: {
+			// 鏍规嵁宸ヤ綔绔欐煡璇㈠熬鏂欑墿鏂�
+			getFeedingStock: (params = {}) => vm.$u.get('/mes/stock/getFeedingStock/' + params.workstationId),
+
+			//灏炬枡鍙戞斁
+			tailStockIssue: (params = {}) => vm.$u.post('/mes/feeding/tailStockIssue', params),
+
+		},
+		//閫�鏂欏鐞�
+		returnMaterial: {
+			//鏍规嵁宸ヤ綔绔欐煡璇㈤��鏂欑墿鏂�
+			getFeedingStockByWorkstationNo: (params = {}) => vm.$u.get(
+				'/mes/stock/getFeedStockByWorkstationNo/', params),
+			//鑾峰彇搴撲綅
+			getReturnLocations: (params = {}) => vm.$u.get('/mes/feeding/getReturnLocations/' + params
+				.workstationId),
+			//閫�鏂�
+			returnMaterial: (params = {}) => vm.$u.put('/mes/feeding', params),
+		},
+		// 宸ュ崟
+		operationTask: {
+			//鍒嗛〉鏌ヨ宸ュ崟
+			getOperationTaskPage: (params = {}) => vm.$u.get('/mes/operationTask/queryOperationTaskPage', params),
+			//鏍规嵁id鏌ヨ宸ュ崟
+			getOperationTaskById: (params = {}) => vm.$u.get('/mes/operationTask/' + params.id),
+			//鏌ヨ鐝鍒楄〃
+			getShiftList: (params = {}) => vm.$u.get('/mes/shift/list', params),
+			//鏌ヨ鐝粍鍒楄〃
+			getCrewList: (params = {}) => vm.$u.get('/mes/crew/list', params),
+			//鏂板涓婄彮璁板綍
+			addDutyRecord: (params = {}) => vm.$u.post('/mes/dutyRecord', params),
+			//鏇存敼涓婄彮璁板綍
+			updDutyRecord: (params = {}) => vm.$u.put('/mes/dutyRecord', params),
+			//鏇存柊宸ヤ綔绔�
+			updWorkstation: (params = {}) => vm.$u.post('/mes/workstation/updateById', params),
+			//鏌ヨ宸ヤ綔绔欏垪琛�
+			getWorkstationList: (params = {}) => vm.$u.get('/mes/workstation/list', params),
+			//鏍¢獙鏄惁瓒呬骇
+			validateOverProduction: (params = {}) => vm.$u.post('/mes/product/validateOverProduction', params),
+			//鏍¢獙鏄惁瓒呮姇
+			validateOverFeed: (params = {}) => vm.$u.post('/mes/product/validateOverFeed', params),
+			//鍒嗛〉鏌ヨ涓婄彮璁板綍
+			getDutyRecordList: (params = {}) => vm.$u.get('/mes/dutyRecord/page', params),
+			//鍒犻櫎涓婄彮璁板綍
+			delDutyRecord: (params) => vm.$u.delete('/mes/dutyRecord/' + params.id),
+			//鏌ヨ鏈彁浜や笂鐝褰�
+			getUnsubmitDutyRecord: (params = {}) => vm.$u.get('/mes/dutyRecord/getUnsubmitWorkstation', params),
+			//鎵归噺鎻愪氦涓婄彮璁板綍
+			batchSubmitDutyRecord: (params = {}) => vm.$u.post('/mes/dutyRecord/batchSubmit', params),
+			//鏍规嵁宸ヤ綔涓績鑾峰彇宸ヤ綔绔�
+			getDutyRecordWorkstation: (params = {}) => vm.$u.get('/mes/dutyRecord/getWorkstation', params),
+			//鎵归噺淇濆瓨涓婄彮璁板綍
+			batchSaveDutyRecord: (params = {}) => vm.$u.post('/mes/dutyRecord/batch', params),
+		},
+		// 鏃ユ姤
+		dailyPaper: {
+			// 鑾峰彇宸ヤ綔涓績
+			getWorkstation: (params = {}) => vm.$u.get('/mes/workstation/list', params),
+			// 鏌ヨ宸ュ簭鍒楄〃
+			getOperation: (params = {}) => vm.$u.get('/mes/operation/page', params),
+			// 鑾峰彇鎶ュ伐宸ュ崟鍒楄〃
+			getOperationTask: (params = {}) => vm.$u.get('/mes/operationTask/getOperationTask', params),
+			// 鑾峰彇褰撳墠鐧诲綍浜烘渶鍚庝竴娆℃彁浜ょ殑鏃ユ姤
+			getLastDutyRecord: (params = {}) => vm.$u.get('/mes/dutyRecord/getLastDutyRecord'),
+			// 鏂板鏃ユ姤璁板綍
+			addDailyPaper: (params = {}) => vm.$u.post('/mes/dutyRecord', params),
+			// 淇敼鏃ユ姤璁板綍
+			editDailyPaper: (params = {}) => vm.$u.put('/mes/dutyRecord', params),
+			// 鍘嗗彶璁板綍鍒嗛〉鏌ヨ
+			dutyRecordPage: (params = {}) => vm.$u.get('/mes/dutyRecord/page', params),
+			// 鑾峰彇鏃ユ姤-浜哄憳鍒楄〃
+			getUserInfo: (params ={}) => vm.$u.get('/mes/staff/page', params),
+			// 鑾峰彇鏉傚伐璐d换浜哄垪琛�
+			principal: (params ={}) => vm.$u.get('mes/handymanRecord/principal/list'),
+			// 鎻愪氦鏉傚伐璁板綍
+			handymanRecord: (params ={}) => vm.$u.post('/mes/handymanRecord', params),
+			// 鑾峰彇搴撲綅id
+			getLocationId: (params = {}) => vm.$u.get('/mes/workstation/' + params.workstationId),
+			// 閫氳繃鎵规鍙锋煡璇㈡姇鏂�
+			getFeeding: (params = {}) => vm.$u.post('/mes/rwMatlBind/scanCode', params),
+			// 鎶ュ伐鎻愪氦
+			productReport: (params = {}) => vm.$u.post('/mes/productReport', params),
+			// 绾垮湀杞﹂棿-杩囧笎鏌ヨ缂栫爜
+			listReportXianQuanNonFirst: (params = {}) => vm.$u.get('/mes/productReport/listReportXianQuanNonFirst/' + params.id),
+			// 閫氳繃鎶曟枡鎵规鍙锋煡璇㈡潵鏂欐锛岃幏鍙栧叾涓殑妫�楠屼俊鎭�
+			siliconSteelCode: (params = {}) => vm.$u.get('/mes/supplierCheckoutMotherRoll/siliconSteelCode/', params),
+			// 鏌ヨ濂楄杞﹂棿鏍囩淇℃伅
+			listReportOther: (params = {}) => vm.$u.get('/mes/productReport/listReportOther/' + params.id),
+			// 鏌ヨ鎴愬杞﹂棿(绠卞彉)鏍囩淇℃伅
+			listReportChengtao: (params = {}) => vm.$u.get('/mes/productReport/listReportChengtao/' + params.id),
+			// 鏌ヨ閾佽姱杞﹂棿-鍙犺鏍囩淇℃伅
+			listReportDieZhuang: (params = {}) => vm.$u.get('/mes/productReport/listReportDieZhuang/' + params.id),
+			// 鏌ヨ閾佽姱杞﹂棿-绾靛壀鏍囩淇℃伅
+			listReportZongjian: (params = {}) => vm.$u.get('/mes/productReport/listReportZongjian/' + params.id),
+			// 鏌ヨ澶栧3杞﹂棿-鏈�鍚庝竴閬撳伐搴忔爣绛句俊鎭�
+			listReportWaike: (params = {}) => vm.$u.get('/mes/productReport/listReportWaike/' + params.id),
+			// 鐢熸垚鏍囩
+			generateLabel: (params = {}) => vm.$u.post('/mes/productReport/generateLabel', params),
+			// 鎬昏杞﹂棿鑾峰彇list缂栫爜
+			listReportZongzhuang: (params = {}) => vm.$u.get('/mes/productReport/listReportZongzhuang/' + params.id),
+			// 閾佽姱杞﹂棿-鍏朵粬宸ュ簭鑾峰彇list缂栫爜
+			listReportOtherOperation: ( params = {}) => vm.$u.get('/mes/productReport/listReportOtherOperation/' + params.id),
+			// 鑾峰彇鎴愬搧鎬昏(鍏朵粬杞﹂棿) list缂栫爜
+			listReportFprodZongzhuang: (params = {}) => vm.$u.get('/mes/productReport/listReportFprodZongzhuang/' + params.id),
+			// 鑾峰彇鎵撳嵃鏍囩鐨勬爣绛句俊鎭�  澶栧3杞﹂棿-鏈�鍚庝竴閬撳伐搴�
+			labelInfo: (params = {}) => vm.$u.get('/mes/productReport/labelInfo', params),
+			// 绾靛壀鑾峰彇鏍囩淇℃伅
+			zongjianLabelInfo: (params = {}) => vm.$u.get('/mes/productReport/zongjian/labelInfo', params),
+			// 鑾峰彇濂楄鎵撳嵃淇℃伅
+			taozhuangLabelInfo: (params = {}) => vm.$u.get('/mes/productReport/taozhuang/labelInfo', params),
+			//鎶ュ伐璇︽儏
+			productReportDetail: (params = {}) => vm.$u.get('/mes/productReport', params),
+			//鑾峰彇鍥惧彿
+			findByNo: (params = {}) => vm.$u.get('/mes/part/pda/findByNo' , params),
+			//鑾峰彇浠诲姟绫诲瀷
+			getAssemblyProcessType:(params = {}) => vm.$u.get('/admin/dict/type/assembly_process_type')
+		}
+	};
+
+}
+
+export default {
+	install
+}
diff --git a/common/http.interceptor.js b/common/http.interceptor.js
new file mode 100644
index 0000000..55358ae
--- /dev/null
+++ b/common/http.interceptor.js
@@ -0,0 +1,163 @@
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+
+import errorCode from "./errorCode";
+import config from "./config";
+
+// 姝ゅ绗簩涓弬鏁皏m锛屽氨鏄垜浠湪椤甸潰浣跨敤鐨則his锛屼綘鍙互閫氳繃vm鑾峰彇vuex绛夋搷浣�
+const install = (Vue, vm) => {
+
+    // 閫氱敤璇锋眰澶磋瀹�
+    const ajaxHeader = 'x-ajax';
+    const sessionIdHeader = 'Authorization';
+    const rememberMeHeader = 'x-remember';
+
+    // 璇锋眰鍙傛暟榛樿閰嶇疆
+    Vue.prototype.$u.http.setConfig({
+        baseUrl: vm.vuex_config.baseUrl,
+        originalData: true,
+        // 榛樿澶撮儴锛宧ttp2绾﹀畾header鍚嶇О缁熶竴灏忓啓 ThinkGem
+        header: {
+            'x-requested-with': 'XMLHttpRequest'
+        }
+    });
+
+    // 璇锋眰鎷︽埅锛岄厤缃甌oken绛夊弬鏁�
+    Vue.prototype.$u.http.interceptor.request = (req) => {
+
+        if (!req.header) {
+            req.header = [];
+        }
+
+        // 榛樿鎸囧畾杩斿洖 JSON 鏁版嵁
+        if (!req.header[ajaxHeader]) {
+            req.header[ajaxHeader] = 'json';
+        }
+
+        // 璁惧畾浼犻�� Token 璁よ瘉鍙傛暟 ThinkGem
+        if (!req.header[sessionIdHeader] && vm.vuex_token) {
+            req.header[sessionIdHeader] = 'Bearer ' + vm.vuex_token;
+        }
+		
+        // 涓鸿妭鐪佹祦閲忥紝璁颁綇鎴戞暟鎹笉鏄瘡娆¢兘鍙戦�佺殑锛屽綋浼氳瘽澶辨晥鍚庯紝灏濊瘯閲嶈瘯鐧诲綍 ThinkGem
+        if (!req.header[rememberMeHeader] && vm.vuex_remember && req.remember) {
+            req.header[rememberMeHeader] = vm.vuex_remember;
+            req.remember = false;
+        }
+		
+		//浼犻�扐PP鐗堟湰鍙�
+		//req.header['APP-VERSION'] = config.appv;
+
+        // console.log('request', req);
+        return req;
+    }
+
+    // 鍝嶅簲鎷︽埅锛屽垽鏂姸鎬佺爜鏄惁閫氳繃
+    Vue.prototype.$u.http.interceptor.response = async (res, req) => {
+        const status = Number(res.statusCode) || 200
+        const message = res.data.msg || errorCode[status] || errorCode['default']
+		
+		//鍒ゆ柇鐗堟湰
+		if ((status == 200 || res.data.code === 1) && message.split("@")[0]=='APP-VERSION')  {
+			vm.$u.toast(message.split("@")[1]);
+			return	Promise.reject(new Error(message.split("@")[1]))
+		}
+		//杩斿洖鐢ㄦ埛鍑瘉宸茶繃鏈熸椂锛屽埛鏂皌oken璺宠浆鑷冲簲鐢ㄩ椤�
+		if(message=='鐢ㄦ埛鍑瘉宸茶繃鏈�'){
+			let currRefreshToken=vm.vuex_refresh_token
+			let refreshTokenParam={
+				grant_type:'refresh_token',
+				refresh_token:currRefreshToken,
+				client_id:'pig',
+				client_secret:'pig'
+			}
+			//娓呯┖瀛樺偍淇℃伅
+			vm.$u.vuex('vuex_token', '')
+			vm.$u.vuex('vuex_refresh_token', '')
+			vm.$u.vuex('vuex_username', '')
+			vm.$u.vuex('vuex_userId', '')
+			vm.$u.vuex('vuex_client_id', '')
+			vm.$u.vuex('vuex_user', {})
+			
+			vm.$u.api.refreshToken(refreshTokenParam).then((resAgain) => {
+			    //瀛樺偍鐩稿叧淇℃伅
+				vm.$u.vuex("vuex_token", resAgain.access_token);
+				vm.$u.vuex("vuex_refresh_token", resAgain.refresh_token);
+				vm.$u.vuex("vuex_username", resAgain.user_info.username);
+				vm.$u.vuex("vuex_userId", resAgain.user_info.id);
+				//vm.$u.vuex("vuex_client_id", resAgain.client_id);
+				vm.$u.vuex("vuex_user", resAgain.user_info);
+			
+			    setTimeout(() => {
+			        uni.reLaunch({
+			            url: '/pages/sys/home/index'
+			        });
+			    }, 500);
+			
+			}).catch(()=>{
+				setTimeout(() => {
+				    uni.reLaunch({
+				        url: '/pages/sys/login/index'
+				    });
+				}, 500);
+			});
+			return
+		}
+        // 鍚庡彴瀹氫箟 424 閽堝浠ょ墝杩囧幓鐨勭壒娈婂搷搴旂爜
+        if (status === 424) {
+            vm.$u.toast('浠ょ墝杩囨湡锛岃閲嶆柊鐧诲綍');
+            vm.$u.api.logout().then(res => {
+                //娓呯┖瀛樺偍淇℃伅
+                vm.$u.vuex('vuex_token', '')
+                vm.$u.vuex('vuex_refresh_token', '')
+                vm.$u.vuex('vuex_username', '')
+                vm.$u.vuex('vuex_userId', '')
+                vm.$u.vuex('vuex_client_id', '')
+                vm.$u.vuex('vuex_user', {})
+
+                setTimeout(() => {
+                    uni.reLaunch({
+                        url: '/pages/sys/login/index'
+                    });
+                }, 500);
+
+            });
+            return
+        }
+
+        if (status !== 200 || res.data.code === 1) {
+            vm.$u.toast(message,3500);
+            return Promise.reject(new Error(message))
+        }
+
+        return res.data;
+    }
+
+    // 灏佽 get text 璇锋眰
+    vm.$u.getText = (url, data = {}, header = {}) => {
+        return vm.$u.http.request({
+            dataType: 'text',
+            method: 'GET',
+            url,
+            header,
+            data
+        })
+    }
+
+    // 灏佽 post json 璇锋眰
+    vm.$u.postJson = (url, data = {}, header = {}) => {
+        header['content-type'] = 'application/json';
+        return vm.$u.http.request({
+            url,
+            method: 'POST',
+            header,
+            data
+        })
+    }
+
+}
+
+export default {
+    install
+}
diff --git a/common/locales/en.js b/common/locales/en.js
new file mode 100644
index 0000000..6501d49
--- /dev/null
+++ b/common/locales/en.js
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2013-Now http://Asun-MES.com All rights reserved.
+ */
+export default {
+	common: {
+		title: 'Asun-MES',
+	},
+	nav: {
+		home: 'Home',
+		user: 'User',
+		log: 'Log'
+	},
+	login: {
+		title: 'Login',
+		placeholderAccount: 'Enter Account',
+		placeholderMobile: 'Enter Mobile',
+		placeholderPassword: 'Enter Password',
+		autoLogin: 'Auto Login',
+		loginButton: 'Login',
+		vxLoginButton: 'Login',
+		logoutButton: 'Logout',
+		forget: 'Forget Password',
+		reg: 'Resister Account',
+		noLogin: 'No Login'
+	},
+	home: {
+		title: 'Home'
+	},
+	user: {
+		title: 'User'
+	},
+	log: {
+		title: 'Log'
+	}
+}
diff --git a/common/locales/zh_CN.js b/common/locales/zh_CN.js
new file mode 100644
index 0000000..9d1eae6
--- /dev/null
+++ b/common/locales/zh_CN.js
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+export default {
+	common: {
+		title: 'pigx-app',
+	},
+	nav: {
+		home: '宸ヤ綔鍙�',
+		user: '鐢ㄦ埛',
+		log: '鏃ュ織',
+		chat: '鑱婂ぉ',
+	},
+	login: {
+		title: '鐧诲綍',
+		placeholderAccount: '璇疯緭鍏ヨ处鍙�',
+		placeholderMobile: '璇疯緭鍏ユ墜鏈哄彿',
+		placeholderPassword: '璇疯緭鍏ュ瘑鐮�',
+		autoLogin: '鑷姩鐧诲綍',
+		loginButton: '鐧� 褰�',
+		vxLoginButton: '寰俊涓�閿櫥褰�',
+		logoutButton: '閫�鍑虹櫥褰�',
+		forget: '蹇樿瀵嗙爜',
+		reg: '娉ㄥ唽璐﹀彿',
+		noLogin: '鏈櫥褰�'
+	},
+	home: {
+		title: '宸ヤ綔鍙�'
+	},
+	user: {
+		title: '鐢ㄦ埛涓績'
+	},
+	log: {
+		title: '鏃ュ織'
+	}
+}
diff --git a/common/moment.js b/common/moment.js
new file mode 100644
index 0000000..4fab9c5
--- /dev/null
+++ b/common/moment.js
@@ -0,0 +1,1848 @@
+! function(e, t) {
+	'object' === typeof exports && 'undefined' !== typeof module ? module.exports = t() : 'function' ===
+		typeof define && define.amd ? define(t) : e.moment = t()
+}(this, function() {
+	'use strict';
+	let e, i;
+
+	function c() {
+		return e.apply(null, arguments)
+	}
+
+	function o(e) {
+		return e instanceof Array || '[object Array]' === Object.prototype.toString.call(e)
+	}
+
+	function u(e) {
+		return null != e && '[object Object]' === Object.prototype.toString.call(e)
+	}
+
+	function l(e) {
+		return void 0 === e
+	}
+
+	function h(e) {
+		return 'number' === typeof e || '[object Number]' === Object.prototype.toString.call(e)
+	}
+
+	function d(e) {
+		return e instanceof Date || '[object Date]' === Object.prototype.toString.call(e)
+	}
+
+	function f(e, t) {
+		let n, s = [];
+		for (n = 0; n < e.length; ++n) s.push(t(e[n], n));
+		return s
+	}
+
+	function m(e, t) {
+		return Object.prototype.hasOwnProperty.call(e, t)
+	}
+
+	function _(e, t) {
+		for (let n in t) m(t, n) && (e[n] = t[n]);
+		return m(t, 'toString') && (e.toString = t.toString), m(t, 'valueOf') && (e.valueOf = t.valueOf), e
+	}
+
+	function y(e, t, n, s) {
+		return Tt(e, t, n, s, !0).utc()
+	}
+
+	function g(e) {
+		return null == e._pf && (e._pf = {
+			empty: !1,
+			unusedTokens: [],
+			unusedInput: [],
+			overflow: -2,
+			charsLeftOver: 0,
+			nullInput: !1,
+			invalidMonth: null,
+			invalidFormat: !1,
+			userInvalidated: !1,
+			iso: !1,
+			parsedDateParts: [],
+			meridiem: null,
+			rfc2822: !1,
+			weekdayMismatch: !1
+		}), e._pf
+	}
+
+	function v(e) {
+		if (null == e._isValid) {
+			let t = g(e),
+				n = i.call(t.parsedDateParts, function(e) {
+					return null != e
+				}),
+				s = !isNaN(e._d.getTime()) && t.overflow < 0 && !t.empty && !t.invalidMonth && !t.invalidWeekday &&
+				!t.weekdayMismatch && !t.nullInput && !t.invalidFormat && !t.userInvalidated && (!t.meridiem || t
+					.meridiem && n);
+			if (e._strict && (s = s && 0 === t.charsLeftOver && 0 === t.unusedTokens.length && void 0 === t
+				.bigHour), null != Object.isFrozen && Object.isFrozen(e)) return s;
+			e._isValid = s
+		}
+		return e._isValid
+	}
+
+	function p(e) {
+		let t = y(NaN);
+		return null != e ? _(g(t), e) : g(t).userInvalidated = !0, t
+	}
+	i = Array.prototype.some ? Array.prototype.some : function(e) {
+		for (let t = Object(this), n = t.length >>> 0, s = 0; s < n; s++)
+			if (s in t && e.call(this, t[s], s, t)) return !0;
+		return !1
+	};
+	let r = c.momentProperties = [];
+
+	function w(e, t) {
+		let n, s, i;
+		if (l(t._isAMomentObject) || (e._isAMomentObject = t._isAMomentObject), l(t._i) || (e._i = t._i), l(t._f) ||
+			(e._f = t._f), l(t._l) || (e._l = t._l), l(t._strict) || (e._strict = t._strict), l(t._tzm) || (e._tzm =
+				t._tzm), l(t._isUTC) || (e._isUTC = t._isUTC), l(t._offset) || (e._offset = t._offset), l(t._pf) ||
+			(e._pf = g(t)), l(t._locale) || (e._locale = t._locale), 0 < r.length)
+			for (n = 0; n < r.length; n++) l(i = t[s = r[n]]) || (e[s] = i);
+		return e
+	}
+	let t = !1;
+
+	function M(e) {
+		w(this, e), this._d = new Date(null != e._d ? e._d.getTime() : NaN), this.isValid() || (this._d = new Date(
+			NaN)), !1 === t && (t = !0, c.updateOffset(this), t = !1)
+	}
+
+	function k(e) {
+		return e instanceof M || null != e && null != e._isAMomentObject
+	}
+
+	function S(e) {
+		return e < 0 ? Math.ceil(e) || 0 : Math.floor(e)
+	}
+
+	function D(e) {
+		let t = +e,
+			n = 0;
+		return 0 !== t && isFinite(t) && (n = S(t)), n
+	}
+
+	function a(e, t, n) {
+		let s, i = Math.min(e.length, t.length),
+			r = Math.abs(e.length - t.length),
+			a = 0;
+		for (s = 0; s < i; s++)(n && e[s] !== t[s] || !n && D(e[s]) !== D(t[s])) && a++;
+		return a + r
+	}
+
+	function Y(e) {
+		!1 === c.suppressDeprecationWarnings && 'undefined' !== typeof console && console.warn && console.warn(
+			'Deprecation warning: ' + e)
+	}
+
+	function n(i, r) {
+		let a = !0;
+		return _(function() {
+			if (null != c.deprecationHandler && c.deprecationHandler(null, i), a) {
+				for (var e, t = [], n = 0; n < arguments.length; n++) {
+					if (e = '', 'object' === typeof arguments[n]) {
+						for (let s in e += '\n[' + n + '] ', arguments[0]) e += s + ': ' + arguments[0][s] +
+							', ';
+						e = e.slice(0, -2)
+					} else e = arguments[n];
+					t.push(e)
+				}
+				Y(i + '\nArguments: ' + Array.prototype.slice.call(t).join('') + '\n' + (new Error).stack),
+					a = !1
+			}
+			return r.apply(this, arguments)
+		}, r)
+	}
+	let s, O = {};
+
+	function T(e, t) {
+		null != c.deprecationHandler && c.deprecationHandler(e, t), O[e] || (Y(t), O[e] = !0)
+	}
+
+	function b(e) {
+		return e instanceof Function || '[object Function]' === Object.prototype.toString.call(e)
+	}
+
+	function x(e, t) {
+		let n, s = _({}, e);
+		for (n in t) m(t, n) && (u(e[n]) && u(t[n]) ? (s[n] = {}, _(s[n], e[n]), _(s[n], t[n])) : null != t[n] ? s[
+			n] = t[n] : delete s[n]);
+		for (n in e) m(e, n) && !m(t, n) && u(e[n]) && (s[n] = _({}, s[n]));
+		return s
+	}
+
+	function P(e) {
+		null != e && this.set(e)
+	}
+	c.suppressDeprecationWarnings = !1, c.deprecationHandler = null, s = Object.keys ? Object.keys : function(e) {
+		let t, n = [];
+		for (t in e) m(e, t) && n.push(t);
+		return n
+	};
+	let W = {};
+
+	function C(e, t) {
+		let n = e.toLowerCase();
+		W[n] = W[n + 's'] = W[t] = e
+	}
+
+	function H(e) {
+		return 'string' === typeof e ? W[e] || W[e.toLowerCase()] : void 0
+	}
+
+	function R(e) {
+		let t, n, s = {};
+		for (n in e) m(e, n) && (t = H(n)) && (s[t] = e[n]);
+		return s
+	}
+	let U = {};
+
+	function F(e, t) {
+		U[e] = t
+	}
+
+	function L(e, t, n) {
+		let s = '' + Math.abs(e),
+			i = t - s.length;
+		return (0 <= e ? n ? '+' : '' : '-') + Math.pow(10, Math.max(0, i)).toString().substr(1) + s
+	}
+	let N =
+		/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,
+		G = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,
+		V = {},
+		E = {};
+
+	function I(e, t, n, s) {
+		let i = s;
+		'string' === typeof s && (i = function() {
+			return this[s]()
+		}), e && (E[e] = i), t && (E[t[0]] = function() {
+			return L(i.apply(this, arguments), t[1], t[2])
+		}), n && (E[n] = function() {
+			return this.localeData().ordinal(i.apply(this, arguments), e)
+		})
+	}
+
+	function A(e, t) {
+		return e.isValid() ? (t = j(t, e.localeData()), V[t] = V[t] || function(s) {
+			let e, i, t, r = s.match(N);
+			for (e = 0, i = r.length; e < i; e++) E[r[e]] ? r[e] = E[r[e]] : r[e] = (t = r[e]).match(
+				/\[[\s\S]/) ? t.replace(/^\[|\]$/g, '') : t.replace(/\\/g, '');
+			return function(e) {
+				let t, n = '';
+				for (t = 0; t < i; t++) n += b(r[t]) ? r[t].call(e, s) : r[t];
+				return n
+			}
+		}(t), V[t](e)) : e.localeData().invalidDate()
+	}
+
+	function j(e, t) {
+		let n = 5;
+
+		function s(e) {
+			return t.longDateFormat(e) || e
+		}
+		for (G.lastIndex = 0; 0 <= n && G.test(e);) e = e.replace(G, s), G.lastIndex = 0, n -= 1;
+		return e
+	}
+	let Z = /\d/,
+		z = /\d\d/,
+		$ = /\d{3}/,
+		q = /\d{4}/,
+		J = /[+-]?\d{6}/,
+		B = /\d\d?/,
+		Q = /\d\d\d\d?/,
+		X = /\d\d\d\d\d\d?/,
+		K = /\d{1,3}/,
+		ee = /\d{1,4}/,
+		te = /[+-]?\d{1,6}/,
+		ne = /\d+/,
+		se = /[+-]?\d+/,
+		ie = /Z|[+-]\d\d:?\d\d/gi,
+		re = /Z|[+-]\d\d(?::?\d\d)?/gi,
+		ae =
+		/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,
+		oe = {};
+
+	function ue(e, n, s) {
+		oe[e] = b(n) ? n : function(e, t) {
+			return e && s ? s : n
+		}
+	}
+
+	function le(e, t) {
+		return m(oe, e) ? oe[e](t._strict, t._locale) : new RegExp(he(e.replace('\\', '').replace(
+			/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,
+			function(e, t, n, s, i) {
+				return t || n || s || i
+			})))
+	}
+
+	function he(e) {
+		return e.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
+	}
+	let de = {};
+
+	function ce(e, n) {
+		let t, s = n;
+		for ('string' === typeof e && (e = [e]), h(n) && (s = function(e, t) {
+				t[n] = D(e)
+			}), t = 0; t < e.length; t++) de[e[t]] = s
+	}
+
+	function fe(e, i) {
+		ce(e, function(e, t, n, s) {
+			n._w = n._w || {}, i(e, n._w, n, s)
+		})
+	}
+	let me = 0,
+		_e = 1,
+		ye = 2,
+		ge = 3,
+		ve = 4,
+		pe = 5,
+		we = 6,
+		Me = 7,
+		ke = 8;
+
+	function Se(e) {
+		return De(e) ? 366 : 365
+	}
+
+	function De(e) {
+		return e % 4 == 0 && e % 100 != 0 || e % 400 == 0
+	}
+	I('Y', 0, 0, function() {
+		let e = this.year();
+		return e <= 9999 ? '' + e : '+' + e
+	}), I(0, ['YY', 2], 0, function() {
+		return this.year() % 100
+	}), I(0, ['YYYY', 4], 0, 'year'), I(0, ['YYYYY', 5], 0, 'year'), I(0, ['YYYYYY', 6, !0], 0, 'year'), C(
+		'year', 'y'), F('year', 1), ue('Y', se), ue('YY', B, z), ue('YYYY', ee, q), ue('YYYYY', te, J), ue(
+		'YYYYYY', te, J), ce(['YYYYY', 'YYYYYY'], me), ce('YYYY', function(e, t) {
+		t[me] = 2 === e.length ? c.parseTwoDigitYear(e) : D(e)
+	}), ce('YY', function(e, t) {
+		t[me] = c.parseTwoDigitYear(e)
+	}), ce('Y', function(e, t) {
+		t[me] = parseInt(e, 10)
+	}), c.parseTwoDigitYear = function(e) {
+		return D(e) + (68 < D(e) ? 1900 : 2e3)
+	};
+	let Ye, Oe = Te('FullYear', !0);
+
+	function Te(t, n) {
+		return function(e) {
+			return null != e ? (xe(this, t, e), c.updateOffset(this, n), this) : be(this, t)
+		}
+	}
+
+	function be(e, t) {
+		return e.isValid() ? e._d['get' + (e._isUTC ? 'UTC' : '') + t]() : NaN
+	}
+
+	function xe(e, t, n) {
+		e.isValid() && !isNaN(n) && ('FullYear' === t && De(e.year()) && 1 === e.month() && 29 === e.date() ? e._d[
+			'set' + (e._isUTC ? 'UTC' : '') + t](n, e.month(), Pe(n, e.month())) : e._d['set' + (e._isUTC ?
+			'UTC' : '') + t](n))
+	}
+
+	function Pe(e, t) {
+		if (isNaN(e) || isNaN(t)) return NaN;
+		let n, s = (t % (n = 12) + n) % n;
+		return e += (t - s) / 12, 1 === s ? De(e) ? 29 : 28 : 31 - s % 7 % 2
+	}
+	Ye = Array.prototype.indexOf ? Array.prototype.indexOf : function(e) {
+		let t;
+		for (t = 0; t < this.length; ++t)
+			if (this[t] === e) return t;
+		return -1
+	}, I('M', ['MM', 2], 'Mo', function() {
+		return this.month() + 1
+	}), I('MMM', 0, 0, function(e) {
+		return this.localeData().monthsShort(this, e)
+	}), I('MMMM', 0, 0, function(e) {
+		return this.localeData().months(this, e)
+	}), C('month', 'M'), F('month', 8), ue('M', B), ue('MM', B, z), ue('MMM', function(e, t) {
+		return t.monthsShortRegex(e)
+	}), ue('MMMM', function(e, t) {
+		return t.monthsRegex(e)
+	}), ce(['M', 'MM'], function(e, t) {
+		t[_e] = D(e) - 1
+	}), ce(['MMM', 'MMMM'], function(e, t, n, s) {
+		let i = n._locale.monthsParse(e, s, n._strict);
+		null != i ? t[_e] = i : g(n).invalidMonth = e
+	});
+	let We = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,
+		Ce = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_');
+	let He = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_');
+
+	function Re(e, t) {
+		let n;
+		if (!e.isValid()) return e;
+		if ('string' === typeof t)
+			if (/^\d+$/.test(t)) t = D(t);
+			else if (!h(t = e.localeData().monthsParse(t))) return e;
+		return n = Math.min(e.date(), Pe(e.year(), t)), e._d['set' + (e._isUTC ? 'UTC' : '') + 'Month'](t, n), e
+	}
+
+	function Ue(e) {
+		return null != e ? (Re(this, e), c.updateOffset(this, !0), this) : be(this, 'Month')
+	}
+	let Fe = ae;
+	let Le = ae;
+
+	function Ne() {
+		function e(e, t) {
+			return t.length - e.length
+		}
+		let t, n, s = [],
+			i = [],
+			r = [];
+		for (t = 0; t < 12; t++) n = y([2e3, t]), s.push(this.monthsShort(n, '')), i.push(this.months(n, '')), r
+			.push(this.months(n, '')), r.push(this.monthsShort(n, ''));
+		for (s.sort(e), i.sort(e), r.sort(e), t = 0; t < 12; t++) s[t] = he(s[t]), i[t] = he(i[t]);
+		for (t = 0; t < 24; t++) r[t] = he(r[t]);
+		this._monthsRegex = new RegExp('^(' + r.join('|') + ')', 'i'), this._monthsShortRegex = this._monthsRegex,
+			this._monthsStrictRegex = new RegExp('^(' + i.join('|') + ')', 'i'), this._monthsShortStrictRegex =
+			new RegExp('^(' + s.join('|') + ')', 'i')
+	}
+
+	function Ge(e) {
+		let t;
+		if (e < 100 && 0 <= e) {
+			let n = Array.prototype.slice.call(arguments);
+			n[0] = e + 400, t = new Date(Date.UTC.apply(null, n)), isFinite(t.getUTCFullYear()) && t.setUTCFullYear(
+				e)
+		} else t = new Date(Date.UTC.apply(null, arguments));
+		return t
+	}
+
+	function Ve(e, t, n) {
+		let s = 7 + t - n;
+		return -((7 + Ge(e, 0, s).getUTCDay() - t) % 7) + s - 1
+	}
+
+	function Ee(e, t, n, s, i) {
+		let r, a, o = 1 + 7 * (t - 1) + (7 + n - s) % 7 + Ve(e, s, i);
+		return a = o <= 0 ? Se(r = e - 1) + o : o > Se(e) ? (r = e + 1, o - Se(e)) : (r = e, o), {
+			year: r,
+			dayOfYear: a
+		}
+	}
+
+	function Ie(e, t, n) {
+		let s, i, r = Ve(e.year(), t, n),
+			a = Math.floor((e.dayOfYear() - r - 1) / 7) + 1;
+		return a < 1 ? s = a + Ae(i = e.year() - 1, t, n) : a > Ae(e.year(), t, n) ? (s = a - Ae(e.year(), t, n),
+			i = e.year() + 1) : (i = e.year(), s = a), {
+			week: s,
+			year: i
+		}
+	}
+
+	function Ae(e, t, n) {
+		let s = Ve(e, t, n),
+			i = Ve(e + 1, t, n);
+		return (Se(e) - s + i) / 7
+	}
+	I('w', ['ww', 2], 'wo', 'week'), I('W', ['WW', 2], 'Wo', 'isoWeek'), C('week', 'w'), C('isoWeek', 'W'), F(
+		'week', 5), F('isoWeek', 5), ue('w', B), ue('ww', B, z), ue('W', B), ue('WW', B, z), fe(['w', 'ww', 'W',
+		'WW'
+	], function(e, t, n, s) {
+		t[s.substr(0, 1)] = D(e)
+	});
+
+	function je(e, t) {
+		return e.slice(t, 7).concat(e.slice(0, t))
+	}
+	I('d', 0, 'do', 'day'), I('dd', 0, 0, function(e) {
+		return this.localeData().weekdaysMin(this, e)
+	}), I('ddd', 0, 0, function(e) {
+		return this.localeData().weekdaysShort(this, e)
+	}), I('dddd', 0, 0, function(e) {
+		return this.localeData().weekdays(this, e)
+	}), I('e', 0, 0, 'weekday'), I('E', 0, 0, 'isoWeekday'), C('day', 'd'), C('weekday', 'e'), C('isoWeekday',
+		'E'), F('day', 11), F('weekday', 11), F('isoWeekday', 11), ue('d', B), ue('e', B), ue('E', B), ue('dd',
+		function(e, t) {
+			return t.weekdaysMinRegex(e)
+		}), ue('ddd', function(e, t) {
+		return t.weekdaysShortRegex(e)
+	}), ue('dddd', function(e, t) {
+		return t.weekdaysRegex(e)
+	}), fe(['dd', 'ddd', 'dddd'], function(e, t, n, s) {
+		let i = n._locale.weekdaysParse(e, s, n._strict);
+		null != i ? t.d = i : g(n).invalidWeekday = e
+	}), fe(['d', 'e', 'E'], function(e, t, n, s) {
+		t[s] = D(e)
+	});
+	let Ze = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_');
+	let ze = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_');
+	let $e = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_');
+	let qe = ae;
+	let Je = ae;
+	let Be = ae;
+
+	function Qe() {
+		function e(e, t) {
+			return t.length - e.length
+		}
+		let t, n, s, i, r, a = [],
+			o = [],
+			u = [],
+			l = [];
+		for (t = 0; t < 7; t++) n = y([2e3, 1]).day(t), s = this.weekdaysMin(n, ''), i = this.weekdaysShort(n, ''),
+			r = this.weekdays(n, ''), a.push(s), o.push(i), u.push(r), l.push(s), l.push(i), l.push(r);
+		for (a.sort(e), o.sort(e), u.sort(e), l.sort(e), t = 0; t < 7; t++) o[t] = he(o[t]), u[t] = he(u[t]), l[t] =
+			he(l[t]);
+		this._weekdaysRegex = new RegExp('^(' + l.join('|') + ')', 'i'), this._weekdaysShortRegex = this
+			._weekdaysRegex, this._weekdaysMinRegex = this._weekdaysRegex, this._weekdaysStrictRegex = new RegExp(
+				'^(' + u.join('|') + ')', 'i'), this._weekdaysShortStrictRegex = new RegExp('^(' + o.join('|') +
+				')', 'i'), this._weekdaysMinStrictRegex = new RegExp('^(' + a.join('|') + ')', 'i')
+	}
+
+	function Xe() {
+		return this.hours() % 12 || 12
+	}
+
+	function Ke(e, t) {
+		I(e, 0, 0, function() {
+			return this.localeData().meridiem(this.hours(), this.minutes(), t)
+		})
+	}
+
+	function et(e, t) {
+		return t._meridiemParse
+	}
+	I('H', ['HH', 2], 0, 'hour'), I('h', ['hh', 2], 0, Xe), I('k', ['kk', 2], 0, function() {
+		return this.hours() || 24
+	}), I('hmm', 0, 0, function() {
+		return '' + Xe.apply(this) + L(this.minutes(), 2)
+	}), I('hmmss', 0, 0, function() {
+		return '' + Xe.apply(this) + L(this.minutes(), 2) + L(this.seconds(), 2)
+	}), I('Hmm', 0, 0, function() {
+		return '' + this.hours() + L(this.minutes(), 2)
+	}), I('Hmmss', 0, 0, function() {
+		return '' + this.hours() + L(this.minutes(), 2) + L(this.seconds(), 2)
+	}), Ke('a', !0), Ke('A', !1), C('hour', 'h'), F('hour', 13), ue('a', et), ue('A', et), ue('H', B), ue('h',
+		B), ue('k', B), ue('HH', B, z), ue('hh', B, z), ue('kk', B, z), ue('hmm', Q), ue('hmmss', X), ue('Hmm',
+		Q), ue('Hmmss', X), ce(['H', 'HH'], ge), ce(['k', 'kk'], function(e, t, n) {
+		let s = D(e);
+		t[ge] = 24 === s ? 0 : s
+	}), ce(['a', 'A'], function(e, t, n) {
+		n._isPm = n._locale.isPM(e), n._meridiem = e
+	}), ce(['h', 'hh'], function(e, t, n) {
+		t[ge] = D(e), g(n).bigHour = !0
+	}), ce('hmm', function(e, t, n) {
+		let s = e.length - 2;
+		t[ge] = D(e.substr(0, s)), t[ve] = D(e.substr(s)), g(n).bigHour = !0
+	}), ce('hmmss', function(e, t, n) {
+		let s = e.length - 4,
+			i = e.length - 2;
+		t[ge] = D(e.substr(0, s)), t[ve] = D(e.substr(s, 2)), t[pe] = D(e.substr(i)), g(n).bigHour = !0
+	}), ce('Hmm', function(e, t, n) {
+		let s = e.length - 2;
+		t[ge] = D(e.substr(0, s)), t[ve] = D(e.substr(s))
+	}), ce('Hmmss', function(e, t, n) {
+		let s = e.length - 4,
+			i = e.length - 2;
+		t[ge] = D(e.substr(0, s)), t[ve] = D(e.substr(s, 2)), t[pe] = D(e.substr(i))
+	});
+	let tt, nt = Te('Hours', !0),
+		st = {
+			calendar: {
+				sameDay: '[Today at] LT',
+				nextDay: '[Tomorrow at] LT',
+				nextWeek: 'dddd [at] LT',
+				lastDay: '[Yesterday at] LT',
+				lastWeek: '[Last] dddd [at] LT',
+				sameElse: 'L'
+			},
+			longDateFormat: {
+				LTS: 'h:mm:ss A',
+				LT: 'h:mm A',
+				L: 'MM/DD/YYYY',
+				LL: 'MMMM D, YYYY',
+				LLL: 'MMMM D, YYYY h:mm A',
+				LLLL: 'dddd, MMMM D, YYYY h:mm A'
+			},
+			invalidDate: 'Invalid date',
+			ordinal: '%d',
+			dayOfMonthOrdinalParse: /\d{1,2}/,
+			relativeTime: {
+				future: 'in %s',
+				past: '%s ago',
+				s: 'a few seconds',
+				ss: '%d seconds',
+				m: 'a minute',
+				mm: '%d minutes',
+				h: 'an hour',
+				hh: '%d hours',
+				d: 'a day',
+				dd: '%d days',
+				M: 'a month',
+				MM: '%d months',
+				y: 'a year',
+				yy: '%d years'
+			},
+			months: Ce,
+			monthsShort: He,
+			week: {
+				dow: 0,
+				doy: 6
+			},
+			weekdays: Ze,
+			weekdaysMin: $e,
+			weekdaysShort: ze,
+			meridiemParse: /[ap]\.?m?\.?/i
+		},
+		it = {},
+		rt = {};
+
+	function at(e) {
+		return e ? e.toLowerCase().replace('_', '-') : e
+	}
+
+	function ot(e) {
+		let t = null;
+		if (!it[e] && 'undefined' !== typeof module && module && module.exports) try {
+			t = tt._abbr, ut(t)
+		} catch (e) {}
+		return it[e]
+	}
+
+	function ut(e, t) {
+		let n;
+		return e && ((n = l(t) ? ht(e) : lt(e, t)) ? tt = n : 'undefined' !== typeof console && console.warn &&
+			console.warn('Locale ' + e + ' not found. Did you forget to load it?')), tt._abbr
+	}
+
+	function lt(e, t) {
+		if (null === t) return delete it[e], null;
+		let n, s = st;
+		if (t.abbr = e, null != it[e]) T('defineLocaleOverride',
+			'use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'
+			), s = it[e]._config;
+		else if (null != t.parentLocale)
+			if (null != it[t.parentLocale]) s = it[t.parentLocale]._config;
+			else {
+				if (null == (n = ot(t.parentLocale))) return rt[t.parentLocale] || (rt[t.parentLocale] = []), rt[t
+					.parentLocale].push({
+					name: e,
+					config: t
+				}), null;
+				s = n._config
+			} return it[e] = new P(x(s, t)), rt[e] && rt[e].forEach(function(e) {
+			lt(e.name, e.config)
+		}), ut(e), it[e]
+	}
+
+	function ht(e) {
+		let t;
+		if (e && e._locale && e._locale._abbr && (e = e._locale._abbr), !e) return tt;
+		if (!o(e)) {
+			if (t = ot(e)) return t;
+			e = [e]
+		}
+		return function(e) {
+			for (var t, n, s, i, r = 0; r < e.length;) {
+				for (t = (i = at(e[r]).split('-')).length, n = (n = at(e[r + 1])) ? n.split('-') : null; 0 <
+					t;) {
+					if (s = ot(i.slice(0, t).join('-'))) return s;
+					if (n && n.length >= t && a(i, n, !0) >= t - 1) break;
+					t--
+				}
+				r++
+			}
+			return tt
+		}(e)
+	}
+
+	function dt(e) {
+		let t, n = e._a;
+		return n && -2 === g(e).overflow && (t = n[_e] < 0 || 11 < n[_e] ? _e : n[ye] < 1 || n[ye] > Pe(n[me], n[
+				_e]) ? ye : n[ge] < 0 || 24 < n[ge] || 24 === n[ge] && (0 !== n[ve] || 0 !== n[pe] || 0 !== n[
+				we]) ? ge : n[ve] < 0 || 59 < n[ve] ? ve : n[pe] < 0 || 59 < n[pe] ? pe : n[we] < 0 || 999 < n[
+				we] ? we : -1, g(e)._overflowDayOfYear && (t < me || ye < t) && (t = ye), g(e)._overflowWeeks &&
+			-1 === t && (t = Me), g(e)._overflowWeekday && -1 === t && (t = ke), g(e).overflow = t), e
+	}
+
+	function ct(e, t, n) {
+		return null != e ? e : null != t ? t : n
+	}
+
+	function ft(e) {
+		let t, n, s, i, r, a = [];
+		if (!e._d) {
+			let o, u;
+			for (o = e, u = new Date(c.now()), s = o._useUTC ? [u.getUTCFullYear(), u.getUTCMonth(), u
+			.getUTCDate()] : [u.getFullYear(), u.getMonth(), u.getDate()], e._w && null == e._a[ye] && null == e._a[
+					_e] && function(e) {
+					let t, n, s, i, r, a, o, u;
+					if (null != (t = e._w).GG || null != t.W || null != t.E) r = 1, a = 4, n = ct(t.GG, e._a[me],
+						Ie(bt(), 1, 4).year), s = ct(t.W, 1), ((i = ct(t.E, 1)) < 1 || 7 < i) && (u = !0);
+					else {
+						r = e._locale._week.dow, a = e._locale._week.doy;
+						let l = Ie(bt(), r, a);
+						n = ct(t.gg, e._a[me], l.year), s = ct(t.w, l.week), null != t.d ? ((i = t.d) < 0 || 6 <
+							i) && (u = !0) : null != t.e ? (i = t.e + r, (t.e < 0 || 6 < t.e) && (u = !0)) : i = r
+					}
+					s < 1 || s > Ae(n, r, a) ? g(e)._overflowWeeks = !0 : null != u ? g(e)._overflowWeekday = !0 : (
+						o = Ee(n, s, i, r, a), e._a[me] = o.year, e._dayOfYear = o.dayOfYear)
+				}(e), null != e._dayOfYear && (r = ct(e._a[me], s[me]), (e._dayOfYear > Se(r) || 0 === e
+					._dayOfYear) && (g(e)._overflowDayOfYear = !0), n = Ge(r, 0, e._dayOfYear), e._a[_e] = n
+					.getUTCMonth(), e._a[ye] = n.getUTCDate()), t = 0; t < 3 && null == e._a[t]; ++t) e._a[t] = a[
+				t] = s[t];
+			for (; t < 7; t++) e._a[t] = a[t] = null == e._a[t] ? 2 === t ? 1 : 0 : e._a[t];
+			24 === e._a[ge] && 0 === e._a[ve] && 0 === e._a[pe] && 0 === e._a[we] && (e._nextDay = !0, e._a[ge] =
+				0), e._d = (e._useUTC ? Ge : function(e, t, n, s, i, r, a) {
+					let o;
+					return e < 100 && 0 <= e ? (o = new Date(e + 400, t, n, s, i, r, a), isFinite(o
+					.getFullYear()) && o.setFullYear(e)) : o = new Date(e, t, n, s, i, r, a), o
+				}).apply(null, a), i = e._useUTC ? e._d.getUTCDay() : e._d.getDay(), null != e._tzm && e._d
+				.setUTCMinutes(e._d.getUTCMinutes() - e._tzm), e._nextDay && (e._a[ge] = 24), e._w && void 0 !== e
+				._w.d && e._w.d !== i && (g(e).weekdayMismatch = !0)
+		}
+	}
+	let mt =
+		/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
+		_t =
+		/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
+		yt = /Z|[+-]\d\d(?::?\d\d)?/,
+		gt = [
+			['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/],
+			['YYYY-MM-DD', /\d{4}-\d\d-\d\d/],
+			['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/],
+			['GGGG-[W]WW', /\d{4}-W\d\d/, !1],
+			['YYYY-DDD', /\d{4}-\d{3}/],
+			['YYYY-MM', /\d{4}-\d\d/, !1],
+			['YYYYYYMMDD', /[+-]\d{10}/],
+			['YYYYMMDD', /\d{8}/],
+			['GGGG[W]WWE', /\d{4}W\d{3}/],
+			['GGGG[W]WW', /\d{4}W\d{2}/, !1],
+			['YYYYDDD', /\d{7}/]
+		],
+		vt = [
+			['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/],
+			['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/],
+			['HH:mm:ss', /\d\d:\d\d:\d\d/],
+			['HH:mm', /\d\d:\d\d/],
+			['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/],
+			['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/],
+			['HHmmss', /\d\d\d\d\d\d/],
+			['HHmm', /\d\d\d\d/],
+			['HH', /\d\d/]
+		],
+		pt = /^\/?Date\((\-?\d+)/i;
+
+	function wt(e) {
+		let t, n, s, i, r, a, o = e._i,
+			u = mt.exec(o) || _t.exec(o);
+		if (u) {
+			for (g(e).iso = !0, t = 0, n = gt.length; t < n; t++)
+				if (gt[t][1].exec(u[1])) {
+					i = gt[t][0], s = !1 !== gt[t][2];
+					break
+				} if (null == i) return void(e._isValid = !1);
+			if (u[3]) {
+				for (t = 0, n = vt.length; t < n; t++)
+					if (vt[t][1].exec(u[3])) {
+						r = (u[2] || ' ') + vt[t][0];
+						break
+					} if (null == r) return void(e._isValid = !1)
+			}
+			if (!s && null != r) return void(e._isValid = !1);
+			if (u[4]) {
+				if (!yt.exec(u[4])) return void(e._isValid = !1);
+				a = 'Z'
+			}
+			e._f = i + (r || '') + (a || ''), Yt(e)
+		} else e._isValid = !1
+	}
+	let Mt =
+		/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;
+
+	function kt(e, t, n, s, i, r) {
+		let a = [function(e) {
+			let t = parseInt(e, 10); {
+				if (t <= 49) return 2e3 + t;
+				if (t <= 999) return 1900 + t
+			}
+			return t
+		}(e), He.indexOf(t), parseInt(n, 10), parseInt(s, 10), parseInt(i, 10)];
+		return r && a.push(parseInt(r, 10)), a
+	}
+	let St = {
+		UT: 0,
+		GMT: 0,
+		EDT: -240,
+		EST: -300,
+		CDT: -300,
+		CST: -360,
+		MDT: -360,
+		MST: -420,
+		PDT: -420,
+		PST: -480
+	};
+
+	function Dt(e) {
+		let t, n, s, i = Mt.exec(e._i.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/,
+			'').replace(/\s\s*$/, ''));
+		if (i) {
+			let r = kt(i[4], i[3], i[2], i[5], i[6], i[7]);
+			if (t = i[1], n = r, s = e, t && ze.indexOf(t) !== new Date(n[0], n[1], n[2]).getDay() && (g(s)
+					.weekdayMismatch = !0, !(s._isValid = !1))) return;
+			e._a = r, e._tzm = function(e, t, n) {
+					if (e) return St[e];
+					if (t) return 0;
+					let s = parseInt(n, 10),
+						i = s % 100;
+					return (s - i) / 100 * 60 + i
+				}(i[8], i[9], i[10]), e._d = Ge.apply(null, e._a), e._d.setUTCMinutes(e._d.getUTCMinutes() - e
+				._tzm), g(e).rfc2822 = !0
+		} else e._isValid = !1
+	}
+
+	function Yt(e) {
+		if (e._f !== c.ISO_8601)
+			if (e._f !== c.RFC_2822) {
+				e._a = [], g(e).empty = !0;
+				let t, n, s, i, r, a, o, u, l = '' + e._i,
+					h = l.length,
+					d = 0;
+				for (s = j(e._f, e._locale).match(N) || [], t = 0; t < s.length; t++) i = s[t], (n = (l.match(le(i,
+						e)) || [])[0]) && (0 < (r = l.substr(0, l.indexOf(n))).length && g(e).unusedInput.push(r),
+						l = l.slice(l.indexOf(n) + n.length), d += n.length), E[i] ? (n ? g(e).empty = !1 : g(e)
+						.unusedTokens.push(i), a = i, u = e, null != (o = n) && m(de, a) && de[a](o, u._a, u, a)) :
+					e._strict && !n && g(e).unusedTokens.push(i);
+				g(e).charsLeftOver = h - d, 0 < l.length && g(e).unusedInput.push(l), e._a[ge] <= 12 && !0 === g(e)
+					.bigHour && 0 < e._a[ge] && (g(e).bigHour = void 0), g(e).parsedDateParts = e._a.slice(0), g(e)
+					.meridiem = e._meridiem, e._a[ge] = function(e, t, n) {
+						let s;
+						if (null == n) return t;
+						return null != e.meridiemHour ? e.meridiemHour(t, n) : (null != e.isPM && ((s = e.isPM(
+							n)) && t < 12 && (t += 12), s || 12 !== t || (t = 0)), t)
+					}(e._locale, e._a[ge], e._meridiem), ft(e), dt(e)
+			} else Dt(e);
+		else wt(e)
+	}
+
+	function Ot(e) {
+		let t, n, s, i, r = e._i,
+			a = e._f;
+		return e._locale = e._locale || ht(e._l), null === r || void 0 === a && '' === r ? p({
+			nullInput: !0
+		}) : ('string' === typeof r && (e._i = r = e._locale.preparse(r)), k(r) ? new M(dt(r)) : (d(r) ? e._d =
+			r : o(a) ? function(e) {
+				let t, n, s, i, r;
+				if (0 === e._f.length) return g(e).invalidFormat = !0, e._d = new Date(NaN);
+				for (i = 0; i < e._f.length; i++) r = 0, t = w({}, e), null != e._useUTC && (t._useUTC = e
+					._useUTC), t._f = e._f[i], Yt(t), v(t) && (r += g(t).charsLeftOver, r += 10 * g(t)
+					.unusedTokens.length, g(t).score = r, (null == s || r < s) && (s = r, n = t));
+				_(e, n || t)
+			}(e) : a ? Yt(e) : l(n = (t = e)._i) ? t._d = new Date(c.now()) : d(n) ? t._d = new Date(n
+				.valueOf()) : 'string' === typeof n ? (s = t, null === (i = pt.exec(s._i)) ? (wt(s), !1 ===
+				s._isValid && (delete s._isValid, Dt(s), !1 === s._isValid && (delete s._isValid, c
+					.createFromInputFallback(s)))) : s._d = new Date(+i[1])) : o(n) ? (t._a = f(n.slice(0),
+				function(e) {
+					return parseInt(e, 10)
+				}), ft(t)) : u(n) ? function(e) {
+				if (!e._d) {
+					let t = R(e._i);
+					e._a = f([t.year, t.month, t.day || t.date, t.hour, t.minute, t.second, t.millisecond],
+						function(e) {
+							return e && parseInt(e, 10)
+						}), ft(e)
+				}
+			}(t) : h(n) ? t._d = new Date(n) : c.createFromInputFallback(t), v(e) || (e._d = null), e))
+	}
+
+	function Tt(e, t, n, s, i) {
+		let r, a = {};
+		return !0 !== n && !1 !== n || (s = n, n = void 0), (u(e) && function(e) {
+				if (Object.getOwnPropertyNames) return 0 === Object.getOwnPropertyNames(e).length;
+				let t;
+				for (t in e)
+					if (e.hasOwnProperty(t)) return !1;
+				return !0
+			}(e) || o(e) && 0 === e.length) && (e = void 0), a._isAMomentObject = !0, a._useUTC = a._isUTC = i, a
+			._l = n, a._i = e, a._f = t, a._strict = s, (r = new M(dt(Ot(a))))._nextDay && (r.add(1, 'd'), r
+				._nextDay = void 0), r
+	}
+
+	function bt(e, t, n, s) {
+		return Tt(e, t, n, s, !1)
+	}
+	c.createFromInputFallback = n(
+		'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',
+		function(e) {
+			e._d = new Date(e._i + (e._useUTC ? ' UTC' : ''))
+		}), c.ISO_8601 = function() {}, c.RFC_2822 = function() {};
+	let xt = n('moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',
+			function() {
+				let e = bt.apply(null, arguments);
+				return this.isValid() && e.isValid() ? e < this ? this : e : p()
+			}),
+		Pt = n('moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',
+			function() {
+				let e = bt.apply(null, arguments);
+				return this.isValid() && e.isValid() ? this < e ? this : e : p()
+			});
+
+	function Wt(e, t) {
+		let n, s;
+		if (1 === t.length && o(t[0]) && (t = t[0]), !t.length) return bt();
+		for (n = t[0], s = 1; s < t.length; ++s) t[s].isValid() && !t[s][e](n) || (n = t[s]);
+		return n
+	}
+	let Ct = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];
+
+	function Ht(e) {
+		let t = R(e),
+			n = t.year || 0,
+			s = t.quarter || 0,
+			i = t.month || 0,
+			r = t.week || t.isoWeek || 0,
+			a = t.day || 0,
+			o = t.hour || 0,
+			u = t.minute || 0,
+			l = t.second || 0,
+			h = t.millisecond || 0;
+		this._isValid = function(e) {
+				for (let t in e)
+					if (-1 === Ye.call(Ct, t) || null != e[t] && isNaN(e[t])) return !1;
+				for (let n = !1, s = 0; s < Ct.length; ++s)
+					if (e[Ct[s]]) {
+						if (n) return !1;
+						parseFloat(e[Ct[s]]) !== D(e[Ct[s]]) && (n = !0)
+					} return !0
+			}(t), this._milliseconds = +h + 1e3 * l + 6e4 * u + 1e3 * o * 60 * 60, this._days = +a + 7 * r, this
+			._months = +i + 3 * s + 12 * n, this._data = {}, this._locale = ht(), this._bubble()
+	}
+
+	function Rt(e) {
+		return e instanceof Ht
+	}
+
+	function Ut(e) {
+		return e < 0 ? -1 * Math.round(-1 * e) : Math.round(e)
+	}
+
+	function Ft(e, n) {
+		I(e, 0, 0, function() {
+			let e = this.utcOffset(),
+				t = '+';
+			return e < 0 && (e = -e, t = '-'), t + L(~~(e / 60), 2) + n + L(~~e % 60, 2)
+		})
+	}
+	Ft('Z', ':'), Ft('ZZ', ''), ue('Z', re), ue('ZZ', re), ce(['Z', 'ZZ'], function(e, t, n) {
+		n._useUTC = !0, n._tzm = Nt(re, e)
+	});
+	let Lt = /([\+\-]|\d\d)/gi;
+
+	function Nt(e, t) {
+		let n = (t || '').match(e);
+		if (null === n) return null;
+		let s = ((n[n.length - 1] || []) + '').match(Lt) || ['-', 0, 0],
+			i = 60 * s[1] + D(s[2]);
+		return 0 === i ? 0 : '+' === s[0] ? i : -i
+	}
+
+	function Gt(e, t) {
+		let n, s;
+		return t._isUTC ? (n = t.clone(), s = (k(e) || d(e) ? e.valueOf() : bt(e).valueOf()) - n.valueOf(), n._d
+			.setTime(n._d.valueOf() + s), c.updateOffset(n, !1), n) : bt(e).local()
+	}
+
+	function Vt(e) {
+		return 15 * -Math.round(e._d.getTimezoneOffset() / 15)
+	}
+
+	function Et() {
+		return !!this.isValid() && (this._isUTC && 0 === this._offset)
+	}
+	c.updateOffset = function() {};
+	let It = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,
+		At =
+		/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;
+
+	function jt(e, t) {
+		let n, s, i, r = e,
+			a = null;
+		return Rt(e) ? r = {
+			ms: e._milliseconds,
+			d: e._days,
+			M: e._months
+		} : h(e) ? (r = {}, t ? r[t] = e : r.milliseconds = e) : (a = It.exec(e)) ? (n = '-' === a[1] ? -1 : 1,
+			r = {
+				y: 0,
+				d: D(a[ye]) * n,
+				h: D(a[ge]) * n,
+				m: D(a[ve]) * n,
+				s: D(a[pe]) * n,
+				ms: D(Ut(1e3 * a[we])) * n
+			}) : (a = At.exec(e)) ? (n = '-' === a[1] ? -1 : 1, r = {
+			y: Zt(a[2], n),
+			M: Zt(a[3], n),
+			w: Zt(a[4], n),
+			d: Zt(a[5], n),
+			h: Zt(a[6], n),
+			m: Zt(a[7], n),
+			s: Zt(a[8], n)
+		}) : null == r ? r = {} : 'object' === typeof r && ('from' in r || 'to' in r) && (i = function(e, t) {
+			let n;
+			if (!e.isValid() || !t.isValid()) return {
+				milliseconds: 0,
+				months: 0
+			};
+			t = Gt(t, e), e.isBefore(t) ? n = zt(e, t) : ((n = zt(t, e)).milliseconds = -n.milliseconds, n
+				.months = -n.months);
+			return n
+		}(bt(r.from), bt(r.to)), (r = {}).ms = i.milliseconds, r.M = i.months), s = new Ht(r), Rt(e) && m(e,
+			'_locale') && (s._locale = e._locale), s
+	}
+
+	function Zt(e, t) {
+		let n = e && parseFloat(e.replace(',', '.'));
+		return (isNaN(n) ? 0 : n) * t
+	}
+
+	function zt(e, t) {
+		let n = {};
+		return n.months = t.month() - e.month() + 12 * (t.year() - e.year()), e.clone().add(n.months, 'M').isAfter(
+			t) && --n.months, n.milliseconds = +t - +e.clone().add(n.months, 'M'), n
+	}
+
+	function $t(s, i) {
+		return function(e, t) {
+			let n;
+			return null === t || isNaN(+t) || (T(i, 'moment().' + i +
+				'(period, number) is deprecated. Please use moment().' + i +
+				'(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'
+				), n = e, e = t, t = n), qt(this, jt(e = 'string' === typeof e ? +e : e, t), s), this
+		}
+	}
+
+	function qt(e, t, n, s) {
+		let i = t._milliseconds,
+			r = Ut(t._days),
+			a = Ut(t._months);
+		e.isValid() && (s = null == s || s, a && Re(e, be(e, 'Month') + a * n), r && xe(e, 'Date', be(e, 'Date') +
+			r * n), i && e._d.setTime(e._d.valueOf() + i * n), s && c.updateOffset(e, r || a))
+	}
+	jt.fn = Ht.prototype, jt.invalid = function() {
+		return jt(NaN)
+	};
+	let Jt = $t(1, 'add'),
+		Bt = $t(-1, 'subtract');
+
+	function Qt(e, t) {
+		let n = 12 * (t.year() - e.year()) + (t.month() - e.month()),
+			s = e.clone().add(n, 'months');
+		return -(n + (t - s < 0 ? (t - s) / (s - e.clone().add(n - 1, 'months')) : (t - s) / (e.clone().add(n + 1,
+			'months') - s))) || 0
+	}
+
+	function Xt(e) {
+		let t;
+		return void 0 === e ? this._locale._abbr : (null != (t = ht(e)) && (this._locale = t), this)
+	}
+	c.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ', c.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';
+	let Kt = n(
+		'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',
+		function(e) {
+			return void 0 === e ? this.localeData() : this.locale(e)
+		});
+
+	function en() {
+		return this._locale
+	}
+	let tn = 126227808e5;
+
+	function nn(e, t) {
+		return (e % t + t) % t
+	}
+
+	function sn(e, t, n) {
+		return e < 100 && 0 <= e ? new Date(e + 400, t, n) - tn : new Date(e, t, n).valueOf()
+	}
+
+	function rn(e, t, n) {
+		return e < 100 && 0 <= e ? Date.UTC(e + 400, t, n) - tn : Date.UTC(e, t, n)
+	}
+
+	function an(e, t) {
+		I(0, [e, e.length], 0, t)
+	}
+
+	function on(e, t, n, s, i) {
+		let r;
+		return null == e ? Ie(this, s, i).year : ((r = Ae(e, s, i)) < t && (t = r), function(e, t, n, s, i) {
+			let r = Ee(e, t, n, s, i),
+				a = Ge(r.year, 0, r.dayOfYear);
+			return this.year(a.getUTCFullYear()), this.month(a.getUTCMonth()), this.date(a.getUTCDate()),
+				this
+		}.call(this, e, t, n, s, i))
+	}
+	I(0, ['gg', 2], 0, function() {
+			return this.weekYear() % 100
+		}), I(0, ['GG', 2], 0, function() {
+			return this.isoWeekYear() % 100
+		}), an('gggg', 'weekYear'), an('ggggg', 'weekYear'), an('GGGG', 'isoWeekYear'), an('GGGGG', 'isoWeekYear'),
+		C('weekYear', 'gg'), C('isoWeekYear', 'GG'), F('weekYear', 1), F('isoWeekYear', 1), ue('G', se), ue('g',
+		se), ue('GG', B, z), ue('gg', B, z), ue('GGGG', ee, q), ue('gggg', ee, q), ue('GGGGG', te, J), ue('ggggg',
+			te, J), fe(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function(e, t, n, s) {
+			t[s.substr(0, 2)] = D(e)
+		}), fe(['gg', 'GG'], function(e, t, n, s) {
+			t[s] = c.parseTwoDigitYear(e)
+		}), I('Q', 0, 'Qo', 'quarter'), C('quarter', 'Q'), F('quarter', 7), ue('Q', Z), ce('Q', function(e, t) {
+			t[_e] = 3 * (D(e) - 1)
+		}), I('D', ['DD', 2], 'Do', 'date'), C('date', 'D'), F('date', 9), ue('D', B), ue('DD', B, z), ue('Do',
+			function(e, t) {
+				return e ? t._dayOfMonthOrdinalParse || t._ordinalParse : t._dayOfMonthOrdinalParseLenient
+			}), ce(['D', 'DD'], ye), ce('Do', function(e, t) {
+			t[ye] = D(e.match(B)[0])
+		});
+	let un = Te('Date', !0);
+	I('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'), C('dayOfYear', 'DDD'), F('dayOfYear', 4), ue('DDD', K), ue('DDDD',
+		$), ce(['DDD', 'DDDD'], function(e, t, n) {
+		n._dayOfYear = D(e)
+	}), I('m', ['mm', 2], 0, 'minute'), C('minute', 'm'), F('minute', 14), ue('m', B), ue('mm', B, z), ce(['m',
+		'mm'
+	], ve);
+	let ln = Te('Minutes', !1);
+	I('s', ['ss', 2], 0, 'second'), C('second', 's'), F('second', 15), ue('s', B), ue('ss', B, z), ce(['s', 'ss'],
+		pe);
+	let hn, dn = Te('Seconds', !1);
+	for (I('S', 0, 0, function() {
+			return ~~(this.millisecond() / 100)
+		}), I(0, ['SS', 2], 0, function() {
+			return ~~(this.millisecond() / 10)
+		}), I(0, ['SSS', 3], 0, 'millisecond'), I(0, ['SSSS', 4], 0, function() {
+			return 10 * this.millisecond()
+		}), I(0, ['SSSSS', 5], 0, function() {
+			return 100 * this.millisecond()
+		}), I(0, ['SSSSSS', 6], 0, function() {
+			return 1e3 * this.millisecond()
+		}), I(0, ['SSSSSSS', 7], 0, function() {
+			return 1e4 * this.millisecond()
+		}), I(0, ['SSSSSSSS', 8], 0, function() {
+			return 1e5 * this.millisecond()
+		}), I(0, ['SSSSSSSSS', 9], 0, function() {
+			return 1e6 * this.millisecond()
+		}), C('millisecond', 'ms'), F('millisecond', 16), ue('S', K, Z), ue('SS', K, z), ue('SSS', K, $), hn =
+		'SSSS'; hn.length <= 9; hn += 'S') ue(hn, ne);
+
+	function cn(e, t) {
+		t[we] = D(1e3 * ('0.' + e))
+	}
+	for (hn = 'S'; hn.length <= 9; hn += 'S') ce(hn, cn);
+	let fn = Te('Milliseconds', !1);
+	I('z', 0, 0, 'zoneAbbr'), I('zz', 0, 0, 'zoneName');
+	let mn = M.prototype;
+
+	function _n(e) {
+		return e
+	}
+	mn.add = Jt, mn.calendar = function(e, t) {
+			let n = e || bt(),
+				s = Gt(n, this).startOf('day'),
+				i = c.calendarFormat(this, s) || 'sameElse',
+				r = t && (b(t[i]) ? t[i].call(this, n) : t[i]);
+			return this.format(r || this.localeData().calendar(i, this, bt(n)))
+		}, mn.clone = function() {
+			return new M(this)
+		}, mn.diff = function(e, t, n) {
+			let s, i, r;
+			if (!this.isValid()) return NaN;
+			if (!(s = Gt(e, this)).isValid()) return NaN;
+			switch (i = 6e4 * (s.utcOffset() - this.utcOffset()), t = H(t)) {
+				case 'year':
+					r = Qt(this, s) / 12;
+					break;
+				case 'month':
+					r = Qt(this, s);
+					break;
+				case 'quarter':
+					r = Qt(this, s) / 3;
+					break;
+				case 'second':
+					r = (this - s) / 1e3;
+					break;
+				case 'minute':
+					r = (this - s) / 6e4;
+					break;
+				case 'hour':
+					r = (this - s) / 36e5;
+					break;
+				case 'day':
+					r = (this - s - i) / 864e5;
+					break;
+				case 'week':
+					r = (this - s - i) / 6048e5;
+					break;
+				default:
+					r = this - s
+			}
+			return n ? r : S(r)
+		}, mn.endOf = function(e) {
+			let t;
+			if (void 0 === (e = H(e)) || 'millisecond' === e || !this.isValid()) return this;
+			let n = this._isUTC ? rn : sn;
+			switch (e) {
+				case 'year':
+					t = n(this.year() + 1, 0, 1) - 1;
+					break;
+				case 'quarter':
+					t = n(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;
+					break;
+				case 'month':
+					t = n(this.year(), this.month() + 1, 1) - 1;
+					break;
+				case 'week':
+					t = n(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;
+					break;
+				case 'isoWeek':
+					t = n(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;
+					break;
+				case 'day':
+				case 'date':
+					t = n(this.year(), this.month(), this.date() + 1) - 1;
+					break;
+				case 'hour':
+					t = this._d.valueOf(), t += 36e5 - nn(t + (this._isUTC ? 0 : 6e4 * this.utcOffset()), 36e5) - 1;
+					break;
+				case 'minute':
+					t = this._d.valueOf(), t += 6e4 - nn(t, 6e4) - 1;
+					break;
+				case 'second':
+					t = this._d.valueOf(), t += 1e3 - nn(t, 1e3) - 1;
+					break
+			}
+			return this._d.setTime(t), c.updateOffset(this, !0), this
+		}, mn.format = function(e) {
+			e || (e = this.isUtc() ? c.defaultFormatUtc : c.defaultFormat);
+			let t = A(this, e);
+			return this.localeData().postformat(t)
+		}, mn.from = function(e, t) {
+			return this.isValid() && (k(e) && e.isValid() || bt(e).isValid()) ? jt({
+				to: this,
+				from: e
+			}).locale(this.locale()).humanize(!t) : this.localeData().invalidDate()
+		}, mn.fromNow = function(e) {
+			return this.from(bt(), e)
+		}, mn.to = function(e, t) {
+			return this.isValid() && (k(e) && e.isValid() || bt(e).isValid()) ? jt({
+				from: this,
+				to: e
+			}).locale(this.locale()).humanize(!t) : this.localeData().invalidDate()
+		}, mn.toNow = function(e) {
+			return this.to(bt(), e)
+		}, mn.get = function(e) {
+			return b(this[e = H(e)]) ? this[e]() : this
+		}, mn.invalidAt = function() {
+			return g(this).overflow
+		}, mn.isAfter = function(e, t) {
+			let n = k(e) ? e : bt(e);
+			return !(!this.isValid() || !n.isValid()) && ('millisecond' === (t = H(t) || 'millisecond') ? this
+				.valueOf() > n.valueOf() : n.valueOf() < this.clone().startOf(t).valueOf())
+		}, mn.isBefore = function(e, t) {
+			let n = k(e) ? e : bt(e);
+			return !(!this.isValid() || !n.isValid()) && ('millisecond' === (t = H(t) || 'millisecond') ? this
+				.valueOf() < n.valueOf() : this.clone().endOf(t).valueOf() < n.valueOf())
+		}, mn.isBetween = function(e, t, n, s) {
+			let i = k(e) ? e : bt(e),
+				r = k(t) ? t : bt(t);
+			return !!(this.isValid() && i.isValid() && r.isValid()) && ('(' === (s = s || '()')[0] ? this.isAfter(i,
+				n) : !this.isBefore(i, n)) && (')' === s[1] ? this.isBefore(r, n) : !this.isAfter(r, n))
+		}, mn.isSame = function(e, t) {
+			let n, s = k(e) ? e : bt(e);
+			return !(!this.isValid() || !s.isValid()) && ('millisecond' === (t = H(t) || 'millisecond') ? this
+				.valueOf() === s.valueOf() : (n = s.valueOf(), this.clone().startOf(t).valueOf() <= n && n <=
+					this.clone().endOf(t).valueOf()))
+		}, mn.isSameOrAfter = function(e, t) {
+			return this.isSame(e, t) || this.isAfter(e, t)
+		}, mn.isSameOrBefore = function(e, t) {
+			return this.isSame(e, t) || this.isBefore(e, t)
+		}, mn.isValid = function() {
+			return v(this)
+		}, mn.lang = Kt, mn.locale = Xt, mn.localeData = en, mn.max = Pt, mn.min = xt, mn.parsingFlags =
+	function() {
+			return _({}, g(this))
+		}, mn.set = function(e, t) {
+			if ('object' === typeof e)
+				for (let n = function(e) {
+						let t = [];
+						for (let n in e) t.push({
+							unit: n,
+							priority: U[n]
+						});
+						return t.sort(function(e, t) {
+							return e.priority - t.priority
+						}), t
+					}(e = R(e)), s = 0; s < n.length; s++) this[n[s].unit](e[n[s].unit]);
+			else if (b(this[e = H(e)])) return this[e](t);
+			return this
+		}, mn.startOf = function(e) {
+			let t;
+			if (void 0 === (e = H(e)) || 'millisecond' === e || !this.isValid()) return this;
+			let n = this._isUTC ? rn : sn;
+			switch (e) {
+				case 'year':
+					t = n(this.year(), 0, 1);
+					break;
+				case 'quarter':
+					t = n(this.year(), this.month() - this.month() % 3, 1);
+					break;
+				case 'month':
+					t = n(this.year(), this.month(), 1);
+					break;
+				case 'week':
+					t = n(this.year(), this.month(), this.date() - this.weekday());
+					break;
+				case 'isoWeek':
+					t = n(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));
+					break;
+				case 'day':
+				case 'date':
+					t = n(this.year(), this.month(), this.date());
+					break;
+				case 'hour':
+					t = this._d.valueOf(), t -= nn(t + (this._isUTC ? 0 : 6e4 * this.utcOffset()), 36e5);
+					break;
+				case 'minute':
+					t = this._d.valueOf(), t -= nn(t, 6e4);
+					break;
+				case 'second':
+					t = this._d.valueOf(), t -= nn(t, 1e3);
+					break
+			}
+			return this._d.setTime(t), c.updateOffset(this, !0), this
+		}, mn.subtract = Bt, mn.toArray = function() {
+			let e = this;
+			return [e.year(), e.month(), e.date(), e.hour(), e.minute(), e.second(), e.millisecond()]
+		}, mn.toObject = function() {
+			let e = this;
+			return {
+				years: e.year(),
+				months: e.month(),
+				date: e.date(),
+				hours: e.hours(),
+				minutes: e.minutes(),
+				seconds: e.seconds(),
+				milliseconds: e.milliseconds()
+			}
+		}, mn.toDate = function() {
+			return new Date(this.valueOf())
+		}, mn.toISOString = function(e) {
+			if (!this.isValid()) return null;
+			let t = !0 !== e,
+				n = t ? this.clone().utc() : this;
+			return n.year() < 0 || 9999 < n.year() ? A(n, t ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' :
+				'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ') : b(Date.prototype.toISOString) ? t ? this.toDate()
+			.toISOString() : new Date(this.valueOf() + 60 * this.utcOffset() * 1e3).toISOString().replace('Z',
+				A(n, 'Z')) : A(n, t ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ')
+		}, mn.inspect = function() {
+			if (!this.isValid()) return 'moment.invalid(/* ' + this._i + ' */)';
+			let e = 'moment',
+				t = '';
+			this.isLocal() || (e = 0 === this.utcOffset() ? 'moment.utc' : 'moment.parseZone', t = 'Z');
+			let n = '[' + e + '("]',
+				s = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY',
+				i = t + '[")]';
+			return this.format(n + s + '-MM-DD[T]HH:mm:ss.SSS' + i)
+		}, mn.toJSON = function() {
+			return this.isValid() ? this.toISOString() : null
+		}, mn.toString = function() {
+			return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ')
+		}, mn.unix = function() {
+			return Math.floor(this.valueOf() / 1e3)
+		}, mn.valueOf = function() {
+			return this._d.valueOf() - 6e4 * (this._offset || 0)
+		}, mn.creationData = function() {
+			return {
+				input: this._i,
+				format: this._f,
+				locale: this._locale,
+				isUTC: this._isUTC,
+				strict: this._strict
+			}
+		}, mn.year = Oe, mn.isLeapYear = function() {
+			return De(this.year())
+		}, mn.weekYear = function(e) {
+			return on.call(this, e, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()
+				._week.doy)
+		}, mn.isoWeekYear = function(e) {
+			return on.call(this, e, this.isoWeek(), this.isoWeekday(), 1, 4)
+		}, mn.quarter = mn.quarters = function(e) {
+			return null == e ? Math.ceil((this.month() + 1) / 3) : this.month(3 * (e - 1) + this.month() % 3)
+		}, mn.month = Ue, mn.daysInMonth = function() {
+			return Pe(this.year(), this.month())
+		}, mn.week = mn.weeks = function(e) {
+			let t = this.localeData().week(this);
+			return null == e ? t : this.add(7 * (e - t), 'd')
+		}, mn.isoWeek = mn.isoWeeks = function(e) {
+			let t = Ie(this, 1, 4).week;
+			return null == e ? t : this.add(7 * (e - t), 'd')
+		}, mn.weeksInYear = function() {
+			let e = this.localeData()._week;
+			return Ae(this.year(), e.dow, e.doy)
+		}, mn.isoWeeksInYear = function() {
+			return Ae(this.year(), 1, 4)
+		}, mn.date = un, mn.day = mn.days = function(e) {
+			if (!this.isValid()) return null != e ? this : NaN;
+			let t, n, s = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+			return null != e ? (t = e, n = this.localeData(), e = 'string' !== typeof t ? t : isNaN(t) ?
+					'number' === typeof(t = n.weekdaysParse(t)) ? t : null : parseInt(t, 10), this.add(e - s, 'd')
+					) : s
+		}, mn.weekday = function(e) {
+			if (!this.isValid()) return null != e ? this : NaN;
+			let t = (this.day() + 7 - this.localeData()._week.dow) % 7;
+			return null == e ? t : this.add(e - t, 'd')
+		}, mn.isoWeekday = function(e) {
+			if (!this.isValid()) return null != e ? this : NaN;
+			if (null == e) return this.day() || 7;
+			let t, n, s = (t = e, n = this.localeData(), 'string' === typeof t ? n.weekdaysParse(t) % 7 || 7 :
+				isNaN(t) ? null : t);
+			return this.day(this.day() % 7 ? s : s - 7)
+		}, mn.dayOfYear = function(e) {
+			let t = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;
+			return null == e ? t : this.add(e - t, 'd')
+		}, mn.hour = mn.hours = nt, mn.minute = mn.minutes = ln, mn.second = mn.seconds = dn, mn.millisecond = mn
+		.milliseconds = fn, mn.utcOffset = function(e, t, n) {
+			let s, i = this._offset || 0;
+			if (!this.isValid()) return null != e ? this : NaN;
+			if (null == e) return this._isUTC ? i : Vt(this);
+			if ('string' === typeof e) {
+				if (null === (e = Nt(re, e))) return this
+			} else Math.abs(e) < 16 && !n && (e *= 60);
+			return !this._isUTC && t && (s = Vt(this)), this._offset = e, this._isUTC = !0, null != s && this.add(s,
+				'm'), i !== e && (!t || this._changeInProgress ? qt(this, jt(e - i, 'm'), 1, !1) : this
+				._changeInProgress || (this._changeInProgress = !0, c.updateOffset(this, !0), this
+					._changeInProgress = null)), this
+		}, mn.utc = function(e) {
+			return this.utcOffset(0, e)
+		}, mn.local = function(e) {
+			return this._isUTC && (this.utcOffset(0, e), this._isUTC = !1, e && this.subtract(Vt(this), 'm')), this
+		}, mn.parseZone = function() {
+			if (null != this._tzm) this.utcOffset(this._tzm, !1, !0);
+			else if ('string' === typeof this._i) {
+				let e = Nt(ie, this._i);
+				null != e ? this.utcOffset(e) : this.utcOffset(0, !0)
+			}
+			return this
+		}, mn.hasAlignedHourOffset = function(e) {
+			return !!this.isValid() && (e = e ? bt(e).utcOffset() : 0, (this.utcOffset() - e) % 60 == 0)
+		}, mn.isDST = function() {
+			return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5)
+				.utcOffset()
+		}, mn.isLocal = function() {
+			return !!this.isValid() && !this._isUTC
+		}, mn.isUtcOffset = function() {
+			return !!this.isValid() && this._isUTC
+		}, mn.isUtc = Et, mn.isUTC = Et, mn.zoneAbbr = function() {
+			return this._isUTC ? 'UTC' : ''
+		}, mn.zoneName = function() {
+			return this._isUTC ? 'Coordinated Universal Time' : ''
+		}, mn.dates = n('dates accessor is deprecated. Use date instead.', un), mn.months = n(
+			'months accessor is deprecated. Use month instead', Ue), mn.years = n(
+			'years accessor is deprecated. Use year instead', Oe), mn.zone = n(
+			'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',
+			function(e, t) {
+				return null != e ? ('string' !== typeof e && (e = -e), this.utcOffset(e, t), this) : -this
+					.utcOffset()
+			}), mn.isDSTShifted = n(
+			'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',
+			function() {
+				if (!l(this._isDSTShifted)) return this._isDSTShifted;
+				let e = {};
+				if (w(e, this), (e = Ot(e))._a) {
+					let t = e._isUTC ? y(e._a) : bt(e._a);
+					this._isDSTShifted = this.isValid() && 0 < a(e._a, t.toArray())
+				} else this._isDSTShifted = !1;
+				return this._isDSTShifted
+			});
+	let yn = P.prototype;
+
+	function gn(e, t, n, s) {
+		let i = ht(),
+			r = y().set(s, t);
+		return i[n](r, e)
+	}
+
+	function vn(e, t, n) {
+		if (h(e) && (t = e, e = void 0), e = e || '', null != t) return gn(e, t, n, 'month');
+		let s, i = [];
+		for (s = 0; s < 12; s++) i[s] = gn(e, s, n, 'month');
+		return i
+	}
+
+	function pn(e, t, n, s) {
+		t = ('boolean' === typeof e ? h(t) && (n = t, t = void 0) : (t = e, e = !1, h(n = t) && (n = t, t =
+			void 0)), t || '');
+		let i, r = ht(),
+			a = e ? r._week.dow : 0;
+		if (null != n) return gn(t, (n + a) % 7, s, 'day');
+		let o = [];
+		for (i = 0; i < 7; i++) o[i] = gn(t, (i + a) % 7, s, 'day');
+		return o
+	}
+	yn.calendar = function(e, t, n) {
+		let s = this._calendar[e] || this._calendar.sameElse;
+		return b(s) ? s.call(t, n) : s
+	}, yn.longDateFormat = function(e) {
+		let t = this._longDateFormat[e],
+			n = this._longDateFormat[e.toUpperCase()];
+		return t || !n ? t : (this._longDateFormat[e] = n.replace(/MMMM|MM|DD|dddd/g, function(e) {
+			return e.slice(1)
+		}), this._longDateFormat[e])
+	}, yn.invalidDate = function() {
+		return this._invalidDate
+	}, yn.ordinal = function(e) {
+		return this._ordinal.replace('%d', e)
+	}, yn.preparse = _n, yn.postformat = _n, yn.relativeTime = function(e, t, n, s) {
+		let i = this._relativeTime[n];
+		return b(i) ? i(e, t, n, s) : i.replace(/%d/i, e)
+	}, yn.pastFuture = function(e, t) {
+		let n = this._relativeTime[0 < e ? 'future' : 'past'];
+		return b(n) ? n(t) : n.replace(/%s/i, t)
+	}, yn.set = function(e) {
+		let t, n;
+		for (n in e) b(t = e[n]) ? this[n] = t : this['_' + n] = t;
+		this._config = e, this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse
+			.source || this._ordinalParse.source) + '|' + /\d{1,2}/.source)
+	}, yn.months = function(e, t) {
+		return e ? o(this._months) ? this._months[e.month()] : this._months[(this._months.isFormat || We).test(
+				t) ? 'format' : 'standalone'][e.month()] : o(this._months) ? this._months : this._months
+			.standalone
+	}, yn.monthsShort = function(e, t) {
+		return e ? o(this._monthsShort) ? this._monthsShort[e.month()] : this._monthsShort[We.test(t) ?
+				'format' : 'standalone'][e.month()] : o(this._monthsShort) ? this._monthsShort : this
+			._monthsShort.standalone
+	}, yn.monthsParse = function(e, t, n) {
+		let s, i, r;
+		if (this._monthsParseExact) return function(e, t, n) {
+			let s, i, r, a = e.toLocaleLowerCase();
+			if (!this._monthsParse)
+				for (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = [],
+					s = 0; s < 12; ++s) r = y([2e3, s]), this._shortMonthsParse[s] = this.monthsShort(r,
+						'').toLocaleLowerCase(), this._longMonthsParse[s] = this.months(r, '')
+					.toLocaleLowerCase();
+			return n ? 'MMM' === t ? -1 !== (i = Ye.call(this._shortMonthsParse, a)) ? i : null : -1 !==
+				(i = Ye.call(this._longMonthsParse, a)) ? i : null : 'MMM' === t ? -1 !== (i = Ye.call(
+					this._shortMonthsParse, a)) ? i : -1 !== (i = Ye.call(this._longMonthsParse, a)) ?
+				i : null : -1 !== (i = Ye.call(this._longMonthsParse, a)) ? i : -1 !== (i = Ye.call(this
+					._shortMonthsParse, a)) ? i : null
+		}.call(this, e, t, n);
+		for (this._monthsParse || (this._monthsParse = [], this._longMonthsParse = [], this
+				._shortMonthsParse = []), s = 0; s < 12; s++) {
+			if (i = y([2e3, s]), n && !this._longMonthsParse[s] && (this._longMonthsParse[s] = new RegExp('^' +
+					this.months(i, '').replace('.', '') + '$', 'i'), this._shortMonthsParse[s] = new RegExp(
+					'^' + this.monthsShort(i, '').replace('.', '') + '$', 'i')), n || this._monthsParse[s] || (
+					r = '^' + this.months(i, '') + '|^' + this.monthsShort(i, ''), this._monthsParse[s] =
+					new RegExp(r.replace('.', ''), 'i')), n && 'MMMM' === t && this._longMonthsParse[s].test(e))
+				return s;
+			if (n && 'MMM' === t && this._shortMonthsParse[s].test(e)) return s;
+			if (!n && this._monthsParse[s].test(e)) return s
+		}
+	}, yn.monthsRegex = function(e) {
+		return this._monthsParseExact ? (m(this, '_monthsRegex') || Ne.call(this), e ? this._monthsStrictRegex :
+			this._monthsRegex) : (m(this, '_monthsRegex') || (this._monthsRegex = Le), this
+			._monthsStrictRegex && e ? this._monthsStrictRegex : this._monthsRegex)
+	}, yn.monthsShortRegex = function(e) {
+		return this._monthsParseExact ? (m(this, '_monthsRegex') || Ne.call(this), e ? this
+			._monthsShortStrictRegex : this._monthsShortRegex) : (m(this, '_monthsShortRegex') || (this
+				._monthsShortRegex = Fe), this._monthsShortStrictRegex && e ? this._monthsShortStrictRegex :
+			this._monthsShortRegex)
+	}, yn.week = function(e) {
+		return Ie(e, this._week.dow, this._week.doy).week
+	}, yn.firstDayOfYear = function() {
+		return this._week.doy
+	}, yn.firstDayOfWeek = function() {
+		return this._week.dow
+	}, yn.weekdays = function(e, t) {
+		let n = o(this._weekdays) ? this._weekdays : this._weekdays[e && !0 !== e && this._weekdays.isFormat
+			.test(t) ? 'format' : 'standalone'];
+		return !0 === e ? je(n, this._week.dow) : e ? n[e.day()] : n
+	}, yn.weekdaysMin = function(e) {
+		return !0 === e ? je(this._weekdaysMin, this._week.dow) : e ? this._weekdaysMin[e.day()] : this
+			._weekdaysMin
+	}, yn.weekdaysShort = function(e) {
+		return !0 === e ? je(this._weekdaysShort, this._week.dow) : e ? this._weekdaysShort[e.day()] : this
+			._weekdaysShort
+	}, yn.weekdaysParse = function(e, t, n) {
+		let s, i, r;
+		if (this._weekdaysParseExact) return function(e, t, n) {
+			let s, i, r, a = e.toLocaleLowerCase();
+			if (!this._weekdaysParse)
+				for (this._weekdaysParse = [], this._shortWeekdaysParse = [], this
+					._minWeekdaysParse = [], s = 0; s < 7; ++s) r = y([2e3, 1]).day(s), this
+					._minWeekdaysParse[s] = this.weekdaysMin(r, '').toLocaleLowerCase(), this
+					._shortWeekdaysParse[s] = this.weekdaysShort(r, '').toLocaleLowerCase(), this
+					._weekdaysParse[s] = this.weekdays(r, '').toLocaleLowerCase();
+			return n ? 'dddd' === t ? -1 !== (i = Ye.call(this._weekdaysParse, a)) ? i : null :
+				'ddd' === t ? -1 !== (i = Ye.call(this._shortWeekdaysParse, a)) ? i : null : -1 !== (i =
+					Ye.call(this._minWeekdaysParse, a)) ? i : null : 'dddd' === t ? -1 !== (i = Ye.call(
+					this._weekdaysParse, a)) ? i : -1 !== (i = Ye.call(this._shortWeekdaysParse, a)) ?
+				i : -1 !== (i = Ye.call(this._minWeekdaysParse, a)) ? i : null : 'ddd' === t ? -1 !== (
+					i = Ye.call(this._shortWeekdaysParse, a)) ? i : -1 !== (i = Ye.call(this
+					._weekdaysParse, a)) ? i : -1 !== (i = Ye.call(this._minWeekdaysParse, a)) ? i :
+				null : -1 !== (i = Ye.call(this._minWeekdaysParse, a)) ? i : -1 !== (i = Ye.call(this
+					._weekdaysParse, a)) ? i : -1 !== (i = Ye.call(this._shortWeekdaysParse, a)) ? i :
+				null
+		}.call(this, e, t, n);
+		for (this._weekdaysParse || (this._weekdaysParse = [], this._minWeekdaysParse = [], this
+				._shortWeekdaysParse = [], this._fullWeekdaysParse = []), s = 0; s < 7; s++) {
+			if (i = y([2e3, 1]).day(s), n && !this._fullWeekdaysParse[s] && (this._fullWeekdaysParse[s] =
+					new RegExp('^' + this.weekdays(i, '').replace('.', '\\.?') + '$', 'i'), this
+					._shortWeekdaysParse[s] = new RegExp('^' + this.weekdaysShort(i, '').replace('.', '\\.?') +
+						'$', 'i'), this._minWeekdaysParse[s] = new RegExp('^' + this.weekdaysMin(i, '').replace(
+						'.', '\\.?') + '$', 'i')), this._weekdaysParse[s] || (r = '^' + this.weekdays(i, '') +
+					'|^' + this.weekdaysShort(i, '') + '|^' + this.weekdaysMin(i, ''), this._weekdaysParse[s] =
+					new RegExp(r.replace('.', ''), 'i')), n && 'dddd' === t && this._fullWeekdaysParse[s].test(
+					e)) return s;
+			if (n && 'ddd' === t && this._shortWeekdaysParse[s].test(e)) return s;
+			if (n && 'dd' === t && this._minWeekdaysParse[s].test(e)) return s;
+			if (!n && this._weekdaysParse[s].test(e)) return s
+		}
+	}, yn.weekdaysRegex = function(e) {
+		return this._weekdaysParseExact ? (m(this, '_weekdaysRegex') || Qe.call(this), e ? this
+			._weekdaysStrictRegex : this._weekdaysRegex) : (m(this, '_weekdaysRegex') || (this
+				._weekdaysRegex = qe), this._weekdaysStrictRegex && e ? this._weekdaysStrictRegex : this
+			._weekdaysRegex)
+	}, yn.weekdaysShortRegex = function(e) {
+		return this._weekdaysParseExact ? (m(this, '_weekdaysRegex') || Qe.call(this), e ? this
+			._weekdaysShortStrictRegex : this._weekdaysShortRegex) : (m(this, '_weekdaysShortRegex') || (
+				this._weekdaysShortRegex = Je), this._weekdaysShortStrictRegex && e ? this
+			._weekdaysShortStrictRegex : this._weekdaysShortRegex)
+	}, yn.weekdaysMinRegex = function(e) {
+		return this._weekdaysParseExact ? (m(this, '_weekdaysRegex') || Qe.call(this), e ? this
+			._weekdaysMinStrictRegex : this._weekdaysMinRegex) : (m(this, '_weekdaysMinRegex') || (this
+				._weekdaysMinRegex = Be), this._weekdaysMinStrictRegex && e ? this._weekdaysMinStrictRegex :
+			this._weekdaysMinRegex)
+	}, yn.isPM = function(e) {
+		return 'p' === (e + '').toLowerCase().charAt(0)
+	}, yn.meridiem = function(e, t, n) {
+		return 11 < e ? n ? 'pm' : 'PM' : n ? 'am' : 'AM'
+	}, ut('en', {
+		dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/,
+		ordinal: function(e) {
+			let t = e % 10;
+			return e + (1 === D(e % 100 / 10) ? 'th' : 1 === t ? 'st' : 2 === t ? 'nd' : 3 === t ?
+				'rd' : 'th')
+		}
+	}), c.lang = n('moment.lang is deprecated. Use moment.locale instead.', ut), c.langData = n(
+		'moment.langData is deprecated. Use moment.localeData instead.', ht);
+	let wn = Math.abs;
+
+	function Mn(e, t, n, s) {
+		let i = jt(t, n);
+		return e._milliseconds += s * i._milliseconds, e._days += s * i._days, e._months += s * i._months, e
+			._bubble()
+	}
+
+	function kn(e) {
+		return e < 0 ? Math.floor(e) : Math.ceil(e)
+	}
+
+	function Sn(e) {
+		return 4800 * e / 146097
+	}
+
+	function Dn(e) {
+		return 146097 * e / 4800
+	}
+
+	function Yn(e) {
+		return function() {
+			return this.as(e)
+		}
+	}
+	let On = Yn('ms'),
+		Tn = Yn('s'),
+		bn = Yn('m'),
+		xn = Yn('h'),
+		Pn = Yn('d'),
+		Wn = Yn('w'),
+		Cn = Yn('M'),
+		Hn = Yn('Q'),
+		Rn = Yn('y');
+
+	function Un(e) {
+		return function() {
+			return this.isValid() ? this._data[e] : NaN
+		}
+	}
+	let Fn = Un('milliseconds'),
+		Ln = Un('seconds'),
+		Nn = Un('minutes'),
+		Gn = Un('hours'),
+		Vn = Un('days'),
+		En = Un('months'),
+		In = Un('years');
+	let An = Math.round,
+		jn = {
+			ss: 44,
+			s: 45,
+			m: 45,
+			h: 22,
+			d: 26,
+			M: 11
+		};
+	let Zn = Math.abs;
+
+	function zn(e) {
+		return (0 < e) - (e < 0) || +e
+	}
+
+	function $n() {
+		if (!this.isValid()) return this.localeData().invalidDate();
+		let e, t, n = Zn(this._milliseconds) / 1e3,
+			s = Zn(this._days),
+			i = Zn(this._months);
+		t = S((e = S(n / 60)) / 60), n %= 60, e %= 60;
+		let r = S(i / 12),
+			a = i %= 12,
+			o = s,
+			u = t,
+			l = e,
+			h = n ? n.toFixed(3).replace(/\.?0+$/, '') : '',
+			d = this.asSeconds();
+		if (!d) return 'P0D';
+		let c = d < 0 ? '-' : '',
+			f = zn(this._months) !== zn(d) ? '-' : '',
+			m = zn(this._days) !== zn(d) ? '-' : '',
+			_ = zn(this._milliseconds) !== zn(d) ? '-' : '';
+		return c + 'P' + (r ? f + r + 'Y' : '') + (a ? f + a + 'M' : '') + (o ? m + o + 'D' : '') + (u || l || h ?
+			'T' : '') + (u ? _ + u + 'H' : '') + (l ? _ + l + 'M' : '') + (h ? _ + h + 'S' : '')
+	}
+	let qn = Ht.prototype;
+	return qn.isValid = function() {
+			return this._isValid
+		}, qn.abs = function() {
+			let e = this._data;
+			return this._milliseconds = wn(this._milliseconds), this._days = wn(this._days), this._months = wn(this
+				._months), e.milliseconds = wn(e.milliseconds), e.seconds = wn(e.seconds), e.minutes = wn(e
+				.minutes), e.hours = wn(e.hours), e.months = wn(e.months), e.years = wn(e.years), this
+		}, qn.add = function(e, t) {
+			return Mn(this, e, t, 1)
+		}, qn.subtract = function(e, t) {
+			return Mn(this, e, t, -1)
+		}, qn.as = function(e) {
+			if (!this.isValid()) return NaN;
+			let t, n, s = this._milliseconds;
+			if ('month' === (e = H(e)) || 'quarter' === e || 'year' === e) switch (t = this._days + s / 864e5, n =
+				this._months + Sn(t), e) {
+				case 'month':
+					return n;
+				case 'quarter':
+					return n / 3;
+				case 'year':
+					return n / 12
+			} else switch (t = this._days + Math.round(Dn(this._months)), e) {
+				case 'week':
+					return t / 7 + s / 6048e5;
+				case 'day':
+					return t + s / 864e5;
+				case 'hour':
+					return 24 * t + s / 36e5;
+				case 'minute':
+					return 1440 * t + s / 6e4;
+				case 'second':
+					return 86400 * t + s / 1e3;
+				case 'millisecond':
+					return Math.floor(864e5 * t) + s;
+				default:
+					throw new Error('Unknown unit ' + e)
+			}
+		}, qn.asMilliseconds = On, qn.asSeconds = Tn, qn.asMinutes = bn, qn.asHours = xn, qn.asDays = Pn, qn
+		.asWeeks = Wn, qn.asMonths = Cn, qn.asQuarters = Hn, qn.asYears = Rn, qn.valueOf = function() {
+			return this.isValid() ? this._milliseconds + 864e5 * this._days + this._months % 12 * 2592e6 + 31536e6 *
+				D(this._months / 12) : NaN
+		}, qn._bubble = function() {
+			let e, t, n, s, i, r = this._milliseconds,
+				a = this._days,
+				o = this._months,
+				u = this._data;
+			return 0 <= r && 0 <= a && 0 <= o || r <= 0 && a <= 0 && o <= 0 || (r += 864e5 * kn(Dn(o) + a), o = a =
+					0), u.milliseconds = r % 1e3, e = S(r / 1e3), u.seconds = e % 60, t = S(e / 60), u.minutes = t %
+				60, n = S(t / 60), u.hours = n % 24, o += i = S(Sn(a += S(n / 24))), a -= kn(Dn(i)), s = S(o / 12),
+				o %= 12, u.days = a, u.months = o, u.years = s, this
+		}, qn.clone = function() {
+			return jt(this)
+		}, qn.get = function(e) {
+			return e = H(e), this.isValid() ? this[e + 's']() : NaN
+		}, qn.milliseconds = Fn, qn.seconds = Ln, qn.minutes = Nn, qn.hours = Gn, qn.days = Vn, qn.weeks =
+		function() {
+			return S(this.days() / 7)
+		}, qn.months = En, qn.years = In, qn.humanize = function(e) {
+			if (!this.isValid()) return this.localeData().invalidDate();
+			let t, n, s, i, r, a, o, u, l, h, d, c = this.localeData(),
+				f = (n = !e, s = c, i = jt(t = this).abs(), r = An(i.as('s')), a = An(i.as('m')), o = An(i.as('h')),
+					u = An(i.as('d')), l = An(i.as('M')), h = An(i.as('y')), (d = r <= jn.ss && ['s', r] || r < jn
+						.s && ['ss', r] || a <= 1 && ['m'] || a < jn.m && ['mm', a] || o <= 1 && ['h'] || o < jn
+						.h && ['hh', o] || u <= 1 && ['d'] || u < jn.d && ['dd', u] || l <= 1 && ['M'] || l < jn
+						.M && ['MM', l] || h <= 1 && ['y'] || ['yy', h])[2] = n, d[3] = 0 < +t, d[4] = s,
+					function(e, t, n, s, i) {
+						return i.relativeTime(t || 1, !!n, e, s)
+					}.apply(null, d));
+			return e && (f = c.pastFuture(+this, f)), c.postformat(f)
+		}, qn.toISOString = $n, qn.toString = $n, qn.toJSON = $n, qn.locale = Xt, qn.localeData = en, qn
+		.toIsoString = n('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', $n),
+		qn.lang = Kt, I('X', 0, 0, 'unix'), I('x', 0, 0, 'valueOf'), ue('x', se), ue('X', /[+-]?\d+(\.\d{1,3})?/),
+		ce('X', function(e, t, n) {
+			n._d = new Date(1e3 * parseFloat(e, 10))
+		}), ce('x', function(e, t, n) {
+			n._d = new Date(D(e))
+		}), c.version = '2.24.0', e = bt, c.fn = mn, c.min = function() {
+			return Wt('isBefore', [].slice.call(arguments, 0))
+		}, c.max = function() {
+			return Wt('isAfter', [].slice.call(arguments, 0))
+		}, c.now = function() {
+			return Date.now ? Date.now() : +new Date
+		}, c.utc = y, c.unix = function(e) {
+			return bt(1e3 * e)
+		}, c.months = function(e, t) {
+			return vn(e, t, 'months')
+		}, c.isDate = d, c.locale = ut, c.invalid = p, c.duration = jt, c.isMoment = k, c.weekdays = function(e, t,
+			n) {
+			return pn(e, t, n, 'weekdays')
+		}, c.parseZone = function() {
+			return bt.apply(null, arguments).parseZone()
+		}, c.localeData = ht, c.isDuration = Rt, c.monthsShort = function(e, t) {
+			return vn(e, t, 'monthsShort')
+		}, c.weekdaysMin = function(e, t, n) {
+			return pn(e, t, n, 'weekdaysMin')
+		}, c.defineLocale = lt, c.updateLocale = function(e, t) {
+			if (null != t) {
+				let n, s, i = st;
+				null != (s = ot(e)) && (i = s._config), (n = new P(t = x(i, t))).parentLocale = it[e], it[e] = n,
+					ut(e)
+			} else null != it[e] && (null != it[e].parentLocale ? it[e] = it[e].parentLocale : null != it[e] &&
+				delete it[e]);
+			return it[e]
+		}, c.locales = function() {
+			return s(it)
+		}, c.weekdaysShort = function(e, t, n) {
+			return pn(e, t, n, 'weekdaysShort')
+		}, c.normalizeUnits = H, c.relativeTimeRounding = function(e) {
+			return void 0 === e ? An : 'function' === typeof e && (An = e, !0)
+		}, c.relativeTimeThreshold = function(e, t) {
+			return void 0 !== jn[e] && (void 0 === t ? jn[e] : (jn[e] = t, 's' === e && (jn.ss = t - 1), !0))
+		}, c.calendarFormat = function(e, t) {
+			let n = e.diff(t, 'days', !0);
+			return n < -6 ? 'sameElse' : n < -1 ? 'lastWeek' : n < 0 ? 'lastDay' : n < 1 ? 'sameDay' : n < 2 ?
+				'nextDay' : n < 7 ? 'nextWeek' : 'sameElse'
+		}, c.prototype = mn, c.HTML5_FMT = {
+			DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',
+			DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',
+			DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',
+			DATE: 'YYYY-MM-DD',
+			TIME: 'HH:mm',
+			TIME_SECONDS: 'HH:mm:ss',
+			TIME_MS: 'HH:mm:ss.SSS',
+			WEEK: 'GGGG-[W]WW',
+			MONTH: 'YYYY-MM'
+		}, c
+});
diff --git a/common/spark-md5.js b/common/spark-md5.js
new file mode 100644
index 0000000..d2bdbbb
--- /dev/null
+++ b/common/spark-md5.js
@@ -0,0 +1,751 @@
+(function (factory) {
+    if (typeof exports === 'object') {
+        // Node/CommonJS
+        module.exports = factory();
+    } else if (typeof define === 'function' && define.amd) {
+        // AMD
+        define(factory);
+    } else {
+        // Browser globals (with support for web workers)
+        var glob;
+
+        try {
+            glob = window;
+        } catch (e) {
+            glob = self;
+        }
+
+        glob.SparkMD5 = factory();
+    }
+}(function (undefined) {
+
+    'use strict';
+
+    /*
+     * Fastest md5 implementation around (JKM md5).
+     * Credits: Joseph Myers
+     *
+     * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
+     * @see http://jsperf.com/md5-shootout/7
+     */
+
+    /* this function is much faster,
+      so if possible we use it. Some IEs
+      are the only ones I know of that
+      need the idiotic second function,
+      generated by an if clause.  */
+    var add32 = function (a, b) {
+        return (a + b) & 0xFFFFFFFF;
+    },
+        hex_chr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
+
+
+    function cmn(q, a, b, x, s, t) {
+        a = add32(add32(a, q), add32(x, t));
+        return add32((a << s) | (a >>> (32 - s)), b);
+    }
+
+    function md5cycle(x, k) {
+        var a = x[0],
+            b = x[1],
+            c = x[2],
+            d = x[3];
+
+        a += (b & c | ~b & d) + k[0] - 680876936 | 0;
+        a  = (a << 7 | a >>> 25) + b | 0;
+        d += (a & b | ~a & c) + k[1] - 389564586 | 0;
+        d  = (d << 12 | d >>> 20) + a | 0;
+        c += (d & a | ~d & b) + k[2] + 606105819 | 0;
+        c  = (c << 17 | c >>> 15) + d | 0;
+        b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
+        b  = (b << 22 | b >>> 10) + c | 0;
+        a += (b & c | ~b & d) + k[4] - 176418897 | 0;
+        a  = (a << 7 | a >>> 25) + b | 0;
+        d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
+        d  = (d << 12 | d >>> 20) + a | 0;
+        c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
+        c  = (c << 17 | c >>> 15) + d | 0;
+        b += (c & d | ~c & a) + k[7] - 45705983 | 0;
+        b  = (b << 22 | b >>> 10) + c | 0;
+        a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
+        a  = (a << 7 | a >>> 25) + b | 0;
+        d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
+        d  = (d << 12 | d >>> 20) + a | 0;
+        c += (d & a | ~d & b) + k[10] - 42063 | 0;
+        c  = (c << 17 | c >>> 15) + d | 0;
+        b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
+        b  = (b << 22 | b >>> 10) + c | 0;
+        a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
+        a  = (a << 7 | a >>> 25) + b | 0;
+        d += (a & b | ~a & c) + k[13] - 40341101 | 0;
+        d  = (d << 12 | d >>> 20) + a | 0;
+        c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
+        c  = (c << 17 | c >>> 15) + d | 0;
+        b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
+        b  = (b << 22 | b >>> 10) + c | 0;
+
+        a += (b & d | c & ~d) + k[1] - 165796510 | 0;
+        a  = (a << 5 | a >>> 27) + b | 0;
+        d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
+        d  = (d << 9 | d >>> 23) + a | 0;
+        c += (d & b | a & ~b) + k[11] + 643717713 | 0;
+        c  = (c << 14 | c >>> 18) + d | 0;
+        b += (c & a | d & ~a) + k[0] - 373897302 | 0;
+        b  = (b << 20 | b >>> 12) + c | 0;
+        a += (b & d | c & ~d) + k[5] - 701558691 | 0;
+        a  = (a << 5 | a >>> 27) + b | 0;
+        d += (a & c | b & ~c) + k[10] + 38016083 | 0;
+        d  = (d << 9 | d >>> 23) + a | 0;
+        c += (d & b | a & ~b) + k[15] - 660478335 | 0;
+        c  = (c << 14 | c >>> 18) + d | 0;
+        b += (c & a | d & ~a) + k[4] - 405537848 | 0;
+        b  = (b << 20 | b >>> 12) + c | 0;
+        a += (b & d | c & ~d) + k[9] + 568446438 | 0;
+        a  = (a << 5 | a >>> 27) + b | 0;
+        d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
+        d  = (d << 9 | d >>> 23) + a | 0;
+        c += (d & b | a & ~b) + k[3] - 187363961 | 0;
+        c  = (c << 14 | c >>> 18) + d | 0;
+        b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
+        b  = (b << 20 | b >>> 12) + c | 0;
+        a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
+        a  = (a << 5 | a >>> 27) + b | 0;
+        d += (a & c | b & ~c) + k[2] - 51403784 | 0;
+        d  = (d << 9 | d >>> 23) + a | 0;
+        c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
+        c  = (c << 14 | c >>> 18) + d | 0;
+        b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
+        b  = (b << 20 | b >>> 12) + c | 0;
+
+        a += (b ^ c ^ d) + k[5] - 378558 | 0;
+        a  = (a << 4 | a >>> 28) + b | 0;
+        d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
+        d  = (d << 11 | d >>> 21) + a | 0;
+        c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
+        c  = (c << 16 | c >>> 16) + d | 0;
+        b += (c ^ d ^ a) + k[14] - 35309556 | 0;
+        b  = (b << 23 | b >>> 9) + c | 0;
+        a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
+        a  = (a << 4 | a >>> 28) + b | 0;
+        d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
+        d  = (d << 11 | d >>> 21) + a | 0;
+        c += (d ^ a ^ b) + k[7] - 155497632 | 0;
+        c  = (c << 16 | c >>> 16) + d | 0;
+        b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
+        b  = (b << 23 | b >>> 9) + c | 0;
+        a += (b ^ c ^ d) + k[13] + 681279174 | 0;
+        a  = (a << 4 | a >>> 28) + b | 0;
+        d += (a ^ b ^ c) + k[0] - 358537222 | 0;
+        d  = (d << 11 | d >>> 21) + a | 0;
+        c += (d ^ a ^ b) + k[3] - 722521979 | 0;
+        c  = (c << 16 | c >>> 16) + d | 0;
+        b += (c ^ d ^ a) + k[6] + 76029189 | 0;
+        b  = (b << 23 | b >>> 9) + c | 0;
+        a += (b ^ c ^ d) + k[9] - 640364487 | 0;
+        a  = (a << 4 | a >>> 28) + b | 0;
+        d += (a ^ b ^ c) + k[12] - 421815835 | 0;
+        d  = (d << 11 | d >>> 21) + a | 0;
+        c += (d ^ a ^ b) + k[15] + 530742520 | 0;
+        c  = (c << 16 | c >>> 16) + d | 0;
+        b += (c ^ d ^ a) + k[2] - 995338651 | 0;
+        b  = (b << 23 | b >>> 9) + c | 0;
+
+        a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
+        a  = (a << 6 | a >>> 26) + b | 0;
+        d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
+        d  = (d << 10 | d >>> 22) + a | 0;
+        c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
+        c  = (c << 15 | c >>> 17) + d | 0;
+        b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
+        b  = (b << 21 |b >>> 11) + c | 0;
+        a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
+        a  = (a << 6 | a >>> 26) + b | 0;
+        d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
+        d  = (d << 10 | d >>> 22) + a | 0;
+        c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
+        c  = (c << 15 | c >>> 17) + d | 0;
+        b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
+        b  = (b << 21 |b >>> 11) + c | 0;
+        a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
+        a  = (a << 6 | a >>> 26) + b | 0;
+        d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
+        d  = (d << 10 | d >>> 22) + a | 0;
+        c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
+        c  = (c << 15 | c >>> 17) + d | 0;
+        b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
+        b  = (b << 21 |b >>> 11) + c | 0;
+        a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
+        a  = (a << 6 | a >>> 26) + b | 0;
+        d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
+        d  = (d << 10 | d >>> 22) + a | 0;
+        c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
+        c  = (c << 15 | c >>> 17) + d | 0;
+        b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
+        b  = (b << 21 | b >>> 11) + c | 0;
+
+        x[0] = a + x[0] | 0;
+        x[1] = b + x[1] | 0;
+        x[2] = c + x[2] | 0;
+        x[3] = d + x[3] | 0;
+    }
+
+    function md5blk(s) {
+        var md5blks = [],
+            i; /* Andy King said do it this way. */
+
+        for (i = 0; i < 64; i += 4) {
+            md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
+        }
+        return md5blks;
+    }
+
+    function md5blk_array(a) {
+        var md5blks = [],
+            i; /* Andy King said do it this way. */
+
+        for (i = 0; i < 64; i += 4) {
+            md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
+        }
+        return md5blks;
+    }
+
+    function md51(s) {
+        var n = s.length,
+            state = [1732584193, -271733879, -1732584194, 271733878],
+            i,
+            length,
+            tail,
+            tmp,
+            lo,
+            hi;
+
+        for (i = 64; i <= n; i += 64) {
+            md5cycle(state, md5blk(s.substring(i - 64, i)));
+        }
+        s = s.substring(i - 64);
+        length = s.length;
+        tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+        for (i = 0; i < length; i += 1) {
+            tail[i >> 2] |= s.charCodeAt(i) << ((i % 4) << 3);
+        }
+        tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+        if (i > 55) {
+            md5cycle(state, tail);
+            for (i = 0; i < 16; i += 1) {
+                tail[i] = 0;
+            }
+        }
+
+        // Beware that the final length might not fit in 32 bits so we take care of that
+        tmp = n * 8;
+        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+        lo = parseInt(tmp[2], 16);
+        hi = parseInt(tmp[1], 16) || 0;
+
+        tail[14] = lo;
+        tail[15] = hi;
+
+        md5cycle(state, tail);
+        return state;
+    }
+
+    function md51_array(a) {
+        var n = a.length,
+            state = [1732584193, -271733879, -1732584194, 271733878],
+            i,
+            length,
+            tail,
+            tmp,
+            lo,
+            hi;
+
+        for (i = 64; i <= n; i += 64) {
+            md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
+        }
+
+        // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
+        // containing the last element of the parent array if the sub array specified starts
+        // beyond the length of the parent array - weird.
+        // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
+        a = (i - 64) < n ? a.subarray(i - 64) : new Uint8Array(0);
+
+        length = a.length;
+        tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+        for (i = 0; i < length; i += 1) {
+            tail[i >> 2] |= a[i] << ((i % 4) << 3);
+        }
+
+        tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+        if (i > 55) {
+            md5cycle(state, tail);
+            for (i = 0; i < 16; i += 1) {
+                tail[i] = 0;
+            }
+        }
+
+        // Beware that the final length might not fit in 32 bits so we take care of that
+        tmp = n * 8;
+        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+        lo = parseInt(tmp[2], 16);
+        hi = parseInt(tmp[1], 16) || 0;
+
+        tail[14] = lo;
+        tail[15] = hi;
+
+        md5cycle(state, tail);
+
+        return state;
+    }
+
+    function rhex(n) {
+        var s = '',
+            j;
+        for (j = 0; j < 4; j += 1) {
+            s += hex_chr[(n >> (j * 8 + 4)) & 0x0F] + hex_chr[(n >> (j * 8)) & 0x0F];
+        }
+        return s;
+    }
+
+    function hex(x) {
+        var i;
+        for (i = 0; i < x.length; i += 1) {
+            x[i] = rhex(x[i]);
+        }
+        return x.join('');
+    }
+
+    // In some cases the fast add32 function cannot be used..
+    if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {
+        add32 = function (x, y) {
+            var lsw = (x & 0xFFFF) + (y & 0xFFFF),
+                msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+            return (msw << 16) | (lsw & 0xFFFF);
+        };
+    }
+
+    // ---------------------------------------------------
+
+    /**
+     * ArrayBuffer slice polyfill.
+     *
+     * @see https://github.com/ttaubert/node-arraybuffer-slice
+     */
+
+    if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
+        (function () {
+            function clamp(val, length) {
+                val = (val | 0) || 0;
+
+                if (val < 0) {
+                    return Math.max(val + length, 0);
+                }
+
+                return Math.min(val, length);
+            }
+
+            ArrayBuffer.prototype.slice = function (from, to) {
+                var length = this.byteLength,
+                    begin = clamp(from, length),
+                    end = length,
+                    num,
+                    target,
+                    targetArray,
+                    sourceArray;
+
+                if (to !== undefined) {
+                    end = clamp(to, length);
+                }
+
+                if (begin > end) {
+                    return new ArrayBuffer(0);
+                }
+
+                num = end - begin;
+                target = new ArrayBuffer(num);
+                targetArray = new Uint8Array(target);
+
+                sourceArray = new Uint8Array(this, begin, num);
+                targetArray.set(sourceArray);
+
+                return target;
+            };
+        })();
+    }
+
+    // ---------------------------------------------------
+
+    /**
+     * Helpers.
+     */
+
+    function toUtf8(str) {
+        if (/[\u0080-\uFFFF]/.test(str)) {
+            str = unescape(encodeURIComponent(str));
+        }
+
+        return str;
+    }
+
+    function utf8Str2ArrayBuffer(str, returnUInt8Array) {
+        var length = str.length,
+           buff = new ArrayBuffer(length),
+           arr = new Uint8Array(buff),
+           i;
+
+        for (i = 0; i < length; i += 1) {
+            arr[i] = str.charCodeAt(i);
+        }
+
+        return returnUInt8Array ? arr : buff;
+    }
+
+    function arrayBuffer2Utf8Str(buff) {
+        return String.fromCharCode.apply(null, new Uint8Array(buff));
+    }
+
+    function concatenateArrayBuffers(first, second, returnUInt8Array) {
+        var result = new Uint8Array(first.byteLength + second.byteLength);
+
+        result.set(new Uint8Array(first));
+        result.set(new Uint8Array(second), first.byteLength);
+
+        return returnUInt8Array ? result : result.buffer;
+    }
+
+    function hexToBinaryString(hex) {
+        var bytes = [],
+            length = hex.length,
+            x;
+
+        for (x = 0; x < length - 1; x += 2) {
+            bytes.push(parseInt(hex.substr(x, 2), 16));
+        }
+
+        return String.fromCharCode.apply(String, bytes);
+    }
+
+    // ---------------------------------------------------
+
+    /**
+     * SparkMD5 OOP implementation.
+     *
+     * Use this class to perform an incremental md5, otherwise use the
+     * static methods instead.
+     */
+
+    function SparkMD5() {
+        // call reset to init the instance
+        this.reset();
+    }
+
+    /**
+     * Appends a string.
+     * A conversion will be applied if an utf8 string is detected.
+     *
+     * @param {String} str The string to be appended
+     *
+     * @return {SparkMD5} The instance itself
+     */
+    SparkMD5.prototype.append = function (str) {
+        // Converts the string to utf8 bytes if necessary
+        // Then append as binary
+        this.appendBinary(toUtf8(str));
+
+        return this;
+    };
+
+    /**
+     * Appends a binary string.
+     *
+     * @param {String} contents The binary string to be appended
+     *
+     * @return {SparkMD5} The instance itself
+     */
+    SparkMD5.prototype.appendBinary = function (contents) {
+        this._buff += contents;
+        this._length += contents.length;
+
+        var length = this._buff.length,
+            i;
+
+        for (i = 64; i <= length; i += 64) {
+            md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
+        }
+
+        this._buff = this._buff.substring(i - 64);
+
+        return this;
+    };
+
+    /**
+     * Finishes the incremental computation, reseting the internal state and
+     * returning the result.
+     *
+     * @param {Boolean} raw True to get the raw string, false to get the hex string
+     *
+     * @return {String} The result
+     */
+    SparkMD5.prototype.end = function (raw) {
+        var buff = this._buff,
+            length = buff.length,
+            i,
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+            ret;
+
+        for (i = 0; i < length; i += 1) {
+            tail[i >> 2] |= buff.charCodeAt(i) << ((i % 4) << 3);
+        }
+
+        this._finish(tail, length);
+        ret = hex(this._hash);
+
+        if (raw) {
+            ret = hexToBinaryString(ret);
+        }
+
+        this.reset();
+
+        return ret;
+    };
+
+    /**
+     * Resets the internal state of the computation.
+     *
+     * @return {SparkMD5} The instance itself
+     */
+    SparkMD5.prototype.reset = function () {
+        this._buff = '';
+        this._length = 0;
+        this._hash = [1732584193, -271733879, -1732584194, 271733878];
+
+        return this;
+    };
+
+    /**
+     * Gets the internal state of the computation.
+     *
+     * @return {Object} The state
+     */
+    SparkMD5.prototype.getState = function () {
+        return {
+            buff: this._buff,
+            length: this._length,
+            hash: this._hash.slice()
+        };
+    };
+
+    /**
+     * Gets the internal state of the computation.
+     *
+     * @param {Object} state The state
+     *
+     * @return {SparkMD5} The instance itself
+     */
+    SparkMD5.prototype.setState = function (state) {
+        this._buff = state.buff;
+        this._length = state.length;
+        this._hash = state.hash;
+
+        return this;
+    };
+
+    /**
+     * Releases memory used by the incremental buffer and other additional
+     * resources. If you plan to use the instance again, use reset instead.
+     */
+    SparkMD5.prototype.destroy = function () {
+        delete this._hash;
+        delete this._buff;
+        delete this._length;
+    };
+
+    /**
+     * Finish the final calculation based on the tail.
+     *
+     * @param {Array}  tail   The tail (will be modified)
+     * @param {Number} length The length of the remaining buffer
+     */
+    SparkMD5.prototype._finish = function (tail, length) {
+        var i = length,
+            tmp,
+            lo,
+            hi;
+
+        tail[i >> 2] |= 0x80 << ((i % 4) << 3);
+        if (i > 55) {
+            md5cycle(this._hash, tail);
+            for (i = 0; i < 16; i += 1) {
+                tail[i] = 0;
+            }
+        }
+
+        // Do the final computation based on the tail and length
+        // Beware that the final length may not fit in 32 bits so we take care of that
+        tmp = this._length * 8;
+        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
+        lo = parseInt(tmp[2], 16);
+        hi = parseInt(tmp[1], 16) || 0;
+
+        tail[14] = lo;
+        tail[15] = hi;
+        md5cycle(this._hash, tail);
+    };
+
+    /**
+     * Performs the md5 hash on a string.
+     * A conversion will be applied if utf8 string is detected.
+     *
+     * @param {String}  str The string
+     * @param {Boolean} [raw] True to get the raw string, false to get the hex string
+     *
+     * @return {String} The result
+     */
+    SparkMD5.hash = function (str, raw) {
+        // Converts the string to utf8 bytes if necessary
+        // Then compute it using the binary function
+        return SparkMD5.hashBinary(toUtf8(str), raw);
+    };
+
+    /**
+     * Performs the md5 hash on a binary string.
+     *
+     * @param {String}  content The binary string
+     * @param {Boolean} [raw]     True to get the raw string, false to get the hex string
+     *
+     * @return {String} The result
+     */
+    SparkMD5.hashBinary = function (content, raw) {
+        var hash = md51(content),
+            ret = hex(hash);
+
+        return raw ? hexToBinaryString(ret) : ret;
+    };
+
+    // ---------------------------------------------------
+
+    /**
+     * SparkMD5 OOP implementation for array buffers.
+     *
+     * Use this class to perform an incremental md5 ONLY for array buffers.
+     */
+    SparkMD5.ArrayBuffer = function () {
+        // call reset to init the instance
+        this.reset();
+    };
+
+    /**
+     * Appends an array buffer.
+     *
+     * @param {ArrayBuffer} arr The array to be appended
+     *
+     * @return {SparkMD5.ArrayBuffer} The instance itself
+     */
+    SparkMD5.ArrayBuffer.prototype.append = function (arr) {
+        var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),
+            length = buff.length,
+            i;
+
+        this._length += arr.byteLength;
+
+        for (i = 64; i <= length; i += 64) {
+            md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
+        }
+
+        this._buff = (i - 64) < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
+
+        return this;
+    };
+
+    /**
+     * Finishes the incremental computation, reseting the internal state and
+     * returning the result.
+     *
+     * @param {Boolean} raw True to get the raw string, false to get the hex string
+     *
+     * @return {String} The result
+     */
+    SparkMD5.ArrayBuffer.prototype.end = function (raw) {
+        var buff = this._buff,
+            length = buff.length,
+            tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
+            i,
+            ret;
+
+        for (i = 0; i < length; i += 1) {
+            tail[i >> 2] |= buff[i] << ((i % 4) << 3);
+        }
+
+        this._finish(tail, length);
+        ret = hex(this._hash);
+
+        if (raw) {
+            ret = hexToBinaryString(ret);
+        }
+
+        this.reset();
+
+        return ret;
+    };
+
+    /**
+     * Resets the internal state of the computation.
+     *
+     * @return {SparkMD5.ArrayBuffer} The instance itself
+     */
+    SparkMD5.ArrayBuffer.prototype.reset = function () {
+        this._buff = new Uint8Array(0);
+        this._length = 0;
+        this._hash = [1732584193, -271733879, -1732584194, 271733878];
+
+        return this;
+    };
+
+    /**
+     * Gets the internal state of the computation.
+     *
+     * @return {Object} The state
+     */
+    SparkMD5.ArrayBuffer.prototype.getState = function () {
+        var state = SparkMD5.prototype.getState.call(this);
+
+        // Convert buffer to a string
+        state.buff = arrayBuffer2Utf8Str(state.buff);
+
+        return state;
+    };
+
+    /**
+     * Gets the internal state of the computation.
+     *
+     * @param {Object} state The state
+     *
+     * @return {SparkMD5.ArrayBuffer} The instance itself
+     */
+    SparkMD5.ArrayBuffer.prototype.setState = function (state) {
+        // Convert string to buffer
+        state.buff = utf8Str2ArrayBuffer(state.buff, true);
+
+        return SparkMD5.prototype.setState.call(this, state);
+    };
+
+    SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
+
+    SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
+
+    /**
+     * Performs the md5 hash on an array buffer.
+     *
+     * @param {ArrayBuffer} arr The array buffer
+     * @param {Boolean}     [raw] True to get the raw string, false to get the hex one
+     *
+     * @return {String} The result
+     */
+    SparkMD5.ArrayBuffer.hash = function (arr, raw) {
+        var hash = md51_array(new Uint8Array(arr)),
+            ret = hex(hash);
+
+        return raw ? hexToBinaryString(ret) : ret;
+    };
+
+    return SparkMD5;
+}));
diff --git a/common/vue-i18n.min.js b/common/vue-i18n.min.js
new file mode 100644
index 0000000..8d0a5c0
--- /dev/null
+++ b/common/vue-i18n.min.js
@@ -0,0 +1,6 @@
+/*!
+ * vue-i18n v8.20.0 
+ * (c) 2020 kazuya kawaguchi
+ * Released under the MIT License.
+ */
+var t,e;t=this,e=function(){"use strict";var t=["style","currency","currencyDisplay","useGrouping","minimumIntegerDigits","minimumFractionDigits","maximumFractionDigits","minimumSignificantDigits","maximumSignificantDigits","localeMatcher","formatMatcher","unit"];function e(t,e){"undefined"!=typeof console&&(console.warn("[vue-i18n] "+t),e&&console.warn(e.stack))}var n=Array.isArray;function r(t){return null!==t&&"object"==typeof t}function a(t){return"string"==typeof t}var i=Object.prototype.toString,o="[object Object]";function s(t){return i.call(t)===o}function l(t){return null==t}function c(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var n=null,a=null;return 1===t.length?r(t[0])||Array.isArray(t[0])?a=t[0]:"string"==typeof t[0]&&(n=t[0]):2===t.length&&("string"==typeof t[0]&&(n=t[0]),(r(t[1])||Array.isArray(t[1]))&&(a=t[1])),{locale:n,params:a}}function u(t){return JSON.parse(JSON.stringify(t))}function h(t,e){return!!~t.indexOf(e)}var f=Object.prototype.hasOwnProperty;function p(t,e){return f.call(t,e)}function m(t){for(var e=arguments,n=Object(t),a=1;a<arguments.length;a++){var i=e[a];if(null!=i){var o=void 0;for(o in i)p(i,o)&&(r(i[o])?n[o]=m(n[o],i[o]):n[o]=i[o])}}return n}function _(t,e){if(t===e)return!0;var n=r(t),a=r(e);if(!n||!a)return!n&&!a&&String(t)===String(e);try{var i=Array.isArray(t),o=Array.isArray(e);if(i&&o)return t.length===e.length&&t.every(function(t,n){return _(t,e[n])});if(i||o)return!1;var s=Object.keys(t),l=Object.keys(e);return s.length===l.length&&s.every(function(n){return _(t[n],e[n])})}catch(t){return!1}}var g={beforeCreate:function(){var t=this.$options;if(t.i18n=t.i18n||(t.__i18n?{}:null),t.i18n){if(t.i18n instanceof et){if(t.__i18n)try{var e={};t.__i18n.forEach(function(t){e=m(e,JSON.parse(t))}),Object.keys(e).forEach(function(n){t.i18n.mergeLocaleMessage(n,e[n])})}catch(t){}this._i18n=t.i18n,this._i18nWatcher=this._i18n.watchI18nData()}else if(s(t.i18n)){var n=this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof et?this.$root.$i18n:null;if(n&&(t.i18n.root=this.$root,t.i18n.formatter=n.formatter,t.i18n.fallbackLocale=n.fallbackLocale,t.i18n.formatFallbackMessages=n.formatFallbackMessages,t.i18n.silentTranslationWarn=n.silentTranslationWarn,t.i18n.silentFallbackWarn=n.silentFallbackWarn,t.i18n.pluralizationRules=n.pluralizationRules,t.i18n.preserveDirectiveContent=n.preserveDirectiveContent),t.__i18n)try{var r={};t.__i18n.forEach(function(t){r=m(r,JSON.parse(t))}),t.i18n.messages=r}catch(t){}var a=t.i18n.sharedMessages;a&&s(a)&&(t.i18n.messages=m(t.i18n.messages,a)),this._i18n=new et(t.i18n),this._i18nWatcher=this._i18n.watchI18nData(),(void 0===t.i18n.sync||t.i18n.sync)&&(this._localeWatcher=this.$i18n.watchLocale()),n&&n.onComponentInstanceCreated(this._i18n)}}else this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof et?this._i18n=this.$root.$i18n:t.parent&&t.parent.$i18n&&t.parent.$i18n instanceof et&&(this._i18n=t.parent.$i18n)},beforeMount:function(){var t=this.$options;t.i18n=t.i18n||(t.__i18n?{}:null),t.i18n?t.i18n instanceof et?(this._i18n.subscribeDataChanging(this),this._subscribing=!0):s(t.i18n)&&(this._i18n.subscribeDataChanging(this),this._subscribing=!0):this.$root&&this.$root.$i18n&&this.$root.$i18n instanceof et?(this._i18n.subscribeDataChanging(this),this._subscribing=!0):t.parent&&t.parent.$i18n&&t.parent.$i18n instanceof et&&(this._i18n.subscribeDataChanging(this),this._subscribing=!0)},beforeDestroy:function(){if(this._i18n){var t=this;this.$nextTick(function(){t._subscribing&&(t._i18n.unsubscribeDataChanging(t),delete t._subscribing),t._i18nWatcher&&(t._i18nWatcher(),t._i18n.destroyVM(),delete t._i18nWatcher),t._localeWatcher&&(t._localeWatcher(),delete t._localeWatcher)})}}},v={name:"i18n",functional:!0,props:{tag:{type:[String,Boolean,Object],default:"span"},path:{type:String,required:!0},locale:{type:String},places:{type:[Array,Object]}},render:function(t,e){var n=e.data,r=e.parent,a=e.props,i=e.slots,o=r.$i18n;if(o){var s=a.path,l=a.locale,c=a.places,u=i(),h=o.i(s,l,function(t){var e;for(e in t)if("default"!==e)return!1;return Boolean(e)}(u)||c?function(t,e){var n=e?function(t){return Array.isArray(t)?t.reduce(d,{}):Object.assign({},t)}(e):{};if(!t)return n;var r=(t=t.filter(function(t){return t.tag||""!==t.text.trim()})).every(y);return t.reduce(r?b:d,n)}(u.default,c):u),f=a.tag&&!0!==a.tag||!1===a.tag?a.tag:"span";return f?t(f,n,h):h}}};function b(t,e){return e.data&&e.data.attrs&&e.data.attrs.place&&(t[e.data.attrs.place]=e),t}function d(t,e,n){return t[n]=e,t}function y(t){return Boolean(t.data&&t.data.attrs&&t.data.attrs.place)}var F,k={name:"i18n-n",functional:!0,props:{tag:{type:[String,Boolean,Object],default:"span"},value:{type:Number,required:!0},format:{type:[String,Object]},locale:{type:String}},render:function(e,n){var i=n.props,o=n.parent,s=n.data,l=o.$i18n;if(!l)return null;var c=null,u=null;a(i.format)?c=i.format:r(i.format)&&(i.format.key&&(c=i.format.key),u=Object.keys(i.format).reduce(function(e,n){var r;return h(t,n)?Object.assign({},e,((r={})[n]=i.format[n],r)):e},null));var f=i.locale||l.locale,p=l._ntp(i.value,f,c,u),m=p.map(function(t,e){var n,r=s.scopedSlots&&s.scopedSlots[t.type];return r?r(((n={})[t.type]=t.value,n.index=e,n.parts=p,n)):t.value}),_=i.tag&&!0!==i.tag||!1===i.tag?i.tag:"span";return _?e(_,{attrs:s.attrs,class:s.class,staticClass:s.staticClass},m):m}};function w(t,e,n){C(t,n)&&T(t,e,n)}function $(t,e,n,r){if(C(t,n)){var a=n.context.$i18n;(function(t,e){var n=e.context;return t._locale===n.$i18n.locale})(t,n)&&_(e.value,e.oldValue)&&_(t._localeMessage,a.getLocaleMessage(a.locale))||T(t,e,n)}}function M(t,n,r,a){if(r.context){var i=r.context.$i18n||{};n.modifiers.preserve||i.preserveDirectiveContent||(t.textContent=""),t._vt=void 0,delete t._vt,t._locale=void 0,delete t._locale,t._localeMessage=void 0,delete t._localeMessage}else e("Vue instance does not exists in VNode context")}function C(t,n){var r=n.context;return r?!!r.$i18n||(e("VueI18n instance does not exists in Vue instance"),!1):(e("Vue instance does not exists in VNode context"),!1)}function T(t,n,r){var i,o,l=function(t){var e,n,r,i;a(t)?e=t:s(t)&&(e=t.path,n=t.locale,r=t.args,i=t.choice);return{path:e,locale:n,args:r,choice:i}}(n.value),c=l.path,u=l.locale,h=l.args,f=l.choice;if(c||u||h)if(c){var p=r.context;t._vt=t.textContent=null!=f?(i=p.$i18n).tc.apply(i,[c,f].concat(L(u,h))):(o=p.$i18n).t.apply(o,[c].concat(L(u,h))),t._locale=p.$i18n.locale,t._localeMessage=p.$i18n.getLocaleMessage(p.$i18n.locale)}else e("`path` is required in v-t directive");else e("value type not supported")}function L(t,e){var n=[];return t&&n.push(t),e&&(Array.isArray(e)||s(e))&&n.push(e),n}function I(t){I.installed=!0;(F=t).version&&Number(F.version.split(".")[0]);!function(t){t.prototype.hasOwnProperty("$i18n")||Object.defineProperty(t.prototype,"$i18n",{get:function(){return this._i18n}}),t.prototype.$t=function(t){for(var e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];var r=this.$i18n;return r._t.apply(r,[t,r.locale,r._getMessages(),this].concat(e))},t.prototype.$tc=function(t,e){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];var a=this.$i18n;return a._tc.apply(a,[t,a.locale,a._getMessages(),this,e].concat(n))},t.prototype.$te=function(t,e){var n=this.$i18n;return n._te(t,n.locale,n._getMessages(),e)},t.prototype.$d=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this.$i18n).d.apply(e,[t].concat(n))},t.prototype.$n=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this.$i18n).n.apply(e,[t].concat(n))}}(F),F.mixin(g),F.directive("t",{bind:w,update:$,unbind:M}),F.component(v.name,v),F.component(k.name,k),F.config.optionMergeStrategies.i18n=function(t,e){return void 0===e?t:e}}var D=function(){this._caches=Object.create(null)};D.prototype.interpolate=function(t,e){if(!e)return[t];var n=this._caches[t];return n||(n=function(t){var e=[],n=0,r="";for(;n<t.length;){var a=t[n++];if("{"===a){r&&e.push({type:"text",value:r}),r="";var i="";for(a=t[n++];void 0!==a&&"}"!==a;)i+=a,a=t[n++];var o="}"===a,s=O.test(i)?"list":o&&x.test(i)?"named":"unknown";e.push({value:i,type:s})}else"%"===a?"{"!==t[n]&&(r+=a):r+=a}return r&&e.push({type:"text",value:r}),e}(t),this._caches[t]=n),function(t,e){var n=[],a=0,i=Array.isArray(e)?"list":r(e)?"named":"unknown";if("unknown"===i)return n;for(;a<t.length;){var o=t[a];switch(o.type){case"text":n.push(o.value);break;case"list":n.push(e[parseInt(o.value,10)]);break;case"named":"named"===i&&n.push(e[o.value])}a++}return n}(n,e)};var O=/^(?:\d)+/,x=/^(?:\w)+/,W=0,j=1,N=2,A=3,S=0,R=4,H=5,P=6,V=7,E=8,z=[];z[S]={ws:[S],ident:[3,W],"[":[R],eof:[V]},z[1]={ws:[1],".":[2],"[":[R],eof:[V]},z[2]={ws:[2],ident:[3,W],0:[3,W],number:[3,W]},z[3]={ident:[3,W],0:[3,W],number:[3,W],ws:[1,j],".":[2,j],"[":[R,j],eof:[V,j]},z[R]={"'":[H,W],'"':[P,W],"[":[R,N],"]":[1,A],eof:E,else:[R,W]},z[H]={"'":[R,W],eof:E,else:[H,W]},z[P]={'"':[R,W],eof:E,else:[P,W]};var B=/^\s?(?:true|false|-?[\d.]+|'[^']*'|"[^"]*")\s?$/;function U(t){if(null==t)return"eof";switch(t.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return t;case 95:case 36:case 45:return"ident";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return"ident"}function J(t){var e,n,r,a=t.trim();return("0"!==t.charAt(0)||!isNaN(t))&&(r=a,B.test(r)?(n=(e=a).charCodeAt(0))!==e.charCodeAt(e.length-1)||34!==n&&39!==n?e:e.slice(1,-1):"*"+a)}var q=function(){this._cache=Object.create(null)};q.prototype.parsePath=function(t){var e=this._cache[t];return e||(e=function(t){var e,n,r,a,i,o,s,l=[],c=-1,u=S,h=0,f=[];function p(){var e=t[c+1];if(u===H&&"'"===e||u===P&&'"'===e)return c++,r="\\"+e,f[W](),!0}for(f[j]=function(){void 0!==n&&(l.push(n),n=void 0)},f[W]=function(){void 0===n?n=r:n+=r},f[N]=function(){f[W](),h++},f[A]=function(){if(h>0)h--,u=R,f[W]();else{if(h=0,void 0===n)return!1;if(!1===(n=J(n)))return!1;f[j]()}};null!==u;)if("\\"!==(e=t[++c])||!p()){if(a=U(e),(i=(s=z[u])[a]||s.else||E)===E)return;if(u=i[0],(o=f[i[1]])&&(r=void 0===(r=i[2])?e:r,!1===o()))return;if(u===V)return l}}(t))&&(this._cache[t]=e),e||[]},q.prototype.getPathValue=function(t,e){if(!r(t))return null;var n=this.parsePath(e);if(0===n.length)return null;for(var a=n.length,i=t,o=0;o<a;){var s=i[n[o]];if(void 0===s)return null;i=s,o++}return i};var G,X=/<\/?[\w\s="/.':;#-\/]+>/,Z=/(?:@(?:\.[a-z]+)?:(?:[\w\-_|.]+|\([\w\-_|.]+\)))/g,K=/^@(?:\.([a-z]+))?:/,Q=/[()]/g,Y={upper:function(t){return t.toLocaleUpperCase()},lower:function(t){return t.toLocaleLowerCase()},capitalize:function(t){return""+t.charAt(0).toLocaleUpperCase()+t.substr(1)}},tt=new D,et=function(t){var e=this;void 0===t&&(t={}),!F&&"undefined"!=typeof window&&window.Vue&&I(window.Vue);var n=t.locale||"en-US",r=!1!==t.fallbackLocale&&(t.fallbackLocale||"en-US"),a=t.messages||{},i=t.dateTimeFormats||{},o=t.numberFormats||{};this._vm=null,this._formatter=t.formatter||tt,this._modifiers=t.modifiers||{},this._missing=t.missing||null,this._root=t.root||null,this._sync=void 0===t.sync||!!t.sync,this._fallbackRoot=void 0===t.fallbackRoot||!!t.fallbackRoot,this._formatFallbackMessages=void 0!==t.formatFallbackMessages&&!!t.formatFallbackMessages,this._silentTranslationWarn=void 0!==t.silentTranslationWarn&&t.silentTranslationWarn,this._silentFallbackWarn=void 0!==t.silentFallbackWarn&&!!t.silentFallbackWarn,this._dateTimeFormatters={},this._numberFormatters={},this._path=new q,this._dataListeners=[],this._componentInstanceCreatedListener=t.componentInstanceCreatedListener||null,this._preserveDirectiveContent=void 0!==t.preserveDirectiveContent&&!!t.preserveDirectiveContent,this.pluralizationRules=t.pluralizationRules||{},this._warnHtmlInMessage=t.warnHtmlInMessage||"off",this._postTranslation=t.postTranslation||null,this.getChoiceIndex=function(t,n){var r=Object.getPrototypeOf(e);if(r&&r.getChoiceIndex)return r.getChoiceIndex.call(e,t,n);var a,i;return e.locale in e.pluralizationRules?e.pluralizationRules[e.locale].apply(e,[t,n]):(a=t,i=n,a=Math.abs(a),2===i?a?a>1?1:0:1:a?Math.min(a,2):0)},this._exist=function(t,n){return!(!t||!n)&&(!l(e._path.getPathValue(t,n))||!!t[n])},"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||Object.keys(a).forEach(function(t){e._checkLocaleMessage(t,e._warnHtmlInMessage,a[t])}),this._initVM({locale:n,fallbackLocale:r,messages:a,dateTimeFormats:i,numberFormats:o})},nt={vm:{configurable:!0},messages:{configurable:!0},dateTimeFormats:{configurable:!0},numberFormats:{configurable:!0},availableLocales:{configurable:!0},locale:{configurable:!0},fallbackLocale:{configurable:!0},formatFallbackMessages:{configurable:!0},missing:{configurable:!0},formatter:{configurable:!0},silentTranslationWarn:{configurable:!0},silentFallbackWarn:{configurable:!0},preserveDirectiveContent:{configurable:!0},warnHtmlInMessage:{configurable:!0},postTranslation:{configurable:!0}};return et.prototype._checkLocaleMessage=function(t,n,r){var i=function(t,n,r,o){if(s(r))Object.keys(r).forEach(function(e){var a=r[e];s(a)?(o.push(e),o.push("."),i(t,n,a,o),o.pop(),o.pop()):(o.push(e),i(t,n,a,o),o.pop())});else if(Array.isArray(r))r.forEach(function(e,r){s(e)?(o.push("["+r+"]"),o.push("."),i(t,n,e,o),o.pop(),o.pop()):(o.push("["+r+"]"),i(t,n,e,o),o.pop())});else if(a(r)){if(X.test(r)){var l="Detected HTML in message '"+r+"' of keypath '"+o.join("")+"' at '"+n+"'. Consider component interpolation with '<i18n>' to avoid XSS. See https://bit.ly/2ZqJzkp";"warn"===t?e(l):"error"===t&&function(t,e){"undefined"!=typeof console&&(console.error("[vue-i18n] "+t),e&&console.error(e.stack))}(l)}}};i(n,t,r,[])},et.prototype._initVM=function(t){var e=F.config.silent;F.config.silent=!0,this._vm=new F({data:t}),F.config.silent=e},et.prototype.destroyVM=function(){this._vm.$destroy()},et.prototype.subscribeDataChanging=function(t){this._dataListeners.push(t)},et.prototype.unsubscribeDataChanging=function(t){!function(t,e){if(t.length){var n=t.indexOf(e);if(n>-1)t.splice(n,1)}}(this._dataListeners,t)},et.prototype.watchI18nData=function(){var t=this;return this._vm.$watch("$data",function(){for(var e=t._dataListeners.length;e--;)F.nextTick(function(){t._dataListeners[e]&&t._dataListeners[e].$forceUpdate()})},{deep:!0})},et.prototype.watchLocale=function(){if(!this._sync||!this._root)return null;var t=this._vm;return this._root.$i18n.vm.$watch("locale",function(e){t.$set(t,"locale",e),t.$forceUpdate()},{immediate:!0})},et.prototype.onComponentInstanceCreated=function(t){this._componentInstanceCreatedListener&&this._componentInstanceCreatedListener(t,this)},nt.vm.get=function(){return this._vm},nt.messages.get=function(){return u(this._getMessages())},nt.dateTimeFormats.get=function(){return u(this._getDateTimeFormats())},nt.numberFormats.get=function(){return u(this._getNumberFormats())},nt.availableLocales.get=function(){return Object.keys(this.messages).sort()},nt.locale.get=function(){return this._vm.locale},nt.locale.set=function(t){this._vm.$set(this._vm,"locale",t)},nt.fallbackLocale.get=function(){return this._vm.fallbackLocale},nt.fallbackLocale.set=function(t){this._localeChainCache={},this._vm.$set(this._vm,"fallbackLocale",t)},nt.formatFallbackMessages.get=function(){return this._formatFallbackMessages},nt.formatFallbackMessages.set=function(t){this._formatFallbackMessages=t},nt.missing.get=function(){return this._missing},nt.missing.set=function(t){this._missing=t},nt.formatter.get=function(){return this._formatter},nt.formatter.set=function(t){this._formatter=t},nt.silentTranslationWarn.get=function(){return this._silentTranslationWarn},nt.silentTranslationWarn.set=function(t){this._silentTranslationWarn=t},nt.silentFallbackWarn.get=function(){return this._silentFallbackWarn},nt.silentFallbackWarn.set=function(t){this._silentFallbackWarn=t},nt.preserveDirectiveContent.get=function(){return this._preserveDirectiveContent},nt.preserveDirectiveContent.set=function(t){this._preserveDirectiveContent=t},nt.warnHtmlInMessage.get=function(){return this._warnHtmlInMessage},nt.warnHtmlInMessage.set=function(t){var e=this,n=this._warnHtmlInMessage;if(this._warnHtmlInMessage=t,n!==t&&("warn"===t||"error"===t)){var r=this._getMessages();Object.keys(r).forEach(function(t){e._checkLocaleMessage(t,e._warnHtmlInMessage,r[t])})}},nt.postTranslation.get=function(){return this._postTranslation},nt.postTranslation.set=function(t){this._postTranslation=t},et.prototype._getMessages=function(){return this._vm.messages},et.prototype._getDateTimeFormats=function(){return this._vm.dateTimeFormats},et.prototype._getNumberFormats=function(){return this._vm.numberFormats},et.prototype._warnDefault=function(t,e,n,r,i,o){if(!l(n))return n;if(this._missing){var s=this._missing.apply(null,[t,e,r,i]);if(a(s))return s}if(this._formatFallbackMessages){var u=c.apply(void 0,i);return this._render(e,o,u.params,e)}return e},et.prototype._isFallbackRoot=function(t){return!t&&!l(this._root)&&this._fallbackRoot},et.prototype._isSilentFallbackWarn=function(t){return this._silentFallbackWarn instanceof RegExp?this._silentFallbackWarn.test(t):this._silentFallbackWarn},et.prototype._isSilentFallback=function(t,e){return this._isSilentFallbackWarn(e)&&(this._isFallbackRoot()||t!==this.fallbackLocale)},et.prototype._isSilentTranslationWarn=function(t){return this._silentTranslationWarn instanceof RegExp?this._silentTranslationWarn.test(t):this._silentTranslationWarn},et.prototype._interpolate=function(t,e,n,r,i,o,c){if(!e)return null;var u,h=this._path.getPathValue(e,n);if(Array.isArray(h)||s(h))return h;if(l(h)){if(!s(e))return null;if(!a(u=e[n]))return null}else{if(!a(h))return null;u=h}return(u.indexOf("@:")>=0||u.indexOf("@.")>=0)&&(u=this._link(t,e,u,r,"raw",o,c)),this._render(u,i,o,n)},et.prototype._link=function(t,e,n,r,a,i,o){var s=n,l=s.match(Z);for(var c in l)if(l.hasOwnProperty(c)){var u=l[c],f=u.match(K),p=f[0],m=f[1],_=u.replace(p,"").replace(Q,"");if(h(o,_))return s;o.push(_);var g=this._interpolate(t,e,_,r,"raw"===a?"string":a,"raw"===a?void 0:i,o);if(this._isFallbackRoot(g)){if(!this._root)throw Error("unexpected error");var v=this._root.$i18n;g=v._translate(v._getMessages(),v.locale,v.fallbackLocale,_,r,a,i)}g=this._warnDefault(t,_,g,r,Array.isArray(i)?i:[i],a),this._modifiers.hasOwnProperty(m)?g=this._modifiers[m](g):Y.hasOwnProperty(m)&&(g=Y[m](g)),o.pop(),s=g?s.replace(u,g):s}return s},et.prototype._render=function(t,e,n,r){var i=this._formatter.interpolate(t,n,r);return i||(i=tt.interpolate(t,n,r)),"string"!==e||a(i)?i:i.join("")},et.prototype._appendItemToChain=function(t,e,n){var r=!1;return h(t,e)||(r=!0,e&&(r="!"!==e[e.length-1],e=e.replace(/!/g,""),t.push(e),n&&n[e]&&(r=n[e]))),r},et.prototype._appendLocaleToChain=function(t,e,n){var r,a=e.split("-");do{var i=a.join("-");r=this._appendItemToChain(t,i,n),a.splice(-1,1)}while(a.length&&!0===r);return r},et.prototype._appendBlockToChain=function(t,e,n){for(var r=!0,i=0;i<e.length&&"boolean"==typeof r;i++){var o=e[i];a(o)&&(r=this._appendLocaleToChain(t,o,n))}return r},et.prototype._getLocaleChain=function(t,e){if(""===t)return[];this._localeChainCache||(this._localeChainCache={});var i=this._localeChainCache[t];if(!i){e||(e=this.fallbackLocale),i=[];for(var o,s=[t];n(s);)s=this._appendBlockToChain(i,s,e);(s=a(o=n(e)?e:r(e)?e.default?e.default:null:e)?[o]:o)&&this._appendBlockToChain(i,s,null),this._localeChainCache[t]=i}return i},et.prototype._translate=function(t,e,n,r,a,i,o){for(var s,c=this._getLocaleChain(e,n),u=0;u<c.length;u++){var h=c[u];if(!l(s=this._interpolate(h,t[h],r,a,i,o,[r])))return s}return null},et.prototype._t=function(t,e,n,r){for(var a,i=[],o=arguments.length-4;o-- >0;)i[o]=arguments[o+4];if(!t)return"";var s=c.apply(void 0,i),l=s.locale||e,u=this._translate(n,l,this.fallbackLocale,t,r,"string",s.params);if(this._isFallbackRoot(u)){if(!this._root)throw Error("unexpected error");return(a=this._root).$t.apply(a,[t].concat(i))}return u=this._warnDefault(l,t,u,r,i,"string"),this._postTranslation&&null!=u&&(u=this._postTranslation(u,t)),u},et.prototype.t=function(t){for(var e,n=[],r=arguments.length-1;r-- >0;)n[r]=arguments[r+1];return(e=this)._t.apply(e,[t,this.locale,this._getMessages(),null].concat(n))},et.prototype._i=function(t,e,n,r,a){var i=this._translate(n,e,this.fallbackLocale,t,r,"raw",a);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n.i(t,e,a)}return this._warnDefault(e,t,i,r,[a],"raw")},et.prototype.i=function(t,e,n){return t?(a(e)||(e=this.locale),this._i(t,e,this._getMessages(),null,n)):""},et.prototype._tc=function(t,e,n,r,a){for(var i,o=[],s=arguments.length-5;s-- >0;)o[s]=arguments[s+5];if(!t)return"";void 0===a&&(a=1);var l={count:a,n:a},u=c.apply(void 0,o);return u.params=Object.assign(l,u.params),o=null===u.locale?[u.params]:[u.locale,u.params],this.fetchChoice((i=this)._t.apply(i,[t,e,n,r].concat(o)),a)},et.prototype.fetchChoice=function(t,e){if(!t&&!a(t))return null;var n=t.split("|");return n[e=this.getChoiceIndex(e,n.length)]?n[e].trim():t},et.prototype.tc=function(t,e){for(var n,r=[],a=arguments.length-2;a-- >0;)r[a]=arguments[a+2];return(n=this)._tc.apply(n,[t,this.locale,this._getMessages(),null,e].concat(r))},et.prototype._te=function(t,e,n){for(var r=[],a=arguments.length-3;a-- >0;)r[a]=arguments[a+3];var i=c.apply(void 0,r).locale||e;return this._exist(n[i],t)},et.prototype.te=function(t,e){return this._te(t,this.locale,this._getMessages(),e)},et.prototype.getLocaleMessage=function(t){return u(this._vm.messages[t]||{})},et.prototype.setLocaleMessage=function(t,e){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(t,this._warnHtmlInMessage,e),this._vm.$set(this._vm.messages,t,e)},et.prototype.mergeLocaleMessage=function(t,e){"warn"!==this._warnHtmlInMessage&&"error"!==this._warnHtmlInMessage||this._checkLocaleMessage(t,this._warnHtmlInMessage,e),this._vm.$set(this._vm.messages,t,m({},this._vm.messages[t]||{},e))},et.prototype.getDateTimeFormat=function(t){return u(this._vm.dateTimeFormats[t]||{})},et.prototype.setDateTimeFormat=function(t,e){this._vm.$set(this._vm.dateTimeFormats,t,e),this._clearDateTimeFormat(t,e)},et.prototype.mergeDateTimeFormat=function(t,e){this._vm.$set(this._vm.dateTimeFormats,t,m(this._vm.dateTimeFormats[t]||{},e)),this._clearDateTimeFormat(t,e)},et.prototype._clearDateTimeFormat=function(t,e){for(var n in e){var r=t+"__"+n;this._dateTimeFormatters.hasOwnProperty(r)&&delete this._dateTimeFormatters[r]}},et.prototype._localizeDateTime=function(t,e,n,r,a){for(var i=e,o=r[i],s=this._getLocaleChain(e,n),c=0;c<s.length;c++){var u=s[c];if(i=u,!l(o=r[u])&&!l(o[a]))break}if(l(o)||l(o[a]))return null;var h=o[a],f=i+"__"+a,p=this._dateTimeFormatters[f];return p||(p=this._dateTimeFormatters[f]=new Intl.DateTimeFormat(i,h)),p.format(t)},et.prototype._d=function(t,e,n){if(!n)return new Intl.DateTimeFormat(e).format(t);var r=this._localizeDateTime(t,e,this.fallbackLocale,this._getDateTimeFormats(),n);if(this._isFallbackRoot(r)){if(!this._root)throw Error("unexpected error");return this._root.$i18n.d(t,n,e)}return r||""},et.prototype.d=function(t){for(var e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];var i=this.locale,o=null;return 1===e.length?a(e[0])?o=e[0]:r(e[0])&&(e[0].locale&&(i=e[0].locale),e[0].key&&(o=e[0].key)):2===e.length&&(a(e[0])&&(o=e[0]),a(e[1])&&(i=e[1])),this._d(t,i,o)},et.prototype.getNumberFormat=function(t){return u(this._vm.numberFormats[t]||{})},et.prototype.setNumberFormat=function(t,e){this._vm.$set(this._vm.numberFormats,t,e),this._clearNumberFormat(t,e)},et.prototype.mergeNumberFormat=function(t,e){this._vm.$set(this._vm.numberFormats,t,m(this._vm.numberFormats[t]||{},e)),this._clearNumberFormat(t,e)},et.prototype._clearNumberFormat=function(t,e){for(var n in e){var r=t+"__"+n;this._numberFormatters.hasOwnProperty(r)&&delete this._numberFormatters[r]}},et.prototype._getNumberFormatter=function(t,e,n,r,a,i){for(var o=e,s=r[o],c=this._getLocaleChain(e,n),u=0;u<c.length;u++){var h=c[u];if(o=h,!l(s=r[h])&&!l(s[a]))break}if(l(s)||l(s[a]))return null;var f,p=s[a];if(i)f=new Intl.NumberFormat(o,Object.assign({},p,i));else{var m=o+"__"+a;(f=this._numberFormatters[m])||(f=this._numberFormatters[m]=new Intl.NumberFormat(o,p))}return f},et.prototype._n=function(t,e,n,r){if(!et.availabilities.numberFormat)return"";if(!n)return(r?new Intl.NumberFormat(e,r):new Intl.NumberFormat(e)).format(t);var a=this._getNumberFormatter(t,e,this.fallbackLocale,this._getNumberFormats(),n,r),i=a&&a.format(t);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n.n(t,Object.assign({},{key:n,locale:e},r))}return i||""},et.prototype.n=function(e){for(var n=[],i=arguments.length-1;i-- >0;)n[i]=arguments[i+1];var o=this.locale,s=null,l=null;return 1===n.length?a(n[0])?s=n[0]:r(n[0])&&(n[0].locale&&(o=n[0].locale),n[0].key&&(s=n[0].key),l=Object.keys(n[0]).reduce(function(e,r){var a;return h(t,r)?Object.assign({},e,((a={})[r]=n[0][r],a)):e},null)):2===n.length&&(a(n[0])&&(s=n[0]),a(n[1])&&(o=n[1])),this._n(e,o,s,l)},et.prototype._ntp=function(t,e,n,r){if(!et.availabilities.numberFormat)return[];if(!n)return(r?new Intl.NumberFormat(e,r):new Intl.NumberFormat(e)).formatToParts(t);var a=this._getNumberFormatter(t,e,this.fallbackLocale,this._getNumberFormats(),n,r),i=a&&a.formatToParts(t);if(this._isFallbackRoot(i)){if(!this._root)throw Error("unexpected error");return this._root.$i18n._ntp(t,e,n,r)}return i||[]},Object.defineProperties(et.prototype,nt),Object.defineProperty(et,"availabilities",{get:function(){if(!G){var t="undefined"!=typeof Intl;G={dateTimeFormat:t&&void 0!==Intl.DateTimeFormat,numberFormat:t&&void 0!==Intl.NumberFormat}}return G}}),et.install=I,et.version="8.20.0",et},"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.VueI18n=e();
\ No newline at end of file
diff --git a/components/dict-tag/dict-tag.vue b/components/dict-tag/dict-tag.vue
new file mode 100644
index 0000000..a8bb29b
--- /dev/null
+++ b/components/dict-tag/dict-tag.vue
@@ -0,0 +1,75 @@
+<template>
+  <span>
+      <u-tag :text="item.label" mode="plain" v-for="(item, idx) in options.items" :key="idx"
+             v-if="item.value === value"/>
+  </span>
+</template>
+<script>
+
+export default {
+  props: {
+    value: {
+      type: String,
+      default: ''
+    },
+    dictType: {
+      type: String,
+      default: ''
+    },
+    items: {
+      type: Array,
+      default() {
+        return [];
+      }
+    },
+    itemLabel: {
+      type: String,
+      default: 'name'
+    },
+    itemValue: {
+      type: String,
+      default: 'value'
+    }
+  },
+  data() {
+    return {
+      options: {
+        value: this.value,
+        items: this.items
+      }
+    };
+  },
+  watch: {
+    value(val, oldVal) {
+      this.options.value = val;
+    },
+    items(val, oldVal) {
+      this.options.items = val;
+    }
+  },
+  created() {
+    this.loadData();
+  },
+  methods: {
+    loadData() {
+      console.log("==", this.value)
+      if (this.dictType != '') {
+        this.$u.api.dictData({dictType: this.dictType}).then(res => {
+          if (typeof res === 'object' && res.result === 'login') {
+            return;
+          }
+          this.options.items = res.data;
+        });
+      } else {
+        this.options.items = this.items;
+      }
+    },
+    change(val) {
+      this.$emit('input', val);
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+</style>
diff --git a/components/js-checkbox/js-checkbox.vue b/components/js-checkbox/js-checkbox.vue
new file mode 100644
index 0000000..de90bdb
--- /dev/null
+++ b/components/js-checkbox/js-checkbox.vue
@@ -0,0 +1,100 @@
+<template>
+	<view class="u-flex-1">
+		<u-checkbox-group :disabled="disabled" @change="change">
+			<u-checkbox v-model="item.checked" v-for="(item, index) in options.items" :key="index"
+				:name="item[itemValue]">{{item[itemLabel]}}</u-checkbox>
+		</u-checkbox-group>
+	</view>
+</template>
+<script>
+/**
+ * 澶嶉�夋缁勪欢 {{item[itemLabel]}}
+ * @property {Object} value 鐢ㄤ簬鍙屽悜缁戝畾閫夋嫨妗嗙殑鍊硷紝杩斿洖閫夋嫨妗嗙殑 Value
+ * @property {Boolean} disabled 鏄惁绂佺敤妯″紡锛屾槸鍚﹀彧璇绘ā寮�
+ * @property {String} dictType 瀛楀吀绫诲瀷锛屼粠瀛楀吀閲岃幏鍙栵紝鑷姩璁剧疆 items銆乮temLabel銆乮temValue
+ * @property {String} items 鍒楄〃鏁版嵁锛屽彲鎺ュ彈瀵硅薄闆嗗悎锛屽锛歔{name: '鏄�', value: '鍚�'}]
+ * @property {String} itemLabel 鎸囧畾鍒楄〃鏁版嵁涓殑浠�涔堝睘鎬у悕浣滀负 option 鐨勬爣绛惧悕锛屽 name
+ * @property {String} itemValue 鎸囧畾鍒楄〃鏁版嵁涓殑浠�涔堝睘鎬у悕浣滀负 option 鐨� value 鍊硷紝濡� value
+ * @example <js-select v-model="model.type" dict-type="sys_yes_no"></js-select>
+ * @description Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * @author ThinkGem
+ * @version 2021-3-11
+ */
+export default {
+	props: {
+		value: {
+			type: String,
+			default: ''
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		dictType: {
+			type: String,
+			default: ''
+		},
+		items: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		itemLabel: {
+			type: String,
+			default: 'label'
+		},
+		itemValue: {
+			type: String,
+			default: 'value'
+		}
+	},
+	data() {
+		return {
+			options: {
+				value: (this.value && this.value.split(',')) || [],
+				items: this.items
+			}
+		};
+	},
+	watch: {
+		value(val, oldVal) {
+			this.options.value = (val && val.split(',')) || [];
+      this.loadData();
+		},
+		items(val, oldVal){
+			this.options.items = val;
+      this.loadData();
+		}
+	},
+	methods: {
+		loadData(){
+			if (this.dictType != ''){
+				this.$u.api.dictData({dictType: this.dictType}).then(res => {
+					// this.options.items = res;
+					this.selectValue(res.data);
+				});
+			}else{
+				// this.options.items = this.items;
+				this.selectValue(this.items);
+			}
+		},
+		selectValue(items){
+			// 寰俊灏忕▼搴忥紝闇�瑕佸欢杩熶笅锛屽惁鍒欒幏鍙栦笉 value 瀵艰嚧鏃犳硶鍥炴樉鏁版嵁
+			this.$nextTick(() => {
+				let vals = this.options.value;
+				for (let i in items){
+          this.$set(items[i],'checked',vals.includes(items[i][this.itemValue]))
+				}
+				this.options.items = items;
+			});
+		},
+		change(val, name){
+			this.$emit('input', (val && val.join(',')) || '');
+		}
+	}
+}
+</script>
+<style lang="scss" scoped>
+
+</style>
diff --git a/components/js-lang/js-lang.vue b/components/js-lang/js-lang.vue
new file mode 100644
index 0000000..42ed73b
--- /dev/null
+++ b/components/js-lang/js-lang.vue
@@ -0,0 +1,69 @@
+<template>
+	<view v-if="showBtn" class="js-lang" @tap="switchLang">
+		<u-icon size="46" color="warning" :name="lang"></u-icon>
+	</view>
+</template>
+<script>
+/**
+ * 璇█鍒囨崲缁勪欢
+ * @property {String} title 椤堕儴瀵艰埅鐨勬爣棰� i18n 缂栫爜
+ * @property {Boolean} showBtn 鏄惁鏄剧ず璇█鍒囨崲鎸夐挳
+ * @example <js-lang title="login.title" :showBtn="true"></js-lang>
+ * @description Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * @author ThinkGem
+ * @version 2021-3-11
+ */
+export default {
+	props: {
+		title: {
+			type: String,
+			default: ''
+		},
+		showBtn: {
+			type: Boolean,
+			default: false
+		}		
+	},
+	computed: {
+		lang() {
+			return this.$i18n.locale == 'zh_CN' ? 'zh' : 'en';
+		}
+	},
+	created(){
+		this.setBarTitle();
+	},
+	methods: {
+		switchLang() {
+			this.$i18n.locale = this.$i18n.locale == 'zh_CN' ? 'en' : 'zh_CN';
+			this.$u.vuex('vuex_locale', this.$i18n.locale);
+			this.$u.api.lang({lang: this.vuex_locale});
+			this.setBarTitle();
+		},
+		setBarTitle (){
+			uni.setNavigationBarTitle({
+				title: this.$t(this.title)
+			});
+			uni.setTabBarItem({
+				index: 0,
+				text: this.$t('nav.log')
+			});
+			uni.setTabBarItem({
+				index: 1,
+				text: this.$t('nav.home')
+			});
+			uni.setTabBarItem({
+				index: 2,
+				text: this.$t('nav.user')
+			});
+		}
+	}
+}
+</script>
+<style lang="scss" scoped>
+.js-lang {
+	position: absolute;
+	z-index: 10000;
+	top: 15px;
+	right: 15px;
+}
+</style>
diff --git a/components/js-radio/js-radio.vue b/components/js-radio/js-radio.vue
new file mode 100644
index 0000000..282abe8
--- /dev/null
+++ b/components/js-radio/js-radio.vue
@@ -0,0 +1,93 @@
+<template>
+	<view class="u-flex-1">
+		<u-radio-group v-model="options.value" :disabled="disabled" @change="change">
+			<u-radio v-for="(item, index) in options.items" :key="index"
+				:name="item[itemValue]">{{item[itemLabel]}}</u-radio>
+		</u-radio-group>
+	</view>
+</template>
+<script>
+/**
+ * 鍗曢�夋缁勪欢
+ * @property {Object} value 鐢ㄤ簬鍙屽悜缁戝畾閫夋嫨妗嗙殑鍊硷紝杩斿洖閫夋嫨妗嗙殑 Value
+ * @property {Boolean} disabled 鏄惁绂佺敤妯″紡锛屾槸鍚﹀彧璇绘ā寮�
+ * @property {String} dictType 瀛楀吀绫诲瀷锛屼粠瀛楀吀閲岃幏鍙栵紝鑷姩璁剧疆 items銆乮temLabel銆乮temValue
+ * @property {String} items 鍒楄〃鏁版嵁锛屽彲鎺ュ彈瀵硅薄闆嗗悎锛屽锛歔{name: '鏄�', value: '鍚�'}]
+ * @property {String} itemLabel 鎸囧畾鍒楄〃鏁版嵁涓殑浠�涔堝睘鎬у悕浣滀负 option 鐨勬爣绛惧悕锛屽 name
+ * @property {String} itemValue 鎸囧畾鍒楄〃鏁版嵁涓殑浠�涔堝睘鎬у悕浣滀负 option 鐨� value 鍊硷紝濡� value
+ * @example <js-radio v-model="model.type" dict-type="sys_yes_no"></js-radio>
+ * @description Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * @author ThinkGem
+ * @version 2021-3-11
+ */
+export default {
+	props: {
+		value: {
+			type: String,
+			default: ''
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		dictType: {
+			type: String,
+			default: ''
+		},
+		items: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		itemLabel: {
+			type: String,
+			default: 'label'
+		},
+		itemValue: {
+			type: String,
+			default: 'value'
+		}
+	},
+	data() {
+		return {
+			options: {
+				value: this.value,
+				items: this.items
+			}
+		};
+	},
+	watch: {
+		value(val, oldVal) {
+			this.options.value = val;
+		},
+		items(val, oldVal){
+			this.options.items = val;
+		}
+	},
+	created() {
+		this.loadData();
+	},
+	methods: {
+		loadData(){
+			if (this.dictType != ''){
+				this.$u.api.dictData({dictType: this.dictType}).then(res => {
+					if (typeof res === 'object' && res.result === 'login'){
+						return;
+					}
+					this.options.items = res.data;
+				});
+			}else{
+				this.options.items = this.items;
+			}
+		},
+		change(val){
+			// console.log(val);
+			this.$emit('input', val);
+		}
+	}
+}
+</script>
+<style lang="scss" scoped>
+
+</style>
diff --git a/components/js-select/js-select.vue b/components/js-select/js-select.vue
new file mode 100644
index 0000000..48bd711
--- /dev/null
+++ b/components/js-select/js-select.vue
@@ -0,0 +1,93 @@
+<template>
+  <view class="u-flex-1">
+    <u-radio-group v-model="options.value" :disabled="disabled" @change="change">
+      <u-radio v-for="(item, index) in options.items" :key="index"
+               :name="item[itemValue]">{{item[itemLabel]}}</u-radio>
+    </u-radio-group>
+  </view>
+</template>
+<script>
+/**
+ * 鍗曢�夋缁勪欢
+ * @property {Object} value 鐢ㄤ簬鍙屽悜缁戝畾閫夋嫨妗嗙殑鍊硷紝杩斿洖閫夋嫨妗嗙殑 Value
+ * @property {Boolean} disabled 鏄惁绂佺敤妯″紡锛屾槸鍚﹀彧璇绘ā寮�
+ * @property {String} dictType 瀛楀吀绫诲瀷锛屼粠瀛楀吀閲岃幏鍙栵紝鑷姩璁剧疆 items銆乮temLabel銆乮temValue
+ * @property {String} items 鍒楄〃鏁版嵁锛屽彲鎺ュ彈瀵硅薄闆嗗悎锛屽锛歔{name: '鏄�', value: '鍚�'}]
+ * @property {String} itemLabel 鎸囧畾鍒楄〃鏁版嵁涓殑浠�涔堝睘鎬у悕浣滀负 option 鐨勬爣绛惧悕锛屽 name
+ * @property {String} itemValue 鎸囧畾鍒楄〃鏁版嵁涓殑浠�涔堝睘鎬у悕浣滀负 option 鐨� value 鍊硷紝濡� value
+ * @example <js-radio v-model="model.type" dict-type="sys_yes_no"></js-radio>
+ * @description Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * @author ThinkGem
+ * @version 2021-3-11
+ */
+export default {
+  props: {
+    value: {
+      type: String,
+      default: ''
+    },
+    disabled: {
+      type: Boolean,
+      default: false
+    },
+    dictType: {
+      type: String,
+      default: ''
+    },
+    items: {
+      type: Array,
+      default() {
+        return [];
+      }
+    },
+    itemLabel: {
+      type: String,
+      default: 'label'
+    },
+    itemValue: {
+      type: String,
+      default: 'value'
+    }
+  },
+  data() {
+    return {
+      options: {
+        value: this.value,
+        items: this.items
+      }
+    };
+  },
+  watch: {
+    value(val, oldVal) {
+      this.options.value = val;
+    },
+    items(val, oldVal){
+      this.options.items = val;
+    }
+  },
+  created() {
+    this.loadData();
+  },
+  methods: {
+    loadData(){
+      if (this.dictType != ''){
+        this.$u.api.dictData({dictType: this.dictType}).then(res => {
+          if (typeof res === 'object' && res.result === 'login'){
+            return;
+          }
+          this.options.items = res.data;
+        });
+      }else{
+        this.options.items = this.items;
+      }
+    },
+    change(val){
+      // console.log(val);
+      this.$emit('input', val);
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+
+</style>
diff --git a/components/js-uploadfile/js-uploadfile.vue b/components/js-uploadfile/js-uploadfile.vue
new file mode 100644
index 0000000..b8cf671
--- /dev/null
+++ b/components/js-uploadfile/js-uploadfile.vue
@@ -0,0 +1,296 @@
+<template>
+	<view class="u-flex-1">
+		<u-upload width="160" height="160" ref="uUpload"
+			:action="options.action"
+			:header="options.header"
+			:form-data="options.formData"
+			:name="options.name"
+			:max-count="maxCount"
+			:auto-upload="true"
+			:deletable="deletable"
+			:before-upload="beforeUpload"
+			@on-success="uploadSuccess"
+			@on-uploaded="uploadUploaded"
+			:before-remove="beforeRemove"
+			@on-remove="uploadRemove"
+			></u-upload>
+	</view>
+</template>
+<script>
+import SparkMD5 from '@/common/spark-md5.js';
+/**
+ * 鏂囦欢涓婁紶缁勪欢缁勪欢
+ * @property {Object} value 浣跨敤 v-model="this.model" 鎸囧畾琛ㄥ崟鐨� model 瀵硅薄锛堝瓨鏀炬枃浠朵笂浼犵紪鍙蜂俊鎭級
+ * @property {String} bizKey 涓氬姟琛ㄧ殑涓婚敭鍊硷紙涓庨檮浠跺叧鑱旂殑涓氬姟鏁版嵁锛夈�愬彲閫夈�戝鏋滀笉璁剧疆锛屽垯鑾峰彇 value.id 浣滀负涓婚敭
+ * @property {String} bizType 涓氬姟琛ㄧ殑涓婁紶绫诲瀷锛堝叏缃戝敮涓�锛屾帹鑽愭牸寮忥細瀹炰綋鍚峗涓婁紶绫诲瀷锛屼緥濡傦紝鎰忚鍙嶉鍥剧墖锛歛ppComment_image锛�
+ * @property {String} uploadType 涓婁紶鏂囦欢绫诲瀷锛歩mage锛岀洰鍓嶇Щ鍔ㄧ浠呮敮鎸佷笂浼犲浘鐗�
+ * @property {String} imageMaxWidth 鍥剧墖鍘嬬缉锛屾渶澶у搴︼紙uploadType涓篿mage鐢熸晥锛夛紝璁剧疆-1浠h〃涓嶅仛浠讳綍澶勭悊
+ * @property {String} imageMaxHeight 鍥剧墖鍘嬬缉锛屾渶澶у搴︼紙uploadType涓篿mage鐢熸晥锛夛紝璁剧疆-1浠h〃涓嶅仛浠讳綍澶勭悊
+ * @property {String} maxCount 鏈�澶т笂浼犱釜鏁帮紝榛樿 52 涓紝濡傛灉璁剧疆涓� 0 鍙互褰撳仛銆愬彧璇绘ā寮忋�戜娇鐢�
+ * @example <js-uploadfile v-model="model.otherData" :biz-key="model.id" biz-type="testData_image"></js-uploadfile>
+ * @description Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * @author ThinkGem
+ * @version 2021-3-11
+ */
+export default {
+	props: {
+		value: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		bizKey: {
+			type: String,
+			default: ''
+		},
+		bizType: {
+			type: String,
+			default: 'images'
+		},
+		uploadType: {
+			type: String,
+			default: 'image'
+		},
+		imageMaxWidth: {
+			type: [String, Number],
+			default: 1024
+		},
+		imageMaxHeight: {
+			type: [String, Number],
+			default: 768
+		},
+		maxCount: {
+			type: [String, Number],
+			default: 52
+		}
+	},
+	data() {
+		return {
+			options: {
+				value: {},
+				action: '',
+				header: {},
+				formData: {
+					fileMd5: '',
+					fileName: '',
+					bizKey: this.bizKey || (this.value && this.value.id) || '',
+					bizType: this.bizType,
+					uploadType: this.uploadType,
+					imageMaxWidth: this.imageMaxWidth,
+					imageMaxHeight: this.imageMaxHeight
+				},
+				name: 'file',
+				// 鏂囦欢涓婁紶鐨� id 鏁扮粍
+				fileUploadIds: [],
+				// 鏂囦欢鍒犻櫎鐨� id 鏁扮粍
+				fileUploadDelIds: []
+			},
+			deletable: true
+		};
+	},
+	watch: {
+		value(val, oldVal) {
+			this.options.value = val;
+		},
+		maxCount(val, oldVal) {
+			this.refreshStatus();
+		},
+		bizKey(val, oldVal) {
+			this.options.formData.bizKey = val;
+			this.loadData();
+		}
+	},
+	created() {
+		this.refreshStatus();
+		this.options.action = this.vuex_config.baseUrl + this.vuex_config.adminPath + '/file/upload';
+		this.options.formData = Object.assign(this.options.formData, this.formData);
+		this.loadData();
+	},
+	methods: {
+		// 鍒锋柊鏄惁鍙鐘舵��
+		refreshStatus(){
+			if (this.maxCount <= 0){
+				this.deletable = false;
+			}
+		},
+		// 宸蹭笂浼犵殑鏂囦欢鍥炴樉鍒颁笂浼犵粍浠�
+		loadData(){
+			if (this.options.formData.bizKey != ''){
+				let baseUrl = this.vuex_config.baseUrl;
+				let adminPath = this.vuex_config.adminPath;
+				this.$u.post(adminPath + '/file/fileList', {
+					bizKey: this.options.formData.bizKey,
+					bizType: this.options.formData.bizType,
+				}).then(res => {
+					let lists = [];
+					if (!(typeof res === 'object' && (res.result === 'login' || res.result === 'false'))){
+						for (let i in res){
+							let f = res[i];
+							lists.push({
+								url: baseUrl + f.fileUrl,
+								fileUploadId: f.id,
+								progress: 100,
+								error: false
+							});
+						}
+					}
+					// console.log(lists)
+					this.$refs.uUpload.lists = lists;
+					this.uploadRefreshIds(lists);
+				});
+			}
+		},
+		// 涓婁紶涔嬪墠锛岄獙璇佺浼犮�佹槸鍚︾户缁笂浼犵瓑
+		beforeUpload(index, lists) {
+			let self = this;
+			let item = lists[index];
+			let upload = this.upload;
+			let formData = this.options.formData;
+			let baseUrl = this.vuex_config.baseUrl;
+			let adminPath = this.vuex_config.adminPath;
+			self.$u.http.interceptor.request(this.options);
+			return new Promise((resolve, reject) => {
+				try{
+					function uploadFile(arrayBuffer){
+						let buffer = arrayBuffer;
+						let size = 10 * 1024 * 1024;
+						let spark = new SparkMD5.ArrayBuffer();
+						if (buffer.byteLength > size){
+							spark.append(buffer.slice(0, size));;
+						}else{
+							spark.append(buffer);
+						}
+						formData.fileEntityId = '';
+						formData.fileUploadId = '';
+						formData.fileMd5 = spark.end();
+						if (!item.file.name) {
+							item.file.name = item.url.split('/').pop();
+						}
+						formData.fileName = item.file.name;
+						// console.log('formData' + JSON.stringify(formData));
+						self.$u.post(adminPath + '/file/upload', formData).then(res => {
+							// console.log(res)
+							// 鏂囦欢宸茬粡涓婁紶锛屽惎鐢ㄧ浼�
+							if (res.result == 'true' && res.fileUpload){
+								item.fileUploadId = res.fileUpload.id;
+								item.progress = 100;
+								item.error = false;
+								reject(res);
+							}
+							// 鏂囦欢鏈笂浼犺繃锛岀户缁笂浼犳枃浠�
+							else if (res.fileUploadId && res.fileEntityId){
+								formData.fileUploadId = res.fileUploadId;
+								formData.fileEntityId = res.fileEntityId;
+								item.fileUploadId = res.fileUploadId;
+								resolve();
+							}
+							// 鏈煡閿欒锛屾彁绀烘湇鍔$杩斿洖鐨勪俊鎭�
+							else {
+								uni.showModal({title: '鎻愮ず', content: res.message });
+								reject(res);
+							}
+						}).catch(err => {
+							console.error(err);
+							reject(err);
+						})
+					}
+					// #ifdef APP-PLUS
+					plus.io.requestFileSystem(plus.io.PRIVATE_WWW, function(fs){
+						fs.root.getFile(item.url, {create: false}, function(fileEntry){
+							fileEntry.file(function(file){
+								// console.log("getFile:" + JSON.stringify(file))
+								item.file.name = file.name;
+								var fileReader = new plus.io.FileReader();
+								fileReader.readAsText(file, 'utf-8');
+								fileReader.onloadend = function(evt) {
+									uploadFile(evt.target.result);
+								}
+								fileReader.onerror = function(error) {
+									reject(error);
+								}
+							}, reject);
+						}, reject);
+					} );
+					// #endif
+					// #ifdef MP
+					uni.getFileSystemManager().readFile({
+						filePath: item.url,
+						success(res) {
+							// console.log(res)
+							uploadFile(res.data);
+						},
+						fail(res) {
+							reject(res);
+						}
+					})
+					// #endif
+					// #ifdef H5
+					uni.request({
+						url: item.url,
+						responseType: 'arraybuffer',
+						complete: res => {
+							// console.log(res)
+							if (res.statusCode == 200) {
+								uploadFile(res.data);
+							}else{
+								reject(res);
+							}
+						}
+					})
+					// #endif
+				}catch(err){
+					console.error(err);
+					reject(err);
+				}
+			})
+		},
+		// 涓婁紶鎴愬姛涓�涓紝灏卞啓杩� fileUploadIds
+		uploadSuccess(data, index, lists, name){
+			let item = lists[index];
+			if (item.response && item.response.fileUpload) {
+				item.fileUploadId = item.response.fileUpload.id;
+			}
+			this.options.fileUploadIds.push(item.fileUploadId);
+		},
+		// 鍏ㄩ儴涓婁紶鍚庯紝鍒锋柊 fileUploadIds銆乫ileUploadDelIds
+		uploadUploaded(lists, name) {
+			this.uploadRefreshIds(lists);
+		},
+		// 绉婚櫎涔嬪墠鑾峰彇鍒犻櫎鐨� fileUploadId锛屽啓杩� fileUploadDelIds
+		beforeRemove(index, lists){
+			let item = lists[index];
+			if (item.fileUploadId){
+				this.options.fileUploadDelIds.push(item.fileUploadId);
+			}
+			return true;
+		},
+		// 绉婚櫎涔嬪悗锛屽埛鏂� fileUploadIds銆乫ileUploadDelIds
+		uploadRemove(index, lists){
+			this.uploadRefreshIds(lists);
+		},
+		// 鍒锋柊 fileUploadIds銆乫ileUploadDelIds
+		uploadRefreshIds(lists, name) {
+			let fileUploadIds = [];
+			lists.forEach(item => {
+				if (item.fileUploadId && item.progress == 100){
+					fileUploadIds.push(item.fileUploadId);
+				}
+			});
+			this.options.fileUploadIds = fileUploadIds;
+			// console.log('fileUploadIds', this.options.fileUploadIds)
+			// console.log('fileUploadDelIds', this.options.fileUploadDelIds)
+			// 灏嗕笂浼犲拰鍒犻櫎鐨� id 鍥炰紶缁� model
+			let formData = this.options.formData;
+			let fileParams = this.options.value || {};
+			fileParams[formData.bizType] = this.options.fileUploadIds.join(',');
+			fileParams[formData.bizType+'__del'] = this.options.fileUploadDelIds.join(',');
+			this.options.value = fileParams;
+			this.$emit('input', Object.assign(this.options.value, this.value));
+		},
+	}
+}
+</script>
+<style lang="scss" scoped>
+	
+</style>
diff --git a/components/scan/scan.vue b/components/scan/scan.vue
new file mode 100644
index 0000000..c39741c
--- /dev/null
+++ b/components/scan/scan.vue
@@ -0,0 +1,93 @@
+<template>
+	<view>
+		<view class="content">
+		</view>
+	</view>
+</template>
+
+<script>
+	var main, receiver, filter;
+	var action, extraKey;
+	var _codeQueryTag = false;
+	export default {
+		data() {
+			return {
+				scanCode: ''
+			}
+		},
+		created: function(option) {
+			uni.getSystemInfo({
+				success: (res) => {
+					var brand = res.brand.toUpperCase();
+					var model = res.model.toUpperCase();
+					if (brand.indexOf("ZEBRA")!=-1 && model.indexOf("TC2")!=-1) {
+						 action = "com.zebra.scan";
+						 extraKey = "com.motorolasolutions.emdk.datawedge.data_string";
+					} else if (brand.indexOf("SEUIC")!=-1||brand.indexOf("AUTOID")!=-1) {
+						 action = "com.android.server.scannerservice.broadcast";
+						 extraKey = "scannerdata";
+					}else{
+						return;
+					}
+					console.log(action);
+					console.log(extraKey);
+					this.initScan()
+					this.startScan();
+				}
+			})
+
+
+		
+		},
+		onHide: function() {
+			this.stopScan();
+		},
+		destroyed: function() {
+			this.stopScan();
+		},
+		methods: {
+			initScan() {
+				console.log('initScan');
+				let _this = this;
+				main = plus.android.runtimeMainActivity(); //鑾峰彇activity
+				var IntentFilter = plus.android.importClass('android.content.IntentFilter');
+				filter = new IntentFilter();
+				//涓嬮潰鐨刟ddAction鍐呮敼涓鸿嚜宸辩殑骞挎挱鍔ㄤ綔
+				filter.addAction(action);
+				receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
+					onReceive: function(context, intent) {
+						console.log('onReceive');
+						plus.android.importClass(intent);
+						//涓嬮潰鐨刧etStringExtra鍐呮敼涓鸿嚜宸辩殑骞挎挱鏍囩--鏈夎
+						let code = intent.getStringExtra(extraKey);
+						_this.queryCode(code);
+					}
+				});
+			},
+			startScan() {
+				console.log('startScan');
+				main.registerReceiver(receiver, filter);
+			},
+			stopScan() {
+				console.log('stopScan');
+				main.unregisterReceiver(receiver);
+			},
+			queryCode: function(code) {
+				console.log('queryCode');
+				if (_codeQueryTag) return false;
+				_codeQueryTag = true;
+				setTimeout(function() {
+					_codeQueryTag = false;
+				}, 150);
+				var id = code
+				uni.$emit('scan', {
+					code: id
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>
diff --git a/components/tki-qrcode/qrcode.js b/components/tki-qrcode/qrcode.js
new file mode 100644
index 0000000..6ea6553
--- /dev/null
+++ b/components/tki-qrcode/qrcode.js
@@ -0,0 +1,1201 @@
+let QRCode = {};
+(function () {
+    /**
+     * 鑾峰彇鍗曚釜瀛楃鐨剈tf8缂栫爜
+     * unicode BMP骞抽潰绾�65535涓瓧绗�
+     * @param {num} code
+     * return {array}
+     */
+    function unicodeFormat8(code) {
+        // 1 byte
+        var c0, c1, c2;
+        if (code < 128) {
+            return [code];
+            // 2 bytes
+        } else if (code < 2048) {
+            c0 = 192 + (code >> 6);
+            c1 = 128 + (code & 63);
+            return [c0, c1];
+            // 3 bytes
+        } else {
+            c0 = 224 + (code >> 12);
+            c1 = 128 + (code >> 6 & 63);
+            c2 = 128 + (code & 63);
+            return [c0, c1, c2];
+        }
+    }
+    /**
+     * 鑾峰彇瀛楃涓茬殑utf8缂栫爜瀛楄妭涓�
+     * @param {string} string
+     * @return {array}
+     */
+    function getUTF8Bytes(string) {
+        var utf8codes = [];
+        for (var i = 0; i < string.length; i++) {
+            var code = string.charCodeAt(i);
+            var utf8 = unicodeFormat8(code);
+            for (var j = 0; j < utf8.length; j++) {
+                utf8codes.push(utf8[j]);
+            }
+        }
+        return utf8codes;
+    }
+    /**
+     * 浜岀淮鐮佺畻娉曞疄鐜�
+     * @param {string} data              瑕佺紪鐮佺殑淇℃伅瀛楃涓�
+     * @param {num} errorCorrectLevel 绾犻敊绛夌骇
+     */
+    function QRCodeAlg(data, errorCorrectLevel) {
+        this.typeNumber = -1; //鐗堟湰
+        this.errorCorrectLevel = errorCorrectLevel;
+        this.modules = null; //浜岀淮鐭╅樀锛屽瓨鏀炬渶缁堢粨鏋�
+        this.moduleCount = 0; //鐭╅樀澶у皬
+        this.dataCache = null; //鏁版嵁缂撳瓨
+        this.rsBlocks = null; //鐗堟湰鏁版嵁淇℃伅
+        this.totalDataCount = -1; //鍙娇鐢ㄧ殑鏁版嵁閲�
+        this.data = data;
+        this.utf8bytes = getUTF8Bytes(data);
+        this.make();
+    }
+    QRCodeAlg.prototype = {
+        constructor: QRCodeAlg,
+        /**
+         * 鑾峰彇浜岀淮鐮佺煩闃靛ぇ灏�
+         * @return {num} 鐭╅樀澶у皬
+         */
+        getModuleCount: function () {
+            return this.moduleCount;
+        },
+        /**
+         * 缂栫爜
+         */
+        make: function () {
+            this.getRightType();
+            this.dataCache = this.createData();
+            this.createQrcode();
+        },
+        /**
+         * 璁剧疆浜屼綅鐭╅樀鍔熻兘鍥惧舰
+         * @param  {bool} test 琛ㄧず鏄惁鍦ㄥ鎵炬渶濂芥帺鑶滈樁娈�
+         * @param  {num} maskPattern 鎺╄啘鐨勭増鏈�
+         */
+        makeImpl: function (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);
+            }
+            this.setupPositionProbePattern(0, 0);
+            this.setupPositionProbePattern(this.moduleCount - 7, 0);
+            this.setupPositionProbePattern(0, this.moduleCount - 7);
+            this.setupPositionAdjustPattern();
+            this.setupTimingPattern();
+            this.setupTypeInfo(true, maskPattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(true);
+            }
+            this.mapData(this.dataCache, maskPattern);
+        },
+        /**
+         * 璁剧疆浜岀淮鐮佺殑浣嶇疆鎺㈡祴鍥惧舰
+         * @param  {num} row 鎺㈡祴鍥惧舰鐨勪腑蹇冩í鍧愭爣
+         * @param  {num} col 鎺㈡祴鍥惧舰鐨勪腑蹇冪旱鍧愭爣
+         */
+        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;
+                    }
+                }
+            }
+        },
+        /**
+         * 鍒涘缓浜岀淮鐮�
+         * @return {[type]} [description]
+         */
+        createQrcode: function () {
+            var minLostPoint = 0;
+            var pattern = 0;
+            var bestModules = null;
+            for (var i = 0; i < 8; i++) {
+                this.makeImpl(i);
+                var lostPoint = QRUtil.getLostPoint(this);
+                if (i == 0 || minLostPoint > lostPoint) {
+                    minLostPoint = lostPoint;
+                    pattern = i;
+                    bestModules = this.modules;
+                }
+            }
+            this.modules = bestModules;
+            this.setupTypeInfo(false, pattern);
+            if (this.typeNumber >= 7) {
+                this.setupTypeNumber(false);
+            }
+        },
+        /**
+         * 璁剧疆瀹氫綅鍥惧舰
+         * @return {[type]} [description]
+         */
+        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);
+                if (this.modules[6][r] != null) {
+                    continue;
+                }
+                this.modules[6][r] = (r % 2 == 0);
+            }
+        },
+        /**
+         * 璁剧疆鐭鍥惧舰
+         * @return {[type]} [description]
+         */
+        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;
+                            }
+                        }
+                    }
+                }
+            }
+        },
+        /**
+         * 璁剧疆鐗堟湰淇℃伅锛�7浠ヤ笂鐗堟湰鎵嶆湁锛�
+         * @param  {bool} test 鏄惁澶勪簬鍒ゆ柇鏈�浣虫帺鑶滈樁娈�
+         * @return {[type]}      [description]
+         */
+        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;
+                this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
+            }
+        },
+        /**
+         * 璁剧疆鏍煎紡淇℃伅锛堢籂閿欑瓑绾у拰鎺╄啘鐗堟湰锛�
+         * @param  {bool} test
+         * @param  {num} maskPattern 鎺╄啘鐗堟湰
+         * @return {}
+         */
+        setupTypeInfo: function (test, maskPattern) {
+            var data = (QRErrorCorrectLevel[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
+                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);
+        },
+        /**
+         * 鏁版嵁缂栫爜
+         * @return {[type]} [description]
+         */
+        createData: function () {
+            var buffer = new QRBitBuffer();
+            var lengthBits = this.typeNumber > 9 ? 16 : 8;
+            buffer.put(4, 4); //娣诲姞妯″紡
+            buffer.put(this.utf8bytes.length, lengthBits);
+            for (var i = 0, l = this.utf8bytes.length; i < l; i++) {
+                buffer.put(this.utf8bytes[i], 8);
+            }
+            if (buffer.length + 4 <= this.totalDataCount * 8) {
+                buffer.put(0, 4);
+            }
+            // padding
+            while (buffer.length % 8 != 0) {
+                buffer.putBit(false);
+            }
+            // padding
+            while (true) {
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD0, 8);
+                if (buffer.length >= this.totalDataCount * 8) {
+                    break;
+                }
+                buffer.put(QRCodeAlg.PAD1, 8);
+            }
+            return this.createBytes(buffer);
+        },
+        /**
+         * 绾犻敊鐮佺紪鐮�
+         * @param  {buffer} buffer 鏁版嵁缂栫爜
+         * @return {[type]}
+         */
+        createBytes: function (buffer) {
+            var offset = 0;
+            var maxDcCount = 0;
+            var maxEcCount = 0;
+            var length = this.rsBlock.length / 3;
+            var rsBlocks = new Array();
+            for (var i = 0; i < length; i++) {
+                var count = this.rsBlock[i * 3 + 0];
+                var totalCount = this.rsBlock[i * 3 + 1];
+                var dataCount = this.rsBlock[i * 3 + 2];
+                for (var j = 0; j < count; j++) {
+                    rsBlocks.push([dataCount, totalCount]);
+                }
+            }
+            var dcdata = new Array(rsBlocks.length);
+            var ecdata = new Array(rsBlocks.length);
+            for (var r = 0; r < rsBlocks.length; r++) {
+                var dcCount = rsBlocks[r][0];
+                var ecCount = rsBlocks[r][1] - 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 data = new Array(this.totalDataCount);
+            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;
+
+        },
+        /**
+         * 甯冪疆妯″潡锛屾瀯寤烘渶缁堜俊鎭�
+         * @param  {} data
+         * @param  {} maskPattern
+         * @return {}
+         */
+        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;
+                    }
+                }
+            }
+        }
+    };
+    /**
+     * 濉厖瀛楁
+     */
+    QRCodeAlg.PAD0 = 0xEC;
+    QRCodeAlg.PAD1 = 0x11;
+    //---------------------------------------------------------------------
+    // 绾犻敊绛夌骇瀵瑰簲鐨勭紪鐮�
+    //---------------------------------------------------------------------
+    var QRErrorCorrectLevel = [1, 0, 3, 2];
+    //---------------------------------------------------------------------
+    // 鎺╄啘鐗堟湰
+    //---------------------------------------------------------------------
+    var QRMaskPattern = {
+        PATTERN000: 0,
+        PATTERN001: 1,
+        PATTERN010: 2,
+        PATTERN011: 3,
+        PATTERN100: 4,
+        PATTERN101: 5,
+        PATTERN110: 6,
+        PATTERN111: 7
+    };
+    //---------------------------------------------------------------------
+    // 宸ュ叿绫�
+    //---------------------------------------------------------------------
+    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),
+        /*
+        BCH缂栫爜鏍煎紡淇℃伅
+         */
+        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;
+        },
+        /*
+        BCH缂栫爜鐗堟湰淇℃伅
+         */
+        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;
+        },
+        /*
+        鑾峰彇BCH浣嶄俊鎭�
+         */
+        getBCHDigit: function (data) {
+            var digit = 0;
+            while (data != 0) {
+                digit++;
+                data >>>= 1;
+            }
+            return digit;
+        },
+        /*
+        鑾峰彇鐗堟湰瀵瑰簲鐨勭煫姝e浘褰綅缃�
+         */
+        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);
+            }
+        },
+        /*
+        鑾峰彇RS鐨勭籂閿欏椤瑰紡
+         */
+        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;
+        },
+        /*
+        鑾峰彇璇勪环
+         */
+        getLostPoint: function (qrCode) {
+            var moduleCount = qrCode.getModuleCount(),
+                lostPoint = 0,
+                darkCount = 0;
+            for (var row = 0; row < moduleCount; row++) {
+                var sameCount = 0;
+                var head = qrCode.modules[row][0];
+                for (var col = 0; col < moduleCount; col++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 璇勪环
+                    if (col < moduleCount - 6) {
+                        if (current && !qrCode.modules[row][col + 1] && qrCode.modules[row][col + 2] && qrCode.modules[row][col + 3] && qrCode.modules[row][col + 4] && !qrCode.modules[row][col + 5] && qrCode.modules[row][col + 6]) {
+                            if (col < moduleCount - 10) {
+                                if (qrCode.modules[row][col + 7] && qrCode.modules[row][col + 8] && qrCode.modules[row][col + 9] && qrCode.modules[row][col + 10]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (col > 3) {
+                                if (qrCode.modules[row][col - 1] && qrCode.modules[row][col - 2] && qrCode.modules[row][col - 3] && qrCode.modules[row][col - 4]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 2 璇勪环
+                    if ((row < moduleCount - 1) && (col < moduleCount - 1)) {
+                        var count = 0;
+                        if (current) count++;
+                        if (qrCode.modules[row + 1][col]) count++;
+                        if (qrCode.modules[row][col + 1]) count++;
+                        if (qrCode.modules[row + 1][col + 1]) count++;
+                        if (count == 0 || count == 4) {
+                            lostPoint += 3;
+                        }
+                    }
+                    //level 1 璇勪环
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                    //level 4 璇勪环
+                    if (current) {
+                        darkCount++;
+                    }
+                }
+            }
+            for (var col = 0; col < moduleCount; col++) {
+                var sameCount = 0;
+                var head = qrCode.modules[0][col];
+                for (var row = 0; row < moduleCount; row++) {
+                    var current = qrCode.modules[row][col];
+                    //level 3 璇勪环
+                    if (row < moduleCount - 6) {
+                        if (current && !qrCode.modules[row + 1][col] && qrCode.modules[row + 2][col] && qrCode.modules[row + 3][col] && qrCode.modules[row + 4][col] && !qrCode.modules[row + 5][col] && qrCode.modules[row + 6][col]) {
+                            if (row < moduleCount - 10) {
+                                if (qrCode.modules[row + 7][col] && qrCode.modules[row + 8][col] && qrCode.modules[row + 9][col] && qrCode.modules[row + 10][col]) {
+                                    lostPoint += 40;
+                                }
+                            } else if (row > 3) {
+                                if (qrCode.modules[row - 1][col] && qrCode.modules[row - 2][col] && qrCode.modules[row - 3][col] && qrCode.modules[row - 4][col]) {
+                                    lostPoint += 40;
+                                }
+                            }
+                        }
+                    }
+                    //level 1 璇勪环
+                    if (head ^ current) {
+                        sameCount++;
+                    } else {
+                        head = current;
+                        if (sameCount >= 5) {
+                            lostPoint += (3 + sameCount - 5);
+                        }
+                        sameCount = 1;
+                    }
+                }
+            }
+            // LEVEL4
+            var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
+            lostPoint += ratio * 10;
+            return lostPoint;
+        }
+
+    };
+    //---------------------------------------------------------------------
+    // QRMath浣跨敤鐨勬暟瀛﹀伐鍏�
+    //---------------------------------------------------------------------
+    var QRMath = {
+        /*
+        灏唍杞寲涓篴^m
+         */
+        glog: function (n) {
+            if (n < 1) {
+                throw new Error("glog(" + n + ")");
+            }
+            return QRMath.LOG_TABLE[n];
+        },
+        /*
+        灏哸^m杞寲涓簄
+         */
+        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 澶氶」寮�
+    //---------------------------------------------------------------------
+    /**
+     * 澶氶」寮忕被
+     * @param {Array} num   绯绘暟
+     * @param {num} shift a^shift
+     */
+    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;
+        },
+        /**
+         * 澶氶」寮忎箻娉�
+         * @param  {QRPolynomial} e 琚箻澶氶」寮�
+         * @return {[type]}   [description]
+         */
+        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);
+        },
+        /**
+         * 澶氶」寮忔ā杩愮畻
+         * @param  {QRPolynomial} e 妯″椤瑰紡
+         * @return {}
+         */
+        mod: function (e) {
+            var tl = this.getLength(),
+                el = e.getLength();
+            if (tl - el < 0) {
+                return this;
+            }
+            var num = new Array(tl);
+            for (var i = 0; i < tl; i++) {
+                num[i] = this.get(i);
+            }
+            while (num.length >= el) {
+                var ratio = QRMath.glog(num[0]) - QRMath.glog(e.get(0));
+
+                for (var i = 0; i < e.getLength(); i++) {
+                    num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
+                }
+                while (num[0] == 0) {
+                    num.shift();
+                }
+            }
+            return new QRPolynomial(num, 0);
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // RS_BLOCK_TABLE
+    //---------------------------------------------------------------------
+    /*
+    浜岀淮鐮佸悇涓増鏈俊鎭痆鍧楁暟, 姣忓潡涓殑鏁版嵁鍧楁暟, 姣忓潡涓殑淇℃伅鍧楁暟]
+     */
+    var 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]
+    ];
+
+    /**
+     * 鏍规嵁鏁版嵁鑾峰彇瀵瑰簲鐗堟湰
+     * @return {[type]} [description]
+     */
+    QRCodeAlg.prototype.getRightType = function () {
+        for (var typeNumber = 1; typeNumber < 41; typeNumber++) {
+            var rsBlock = RS_BLOCK_TABLE[(typeNumber - 1) * 4 + this.errorCorrectLevel];
+            if (rsBlock == undefined) {
+                throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + this.errorCorrectLevel);
+            }
+            var length = rsBlock.length / 3;
+            var totalDataCount = 0;
+            for (var i = 0; i < length; i++) {
+                var count = rsBlock[i * 3 + 0];
+                var dataCount = rsBlock[i * 3 + 2];
+                totalDataCount += dataCount * count;
+            }
+            var lengthBytes = typeNumber > 9 ? 2 : 1;
+            if (this.utf8bytes.length + lengthBytes < totalDataCount || typeNumber == 40) {
+                this.typeNumber = typeNumber;
+                this.rsBlock = rsBlock;
+                this.totalDataCount = totalDataCount;
+                break;
+            }
+        }
+    };
+
+    //---------------------------------------------------------------------
+    // 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);
+        },
+        put: function (num, length) {
+            for (var i = 0; i < length; i++) {
+                this.putBit(((num >>> (length - i - 1)) & 1));
+            }
+        },
+        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++;
+        }
+    };
+
+
+
+    // xzedit
+    let qrcodeAlgObjCache = [];
+    /**
+     * 浜岀淮鐮佹瀯閫犲嚱鏁帮紝涓昏鐢ㄤ簬缁樺埗
+     * @param  {鍙傛暟鍒楄〃} opt 浼犻�掑弬鏁�
+     * @return {}
+     */
+    QRCode = function (opt) {
+        //璁剧疆榛樿鍙傛暟
+        this.options = {
+            text: '',
+            size: 256,
+            correctLevel: 3,
+            background: '#ffffff',
+            foreground: '#000000',
+            pdground: '#000000',
+            image: '',
+            imageSize: 30,
+            canvasId: opt.canvasId,
+            context: opt.context,
+            usingComponents: opt.usingComponents,
+            showLoading: opt.showLoading,
+            loadingText: opt.loadingText,
+        };
+        if (typeof opt === 'string') { // 鍙紪鐮丄SCII瀛楃涓�
+            opt = {
+                text: opt
+            };
+        }
+        if (opt) {
+            for (var i in opt) {
+                this.options[i] = opt[i];
+            }
+        }
+        //浣跨敤QRCodeAlg鍒涘缓浜岀淮鐮佺粨鏋�
+        var qrCodeAlg = null;
+        for (var i = 0, l = qrcodeAlgObjCache.length; i < l; i++) {
+            if (qrcodeAlgObjCache[i].text == this.options.text && qrcodeAlgObjCache[i].text.correctLevel == this.options.correctLevel) {
+                qrCodeAlg = qrcodeAlgObjCache[i].obj;
+                break;
+            }
+        }
+        if (i == l) {
+            qrCodeAlg = new QRCodeAlg(this.options.text, this.options.correctLevel);
+            qrcodeAlgObjCache.push({
+                text: this.options.text,
+                correctLevel: this.options.correctLevel,
+                obj: qrCodeAlg
+            });
+        }
+        /**
+         * 璁$畻鐭╅樀鐐圭殑鍓嶆櫙鑹�
+         * @param {Obj} config
+         * @param {Number} config.row 鐐箈鍧愭爣
+         * @param {Number} config.col 鐐箉鍧愭爣
+         * @param {Number} config.count 鐭╅樀澶у皬
+         * @param {Number} config.options 缁勪欢鐨刼ptions
+         * @return {String}
+         */
+        let getForeGround = function (config) {
+            var options = config.options;
+            if (options.pdground && (
+                (config.row > 1 && config.row < 5 && config.col > 1 && config.col < 5) ||
+                (config.row > (config.count - 6) && config.row < (config.count - 2) && config.col > 1 && config.col < 5) ||
+                (config.row > 1 && config.row < 5 && config.col > (config.count - 6) && config.col < (config.count - 2))
+            )) {
+                return options.pdground;
+            }
+            return options.foreground;
+        }
+        // 鍒涘缓canvas
+        let createCanvas = function (options) {
+            if (options.showLoading) {
+                uni.showLoading({
+                    title: options.loadingText,
+                    mask: true
+                });
+            }
+            var ctx = uni.createCanvasContext(options.canvasId, options.context);
+            var count = qrCodeAlg.getModuleCount();
+            var ratioSize = options.size;
+            var ratioImgSize = options.imageSize;
+            //璁$畻姣忎釜鐐圭殑闀垮
+            var tileW = (ratioSize / count).toPrecision(4);
+            var tileH = (ratioSize / count).toPrecision(4);
+            //缁樺埗
+            for (var row = 0; row < count; row++) {
+                for (var col = 0; col < count; col++) {
+                    var w = (Math.ceil((col + 1) * tileW) - Math.floor(col * tileW));
+                    var h = (Math.ceil((row + 1) * tileW) - Math.floor(row * tileW));
+                    var foreground = getForeGround({
+                        row: row,
+                        col: col,
+                        count: count,
+                        options: options
+                    });
+                    ctx.setFillStyle(qrCodeAlg.modules[row][col] ? foreground : options.background);
+                    ctx.fillRect(Math.round(col * tileW), Math.round(row * tileH), w, h);
+                }
+            }
+            if (options.image) {
+                var x = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                var y = Number(((ratioSize - ratioImgSize) / 2).toFixed(2));
+                drawRoundedRect(ctx, x, y, ratioImgSize, ratioImgSize, 2, 6, true, true)
+                ctx.drawImage(options.image, x, y, ratioImgSize, ratioImgSize);
+                // 鐢诲渾瑙掔煩褰�
+                function drawRoundedRect(ctxi, x, y, width, height, r, lineWidth, fill, stroke) {
+                    ctxi.setLineWidth(lineWidth);
+                    ctxi.setFillStyle(options.background);
+                    ctxi.setStrokeStyle(options.background);
+                    ctxi.beginPath(); // draw top and top right corner 
+                    ctxi.moveTo(x + r, y);
+                    ctxi.arcTo(x + width, y, x + width, y + r, r); // draw right side and bottom right corner 
+                    ctxi.arcTo(x + width, y + height, x + width - r, y + height, r); // draw bottom and bottom left corner 
+                    ctxi.arcTo(x, y + height, x, y + height - r, r); // draw left and top left corner 
+                    ctxi.arcTo(x, y, x + r, y, r);
+                    ctxi.closePath();
+                    if (fill) {
+                        ctxi.fill();
+                    }
+                    if (stroke) {
+                        ctxi.stroke();
+                    }
+                }
+            }
+            setTimeout(() => {
+                ctx.draw(true, () => {
+                    // 淇濆瓨鍒颁复鏃跺尯鍩�
+                    setTimeout(() => {
+                        uni.canvasToTempFilePath({
+                            width: options.width,
+                            height: options.height,
+                            destWidth: options.width,
+                            destHeight: options.height,
+                            canvasId: options.canvasId,
+                            quality: Number(1),
+                            success: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res.tempFilePath)
+                                }
+                            },
+                            fail: function (res) {
+                                if (options.cbResult) {
+                                    options.cbResult(res)
+                                }
+                            },
+                            complete: function () {
+                                if (options.showLoading){
+                                    uni.hideLoading();
+                                }
+                            },
+                        }, options.context);
+                    }, options.text.length + 100);
+                });
+            }, options.usingComponents ? 0 : 150);
+        }
+        createCanvas(this.options);
+        // 绌哄垽瀹�
+        let empty = function (v) {
+            let tp = typeof v,
+                rt = false;
+            if (tp == "number" && String(v) == "") {
+                rt = true
+            } else if (tp == "undefined") {
+                rt = true
+            } else if (tp == "object") {
+                if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+            } else if (tp == "string") {
+                if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+            } else if (tp == "function") {
+                rt = false
+            }
+            return rt
+        }
+    };
+    QRCode.prototype.clear = function (fn) {
+        var ctx = uni.createCanvasContext(this.options.canvasId, this.options.context)
+        ctx.clearRect(0, 0, this.options.size, this.options.size)
+        ctx.draw(false, () => {
+            if (fn) {
+                fn()
+            }
+        })
+    };
+})()
+
+export default QRCode
\ No newline at end of file
diff --git a/components/tki-qrcode/tki-qrcode.vue b/components/tki-qrcode/tki-qrcode.vue
new file mode 100644
index 0000000..f1bb6de
--- /dev/null
+++ b/components/tki-qrcode/tki-qrcode.vue
@@ -0,0 +1,210 @@
+<template xlang="wxml" minapp="mpvue">
+	<view class="tki-qrcode">
+		<!-- #ifndef MP-ALIPAY -->
+		<canvas class="tki-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
+		<!-- #endif -->
+		<!-- #ifdef MP-ALIPAY -->
+		<canvas :id="cid" :width="cpSize" :height="cpSize" class="tki-qrcode-canvas" />
+		<!-- #endif -->
+		<image v-show="show" :src="result" :style="{width:cpSize+'px',height:cpSize+'px'}" />
+	</view>
+</template>
+
+<script>
+import QRCode from "./qrcode.js"
+let qrcode
+export default {
+	name: "tki-qrcode",
+	props: {
+		cid: {
+			type: String,
+			default: 'tki-qrcode-canvas'
+		},
+		size: {
+			type: Number,
+			default: 200
+		},
+		unit: {
+			type: String,
+			default: 'upx'
+		},
+		show: {
+			type: Boolean,
+			default: true
+		},
+		val: {
+			type: String,
+			default: ''
+		},
+		background: {
+			type: String,
+			default: '#ffffff'
+		},
+		foreground: {
+			type: String,
+			default: '#000000'
+		},
+		pdground: {
+			type: String,
+			default: '#000000'
+		},
+		icon: {
+			type: String,
+			default: ''
+		},
+		iconSize: {
+			type: Number,
+			default: 40
+		},
+		lv: {
+			type: Number,
+			default: 3
+		},
+		onval: {
+			type: Boolean,
+			default: false
+		},
+		loadMake: {
+			type: Boolean,
+			default: false
+		},
+		usingComponents: {
+			type: Boolean,
+			default: true
+		},
+		showLoading: {
+			type: Boolean,
+			default: true
+		},
+		loadingText: {
+			type: String,
+			default: '浜岀淮鐮佺敓鎴愪腑'
+		},
+	},
+	data() {
+		return {
+			result: '',
+		}
+	},
+	methods: {
+		_makeCode() {
+			let that = this
+			if (!this._empty(this.val)) {
+				qrcode = new QRCode({
+					context: that, // 涓婁笅鏂囩幆澧�
+					canvasId:that.cid, // canvas-id
+					usingComponents: that.usingComponents, // 鏄惁鏄嚜瀹氫箟缁勪欢
+					showLoading: that.showLoading, // 鏄惁鏄剧ずloading
+					loadingText: that.loadingText, // loading鏂囧瓧
+					text: that.val, // 鐢熸垚鍐呭
+					size: that.cpSize, // 浜岀淮鐮佸ぇ灏�
+					background: that.background, // 鑳屾櫙鑹�
+					foreground: that.foreground, // 鍓嶆櫙鑹�
+					pdground: that.pdground, // 瀹氫綅瑙掔偣棰滆壊
+					correctLevel: that.lv, // 瀹归敊绾у埆
+					image: that.icon, // 浜岀淮鐮佸浘鏍�
+					imageSize: that.iconSize,// 浜岀淮鐮佸浘鏍囧ぇ灏�
+					cbResult: function (res) { // 鐢熸垚浜岀淮鐮佺殑鍥炶皟
+						that._result(res)
+					},
+				});
+			} else {
+				uni.showToast({
+					title: '浜岀淮鐮佸唴瀹逛笉鑳戒负绌�',
+					icon: 'none',
+					duration: 2000
+				});
+			}
+		},
+		_clearCode() {
+			this._result('')
+			qrcode.clear()
+		},
+		_saveCode() {
+			let that = this;
+			if (this.result != "") {
+				uni.saveImageToPhotosAlbum({
+					filePath: that.result,
+					success: function () {
+						uni.showToast({
+							title: '浜岀淮鐮佷繚瀛樻垚鍔�',
+							icon: 'success',
+							duration: 2000
+						});
+					}
+				});
+			}
+		},
+		_result(res) {
+			this.result = res;
+			this.$emit('result', res)
+		},
+		_empty(v) {
+			let tp = typeof v,
+				rt = false;
+			if (tp == "number" && String(v) == "") {
+				rt = true
+			} else if (tp == "undefined") {
+				rt = true
+			} else if (tp == "object") {
+				if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+			} else if (tp == "string") {
+				if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+			} else if (tp == "function") {
+				rt = false
+			}
+			return rt
+		}
+	},
+	watch: {
+		size: function (n, o) {
+			if (n != o && !this._empty(n)) {
+				this.cSize = n
+				if (!this._empty(this.val)) {
+					setTimeout(() => {
+						this._makeCode()
+					}, 100);
+				}
+			}
+		},
+		val: function (n, o) {
+			if (this.onval) {
+				if (n != o && !this._empty(n)) {
+					setTimeout(() => {
+						this._makeCode()
+					}, 0);
+				}
+			}
+		}
+	},
+	computed: {
+		cpSize() {
+			if(this.unit == "upx"){
+				return uni.upx2px(this.size)
+			}else{
+				return this.size
+			}
+		}
+	},
+	mounted: function () {
+		if (this.loadMake) {
+			if (!this._empty(this.val)) {
+				setTimeout(() => {
+					this._makeCode()
+				}, 0);
+			}
+		}
+	},
+}
+</script>
+<style>
+.tki-qrcode {
+  position: relative;
+}
+.tki-qrcode-canvas {
+  position: fixed;
+  top: -99999upx;
+  left: -99999upx;
+  z-index: -99999;
+}
+</style>
diff --git a/h5.html b/h5.html
new file mode 100644
index 0000000..b60914a
--- /dev/null
+++ b/h5.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+	<head>
+		<meta charset="utf-8">
+		<meta http-equiv="X-UA-Compatible" content="IE=edge">
+		<meta name="keywords" content="PoweredByJeeSiteV4.0"/>
+		<meta name="description" content="PoweredByJeeSiteV4.0"/>
+		<link rel="shortcut icon" type="image/x-icon" href="<%= BASE_URL %>static/custom/favicon.png">
+		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+		<title><%= htmlWebpackPlugin.options.title %></title>
+		<script>
+			window.onresize = function () {
+				if (document.documentElement.clientWidth >= 768) {
+					window.location.href = '<%= BASE_URL %>static/#/';
+				}
+			};
+			window.onresize();
+		</script>
+		<!-- 姝e紡鍙戝竷鐨勬椂鍊欎娇鐢紝寮�鍙戞湡闂翠笉鍚敤銆傗啌 -->
+        <script src="<%= BASE_URL %>static/common/js/touch-emulator.js"></script>
+		<script>
+            TouchEmulator();
+		</script>
+        <style>
+            ::-webkit-scrollbar{
+                display: none;
+            }
+        </style>
+        <!-- 姝e紡鍙戝竷鐨勬椂鍊欎娇鐢紝寮�鍙戞湡闂翠笉鍚敤銆傗啈 -->
+		<script>
+			document.addEventListener('DOMContentLoaded', function() {
+				document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px'
+			})
+		</script>
+		<link rel="stylesheet" href="<%= BASE_URL %>static/index.css" />
+	</head>
+	<body>
+		<!-- 璇ユ枃浠朵负 H5 骞冲彴鐨勬ā鏉� HTML锛屽苟闈炲簲鐢ㄥ叆鍙c�� -->
+		<!-- 璇峰嬁鍦ㄦ鏂囦欢缂栧啓椤甸潰浠g爜鎴栫洿鎺ヨ繍琛屾鏂囦欢銆� -->
+		<!-- 璇﹁鏂囨。锛歨ttps://uniapp.dcloud.io/collocation/manifest?id=h5-template -->
+		<noscript>
+			<strong>鏈珯鐐瑰繀椤昏寮�鍚疛avaScript鎵嶈兘杩愯</strong>
+		</noscript>
+		<div id="app"></div>
+		<!-- built files will be auto injected -->
+		<script>
+			/*BAIDU_STAT*/
+		</script>
+	</body>
+</html>
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..b81e8ef
--- /dev/null
+++ b/main.js
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+import Vue from 'vue';
+import App from './App';
+
+Vue.config.productionTip = false;
+
+App.mpType = 'app';
+
+// 寮曞叆鍏ㄥ眬 uView 妗嗘灦
+import uView from 'uview-ui';
+Vue.use(uView);
+
+// 鍏ㄥ眬瀛樺偍 vuex 鐨勫皝瑁�
+import store from '@/store';
+
+// 寮曞叆 uView 鎻愪緵鐨勫 vuex 鐨勭畝鍐欐硶鏂囦欢
+let vuexStore = require('@/store/$u.mixin.js');
+Vue.mixin(vuexStore);
+
+// 寮曞叆 uView 瀵瑰皬绋嬪簭鍒嗕韩鐨� mixin 灏佽
+let mpShare = require('uview-ui/libs/mixin/mpShare.js');
+Vue.mixin(mpShare);
+
+// Vue i18n 鍥介檯鍖�
+import VueI18n from '@/common/vue-i18n.min.js';
+Vue.use(VueI18n);
+
+// i18n 閮ㄥ垎鐨勯厤缃紝寮曞叆璇█鍖咃紝娉ㄦ剰璺緞
+import lang_zh_CN from '@/common/locales/zh_CN.js';
+import lang_en from '@/common/locales/en.js';
+
+const i18n = new VueI18n({
+	// 榛樿璇█
+	locale: 'zh_CN',
+	// 寮曞叆璇█鏂囦欢
+	messages: {
+		'zh_CN': lang_zh_CN,
+		'en': lang_en,
+	}
+});
+
+// 鐢变簬寰俊灏忕▼搴忕殑杩愯鏈哄埗闂锛岄渶澹版槑濡備笅涓�琛岋紝H5鍜孉PP闈炲繀濉�
+Vue.prototype._i18n = i18n;
+const app = new Vue({
+	i18n,
+	store,
+	...App
+});
+
+// http 鎷︽埅鍣紝灏嗘閮ㄥ垎鏀惧湪 new Vue() 鍜� app.$mount() 涔嬮棿锛屾墠鑳� App.vue 涓甯镐娇鐢�
+import httpInterceptor from '@/common/http.interceptor.js';
+Vue.use(httpInterceptor, app);
+
+// http 鎺ュ彛 API 鎶界锛屽厤浜庡啓 url 鎴栬�呬竴浜涘浐瀹氱殑鍙傛暟
+import httpApi from '@/common/http.api.js';
+Vue.use(httpApi, app);
+
+app.$mount();
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..1a453f9
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,192 @@
+{
+    "name" : "姹熶笢鍚堥噾MES",
+    "appid" : "__UNI__2E031D3",
+    "description" : "pigcloud",
+    "versionName" : "4.0.2",
+    "versionCode" : 2,
+    "transformPx" : false,
+    "app-plus" : {
+        "compilerVersion" : 3,
+        "optimization" : {
+            "subPackages" : true
+        },
+        "safearea" : {
+            "bottom" : {
+                "offset" : "none"
+            }
+        },
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        "compatible" : {
+            "ignoreVersion" : true
+        },
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "modules" : {
+            "Bluetooth" : {}
+        },
+        "distribute" : {
+            "android" : {
+                "permissions" : [
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>",
+                    "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>",
+                    "<uses-permission android:name=\"android.permission.BLUETOOTH_CONNECT\"/> ",
+                    "<uses-permission android:name=\"android.permission.BLUETOOTH_SCAN\"/>"
+                ],
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ]
+            },
+            "ios" : {
+                "dSYMs" : false
+            },
+            "sdkConfigs" : {
+                "ad" : {},
+                "oauth" : {}
+            },
+            "icons" : {
+                "android" : {
+                    "hdpi" : "C:/Users/MLL/Desktop/03ae6e42ca681ffd98737b6a20f94d0.png",
+                    "xhdpi" : "C:/Users/MLL/Desktop/03ae6e42ca681ffd98737b6a20f94d0.png",
+                    "xxhdpi" : "C:/Users/MLL/Desktop/03ae6e42ca681ffd98737b6a20f94d0.png",
+                    "xxxhdpi" : "C:/Users/MLL/Desktop/03ae6e42ca681ffd98737b6a20f94d0.png"
+                },
+                "ios" : {
+                    "appstore" : "",
+                    "ipad" : {
+                        "app" : "",
+                        "app@2x" : "",
+                        "notification" : "",
+                        "notification@2x" : "",
+                        "proapp@2x" : "",
+                        "settings" : "",
+                        "settings@2x" : "",
+                        "spotlight" : "",
+                        "spotlight@2x" : ""
+                    },
+                    "iphone" : {
+                        "app@2x" : "",
+                        "app@3x" : "",
+                        "notification@2x" : "",
+                        "notification@3x" : "",
+                        "settings@2x" : "",
+                        "settings@3x" : "",
+                        "spotlight@2x" : "",
+                        "spotlight@3x" : ""
+                    }
+                }
+            },
+            "splashscreen" : {
+                "androidStyle" : "common"
+            }
+        },
+        "nativePlugins" : {
+            "JCSDK-JCApiModule" : {
+                "__plugin_info__" : {
+                    "name" : "绮捐嚕鎵撳嵃鏈烘帴鍏ユ彃浠�",
+                    "description" : "绮捐嚕绯诲垪鎵撳嵃鏈烘墦鍗版彃浠�",
+                    "platforms" : "Android,iOS",
+                    "url" : "https://ext.dcloud.net.cn/plugin?id=10011",
+                    "android_package_name" : "uni.UNI2E031D3",
+                    "ios_bundle_id" : "",
+                    "isCloud" : true,
+                    "bought" : 1,
+                    "pid" : "10011",
+                    "parameters" : {}
+                }
+            }
+        }
+    },
+    "quickapp" : {},
+    "mp-weixin" : {
+        "appid" : "wxf3e5cc7116d23b18",
+        "setting" : {
+            "urlCheck" : false,
+            "es6" : false,
+            "minified" : true,
+            "postcss" : true
+        },
+        "optimization" : {
+            "subPackages" : true
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true,
+        "component2" : true
+    },
+    "mp-qq" : {
+        "optimization" : {
+            "subPackages" : true
+        },
+        "appid" : ""
+    },
+    "mp-baidu" : {
+        "usingComponents" : true,
+        "appid" : ""
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true,
+        "appid" : ""
+    },
+    "h5" : {
+        "template" : "h5.html",
+        "router" : {
+            "mode" : "hash",
+            "base" : "./"
+        },
+        "optimization" : {
+            "treeShaking" : {
+                "enable" : false
+            }
+        },
+        "devServer" : {
+            "port" : 8080, //娴忚鍣ㄨ繍琛岀鍙�
+            "disableHostCheck" : true,
+            "proxy" : {
+                "/auth" : {
+                    "target" : "http://192.168.32.65:9999",
+                    "changeOrigin" : true,
+                    "secure" : false
+                },
+                "/mes" : {
+                    "target" : "http://192.168.32.65:9999",
+                    "changeOrigin" : true,
+                    "secure" : false
+                },
+                "/admin" : {
+                    "target" : "http://192.168.32.65:9999",
+                    "changeOrigin" : true,
+                    "secure" : false
+                }
+            }
+        },
+        "title" : "Asun-Mes",
+        "domain" : "/app"
+    },
+    "locale" : "zh-Hans",
+    "fallbackLocale" : "zh-Hans"
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..38cb8ba
--- /dev/null
+++ b/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "pigx-app",
+  "version": "4.4.0",
+  "description": "pigx 绉诲姩绔В鍐虫柟妗�",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://pig4cloud.com"
+  },
+  "dependencies": {
+    "crypto-js": "^3.3.0",
+    "qs": "^6.9.7",
+    "vue-i18n": "^8.20.0"
+  }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..785099e
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,802 @@
+{
+  "easycom": {
+    "^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
+  },
+  "pages": [
+    /* 鐧诲綍 */
+    {
+      "path": "pages/sys/login/index",
+      "style": {
+        "navigationStyle": "custom"
+      }
+    },
+    /*缁戝畾鐢ㄦ埛*/
+    {
+      "path": "pages/sys/login/bindUser",
+      "style": {
+        "navigationBarTitleText": "缁戝畾鐢ㄦ埛"
+      }
+    },
+    /*鐢ㄦ埛绠$悊*/
+    {
+      "path": "pages/sys/pigxUser/index",
+      "style": {
+        "navigationBarTitleText": "鐢ㄦ埛绠$悊"
+      }
+    },
+    {
+      "path": "pages/sys/pigxUser/form",
+      "style": {
+        "navigationBarTitleText": "鐢ㄦ埛淇℃伅"
+      }
+    },
+    /*浠ょ墝绠$悊*/
+    {
+      "path": "pages/sys/token/index",
+      "style": {
+        "navigationBarTitleText": "浠ょ墝绠$悊"
+      }
+    },
+    /*鏃ュ織绠$悊*/
+    {
+      "path": "pages/sys/logs/index",
+      "style": {
+        "navigationBarTitleText": "鏃ュ織绠$悊"
+      }
+    },
+    {
+      "path": "pages/sys/logs/form",
+      "style": {
+        "navigationBarTitleText": "鏃ュ織淇℃伅"
+      }
+    },
+    /**宀椾綅绠$悊**/
+    {
+      "path": "pages/sys/pigxPost/index",
+      "style": {
+        "navigationBarTitleText": "宀椾綅绠$悊"
+      }
+    },
+    {
+      "path": "pages/sys/pigxPost/form",
+      "style": {
+        "navigationBarTitleText": "宀椾綅璇︽儏"
+      }
+    },
+    /**绉熸埛绠$悊**/
+    {
+      "path": "pages/sys/pigxTenant/index",
+      "style": {
+        "navigationBarTitleText": "绉熸埛绠$悊"
+      }
+    },
+    {
+      "path": "pages/sys/pigxTenant/form",
+      "style": {
+        "navigationBarTitleText": "绉熸埛璇︽儏"
+      }
+    },
+    /**瑙掕壊绠$悊**/
+    {
+      "path": "pages/sys/pigxRole/index",
+      "style": {
+        "navigationBarTitleText": "瑙掕壊绠$悊"
+      }
+    },
+    {
+      "path": "pages/sys/pigxRole/form",
+      "style": {
+        "navigationBarTitleText": "瑙掕壊璇︽儏"
+      }
+    },
+    /**鍙傛暟绠$悊**/
+    {
+      "path": "pages/sys/pigxParam/index",
+      "style": {
+        "navigationBarTitleText": "鍙傛暟閰嶇疆"
+      }
+    },
+    {
+      "path": "pages/sys/pigxParam/form",
+      "style": {
+        "navigationBarTitleText": "鍙傛暟璇︽儏"
+      }
+    },
+    /* 涓婚〉 */
+    {
+      "path": "pages/sys/home/index",
+      "style": {
+        "navigationBarTitleText": "棣栭〉",
+        "navigationBarBackgroundColor": "#0052d9"
+        // "app-plus": {
+        //   "titleNView": {
+        //     "buttons": [
+        //       {
+        //         "text": "娓呯┖",
+        //         "type": "none",
+        //         "color": "#ffffff",
+        //         "fontSize": "14px"
+        //       }
+        //     ]
+        //   }
+        // }
+      }
+    },
+    /* 鐢ㄦ埛 */
+    {
+      "path": "pages/sys/user/index",
+      "style": {
+        "navigationBarTitleText": "鐢ㄦ埛涓績",
+        "backgroundColor": "#f8f8f8",
+        "navigationBarBackgroundColor": "#0052d9",
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/sys/user/info",
+      "style": {
+        "navigationBarTitleText": "涓汉淇℃伅"
+      }
+    },
+    {
+      "path": "uview-ui/components/u-avatar-cropper/u-avatar-cropper",
+      "style": {
+        "navigationBarTitleText": "澶村儚瑁佸壀",
+        "navigationBarBackgroundColor": "#000000"
+      }
+    },
+    {
+      "path": "pages/sys/user/pwd",
+      "style": {
+        "navigationBarTitleText": "淇敼瀵嗙爜"
+      }
+    },
+    /* Common */
+    {
+      "path": "pages/common/webview",
+      "style": {
+        "navigationBarTitleText": "娴忚缃戦〉"
+      }
+    },
+    /** 宸ヤ綔娴� **/
+    {
+      "path": "pages/oa/form",
+      "style": {
+        "navigationBarTitleText": "鍙戣捣浠诲姟"
+      }
+    },
+    {
+      "path": "pages/oa/history",
+      "style": {
+        "navigationBarTitleText": "璇峰亣鍒楄〃"
+      }
+    },
+    {
+      "path": "pages/oa/todos",
+      "style": {
+        "navigationBarTitleText": "寰呭姙浠诲姟"
+      }
+    },
+    {
+      "path": "pages/oa/task",
+      "style": {
+        "navigationBarTitleText": "浠诲姟澶勭悊"
+      }
+    },
+    {
+      "path": "pages/wareHouse/moveWareHouse/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/moveWareHouse/locNoList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/finishProductIn/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/materialReturn/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/finishProductIn/locNoList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/packing/personnelList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/jumpFinishProductIn/index",
+      "style": {
+        "navigationBarTitleText": "璺崇嚎鎴愬搧鍏ュ簱",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/pick/index",
+      "style": {
+        "navigationBarTitleText": "璐х洏杩愯緭浠诲姟鍒楄〃",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/pick/materialTransfer",
+      "style": {
+        "navigationBarTitleText": "鍘熸潗鏂欑Щ搴�",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/feed/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/feed/workstationList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/feed/optaskList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/feed/locationList",
+      "style": {
+        "navigationBarTitleText": "搴撲綅",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/feed/feedRecordList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/index",
+      "style": {
+        "navigationBarTitleText": "浜у嚭鐧昏",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/workstationList",
+      "style": {
+        "navigationBarTitleText": "宸ヤ綔绔�",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/optaskList",
+      "style": {
+        "navigationBarTitleText": "宸ュ崟",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/addProductOut",
+      "style": {
+        "navigationBarTitleText": "鏂板浜у嚭",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/shiftProductOut",
+      "style": {
+        "navigationBarTitleText": "浜ょ彮浜у嚭",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/editProductOut",
+      "style": {
+        "navigationBarTitleText": "缂栬緫浜у嚭",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/dutyPersonList",
+      "style": {
+        "navigationBarTitleText": "褰撶彮浜哄憳",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/productInList",
+      "style": {
+        "navigationBarTitleText": "鎶曞叆鍒楄〃",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/workstationFeedList",
+      "style": {
+        "navigationBarTitleText": "鏈烘枡",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/util/bleConnect",
+      "style": {
+        "navigationBarTitleText": "钃濈墮杩炴帴"
+      }
+    },
+    {
+      "path": "pages/product/outputRegister/printProductOutLabel",
+      "style": {
+        "navigationBarTitleText": "鍗婃垚鍝佹爣绛炬墦鍗�"
+      }
+    },
+    {
+      "path": "pages/product/pick/requirePartRecordList",
+      "style": {
+        "navigationBarTitleText": "鐗╂枡闇�姹�",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/pick/moveDetailRecordList",
+      "style": {
+        "navigationBarTitleText": "绉诲簱鏄庣粏",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/pick/ifsLocationList",
+      "style": {
+        "navigationBarTitleText": "IFS搴撲綅",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/pick/ifsStock",
+      "style": {
+        "navigationBarTitleText": "褰撳墠闆朵欢IFS搴撳瓨",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/pick/materialNeed",
+      "style": {
+        "navigationBarTitleText": "瀵瑰簲鐗╂枡闇�姹�",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/wareHouse/packing/index",
+      "style": {
+        "navigationBarTitleText": "鍖呰",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/wareHouse/packing/form",
+      "style": {
+        "navigationBarTitleText": "鏂板鍖呰",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/wareHouse/packing/detail",
+      "style": {
+        "navigationBarTitleText": "鍖呰绉诲簱",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/wareHouse/outsource/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/outsource/report",
+      "style": {
+        "navigationBarTitleText": "鎶ユ",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/wareHouse/outsource/sampling",
+      "style": {
+        "navigationBarTitleText": "鎶芥鎴愬搧",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/wareHouse/outsource/check",
+      "style": {
+        "navigationBarTitleText": "妫�娴�",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/wareHouse/outsource/packing",
+      "style": {
+        "navigationBarTitleText": "鍖呰",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/wareHouse/outsource/instock",
+      "style": {
+        "navigationBarTitleText": "鍏ュ簱",
+        "enablePullDownRefresh": false,
+        "navigationStyle": "custom"
+      }
+    },
+    {
+      "path": "pages/wareHouse/inventory/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/inventory/detail",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/inventory/partchoose",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/inventory/locNoList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/productBack/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/wareHouse/jumpZTE/jumpZTE",
+      "style": {
+        "navigationBarTitleText": "璺崇嚎涓叴闃插憜",
+        "enablePullDownRefresh": false,
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/wareHouse/packing/registration",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/tailHandle/index",
+      "style": {
+        "navigationBarTitleText": "灏炬枡澶勭悊",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/tailHandle/workstationList",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/operationTaskInfo",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/workstationList/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#CEE3FE",
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/workstationList/workstationList",
+      "style": {
+        "navigationBarTitleText": "宸ヤ綔绔�",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    {
+      "path": "pages/product/produce/reportWork",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#3281FF"
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/createReportWork",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#3281FF"
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/editReportWork",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#3281FF"
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/workstationList/dutyRecordHistory",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#3281FF"
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/workstationList/unSubmitDutyRecord",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#3281FF"
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/produce/workstationList/dutyRecordWorkstation",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "",
+        // "navigationBarBackgroundColor": "#3281FF"
+        "enablePullDownRefresh": false
+      }
+    },
+    {
+      "path": "pages/product/labelPrint/labelPrint",
+      "style": {
+        "navigationBarTitleText": "鏍囩鍒楄〃",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#3281FF"
+      }
+    },
+    // 鐢熶骇鐩稿叧
+    {
+      "path": "pages/product/report/index",
+      "style": {
+        "navigationBarTitleText": "鎶ュ伐",
+        "navigationBarBackgroundColor": "#0052d9",
+        "app-plus": {
+          "titleNView": {
+            "buttons": [
+              {
+                "text": "娓呯┖",
+                "type": "none",
+                "color": "#ffffff",
+                "fontSize": "14px"
+              }
+            ]
+          }
+        }
+      }
+    },
+    // 鏃ユ姤鐩稿叧
+    {
+      "path": "pages/daily/common/work-order-list",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "宸ュ崟鍒楄〃",
+        "navigationBarTextStyle": "black",
+        "navigationBarBackgroundColor": "#DAE6FB"
+      }
+    },
+    {
+      "path": "pages/daily/production-person/production-person",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTitleText": "浜哄憳鍒楄〃",
+        "navigationBarTextStyle": "black",
+        "navigationBarBackgroundColor": "#DAE6FB"
+      }
+    },
+    {
+      "path": "pages/daily/handyman/handyman",
+      "style": {
+        "navigationBarTitleText": "鏉傚伐",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#214DED"
+      }
+    },
+    {
+      "path": "pages/daily/daily/daily-list",
+      "style": {
+        "navigationBarTitleText": "鏃ユ姤璁板綍",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#214DED"
+      }
+    },
+    {
+      "path": "pages/daily/workstation/index",
+      "style": {
+        "navigationBarTitleText": "宸ヤ綔绔�",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#214DED"
+      }
+    },
+    {
+      "path": "pages/daily/tag-list/index",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTextStyle": "white"
+      }
+    },
+    {
+      "path": "pages/daily/tag-list/add",
+      "style": {
+        "navigationBarTitleText": "鐢熸垚鏁伴噺",
+        "navigationBarTextStyle": "white",
+        "navigationBarBackgroundColor": "#214DED"
+      }
+    },
+    {
+      "path": "pages/daily/common/work-reporting",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTextStyle": "white"
+      }
+    },
+    {
+      "path": "pages/daily/common/work-reporting-detail",
+      "style": {
+        "navigationStyle": "custom",
+        "navigationBarTextStyle": "white"
+      }
+    }
+  ],
+  "subPackages": [],
+  "preloadRule": {},
+  "globalStyle": {
+    "navigationBarTextStyle": "white",
+    "navigationBarTitleText": "PIGCLOUD",
+    "navigationBarBackgroundColor": "#f8f8f8"
+  },
+  "tabBar": {
+    "color": "#909399",
+    "selectedColor": "#303133",
+    "backgroundColor": "#ffffff",
+    "borderStyle": "white",
+    "list": [
+      {
+        "pagePath": "pages/sys/home/index",
+        "iconPath": "static/custom/tabbar/home_1.png",
+        "selectedIconPath": "static/custom/tabbar/home_2.png",
+        "text": "涓婚〉"
+      },
+      {
+        "pagePath": "pages/sys/user/index",
+        "iconPath": "static/custom/tabbar/my_1.png",
+        "selectedIconPath": "static/custom/tabbar/my_2.png",
+        "text": "鎴戠殑"
+      }
+    ]
+  }
+}
diff --git a/pages/common/common.scss b/pages/common/common.scss
new file mode 100644
index 0000000..408f9cb
--- /dev/null
+++ b/pages/common/common.scss
@@ -0,0 +1,156 @@
+.wrap {
+
+  .search{
+    padding: 20rpx 20rpx 0;
+    background: #f8f8f8;
+    height: 105rpx;
+  }
+
+  .scroll-list {
+    height: calc(100vh - var(--window-top) - var(--window-bottom) - 105rpx); // 105rpx 涓� .search 鐨勯珮搴�
+    width: 100%;
+
+    .loadmore {
+      padding: 30rpx;
+    }
+  }
+
+  .box {
+    padding-bottom: 10rpx;
+
+    .item {
+      margin: 0 20rpx 20rpx;
+      padding: 8rpx 20rpx;
+      border-radius: 20rpx;
+      box-sizing: border-box;
+      background-color: #fff;
+      font-size: 28rpx;
+
+      .title {
+        display: flex;
+        justify-content: space-between;
+        background-color: #fff;
+        padding-left: 15rpx;
+        align-items: center;
+
+        .text {
+          margin: 0 20rpx;
+          font-size: 35rpx;
+          font-weight: bold;
+        }
+
+      }
+    }
+
+  }
+
+  .list {
+
+    .u-cell-item-box {
+
+      .u-swipe-content {
+        width: 750rpx;
+      }
+
+      .u-cell_title {
+        overflow: hidden;
+        white-space: nowrap;
+        text-overflow: ellipsis;
+        min-width: 655rpx;
+      }
+
+      .u-border-bottom:last-child:after {
+        border-bottom: 0;
+      }
+    }
+  }
+
+  .form {
+    display: flex;
+    flex-direction: column;
+    padding: 20rpx 30rpx;
+
+    .u-cell-item-box {
+      border-radius: 20rpx;
+    }
+  }
+
+  .form-footer {
+    display: flex;
+    margin: 10rpx;
+    padding-bottom: 30rpx;
+
+    .btn {
+      flex: 1;
+      margin: 10rpx;
+    }
+  }
+
+  .u-cell-box {
+
+    .u-cell {
+      font-size: 30rpx;
+    }
+
+    .u-cell_title {
+      font-size: 30rpx;
+    }
+
+    .u-cell__left-icon-wrap {
+      margin-right: 18rpx;
+    }
+  }
+
+  .span-lable {
+    padding-right: 20rpx;
+    color: #909399;
+  }
+
+  .row-list {
+    padding-top: 10rpx;
+  }
+
+  .card-foot {
+    text-align: center;
+	button {
+	  margin: 20rpx;
+	}
+  }
+
+}
+
+
+.btn-plus {
+  position: fixed;
+  bottom: 2rem;
+  right: 0.5rem;
+  z-index: 9999;
+}
+
+.btn-plus:hover {
+  opacity: 1;
+}
+
+.u-icon {
+  position: relative;
+  color: #9E9E9E;
+}
+
+.view-fixed-one {
+  position: fixed;
+  bottom: 4.5rem;
+  right: 0.5rem;
+  z-index: 9999;
+}
+
+.view-fixed-two {
+  position: fixed;
+  bottom: 0rem;
+  right: 0rem;
+  z-index: 9999;
+}
+
+.mask-content{
+	height: 100%;
+	background-color: #fff;
+}
\ No newline at end of file
diff --git a/pages/common/webview.vue b/pages/common/webview.vue
new file mode 100644
index 0000000..f7c6bfa
--- /dev/null
+++ b/pages/common/webview.vue
@@ -0,0 +1,33 @@
+<template>
+	<view>
+		<web-view :webview-styles="webviewStyles" :src="webviewUrl"></web-view>
+	</view>
+</template>
+<script>
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+export default {
+	data() {
+		return {
+			webviewUrl: '',
+			webviewStyles: {
+				progress: {
+					color: '#FF7200'
+				}
+			}
+		};
+	},
+	onLoad(params) {
+		this.webviewUrl = decodeURIComponent(params.url);
+		if (params.title != ''){
+			uni.setNavigationBarTitle({
+				title: params.title
+			})
+		}
+	}
+};
+</script>
+<style lang="scss">
+	
+</style>
diff --git a/pages/daily/common/work-order-list.vue b/pages/daily/common/work-order-list.vue
new file mode 100644
index 0000000..259e537
--- /dev/null
+++ b/pages/daily/common/work-order-list.vue
@@ -0,0 +1,359 @@
+<template>
+  <view class="work-order-list">
+    <view class="page-head">
+      <u-navbar title="宸ュ崟鍒楄〃"  :border-bottom="false"
+      :background="background"
+      :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+      <view class="search">
+        <u-search placeholder="璇疯緭鍏ラ攢鍞鍗曞彿鎼滅储" v-model="query.keyWord" bgColor="#fff"
+        placeholderColor="#999999" :showAction="false" style="margin: 35rpx;"
+        searchIconColor="#6A6A6A" height="74" @search="search" @change="search"></u-search>
+        <u-icon name="scan" color="#2979ff" size="40" class="icon" @click="scanCode"></u-icon>
+      </view>
+      <view class="tab">
+        <span v-for="(item,index) in tabs" :key="index" @click="changeTab(item)" :class="{active:currentTab===item.value}">{{ item.label }}</span>
+      </view>
+    </view>
+    <scroll-view class="scroll-list" scroll-y="true">
+			<view v-for="(item,index) in list" :key="'item'+index" class="list-item">
+        <view class="work" @click="goWorkReporting(item)">
+          <span>鎶ュ伐</span>
+	        <u-icon class="icon_right" size="24rpx"/>
+        </view>
+        <h4>
+	        <u-icon class="icon_5" size="24rpx"/>
+          <text selectable="true">{{ item.optaskNo }}</text>
+        </h4>
+        <view class="item-box">
+          <p>
+	          <u-icon class="icon_7" size="24rpx"/>
+            <text selectable="true">鍥惧彿锛歿{item.drawNo}}</text>
+          </p>
+          <p>
+	          <u-icon class="icon_6" size="24rpx"/>
+            <text selectable="true">闆朵欢鍚嶇О锛歿{item.partName}}</text>
+          </p>
+          <p>
+	          <u-icon class="icon_8" size="24rpx"/>
+            <text selectable>璁″垝瀹屾垚鏃堕棿锛歿{item.plannedFinishDate}}</text>
+          </p>
+          <view class="progress">
+            <u-line-progress :percent="(item.completedQuantity/item.plannedQuantity)*100" :show-percent="false" :round="false"
+            active-color="#214DED" height="23" style="margin-left: 30rpx;"></u-line-progress>
+            <span style="font-weight: 500;font-size: 26rpx;color: #999999;margin-left: 18rpx;"><span style="color: #333333;">{{ item.completedQuantity }}</span>/{{ item.plannedQuantity }}</span>
+          </view>
+        </view>
+      </view>
+	    <p v-if="list.length === 0" style="text-align: center;margin-top: 100rpx;color: rgb(96, 98, 102);
+    font-size: 28rpx;">鏆傛棤鏁版嵁</p>
+		</scroll-view>
+
+  </view>
+</template>
+
+<script>
+import content_bg from '@/static/custom/daily/img8.png'
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+export default {
+	components: {UIcon},
+  data() {
+    return {
+      background: {
+        // background:'transparent'
+        backgroundImage: `url(${content_bg})`,
+        backgroundAttachment: 'fixed',
+        backgroundSize: '100% auto',
+        backgroundRepeat: 'no-repeat',
+      },
+      tabs:[
+	      {
+		      label: '鍏ㄩ儴',
+		      value: ''
+	      },
+	      {
+					label: '寰呭紑濮�',
+		      value: '01pending'
+	      },
+	      {
+					label: '杩涜涓�',
+		      value: '02inProgress'
+	      },
+      ],
+      currentTab: '',
+      loadStatus: 'loadmore',
+      total:0,
+      query:{
+	      workstationId: '',
+	      toId: '',
+	      clazzType: '',
+	      state: '',
+	      keyWord: ''
+      },
+      list:[],
+	  toId: '',
+	  workstationId: '',
+	  dutyNo: '',
+	  clazzType: '',
+	  userStaffNo: [],
+	  workstationName: '',
+	  staffNameJoin: ''
+    }
+  },
+  onLoad(e) {
+		this.workstationId = e.workstationId
+		this.toId = e.toId
+		this.clazzType = e.clazzType
+		this.dutyNo = e.dutyNo
+		this.userStaffNo = e.userStaffNo
+		this.workstationName = e.workstationName
+		this.staffNameJoin = e.staffNameJoin
+
+	  this.query = {
+		  workstationId: this.workstationId,
+		  toId: this.toId,
+		  clazzType: this.clazzType
+	  }
+	  this.loadList();
+  },
+	onShow () {
+		this.loadList();
+	},
+  methods: {
+    changeTab(item){
+      this.currentTab = item.value;
+			this.search()
+    },
+    // 鍦ㄦ鍔犺浇鍒楄〃
+    loadList(){
+      this.$u.api.dailyPaper.getOperationTask(this.query).then(res => {
+		  console.log(res)
+        if (res.code === 0) {
+	        this.list = res.data
+	        this.list.forEach(item => {
+		        item.plannedFinishDate = item.plannedFinishDate.slice(0,10)
+	        })
+        }
+      });
+    },
+	  // 鎼滅储
+	  search(e){
+			if (e) {
+				this.query.keyWord = e
+			} else {
+				this.query = {
+					workstationId: this.workstationId,
+					toId: this.toId,
+					clazzType: this.clazzType,
+					state: this.currentTab
+				}
+			}
+		  this.loadList()
+	  },
+    scanCode() {
+      uni.scanCode({
+        success: async (res) => {
+          // 鎵弿缁撴灉澶勭悊閫昏緫
+	        uni.showToast({
+		        title: '鎵爜鎴愬姛',
+		        icon: 'success'
+	        })
+	         // 灏嗘壂鐮佺粨鏋滀繚瀛樺埌scanResult鍙橀噺涓�
+			var jsonObject = JSON.parse(res.result);
+	        this.query.keyWord = jsonObject.order_no
+	        this.search(jsonObject.order_no)
+        },
+        fail: (err) => {
+          console.error('鎵弿澶辫触锛�' + err);
+        }
+      });
+    },
+	  goWorkReporting (item) {
+		item.workstationId = this.workstationId
+		item.clazzType = this.clazzType
+		item.dutyNo = this.dutyNo
+		item.userStaffNo = this.userStaffNo
+		item.workstationName = this.workstationName
+		item.staffNameJoin = this.staffNameJoin
+		  uni.navigateTo({
+			  url: '/pages/daily/common/work-reporting?info=' + encodeURIComponent(JSON.stringify(item))
+		  })
+	  },
+	  goWorkReportingDetail (item) {
+		  if(item.workCenter == 'TX-01'&&item.operationName=="妯壀"){
+			  item.workstationId = this.workstationId
+			  item.clazzType = this.clazzType
+			  item.dutyNo = this.dutyNo
+			  item.userStaffNo = this.userStaffNo
+			  item.workstationName = this.workstationName
+			  item.staffNameJoin = this.staffNameJoin
+			    uni.navigateTo({
+			  	  url: '/pages/daily/common/work-reporting-detail?info=' + encodeURIComponent(JSON.stringify(item))
+			    })
+		  }
+	  }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.work-order-list{
+  width: 100%;
+  height: 100vh;
+  background: #E6EFFF;
+  overflow-y: auto;
+  box-sizing: border-box;
+  padding-bottom: 24rpx;
+	position: relative;
+  .page-head{
+    height: 376rpx;
+	  display: flex;
+	  flex-direction: column;
+	  //justify-content: flex-start;
+    background-image: url('~@/static/custom/daily/img8.png');
+		background-size: 100% 100%;
+		background-repeat: no-repeat;
+	  position: fixed;
+	  width: 100%;
+	  z-index: 99;
+    .search{
+      position: relative;
+      .icon{
+        position: absolute;
+        right: 60rpx;
+        top: 50%;
+        transform: translate(0,-50%);
+      }
+    }
+    .tab{
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      box-sizing: border-box;
+      padding: 0 32rpx;
+      font-weight: 500;
+      font-size: 36rpx;
+      color: #333333;
+      span.active{
+        color: #214DED;
+      }
+    }
+  }
+  .scroll-list{
+    box-sizing: border-box;
+    padding: 0 32rpx;
+	  top: 376rpx;
+	  overflow-y: auto;
+	  position: absolute;
+	  .list-item{
+		  background: #FFFFFF;
+		  border-radius: 10rpx;
+		  box-sizing: border-box;
+		  padding: 32rpx 16rpx;
+		  margin-bottom: 20rpx;
+		  position: relative;
+		  h4{
+			  display: flex;
+			  align-items: center;
+			  font-weight: bold;
+			  font-size: 28rpx;
+			  color: #333333;
+			  margin-bottom: 25rpx;
+			  .icon_5 {
+				  background-image: url('~@/static/custom/daily/icon_5.png');
+				  background-repeat: no-repeat;
+				  background-size: cover;
+				  height: 24rpx;
+				  width: 24rpx;
+				  margin-right: 6rpx;
+				  position: relative;
+			  }
+		  }
+		  .item-box{
+			  background: #F5F9FF;
+			  border-radius: 10rpx;
+			  box-sizing: border-box;
+			  padding: 30rpx 24rpx;
+			  p{
+				  font-weight: 500;
+				  font-size: 26rpx;
+				  color: #333333;
+				  margin-bottom: 24rpx;
+				  .icon_7 {
+					  background-image: url('~@/static/custom/daily/icon_7.png');
+					  background-repeat: no-repeat;
+					  background-size: cover;
+					  height: 24rpx;
+					  width: 24rpx;
+					  margin-right: 6rpx;
+					  margin-bottom: 6rpx;
+					  vertical-align: middle;
+					  position: relative;
+				  }
+				  .icon_6 {
+					  background-image: url('~@/static/custom/daily/icon_6.png');
+					  background-repeat: no-repeat;
+					  background-size: cover;
+					  height: 24rpx;
+					  width: 24rpx;
+					  margin-right: 6rpx;
+					  margin-bottom: 6rpx;
+					  vertical-align: middle;
+					  position: relative;
+				  }
+				  .icon_8 {
+					  background-image: url('~@/static/custom/daily/icon_8.png');
+					  background-repeat: no-repeat;
+					  background-size: cover;
+					  height: 24rpx;
+					  width: 24rpx;
+					  margin-right: 6rpx;
+					  margin-bottom: 6rpx;
+					  vertical-align: middle;
+					  position: relative;
+				  }
+			  }
+			  .progress{
+				  display: flex;
+				  align-items: center;
+				  justify-content: space-between;
+			  }
+		  }
+		  .work{
+			  position: absolute;
+			  right: 0;
+			  top: 0;
+			  width: 136rpx;
+			  height: 56rpx;
+			  background-image: url('~@/static/custom/daily/icon_bt_bg.png');
+			  background-size: 100% auto;
+			  background-repeat: no-repeat;
+			  display: flex;
+			  align-items: center;
+			  justify-content: center;
+			  color: #FFFFFF;
+			  font-weight: 500;
+			  font-size: 30rpx;
+			  .icon_right {
+				  background-image: url('~@/static/custom/daily/icon_right.png');
+				  background-repeat: no-repeat;
+				  background-size: cover;
+				  height: 24rpx;
+				  width: 24rpx;
+				  margin-left: 10rpx;
+				  margin-top: 4rpx;
+				  position: relative;
+			  }
+		  }
+	  }
+  }
+}
+::v-deep.u-close-wrap {
+	position: absolute;
+	right: 110rpx;
+}
+::v-deep.uni-input-input {
+	width: 82%;
+}
+</style>
diff --git a/pages/daily/common/work-reporting-detail.vue b/pages/daily/common/work-reporting-detail.vue
new file mode 100644
index 0000000..606eb74
--- /dev/null
+++ b/pages/daily/common/work-reporting-detail.vue
@@ -0,0 +1,710 @@
+<template>
+	<view class="work-reporting">
+		<u-navbar title="鎶ュ伐璇︽儏" :border-bottom="false" :background="background" :title-size="40" :title-bold="true"
+			title-color="#FFFFFF" back-icon-color="#fff">
+			<view class="navbar-right" slot="right" @click="searchDevice">
+				鎼滅储璁惧
+			</view>
+		</u-navbar>
+		<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y">
+			<view class="form">
+				<h3 class="form-title">鎶ュ伐淇℃伅</h3>
+				<u-icon class="icon_report" size="170rpx" />
+				<u-form :model="form" ref="uForm">
+					<!--鍙版暟-->
+					<u-form-item label="鍙版暟" prop="qty" required :label-width="180">
+						<u-input v-model="form.qty" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+					<!--浜у嚭绫诲埆-->
+					<u-form-item label="浜у嚭绫诲埆" prop="outputCategoryLabel" required :label-width="180">
+						<u-input v-model="form.outputCategoryLabel" placeholder="璇烽�夋嫨" />
+					</u-form-item>
+					<!--鐗囧-->
+					<u-form-item  label="鐗囧" prop="sliceWidth" required
+						:label-width="180">
+						<u-input v-model="form.sliceWidth" placeholder="璇烽�夋嫨" />
+					</u-form-item>
+					<!--鐗囨枡鏁伴噺-->
+					<u-form-item  label="鐗囨枡鏁伴噺" prop="sliceQty" required :label-width="180">
+						<u-input v-model="form.sliceQty" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+				</u-form>
+			</view>
+			<view class="scan-code-feeding">
+				<h3 class="form-title">鎵爜鎶曟枡</h3>
+				<view class="infoform" v-for="(item,index) in infoFormList" :key="'item'+index">
+					<p>
+						<u-icon class="icon_zl" size="24rpx" />
+						<span style="margin-right: 18rpx">鍓╀綑閲嶉噺:</span>
+						<u-input :border="true" v-model="item.qtyRequired" label="鍓╀綑閲嶉噺"
+							style="width: 450rpx;height: 56rpx;display: inline-flex;background: #F6FAFF;border-radius: 8rpx;border: 1px solid #214DED;align-items: center;"></u-input>
+					</p>
+					<p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>鎵规鍙�:{{item.lotBatchNo}}</span>
+					</p>
+					<p>
+						<u-icon class="icon_6" size="24rpx" />
+						<span>闆朵欢鍚嶇О锛歿{item.partName}}</span>
+					</p>
+					<u-divider :use-slot="false" half-width="640"></u-divider>
+					<view class="buttonFlex">
+						<button class="primary-button" type="primary"
+							plain="true" @click="printQrCode(item)">
+							<u-icon class="icon_dy" size="32rpx" />
+							鏍囩鎵撳嵃
+						</button>
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+		<u-toast ref="uToast" />
+		<view v-if="maskShow" class="uni-mask" @touchmove.stop.prevent="moveHandle" @click="maskclose">
+			<scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" @click.stop="moveHandle">
+				<view class="uni-list-box" v-for="(item, index) in listDevice" :key="index" @click="tapQuery(item)">
+					<view>
+						<view class="uni-list_name">鍚嶇О锛歿{ item.name }}</view>
+						<view class="uni-list_item">UUID:{{ item.address }}</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+	import {
+		dateFormat
+	} from "../../../utils/date"
+
+	const jcapi = uni.requireNativePlugin("JCSDK-JCApiModule");
+
+	// 浜岀淮鐮佺被鍨�
+	const QrCodeType = {
+		QrCode: 31,
+		PDF417: 32,
+		DataMatrix: 33,
+		AZTEC: 34
+	}
+	// 绾挎潯绫诲瀷
+	const LineType = {
+		Solid: 1, // 瀹炵嚎
+		Dotted: 2, // 铏氱嚎锛堥粯璁よ櫄瀹�1:1鐩搁棿锛�
+	}
+	// 鎹㈣鏂瑰紡
+	const LineModeType = {
+		Justified: 1, // 瀹介珮鍥哄畾锛屽唴瀹硅嚜閫傚簲锛堝瓧鍙�/瀛楅棿璺�/琛岄棿璺濇寜姣斾緥缂╂斁锛�
+		AutoHeight: 2, // 瀹藉害鍥哄畾锛岄珮搴﹁嚜閫傚簲
+		Fixed: 4, // 瀹介珮鍥哄畾锛岃秴鍑洪儴鍒嗚鍓�
+		Adapt: 6, // 瀹介珮鍥哄畾锛屽唴瀹硅秴杩囨椂棰勮瀹介珮鑷姩缂╁皬
+	}
+
+	export default {
+		name: "work-reporting",
+		// import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+		components: {
+			UIcon
+		},
+		data() {
+			// 杩欓噷瀛樻斁鏁版嵁
+			return {
+				background: {
+					backgroundColor: '#214DED',
+				},
+				scrollTop: 0,
+				form: {
+					clazzType: '', // 鐝
+					dutyNo: '', // 鐝缂栧彿
+					locationId: '', // 搴撲綅id
+					operationTaskId: '', // 宸ュ崟id
+					reportTime: '', // 鎻愪氦鏃堕棿
+					labelNo: '', // 鏉$爜缂栧彿
+					qty: '', // 鍙版暟
+					drawNo: '', // 鍥惧彿
+					finishQty: '', // 瀹屾垚鏁伴噺
+					identifyingQr: '', // 绾垮湀杞﹂棿-杩囪处-鎵爜缁撴灉
+					type: '', // 绫诲瀷閫夋嫨鍣細value
+					typeLabel: '', // 绫诲瀷閫夋嫨鍣細label
+					operationType: '', // 宸ュ簭绫诲瀷閫夋嫨鍣細value
+					operationTypeLabel: '', // 宸ュ簭绫诲瀷閫夋嫨鍣細label
+					outputCategory: '', // 浜у嚭绫诲埆锛歷alue
+					outputCategoryLabel: '', // 浜у嚭绫诲埆锛歭abel
+					length: '', // 闀垮害,
+					siliconSteelCode: '', // 鎵爜鑾峰彇鍘傚淇℃伅鏉ユ枡妫�淇℃伅
+					sliceWidth: '', // 鐗囧
+					sliceQty: '', // 鐗囨枡鏁伴噺
+					clampOtherWeight: '', // 澶逛欢鍙婂叾浠栭噸閲�
+				},
+				num: '',
+				rules: {
+					labelNo: [{
+						required: true,
+						message: '璇烽�夋嫨鎵爜鎴栬緭鍏ョ紪鍙�',
+						trigger: ['blur'],
+					}],
+					typeLabel: [ // 绫诲瀷
+						{
+							required: true,
+							message: '璇烽�夋嫨绫诲瀷',
+							trigger: ['change'],
+						}
+					],
+					qty: [ // 鍙版暟
+						{
+							required: true,
+							message: '璇峰~鍐欏彴鏁�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					operationTypeLabel: [ // 宸ュ簭绫诲瀷
+						{
+							required: true,
+							message: '璇烽�夋嫨宸ュ簭绫诲瀷',
+							trigger: ['change'],
+						}
+					],
+					finishQty: [ // 瀹屾垚鏁伴噺
+						{
+							required: true,
+							message: '璇峰~鍐欏畬鎴愭暟閲�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					length: [ // 闀垮害,
+						{
+							required: true,
+							message: '璇峰~鍐欓暱搴�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					outputCategoryLabel: [ // 鐗囧
+						{
+							required: true,
+							message: '璇峰~鍐欑墖瀹�',
+							trigger: ['change'],
+						}
+					],
+					sliceQty: [ // 鐗囨枡鏁伴噺
+						{
+							required: true,
+							message: '璇峰~鍐欑墖鏂欐暟閲�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					clampOtherWeight: [ // 澶逛欢鍙婂叾浠栭噸閲�
+						{
+							required: true,
+							message: '璇峰~鍐欏す浠跺強鍏朵粬閲嶉噺',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					prodWeight: [ // 鎴愬搧閲嶉噺
+						{
+							required: true,
+							message: '璇峰~鍐欐垚鍝侀噸閲�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					]
+				},
+				showTypeSelect: false,
+				workTypeSelect: false,
+				operationTypeSelect: false,
+				showOutputCategory: false,
+				infoFormList: [],
+				hvCoilFormList: [], //绠变綋楂樺帇
+				lvCoilFormList: [], //绠变綋浣庡帇
+				workOrder: '',
+				id: '',
+				isSubmit: false,
+				show: false,
+				deleteIndex: '',
+				workTypeList: [], // 绫诲瀷list
+				operationTypeList: [], // 宸ュ簭绫诲瀷list
+				outputCategoryList: [], // 浜у嚭绫诲埆
+				maskShow: false,
+				listDevice: [], //钃濈墮璁惧鏁版嵁
+				isFanAssembly: false, // 鏄惁涓洪鏈鸿閰�
+				isOilChange: false, // 闆朵欢鍚嶇О鍖呭惈娌瑰彉
+			}
+		},
+		// 鏂规硶闆嗗悎
+		methods: {
+			moveHandle() {
+
+			},
+			maskclose() {
+
+			},
+			//鎵撳嵃浜岀淮鐮�
+			async printQrCode(item) {
+				const params = {
+					rwMatlBindId: item.id
+				}
+				let res = await this.$u.api.dailyPaper.zongjianLabelInfo(params)
+				if (!res.data) {
+					this.$refs.uToast.show({
+						title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+						type: 'warning '
+					})
+					return
+				}
+				// 鍒濆鍖栫敾鏉�
+				jcapi.initDrawingBoard({
+					width: 50,
+					height: 100,
+					rotate: 0
+				});
+
+				// // 缁樺埗浜岀淮鐮�
+				jcapi.drawLabelQrCode({
+					x: 14.5,
+					y: 74,
+					width: 20,
+					height: 20,
+					value: jsonString,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for (let i = 1; i < 13; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 6) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 97, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 97, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 66, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 97, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 5, 20, 20, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 11, 20, 20, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 17, 20, 20, '鐗� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 23, 20, 20, '鐗囧锛坢m锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 29, 20, 20, '鍘氬害锛坢m锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 35, 20, 20, '閲嶉噺锛圞G锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 41, 20, 20, '闀垮害锛坢锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 47, 20, 20, '鐢熶骇浜�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 53, 20, 20, '鐢熶骇鏃堕棿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 59, 20, 20, '鍘傚:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 65, 20, 20, '閾佹崯:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				// // 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 5, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 11, 35, 12, optaskNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 17, 35, 12, grade, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 23, 35, 12, sliceWidth, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 29, 35, 12, thickness, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 35, 35, 12, wweight, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 41, 35, 12, llength, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 47, 35, 12, reportName, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 53, 35, 12, reportTime, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 59, 35, 12, supplierVenderName, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 65, 35, 12, ironLoss, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+
+				// 鐢熸垚鎵撳嵃鏁版嵁
+				let imageJsonObj = jcapi.generateLabelJson()
+				// 璁剧疆鎵撳嵃浠诲姟
+				jcapi.startJob({
+					totalCount: 1,
+					density: this.printDensity,
+					labelType: this.labelType,
+					printMode: this.printMode,
+				}, function(r) {
+					if (r.code == 0) {
+						// 鎵撳嵃鏁版嵁
+						jcapi.printData(imageJsonObj, {
+							"printQuantity": 1,
+						}, function(r) {
+							if (r.code == 0) {
+								console.log("鎵撳嵃鎴愬姛")
+							} else {
+								console.log("鎵撳嵃澶辫触")
+							}
+						})
+					} else {
+						console.log("璁剧疆鎵撳嵃浠诲姟澶辫触")
+					}
+				})
+			},
+			tapQuery(item) {
+				this.maskShow = false
+				// 杩炴帴鎵撳嵃鏈�
+				let _this = this;
+				console.log(item)
+				jcapi.openPrinterByDevice({
+					address: item.address,
+					name: item.name,
+					deviceType: item.deviceType // 璁惧绫诲瀷锛�0-钃濈墮锛�1-缃戠粶
+				}, function(r) {
+					uni.showToast({
+						title: (r.code == 0) ? "杩炴帴鎴愬姛" : "杩炴帴澶辫触",
+						duration: 2 * 1000
+					})
+					if (r.code == 0) {
+						_this.connectedDevice = item
+					}
+				})
+			},
+			//鎵撳嵃鐩稿叧
+			searchDevice() {
+				let _this = this
+				uni.openBluetoothAdapter({ // 纭钃濈墮鏄惁鎵撳紑
+					success(r) {
+						uni.showLoading({
+							title: "鎼滅储涓�..."
+						})
+						// 鏈巿浜堣摑鐗欑浉鍏虫潈闄愬拰鏈墦寮�鎵嬫満瀹氫綅浼氭悳绱笉鍒拌澶�
+						jcapi.getBluetoothDevices(function(r) {
+							console.log("device:" + JSON.stringify(r))
+							// 鎼滅储鍒拌澶囧洖璋�
+							uni.hideLoading()
+							_this.listDevice = r;
+							_this.maskShow = true
+						})
+					},
+					fail(e) {
+						uni.showModal({
+							confirmText: "鎵撳紑钃濈墮澶辫触"
+						})
+						console.log("寮�鍚摑鐗欒澶囧け璐�" + e)
+					}
+				})
+			}
+		},
+		onLoad(options) {
+			// 鍒濆鍖朣DK
+			jcapi.initSDK()
+			// 鐩戝惉椤电爜鍥炶皟
+			jcapi.didReadPrintCountInfo(function(r) {
+				console.log(r)
+			})
+
+			// 鐩戝惉閿欒鍥炶皟
+			jcapi.didReadPrintErrorInfo(function(r) {
+				console.log(r)
+				if (r.code == 23) {
+					// 鎵撳嵃鏈烘柇寮�杩炴帴
+					_this.connectedDevice = null
+				}
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(r),
+					duration: 2 * 1000
+				})
+			})
+			this.workOrder = JSON.parse(decodeURIComponent(options.info))
+			console.log(this.workOrder)
+			this.$u.api.dailyPaper.productReportDetail({
+				id: this.workOrder.id,
+				type:""
+			}).then((res) => {
+				console.log(res)
+			})
+			
+		},
+		onReady() {
+			this.$refs.uForm.setRules(this.rules);
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.uni-list_name {
+		font-size: 30rpx;
+		color: #333;
+	}
+
+	.uni-list_item {
+		font-size: 24rpx;
+		color: #555;
+		line-height: 1.5;
+	}
+
+	.uni-list-box {
+		margin: 0 20rpx;
+		padding: 15rpx 0;
+		border-bottom: 1px #f5f5f5 solid;
+		box-sizing: border-box;
+	}
+
+	.uni-scroll_box {
+		height: 70%;
+		background: #fff;
+		border-radius: 20rpx;
+	}
+
+	.uni-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		bottom: 0;
+		display: flex;
+		align-items: center;
+		width: 100%;
+		background: rgba(0, 0, 0, 0.6);
+		padding: 0 30rpx;
+		box-sizing: border-box;
+	}
+
+	.work-reporting {
+		background-color: #e6f0ff;
+		width: 100%;
+		height: 100vh;
+		box-sizing: border-box;
+
+		::v-deep.navbar-right {
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #FFFFFF;
+			line-height: 36rpx;
+			margin-right: 32rpx;
+		}
+
+		.scroll-Y {
+			width: 100%;
+			height: calc(100vh - 270rpx);
+
+			.form {
+				background: linear-gradient(180deg, #D8E8FF 0%, #FFFFFF 100%);
+				border-radius: 10rpx;
+				margin: 68rpx 30rpx 0;
+				padding: 36rpx 26rpx 0;
+				position: relative;
+
+				.form-title {
+					font-weight: 800;
+					font-size: 34rpx;
+					color: #1D2541;
+					margin-bottom: 30rpx;
+				}
+
+				.icon_report {
+					background-image: url('~@/static/custom/daily/icon_report.png');
+					background-repeat: no-repeat;
+					background-size: cover;
+					height: 170rpx;
+					width: 170rpx;
+					position: absolute;
+					top: -64rpx;
+					right: -30rpx;
+				}
+			}
+
+			.scan-code-feeding {
+				background: linear-gradient(180deg, #D8E8FF 0%, #F3F8FF 100%);
+				border-radius: 10rpx;
+				margin: 20rpx 30rpx 68rpx;
+				padding: 36rpx 16rpx 58rpx;
+				position: relative;
+
+				.form-title {
+					font-weight: 800;
+					font-size: 34rpx;
+					color: #1D2541;
+					padding-left: 10rpx;
+					margin-bottom: 30rpx;
+				}
+
+				.icon_camera {
+					background-image: url('~@/static/custom/daily/icon_camera.png');
+					background-repeat: no-repeat;
+					background-size: cover;
+					height: 82rpx;
+					width: 82rpx;
+					position: absolute;
+					top: 18rpx;
+					right: 28rpx;
+				}
+
+				.infoform {
+					background: #FFFFFF;
+					border-radius: 10rpx;
+					border: 1px solid #EAF2FF;
+					box-sizing: border-box;
+					padding: 30rpx 24rpx;
+					margin-top: 20rpx;
+
+					p {
+						font-weight: 500;
+						font-size: 26rpx;
+						color: #333333;
+						margin-bottom: 24rpx;
+
+						.icon_zl {
+							background-image: url('~@/static/custom/daily/icon_zl.png');
+							background-repeat: no-repeat;
+							background-size: cover;
+							height: 24rpx;
+							width: 24rpx;
+							margin-right: 6rpx;
+							margin-bottom: 6rpx;
+							vertical-align: middle;
+							position: relative;
+						}
+
+						.icon_7 {
+							background-image: url('~@/static/custom/daily/icon_7.png');
+							background-repeat: no-repeat;
+							background-size: cover;
+							height: 24rpx;
+							width: 24rpx;
+							margin-right: 6rpx;
+							margin-bottom: 6rpx;
+							vertical-align: middle;
+							position: relative;
+						}
+
+						.icon_6 {
+							background-image: url('~@/static/custom/daily/icon_6.png');
+							background-repeat: no-repeat;
+							background-size: cover;
+							height: 24rpx;
+							width: 24rpx;
+							margin-right: 6rpx;
+							margin-bottom: 6rpx;
+							vertical-align: middle;
+							position: relative;
+						}
+					}
+
+					.buttonFlex {
+						display: flex;
+						justify-content: flex-end;
+						flex-direction: row;
+
+						.delete-button {
+							height: 66rpx;
+							background: #FFFFFF;
+							border-radius: 8rpx;
+							border: 1px solid #D6655C;
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #D6655C;
+							margin: 24rpx 24rpx 0 206rpx;
+							line-height: 66rpx;
+
+							.icon_del {
+								background-image: url('~@/static/custom/daily/icon_del.png');
+								background-repeat: no-repeat;
+								background-size: cover;
+								height: 32rpx;
+								width: 32rpx;
+								margin-right: 8rpx;
+								margin-bottom: 8rpx;
+								vertical-align: middle;
+								position: relative;
+							}
+						}
+
+						.primary-button {
+							height: 66rpx;
+							background: #FFFFFF;
+							border-radius: 8rpx;
+							border: 1px solid #214DED;
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #214DED;
+							line-height: 66rpx;
+							margin: 24rpx 0 0 0;
+
+							.icon_dy {
+								background-image: url('~@/static/custom/daily/icon_dy.png');
+								background-repeat: no-repeat;
+								background-size: cover;
+								height: 32rpx;
+								width: 32rpx;
+								margin-right: 8rpx;
+								margin-bottom: 8rpx;
+								vertical-align: middle;
+								position: relative;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		.bottom {
+			width: 100vw;
+			position: fixed;
+			bottom: 60rpx;
+
+			.u-button {
+				width: 690rpx;
+				height: 80rpx;
+				background: #214DED;
+				border-radius: 8rpx;
+				font-weight: 500;
+				font-size: 34rpx;
+				color: #FFFFFF;
+				z-index: 99;
+			}
+		}
+	}
+
+	::v-deep.u-form-item--left__content__label {
+		padding-left: 26rpx;
+		font-weight: 500;
+		font-size: 30rpx;
+		color: #4F4F4F;
+		line-height: 80rpx;
+	}
+
+	::v-deep.u-form-item--left__content--required {
+		left: 8rpx;
+		top: 0;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/daily/common/work-reporting.vue b/pages/daily/common/work-reporting.vue
new file mode 100644
index 0000000..7db9c3f
--- /dev/null
+++ b/pages/daily/common/work-reporting.vue
@@ -0,0 +1,1644 @@
+<template>
+	<view class="work-reporting">
+		<u-navbar title="鎶ュ伐" :border-bottom="false" :background="background" :title-size="40" :title-bold="true"
+			title-color="#FFFFFF" back-icon-color="#fff">
+			<view v-if="
+			(isShowWorkCenter('WK-01') && workOrder.operationId === workOrder.lastOperationId) ||
+			isOperationName('TX-01', '绾靛壀') ||
+			isOperationName('TX-02', '鍙犺') ||
+			isShowWorkCenter('ZZ-03') ||
+			isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')
+			" class="navbar-right" slot="right" @click="goTagList">
+				鏍囩璁板綍
+			</view>
+			<view v-if="isSubmit" class="navbar-right" slot="right" @click="searchDevice">
+				鎼滅储璁惧
+			</view>
+		</u-navbar>
+		<scroll-view :scroll-top="scrollTop" scroll-y="true" class="scroll-Y">
+			<view class="form">
+				<h3 class="form-title">鎶ュ伐淇℃伅</h3>
+				<u-icon class="icon_report" size="170rpx" />
+				<u-form :model="form" ref="uForm">
+					<!--绫诲瀷-->
+					<u-form-item v-if="isShowWorkCenter('BJ-01')" label="绫诲瀷" prop="typeLabel" required
+						:label-width="180">
+						<u-input v-model="form.typeLabel" placeholder="璇烽�夋嫨" />
+						<u-icon name="arrow-right" color="#687792" size="28" @click="workTypeSelect = true"></u-icon>
+					</u-form-item>
+					<!--鍙版暟-->
+					<u-form-item v-if="
+					isShowWorkCenter('BJ-01') ||
+					isOperationName('TX-01', '妯壀')" label="鍙版暟" prop="qty" required :label-width="180">
+						<u-input v-model="form.qty" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+					<!--鏉$爜缂栧彿-->
+					<u-form-item v-if="
+					isShowWorkCenter('TM-01,JG-01,ZZ-03,BZ-01,YB-04') ||
+					isFirstOperationId('DY-01,GY-01,YB-01,YB-02,ZM-01') ||
+					(workOrder.operationId === workOrder.lastOperationId && isShowWorkCenter('WK-01')) ||
+					isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补') ||
+					isOperationName('TX-02', '鍙犺') ||
+					(isShowWorkCenter('TX-02') && workOrder.operationName !== '鍙犺') ||
+					isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')" label="鏉$爜缂栧彿" prop="labelNo" required :label-width="180">
+						<u-input v-if ="isShowWorkCenter('TM-01,JG-01,YB-04') || isFirstOperationId(
+						'DY-01,GY-01,YB-01,YB-02,ZM-01')||
+					(isShowWorkCenter('TX-02') && workOrder.operationName !== '鍙犺')" v-model="form.labelNo" placeholder="璇锋壂鐮�" disabled />
+						<u-input v-else v-model="form.labelNo" placeholder="璇疯緭鍏�" @blur="identifyingQrCodesBlur"/>
+						<u-icon name="scan" color="#2c4ce4" size="40" @click="identifyingQrCodes"></u-icon>
+					</u-form-item>
+					<!--宸ュ簭绫诲瀷-->
+					<u-form-item v-if="
+					isShowWorkCenter('ZZ-03') ||
+					(isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补') && isOilChange)" label="宸ュ簭绫诲瀷" prop="operationTypeLabel" required
+						:label-width="180" @click="operationTypeSelect = true">
+						<u-input v-model="form.operationTypeLabel" placeholder="璇烽�夋嫨" />
+						<u-icon name="arrow-right" color="#687792" size="28"
+							@click="operationTypeSelect = true"></u-icon>
+					</u-form-item>
+					<!--瀹屾垚鏁伴噺-->
+					<u-form-item v-if="
+					isShowWorkCenter('WK-01,ZZ-03,BZ-01') ||
+					isOperationName('TX-02', '鍙犺') ||
+					(isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补') && isFanAssembly) ||
+					isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')" label="瀹屾垚鏁伴噺" prop="finishQty" required :label-width="180">
+						<u-input v-model="form.finishQty" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+					<!--闀垮害-->
+					<u-form-item v-if="isShowWorkCenter('') || isOperationName('TX-01', '绾靛壀')" label="闀垮害" prop="length"
+						required :label-width="180">
+						<u-input v-model="form.length" placeholder="璇疯緭鍏�" @blur="calculateWeight" />
+					</u-form-item>
+					<!--閲嶉噺-->
+					<u-form-item v-if="isShowWorkCenter('') || isOperationName('TX-01', '绾靛壀')" label="閲嶉噺" prop="weight"
+						required :label-width="180">
+						<u-input v-model="form.weight" placeholder="鍙嶆樉" disabled />
+					</u-form-item>
+					<!--浜у嚭绫诲埆-->
+					<u-form-item v-if="
+					isShowWorkCenter('') ||
+					isOperationName('TX-01', '妯壀')" label="浜у嚭绫诲埆" prop="outputCategoryLabel" required :label-width="180">
+						<u-input v-model="form.outputCategoryLabel" placeholder="璇烽�夋嫨" />
+						<u-icon name="arrow-right" color="#687792" size="28"
+							@click="showOutputCategory = true"></u-icon>
+						<u-select v-model="showOutputCategory" :list="outputCategoryList"
+							@confirm="outputCategoryFirm"></u-select>
+					</u-form-item>
+					<!--鐗囧-->
+					<u-form-item v-if="
+					isShowWorkCenter('') ||
+					(isOperationName('TX-01', '妯壀') && form.outputCategoryLabel !== '涓煴')" label="鐗囧" prop="sliceWidth" required
+						:label-width="180">
+						<u-input v-model="form.sliceWidth" placeholder="璇烽�夋嫨" />
+					</u-form-item>
+					<!--鐗囨枡鏁伴噺-->
+					<u-form-item v-if="
+					isShowWorkCenter('') ||
+					isOperationName('TX-01', '妯壀')" label="鐗囨枡鏁伴噺" prop="sliceQty" required :label-width="180">
+						<u-input v-model="form.sliceQty" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+					<!--绾垮湀绫诲瀷-->
+					<u-form-item v-if="
+					isShowWorkCenter('TM-01,JG-01,YB-04') ||
+					isFirstOperationId('DY-01,GY-01,YB-01,YB-02,ZM-01')" label="绾垮湀绫诲瀷" prop="weight" required :label-width="180">
+						<u-input v-model="form.weightTwo" placeholder="鍙嶆樉" disabled />
+					</u-form-item>
+					<!--鍥惧彿-->
+					<u-form-item v-if="
+					isShowWorkCenter('TM-01,JG-01,YB-04') ||
+					isFirstOperationId('DY-01,GY-01,YB-01,YB-02,ZM-01') ||
+					(isShowWorkCenter('TX-02') && workOrder.operationName !== '鍙犺')" label="鍥惧彿" prop="drawNo" required
+						:label-width="180">
+						<u-input v-model="form.drawNo" placeholder="鍙嶆樉" disabled />
+					</u-form-item>
+					<!--瑙勬牸鍨嬪彿-->
+					<u-form-item v-if="
+					isShowWorkCenter('TM-01,JG-01,YB-04') ||
+					isFirstOperationId('DY-01,GY-01,YB-01,YB-02,ZM-01') ||
+					(isShowWorkCenter('TX-02') && workOrder.operationName !== '鍙犺')" label="瑙勬牸鍨嬪彿" prop="weight" required
+						:label-width="180">
+						<u-input v-model="form.weight" placeholder="鍙嶆樉" disabled />
+					</u-form-item>
+					<!--澶逛欢鍙婂叾浠栭噸閲�-->
+					<u-form-item v-if="isOperationName('TX-02', '鍙犺')" label="澶逛欢鍙婂叾浠栭噸閲�" prop="clampOtherWeight" required
+						:label-width="180">
+						<u-input v-model="form.clampOtherWeight" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+					<!--鎴愬搧閲嶉噺-->
+					<u-form-item v-if="isOperationName('TX-02', '鍙犺')" label="鎴愬搧閲嶉噺" prop="prodWeight" required
+						:label-width="180">
+						<u-input v-model="form.prodWeight" placeholder="璇疯緭鍏�" />
+					</u-form-item>
+				</u-form>
+			</view>
+			<view class="scan-code-feeding" v-if="
+			isShowWorkCenter('BZ-01') ||
+			isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补') ||
+			isOperationName('TX-01', '绾靛壀') ||
+			isOperationName('TX-01', '妯壀') ||
+			isOperationName('TX-02', '鍙犺') ||
+			isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')">
+				<h3 class="form-title">鎵爜鎶曟枡</h3>
+				<u-icon class="icon_camera" size="82rpx" @click="qrCode" />
+				<u-input v-model="partID" placeholder="璇疯緭鍏ョ墿鏂�"  @blur="getPart"/>
+				<view class="infoform" v-for="(item,index) in infoFormList" :key="'item'+index">
+					<p>
+						<u-icon class="icon_zl" size="24rpx" />
+						<span style="margin-right: 18rpx">鍓╀綑閲嶉噺:</span>
+						<u-input :border="true" v-model="item.qtyRequired" label="鍓╀綑閲嶉噺"
+							style="width: 450rpx;height: 56rpx;display: inline-flex;background: #F6FAFF;border-radius: 8rpx;border: 1px solid #214DED;align-items: center;"></u-input>
+					</p>
+					<p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>鎵规鍙�:{{item.lotBatchNo}}</span>
+					</p>
+					<p>
+						<u-icon class="icon_6" size="24rpx" />
+						<span>闆朵欢鍚嶇О锛歿{item.partName}}</span>
+					</p>
+					<u-divider :use-slot="false" half-width="640"></u-divider>
+					<view class="buttonFlex">
+						<button class="delete-button" type="warn" @click="deleteInfo(index)">
+							<u-icon class="icon_del" size="32rpx" />
+							鍒犻櫎
+						</button>
+						<button class="primary-button" v-if="isOperationName('TX-01', '妯壀') && isSubmit" type="primary"
+							plain="true" @click="printQrCode(item)">
+							<u-icon class="icon_dy" size="32rpx" />
+							鏍囩鎵撳嵃
+						</button>
+					</view>
+				</view>
+			</view>
+			<view class="scan-code-feeding" v-if="
+			isShowWorkCenter('ZZ-03')&& isWorkStationName('ZZ-03','绠变綋缁勮')">
+				<h3 class="form-title">鎵爜鎶曟枡</h3>
+				<u-icon class="icon_camera" size="82rpx" @click="qrCode" />
+					<u-input v-model="partID" placeholder="璇疯緭鍏ョ墿鏂�"  @blur="getPart"/>
+				<view class="infoform" v-for="(item,index) in infoFormList" :key="'item'+index">
+					<p>
+						<u-icon class="icon_zl" size="24rpx" />
+						<span style="margin-right: 18rpx">鍓╀綑閲嶉噺:</span>
+						<u-input :border="true" v-model="item.qtyRequired" label="鍓╀綑閲嶉噺"
+							style="width: 450rpx;height: 56rpx;display: inline-flex;background: #F6FAFF;border-radius: 8rpx;border: 1px solid #214DED;align-items: center;"></u-input>
+					</p>
+					<p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>鎵规鍙�:{{item.lotBatchNo}}</span>
+					</p>
+					<p>
+						<u-icon class="icon_6" size="24rpx" />
+						<span>闆朵欢鍚嶇О锛歿{item.partName}}</span>
+					</p>
+					<u-divider :use-slot="false" half-width="640"></u-divider>
+					<view class="buttonFlex">
+						<button class="delete-button" type="warn" @click="deleteInfo(index)">
+							<u-icon class="icon_del" size="32rpx" />
+							鍒犻櫎
+						</button>
+						<button class="primary-button" v-if="isOperationName('TX-01', '妯壀') && isSubmit" type="primary"
+							plain="true" @click="printQrCode(item)">
+							<u-icon class="icon_dy" size="32rpx" />
+							鏍囩鎵撳嵃
+						</button>
+					</view>
+				</view>
+
+				<h3 class="form-title">楂樺帇鏌滅粦瀹�</h3>
+				<view class="infoform" v-for="(item,index) in hvCoilFormList" :key="'item'+index">
+					<!-- <p> -->
+					<!-- <u-icon class="icon_zl" size="24rpx" /> -->
+					<!-- <span style="margin-right: 18rpx">鍓╀綑閲嶉噺:</span> -->
+					<!-- <u-input :border="true" v-model="item.qtyRequired" label="鍓╀綑閲嶉噺" -->
+					<!-- style="width: 450rpx;height: 56rpx;display: inline-flex;background: #F6FAFF;border-radius: 8rpx;border: 1px solid #214DED;align-items: center;"></u-input> -->
+					<!-- </p> -->
+					<p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>渚跨缂栫爜:{{item}}</span>
+					</p>
+					<!-- <p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>鎵规鍙�:{{item.lotBatchNo}}</span>
+					</p>
+					<p>
+						<u-icon class="icon_6" size="24rpx" />
+						<span>闆朵欢鍚嶇О锛歿{item.partName}}</span>
+					</p> -->
+					<u-divider :use-slot="false" half-width="640"></u-divider>
+					<view class="buttonFlex">
+						<button class="delete-button" type="warn" @click="deleteInfoGy(index)">
+							<u-icon class="icon_del" size="32rpx" />
+							鍒犻櫎
+						</button>
+						<!-- 		<button class="primary-button"
+							v-if="isOperationName('TX-02', '鍙犺')||isOperationName('TX-01', '妯壀') && isSubmit"
+							type="primary" plain="true" @click="printQrCode(item)">
+							<u-icon class="icon_dy" size="32rpx" />
+							鏍囩鎵撳嵃
+						</button> -->
+					</view>
+				</view>
+
+				<h3 class="form-title">浣庡帇鏌滅粦瀹�</h3>
+				<view class="infoform" v-for="(item,index) in lvCoilFormList" :key="'item'+index">
+					<!-- <p>
+						<u-icon class="icon_zl" size="24rpx" />
+						<span style="margin-right: 18rpx">鍓╀綑閲嶉噺:</span>
+						<u-input :border="true" v-model="item.qtyRequired" label="鍓╀綑閲嶉噺"
+							style="width: 450rpx;height: 56rpx;display: inline-flex;background: #F6FAFF;border-radius: 8rpx;border: 1px solid #214DED;align-items: center;"></u-input>
+					</p> -->
+					<p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>渚跨缂栫爜:{{item}}</span>
+					</p>
+					<!-- <p>
+						<u-icon class="icon_7" size="24rpx" />
+						<span>鎵规鍙�:{{item.lotBatchNo}}</span>
+					</p>
+					<p>
+						<u-icon class="icon_6" size="24rpx" />
+						<span>闆朵欢鍚嶇О锛歿{item.partName}}</span>
+					</p> -->
+					<u-divider :use-slot="false" half-width="640"></u-divider>
+					<view class="buttonFlex">
+						<button class="delete-button" type="warn" @click="deleteInfoDy(index)">
+							<u-icon class="icon_del" size="32rpx" />
+							鍒犻櫎
+						</button>
+						<!-- 		<button class="primary-button" v-if="isOperationName('TX-01', '妯壀') && isSubmit" type="primary"
+							plain="true" @click="printQrCode(item)">
+							<u-icon class="icon_dy" size="32rpx" />
+							鏍囩鎵撳嵃
+						</button> -->
+					</view>
+				</view>
+
+			</view>
+		</scroll-view>
+		<view class="bottom" v-if="
+					!(isShowWorkCenter('TM-01,JG-01,YB-04') ||
+					isFirstOperationId('DY-01,GY-01,YB-01,YB-02,ZM-01') ||
+					(isShowWorkCenter('TX-02') && workOrder.operationName !== '鍙犺'))">
+			<u-button class="u-button" type="primary" @click="submit">鎻愪氦</u-button>
+		</view>
+		<u-toast ref="uToast" />
+		<u-modal v-model="show" @confirm="confirm" content="鏄惁纭鍒犻櫎" show-cancel-button></u-modal>
+		<!-- 涓嬫媺妗� -->
+		<!-- 绫诲瀷 -->
+		<u-select v-model="workTypeSelect" :list="workTypeList" @confirm="workTypeTypeFirm"></u-select>
+		<!-- 宸ュ簭绫诲瀷 -->
+		<u-select v-model="operationTypeSelect" :list="operationTypeList" @confirm="operationTypeFirm"></u-select>
+		<view v-if="maskShow" class="uni-mask" @touchmove.stop.prevent="moveHandle" @click="maskclose">
+			<scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" @click.stop="moveHandle">
+				<view class="uni-list-box" v-for="(item, index) in listDevice" :key="index" @click="tapQuery(item)">
+					<view>
+						<view class="uni-list_name">鍚嶇О锛歿{ item.name }}</view>
+						<view class="uni-list_item">UUID:{{ item.address }}</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+	import {
+		dateFormat
+	} from "../../../utils/date"
+
+	const jcapi = uni.requireNativePlugin("JCSDK-JCApiModule");
+
+	// 浜岀淮鐮佺被鍨�
+	const QrCodeType = {
+		QrCode: 31,
+		PDF417: 32,
+		DataMatrix: 33,
+		AZTEC: 34
+	}
+	// 绾挎潯绫诲瀷
+	const LineType = {
+		Solid: 1, // 瀹炵嚎
+		Dotted: 2, // 铏氱嚎锛堥粯璁よ櫄瀹�1:1鐩搁棿锛�
+	}
+	// 鎹㈣鏂瑰紡
+	const LineModeType = {
+		Justified: 1, // 瀹介珮鍥哄畾锛屽唴瀹硅嚜閫傚簲锛堝瓧鍙�/瀛楅棿璺�/琛岄棿璺濇寜姣斾緥缂╂斁锛�
+		AutoHeight: 2, // 瀹藉害鍥哄畾锛岄珮搴﹁嚜閫傚簲
+		Fixed: 4, // 瀹介珮鍥哄畾锛岃秴鍑洪儴鍒嗚鍓�
+		Adapt: 6, // 瀹介珮鍥哄畾锛屽唴瀹硅秴杩囨椂棰勮瀹介珮鑷姩缂╁皬
+	}
+
+	export default {
+		name: "work-reporting",
+		// import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+		components: {
+			UIcon
+		},
+		data() {
+			// 杩欓噷瀛樻斁鏁版嵁
+			return {
+				partID:'',//鐗╂枡ID
+				background: {
+					backgroundColor: '#214DED',
+				},
+				scrollTop: 0,
+				form: {
+					clazzType: '', // 鐝
+					dutyNo: '', // 鐝缂栧彿
+					locationId: '', // 搴撲綅id
+					operationTaskId: '', // 宸ュ崟id
+					reportTime: '', // 鎻愪氦鏃堕棿
+					labelNo: '', // 鏉$爜缂栧彿
+					qty: '', // 鍙版暟
+					drawNo: '', // 鍥惧彿
+					finishQty: '', // 瀹屾垚鏁伴噺
+					identifyingQr: '', // 绾垮湀杞﹂棿-杩囪处-鎵爜缁撴灉
+					type: '', // 绫诲瀷閫夋嫨鍣細value
+					typeLabel: '', // 绫诲瀷閫夋嫨鍣細label
+					operationType: '', // 宸ュ簭绫诲瀷閫夋嫨鍣細value
+					operationTypeLabel: '', // 宸ュ簭绫诲瀷閫夋嫨鍣細label
+					outputCategory: '', // 浜у嚭绫诲埆锛歷alue
+					outputCategoryLabel: '', // 浜у嚭绫诲埆锛歭abel
+					length: '', // 闀垮害,
+					siliconSteelCode: '', // 鎵爜鑾峰彇鍘傚淇℃伅鏉ユ枡妫�淇℃伅
+					sliceWidth: '', // 鐗囧
+					sliceQty: '', // 鐗囨枡鏁伴噺
+					clampOtherWeight: '', // 澶逛欢鍙婂叾浠栭噸閲�
+					weightTwo: ''
+				},
+				num: '',
+				rules: {
+					labelNo: [{
+						required: true,
+						message: '璇烽�夋嫨鎵爜鎴栬緭鍏ョ紪鍙�',
+						trigger: ['blur'],
+					}],
+					typeLabel: [ // 绫诲瀷
+						{
+							required: true,
+							message: '璇烽�夋嫨绫诲瀷',
+							trigger: ['change'],
+						}
+					],
+					qty: [ // 鍙版暟
+						{
+							required: true,
+							message: '璇峰~鍐欏彴鏁�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					operationTypeLabel: [ // 宸ュ簭绫诲瀷
+						{
+							required: true,
+							message: '璇烽�夋嫨宸ュ簭绫诲瀷',
+							trigger: ['change'],
+						}
+					],
+					finishQty: [ // 瀹屾垚鏁伴噺
+						{
+							required: true,
+							message: '璇峰~鍐欏畬鎴愭暟閲�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					length: [ // 闀垮害,
+						{
+							required: true,
+							message: '璇峰~鍐欓暱搴�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					outputCategoryLabel: [ // 鐗囧
+						{
+							required: true,
+							message: '璇峰~鍐欑墖瀹�',
+							trigger: ['change'],
+						}
+					],
+					sliceQty: [ // 鐗囨枡鏁伴噺
+						{
+							required: true,
+							message: '璇峰~鍐欑墖鏂欐暟閲�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					clampOtherWeight: [ // 澶逛欢鍙婂叾浠栭噸閲�
+						{
+							required: true,
+							message: '璇峰~鍐欏す浠跺強鍏朵粬閲嶉噺',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					],
+					prodWeight: [ // 鎴愬搧閲嶉噺
+						{
+							required: true,
+							message: '璇峰~鍐欐垚鍝侀噸閲�',
+							trigger: ['blur'],
+						},
+						// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+						{
+							validator: (rule, value, callback) => {
+								return this.$u.test.number(value);
+							},
+							message: '鍙兘涓烘暟鍊�',
+							trigger: ['blur'],
+						},
+					]
+				},
+				showTypeSelect: false,
+				workTypeSelect: false,
+				operationTypeSelect: false,
+				showOutputCategory: false,
+				infoFormList: [],
+				hvCoilFormList: [], //绠变綋楂樺帇
+				lvCoilFormList: [], //绠变綋浣庡帇
+				workOrder: '',
+				id: '',
+				isSubmit: false,
+				show: false,
+				deleteIndex: '',
+				workTypeList: [], // 绫诲瀷list
+				operationTypeList: [], // 宸ュ簭绫诲瀷list
+				outputCategoryList: [], // 浜у嚭绫诲埆
+				maskShow: false,
+				listDevice: [], //钃濈墮璁惧鏁版嵁
+				isFanAssembly: false, // 鏄惁涓洪鏈鸿閰�
+				isOilChange: false, // 闆朵欢鍚嶇О鍖呭惈娌瑰彉
+			}
+		},
+		// 鏂规硶闆嗗悎
+		methods: {
+			moveHandle() {
+
+			},
+			maskclose() {
+
+			},
+			//鎵撳嵃浜岀淮鐮�
+			async printQrCode(item) {
+				const params = {
+					rwMatlBindId: item.id
+				}
+				let res = await this.$u.api.dailyPaper.zongjianLabelInfo(params)
+				if (!res.data) {
+					this.$refs.uToast.show({
+						title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+						type: 'warning '
+					})
+					return
+				}
+				// 鍒濆鍖栫敾鏉�
+				jcapi.initDrawingBoard({
+					width: 50,
+					height: 100,
+					rotate: 0
+				});
+				let printData = res.data.ParamList[0]
+				// // 缁樺埗浜岀淮鐮�
+				jcapi.drawLabelQrCode({
+					x: 14.5,
+					y: 74,
+					width: 20,
+					height: 20,
+					value: jsonString,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for (let i = 1; i < 13; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 6) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 97, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 97, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 66, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 97, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 5, 20, 20, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 11, 20, 20, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 17, 20, 20, '鐗� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 23, 20, 20, '鐗囧锛坢m锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 29, 20, 20, '鍘氬害锛坢m锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 35, 20, 20, '閲嶉噺锛圞G锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 41, 20, 20, '闀垮害锛坢锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 47, 20, 20, '鐢熶骇浜�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 53, 20, 20, '鐢熶骇鏃堕棿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 59, 20, 20, '鍘傚:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 65, 20, 20, '閾佹崯:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let optaskNo = JSON.stringify(printData.optaskNo).replace(/"/g, "")
+				let sliceWidth = JSON.stringify(printData.sliceWidth ? printData.sliceWidth : '').replace(/"/g, "")
+				let thickness = JSON.stringify(printData.thickness ? printData.thickness : '').replace(/"/g, "")
+				let wweight = JSON.stringify(printData.wweight ? printData.wweight : '').replace(/"/g, "")
+				let llength = JSON.stringify(printData.llength ? printData.llength : '').replace(/"/g, "")
+				let reportTime = JSON.stringify(item.reportTime).replace(/"/g, "")
+				let reportName = JSON.stringify(item.reportName).replace(/"/g, "")
+				let grade = JSON.stringify(printData.grade ? printData.grade : '').replace(/"/g, "")
+				let ironLoss = JSON.stringify(printData.ironLoss ? printData.ironLoss : '').replace(/"/g, "")
+				let supplierVenderName = JSON.stringify(printData.supplierVenderName ? printData.supplierVenderName :
+					'').replace(/"/g, "")
+
+				// // 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 5, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 11, 35, 12, optaskNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 17, 35, 12, grade, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 23, 35, 12, sliceWidth, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 29, 35, 12, thickness, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 35, 35, 12, wweight, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 41, 35, 12, llength, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 47, 35, 12, reportName, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 53, 35, 12, reportTime, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 59, 35, 12, supplierVenderName, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 65, 35, 12, ironLoss, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+
+				// 鐢熸垚鎵撳嵃鏁版嵁
+				let imageJsonObj = jcapi.generateLabelJson()
+				// 璁剧疆鎵撳嵃浠诲姟
+				jcapi.startJob({
+					totalCount: 1,
+					density: this.printDensity,
+					labelType: this.labelType,
+					printMode: this.printMode,
+				}, function(r) {
+					if (r.code == 0) {
+						// 鎵撳嵃鏁版嵁
+						jcapi.printData(imageJsonObj, {
+							"printQuantity": 1,
+						}, function(r) {
+							if (r.code == 0) {
+								console.log("鎵撳嵃鎴愬姛")
+							} else {
+								console.log("鎵撳嵃澶辫触")
+							}
+						})
+					} else {
+						console.log("璁剧疆鎵撳嵃浠诲姟澶辫触")
+					}
+				})
+			},
+			tapQuery(item) {
+				this.maskShow = false
+				// 杩炴帴鎵撳嵃鏈�
+				let _this = this;
+				console.log(item)
+				jcapi.openPrinterByDevice({
+					address: item.address,
+					name: item.name,
+					deviceType: item.deviceType // 璁惧绫诲瀷锛�0-钃濈墮锛�1-缃戠粶
+				}, function(r) {
+					uni.showToast({
+						title: (r.code == 0) ? "杩炴帴鎴愬姛" : "杩炴帴澶辫触",
+						duration: 2 * 1000
+					})
+					if (r.code == 0) {
+						_this.connectedDevice = item
+					}
+				})
+			},
+			//鎵撳嵃鐩稿叧
+			searchDevice() {
+				let _this = this
+				uni.openBluetoothAdapter({ // 纭钃濈墮鏄惁鎵撳紑
+					success(r) {
+						uni.showLoading({
+							title: "鎼滅储涓�..."
+						})
+						// 鏈巿浜堣摑鐗欑浉鍏虫潈闄愬拰鏈墦寮�鎵嬫満瀹氫綅浼氭悳绱笉鍒拌澶�
+						jcapi.getBluetoothDevices(function(r) {
+							console.log("device:" + JSON.stringify(r))
+							// 鎼滅储鍒拌澶囧洖璋�
+							uni.hideLoading()
+							_this.listDevice = r;
+							_this.maskShow = true
+						})
+					},
+					fail(e) {
+						uni.showModal({
+							confirmText: "鎵撳紑钃濈墮澶辫触"
+						})
+						console.log("寮�鍚摑鐗欒澶囧け璐�" + e)
+					}
+				})
+			},
+			// 鍒ゆ柇宸ュ崟鏄惁绛変簬
+			isShowWorkCenter(workCenter) {
+				if (workCenter.includes(this.workOrder.workCenter)) {
+					return true
+				} else {
+					return false
+				}
+			},
+			// 鍒ゆ柇宸ュ崟鏄惁绛変簬,鍚屾椂鍒ゆ柇鏄惁涓虹涓�閬撳伐搴�
+			isFirstOperationId(workCenter) {
+				if (workCenter.includes(this.workOrder.workCenter)) {
+					// 鍒ゆ柇鏄惁涓嶄负绗竴閬撳伐搴�
+					if (this.workOrder.operationId !== this.workOrder.firstOperationId) {
+						return true
+					} else {
+						return false
+					}
+				} else {
+					return false
+				}
+			},
+			isOperationName(workCenter, operationName) {
+				// 鍒ゆ柇鏄惁涓鸿宸ヤ綔绔�
+				if (workCenter.includes(this.workOrder.workCenter)) {
+					// 鍒ゆ柇鏄惁鍖呭惈宸ュ簭鍚嶇О
+					if (operationName.includes(this.workOrder.operationName)) {
+						return true
+					} else {
+						return false
+					}
+				} else {
+					return false
+				}
+			},
+			isNotOperationName(workCenter, operationName) {
+				// 鍒ゆ柇鏄惁涓鸿宸ヤ綔绔�
+				if (workCenter.includes(this.workOrder.workCenter)) {
+					// 鍒ゆ柇鏄惁鍖呭惈宸ュ簭鍚嶇О
+					if (!operationName.includes(this.workOrder.operationName)) {
+						return true
+					} else {
+						return false
+					}
+				} else {
+					return false
+				}
+			},
+			isWorkStationName(workCenter,workStationName){
+				// 鍒ゆ柇鏄惁涓鸿宸ヤ綔绔�
+					if (workCenter.includes(this.workOrder.workCenter)) {
+						// 鍒ゆ柇杞﹂棿鍚嶇О
+						if (workStationName.includes(this.workOrder.workstationName.split(')')[1])) {
+							return true
+						} else {
+							return false
+						}
+					} else {
+						return false
+					}
+			},
+			goTagList() {
+				uni.navigateTo({
+					url: '/pages/daily/tag-list/index?info=' + encodeURIComponent(JSON.stringify(this.workOrder))
+				})
+			},
+			submit() {
+				this.$refs.uForm.validate(async valid => {
+					if (valid) {
+						// 鎶ュ伐鍏叡鏁版嵁
+						let obj = this.getProductReportData()
+						// 閽i噾杞﹂棿
+						if (this.isShowWorkCenter('BJ-01')) {
+							obj.productReport = {
+									qty: this.form.qty,
+									type: this.form.type
+								},
+								obj.reportType = "BANJIN_PRODUCT_REPORT"
+						}
+						// 绾垮湀杞﹂棿-杩囧笎
+						if (this.isShowWorkCenter('TM-01,JG-01,YB-04') || this.isFirstOperationId(
+								'DY-01,GY-01,YB-01,YB-02,ZM-01')) {
+							let op = {
+								labelNo: this.form.labelNo
+							}
+							obj.operationId = this.workOrder.operationId
+							obj.productReportXianquanNonFirst = op
+							obj.reportType = "XIANQUAN_NON_FIRST_PRODUCT_REPORT"
+						}
+						// 澶栧3杞﹂棿-闈炴渶鍚庝竴閬撳伐搴�
+						if (this.isShowWorkCenter('WK-01') && this.workOrder.operationId !== this.workOrder
+							.lastOperationId) {
+							obj.productReportWaikePrev = {
+									labelNo: '',
+									qty: this.form.finishQty
+								},
+								obj.reportType = "WAIKE_PRODUCT_REPORT_PREV"
+						}
+						// 澶栧3杞﹂棿-鏈�鍚庝竴閬撳伐搴�
+						if (this.isShowWorkCenter('WK-01') && this.workOrder.operationId === this.workOrder
+							.lastOperationId) {
+							obj.productReportWaike = {
+									labelNo: this.form.labelNo,
+									qty: this.form.finishQty
+								},
+								obj.reportType = "WAIKE_PRODUCT_REPORT"
+						}
+						// 绠卞彉杞﹂棿(鎴愬杞﹂棿)
+						if (this.isShowWorkCenter('ZZ-03')) {
+							obj.productReportChengtao = {
+								id: null,
+								labelNo: this.form.labelNo,
+								operationType: this.form.operationType,
+								qty: this.form.finishQty,
+								rwMatlBindDTOList: this.infoFormList,
+								gyLabelNoList:this.hvCoilFormList,
+								dyLabelNoList:this.lvCoilFormList
+								
+							}
+							obj.reportType = "CHENGTAO_PRODUCT_REPORT"
+						}
+						// 鎬昏杞﹂棿
+						if (this.isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+							obj.productReportZongzhuang = {
+								id: null,
+								labelNo: this.form.labelNo,
+								operationType: this.form.operationType,
+								qty: this.form.finishQty,
+								workstationId: this.workOrder.workstationId,
+								rwMatlBindDTOList: this.infoFormList,
+							}
+							obj.reportType = "ZONGZHUANG_PRODUCT_REPORT"
+						}
+						// 閾佽姱杞﹂棿-绾靛壀
+						if (this.isOperationName('TX-01', '绾靛壀')) {
+							obj.productReportZongjian = {
+								finishQty: '1',
+								labelNo: this.form.labelNo,
+								llength: this.form.length,
+								qty: '1',
+								rwMatlBindDTOList: this.infoFormList,
+								sliceWidth: this.form.siliconSteelCode.width,
+								workstationId: this.workOrder.workstationId,
+								wweight: this.form.weight
+							}
+							obj.reportType = "ZONGJIAN_PRODUCT_REPORT"
+						}
+						// 閾佽姱杞﹂棿-妯壀
+						if (this.isOperationName('TX-01', '妯壀')) {
+							obj.productReportHengjian = {
+								finishQty: '1',
+								qty: '1',
+								rwMatlBindDTOList: this.infoFormList,
+								sliceQty: this.form.sliceQty,
+								workstationId: this.workOrder.workstationId,
+								wweight: '',
+								prodClass: this.form.outputCategory
+							}
+							// 娣诲姞鐗囧
+							if (this.isOperationName('TX-01', '妯壀') && this.form.outputCategoryLabel !==
+								'涓煴') {
+								obj.productReportHengjian.sliceWidth = this.form.sliceWidth
+							}
+							obj.reportType = "HENGJIAN_PRODUCT_REPORT"
+						}
+						// 閾佽姱杞﹂棿-鍙犺
+						if (this.isOperationName('TX-02', '鍙犺')) {
+							obj.productReportDiezhuang = {
+								clampOtherWeight: this.form.clampOtherWeight,
+								finishQty: this.form.finishQty,
+								labelNo: this.form.labelNo,
+								llength: '',
+								prodWeight: this.form.prodWeight,
+								qty: "1",
+								rwMatlBindDTOList: this.infoFormList,
+								workstationId: this.workOrder.workstationId,
+								wweight: '0.00'
+							}
+							obj.reportType = "DIEZHUANG_PRODUCT_REPORT"
+						}
+						// 閾佽姱杞﹂棿-鍏朵粬宸ュ簭
+						if ((this.isShowWorkCenter('TX-02') && this.workOrder.operationName !== '鍙犺')) {
+							obj.operationId = this.workOrder.operationId
+							obj.productReportOtherOperation = {
+								labelNo: this.form.labelNo,
+								workstationId: this.workOrder.workstationId
+							}
+							obj.reportType = "OTHER_OPERATION_PRODUCT_REPORT"
+						}
+						// 鎴愬搧鎬昏(鍏朵粬杞﹂棿)
+						if (this.isShowWorkCenter('BZ-01')) {
+							obj.productReportFprodZongzhuang = {
+								id: null,
+								labelNo: this.form.labelNo,
+								operationType: null,
+								qty: this.form.finishQty,
+								rwMatlBindDTOList: this.infoFormList,
+								workstationId: this.workOrder.workstationId,
+							}
+							obj.reportType = "F_PROD_ZONGZHUANG_PRODUCT_REPORT"
+						}
+						// 濂楄杞﹂棿
+						if (this.isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+							obj.productReportOther = {
+								finishQty: this.form.finishQty,
+								labelNo: this.form.labelNo,
+								llength: '',
+								qty: this.form.finishQty,
+								rwMatlBindDTOList: this.infoFormList,
+								workstationId: this.workOrder.workstationId,
+								wweight: ''
+							}
+							obj.reportType = "OTHER_PRODUCT_REPORT"
+						}
+						// 鎶ュ伐鎻愪氦
+						console.log("鎶ュ伐鎻愪氦", obj)
+						let productReportRes = await this.$u.api.dailyPaper.productReport(obj)
+						console.log("鎶ュ伐鎻愪氦", productReportRes)
+						if (productReportRes.code === 0) {
+							this.$refs.uToast.show({
+								title: '鎶ュ伐鎴愬姛',
+								type: 'success '
+							})
+							// 閾佽姱杞﹂棿-妯壀  鏄剧ず鏍囩鎵撳嵃
+							if (this.isOperationName('TX-01', '妯壀')) {
+								this.isSubmit = true
+							}
+							//澹伴煶鍜屾尟鍔�
+							uni.playVoice({
+							    filePath: '/static/y1253.mp3', // 鎻愮ず闊虫枃浠惰矾寰�
+							    complete: () => {
+							      console.log('鎻愮ず闊虫挱鏀惧畬鎴�');
+							    }
+							  });
+							    uni.vibrateShort(); // 鐭殏鎸姩
+						}
+						console.log('楠岃瘉閫氳繃');
+					} else {
+						console.log('楠岃瘉澶辫触');
+					}
+				});
+			},
+			// 鏁寸悊鎶ュ伐鍏叡鏁版嵁
+			getProductReportData() {
+				console.log("鎶ュ伐鎻愪氦", this.workOrder, this.form)
+				this.form.clazzType = this.workOrder.clazzType
+				this.form.dutyNo = this.workOrder.dutyNo
+				// this.form.operationTaskId = this.workOrder.id
+				this.form.reportTime = dateFormat(new Date(), 'yyyy-MM-dd') + ' 00:00:00'
+				this.form.reportUserList = this.workOrder.userStaffNo
+				this.form.workstationName = this.workOrder.workstationName
+				let obj
+				if ((this.isShowWorkCenter('TX-02') && this.workOrder.operationName !== '鍙犺') || this.isFirstOperationId(
+						'DY-01,GY-01,YB-01,YB-02') || this.isShowWorkCenter('TM-01,JG-01锛孻B-04') ||this.isNotOperationName('ZZ-02', '浜岃,娉ㄦ补')) {
+					obj = Object.assign({
+						clazzType: this.workOrder.clazzType,
+						dutyNo: this.workOrder.dutyNo,
+						operationTaskId: 12, //闅忎究濉� 
+						locationId: this.form.locationId,
+						reportTime: dateFormat(new Date(), 'yyyy-MM-dd') + ' 00:00:00',
+						reportUserList: this.workOrder.userStaffNo,
+						workstationName: this.workOrder.workstationName,
+					})
+				} else {
+					obj = Object.assign({
+						clazzType: this.workOrder.clazzType,
+						dutyNo: this.workOrder.dutyNo,
+						operationTaskId: this.workOrder.id,
+						locationId: this.form.locationId,
+						reportTime: dateFormat(new Date(), 'yyyy-MM-dd') + ' 00:00:00',
+						reportUserList: this.workOrder.userStaffNo.split(','),
+						workstationName: this.workOrder.workstationName,
+					})
+				}
+				return obj
+			},
+			identifyingQrCodes() {
+				uni.scanCode({
+					success: (res) => {
+						this.identifyingQrCodesBlur(res.result)
+					},
+					fail: (err) => {}
+				})
+			},
+			async identifyingQrCodesBlur(result) {
+				let labelNo = ""
+				let json ={}
+				if(this.isJSON(result)){
+				    json = JSON.parse(result)
+					labelNo = json.ID
+				}else{
+					labelNo = result
+				}
+				console.log(labelNo)
+				// 濡傛灉涓虹嚎鍦堣溅闂�-杩囧笎闇�瑕佹煡璇�
+				if (this.isShowWorkCenter('TM-01,JG-01,YB-04') || this.isFirstOperationId(
+						'DY-01,GY-01,YB-01,YB-02,ZM-01')) {
+					this.form.labelNo = labelNo
+					let params = {
+						partNo: json.part_no
+					}
+					await this.$u.api.dailyPaper.findByNo(params).then(r => {
+						console.log(r)
+						this.form.drawNo = r.data.drawNo
+						this.form.weight = r.data.specificationModel
+						this.form.weightTwo = r.data.partName
+						this.submit()
+					})
+					// await this.scanCodeData(json.ID, 'listReportOtherOperation')
+					this.$set(this.form, 'finishQty', this.form.identifyingQr.finishQty)
+					// this.scanCodeData(result, 'listReportXianQuanNonFirst')
+				}
+				// 澶栧3杞﹂棿-鏈�鍚庝竴閬撳伐搴�
+				if (this.isShowWorkCenter('WK-01') && this.workOrder.operationId === this.workOrder.lastOperationId) {
+					this.scanCodeData(labelNo, 'listReportWaike')
+				}
+				// 绠卞彉杞﹂棿(鎴愬杞﹂棿)
+				if (this.isShowWorkCenter('ZZ-03')) {
+					console.log(this.workOrder.workCenter)
+					this.scanCodeData(labelNo, 'listReportChengtao')
+				}
+				// 鎬昏杞﹂棿
+				if (this.isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+					this.scanCodeData(labelNo, 'listReportZongzhuang')
+				}
+				// 閾佽姱杞﹂棿-绾靛壀
+				if (this.isOperationName('TX-01', '绾靛壀')) {
+					// 鏉$爜缂栧彿鎵弿鍚庣殑鏁版嵁澶勭悊
+					this.scanCodeData(labelNo, 'listReportZongjian')
+				}
+				// 閾佽姱杞﹂棿-鍙犺
+				if (this.isOperationName('TX-02', '鍙犺')) {
+					// 榛樿涓�
+					this.$set(this.form, 'finishQty', 1)
+					await this.scanCodeData(labelNo, 'listReportDieZhuang')
+				}
+				// 閾佽姱杞﹂棿-鍏朵粬宸ュ簭
+				if ((this.isShowWorkCenter('TX-02') && this.workOrder.operationName !== '鍙犺')) {
+					this.form.labelNo = labelNo
+					let params = {
+						partNo: json.part_no
+					}
+					console.log(params)
+					await this.$u.api.dailyPaper.findByNo(params).then(r => {
+						console.log(r)
+						this.form.drawNo = r.data.drawNo
+						this.form.weight = r.data.specificationModel
+						this.submit()
+					})
+					// await this.scanCodeData(result, 'listReportOtherOperation')
+					this.$set(this.form, 'finishQty', this.form.identifyingQr.finishQty)
+				}
+				// 鎴愬搧鎬昏(鍏朵粬杞﹂棿)
+				if (this.isShowWorkCenter('BZ-01')) {
+					this.form.labelNo = labelNo
+					// await this.scanCodeData(result, 'listReportFprodZongzhuang')
+				}
+				// 濂楄杞﹂棿
+				if (this.isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+					await this.scanCodeData(labelNo, 'listReportOther')
+					this.$set(this.form, 'finishQty', 1)
+
+					//澧炲姞鍒版姇鍏ョ墿鏂�
+					// // 鑾峰彇鍗婃垚鍝佸簱瀛樼被鍨�
+					const obj = {
+						lotBatchNo: labelNo,
+						optaskId: this.workOrder.id,
+						locationId: this.form.locationId
+					}
+					// 鏍规嵁鎵规鍙锋潯浠舵煡璇�
+					let feeding = await this.$u.api.dailyPaper.getFeeding(obj)
+					let isExist = false
+					this.infoFormList.forEach(i => {
+						if (i.lotBatchNo === feeding.data.lotBatchNo) {
+							isExist = true
+						}
+					})
+					// 娣诲姞缁欓〉闈�
+					if (!isExist) {
+						this.infoFormList.push(feeding.data)
+					} else {
+						this.$refs.uToast.show({
+							title: '璇峰嬁閲嶅鎶曟枡锛�',
+							type: 'warning '
+						})
+					}
+				}
+			},
+			// 杞﹂棿鎶ュ伐鎵爜鎶曟枡浣跨敤鐨勫崐鎴愬搧搴撳瓨绫诲瀷
+			judgmentWorkshop() {
+				// 鎴愬 -> 鏈綋锛歋ELF_BODY
+				if (this.isShowWorkCenter('ZZ-03')&& this.isWorkStationName('ZZ-03','绠变綋缁勮')) {
+					return 'SELF_BODY'
+				}
+				// 濂楄 -> 閾佽姱锛欼RON_CORE
+				if (this.isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+					return 'IRON_CORE'
+				}
+				// 鎬昏 -> 鍣ㄨ韩锛歁AIN_BODY
+				if (this.isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+					return 'MAIN_BODY'
+				}
+				// 鎴愬搧鎬昏 -> 鏈綋锛歋ELF_BODY
+				if (this.isShowWorkCenter('BZ-01')) {
+					return 'SELF_BODY'
+				}
+			},
+			qrCode() {
+				uni.scanCode({
+					success: async (res) => {
+						let json = JSON.parse(res.result)
+						console.log(json)
+						if (this.isShowWorkCenter('ZZ-03')&& this.isWorkStationName('ZZ-03','绠变綋缁勮') && (json.ID.startsWith("GY") || json.ID.startsWith(
+								"DY"))) {
+							if (json.ID.startsWith("GY")) {
+								if (this.hvCoilFormList.includes(json.ID)) {
+									this.$refs.uToast.show({
+										title: '璇峰嬁閲嶅鎵爜锛�',
+										type: 'warning '
+									})
+									return
+								}
+								this.hvCoilFormList.push(json.ID)
+							} else {
+								if (this.lvCoilFormList.includes(json.ID)) {
+									this.$refs.uToast.show({
+										title: '璇峰嬁閲嶅鎵爜锛�',
+										type: 'warning '
+									})
+									return
+								}
+								this.lvCoilFormList.push(json.ID)
+							}
+						} else {
+							// // 鑾峰彇鍗婃垚鍝佸簱瀛樼被鍨�
+							let sfpInvType = await this.judgmentWorkshop()
+							const obj = {
+								lotBatchNo: json.lot_batch_no,
+								optaskId: this.workOrder.id,
+								locationId: this.form.locationId
+							}
+							if (sfpInvType) {
+								obj.sfpInvType = sfpInvType
+							}
+							// 鏍规嵁鎵规鍙锋潯浠舵煡璇�
+							let feeding = await this.$u.api.dailyPaper.getFeeding(obj)
+							// 閾佽姱杞﹂棿-鍓垏
+							if (this.isOperationName('TX-01', '绾靛壀')) {
+								if (this.infoFormList.length >= 1) {
+									this.$refs.uToast.show({
+										title: '鍙兘娣诲姞涓�鏉℃暟鎹繘琛屾姤宸�',
+										type: 'warning '
+									})
+									return
+								}
+								// 鏌ヨ鏉ユ枡妫�娴嬶紝鏌ヨ閲嶉噺淇℃伅
+								await this.getSiliconSteelCode(json.lot_batch_no)
+								// 璁$畻閲嶉噺
+								await this.calculateWeight()
+							}
+							let isExist = false
+							this.infoFormList.forEach(i => {
+								if (i.lotBatchNo === feeding.data.lotBatchNo) {
+									isExist = true
+								}
+							})
+							// 娣诲姞缁欓〉闈�
+							if (!isExist) {
+								this.infoFormList.push(feeding.data)
+								// }
+							} else {
+								this.$refs.uToast.show({
+									title: '璇峰嬁閲嶅鎶曟枡锛�',
+									type: 'warning '
+								})
+							}
+						}
+					},
+					fail: (err) => {}
+				})
+			},
+			// 寮瑰嚭鏄惁鍒犻櫎鎶曟枡妗嗘
+			deleteInfo(index) {
+				this.show = true
+				this.deleteIndex = index
+			},
+			deleteInfoDy(index) {
+				this.lvCoilFormList.splice(index, 1)
+			},
+			deleteInfoGy(index) {
+				this.hvCoilFormList.splice(index, 1)
+			},
+			// 鍒犻櫎鎶曟枡
+			confirm() {
+				this.infoFormList.splice(this.deleteIndex, 1)
+			},
+			// 绫诲瀷select纭畾
+			workTypeTypeFirm(e) {
+				this.form.type = e[0].value
+				this.form.typeLabel = e[0].label
+			},
+			// 宸ュ簭绫诲瀷select纭畾
+			operationTypeFirm(e) {
+				this.form.operationType = e[0].value
+				this.form.operationTypeLabel = e[0].label
+				if (this.isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+					if (e[0].label === '椋庢満瑁呴厤') {
+						this.$set(this.form, 'finishQty', '')
+						this.isFanAssembly = true
+					} else {
+						this.$set(this.form, 'finishQty', 1)
+					}
+				}
+			},
+			// 浜у嚭绫诲埆 select閫夋嫨
+			outputCategoryFirm(e) {
+				this.form.outputCategory = e[0].value
+				this.form.outputCategoryLabel = e[0].label
+			},
+			// 鏉$爜缂栧彿鎵弿鍚庣殑鏁版嵁澶勭悊
+			async scanCodeData(result, apiName) {
+				console.log(result)
+				if (!result) {
+					return
+				}
+				const params = {
+					id: this.workOrder.id
+				}
+				await this.$u.api.dailyPaper[apiName](params).then(r => {
+					console.log(r)
+					r.data.forEach(i => {
+						if (i.labelNo === result) {
+							i.reportTime = null
+							this.form.labelNo = i.labelNo
+							this.form.identifyingQr = i
+							this.$refs.uToast.show({
+								title: '鎵爜鎴愬姛锛�',
+								type: 'success '
+							})
+						}
+					})
+					if (!this.form.identifyingQr.labelNo) {
+						this.$refs.uToast.show({
+							title: '鏈煡璇㈠埌璇ョ紪鍙凤紒',
+							type: 'warning '
+						})
+					}
+				})
+			},
+			// 鏌ヨ鏉ユ枡妫�淇℃伅
+			async getSiliconSteelCode(lotBatchNo) {
+				const params = {
+					siliconSteelCode: lotBatchNo
+				}
+				await this.$u.api.dailyPaper.siliconSteelCode(params).then(res => {
+					this.form.siliconSteelCode = res.data
+				})
+			},
+			// 璁$畻閲嶉噺
+			calculateWeight() {
+				if (this.form.siliconSteelCode) {
+					let sum = this.form.siliconSteelCode.width * this.form.siliconSteelCode.thickness * 7.65
+					if (this.form.length) {
+						sum = sum * this.form.length / 1000
+						let result = Number(sum).toFixed(2)
+						this.$set(this.form, 'weight', result)
+					}
+				}
+			},
+			isJSON(str) {
+			   try {
+			          const result = JSON.parse(str);
+			          return typeof result === 'object' && result !== null;
+			      } catch (e) {
+			          return false;
+			      }
+			},
+			//杈撳叆鑾峰彇鎶曟枡淇℃伅
+			async getPart(){
+				console.log(this.partID)
+				if (this.isShowWorkCenter('ZZ-03')&& this.isWorkStationName('ZZ-03','绠变綋缁勮') && (this.partID.startsWith("GY") || this.partID.startsWith(
+						"DY"))) {
+					if (this.partID.startsWith("GY")) {
+						if (this.hvCoilFormList.includes(this.partID)) {
+							this.$refs.uToast.show({
+								title: '璇峰嬁閲嶅鎵爜锛�',
+								type: 'warning '
+							})
+							return
+						}
+						this.hvCoilFormList.push(this.partID)
+					} else {
+						if (this.lvCoilFormList.includes(this.partID)) {
+							this.$refs.uToast.show({
+								title: '璇峰嬁閲嶅鎵爜锛�',
+								type: 'warning '
+							})
+							return
+						}
+						this.lvCoilFormList.push(this.partID)
+					}
+				} else {
+					// // 鑾峰彇鍗婃垚鍝佸簱瀛樼被鍨�
+					let sfpInvType = await this.judgmentWorkshop()
+					const obj = {
+						lotBatchNo: "*",
+						optaskId: this.workOrder.id,
+						locationId: this.form.locationId
+					}
+					if (sfpInvType) {
+						obj.sfpInvType = sfpInvType
+					}
+					// 鏍规嵁鎵规鍙锋潯浠舵煡璇�
+					let feeding = await this.$u.api.dailyPaper.getFeeding(obj)
+					// 閾佽姱杞﹂棿-鍓垏
+					if (this.isOperationName('TX-01', '绾靛壀')) {
+						if (this.infoFormList.length >= 1) {
+							this.$refs.uToast.show({
+								title: '鍙兘娣诲姞涓�鏉℃暟鎹繘琛屾姤宸�',
+								type: 'warning '
+							})
+							return
+						}
+						// 鏌ヨ鏉ユ枡妫�娴嬶紝鏌ヨ閲嶉噺淇℃伅
+						await this.getSiliconSteelCode('*')
+						// 璁$畻閲嶉噺
+						await this.calculateWeight()
+					}
+					let isExist = false
+					this.infoFormList.forEach(i => {
+						if (i.lotBatchNo === feeding.data.lotBatchNo) {
+							isExist = true
+						}
+					})
+					// 娣诲姞缁欓〉闈�
+					if (!isExist) {
+						this.infoFormList.push(feeding.data)
+						// }
+					} else {
+						this.$refs.uToast.show({
+							title: '璇峰嬁閲嶅鎶曟枡锛�',
+							type: 'warning '
+						})
+					}
+			}
+		},
+		onLoad(options) {
+			// 鍒濆鍖朣DK
+			jcapi.initSDK()
+			// 鐩戝惉椤电爜鍥炶皟
+			jcapi.didReadPrintCountInfo(function(r) {
+				console.log(r)
+			})
+
+			// 鐩戝惉閿欒鍥炶皟
+			jcapi.didReadPrintErrorInfo(function(r) {
+				console.log(r)
+				if (r.code == 23) {
+					// 鎵撳嵃鏈烘柇寮�杩炴帴
+					_this.connectedDevice = null
+				}
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(r),
+					duration: 2 * 1000
+				})
+			})
+			this.workOrder = JSON.parse(decodeURIComponent(options.info))
+			console.log(this.workOrder)
+			this.form.drawNo = this.workOrder.drawNo
+			this.id = this.workOrder.id
+			// 濡傛灉涓洪挘閲戣溅闂存煡璇㈢被鍨�
+			if (this.isShowWorkCenter('BJ-01')) {
+				this.$u.api.dictData({
+					dictType: 'work_type'
+				}).then((res) => {
+					if (res.code === 0 && res.data.length > 0) {
+						this.workTypeList = res.data
+					}
+				})
+			}
+			// 濡傛灉涓虹鍙樿溅闂�(鎴愬杞﹂棿) 鏌ヨ宸ュ簭绫诲瀷
+			if (this.isShowWorkCenter('ZZ-03')) {
+				this.$u.api.dictData({
+					dictType: 'suit_process_type'
+				}).then((res) => {
+					if (res.code === 0 && res.data.length > 0) {
+						this.operationTypeList = res.data
+					}
+				})
+			}
+			// 鎬昏杞﹂棿
+			if (this.isOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+				if (this.workOrder.partName.includes('娌瑰彉')) {
+					this.isOilChange = true
+				}
+				this.$u.api.dictData({
+					dictType: 'assembly_process_type'
+				}).then((res) => {
+					if (res.code === 0 && res.data.length > 0) {
+						this.operationTypeList = res.data
+					}
+				})
+			}
+			// 閾佽姱杞﹂棿-妯壀
+			if (this.isOperationName('TX-01', '妯壀')) {
+				this.$u.api.dictData({
+					dictType: 'hj_prod_class'
+				}).then((res) => {
+					if (res.code === 0 && res.data.length > 0) {
+						this.outputCategoryList = res.data
+					}
+				})
+			}
+			const params = {
+				workstationId: this.workOrder.workstationId
+			}
+			// 鑾峰彇locationId搴撲綅id
+			this.$u.api.dailyPaper.getLocationId(params).then(res => {
+				this.form.locationId = res.data.qualifiedLocationIds[0]
+			})
+		},
+		onReady() {
+			this.$refs.uForm.setRules(this.rules);
+		}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.uni-list_name {
+		font-size: 30rpx;
+		color: #333;
+	}
+
+	.uni-list_item {
+		font-size: 24rpx;
+		color: #555;
+		line-height: 1.5;
+	}
+
+	.uni-list-box {
+		margin: 0 20rpx;
+		padding: 15rpx 0;
+		border-bottom: 1px #f5f5f5 solid;
+		box-sizing: border-box;
+	}
+
+	.uni-scroll_box {
+		height: 70%;
+		background: #fff;
+		border-radius: 20rpx;
+	}
+
+	.uni-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		bottom: 0;
+		display: flex;
+		align-items: center;
+		width: 100%;
+		background: rgba(0, 0, 0, 0.6);
+		padding: 0 30rpx;
+		box-sizing: border-box;
+	}
+
+	.work-reporting {
+		background-color: #e6f0ff;
+		width: 100%;
+		height: 100vh;
+		box-sizing: border-box;
+
+		::v-deep.navbar-right {
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #FFFFFF;
+			line-height: 36rpx;
+			margin-right: 32rpx;
+		}
+
+		.scroll-Y {
+			width: 100%;
+			height: calc(100vh - 270rpx);
+
+			.form {
+				background: linear-gradient(180deg, #D8E8FF 0%, #FFFFFF 100%);
+				border-radius: 10rpx;
+				margin: 68rpx 30rpx 0;
+				padding: 36rpx 26rpx 0;
+				position: relative;
+
+				.form-title {
+					font-weight: 800;
+					font-size: 34rpx;
+					color: #1D2541;
+					margin-bottom: 30rpx;
+				}
+
+				.icon_report {
+					background-image: url('~@/static/custom/daily/icon_report.png');
+					background-repeat: no-repeat;
+					background-size: cover;
+					height: 170rpx;
+					width: 170rpx;
+					position: absolute;
+					top: -64rpx;
+					right: -30rpx;
+				}
+			}
+
+			.scan-code-feeding {
+				background: linear-gradient(180deg, #D8E8FF 0%, #F3F8FF 100%);
+				border-radius: 10rpx;
+				margin: 20rpx 30rpx 68rpx;
+				padding: 36rpx 16rpx 58rpx;
+				position: relative;
+
+				.form-title {
+					font-weight: 800;
+					font-size: 34rpx;
+					color: #1D2541;
+					padding-left: 10rpx;
+					margin-bottom: 30rpx;
+				}
+
+				.icon_camera {
+					background-image: url('~@/static/custom/daily/icon_camera.png');
+					background-repeat: no-repeat;
+					background-size: cover;
+					height: 82rpx;
+					width: 82rpx;
+					position: absolute;
+					top: 18rpx;
+					right: 28rpx;
+				}
+
+				.infoform {
+					background: #FFFFFF;
+					border-radius: 10rpx;
+					border: 1px solid #EAF2FF;
+					box-sizing: border-box;
+					padding: 30rpx 24rpx;
+					margin-top: 20rpx;
+
+					p {
+						font-weight: 500;
+						font-size: 26rpx;
+						color: #333333;
+						margin-bottom: 24rpx;
+
+						.icon_zl {
+							background-image: url('~@/static/custom/daily/icon_zl.png');
+							background-repeat: no-repeat;
+							background-size: cover;
+							height: 24rpx;
+							width: 24rpx;
+							margin-right: 6rpx;
+							margin-bottom: 6rpx;
+							vertical-align: middle;
+							position: relative;
+						}
+
+						.icon_7 {
+							background-image: url('~@/static/custom/daily/icon_7.png');
+							background-repeat: no-repeat;
+							background-size: cover;
+							height: 24rpx;
+							width: 24rpx;
+							margin-right: 6rpx;
+							margin-bottom: 6rpx;
+							vertical-align: middle;
+							position: relative;
+						}
+
+						.icon_6 {
+							background-image: url('~@/static/custom/daily/icon_6.png');
+							background-repeat: no-repeat;
+							background-size: cover;
+							height: 24rpx;
+							width: 24rpx;
+							margin-right: 6rpx;
+							margin-bottom: 6rpx;
+							vertical-align: middle;
+							position: relative;
+						}
+					}
+
+					.buttonFlex {
+						display: flex;
+						justify-content: flex-end;
+						flex-direction: row;
+
+						.delete-button {
+							height: 66rpx;
+							background: #FFFFFF;
+							border-radius: 8rpx;
+							border: 1px solid #D6655C;
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #D6655C;
+							margin: 24rpx 24rpx 0 206rpx;
+							line-height: 66rpx;
+
+							.icon_del {
+								background-image: url('~@/static/custom/daily/icon_del.png');
+								background-repeat: no-repeat;
+								background-size: cover;
+								height: 32rpx;
+								width: 32rpx;
+								margin-right: 8rpx;
+								margin-bottom: 8rpx;
+								vertical-align: middle;
+								position: relative;
+							}
+						}
+
+						.primary-button {
+							height: 66rpx;
+							background: #FFFFFF;
+							border-radius: 8rpx;
+							border: 1px solid #214DED;
+							font-weight: 500;
+							font-size: 28rpx;
+							color: #214DED;
+							line-height: 66rpx;
+							margin: 24rpx 0 0 0;
+
+							.icon_dy {
+								background-image: url('~@/static/custom/daily/icon_dy.png');
+								background-repeat: no-repeat;
+								background-size: cover;
+								height: 32rpx;
+								width: 32rpx;
+								margin-right: 8rpx;
+								margin-bottom: 8rpx;
+								vertical-align: middle;
+								position: relative;
+							}
+						}
+					}
+				}
+			}
+		}
+
+		.bottom {
+			width: 100vw;
+			position: fixed;
+			bottom: 60rpx;
+
+			.u-button {
+				width: 690rpx;
+				height: 80rpx;
+				background: #214DED;
+				border-radius: 8rpx;
+				font-weight: 500;
+				font-size: 34rpx;
+				color: #FFFFFF;
+				z-index: 99;
+			}
+		}
+	}
+
+	::v-deep.u-form-item--left__content__label {
+		padding-left: 26rpx;
+		font-weight: 500;
+		font-size: 30rpx;
+		color: #4F4F4F;
+		line-height: 80rpx;
+	}
+
+	::v-deep.u-form-item--left__content--required {
+		left: 8rpx;
+		top: 0;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/daily/daily/daily-list.vue b/pages/daily/daily/daily-list.vue
new file mode 100644
index 0000000..8f7192f
--- /dev/null
+++ b/pages/daily/daily/daily-list.vue
@@ -0,0 +1,228 @@
+<template>
+  <view class="daily-list">
+    <view class="search">
+      <u-search placeholder="璇疯緭鍏ュ伐浣滅珯鍚嶇О鎼滅储" v-model="keyword" bgColor="#fff"
+      placeholderColor="#999999" :showAction="false" style="margin: 35rpx;"
+      searchIconColor="#6A6A6A" height="74" @search="search" @change="search"></u-search>
+    </view>
+    <scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<view v-for="(item,index) in list" :key="'item'+index" class="list-item">
+        <h4>
+	        <u-icon class="icon_1" size="24rpx"/>
+          <text selectable class="list-item-num">{{ item.dutyNo }}</text>
+        </h4>
+        <view class="item-box" @click="goHome(item)">
+          <p>
+	          <u-icon class="icon_2" size="24rpx"/>
+            <span class="item-box-title">宸ヤ綔绔�:</span>
+            <span class="item-box-info">{{item.workstationName}}</span>
+          </p>
+          <p>
+	          <u-icon class="icon_3" size="24rpx"/>
+            <span class="item-box-title">鐢熶骇浜哄憳:</span>
+	          <span class="item-box-info">{{item.productionUser}}</span>
+          </p>
+          <p style="margin-bottom: 0;">
+	          <u-icon class="icon_4" size="24rpx"/>
+            <span class="item-box-title">鏃ユ湡:</span>
+	          <span class="item-box-info">{{item.createTime}}</span>
+          </p>
+        </view>
+      </view>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+  </view>
+</template>
+
+<script>
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+export default {
+	components: {UIcon},
+  data() {
+    return {
+      keyword:'',
+      loadStatus: 'loadmore',
+      total:0,
+      query:{
+        current:1,
+        size:10,
+	      workstationName: ''
+		  
+      },
+      list:[]
+    }
+  },
+  onLoad() {
+			this.loadList();
+		},
+  methods: {
+    loadMore() {
+      this.loadStatus = "loading";
+      setTimeout(() => {
+        this.query.current += 1;
+        this.loadList();
+      }, 100);
+    },
+    // 鍦ㄦ鍔犺浇鍒楄〃
+    loadList(){
+      this.$u.api.dailyPaper.dutyRecordPage(this.query).then(res => {
+	      if (res.code === 0) {
+		        if (!res.data.records || res.data.records.length === 0) {
+		          this.loadStatus = "nomore";
+		          return;
+		        }
+						if (this.query.current === 1) {
+							this.list = res.data.records
+						} else {
+							this.list = this.list.concat(res.data.records);
+						}
+		      this.list.forEach(item => {
+			      item.createTime = item.createTime.slice(0,10)
+		      })
+		        this.total = res.data.total;
+		        this.query.current = res.data.current;
+		        this.query.size = res.data.size;
+		        this.loadStatus = "loadmore";
+	      }
+      });
+    },
+    // 鎼滅储
+    search(e){
+	    this.query = {
+		    current:1,
+		    size:10,
+		    workstationName: e
+	    }
+	    this.loadList()
+    },
+	  // 璺宠浆鍒版棩鎶ラ椤�
+	  goHome (info) {
+		  uni.$emit('dailyListInfo',info)
+		  uni.switchTab({
+			  url: '/pages/sys/home/index?info='
+		  })
+	  }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.daily-list{
+  width: 100%;
+  height: calc(100vh - 88rpx);
+  background: #E6EFFF;
+  overflow-y: auto;
+  box-sizing: border-box;
+  padding-bottom: 24rpx;
+	position: relative;
+  .search{
+    position: fixed;
+	  width: 100%;
+	  z-index: 99;
+	  height: 120rpx;
+	  background: #E6EFFF;
+  }
+  .scroll-list{
+	  top: 120rpx;
+	  overflow-y: auto;
+	  position: absolute;
+    box-sizing: border-box;
+    padding: 0 32rpx;
+	  .list-item{
+		  background: #FFFFFF;
+		  border-radius: 10rpx;
+		  box-sizing: border-box;
+		  padding: 32rpx 16rpx;
+		  margin-bottom: 20rpx;
+		  position: relative;
+		  h4{
+			  display: flex;
+			  align-items: center;
+			  font-weight: bold;
+			  font-size: 28rpx;
+			  color: #333333;
+			  margin-bottom: 25rpx;
+			  .icon_1 {
+				  background-image: url('~@/static/custom/daily/icon_1.png');
+				  background-repeat: no-repeat;
+				  background-size: cover;
+				  height: 24rpx;
+				  width: 24rpx;
+				  margin-right: 8rpx;
+				  position: relative;
+			  }
+			  .list-item-num {
+				  font-weight: bold;
+				  font-size: 28rpx;
+				  color: #333333;
+			  }
+		  }
+		  .item-box{
+			  background: #F5F9FF;
+			  border-radius: 10rpx;
+			  box-sizing: border-box;
+			  padding: 30rpx 24rpx;
+			  p{
+				  font-weight: 500;
+				  font-size: 26rpx;
+				  color: #333333;
+				  margin-bottom: 24rpx;
+				  .icon_2 {
+					  background-image: url('~@/static/custom/daily/icon_2.png');
+					  background-repeat: no-repeat;
+					  background-size: cover;
+					  height: 24rpx;
+					  width: 24rpx;
+					  margin-right: 12rpx;
+					  position: relative;
+					  margin-bottom: 6rpx;
+					  vertical-align: middle;
+				  }
+				  .icon_3 {
+					  background-image: url('~@/static/custom/daily/icon_3.png');
+					  background-repeat: no-repeat;
+					  background-size: cover;
+					  height: 24rpx;
+					  width: 24rpx;
+					  margin-right: 12rpx;
+					  position: relative;
+					  margin-bottom: 6rpx;
+					  vertical-align: middle;
+				  }
+				  .icon_4 {
+					  background-image: url('~@/static/custom/daily/icon_4.png');
+					  background-repeat: no-repeat;
+					  background-size: cover;
+					  height: 24rpx;
+					  width: 24rpx;
+					  margin-right: 12rpx;
+					  position: relative;
+					  margin-bottom: 6rpx;
+					  vertical-align: middle;
+				  }
+				  .item-box-title {
+					  margin-right: 20rpx;
+					  display: inline-block;
+					  text-align-last: justify;
+					  width: 120rpx;
+					  font-weight: 500;
+					  font-size: 26rpx;
+					  color: #333333;
+				  }
+				  .item-box-info {
+					  font-weight: 500;
+					  font-size: 26rpx;
+					  color: #333333;
+				  }
+			  }
+		  }
+	  }
+	  .loadmore {
+		  height: 60rpx;
+	  }
+  }
+}
+</style>
diff --git a/pages/daily/handyman/handyman.vue b/pages/daily/handyman/handyman.vue
new file mode 100644
index 0000000..1e3bc49
--- /dev/null
+++ b/pages/daily/handyman/handyman.vue
@@ -0,0 +1,268 @@
+<template>
+	<view class="body">
+		<view class="main_view">
+			<u-form :model="query" ref="query">
+				<u-form-item label="鏉傚伐浜嬮」" required :label-width="180" prop="handymanItemName">
+					<u-input v-model="query.handymanItemName" placeholder="璇疯緭鍏�"/>
+					<!-- <u-icon name="arrow-right" @click="goPage(0)"></u-icon> -->
+				</u-form-item>
+				<u-form-item label="鏃堕暱" required :label-width="180" prop="duration">
+					<u-input v-model="query.duration" placeholder="璇疯緭鍏�"/>
+				</u-form-item>
+				<u-form-item label="鐢熶骇浜哄憳" required :label-width="180" prop="prodUser">
+					<u-input v-model="query.prodUser" type="select" placeholder="璇烽�夋嫨"/>
+					<u-icon name="arrow-right" @click="goPage(1)"></u-icon>
+				</u-form-item>
+				<u-form-item label="璐d换浜�" required :label-width="180" prop="principalName">
+					<u-input v-model="query.principalName" type="select" placeholder="璇烽�夋嫨"/>
+					<u-icon name="arrow-right" @click="goPage(2)"></u-icon>
+				</u-form-item>
+			</u-form>
+		</view>
+		<view class="bottom">
+			<u-button class="u-button" type="primary" @click="submit" :loading="loading">鎻愪氦</u-button>
+		</view>
+		<u-select v-model="handymanItemListShow" :list="handymanItemList" @confirm="confirmOperation"></u-select>
+		<u-select v-model="handymanRecordListShow" :list="handymanRecordList" @confirm="confirmHandymanRecord"></u-select>
+	</view>
+</template>
+
+<script>
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+export default {
+	name: "handyman",
+	// import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+	components: {UIcon},
+	data() {
+		// 杩欓噷瀛樻斁鏁版嵁
+		return {
+			query: {
+				duration: '', // 鏃堕暱
+				dutyNo: '', // 鏃ユ姤缂栧彿
+				dutyTime: '', // 鏃ユ姤鏃堕棿
+				handymanItem: '', // 鏉傚伐浜嬮」
+				principalId: '', // 璐熻矗浜篿d
+				prodStaffNoList: '', // 鍏宠仈鐨勭敓浜т汉鍛榠d[list]
+				prodUser: '', // 鐢熶骇浜哄憳
+				principalName: '', // 璐熻矗浜哄悕绉�
+				handymanRecordApprover:'',
+				handymanRecordApproverName:'',
+				handymanRecordId:0,
+				handymanItemName: '', // 鏉傚伐浜嬮」鍚嶇О
+			},
+			rules: {
+				handymanItemName: [
+					{
+						required: true,
+						message: '璇烽�夋嫨鏉傚伐浜嬮」',
+						// 鍙互鍗曚釜鎴栬�呭悓鏃跺啓涓や釜瑙﹀彂楠岃瘉鏂瑰紡
+						trigger: ['change'],
+					}
+				],
+				duration: [
+					{
+						required: true,
+						message: '璇疯緭鍏�',
+						trigger: ['change','blur'],
+					},
+					// 姝e垯鍒ゆ柇鏁板瓧
+					{
+						validator: (rule, value, callback) => {
+							return this.$u.test.amount(value);
+						},
+						message: '璇疯緭鍏ユ纭�',
+						// 瑙﹀彂鍣ㄥ彲浠ュ悓鏃剁敤blur鍜宑hange
+						trigger: ['change','blur'],
+					}
+				],
+				prodUser: [
+					{
+						required: true,
+						message: '璇烽�夋嫨鐢熶骇浜哄憳',
+						// 鍙互鍗曚釜鎴栬�呭悓鏃跺啓涓や釜瑙﹀彂楠岃瘉鏂瑰紡
+						trigger: ['change'],
+					}
+				],
+				principalName: [
+					{
+						required: true,
+						message: '璇烽�夋嫨璐d换浜�',
+						// 鍙互鍗曚釜鎴栬�呭悓鏃跺啓涓や釜瑙﹀彂楠岃瘉鏂瑰紡
+						trigger: ['change'],
+					}
+				],
+			},
+			handymanItemList: [],
+			handymanItemListShow: false,
+			handymanRecordList: [],
+			handymanRecordListShow: false,
+			loading: false
+		}
+	},
+	onReady() {
+		this.$refs.query.setRules(this.rules); // 澶嶅埗鏍¢獙
+		// 杩涘叆椤甸潰鏌ヨ鏉傚伐浜嬮」鍒楄〃
+		this.handymanItemList = []
+		this.getHandymanItem()
+		// 杩涘叆椤甸潰鏌ヨ璐d换浜哄垪琛�
+		this.getHandymanRecord()
+	},
+	onLoad(e) {
+		let s = []
+		e.staffList.split(',').forEach(i => {
+			s.push(i)
+		})
+		console.log(s)
+		this.query.prodStaffNoList =s
+		this.query.prodUser =e.userList
+		this.query.dutyNo = e.dutyNo
+		this.query.dutyTime = e.updateTime
+		uni.$on('checkedList', (data) => {
+			let staffNameList = []
+			let staffNoList = []
+			data.forEach(i => {
+				staffNameList.push(i.staffName)
+				staffNoList.push(i.staffNo)
+			})
+			this.query.prodUser = staffNameList.join(',')
+			this.query.prodStaffNoList = staffNoList
+		});
+	},
+	// 鏂规硶闆嗗悎
+	methods: {
+		goPage (index) {
+			switch (index) {
+				case 0:
+					this.handymanItemListShow = true
+							break
+				case 1:
+					const list = []
+					if(this.query.prodStaffNoList.length > 0) {
+						let staffList = this.query.prodUser.split(',')
+						let staffNoList = this.query.prodStaffNoList
+						for (const i in staffList) {
+							const obj = {
+								staffName: staffList[i],
+								staffNo: staffNoList[i]
+							}
+						list.push(obj)
+						}
+					}
+					uni.navigateTo({
+						url: '/pages/daily/production-person/production-person?list=' + encodeURIComponent(JSON.stringify(list))
+					})
+					break
+				case 2:
+					this.handymanRecordListShow = true
+							break
+			}
+		},
+		submit () {
+			this.$refs.query.validate(valid => {
+				if (valid) {
+					let params = JSON.parse(JSON.stringify(this.query))
+					params.dutyTime = params.dutyTime + ' 00:00:00'
+					console.log(params)
+					this.$u.api.dailyPaper.handymanRecord(params).then((res) => {
+						if (res.code === 0) {
+							this.loading = true;
+							uni.navigateBack({
+								//鍏抽棴褰撳墠椤甸潰锛岃繑鍥炰笂涓�椤甸潰鎴栧绾ч〉闈€��
+								delta:1
+							});
+							this.loading = false;
+						}
+					})
+				} else {
+					this.$u.toast('璇峰~鍐欏畬鏁存暟鎹�')
+				}
+			});
+		},
+		getHandymanItem () {
+			this.$u.api.dictData({dictType: 'handyman_item'}).then((res) => {
+				if (res.code === 0 && res.data.length > 0) {
+					res.data.forEach(item => {
+						const obj = Object.assign({
+							label: item.label,
+							value: item.value,
+						})
+						this.handymanItemList.push(obj)
+					})
+				}
+			})
+		},
+		getHandymanRecord () {
+			this.$u.api.dailyPaper.principal().then((res) => {
+				if (res.code === 0 && res.data.length > 0) {
+					res.data.forEach(item => {
+						const obj = Object.assign({
+							label: item.fullName,
+							value: item.id,
+						})
+						this.handymanRecordList.push(obj)
+					})
+					console.log(res)
+					this.query.principalId = 	this.handymanRecordList[0].value
+					this.query.principalName = 	this.handymanRecordList[0].label
+					this.handymanRecordApprover = this.handymanRecordList[0].value
+				}
+			})
+		},
+		confirmOperation (e) {
+			this.query.handymanItem = e[0].value
+			this.query.handymanItemName = e[0].label
+		},
+		confirmHandymanRecord (e) {
+			this.query.principalId = e[0].value
+			this.query.principalName = e[0].label
+		}
+	},
+}
+</script>
+
+<style scoped lang="scss">
+.body {
+	background: linear-gradient(to bottom, #E5F0FF, #F6F9FF);
+	box-sizing: border-box;
+	padding-top: 26rpx;
+	height: 100vh;
+	.main_view {
+		margin-top: 5rpx;
+		background: linear-gradient(180deg, #D8E8FF 0%, #FFFFFF 100%);
+		border-radius: 15rpx;
+		margin: 0 30rpx;
+		box-sizing: border-box;
+		padding: 37rpx 25rpx;
+	}
+	.bottom {
+		width: 100vw;
+		position:fixed;
+		bottom:60rpx;
+		.u-button {
+			width: 690rpx;
+			height: 80rpx;
+			background: #214DED;
+			border-radius: 8rpx;
+			font-weight: 500;
+			font-size: 34rpx;
+			color: #FFFFFF;
+			z-index: 99;
+		}
+	}
+}
+::v-deep.uicon-arrow-down-fill:before {
+	display: none;
+}
+::v-deep.u-form-item--left__content__label {
+	padding-left: 26rpx;
+	font-weight: 500;
+	font-size: 30rpx;
+	color: #4F4F4F;
+	line-height: 80rpx;
+}
+::v-deep.u-form-item--left__content--required {
+	left: 8rpx;
+	top: 0;
+}
+</style>
diff --git a/pages/daily/production-person/production-person.vue b/pages/daily/production-person/production-person.vue
new file mode 100644
index 0000000..c1a9740
--- /dev/null
+++ b/pages/daily/production-person/production-person.vue
@@ -0,0 +1,297 @@
+<template>
+	<view class="work-order-list">
+		<view class="page-head">
+			<u-navbar title="浜哄憳鍒楄〃"  :border-bottom="false"
+			          :background="background"
+			          :title-bold="true" title-color="#000"
+			          back-icon-color="#000" />
+			<view class="search">
+				<u-search placeholder="璇疯緭鍏ヤ汉鍛樺悕绉�" v-model="staffName"
+				          border-color="#ADC8E4" shape="square" bg-color="rgba(250,252,255,0.36)"
+				          placeholderColor="#8992A3" :showAction="false" style="margin: 35rpx;"
+				          searchIconColor="#333333" height="74" @search="search" @change="search"></u-search>
+			</view>
+			<span class="title">妫�鏌ョ粨鏋滈�夋嫨</span>
+			<view class="list">
+				<view v-for="(item, index) in personList" :key="index" class="person-card">
+					<view class="card-info">
+						<span>
+							<u-icon class="icon_num" size="26rpx"/>
+							<span class="h5-title">浜哄憳缂栧彿:</span>
+							<span class="h5-info">{{item.staffNo}}</span>
+						</span>
+						<span>
+							<u-icon class="icon_person" size="26rpx"/>
+							<span class="h5-title">浜哄憳鍚嶇О:</span>
+							<span class="h5-info">{{item.staffName}}</span>
+						</span>
+					</view>
+					<u-checkbox active-color="#428BF7" icon-size="24rpx" class="checkbox" v-model="item.checked" @change="checkboxChange(item)"></u-checkbox>
+				</view>
+				<view class="loadmore" @click="loadMore">
+					<u-loadmore :status="loadStatus"></u-loadmore>
+				</view>
+			</view>
+		</view>
+		<view class="bottom">
+			<u-button class="u-button" :loading="loading" type="primary" @click="submit">鎻愪氦</u-button>
+		</view>
+	</view>
+</template>
+
+<script>
+import content_bg from '@/static/custom/daily/background.png'
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+export default {
+	name: "production-person",
+	// import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+	components: {UIcon},
+	data() {
+		// 杩欓噷瀛樻斁鏁版嵁
+		return {
+			background: {
+				// background:'transparent'
+				backgroundImage: `url(${content_bg})`,
+				backgroundAttachment: 'fixed',
+				backgroundSize: '100% auto',
+				backgroundRepeat: 'no-repeat',
+			},
+			loading:false,
+			staffName:'',
+			personCheckedList : [],
+			personList: [],
+			query: {
+				current: 1,
+				size: 20,
+				staffName: '',
+				divisionName:"鐢熶骇閮�"
+			},
+			loadStatus: 'loadmore',
+		}
+	},
+	async onLoad(options) {
+		this.personCheckedList = []
+		this.personCheckedList = JSON.parse(decodeURIComponent(options.list))
+		await this.loadList()
+	},
+	// 鏂规硶闆嗗悎
+	methods: {
+		checkboxChange (item) {
+			if(!item.checked) {
+				const obj = {
+					staffName: item.staffName,
+					staffNo: item.staffNo
+				}
+				this.personCheckedList.push(obj)
+			} else {
+				var index = this.personCheckedList.findIndex((i) => {
+					return i.staffNo==item.staffNo;
+				})
+				this.personCheckedList.splice(index,1);
+			}
+			this.$set(item, 'checked', !item.checked)
+		},
+		submit () {
+			console.log(`output->this.personCheckedList`,this.personCheckedList)
+			this.loading = true;
+			uni.$emit('checkedList',this.personCheckedList)
+			uni.navigateBack({
+				//鍏抽棴褰撳墠椤甸潰锛岃繑鍥炰笂涓�椤甸潰鎴栧绾ч〉闈€��
+				delta:1
+			});
+			this.loading = false;
+		},
+		// async getUserInfoFun() {
+		// 	const params = {
+		// 		current: this.page.current,
+		// 		size: this.page.size,
+		// 		staffName: this.staffName
+		// 	}
+		// 	await this.$u.api.dailyPaper.getUserInfo(params).then(res => {
+		// 		this.personList = res.data.records
+		// 		this.choosingFUn(this.personList, this.personCheckedList)
+		// 	})
+		// },
+		search (e) {
+			this.query = {
+				current:1,
+				size:20,
+				staffName: e,
+				divisionName:"鐢熶骇閮�"
+			}
+			this.loadList()
+		},
+		// 鍦ㄦ鍔犺浇鍒楄〃
+		loadList(){
+			this.$u.api.dailyPaper.getUserInfo(this.query).then(res => {
+				console.log(res)
+				if (res.code === 0) {
+					if (!res.data.records || res.data.records.length === 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					if (this.query.current === 1) {
+						this.personList = res.data.records
+					} else {
+						this.personList = this.personList.concat(res.data.records);
+					}
+					this.choosingFUn(this.personList, this.personCheckedList)
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				}
+			});
+		},
+		// 鎼滅储涓嶄細浣块�変腑娑堝け
+		/**
+		 *
+		 * @param {涓绘暟鎹垪琛▆ mainList
+		 * @param {閫変腑鐨勬暟鎹垪琛▆ selectList
+		 */
+		choosingFUn(mainList, selectList) {
+			for (const i in mainList) {
+				let isExit = false
+				for (const j in selectList) {
+					if(mainList[i].staffNo === selectList[j].staffNo) {
+						isExit = true
+						this.$set(mainList[i], 'checked', true)
+					}
+				}
+				if(!isExit) {
+					this.$set(mainList[i], 'checked', false)
+				}
+			}
+		},
+		loadMore() {
+			this.loadStatus = "loading";
+			setTimeout(() => {
+				this.query.current += 1;
+				this.loadList();
+			}, 100);
+		},
+	},
+
+}
+</script>
+
+<style scoped lang="scss">
+.work-order-list{
+	width: 100%;
+	height: 100vh;
+	background: #F6F9FF;
+	box-sizing: border-box;
+	padding-bottom: 24rpx;
+	.page-head{
+		height: 750rpx;
+		background-image: url('~@/static/custom/daily/background.png');
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		.title {
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #6D82A1;
+			margin-left: 30rpx;
+		}
+		.list {
+			overflow-y: auto;
+			padding: 0 30rpx;
+			display: flex;
+			flex-direction: row;
+			flex-wrap: wrap;
+			justify-content: space-between;
+			align-content: flex-start;
+			margin-top: 20rpx;
+			height: calc(100vh - 450rpx);
+			.person-card {
+				margin-top: 30rpx;
+				width: 336rpx;
+				height: 138rpx;
+				background: linear-gradient(180deg, #DFEDFF 0%, #F7F7F8 100%);
+				border-radius: 10rpx;
+				border: 1px solid #FFFFFF;
+				position: relative;
+				display:table-cell; vertical-align:middle;
+				.card-info {
+					display: flex;
+					flex-direction: column;
+					justify-content: center;
+					height: 100%;
+					padding: 0 16rpx;
+					.icon_num {
+						background-image: url('~@/static/custom/daily/icon_num.png');
+						background-repeat: no-repeat;
+						background-size: cover;
+						height: 26rpx;
+						width: 26rpx;
+						position: relative;
+						vertical-align: middle
+					}
+					.icon_person {
+						background-image: url('~@/static/custom/daily/icon_person.png');
+						background-repeat: no-repeat;
+						background-size: cover;
+						height: 26rpx;
+						width: 26rpx;
+						position: relative;
+						vertical-align: middle
+					}
+					.h5-title {
+						font-weight: 500;
+						font-size: 26rpx;
+						color: #666666;
+						margin: 0 6rpx;
+						line-height: 48rpx;
+					}
+					.h5-info {
+						font-weight: 500;
+						font-size: 26rpx;
+						color: #333333;
+						line-height: 48rpx;
+					}
+				}
+				.checkbox {
+					position: absolute;
+					bottom: 12rpx;
+					right: 16rpx;
+				}
+			}
+			.loadmore {
+				margin: 20rpx auto;
+				width: 100%;
+				height: 60rpx;
+			}
+		}
+	}
+	.bottom {
+		width: 100vw;
+		position:fixed;
+		bottom:60rpx;
+		.u-button {
+			width: 690rpx;
+			height: 80rpx;
+			background: #214DED;
+			border-radius: 8rpx;
+			font-weight: 500;
+			font-size: 34rpx;
+			color: #FFFFFF;
+			z-index: 99;
+		}
+	}
+}
+::v-deep.uni-input-placeholder {
+	font-weight: 400;
+	font-size: 30rpx;
+	color: #8992A3;
+	line-height: 80rpx;
+}
+::v-deep.u-checkbox {
+	display: inline;
+}
+::v-deep.u-checkbox__icon-wrap {
+	background: #F5F9FF;
+	border-radius: 2rpx;
+	border: 1px solid #428BF7;
+}
+</style>
diff --git a/pages/daily/tag-list/add.vue b/pages/daily/tag-list/add.vue
new file mode 100644
index 0000000..e37a697
--- /dev/null
+++ b/pages/daily/tag-list/add.vue
@@ -0,0 +1,168 @@
+<template>
+  <view class="tag-add">
+    <u-form :model="form" ref="uForm" :error-type="['toast']">
+      <u-form-item label="绫诲瀷" prop="type" required v-if="info.workCenter === 'ZZ-03'">
+	      <u-input v-model="form.type" type="select" input-align="right" placeholder="璇烽�夋嫨"/>
+	      <u-icon name="arrow-right" @click="show = true"></u-icon>
+      </u-form-item>
+      <u-form-item label="鏁伴噺" :border-bottom="false" style="width: calc(100% - 40rpx);" prop="num" required>
+	      <u-input v-model="form.num" input-align="right" placeholder="璇疯緭鍏�"/>
+      </u-form-item>
+    </u-form>
+	  <u-button type="primary" style="margin: 30rpx;" :loading="loading" @click="submit" :custom-style="{
+     backgroundColor: '#214DED',
+     height:'80rpx'}" class="btn">鎻愪氦</u-button>
+	  <u-select :list="actionSheetList" v-model="show" @confirm="actionSheetCallback"></u-select>
+  </view>
+</template>
+
+<script>
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+export default {
+	components: {UIcon},
+  data(){
+    return{
+      form:{
+        type: '',
+        num: '',
+        value: '',
+	      reportType: ''
+      },
+      show:false,
+      actionSheetList:[],
+      rules: {
+				type: [
+					{
+						required: true,
+						message: '璇烽�夋嫨绫诲瀷',
+						trigger: ['change'],
+					}
+				],
+				num: [
+					{
+						required: true,
+						message: '璇疯緭鍏ユ暟閲�',
+						trigger: ['change','blur'],
+					},
+					// 姝e垯鍒ゆ柇鍙兘涓烘暟瀛�
+					{
+						validator: (rule, value, callback) => {
+							return this.$u.test.digits(value);
+						},
+						message: '鍙兘涓烘暟瀛�',
+						trigger: ['change','blur'],
+					},
+				]
+			},
+      loading:false,
+	    info: {}
+    }
+  },
+	onLoad(options) {
+		this.info = JSON.parse(decodeURIComponent(options.info))
+	},
+  methods:{
+    actionSheetCallback(item){
+			this.form.type = item[0].label
+			this.form.value = item[0].value
+    },
+    submit(){
+      this.$refs.uForm.validate(valid => {
+				if (valid) {
+					this.form.operationTaskId = this.info.id
+					this.form.workstationId = this.info.workstationId
+					this.form.reportType = this.info.workCenter === 'ZZ-03' ? 'CHENGTAO_PRODUCT_REPORT' : 'WAIKE_PRODUCT_REPORT'
+					let type =""
+					
+					if(this.form.type ==="楂樺帇鏌�" ){
+						type ="GY"
+					}else if(this.form.type ==="浣庡帇鏌�"){
+						 type ="DY"
+					}else{
+						 type ="XT"
+					}
+					
+					let param ={
+						  type: type,
+						  num: this.form.num,
+						  value: this.form.value,
+						    reportType: this.form.reportType,
+							operationTaskId:this.form.operationTaskId,
+							workstationId:this.form.workstationId,
+							reportType:this.form.reportType
+						}
+					this.$u.api.dailyPaper.generateLabel(param).then(res => {
+						console.log(res)
+						if (res.code === 0) {
+							this.$u.toast('鎿嶄綔鎴愬姛')
+							this.loading = true;
+							uni.navigateBack({
+								//鍏抽棴褰撳墠椤甸潰锛岃繑鍥炰笂涓�椤甸潰鎴栧绾ч〉闈€��
+								delta:1
+							});
+							this.loading = false;
+						}
+					})
+				} else {
+					console.log('楠岃瘉澶辫触');
+				}
+			});
+    },
+	  getCabinetType () {
+			this.$u.api.dictData({dictType: 'cabinet_type'}).then(res => {
+				if (res.code === 0 && res.data.length > 0) {
+					res.data.forEach(i => {
+						const obj = Object.assign({
+							label: i.label,
+							value: i.value,
+						})
+						this.actionSheetList.push(obj)
+					})
+				}
+			})
+	  }
+  },
+  onReady() {
+		this.$refs.uForm.setRules(this.rules);
+		this.actionSheetList = []
+		// 杩涘叆椤甸潰鏌ヨ绫诲瀷鍒楄〃
+	  this.getCabinetType()
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.tag-add{
+  height: calc(100vh - 88rpx);
+  background: linear-gradient(to bottom, #E5F0FF, #FFF);
+  box-sizing: border-box;
+  padding-top: 32rpx;
+  .u-form{
+    margin: 0 30rpx;
+    background: #FFFFFF;
+    border-radius: 10rpx;
+    padding: 20rpx 26rpx;
+  }
+  .btn{
+    position: fixed;
+    bottom: 40rpx;
+    width: calc(100% - 60rpx);
+  }
+}
+::v-deep.uicon-arrow-down-fill:before {
+	display: none;
+}
+::v-deep.u-form-item--left__content__label {
+	width: 100rpx;
+	padding-left: 26rpx;
+	font-weight: 500;
+	font-size: 30rpx;
+	color: #4F4F4F;
+	line-height: 80rpx;
+}
+::v-deep.u-form-item--left__content--required {
+	left: 8rpx;
+	top: 0;
+}
+</style>
diff --git a/pages/daily/tag-list/index.vue b/pages/daily/tag-list/index.vue
new file mode 100644
index 0000000..cdbbb34
--- /dev/null
+++ b/pages/daily/tag-list/index.vue
@@ -0,0 +1,876 @@
+<template>
+	<view class="tag-list">
+		<u-navbar title="鏍囩鍒楄〃"  :border-bottom="false"
+		          :background="background"
+		          :title-size="40"
+		          :title-bold="true" title-color="#FFFFFF"
+		          back-icon-color="#fff">
+			<view class="navbar-right" slot="right" @click="goTagListAdd" v-if="this.info.workCenter === 'ZZ-03' || this.info.workCenter === 'WK-01' && '鎵撳寘'.includes(this.info.operationName)">
+				鐢熸垚鏍囩
+			</view>
+		</u-navbar>
+<!--		<view class="search">-->
+<!--			<u-search placeholder="璇疯緭鍏ユ爣绛剧紪鐮佹悳绱�" v-model="keyword" bgColor="#fff" placeholderColor="#999999"-->
+<!--			          :showAction="false" style="margin: 35rpx;" searchIconColor="#6A6A6A" height="74"-->
+<!--			          @search="search"></u-search>-->
+<!--		</view>-->                           
+		<scroll-view class="list" scroll-y="true" :scroll-top="20">
+			<view v-for="(item,index) in list" :key="'item'+index" class="list-item" @click="choose(item,index)"
+			      :class="{active:current==index && item.state!==1,print:item.state==1 }"><span>
+				{{ item.labelNo }}
+			</span>
+				<span v-if="item.state==1">宸叉墦鍗�</span>
+				<u-icon class="icon_choose" size="20rpx" v-if="current==index && item.state!==1"/>
+			</view>
+			<u-loading mode="circle" :show="loadingList" class="loading"></u-loading>
+			<p v-if="list.length===0" style="text-align: center;margin-top: 100rpx;color: rgb(96, 98, 102);font-size: 28rpx;">鏆傛棤鏁版嵁</p>
+		</scroll-view>
+		<view class="bottom">
+			<u-button type="primary" style="margin: 30rpx;" :loading="loading" @click="weighPrintHandle" class="u-button">鏍囩鎵撳嵃</u-button>
+		</view>
+
+	<view v-if="maskShow" class="uni-mask" @touchmove.stop.prevent="moveHandle" @click="maskclose">
+		<scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" @click.stop="moveHandle">
+			<view
+				class="uni-list-box"
+				v-for="(item, index) in listDevice"
+				:key="index"
+				@click="tapQuery(item)"
+			>
+				<view>
+					<view class="uni-list_name">鍚嶇О锛歿{ item.name }}</view>
+					<view class="uni-list_item">UUID:{{ item.address }}</view>
+				</view>
+			</view>
+		</scroll-view>
+	<u-toast ref="uToast" />
+	</view>
+		<uni-fab :pattern="pattern" horizontal="right" vertical="bottom" :popMenu="false" @fabClick="searchDevice" :doc="doc">
+		</uni-fab>
+	</view>
+</template>
+
+<script>
+	import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+	const jcapi = uni.requireNativePlugin("JCSDK-JCApiModule");
+	// 浜岀淮鐮佺被鍨�
+	const QrCodeType = {
+		QrCode: 31,
+		PDF417: 32,
+		DataMatrix: 33,
+		AZTEC: 34
+	}
+	// 绾挎潯绫诲瀷
+	const LineType = {
+		Solid: 1, // 瀹炵嚎
+		Dotted: 2, // 铏氱嚎锛堥粯璁よ櫄瀹�1:1鐩搁棿锛�
+	}
+	// 鎹㈣鏂瑰紡
+	const LineModeType = {
+		Justified: 1, // 瀹介珮鍥哄畾锛屽唴瀹硅嚜閫傚簲锛堝瓧鍙�/瀛楅棿璺�/琛岄棿璺濇寜姣斾緥缂╂斁锛�
+		AutoHeight: 2, // 瀹藉害鍥哄畾锛岄珮搴﹁嚜閫傚簲
+		Fixed: 4, // 瀹介珮鍥哄畾锛岃秴鍑洪儴鍒嗚鍓�
+		Adapt: 6, // 瀹介珮鍥哄畾锛屽唴瀹硅秴杩囨椂棰勮瀹介珮鑷姩缂╁皬
+	}
+	export default {
+		components: {UIcon},
+		onLoad(options) {
+			this.info = JSON.parse(decodeURIComponent(options.info))
+			this.loadList();
+
+			let _this = this;
+			// 鍒濆鍖朣DK
+			jcapi.initSDK()
+			// 鐩戝惉椤电爜鍥炶皟
+			jcapi.didReadPrintCountInfo(function(r) {
+				console.log(r)
+			})
+
+			// 鐩戝惉閿欒鍥炶皟
+			jcapi.didReadPrintErrorInfo(function(r) {
+				console.log(r)
+				if(r.code == 23) {
+					uni.showToast({
+					icon: 'none',
+					title: '璇烽噸鏂拌繛鎺ユ墦鍗版満锛�',
+					duration: 2 * 1000
+				})
+					// 鎵撳嵃鏈烘柇寮�杩炴帴
+					_this.connectedDevice = null
+				}
+			})
+		},
+		onShow () {
+			this.loadList();
+		},
+		data() {
+			return {
+				background: {
+					backgroundColor: '#214DED',
+				},
+				keyword: '',
+				list: [{
+					name: '123'
+				}],
+				current: 0,
+				currentItem: {},
+				loadingList: false,
+				loading: false,
+				//钃濈墮鐩稿叧
+				doc:"钃濈墮",
+				pattern: {
+					color: '#7A7E83',
+					backgroundColor: '#fff',
+					selectedColor: '#007AFF',
+					buttonColor: '#007AFF',
+					iconColor: '#fff'
+				},
+				maskShow: false,
+				listDevice:[],//钃濈墮璁惧鏁版嵁
+				printDensity: 5,
+				labelType: 1,
+				printMode: 2,//printModeData: [{name : '鐑晱', value: 1}, {name: '鐑浆鍗�', value: 2}],
+				info: {}
+			}
+		},
+		methods: {
+			moveHandle() {
+
+			},
+			maskclose() {
+
+			},
+			// 鍒ゆ柇宸ュ崟鏄惁绛変簬
+			isShowWorkCenter(workCenter) {
+				if(workCenter.includes(this.info.workCenter)) {
+					return true
+				} else {
+					return false
+				}
+			},
+			isOperationName(workCenter, operationName) {
+				// 鍒ゆ柇鏄惁涓鸿宸ヤ綔绔�
+				if(workCenter.includes(this.info.workCenter)) {
+					// 鍒ゆ柇鏄惁鍖呭惈宸ュ簭鍚嶇О
+					if(operationName.includes(this.info.operationName)) {
+						return true
+					} else {
+						return false
+					}
+				} else {
+					return false
+				}
+			},
+			isNotOperationName(workCenter, operationName) {
+				// 鍒ゆ柇鏄惁涓鸿宸ヤ綔绔�
+				if(workCenter.includes(this.info.workCenter)) {
+					// 鍒ゆ柇鏄惁鍖呭惈宸ュ簭鍚嶇О
+					if(!operationName.includes(this.info.operationName)) {
+						return true
+					} else {
+						return false
+					}
+				} else {
+					return false
+				}
+			},
+			// 鍦ㄦ鍔犺浇鍒楄〃
+			loadList() {
+				this.loadingList = true;
+				let url = ''
+				// 鏍规嵁涓嶅悓杞﹂棿璋冨彇鎺ュ彛
+				if (this.info.workCenter === 'ZZ-03') { // 鎴愬杞﹂棿(绠卞彉)
+					url = 'listReportChengtao'
+				} else if ((this.info.workCenter === 'ZZ-01' && !'缁勮'.includes(this.info.operationName)) || (this.info.workCenter === 'ZZ-02' && !'浜岃,娉ㄦ补'.includes(this.info.operationName))) {
+					url = 'listReportOther'
+				} else if (this.info.workCenter === 'TX-02' && '鍙犺'.includes(this.info.operationName)) {
+					url = 'listReportDieZhuang'
+				} else if (this.info.workCenter === 'TX-01' && '绾靛壀'.includes(this.info.operationName)) {
+					url = 'listReportZongjian'
+				} else if (this.info.workCenter === 'WK-01' && '鎵撳寘'.includes(this.info.operationName)) {
+					url = 'listReportWaike'
+				}
+				this.getlistReport(url)
+				this.loadingList = false
+			},
+			getlistReport (url) {
+				this.$u.api.dailyPaper[url]({id: this.info.id}).then(res => {
+					if (res.code === 0 && res.data.length > 0) {
+						this.list = res.data
+						this.choose(this.list[0], 0)
+					}
+				});
+			},
+			// 鎼滅储
+			search(e) {},
+			choose(item, index) {
+				this.current = index;
+				this.currentItem = item
+			},
+			submit() {
+				this.loading = true;
+			},
+			goTagListAdd(e) {
+				uni.navigateTo({
+					url: '/pages/daily/tag-list/add?info='+ encodeURIComponent(JSON.stringify(this.info))
+				})
+			},
+			//鎵撳嵃鐩稿叧
+			searchDevice(){
+				let _this = this
+				uni.openBluetoothAdapter({ // 纭钃濈墮鏄惁鎵撳紑
+					success(r) {
+						uni.showLoading({
+							title: "鎼滅储涓�..."
+						})
+						// 鏈巿浜堣摑鐗欑浉鍏虫潈闄愬拰鏈墦寮�鎵嬫満瀹氫綅浼氭悳绱笉鍒拌澶�
+						jcapi.getBluetoothDevices(function(r){
+							// 鎼滅储鍒拌澶囧洖璋�
+							uni.hideLoading()
+							_this.listDevice = r;
+							_this.maskShow = true
+						})
+					},
+					fail(e) {
+						uni.showModal({
+							confirmText: "鎵撳紑钃濈墮澶辫触"
+						})
+					}
+				})
+			},
+			tapQuery(item) {
+				this.maskShow = false
+				// 杩炴帴鎵撳嵃鏈�
+				let _this = this;
+				console.log(item)
+				jcapi.openPrinterByDevice({
+					address: item.address,
+					name: item.name,
+					deviceType: item.deviceType // 璁惧绫诲瀷锛�0-钃濈墮锛�1-缃戠粶
+				}, function(r) {
+					uni.showToast({
+						title: (r.code == 0) ? "杩炴帴鎴愬姛" : "杩炴帴澶辫触",
+						duration: 2 * 1000
+					})
+					if(r.code == 0) {
+						_this.connectedDevice = item
+					}
+				})
+			},
+			weighPrintHandle() {
+				let _this = this
+				if (this.currentItem.state == 1) {
+					this.$u.toast('璇烽�夋嫨闇�瑕佹墦鍗扮殑鏍囩')
+				} else {
+					const params = {
+						operationTaskId: this.info.id + '',
+						workstationId: this.info.workstationId,
+						labelNo: this.currentItem.labelNo
+					}
+					// 澶栧3杞﹂棿-鏈�鍚庝竴閬撳伐搴�
+					if(this.isShowWorkCenter('WK-01') && this.info.operationId === this.info.lastOperationId) {
+						params.type = 'WAIKE_PRODUCT_REPORT'
+						this.$u.api.dailyPaper.labelInfo(params).then(res => {
+							let print = res.data
+							if(print) {
+								this.WKLastOperation(print.ParamList[0])
+							} else {
+								this.$refs.uToast.show({
+									title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+									type: 'warning '
+								})
+							}
+							_this.printQrCode()
+						})
+					}
+					// 閾佽姱杞﹂棿-绾靛壀
+					if(this.isOperationName('TX-01', '绾靛壀')) {
+						params.type = 'ZONGJIAN_PRODUCT_REPORT'
+						this.$u.api.dailyPaper.labelInfo(params).then(res => {
+							let print = res.data
+							if(print) {
+								this.TXOperationName(print.ParamList[0], this.currentItem)
+							} else {
+								this.$refs.uToast.show({
+									title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+									type: 'warning '
+								})
+							}
+							_this.printQrCode()
+						})
+ 					}
+					// 閾佽姱杞﹂棿-鍙犺
+					if(this.isOperationName('TX-02', '鍙犺')) {
+						params.type = "DIEZHUANG_PRODUCT_REPORT"
+						console.log(`output->params`,params)
+						this.$u.api.dailyPaper.labelInfo(params).then(res => {
+							let print = res.data
+							if(print) {
+								this.TXClosedAssembly(print.ParamList[0])
+							} else {
+								this.$refs.uToast.show({
+									title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+									type: 'warning '
+								})
+							}
+							_this.printQrCode()
+						})
+					}
+					// 绠卞彉杞﹂棿(鎴愬杞﹂棿) 闇�瑕佸尯鍒嗙浣撹繕鏄煖浣�
+					if(this.isShowWorkCenter('ZZ-03')) {
+						params.type = "CHENGTAO_PRODUCT_REPORT"
+						this.$u.api.dailyPaper.labelInfo(params).then(res => {
+							let print = res.data
+							if(print) {
+								if(this.currentItem.labelType === 'XT' || this.currentItem.labelType === '绠变綋') {
+									this.XTZZPrintQrCode(print.ParamList[0])
+								} else { // 鍚﹀垯涓烘煖浣�
+									this.GYZZPrintQrCode(print.ParamList[0])
+								}
+								_this.printQrCode()
+							} else {
+								this.$refs.uToast.show({
+									title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+									type: 'warning '
+								})
+							}
+						})
+					}
+					// 濂楄杞﹂棿
+					if(this.isNotOperationName('ZZ-01,ZZ-02', '缁勮,浜岃,娉ㄦ补')) {
+						this.$u.api.dailyPaper.taozhuangLabelInfo(params).then(res => {
+							let print = res.data
+							if(print) {
+								this.suitWorkshop(print.ParamList[0], this.currentItem)
+								_this.printQrCode()
+							} else {
+								this.$refs.uToast.show({
+									title: '鏈煡璇㈠埌璇ユ爣绛句俊鎭紒',
+									type: 'warning '
+								})
+							}
+						})
+					}
+				}
+			},
+			// 缁樺埗妯嚎 瀹炵嚎
+			getDrawLabelLine(x, y, width, height, rotate, lineType) {
+				jcapi.drawLabelLine({
+					x: x,
+					y: y,
+					width: width,
+					height: height,
+					rotate: rotate,
+					lineType: lineType
+				});
+			},
+			// 濉啿鏂囧瓧鏍囬
+			getDrawLabelText(x, y, width, height, value, fontSize, rotate, lineMode, lineSpace, letterSpace, textAlignHorizontal, textAlignVertical) {
+				jcapi.drawLabelText({
+					x: x,
+					y: y,
+					width: width,
+					height: height,
+					value: value,
+					fontSize: fontSize,
+					rotate: rotate,
+					lineMode: lineMode,
+					lineSpace: lineSpace,
+					letterSpace: letterSpace,
+					textAlignHorizontal: textAlignHorizontal,
+					textAlignVertical: textAlignVertical
+				})
+			},
+			// 澶栧3杞﹂棿-鏈�鍚庝竴閬撳伐搴�
+			WKLastOperation(printData) {
+				// 鍙朓D
+				let json = JSON.parse(printData.body)
+				// // 缁樺埗浜岀淮鐮�
+				// var jsonString = JSON.stringify(json.ID);
+				jcapi.drawLabelQrCode({
+					x: 14.5,
+					y: 68,
+					width: 20,
+					height: 20,
+					value: json,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for(let i = 1; i < 8; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 10) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 92, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+				
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 88.5, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 60.5, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 88.5, 0, LineType.Solid) // 绔栫嚎3
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 8, 20, 20, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 18, 20, 20, '闀垮楂�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 28, 20, 20, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 38, 20, 20, '鍥� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 48, 20, 20, '瑙勬牸鍨嬪彿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 58, 20, 20, '鐢熶骇鏃ユ湡:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let operationTaskNo = JSON.stringify(printData.operationTaskNo).replace(/"/g, "")
+				let lwh = JSON.stringify(printData.lwh ? printData.lwh : '').replace(/"/g, "")
+				let specificationModel = JSON.stringify(printData.specificationModel ? printData.specificationModel : '').replace(/"/g, "")
+				let drawNo = JSON.stringify(printData.drawNo ? printData.drawNo : '').replace(/"/g, "")
+				let createTime = JSON.stringify(printData.createTime).replace(/"/g, "")
+
+				// 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 8, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 18, 35, 12, lwh, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 28, 35, 12, operationTaskNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 38, 35, 12, drawNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 48, 35, 12, specificationModel, 3, 1, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 58, 35, 12, createTime, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+			},
+			// 閾佽姱杞﹂棿-绾靛壀
+			TXOperationName(printData, currentItem) {
+				// 缁樺埗浜岀淮鐮�
+				let json = JSON.parse(printData.body)
+				// 鍙朓D
+				// var jsonString = JSON.stringify(json.ID);
+				jcapi.drawLabelQrCode({
+					x: 14.5,
+					y: 74,
+					width: 20,
+					height: 20,
+					value: json,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for(let i = 1; i < 13; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 6) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 97, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+				
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 97, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 66, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 97, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 5, 20, 20, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 11, 20, 20, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 17, 20, 20, '鐗� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 23, 20, 20, '鐗囧锛坢m锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 29, 20, 20, '鍘氬害锛坢m锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 35, 20, 20, '閲嶉噺锛圞G锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 41, 20, 20, '闀垮害锛坢锛�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 47, 20, 20, '鐢熶骇浜�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 53, 20, 20, '鐢熶骇鏃堕棿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 59, 20, 20, '鍘傚:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 65, 20, 20, '閾佹崯:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let optaskNo = JSON.stringify(printData.optaskNo).replace(/"/g, "")
+				let sliceWidth = JSON.stringify(printData.sliceWidth ? printData.sliceWidth : '').replace(/"/g, "")
+				let thickness = JSON.stringify(printData.thickness ? printData.thickness : '').replace(/"/g, "")
+				let wweight = JSON.stringify(printData.wweight ? printData.wweight : '').replace(/"/g, "")
+				let llength = JSON.stringify(printData.llength ? printData.llength : '').replace(/"/g, "")
+				let reportTime = JSON.stringify(currentItem.reportTime).replace(/"/g, "")
+				let reportName = JSON.stringify(currentItem.reportName).replace(/"/g, "")
+				let grade = JSON.stringify(printData.grade ? printData.grade : '').replace(/"/g, "")
+				let ironLoss = JSON.stringify(printData.ironLoss ? printData.ironLoss : '').replace(/"/g, "")
+				let supplierVenderName = JSON.stringify(printData.supplierVenderName ? printData.supplierVenderName : '').replace(/"/g, "")
+
+				// // 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 5, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 11, 35, 12, optaskNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 17, 35, 12, grade, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 23, 35, 12, sliceWidth, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 29, 35, 12, thickness, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 35, 35, 12, wweight, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 41, 35, 12, llength, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 47, 35, 12, reportName, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 53, 35, 12, reportTime, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 59, 35, 12, supplierVenderName, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 65, 35, 12, ironLoss, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+			},
+			// 閾佽姱杞﹂棿-鍙犺
+			TXClosedAssembly(printData) {
+				// 鍙朓D
+				let json = JSON.parse(printData.body)
+				 // 缁樺埗浜岀淮鐮�
+				// var jsonString = JSON.stringify(json.ID);
+				jcapi.drawLabelQrCode({
+					x: 14.5,
+					y: 68,
+					width: 20,
+					height: 20,
+					value: json,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for(let i = 1; i < 8; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 10) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 92, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+				
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 88.5, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 60.5, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 88.5, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 8, 20, 20, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 18, 20, 20, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 28, 20, 20, '鍥� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 38, 20, 20, '瑙勬牸鍨嬪彿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 48, 20, 20, '鐢熶骇浜�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 58, 20, 20, '鐢熶骇鏃ユ湡:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let operationTaskNo = JSON.stringify(printData.operationTaskNo).replace(/"/g, "")
+				let drawNo = JSON.stringify(printData.drawNo).replace(/"/g, "")
+				let specificationModel = JSON.stringify(printData.specificationModel).replace(/"/g, "")
+				let staffNameJoin = JSON.stringify(this.info.staffNameJoin).replace(/"/g, "")
+				let createTime = JSON.stringify(printData.createTime ? printData.createTime : '').replace(/"/g, "")
+
+				// 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 8, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 18, 35, 12, operationTaskNo, 2.5, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 28, 35, 12, drawNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 38, 35, 12, specificationModel, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 48, 35, 12, staffNameJoin, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 58, 35, 12, createTime, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+			},
+			// 绠卞彉杞﹂棿(鎴愬杞﹂棿) 楂樺帇
+			GYZZPrintQrCode(printData) {
+				// 缁樺埗浜岀淮鐮�
+				let json = JSON.parse(printData.body)
+				// 鍙朓D
+				// var jsonString = JSON.stringify(json.ID);
+				jcapi.drawLabelQrCode({
+					x: 14.5,
+					y: 58,
+					width: 20,
+					height: 20,
+					value: json,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for(let i = 1; i < 7; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 10) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 82, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+				
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 78.5, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 50.5, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 78.5, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 8, 20, 22, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 18, 20, 22, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 28, 20, 20, '绫� 鍨�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 38, 20, 20, '瑙勬牸鍨嬪彿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 48, 20, 20, '鐢熶骇鏃ユ湡:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let operationTaskNo = JSON.stringify(printData.operationTaskNo ? printData.operationTaskNo : '').replace(/"/g, "")
+				let specificationModel = JSON.stringify(printData.specificationModel ? printData.specificationModel : '').replace(/"/g, "")
+				let type = JSON.stringify(printData.type ? printData.type : '').replace(/"/g, "")
+				let reportTime = JSON.stringify(printData.reportTime).replace(/"/g, "")
+				// 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 8, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 18, 35, 12, operationTaskNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 28, 35, 12, type, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 38, 35, 12, specificationModel, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 48, 35, 12, reportTime, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+			},
+			// 绠卞彉杞﹂棿(鎴愬杞﹂棿) 绠变綋
+			XTZZPrintQrCode(printData) {
+				// 缁樺埗浜岀淮鐮�
+				let json = JSON.parse(printData.body)
+				// 鍙朓D
+				// var jsonString = JSON.stringify(json.ID);
+				jcapi.drawLabelQrCode({ 
+					x: 14.5,
+					y: 65,
+					width: 20,
+					height: 20,
+					value: json,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for(let i = 1; i < 9; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 8) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 90.5, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+				
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 86.5, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 56, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 86.5, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 6, 20, 20, '缂� 鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 14, 20, 20, '宸ュ崟鍙�:', 3.6, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 22, 20, 20, '瑙勬牸鍨嬪彿:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 30, 20, 20, '楂樺帇鏌滀綋:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 38, 20, 20, '浣庡帇鏌滀綋:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 46, 20, 20, '鏈綋:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 54, 20, 20, '鐢熶骇鏃ユ湡:', 3.4, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let operationTaskNo = JSON.stringify(printData.operationTaskNo).replace(/"/g, "")
+				let specificationModel = JSON.stringify(printData.specificationModel ? printData.specificationModel : '').replace(/"/g, "")
+				let gy = JSON.stringify(printData.gy ? printData.gy : '').replace(/"/g, "")
+				let dy = JSON.stringify(printData.dy ? printData.dy : '').replace(/"/g, "")
+				let bt = JSON.stringify(printData.bt ? printData.bt : '').replace(/"/g, "")
+				let reportTime = JSON.stringify(printData.reportTime).replace(/"/g, "")
+				// // 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 6, 35, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 14, 35, 12, operationTaskNo, 2.5, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 22, 35, 12, specificationModel, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 30, 35, 12, gy, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 38, 35, 12, dy, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 46, 35, 12, bt, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 54, 35, 12, reportTime, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+			},
+			// 濂楄杞﹂棿
+			suitWorkshop(printData, currentItem) {
+				// 缁樺埗浜岀淮鐮�
+				let json = JSON.parse(printData.body)
+				// 鍙朓D
+				// var jsonString = JSON.stringify(json.ID);
+				jcapi.drawLabelQrCode({
+					x: 17,
+					y: 50,
+					width: 20,
+					height: 20,
+					value: json,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				// 缁樺埗妯嚎 瀹炵嚎8鏉�
+				let sum = 4;
+				for(let i = 1; i < 6; i++) {
+					this.getDrawLabelLine(4, sum, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎
+					sum = (i * 10) + 4
+				}
+				// 浜岀淮鐮佸ぇ妗�
+				this.getDrawLabelLine(4, 72, 46, 0.5, 0, LineType.Solid) // 瀹炵嚎9
+				
+				//缁樺埗绔栫嚎
+				this.getDrawLabelLine(4, 4, 0.5, 68.5, 0, LineType.Solid) // 绔栫嚎1
+				this.getDrawLabelLine(20, 4, 0.5, 40.5, 0, LineType.Solid) // 绔栫嚎2
+				this.getDrawLabelLine(44.5, 4, 0.5, 68.5, 0, LineType.Solid) // 绔栫嚎2
+
+				// 濉啿鏂囧瓧鏍囬
+				this.getDrawLabelText(5, 8, 24, 22, '閾佽姱缂栧彿:', 3, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 18, 12, 22, '绾垮湀缂栧彿:', 3, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 28, 24, 20, '鐢熶骇鏃ユ湡:', 3, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+				this.getDrawLabelText(5, 38, 24, 20, '鐢熶骇浜哄憳:', 3, 0, LineModeType.AutoHeight, 0, 0, 0, 1)
+
+				let labelNo = JSON.stringify(printData.labelNo).replace(/"/g, "")
+				let coilNo = JSON.stringify(printData.coilNo).replace(/"/g, "")
+				let reportTime = JSON.stringify(currentItem.reportTime).replace(/"/g, "")
+				let reportName = JSON.stringify(currentItem.reportName).replace(/"/g, "")
+
+				// 濉啿鍙傛暟鍊�
+				this.getDrawLabelText(22, 8, 40, 12, labelNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 18, 40, 12, coilNo, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 28, 40, 12, reportTime, 3, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+				this.getDrawLabelText(22, 38, 40, 12, reportName, 2, 0, LineModeType.AutoHeight, 0, 0, 0, 0)
+			},
+			//鎵撳嵃浜岀淮鐮�
+			printQrCode() {
+				// 鍒濆鍖栫敾鏉�
+				jcapi.initDrawingBoard({
+					width: 45,
+					height: 100,
+					rotate: 0
+				});
+
+				// 鐢熸垚鎵撳嵃鏁版嵁
+				let imageJsonObj = jcapi.generateLabelJson()
+				// 璁剧疆鎵撳嵃浠诲姟
+				jcapi.startJob({
+					totalCount: 1,
+					density: this.printDensity,
+					labelType: this.labelType,
+					printMode: this.printMode,
+				},function(r){
+					if(r.code == 0) {
+						// 鎵撳嵃鏁版嵁
+						jcapi.printData(imageJsonObj, {
+							"printQuantity": 1,
+						}, function(r) {
+							if (r.code == 0) {
+								console.log("鎵撳嵃鎴愬姛")
+							} else {
+								console.log("鎵撳嵃澶辫触")
+							}
+						})
+					} else {
+						console.log("璁剧疆鎵撳嵃浠诲姟澶辫触")
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+::v-deep .uni-fab__circle{
+	position:fixed;
+	bottom: 140rpx;
+}
+	.tag-list {
+		width: 100%;
+		height: 100vh;
+		background: #E6EFFF;
+		overflow-y: auto;
+		box-sizing: border-box;
+		padding-bottom: 24rpx;
+		position: relative;
+		display: flex;
+		flex-direction: column;
+
+		::v-deep.navbar-right {
+			font-weight: 500;
+			font-size: 28rpx;
+			color: #FFFFFF;
+			line-height: 36rpx;
+			margin-right: 32rpx;
+		}
+			//.search {
+			//	//position: fixed;
+			//	width: 100%;
+			//	z-index: 99;
+			//	height: 140rpx;
+			//	background: #E6EFFF;
+			//}
+
+			.list {
+				padding: 40rpx 32rpx 120rpx;
+				width: 100%;
+				height: 100%;
+				overflow-y: auto;
+				box-sizing: border-box;
+
+				.list-item {
+					background: #FFFFFF;
+					border-radius: 10rpx;
+					box-sizing: border-box;
+					padding: 22rpx 43rpx;
+					margin-bottom: 20rpx;
+					font-weight: 500;
+					font-size: 30rpx;
+					color: #333333;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+					.icon_choose {
+						background-image: url('~@/static/custom/daily/icon_choose.png');
+						background-repeat: no-repeat;
+						background-size: cover;
+						height: 20rpx;
+						width: 20rpx;
+						position: relative;
+					}
+
+					&.print {
+						background: #F3FFF8;
+						border: 1px solid #ABE3C4;
+						color: #0AA04D;
+					}
+
+					&.active {
+						background: #F4F9FF;
+						border: 1px solid #ACBDF8;
+						color: #214DED;
+					}
+				}
+
+				.loading {
+					position: absolute;
+					top: 50%;
+					left: 50%;
+					transform: translate(-50%, -50%);
+				}
+			}
+			.bottom {
+				width: 100vw;
+				position:fixed;
+				bottom: 0;
+				background: #E6EFFF;
+				.u-button {
+					width: 690rpx;
+					height: 80rpx;
+					background: #214DED;
+					border-radius: 8rpx;
+					font-weight: 500;
+					font-size: 34rpx;
+					color: #FFFFFF;
+					z-index: 99;
+				}
+			}
+
+		.uni-mask {
+			position: fixed;
+			top: 0;
+			left: 0;
+			bottom: 0;
+			display: flex;
+			align-items: center;
+			width: 100%;
+			background: rgba(0, 0, 0, 0.6);
+			padding: 0 30rpx;
+			box-sizing: border-box;
+		}
+
+
+		.uni-scroll_box {
+			height: 70%;
+			background: #fff;
+			border-radius: 20rpx;
+		}
+		.uni-list-box {
+			margin: 0 20rpx;
+			padding: 15rpx 0;
+			border-bottom: 1px #f5f5f5 solid;
+			box-sizing: border-box;
+		}
+		.uni-list:last-child {
+			border: none;
+		}
+		.uni-list_name {
+			font-size: 30rpx;
+			color: #333;
+		}
+		.uni-list_item {
+			font-size: 24rpx;
+			color: #555;
+			line-height: 1.5;
+		}
+	}
+</style>
diff --git a/pages/daily/tool/tool.vue b/pages/daily/tool/tool.vue
new file mode 100644
index 0000000..7ce162a
--- /dev/null
+++ b/pages/daily/tool/tool.vue
@@ -0,0 +1,207 @@
+<template>
+	<view class="body">
+		<view class="main_view">
+			<view class="main_item" @click="goPage(0)">
+				<span style="color:#4F4F4F">绫诲埆</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.type }}</span>
+					<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(1)">
+				<span style="color:#4F4F4F">瑙勬牸鍨嬪彿</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.model }}</span>
+					<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(2)">
+				<span style="color:#4F4F4F">鍥惧彿</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.num }}</span>
+					<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(3)">
+				<span style="color:#4F4F4F">鏈綋鐗瑰緛缁撴瀯</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.structure }}</span>
+					<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(4)">
+				<span style="color:#4F4F4F">绗竴浣�</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.first }}</span>
+					<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(5)">
+				<span style="color:#4F4F4F">绗簩浣�</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.second }}</span>
+					<u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+		</view>
+		<u-select v-model="selectShowType" :list="TypeList" @confirm="confirm($event, 'type')"></u-select>
+		<u-select v-model="selectShowModels" :list="modelsList" @confirm="confirm($event, 'model')"></u-select>
+		<u-select v-model="selectShowNum" :list="numList" @confirm="confirm($event, 'num')"></u-select>
+		<u-select v-model="selectShowStructure" :list="structureList" @confirm="confirm($event, 'structure')"></u-select>
+		<u-select v-model="selectShowFirst" :list="firstList" @confirm="confirm($event, 'first')"></u-select>
+		<u-select v-model="selectShowSecond" :list="secondList" @confirm="confirm($event, 'second')"></u-select>
+	</view>
+</template>
+
+<script>
+export default {
+	name: "tool",
+	// import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+	components: {},
+	data() {
+		// 杩欓噷瀛樻斁鏁版嵁
+		return {
+			query: {
+				type: '',
+				model: '',
+				num: '',
+				structure: '',
+				first: '',
+				second: '',
+			},
+			selectShowType: false,
+			selectShowModels: false,
+			selectShowNum: false,
+			selectShowStructure: false,
+			selectShowFirst: false,
+			selectShowSecond: false,
+			TypeList: [
+				{
+					value: '1',
+					label: '骞插紡鍙樺帇鍣ㄦ垚鍝�'
+				},
+				{
+					value: '2',
+					label: '骞插紡鍙樺帇鍣ㄦ垚鍝�'
+				},
+			],
+			modelsList: [
+				{
+					value: '1',
+					label: 'SCB18-1600/10'
+				},
+			],
+			numList: [
+				{
+					value: '1',
+					label: 'G2023.1'
+				},
+			],
+			structureList: [
+				{
+					value: '1',
+					label: '00'
+				},
+			],
+			firstList: [
+				{
+					value: '0',
+					label: '鍔涘緱甯歌娓╂帶浠�'
+				},
+				{
+					value: '1',
+					label: '鍔涘緱甯歌娓╂帶绠�'
+				},
+			],
+			secondList: [
+				{
+					value: '0',
+					label: '1.5mm閽㈡澘澶栧3RAL7035锛堢數纾侀攣锛嬭绋嬪紑鍏筹級涓嬭繘涓婂嚭銆佷笅杩涗晶鍑猴紝鏁h銆佽惤鍦板畨瑁�+甯歌灏哄'
+				},
+				{
+					value: '1',
+					label: '0.7m201涓嶉攬閽㈠澹虫湰鑹诧紙鐢电閿�+琛岀▼寮�鍏筹級涓嬭繘涓婂嚭銆佷笅杩涗晶鍑猴紝鏁h銆佽惤鍦板畨瑁咃紜甯歌灏哄'
+				},
+			],
+		}
+	},
+	// 鏂规硶闆嗗悎
+	methods: {
+		goPage (index) {
+			switch(index){
+				case 0:
+					this.selectShowType = true;
+					break;
+				case 1:
+					this.selectShowModels = true;
+					break;
+				case 2:
+					this.selectShowNum = true;
+					break;
+				case 3:
+					this.selectShowStructure = true;
+					break;
+				case 4:
+					this.selectShowFirst = true;
+					break;
+				case 5:
+					this.selectShowSecond = true;
+					break;
+			}
+		},
+		confirm (e, item) {
+			console.log('e--', e)
+			console.log('item--', item)
+			switch(item){
+				case 'type':
+					this.query.type = e[0].label;
+					break;
+				case 'model':
+					this.query.model = e[0].label;
+					break;
+				case 'num':
+					this.query.num = e[0].label;
+					break;
+				case 'structure':
+					this.query.structure = e[0].label;
+					break;
+				case 'first':
+					this.query.first = e[0].label;
+					break;
+				case 'second':
+					this.query.second = e[0].label;
+					break;
+			}
+		},
+	},
+}
+</script>
+
+<style scoped lang="scss">
+.body {
+	background: linear-gradient(to bottom, #E5F0FF, #F6F9FF);
+	box-sizing: border-box;
+	padding-top: 26rpx;
+	height: calc(100vh - 188rpx);
+	.main_view {
+		//background-image: url('~@/static/custom/home/home_img_bg.png');
+		//background-repeat: no-repeat;
+		//background-size: 100% auto;
+		background: linear-gradient(180deg, #DFEDFF 0%, #F7F7F8 100%);
+		border-radius: 15rpx;
+		height: 936rpx;
+		margin: 6rpx 30rpx 0;
+		box-sizing: border-box;
+		padding: 38rpx 26rpx;
+		.main_item{
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			font-size: 30rpx;
+			line-height: 112rpx;
+			border-bottom: 1rpx solid rgba(213,213,213, 0.67);
+			box-sizing: border-box;
+		}
+	}
+}
+</style>
diff --git a/pages/daily/workstation/index.vue b/pages/daily/workstation/index.vue
new file mode 100644
index 0000000..9fee238
--- /dev/null
+++ b/pages/daily/workstation/index.vue
@@ -0,0 +1,166 @@
+<template>
+  <view class="workstation">
+	  <view class="search">
+		  <u-search placeholder="璇疯緭鍏ュ伐浣滅珯鍚嶇О鎼滅储" v-model="keyword" bgColor="#fff"
+		            placeholderColor="#999999" :showAction="false"
+		            searchIconColor="#6A6A6A" height="74" @search="search" @change="search"></u-search>
+	  </view>
+	  <scroll-view :scroll-top="20" scroll-y="true" class="scroll-Y">
+		  <view v-for="(item,index) in list" :key="'item'+index" class="list-item" @click="choose(item,index)" :class="{active:current==index}">
+			  <span>
+			    {{ '(' + item.workCenter + ')' + item.name }}
+		    </span><u-icon class="icon_choose" size="20rpx" v-if="current==index"/>
+		  </view>
+		  <u-loading mode="circle" :show="loadingList" class="loading"></u-loading>
+		  <p v-if="list.length==0" style="text-align: center;margin-top: 100rpx;color: rgb(96, 98, 102);font-size: 28rpx;">鏆傛棤鏁版嵁</p>
+	  </scroll-view>
+	  <view class="bottom">
+		  <u-button type="primary" :loading="loading" @click="submit" class="btn">纭畾</u-button>
+	  </view>
+  </view>
+</template>
+
+<script>
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+
+export default {
+	components: {UIcon},
+  data() {
+    return {
+	    scrollTop: 200,
+      keyword:'',
+      list:[],
+      current:0,
+	    currentChoose: {},
+      loadingList:false,
+      loading:false,
+    }
+  },
+  onLoad() {
+	this.loadList();
+	},
+  methods: {
+    // 鍦ㄦ鍔犺浇鍒楄〃
+    loadList(){
+      // this.loadingList = true;
+	    this.$u.api.dailyPaper.getWorkstation().then(res => {
+			  if (res.code === 0) {
+				  this.list = res.data
+				  this.currentChoose = this.list[0]
+			  } else {
+					this.$u.toast(res.msg)
+			  }
+	    })
+    },
+    // 鎼滅储
+    search(e){
+		let  params =null
+		if(this.isEnglish(e)){
+			params = {
+					workstationNo: e
+			}
+			
+		}else{
+			params = {
+					name: e
+			}
+		}
+	    
+	    this.$u.api.dailyPaper.getWorkstation(params).then(res => {
+		    if (res.code === 0) {
+			    this.list = res.data
+			    this.currentChoose = this.list[0]
+		    } else {
+			    this.$u.toast(res.msg)
+		    }
+	    })
+    },
+    choose(item,index){
+		this.current = index;
+		this.currentChoose = item
+    },
+    submit(){
+      this.loading = true;
+	    uni.$emit('returnData',this.currentChoose)
+	    uni.navigateBack({
+		    //鍏抽棴褰撳墠椤甸潰锛岃繑鍥炰笂涓�椤甸潰鎴栧绾ч〉闈€��
+		    delta:1
+	    });
+	    this.loading = false;
+    },
+	isEnglish(str) {
+	      // 鑻辨枃瀛楃姝e垯琛ㄨ揪寮�
+	      const englishPattern = /^[A-Za-z ]*$/;
+	      return englishPattern.test(str);
+	    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.workstation{
+  width: 100%;
+  height: 100vh;
+  background: #E6EFFF;
+	padding: 0 30rpx;
+	display: flex;
+	flex-direction: column;
+	position: fixed;
+	.search{
+		width: 100%;
+		margin: 24rpx 0;
+	}
+	.scroll-Y {
+		width: 100%;
+		height: calc(100vh - 340rpx);
+		overflow-y: auto;
+		box-sizing: border-box;
+			.loading{
+				position: absolute;
+				top: 50%;
+				left: 50%;
+				transform: translate(-50%,-50%);
+			}
+			.list-item{
+				background: #FFFFFF;
+				border-radius: 10rpx;
+				box-sizing: border-box;
+				padding: 22rpx 43rpx;
+				margin-bottom: 20rpx;
+				font-weight: 500;
+				font-size: 30rpx;
+				color: #333333;
+				display: flex;
+				align-items: center;
+				justify-content: space-between;
+				&.active{
+					background: #F4F9FF;
+					border: 1px solid #ACBDF8;
+					color: #214DED;
+				}
+			}
+		.icon_choose {
+			background-image: url('~@/static/custom/daily/icon_choose.png');
+			background-repeat: no-repeat;
+			background-size: cover;
+			height: 20rpx;
+			width: 20rpx;
+			position: relative;
+		}
+	}
+	.bottom {
+		box-sizing: border-box;
+		margin-top: 40rpx;
+		//height: 100rpx;
+		.btn {
+			height: 80rpx;
+			background: #214DED;
+			border-radius: 8rpx;
+			font-weight: 500;
+			font-size: 34rpx;
+			color: #FFFFFF;
+			z-index: 99;
+		}
+	}
+}
+</style>
diff --git a/pages/oa/form.vue b/pages/oa/form.vue
new file mode 100644
index 0000000..c6a7692
--- /dev/null
+++ b/pages/oa/form.vue
@@ -0,0 +1,116 @@
+<template>
+	<view class="wrap">
+		<u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+			<u-calendar v-model="show" mode="date" @change="change" max-date="2099-12-31"></u-calendar>
+			<u-form-item label="鎻愪氦浜�" prop="leaveTime" label-width="180" v-if="model.leaveId">
+				<u-input v-model="model.username" type="text" disabled="true" @click="show=true"></u-input>
+			</u-form-item>
+			<u-form-item label="寮�濮嬫椂闂�" prop="leaveTime" label-width="180">
+				<u-input v-model="model.leaveTime" type="text" disabled="true" @click="show=true"></u-input>
+			</u-form-item>
+			<u-form-item label="澶╂暟" prop="days" label-width="180">
+				<u-input v-model="model.days" type="number"></u-input>
+			</u-form-item>
+			<u-form-item label="澶囨敞" prop="content" label-width="180">
+				<u-input v-model="model.content" type="textarea"></u-input>
+			</u-form-item>
+		</u-form>
+		<view class="form-footer">
+			<u-button class="btn" type="primary" @click="create" v-if="!model.leaveId">鍒涘缓</u-button>
+			<u-button class="btn" type="primary" @click="submit" v-if="model.state === '0'">鎻愪氦</u-button>
+			<u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				show: false,
+				isAdd: false,
+				model: {
+					leaveId: '',
+					days: 1,
+					content: '',
+					leaveTime: '',
+				},
+				rules: {
+					leaveTime: [{
+						required: true,
+						message: '璇疯緭鍏ュ紑濮嬫椂闂�',
+						trigger: ['change', 'blur'],
+					}],
+					days: [{
+						required: true,
+						message: '璇疯緭鍏ュぉ鏁�',
+						trigger: ['change', 'blur'],
+					}]
+				}
+			};
+		},
+		onLoad(params) {
+			if (!params.leaveId) {
+				return false;
+			}
+			this.$u.api.pigxOA.queryBill(params).then(res => {
+				Object.assign(this.model, res.data);
+			});
+		},
+		onReady() {
+
+		},
+		methods: {
+			change(e) {
+				this.model.leaveTime = e.result + " 00:00:00"
+			},
+			create() {
+				this.$refs.uForm.validate(valid => {
+					if (valid) {
+						this.$u.api.pigxOA.addTask(this.model).then(res => {
+							uni.showModal({
+								title: '鎻愮ず',
+								content: '鎻愪氦鎴愬姛',
+								showCancel: false,
+								success: function() {
+									uni.navigateTo({
+										url: '/pages/oa/history'
+									})
+								}
+							});
+						});
+
+					} else {
+						this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�');
+					}
+				});
+			},
+			submit() {
+				this.$refs.uForm.validate(valid => {
+					if (valid) {
+						this.$u.api.pigxOA.submitBill(this.model).then(res => {
+							uni.showModal({
+								title: '鎻愮ず',
+								content: '鎻愪氦鎴愬姛',
+								showCancel: false,
+								success: function() {
+									uni.navigateTo({
+										url: '/pages/oa/history'
+									})
+								}
+							});
+						});
+			
+					} else {
+						this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�');
+					}
+				});
+			},
+			cancel() {
+				uni.navigateBack();
+			}
+		}
+	};
+</script>
+<style lang="scss">
+
+</style>
diff --git a/pages/oa/history.vue b/pages/oa/history.vue
new file mode 100644
index 0000000..518438c
--- /dev/null
+++ b/pages/oa/history.vue
@@ -0,0 +1,140 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.leaveId" :sub-title="item.leaveTime" v-for="(item, index) in list"
+					:key="item.leaveId" :index="item.leaveId" @click="cardClick(item.leaveId)">
+					<view class="" slot="body">
+						<view>
+							<span class="span-lable">鐢宠浜�:</span>
+							{{item.username}}
+						</view>
+						<view>
+							<span class="span-lable">鐢宠浜�:</span>
+							{{item.content}}
+						</view>
+						<view>
+							<span class="span-lable">杩涘害:</span>
+							<span v-if="item.state === '0'">鏈彁浜�</span>
+							<span v-if="item.state === '1'">瀹℃壒涓�</span>
+							<span v-if="item.state === '2'">宸插畬鎴�</span>
+							<span v-if="item.state === '9'">椹冲洖</span>
+						</view>
+					</view>
+					<view class="card-foot" slot="foot">
+						<u-button size="medium" @click="del(item.leaveId)">鍒犻櫎</u-button>
+					</view>
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="navTo('form')">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			cardClick(e) {
+				uni.navigateTo({
+					url: '/pages/oa/form?leaveId=' + e
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxOA.queryBillPage(this.query).then(res => {
+					console.log('res:', res)
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			del(leaveId) {
+				let self = this;
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+					showCancel: true,
+					success: function(res2) {
+						if (res2.confirm) {
+							self.$u.api.pigxOA.delBill({
+								leaveId: leaveId
+							}).then(res => {
+								self.$u.toast('鍒犻櫎鎴愬姛');
+								self.query.current = 1
+								self.list = []
+								self.loadList()
+							});
+						}
+					}
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.query.username = value;
+				this.loadList();
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	page {
+		background-color: #f8f8f8;
+	}
+
+	.btn-plus {
+		position: absolute;
+		bottom: 50rpx;
+		right: 50rpx;
+		z-index: 1;
+		opacity: 0.6;
+	}
+
+	.btn-plus:hover {
+		opacity: 1;
+	}
+
+</style>
diff --git a/pages/oa/task.vue b/pages/oa/task.vue
new file mode 100644
index 0000000..0a0b828
--- /dev/null
+++ b/pages/oa/task.vue
@@ -0,0 +1,73 @@
+<template>
+	<view class="wrap">
+		<u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+			<u-calendar v-model="show" mode="date" @change="change" max-date="2099-12-31"></u-calendar>
+			<u-form-item label="鎻愪氦浜�" prop="leaveTime" label-width="180" v-if="model.leaveId">
+				<u-input v-model="model.username" type="text" disabled="true" @click="show=true"></u-input>
+			</u-form-item>
+			<u-form-item label="寮�濮嬫椂闂�" prop="leaveTime" label-width="180">
+				<u-input v-model="model.leaveTime" type="text" disabled="true" @click="show=true"></u-input>
+			</u-form-item>
+			<u-form-item label="澶╂暟" prop="days" label-width="180">
+				<u-input v-model="model.days" type="number"></u-input>
+			</u-form-item>
+			<u-form-item label="鎻愪氦浜哄娉�" prop="content" label-width="180">
+				<u-input v-model="model.content" type="textarea"></u-input>
+			</u-form-item>
+			<u-form-item label="瀹℃壒浜烘壒娉�" prop="content" label-width="180">
+				<u-input v-model="model.comment" type="textarea"></u-input>
+			</u-form-item>
+			<u-image width="100%" height="300rpx" mode="aspectFit" :src="viewSrc">
+			</u-image>
+		</u-form>
+		<view class="form-footer" v-for="(item, index) in model.flagList" :key="index" :index="index">
+			<u-button class="btn" type="primary" @click="doTask(item)">{{item}}</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				show: false,
+				isAdd: false,
+				viewSrc: '',
+				model: {
+					leaveId: '',
+					days: 1,
+					content: '',
+					leaveTime: '',
+				}
+			};
+		},
+		onLoad(params) {
+			this.viewSrc = this.vuex_config.baseUrl + '/act/task/view/' + params.taskId
+			this.$u.api.pigxOA.getTask(params).then(res => {
+				console.log(res.data)
+				Object.assign(this.model, res.data);
+			});
+		},
+		onReady() {
+
+		},
+		methods: {
+			doTask(flag) {
+				this.$u.api.pigxOA.doTask(this.model).then(res => {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: flag + '鎴愬姛',
+						showCancel: false,
+						success: function() {
+							uni.navigateTo({
+								url: '/pages/oa/todos'
+							})
+						}
+					});
+				});
+			}
+		}
+	};
+</script>
+<style lang="scss">
+
+</style>
diff --git a/pages/oa/todos.vue b/pages/oa/todos.vue
new file mode 100644
index 0000000..9ca273b
--- /dev/null
+++ b/pages/oa/todos.vue
@@ -0,0 +1,128 @@
+<template>
+	<view class="wrap">
+		<view class="search">
+			<u-search v-model="keywords" @custom="search" @search="search"></u-search>
+		</view>
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-swipe-action :options="options" v-for="(item, index) in list" :key="item.taskId" :index="index"
+					@click="optionsClick">
+					<u-cell-item :arrow="true" @click="navTo('/pages/oa/task?taskId='+item.taskId)">
+						<text slot="title">{{item.taskId}} {{ item.taskName }}</text>
+						<text slot="label">鍒涘缓鏃堕棿锛歿{ item.time }}</text>
+					</u-cell-item>
+				</u-swipe-action>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="navTo('form')">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxOA.queryTodos(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			optionsClick(rowIndex, btnIndex) {
+				if (btnIndex == 0) {
+					let self = this;
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+						showCancel: true,
+						success: function(res2) {
+							if (res2.confirm) {
+								let row = self.list[rowIndex];
+								self.$u.api.pigxUser.delete({
+									id: row.userId
+								}).then(res => {
+									self.$u.toast('鍒犻櫎鎴愬姛');
+									self.query.current = 1
+									self.list = []
+									self.loadList()
+								});
+							}
+						}
+					});
+				}
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.query.username = value;
+				this.loadList();
+			},
+			navTo(url) {
+				uni.navigateTo({
+					url: url
+				});
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	page {
+		background-color: #f8f8f8;
+	}
+
+	.btn-plus {
+		position: absolute;
+		bottom: 50rpx;
+		right: 50rpx;
+		z-index: 1;
+		opacity: 0.6;
+	}
+
+	.btn-plus:hover {
+		opacity: 1;
+	}
+</style>
diff --git a/pages/product/feed/feedRecordList.vue b/pages/product/feed/feedRecordList.vue
new file mode 100644
index 0000000..33e3b2d
--- /dev/null
+++ b/pages/product/feed/feedRecordList.vue
@@ -0,0 +1,179 @@
+<template>
+	<view class="page">
+	  <view class="productfeed-feedrecordlist-bg"/>
+	  <u-navbar title="鎶曟枡璁板綍" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+	  <view class="wrap">
+		<scroll-view class="productfeed-feedrecordlist-scroll-list" scroll-y="true">
+			<u-cell-group class="productfeed-feedrecordlist-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in feedList" :key="item.id" :index="index">
+					<view class="row-list task-row">
+						<view class="_label">
+							闆朵欢缂栧彿:
+						</view>
+						<view class="_content">
+							{{ item.partNo }}
+						</view>
+					</view>
+					<view class="row-list task-row">
+						<view class="_label">
+							闆朵欢:
+						</view>
+						<view class="_content">
+							{{ item.partName }}
+						</view>
+					</view>
+					<view class="row-list task-row">
+						<view class="_label">
+							SN鍙�:
+						</view>
+						<view class="_content">
+							{{ item.partBatchNo }}
+						</view>
+					</view>
+					<view class="row-list task-row">
+						<view class="_label">
+						杞藉叿缂栧彿:
+						</view>
+						<view class="_content">
+							{{ item.reelNumber }}
+						</view>
+					</view>
+					
+					<view class="row-list task-row">
+						<view class="_label">
+						鍙敤鏁伴噺:
+						</view>
+						<view class="_content">
+							{{ item.availableStockQuantity }}
+						</view>
+					</view>
+					<view class="row-list task-row">
+						<view class="_label">
+						搴撳瓨鏁伴噺:
+						</view>
+						<view class="_content">
+							{{ item.stockQuantity }}
+						</view>
+					</view>
+					<view class="row-list task-row">
+						<view class="_label">
+							鍗曚綅:
+						</view>
+						<view class="_content">
+							{{ item.unit }}
+						</view>
+					</view>
+					<view class="row-list task-row">
+						<view class="_label">
+							鎶曟枡浜�:
+						</view>
+						<view class="_content">
+							{{ item.createUser }}
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+	  </view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				feedList:[],
+				originList: [],
+			};
+		},
+		onLoad(params) {
+			if (params && params.workstationId !== "undefined") {
+			   this.loadList(params.workstationId);
+			}
+		},
+		onShow() {
+			
+		},
+		methods: {
+			loadList(workstationId) {
+
+				//宸叉姇鏈秷鑰�
+				let params={
+					workstationId:workstationId
+				}
+				
+				this.$u.api.pigxFeed.getFeedingStock(params).then(res => {						
+					console.log(res)
+					this.originList  = res.data
+					this.feedList  = this.originList
+				});	
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.productfeed-feedrecordlist-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+		
+	.productfeed-feedrecordlist-scroll-list-group{
+		padding:0rpx 30rpx ;
+		::v-deep .u-cell-item-box {
+			border-radius: 10rpx;
+			padding: 25rpx 23rpx;
+		}
+		.content{
+			height:400rpx;
+			background: #F5F9FF;
+			padding: 0rpx 14rpx;
+			.row-list {
+				height: 50rpx;
+				display: flex;
+				flex-direction: row;
+				padding: 0px;
+				align-items: center;
+				justify-content: space-between;
+			}
+			.row-list ._label {
+				display: flex;
+				color: #666666;
+				font-size:26rpx;
+				align-items: center;
+				width: 170rpx;
+			}
+			
+			.row-list ._content {
+				text-align: right;
+				color: #909399;
+				font-size: 24rpx;
+				._content-text{
+					color:#214ded;
+				}
+			}
+			.row-list ._input {
+				::v-deep .uni-input-input{
+					color:#D35651;
+					border-bottom: 1px solid #ADC8E4;
+				}
+			}
+		}
+	}
+</style>
+
diff --git a/pages/product/feed/index.vue b/pages/product/feed/index.vue
new file mode 100644
index 0000000..41da394
--- /dev/null
+++ b/pages/product/feed/index.vue
@@ -0,0 +1,756 @@
+<template>
+	<view class="page">
+	  <view class="productfeed-index-bg"/>
+	  <u-navbar title="鐢熶骇鎶曟枡" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+	  <view class="productfeed-index-param">
+		<view class="productfeed-index-param-title">
+			<view>
+				<u-line style="border:5rpx solid #264DE9" length="33rpx"  direction="col" color="#264DE9" :hair-line="false"></u-line>
+			</view>
+			<view class="title-label">鎶曟枡淇℃伅</view>
+		</view>
+	  	<view class="productfeed-index-param-view">
+			<view class="productfeed-index-param-item param-extra">
+				<view class="productfeed-index-param-item-left">
+				  <text class="item-one">宸ヤ綔绔�</text>
+				</view>
+				<view class="productfeed-index-param-item-right" @click="toWorkstation()">
+				   <text v-if="feedMainInfo.workstationName" class="item-one">{{feedMainInfo.workstationName}}</text>
+				   <text v-if="!feedMainInfo.workstationName" class="item-one item-two">璇烽�夋嫨</text>
+				   <u-icon name="arrow-right" color="#2979ff" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="productfeed-index-param-item param-extra">
+				<view class="productfeed-index-param-item-left">
+				  <text class="item-one">宸ュ崟鍙�</text>
+				</view>
+				<view class="productfeed-index-param-item-right" @click="toOptask()">
+				   <text v-if="feedMainInfo.optaskNo" class="item-one">{{feedMainInfo.optaskNo}}</text>
+				   <text v-if="!feedMainInfo.optaskNo" class="item-one item-two">璇烽�夋嫨</text>
+				   <u-icon name="arrow-right" color="#2979ff" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="productfeed-index-param-item">
+				<view class="productfeed-index-param-item-left">
+				  <text class="item-one">鎶曟枡璁板綍</text>
+				</view>
+				<view class="productfeed-index-param-item-right" @click="toFeedRecord()">
+				   <text class="item-three">鍘绘煡鐪�</text>
+				   <u-icon name="arrow-right" color="#2979ff" size="28"></u-icon>
+				</view>
+			</view>
+	  	</view>
+	  </view>
+	  <view class="productfeed-index-body-title">
+	  	<view>
+	  		<u-line style="border:5rpx solid #264DE9" length="33rpx"  direction="col" color="#264DE9" :hair-line="false"></u-line>
+	  	</view>
+	  	<view class="title-label">鎵弿璁板綍</view>
+	  </view>
+	  <view class="wrap">
+		<scroll-view class="productfeed-index-scroll-list" scroll-y="true" >	
+		<u-cell-group class="productfeed-index-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.erpPartNo" :index="index">
+					<view class="content-header">
+							<view class="header-item">
+								<view class="content-header-icon-one"></view>
+								<view class="content-header-title">{{ item.partBatchNo }}</view>
+							</view>
+							<view class="header-item">
+								<view class="content-header-icon-two"></view>
+								<view class="content-header-title-ne">{{ item.partName }}</view>
+							</view>
+							<view class="header-item-toolbar" @click="deleteHandle(item)">
+								<view class="header-item-toolbar-del-icon">
+									
+								</view>
+								<view class="header-item-toolbar-del-text">
+									鍒犻櫎
+								</view>
+							</view>
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									闆朵欢缂栧彿锛�
+								</view>
+								<view class="_content">
+									{{ item.partNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鍙敤鏁伴噺锛�
+								</view>
+								<view class="_content">
+									<text class="_content-text">{{ item.reservedQuantity }}</text>
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鎶曟枡鏁伴噺锛�
+								</view>
+								<view class="_content _input">
+									<u-input placeholder="璇疯緭鍏ユ姇鏂欐暟閲�" v-model="item.suppliedQuantity" type="digit"></u-input>
+									<view class="edit_icon"></view>
+								</view>
+							</view>
+						</view>
+				</view>
+			</u-cell-group>		
+		</scroll-view>
+		<scan></scan>		
+		<view class="productfeed-footer">
+			<u-button class="btn-left" text="娓呯┖" size="medium"  @click="clearData()">娓呯┖</u-button>
+			<u-button class="btn-right" text="鎶曟枡" size="medium"  @click="feedMaterialClick()">鎶曟枡</u-button>
+		</view>
+	  </view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				showCardHead: false,
+				feedMainInfo: {
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null,
+					optaskId: null,
+					optaskNo: null,
+					feedLocId: null,
+					feedLocNo: null,
+					feedLocName: null,
+					partId: null,
+					partNo: null,
+					partName: null,
+					quality: null,
+					ifsBatchNo:null,
+					customerOrderNo:null
+				},
+				query: {
+					current: 1,
+					size: 20
+				},	
+				list:[],
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						backgroundColor: '#dd524d'
+					}
+				}],
+				count: 0,
+				loadStatus: 'loadmore',
+				idIndex:1
+			};
+		},
+		onLoad() {
+		
+		},
+		onShow() {
+			
+			let that = this
+					
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				// console.log(data.code.replace(/\n/g,'').replace(/\s*/g,''))
+				// console.log('鎵爜缁撴灉1锛�', JSON.parse(data.code.replace(/\n/g,"").replace(/\s*/g,'')));
+				// that.search(data.code);	
+				
+				if (data.code != "" && 
+				                   (that.feedMainInfo.workstationId == "" 
+								   || that.feedMainInfo.workstationId==null
+								   || that.feedMainInfo.workstationId==undefined
+								   || that.feedMainInfo.workstationId=="undefined"
+								   )) {
+					uni.showToast({
+						title: '璇峰厛閫夋嫨宸ヤ綔绔欙紝鍐嶆壂鐮�',
+						icon: 'none'
+					})
+					return
+				}
+								
+				that.loadList(data.code);
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			this.goScan()
+		},
+		methods: {
+			goScan(){
+				 //let scanresult={"part_no":"88.118.1/A0044193","package_code":"TP092022101200001","unit_meas":"璺�","wdr":"*","lot_batch_no":"*","qty_arrived":12}
+				 //this.scanHandle(JSON.stringify(scanresult))
+				
+				uni.scanCode({
+					scanType: ['qrCode'],
+					success: res => {
+						try {
+							console.log('鎵爜缁撴灉锛�', res);
+							this.scanHandle(res.result)
+						} catch (e) {}
+					}
+				});
+			},
+			scanHandle(workstationNo){
+				if(workstationNo!=''){
+					this.$u.api.pigxFeed.fetchWorkstationList({workstationNo:workstationNo}).then(resp => {
+						
+						if (!resp.data.records || resp.data.records.length == 0) {
+							this.$u.toast('銆�'+workstationNo+'銆�,鏈煡璇㈠埌鏈哄彴淇℃伅')
+						}else{
+							let workstationList=resp.data.records
+							let scanWorkstationInfo=workstationList[0]
+							this.feedMainInfo.workstationId = scanWorkstationInfo.id
+							this.feedMainInfo.workstationNo = scanWorkstationInfo.workstationNo
+							this.feedMainInfo.workstationName = scanWorkstationInfo.name
+							
+						}								
+					})
+				}else{
+					this.$u.toast('鏈壂鎻忓埌鏈哄彴鍙�')
+				}
+			},
+			clearData(){
+				this.list = []
+				this.feedMainInfo={
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null,
+					optaskId: null,
+					optaskNo: null,
+					feedLocId: null,
+					feedLocNo: null,
+					feedLocName: null,
+					partId: null,
+					partNo: null,
+					partName: null,
+					quality: null,
+					customerOrderNo:null
+				}
+			},
+			feedMaterialClick(){
+					
+				let that = this;
+				
+				if(that.feedMainInfo.workstationNo==""||that.feedMainInfo.workstationNo==undefined||that.feedMainInfo.workstationNo=="undefined")
+				{
+					that.$u.toast('璇峰厛閫夋嫨宸ヤ綔绔�')
+					return
+				}		
+				
+				if(that.list.length==0)
+				{
+					that.$u.toast('璇锋壂鐮佽幏鍙栨姇鏂欎俊鎭�')
+					return
+				}
+				
+				for(let i=0;i<that.list.length;i++)
+				{
+					if(that.list[i].suppliedQuantity>that.list[i].reservedQuantity)
+					{
+						
+							that.$u.toast('鍙敤搴撳瓨鏁伴噺鍙湁:'+that.list[i].reservedQuantity + '锛屾姇鏂欐暟閲忚秴杩囧簱瀛樻暟鎹紝璇烽噸鏂拌緭鍏ユ姇鏂欐暟閲�')
+							return
+					}
+				}		
+				
+				let feedList=[]
+				that.list.map((item) => {
+					
+					  let suppliedQuantity =0;
+					  suppliedQuantity = item.suppliedQuantity!=""?parseFloat(item.suppliedQuantity):0
+					
+					 let data ={
+							workstationId: that.feedMainInfo.workstationId,
+						    //workstationNo : that.feedMainInfo.workstationNo,
+							stockId: item.stockId,
+							joinStockOrderId: item.id,
+							suppliedQuantity: suppliedQuantity,
+							partId: item.partId,
+							partNo: item.partNo,
+							partBatchNo: item.partBatchNo,
+							systemNo: item.systemNo,
+							partName: item.partName,
+							unit: item.partUnit ? item.partUnit : '',
+							//ifsBatchNo:item.ifsBatchNo ,//ifs鎵规鍙�
+							
+					 }
+					 feedList.push(data)
+				
+				});	
+				const feedIn = {
+				        feeds: feedList,
+				        customOrderNo: that.feedMainInfo.customOrderNo,
+				        feedingFrom: 'joinStocker',
+				        operationTaskId: that.feedMainInfo.optaskId,
+				        source: undefined
+				      }
+				that.$u.api.pigxFeed.addFeed(feedIn).then(res => {
+				
+					if (res.code == 0) {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦鎴愬姛',
+							showCancel: false,
+							success: function() {
+								that.list = []
+								
+							}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦澶辫触',
+							showCancel: false,
+							success: function() {
+				
+							}
+						})
+					}
+				
+				})
+			},
+			toFeedRecord() {
+				
+				if(this.feedMainInfo.workstationNo==""||this.feedMainInfo.workstationNo==undefined||this.feedMainInfo.workstationNo=="undefined")
+				{
+					this.$u.toast('璇峰厛閫夋嫨宸ヤ綔绔�')
+					return
+				}				
+				
+				uni.navigateTo({
+					url: '/pages/product/feed/feedRecordList?workstationId='+this.feedMainInfo.workstationId
+				})
+			},
+			setLocation(location) {
+				this.feedMainInfo.feedLocId = location.id
+				this.feedMainInfo.feedLocNo = location.locNo
+				this.feedMainInfo.feedLocName = location.locName
+			},
+			setWorkstation(workstation) {
+				this.feedMainInfo.workstationId = workstation.id
+				this.feedMainInfo.workstationNo = workstation.workstationNo
+				this.feedMainInfo.workstationName = workstation.name
+			},
+			setOptask(task) {
+				this.feedMainInfo.optaskId = task.id
+				this.feedMainInfo.optaskNo = task.optaskNo
+				this.feedMainInfo.partId = task.partId
+				this.feedMainInfo.partNo = task.partNo
+				this.feedMainInfo.partName = task.partName
+				this.feedMainInfo.quality = task.plannedQuantity
+				this.feedMainInfo.customerOrderNo=task.customerOrderNo
+			},
+			toLocation() {
+				
+				if(this.feedMainInfo.workstationNo==""||this.feedMainInfo.workstationNo==undefined||this.feedMainInfo.workstationNo=="undefined")
+				{
+					this.$u.toast('璇峰厛閫夋嫨宸ヤ綔绔�')
+					return
+				}
+				
+				uni.navigateTo({
+					url: '/pages/product/feed/locationList?workstationNo='+this.feedMainInfo.workstationNo
+				})
+			},
+			toOptask() {
+			
+				
+				if(this.feedMainInfo.workstationNo==""||this.feedMainInfo.workstationNo==undefined||this.feedMainInfo.workstationNo=="undefined")
+				{
+					this.$u.toast('璇峰厛閫夋嫨宸ヤ綔绔�')
+					return
+				}
+				
+				
+				uni.navigateTo({
+					url: '/pages/product/feed/optaskList?workstationNo='+this.feedMainInfo.workstationNo
+				})
+			},
+			toWorkstation() {
+				uni.navigateTo({
+					url: '/pages/product/feed/workstationList'
+				})
+			},
+			loadList(sanCode) {
+				let that = this
+				if(sanCode!="")
+				{
+					//鏍规嵁鎵叆鐨勫瓧绗︿覆淇℃伅锛屽垽鏂壂鐨勬槸鏉″舰鐮侊紝杩樻槸浜岀淮鐮�
+					let batchNo=''
+					if (sanCode.indexOf('lot_batch_no') != -1) {
+					    // 浜岀淮鐮�
+					    const scanContentJson = JSON.parse(
+					        sanCode.replace(/\n/g, '').replace(/\s*/g, '')
+					    )
+					    const partNo= scanContentJson.part_no
+					    const ifsBatchNo = scanContentJson.lot_batch_no
+						batchNo=scanContentJson.sn_no
+						if(!(batchNo && batchNo!=null && batchNo!='' && batchNo!='null')){
+							batchNo=''
+						}
+					    
+					} else {
+					    // 鏉″舰鐮�
+					    batchNo = sanCode
+                            	
+					}
+				   
+				   let params=Object.assign(
+				               { current: 1, size: 50 },
+				               {operationTaskId:this.feedMainInfo.optaskId},
+				               {partBatchNo:batchNo}
+				             )
+					
+					//鑾峰彇閰嶇洏鐗╂枡
+					this.$u.api.pigxFeed.fetchJoinStockOrderList(params).then(res => {
+										   let reList = []					   
+										   reList = res.data.records;	
+										   if(reList.length==0)
+											{
+												uni.showToast({
+														title: "鏈壂鍒伴厤鐩樼墿鏂欎俊鎭�",
+														icon: "none"
+													});
+												return
+											}
+											let flag = true
+											for (let i = 0; i < reList.length; i++) {
+											        const exist = that.list.find(
+											              (el) => el.partBatchNo == reList[i].partBatchNo
+											        )
+											        if (exist) {
+											            flag = false
+											        }
+											}
+											if(!flag){
+												uni.showToast({
+														title: "闆朵欢鎵规宸插瓨鍦�",
+														icon: "none"
+													});
+												return
+											}else{				 
+												reList.map((item) => {						
+													item.suppliedQuantity = item.reservedQuantity	
+													that.list.push(item)						
+												});
+											}
+					});
+					
+				   //鏍规嵁宸ヤ綔绔檌d鏌ヨ绾胯竟浠�
+				   /*this.$u.api.pigxFeed.getStockByWorkstationId(params).then(res => {
+					   let reList = []					   
+					   reList = res.data.records;	
+					   if(reList.length==0)
+						{
+							uni.showToast({
+									title: "鏈壂鍒扮浉搴旀姇鏂欎俊鎭�",
+									icon: "none"
+								});
+							return
+						}
+										 
+						reList.map((item) => {						
+							item.suppliedQuantity = item.reservedQuantity	
+							that.list.push(item)						
+						});		
+				   });*/
+				}
+				
+				this.$forceUpdate(); 
+			
+			},			
+			deleteHandle(obj) {
+				let that = this
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '姝ゆ搷浣滃皢鍒犻櫎璇ユ壂鐮佷俊鎭�, 鏄惁缁х画?',
+					success: function(res) {
+						if (res.confirm) {
+					
+							that.list.map((item, index) => {
+								if (obj.id == item.id) {
+									that.list.splice(index, 1)
+								}
+							});						
+						}
+					}
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.query.username = value;
+				this.loadList();
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.productfeed-index-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.productfeed-index-param{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+		.productfeed-index-param-title{
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			margin-bottom: 30rpx;
+			.title-label{
+				margin-left: 14rpx;
+				font-size: 34rpx;
+				font-weight: bold;
+				color: #283E65;
+			}
+		}
+		.productfeed-index-param-view{
+			height: 300rpx;
+			background-color: #fff;
+			border-radius: 10rpx;
+			padding:0rpx 23rpx;
+			margin-bottom: 30rpx;
+			.productfeed-index-param-item{
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display:flex;
+				justify-content: space-between;
+				border: none;
+				.productfeed-index-param-item-left{
+					.item-one{
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+				.productfeed-index-param-item-right{
+					.item-one{
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+					.item-two{
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+					.item-three{
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+				}
+			}
+			.param-extra{
+				border-bottom: 1px solid #EDEDED;
+			}
+		}
+	}
+	
+	.productfeed-index-body-title{
+		padding: 0rpx 30rpx 0rpx 30rpx;
+		margin-bottom: 32rpx;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		.title-label{
+			margin-left: 14rpx;
+			font-size: 34rpx;
+			font-weight: bold;
+			color: #283E65;
+		}
+	}
+	
+	.wrap .productfeed-index-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 756rpx);
+	    width:100%;
+	}
+	.productfeed-index-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 24rpx;
+			height: 332rpx;
+			padding: 10rpx 20rpx;
+			box-shadow:0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position:relative;
+			.content-header{
+				.header-item{
+					height: 50rpx;
+					display: flex;
+					align-items:center;
+					.content-header-icon-one{
+						background-image: url('~@/static/custom/product/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-icon-two{
+						background-image: url('~@/static/custom/product/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+					.content-header-title-ne{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+			    }
+				.header-item-toolbar{
+					position: absolute;
+					background-image: url('~@/static/custom/product/del-icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:60rpx;
+					width:140rpx;
+					right:0;
+					top:0;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+					.header-item-toolbar-del-icon{
+						background-image: url('~@/static/custom/product/icon_dele.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:25rpx;
+						width:22rpx;
+						margin-top: 5rpx;
+					}
+					.header-item-toolbar-del-text{
+						margin-left:7rpx;
+						height: 23rpx;
+						font-size: 24rpx;
+						color: #FFFFFF;
+					}
+				}
+			}
+			
+			.content-body{
+				height:200rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 25rpx 23rpx;
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size:26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+				
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+					._content-text{
+						color:#214ded;
+					}
+				}
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+					.edit_icon{
+						background-image: url('~@/static/custom/finishProductIn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					::v-deep .uni-input-input{
+						color:#D35651;
+					}
+				}
+			}
+		}
+	}
+	
+	.productfeed-footer{
+		padding: 0rpx 30rpx 0rpx 30rpx;
+		margin-bottom: 20rpx;
+		display: flex;
+		justify-content: space-between;
+		.btn-left{
+			width: 310rpx;
+			height: 90rpx;
+			background: #DBE5F3;
+			border: 1px solid #BFCFE4 !important;
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.3);
+			border-radius: 16rpx;	
+			font-size: 40rpx;
+			font-weight: bold;
+			color: #404761;
+		}
+		.btn-left:after{
+				border:none !important;
+		}
+		.btn-right{
+			width: 310rpx;
+			height: 90rpx;
+			background: #214DED;
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+			border-radius: 16rpx;
+			font-size: 40rpx;
+			font-weight: bold;
+			color: #FEFEFE;
+		}
+	}
+	.scan{
+		width: 60rpx;
+		height: 60rpx;
+		font-size: 60rpx;
+		color: #3281ff;
+	}
+</style>
diff --git a/pages/product/feed/locationList.vue b/pages/product/feed/locationList.vue
new file mode 100644
index 0000000..3ca8fde
--- /dev/null
+++ b/pages/product/feed/locationList.vue
@@ -0,0 +1,196 @@
+<template>
+	<view class="wrap">
+		<view class="search">
+			<u-search v-model="keywords" placeholder="璇疯緭鍏ュ簱浣嶅悕绉�" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+		<scroll-view class="scroll-list" scroll-y="true" >
+			<u-cell-group class="list" :border="false">
+				<view v-if="locationList==0" class="nodata">
+					<view>鏈煡鍒版暟鎹�</view>
+				</view>
+				<view v-else class="content" v-for="(item, index) in locationList" :key="item.locNo" :index="index"
+					@click="selectLocation(item)">
+					<view class="row-list">
+						<view class="_label">
+							搴撲綅缂栧彿:
+						</view>
+						<view class="_content">
+							{{ item.locNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							搴撲綅鍚嶇О:
+						</view>
+						<view class="_content">
+							{{ item.locName }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							搴撲綅绫诲瀷:
+						</view>
+						<view class="_content">
+							{{ getLocTypeName(item.locType)}}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							搴撲綅鐘舵��:
+						</view>
+						<view class="_content">							
+							{{getLocStatus(item.locStatus)}}
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		<scan></scan>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				originList: [],
+				locationList: [],
+				keywords: "",
+				dictType: "warehouse_type",
+				listLocType: []
+			};
+		},
+		onLoad(params) {
+
+			//鑾峰彇鏁� 搴撲綅鐘舵��
+			this.$u.api.dictData({
+				dictType: this.dictType
+			}).then(res => {
+				this.listLocType = res.data;
+
+			});
+
+			if (params && params.workstationNo !== "undefined") {
+				this.loadList(params.workstationNo);
+			}
+
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.search(data.code);
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			getLocTypeName(locType) {
+				let reDate = ""
+				let that = this
+				//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦�
+				let list = that.listLocType.filter(item => item.value == locType)
+				if (list.length > 0) {
+					reDate = list[0].label
+				}
+				return reDate
+			},
+			getLocStatus(locStatus) {
+				let reDate = ""
+				switch (locStatus) {
+					case 1:
+						reDate = "浣跨敤";
+						break;
+					case 0:
+						reDate = "鍋滅敤";
+						break;
+				}
+
+				return reDate;
+			},
+			selectLocation(location) {
+				this.refreshLastPage(location)
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(location) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setLocation(location)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			search(value) {
+				let that = this
+				if (value) {
+					that.locationList = that.originList.filter(item => item.locName.includes(value))
+				} else {
+					that.locationList = that.originList
+				}
+			},
+			loadList(workstationNo) {
+				let params = {
+					workstationNo: workstationNo
+				}
+				//鏍规嵁宸ヤ綔绔欑紪鍙疯幏鍙栬繘琛屼腑鐨勫伐鍗�&&瀵瑰簲鐨勭嚎杈逛粨
+				this.$u.api.pigxFeed.getBasicInfoForPdaFeedByWorkstationNo(params).then(res => {
+					this.originList = res.data.locationList
+					this.locationList = this.originList
+				});
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+
+	.row-list {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.row-list ._label {
+		flex: 0.8;
+		color: #909399;
+	}
+
+	.row-list ._content {
+		flex: 1.5;
+		text-align: right;
+	}
+	
+	.nodata{width: 20%;margin: auto;}
+</style>
diff --git a/pages/product/feed/optaskList.vue b/pages/product/feed/optaskList.vue
new file mode 100644
index 0000000..6aac8f5
--- /dev/null
+++ b/pages/product/feed/optaskList.vue
@@ -0,0 +1,269 @@
+<template>
+	<view class="page">
+		<view class="productfeed-optasklist-bg"/>
+				<u-navbar title="宸ュ崟" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+				<view class="productfeed-optasklist-search">
+					<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ伐鍗曞彿" @clear="search" @custom="search" @search="search">
+					</u-search>
+		</view>
+	  <view class="wrap">
+		<scroll-view class="productfeed-optasklist-scroll-list" scroll-y="true">
+			<u-cell-group class="productfeed-optasklist-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in optaskList" :key="item.optaskNo" :index="index"
+					@click="selectTask(item)">
+					    <view class="content-header">
+							<view class="content-header-left">
+								<view class="content-header-icon"></view>
+								<view class="content-header-title">{{ item.optaskNo }}</view>
+							</view>
+							<view class="content-header-right">
+								{{getStateName(item.state)}}
+							</view>
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-1">
+									</view>
+									<view class="_label-name">闆朵欢缂栧彿锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.partNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-2">
+									</view>
+									<view class="_label-name">闆朵欢鍚嶇О锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.partName }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-3">
+									</view>
+									<view class="_label-name">璁″垝鏁伴噺锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.plannedQuantity }}
+								</view>
+							</view>
+						</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		data() {
+			return {	
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				optaskList:[],
+				originList: [],
+				keywords:"",
+			};
+		},
+		onLoad(params) {
+			if (params && params.workstationNo !== "undefined") {
+			   this.loadList(params.workstationNo);
+			}
+		},
+		onShow() {
+			
+		},
+		methods: {
+			getStateName(state) {
+				let reDate = ""
+				switch (state) {
+					case "01pending":
+						reDate = "绛夊緟";
+						break;
+					case "02inProgress":
+						reDate = "杩涜涓�";
+						break;
+				}
+			
+				return reDate;
+			},
+			search(value) {
+				let that = this
+				if (value) {
+					that.optaskList = that.originList.filter(item => item.optaskNo.includes(value))
+				} else {
+					that.optaskList = that.originList
+				}
+			},
+			loadList(workstationNo) {
+				
+				
+				let params=
+				{
+					workstationNo:workstationNo
+				}
+				//鏍规嵁宸ヤ綔绔欑紪鍙疯幏鍙栬繘琛屼腑鐨勫伐鍗�&&瀵瑰簲鐨勭嚎杈逛粨
+				this.$u.api.pigxFeed.getBasicInfoForPdaFeedByWorkstationNo(params).then(res => {					
+					this.originList  = res.data.operationTaskList
+					this.optaskList  = this.originList
+				});	
+
+			},
+			selectTask(task) {
+				this.refreshLastPage(task)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(task) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setOptask(task)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.productfeed-optasklist-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.productfeed-optasklist-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	
+	.wrap .productfeed-optasklist-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.productfeed-optasklist-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				justify-content: space-between;
+				.content-header-left{
+					display: flex;
+					align-items:center;
+					.content-header-icon{
+						background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+				}
+				.content-header-right{
+					text-align: right;
+					font-weight: bold;
+					color: #FB5B25;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/feed/workstationList.vue b/pages/product/feed/workstationList.vue
new file mode 100644
index 0000000..7fcf4ab
--- /dev/null
+++ b/pages/product/feed/workstationList.vue
@@ -0,0 +1,285 @@
+<template>
+	<view class="page">
+	  <view class="productfeed-workstation-bg"/>
+		<u-navbar title="宸ヤ綔绔�" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="productfeed-workstation-search">
+			<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ伐浣滅珯缂栧彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+	  </view>
+	  <view class="wrap">
+		<scroll-view class="productfeed-workstation-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="productfeed-workstation-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.workstationNo" :index="index"
+					@click="selectWorkstation(item)">
+					<view class="content-header">
+							<view class="content-header-icon"></view>
+							<view class="content-header-title">{{ item.workstationNo }}</view>
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-1">
+									</view>
+									<view class="_label-name">缂栧彿锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.workstationNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-2">
+									</view>
+									<view class="_label-name">鍚嶇О锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.name }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-3">
+									</view>
+									<view class="_label-name">澶囨敞锛�</view>	
+								</view>
+								<view class="_content s1">
+									{{ item.remark }}
+								</view>
+							</view>
+						</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<scan></scan>		
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				workStationList:[],
+				originList: [],
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				query: {
+					current: 1,
+					size: 10,
+					workstationNo:""
+				},
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			
+			let that = this
+					
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.search(data.code);					
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+		
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {	
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+
+				// 鏌ヨ宸ヤ綔绔欏垪琛�
+				this.$u.api.pigxFeed.fetchWorkstationList(this.query).then(res => {
+					
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}									
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			search(value) {
+							
+				let that = this
+				that.list = [];
+				that.total = 0;
+				
+				that.query= {
+					current: 1,
+					size: 20,
+					workstationNo:value
+				}
+				that.loadList()
+			},
+			selectWorkstation(workstation) {
+				this.refreshLastPage(workstation)
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(workstation) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setWorkstation(workstation)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.productfeed-workstation-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	.productfeed-workstation-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.wrap .productfeed-workstation-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.productfeed-workstation-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}	
+</style>
diff --git a/pages/product/labelPrint/labelPrint.vue b/pages/product/labelPrint/labelPrint.vue
new file mode 100644
index 0000000..7c16b34
--- /dev/null
+++ b/pages/product/labelPrint/labelPrint.vue
@@ -0,0 +1,711 @@
+<template>
+	<view class="app">
+		<view class="main">			
+			<view class="cu-card list">
+			<block v-for="(item,index) in listss" v-bind:key="index">
+				<view class="cu-item du-item shadow u-rela"  style="overflow:hidden;">		
+					<!-- <view class="content">
+						<text class="text-grey margin-left-sm text-df">鍘熸枡缂栧彿</text>
+						<text
+							class="text-black margin-left text-df">{{item.materialCode}}</text>
+					</view>	 -->
+					<view class="content">
+						<text class="text-grey margin-left-sm text-df">鍘熸枡浠g爜</text>
+						<text
+							class="text-black margin-left text-df">{{item.sn}}</text>
+					</view>	
+					<view class="content">
+						<text class="text-grey margin-left-sm text-df">鍘熸枡鍚嶇О</text>
+						<text
+							class="text-black margin-left text-df">{{item.type}}</text>
+					</view>		
+					<view class="content">
+						<text class="text-grey margin-left-sm text-df">鍘熸枡鎵瑰彿</text>
+						<text   class="text-black margin-left text-df">{{item.code}}</text>
+					</view>
+					<view class="content">
+						<text class="text-grey margin-left-sm text-df">鐩镐綅</text>
+						<text class="text-black margin-left text-df">{{item.img}}</text>
+					</view>
+					<view class="content">
+						<text class="text-grey margin-left-sm text-df"></text>
+						
+						<text   class="text-black margin-left text-df" style="flex:0.5">
+							<button class="_btn"  @click="weighPrintHandle(item)"  >绉伴噺鎵撳嵃</button>
+						</text>
+					</view>
+
+				</view>
+				
+			</block>
+			</view>
+			<view v-if="maskShow" class="uni-mask" @touchmove.stop.prevent="moveHandle" @click="maskclose">
+				<scroll-view class="uni-scroll_box" scroll-y @touchmove.stop.prevent="moveHandle" @click.stop="moveHandle">
+					<view
+						class="uni-list-box"
+						v-for="(item, index) in list"
+						:key="index"
+						@click="tapQuery(item)"
+					>
+						<view>
+							<view class="uni-list_name">鍚嶇О锛歿{ item.name }}</view>
+							<view class="uni-list_item">UUID:{{ item.address }}</view>
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+			<uni-fab :pattern="pattern" horizontal="right" vertical="bottom" :popMenu="false" @fabClick="searchDevice" :doc="doc">
+			</uni-fab>
+							
+		</view>
+	</view>
+</template>
+<script>
+	const jcapi = uni.requireNativePlugin("JCSDK-JCApiModule");
+	// 浜岀淮鐮佺被鍨�
+	const QrCodeType = {
+		QrCode: 31,
+		PDF417: 32,
+		DataMatrix: 33,
+		AZTEC: 34
+	}
+	
+	// 绾挎潯绫诲瀷
+	const LineType = {
+		Solid: 1, // 瀹炵嚎
+		Dotted: 2, // 铏氱嚎锛堥粯璁よ櫄瀹�1:1鐩搁棿锛�
+	}
+	
+	// 鎹㈣鏂瑰紡
+	const LineModeType = {
+		Justified: 1, // 瀹介珮鍥哄畾锛屽唴瀹硅嚜閫傚簲锛堝瓧鍙�/瀛楅棿璺�/琛岄棿璺濇寜姣斾緥缂╂斁锛�
+		AutoHeight: 2, // 瀹藉害鍥哄畾锛岄珮搴﹁嚜閫傚簲
+		Fixed: 4, // 瀹介珮鍥哄畾锛岃秴鍑洪儴鍒嗚鍓�
+		Adapt: 6, // 瀹介珮鍥哄畾锛屽唴瀹硅秴杩囨椂棰勮瀹介珮鑷姩缂╁皬
+	}
+	
+	export default {
+		onLoad() {
+			let _this = this;
+			// 鍒濆鍖朣DK
+			jcapi.initSDK()
+			// 鐩戝惉椤电爜鍥炶皟
+			jcapi.didReadPrintCountInfo(function(r) {
+				console.log(r)
+			})
+			
+			// 鐩戝惉閿欒鍥炶皟
+			jcapi.didReadPrintErrorInfo(function(r) {
+				console.log(r)
+				if(r.code == 23) {
+					// 鎵撳嵃鏈烘柇寮�杩炴帴
+					_this.connectedDevice = null
+				}
+				uni.showToast({
+					icon: 'none',
+					title: JSON.stringify(r),
+					duration: 2 * 1000
+				})
+			})
+		},
+		onShow() {
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+					
+					} catch (e) {}
+				}
+			});
+		},
+		data() {	
+			
+			return {
+				//鎵撳嵃鏁版嵁
+				listss:[
+					{
+						sn:"2024GY-010070",
+						type:"骞插彉楂樺帇绾垮湀",
+						orderNo:"2024061200010",
+						img:"CS03",
+						typeTwo:"CS03",
+						ptodect:"鍒樺鏍�,鎴村厓娴�,钁h繋璧�",
+						date:"2024-06-10"
+					}
+				],
+				//鎵撳嵃鐩稿叧
+				doc:"钃濈墮",
+				pattern: {
+					color: '#7A7E83',
+					backgroundColor: '#fff',
+					selectedColor: '#007AFF',
+					buttonColor: '#007AFF',
+					iconColor: '#fff'
+				},
+				maskShow: false,
+				list:[],//钃濈墮璁惧鏁版嵁
+				printDensity: 5,
+				labelType: 1,
+				printMode: 2,//printModeData: [{name : '鐑晱', value: 1}, {name: '鐑浆鍗�', value: 2}],
+			}
+		},
+		computed:{
+		},
+		methods: {
+			moveHandle() {},
+			maskclose() {
+				this.maskShow = false;
+			},
+			searchDevice(){
+				let _this = this
+				uni.openBluetoothAdapter({ // 纭钃濈墮鏄惁鎵撳紑
+					success(r) {
+						uni.showLoading({
+							title: "鎼滅储涓�..."
+						})
+						// 鏈巿浜堣摑鐗欑浉鍏虫潈闄愬拰鏈墦寮�鎵嬫満瀹氫綅浼氭悳绱笉鍒拌澶�
+						jcapi.getBluetoothDevices(function(r){
+							console.log("device:" + JSON.stringify(r))
+							// 鎼滅储鍒拌澶囧洖璋�
+							uni.hideLoading()
+							_this.list = r;
+							_this.maskShow = true	
+						})
+					},
+					fail(e) {
+						uni.showModal({
+							confirmText: "鎵撳紑钃濈墮澶辫触"
+						})
+						console.log("寮�鍚摑鐗欒澶囧け璐�" + e)
+					}
+				})
+			},
+			tapQuery(item) {
+				this.maskShow = false
+				// 杩炴帴鎵撳嵃鏈�
+				let _this = this;
+				jcapi.openPrinterByDevice({
+					address: item.address,
+					name: item.name,
+					deviceType: item.deviceType // 璁惧绫诲瀷锛�0-钃濈墮锛�1-缃戠粶
+				}, function(r) {
+					uni.showToast({
+						title: (r.code == 0) ? "杩炴帴鎴愬姛" : "杩炴帴澶辫触",
+						duration: 2 * 1000
+					})
+					if(r.code == 0) {
+						_this.connectedDevice = item
+					}
+				})
+			},
+			weighPrintHandle(item)
+			{
+				this.printQrCode()
+			},
+			//鎵撳嵃浜岀淮鐮�
+			printQrCode() {
+				// 鍒濆鍖栫敾鏉�
+				jcapi.initDrawingBoard({
+					width: 50,
+					height: 100,
+					rotate: 0
+				});
+				// // 缁樺埗浜岀淮鐮�
+				var jsonString = JSON.stringify(this.listss[0]);
+				jcapi.drawLabelQrCode({
+					x: 17,
+					y: 74,
+					width: 20,
+					height: 20,
+					value: jsonString,
+					rotate: 0,
+					codeType: QrCodeType.QrCode,
+				});
+				//缁樺埗妯嚎
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 1,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎1
+				});
+				
+				jcapi.drawLabelLine({
+					x:4,
+					y: 11,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎2
+				});
+				
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 21,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎3
+				});
+				
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 31,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎4
+				});
+				
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 41,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎5
+				});
+				
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 51,
+					width: 46,
+					height:0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎6
+				});
+				
+				jcapi.drawLabelLine({
+					x:4,
+					y: 61,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎7
+				});
+				
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 71,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎8
+				});
+				
+				jcapi.drawLabelLine({
+					x: 4,
+					y: 98,
+					width: 46,
+					height: 0.5,
+					rotate: 0,
+					lineType: LineType.Solid // 瀹炵嚎9
+				});
+				
+					//缁樺埗绔栫嚎
+					jcapi.drawLabelLine({
+						x: 4,
+						y: 1,
+						width: 0.5,
+						height: 97,
+						rotate: 0,
+						lineType: LineType.Solid // 瀹炵嚎
+					});
+					
+					
+					jcapi.drawLabelLine({
+						x: 20,
+						y: 1,
+						width: 0.5,
+						height: 70,
+						rotate: 0,
+						lineType: LineType.Solid // 瀹炵嚎9
+					});
+					
+					
+					jcapi.drawLabelLine({
+						x: 48.5,
+						y: 1,
+						width: 0.5,
+						height: 97,
+						rotate: 0,
+						lineType: LineType.Solid // 瀹炵嚎9
+					});
+					
+				// 	//缁樺埗鏂囧瓧
+					jcapi.drawLabelText({
+						x:1,
+						y:4,
+						width:20,
+						height: 12,
+						value: "缂� 鍙�:",
+						fontSize: 3.6,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 1,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:5,
+						y:14,
+						width:12,
+						height: 20,
+						value: "绫� 鍨�:",
+						fontSize:3.6,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 1,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:5,
+						y:24,
+						width:12,
+						height: 22,
+						value: "宸ュ崟鍙�:",
+						fontSize: 3.6,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 1,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:5,
+						y:34,
+						width:12,
+						height: 20,
+						value: "鍥� 鍙�:",
+						fontSize: 3.6,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 1,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:5,
+						y:44,
+						width:24,
+						height: 20,
+						value: "瑙勬牸鍨嬪彿:",
+						fontSize: 3.4,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:5,
+						y:54,
+						width:12,
+						height: 22,
+						value: "鐢熶骇浜�:",
+						fontSize: 3.6,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 1,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:5,
+						y:64,
+						width:24,
+						height: 20,
+						value: "鐢熶骇鏃ユ湡:",
+						fontSize: 3.4,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 1,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:4,
+						width:40,
+						height: 12,
+						value: this.listss[0].sn,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:14,
+						width:40,
+						height: 12,
+						value: this.listss[0].type,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:24,
+						width:40,
+						height: 12,
+						value: this.listss[0].orderNo,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:34,
+						width:40,
+						height: 12,
+						value: this.listss[0].img,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:44,
+						width:40,
+						height: 12,
+						value: this.listss[0].typeTwo,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:53,
+						width:28,
+						height: 12,
+						value: this.listss[0].ptodect,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+					
+					jcapi.drawLabelText({
+						x:22,
+						y:64,
+						width:40,
+						height: 12,
+						value: this.listss[0].date,
+						fontSize: 3,
+						rotate: 0,
+						lineMode: LineModeType.AutoHeight,
+						lineSpace: 0,
+						letterSpace: 0,
+						textAlignHorizontal: 0,
+						textAlignVertical: 0,
+					})
+				
+				
+				// 鐢熸垚鎵撳嵃鏁版嵁
+				let imageJsonObj = jcapi.generateLabelJson()
+				// 璁剧疆鎵撳嵃浠诲姟
+				jcapi.startJob({
+					totalCount: 1,
+					density: this.printDensity,
+					labelType: this.labelType,
+					printMode: this.printMode,
+				},function(r){
+					if(r.code == 0) {
+						// 鎵撳嵃鏁版嵁
+						jcapi.printData(imageJsonObj, {
+							"printQuantity": 1,
+						}, function(r) {
+							if (r.code == 0) {
+								console.log("鎵撳嵃鎴愬姛")
+							} else {
+								console.log("鎵撳嵃澶辫触")
+							}
+						})
+					} else {
+						console.log("璁剧疆鎵撳嵃浠诲姟澶辫触")
+					}
+				})
+			}, 
+		}
+	}
+</script>
+
+<style scoped>
+	
+	
+	>>>.cu-custom .cu-bar
+	{
+		background: #3281FF !important;
+		height: 44px;
+		height: calc(44px + constant(safe-area-inset-top));
+		height: calc(44px + env(safe-area-inset-top));
+		padding: 7px 3px;
+		padding-top: calc(7px + constant(safe-area-inset-top));
+		padding-top: calc(7px + env(safe-area-inset-top));
+	}
+	
+	.content
+	{	display: flex;
+		flex-direction: row;
+		padding: 0 10rpx;}
+			
+	.content .text-grey
+	{
+		flex:0.8
+	}
+
+	.content .text-black
+	{
+		flex:2;
+		text-align: right;
+	}
+
+	.filter-content {
+		overflow-y: auto;
+		/* #ifdef H5 */
+		height: calc(100vh - 95px);
+		/* #endif */
+		/* #ifdef MP-WEIXIN */
+		height: calc(100vh - 125px);
+		/* #endif */
+		/* #ifdef APP-VUE */
+		height: calc(100vh - 145px);
+		/* #endif */
+		/* #ifdef APP-PLUS */
+		height: calc(100vh - 55px);
+		/* #endif */
+	}
+
+	uni-checkbox::before {
+		content: ''
+	}
+
+	.list>.cu-item .info {
+		border-top: 1px solid #f7f7f7;
+		padding-top: 10px;
+		margin-left: 10px;
+		margin-right: 5px;
+		padding-bottom: 10px;
+	}
+
+	.list>.cu-item .title {
+		margin-top: 15px;
+		margin-left: 10px;
+		margin-right: 10px;
+		margin-bottom: 10px;
+	}
+
+	.cu-card>.du-item {
+		display: block;
+		background-color: #FFFFFF;
+		overflow: hidden;
+		border-radius: 10upx;
+		margin: 20upx 24upx;
+	}
+
+	.cu-card>.du-item:first-child{margin-top: 10px;}
+	
+/* 	.main
+	{
+		color:#000;
+		padding:0 2%;
+	} */
+	
+	.bottom-btn
+	{
+		overflow:hidden;
+		margin:20px 0;
+		padding:0 2%;
+	}
+	
+	._btn
+	{
+		background:#3A80F4;
+		color:#FFF;
+		margin-bottom:20px;
+	}
+	
+	.uni-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		bottom: 0;
+		display: flex;
+		align-items: center;
+		width: 100%;
+		background: rgba(0, 0, 0, 0.6);
+		padding: 0 30rpx;
+		box-sizing: border-box;
+	}
+	
+	
+	.uni-scroll_box {
+		height: 70%;
+		background: #fff;
+		border-radius: 20rpx;
+	}
+	.uni-list-box {
+		margin: 0 20rpx;
+		padding: 15rpx 0;
+		border-bottom: 1px #f5f5f5 solid;
+		box-sizing: border-box;
+	}
+	.uni-list:last-child {
+		border: none;
+	}
+	.uni-list_name {
+		font-size: 30rpx;
+		color: #333;
+	}
+	.uni-list_item {
+		font-size: 24rpx;
+		color: #555;
+		line-height: 1.5;
+	}
+</style>
diff --git a/pages/product/outputRegister/addProductOut.vue b/pages/product/outputRegister/addProductOut.vue
new file mode 100644
index 0000000..dd7401f
--- /dev/null
+++ b/pages/product/outputRegister/addProductOut.vue
@@ -0,0 +1,506 @@
+<template>
+	<view class="wrap">
+		<view class="row-list" v-if="info.type!='shift'">
+			<u-row justify="space-between" class="product-out-main-row">
+				<u-col span="4">
+					<span class="span-lable">浜哄憳</span>
+				</u-col>
+				<u-col span="8">
+					<view class="product-out-main-info">
+						<view>
+							<u-button size="mini" @click="toDutyPerson">鐐瑰嚮閫夋嫨</u-button>
+						</view>
+					</view>
+				</u-col>
+			</u-row>
+		</view>
+		<view class="row-list">
+			<u-form class="product-out-form" :model="productOutForm" ref="productOutForm" label-width="180"
+				:label-style="{paddingLeft:'10rpx'}">
+				<u-form-item label="闆朵欢缂栧彿">
+					<u-input v-model="productOutForm.partNo" disabled placeholder="" />
+				</u-form-item>
+				<u-form-item label="闆朵欢鍚嶇О">
+					<u-input v-model="productOutForm.partName" disabled placeholder="" />
+				</u-form-item>
+				<u-form-item label="鐩樻暟">
+					<input v-model="productOutForm.disNumber" placeholder="璇疯緭鍏ョ洏鏁�" type="digit" />
+				</u-form-item>
+				<u-form-item label="璧峰绫虫爣">
+					<input v-model="productOutForm.startMeterMark" placeholder="璇疯緭鍏ヨ捣濮嬬背鏍�" @blur="startMeterBlur"
+						type="digit" />
+				</u-form-item>
+				<u-form-item label="鎴绫虫爣">
+					<input v-model="productOutForm.endMeterMark" placeholder="璇疯緭鍏ユ埅姝㈢背鏍�" @blur="endMeterBlur"
+						type="digit" />
+				</u-form-item>
+				<u-form-item label="姣忕洏浜ч噺">
+					<u-input v-model="productOutForm.productQty" placeholder="璇疯緭鍏ユ瘡鐩樹骇閲�" disabled type="digit" />
+				</u-form-item>
+				<u-form-item label="鎶ュ簾鏁伴噺">
+					<input   v-model="productOutForm.scrapQty" placeholder="璇疯緭鍏ユ姤搴熸暟閲�" type="digit" />
+				</u-form-item>
+				<u-form-item label="杞藉叿缂栧彿">
+					<input v-model="productOutForm.reelNumber" placeholder="璇疯緭鍏ヨ浇鍏风紪鍙�" />
+				</u-form-item>
+				<u-form-item label="鍗曚綅">
+					<u-input v-model="productOutForm.unit" disabled placeholder="" />
+				</u-form-item>
+				<u-form-item label="鍒嗘鎻忚堪">
+					<input v-model="productOutForm.segmentDesc" />
+				</u-form-item>
+				<u-form-item label="鐢熶骇浜哄憳">{{productOutForm.staffName}}</u-form-item>
+				<u-form-item label="浜у嚭鏃ユ湡">
+					<u-input v-model="productOutForm.date" disabled />
+				</u-form-item>
+			</u-form>
+		</view>
+		<view class="product-out-bottom-view" style="margin-top: 15px;">
+			<u-button text="纭畾" type="success" size="medium"  @click="addProudctOut">
+				纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+
+		data() {
+
+			const currentDateTime = this.getDateTime();
+			return {
+				productOutForm: {
+					partNo: null,
+					partName: null,
+					intro: null,
+					date: currentDateTime,
+					staffName:""
+				},
+				info: {},
+				personInitList: [],
+				personBoardList: [],
+				products: []
+
+			};
+		},
+		onLoad(option) {
+			//type:shift  鎸夌彮缁�  person 鎸変汉鍛� 
+			this.info.type = option.type
+			this.info.dutyId = option.dutyId
+			this.info.workstationId = option.workstationId
+
+
+			this.productOutForm.workstationId = option.workstationId
+			this.productOutForm.operationTaskId = option.operationTaskId
+			this.productOutForm.partId = option.partId
+			this.productOutForm.partName = option.partName == "null" ? "" : option.partName
+			this.productOutForm.partNo = option.partNo == "null" ? "" : option.partNo
+			this.productOutForm.unit = option.unit == "null" ? "" : option.unit
+			//鑾峰彇褰撶彮浜哄憳
+			this.getPerson()
+		},
+		onShow() {
+
+
+		},
+		methods: {
+			getDateTime() {
+				let year = new Date().getFullYear(); //骞�
+				let month = new Date().getMonth() + 1; //娉ㄦ剰锛佹湀浠芥槸浠�0鏈堝紑濮嬭幏鍙栫殑锛屾墍浠ヨ+1;
+				let day = new Date().getDate(); //鏃�
+				let hour = new Date().getHours(); //鏃�
+				let minute = new Date().getMinutes(); //鍒�
+				let second = new Date().getSeconds(); //绉�
+				//鎷兼帴鏃ユ湡 YYYY/MM/DD HH:mm
+				let currentDate =
+					year +
+					'/' +
+					(month >= 10 ? month : '0' + month) +
+					'/' +
+					(day >= 10 ? day : '0' + day);
+				let currentTime =
+					(hour >= 10 ? hour : '0' + hour) +
+					':' +
+					(minute >= 10 ? minute : '0' + minute) +
+					':' +
+					(second >= 10 ? second : '0' + second);
+
+				return currentDate + " " + currentTime
+			},
+			async getPerson() {
+				let queryParam = {
+					id: this.info.workstationId
+				}
+
+				let res = await this.$u.api.outputRegister.getDutyRecordByWorkstationId(queryParam)
+
+				this.dutyForm = res.data
+				if (this.dutyForm && this.dutyForm.id) {
+
+					let queryUserParam = {
+						id: this.dutyForm.id
+					}
+					
+					let resUser = await this.$u.api.outputRegister.getPersonByDutyRecordId(queryUserParam)
+
+					let userList = resUser.data
+					if (userList.length > 0) {
+						this.personInitList = []
+						this.$set(this.productOutForm, 'staffName', "");
+						let staffName = ""
+						userList.map((item, index) => {
+
+							if (index == userList.length - 1) {
+								staffName = staffName + item.staffName
+							} else {
+								staffName = staffName + item.staffName + ","
+							}
+
+							let data = {
+								staffId: item.staffId,
+								staffName: item.staffName,
+								staffNo: item.staffNo,
+								checked: false
+							}
+
+							this.personInitList.push(data)
+						});
+
+						//type:shift  鎸夌彮缁�  person 鎸変汉鍛�
+						if (this.info.type == "shift") {
+							this.personBoardList = this.personInitList
+							this.$set(this.productOutForm, 'staffName', staffName);
+						} else {
+							this.personBoardList = []
+							this.$set(this.productOutForm, 'staffName', "");
+						}
+
+					}
+				}
+
+			},
+			setProducts() {
+				let productStaffs = []
+				let productStaffIds = []
+				let newProduct = {}
+				this.products = []
+				//type:shift  鎸夌彮缁�  person 鎸変汉鍛�
+				if (this.info.type == "shift") {
+					// 鎸夌彮缁勬姤宸ワ紝涓�鏉¤褰�
+					let staffName = ''
+					let staffNo = ''
+					for (let i = 0; i < this.personBoardList.length; i++) {
+						staffName += this.personBoardList[i].staffName + ','
+						staffNo += this.personBoardList[i].staffNo + ','
+						productStaffs.push(this.personBoardList[i].staffNo)
+						productStaffIds.push(this.personBoardList[i].staffId)
+					}
+
+					staffName = staffName.substring(0, staffName.length - 1)
+					staffNo = staffNo.substring(0, staffNo.length - 1)
+
+					newProduct = {}
+					newProduct.staffName = staffName
+					newProduct.staffNo = staffNo
+					newProduct.productNo = null
+					newProduct.partId = this.productOutForm.partId
+					newProduct.partNo = this.productOutForm.partNo
+					newProduct.partName = this.productOutForm.partName
+					newProduct.outBatchNo = null
+					newProduct.disNumber = this.productOutForm.disNumber
+					newProduct.productQty = 0
+					newProduct.sproductQty = 0
+					newProduct.ifsBatchNo = null
+					newProduct.unit = this.productOutForm.unit
+					newProduct.productStaffs = productStaffs
+					newProduct.productStaffIds = productStaffIds
+					newProduct.status = false
+					newProduct.systemNo = null
+					newProduct.date = this.productOutForm.date
+					newProduct.dutyRecordId = this.info.dutyId
+					newProduct.startMeterMark = this.productOutForm.startMeterMark
+					newProduct.endMeterMark = this.productOutForm.endMeterMark
+					newProduct.scrapQty = this.productOutForm.scrapQty
+					newProduct.segmentDesc = this.productOutForm.segmentDesc
+					newProduct.remark = null
+					newProduct.outBatchNo = null
+					newProduct.reelNumber = this.productOutForm.reelNumber
+					this.products.push(newProduct)
+
+				} else {
+					let newProduct
+					for (let i = 0; i < this.personBoardList.length; i++) {
+						newProduct = {}
+						productStaffs = []
+						productStaffIds = []
+						productStaffIds.push(this.personBoardList[i].staffId)
+						productStaffs.push(this.personBoardList[i].staffNo)
+						newProduct.staffName = this.personBoardList[i].staffName
+						newProduct.staffNo = this.personBoardList[i].staffNo
+						newProduct.productNo = null
+						newProduct.partId = this.productOutForm.partId
+						newProduct.partNo = this.productOutForm.partNo
+						newProduct.partName = this.productOutForm.partName
+						newProduct.outBatchNo = null
+						newProduct.disNumber = this.productOutForm.disNumber
+						newProduct.productQty = 0
+						newProduct.sproductQty = 0
+						newProduct.unit = this.productOutForm.unit
+						newProduct.productStaffs = productStaffs
+						newProduct.productStaffIds = productStaffIds
+						newProduct.status = true
+						newProduct.systemNo = null
+						newProduct.date = this.productOutForm.date
+						newProduct.dutyRecordId = this.info.dutyId
+						newProduct.startMeterMark = this.productOutForm.startMeterMark
+				 	newProduct.endMeterMark = this.productOutForm.endMeterMark
+						newProduct.reelNumber = this.productOutForm.reelNumber
+						newProduct.ifsBatchNo = null
+						newProduct.scrapQty = this.productOutForm.scrapQty
+						newProduct.segmentDesc = this.productOutForm.segmentDesc
+						newProduct.remark = null
+						this.products.push(newProduct)
+					}
+				}
+
+			},
+			toDutyPerson() {
+
+				if (this.personInitList.length > 0) {
+					uni.navigateTo({
+						url: '/pages/product/outputRegister/dutyPersonList?item=' + encodeURIComponent(JSON
+							.stringify(this.personInitList))
+					})
+				}
+			},
+			setProductPerson(userList) {
+				//type:shift  鎸夌彮缁�  person 鎸変汉鍛�
+				if (this.info.type == "person") {
+					//杩囨护鎺夐�変腑鐨勪汉鍛樹俊鎭�
+					userList = userList.filter(item => item.checked == true)
+					this.personBoardList = []
+					this.$set(this.productOutForm, 'staffName', "");
+					// this.personBoardList = userList
+					if (userList.length > 0) {
+						let staffName = ""
+						userList.map((item, index) => {
+
+							if (index == userList.length - 1) {
+								staffName = staffName + item.staffName
+							} else {
+								staffName = staffName + item.staffName + ","
+							}
+
+							let data = {
+								staffId: item.staffId,
+								staffName: item.staffName,
+								staffNo: item.staffNo,
+								checked: item.checked
+							}
+
+							this.personBoardList.push(data)
+						});
+						this.$set(this.productOutForm, 'staffName', staffName);
+					}
+				}
+			},
+			startMeterBlur(obj) {
+				if ((this.productOutForm.startMeterMark != "" ) && (this.productOutForm.endMeterMark!= "")) {
+					let qty = parseFloat(this.productOutForm.endMeterMark) - parseFloat(this.productOutForm.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(this.productOutForm, 'productQty', qty);
+				}	
+			},
+			endMeterBlur(obj) {
+				
+				if ((this.productOutForm.startMeterMark != "" ) && (this.productOutForm.endMeterMark!= "")) {
+					let qty = parseFloat(this.productOutForm.endMeterMark) - parseFloat(this.productOutForm.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(this.productOutForm, 'productQty', qty);
+				}
+			},
+			async addProudctOut() {
+								
+				// 鐢熶骇浜哄憳
+				if (this.productOutForm.staffName==""||this.productOutForm.staffName==undefined||this.productOutForm.staffName==null) {
+				
+					this.$u.toast('鐢熶骇浜哄憳涓嶈兘涓虹┖')
+					return
+				}
+                
+				//璁剧疆宸ュ崟淇℃伅
+				this.setProducts();
+
+				for (let i = 0; i < this.products.length; i++) {
+
+					// 鐩樻暟鏍¢獙
+					if (!this.isPositiveIntegerNumber(this.products[i].disNumber)) {
+
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愮洏鏁般�戣杈撳叆姝f暣鏁帮紒')
+						return
+					}
+					// 璧峰绫虫爣鏍¢獙
+					if (!this.isNumber(this.products[i].startMeterMark)) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愯捣濮嬬背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+						return
+					}
+					// 鎴绫虫爣鏍¢獙
+					if (!this.isNumber(this.products[i].endMeterMark)) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+						return
+					}
+					// 鎴绫虫爣闇�澶т簬寮�濮嬬背鏍�
+					if (
+						Number(this.products[i].endMeterMark) <
+						Number(this.products[i].startMeterMark)
+					) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戦渶澶т簬銆愯捣濮嬬背鏍囥��')
+						return
+					}
+				}
+
+				// 褰撳墠鏄骇鍑虹殑鏂板
+				const list = []
+				for (let i = 0; i < this.products.length; i++) {
+					let productVo = {}
+					productVo.isChangeShift = false
+					productVo.id = null
+					productVo.workstationId = this.productOutForm.workstationId
+					productVo.operationTaskId = this.productOutForm.operationTaskId
+					productVo.discsNumber = this.products[i].disNumber
+					let productOuts = []
+					let productOut = {}
+					productOut.workstationId = this.productOutForm.workstationId
+					productOut.operationTaskId = this.productOutForm.operationTaskId
+					productOut.partId = this.products[i].partId
+					productOut.disNumber = this.products[i].disNumber
+					productOut.productQty = this.products[i].productQty
+					productOut.sproductQty = this.products[i].sproductQty
+					productOut.productStaffs = this.products[i].productStaffs
+					productOut.productStaffIds = this.products[i].productStaffIds
+					productOut.outBatchNo = this.products[i].outBatchNo
+					productOut.status = this.products[i].status
+					productOut.dutyRecordId = this.products[i].dutyRecordId
+					productOut.startMeterMark = this.products[i].startMeterMark
+					productOut.endMeterMark = this.products[i].endMeterMark
+
+					productOut.outBatchNo = this.products[i].outBatchNo
+					productOut.reelNumber = this.products[i].reelNumber
+					productOut.ifsBatchNo = this.products[i].ifsBatchNo
+					productOut.scrapQty = this.products[i].scrapQty
+					productOut.segmentDesc = this.products[i].segmentDesc
+					productOut.remark = this.products[i].remark
+
+					productOuts.push(productOut)
+					productVo.productOutputList = productOuts
+					list.push(productVo)
+				}				
+
+				let res = await this.$u.api.outputRegister.batchSaveProductMain(list)
+				let that = this
+			
+				if (res.code == 0) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '鎻愪氦鎴愬姛',
+						showCancel: false,
+						success: function() {
+							that.refreshLastPage()
+						}
+					})
+
+				} else {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '鎻愪氦澶辫触',
+						showCancel: false,
+						success: function() {}
+					})
+				}
+			},
+			isNumber(value) {
+				var reg = /^[0-9]+(.[0-9]{1,4})?$/
+				if (
+					value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+			 } else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+					}
+				}
+			},
+			isPositiveIntegerNumber(value) {
+				var reg = /^[1-9]\d*$/
+				if (
+					value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+				} else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+					}
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.refreshTrackingRecord()
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.product-out-main-info {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.product-out-main-row {
+		padding-bottom: 2px;
+		padding-top: 2px;
+	}
+
+	.product-out-form {
+		.u-form-item {
+			padding: 7rpx;
+		}
+	}
+
+	.product-out-bottom-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 1062rpx);
+	}
+</style>
+
+
+<style scoped>
+	
+	.uni-input-placeholder{font-size: 12px;color: rgb(192, 196, 204);}
+	
+	>>>.uni-input-input{font-size: 12px;}
+</style>
diff --git a/pages/product/outputRegister/dutyPersonList.vue b/pages/product/outputRegister/dutyPersonList.vue
new file mode 100644
index 0000000..9fa1487
--- /dev/null
+++ b/pages/product/outputRegister/dutyPersonList.vue
@@ -0,0 +1,133 @@
+<template>
+	<view class="wrap">
+		<view>
+			<scroll-view class="scroll-list duty-person-scroll" scroll-y="true">
+				<u-cell-group class="list" :border="false">
+					<view>
+						<view class="row-list person-row" v-for="(item, index) in personList" :key="item.staffId"  >
+							<view style="width: 100%;padding-left: 20rpx;">
+							<u-row justify="space-between">
+								<u-col span="1">
+									<u-checkbox 
+													v-model="item.checked" 
+													:name="item.staffName"
+												></u-checkbox>
+								</u-col>
+								<u-col span="11">
+									<view @click="clickPerson(item)">
+										<span>{{item.staffName}}</span>
+									</view>
+								</u-col>
+							</u-row>
+							</view>
+						</view>
+					</view>
+				</u-cell-group>
+			</scroll-view>
+		</view>
+		<view class="person-btn-view">
+			<u-button text="纭畾" type="success" size="medium" :customStyle="{width:'150rpx'}" @click="confirmPerson">
+				纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				personList:[{staffId:1,staffName:'灏忔槑',checked:false},
+				{staffId:2,staffName:'灏忚揪',checked:false},
+				{staffId:3,staffName:'灏忕',checked:false},
+				{staffId:4,staffName:'灏忓畫',checked:false},
+				{staffId:5,staffName:'灏忓畫',checked:false},
+				{staffId:6,staffName:'灏忓畫',checked:false},
+				{staffId:7,staffName:'灏忓畫',checked:false},
+				{staffId:8,staffName:'灏忓畫',checked:false},
+				{staffId:9,staffName:'灏忓畫',checked:false},
+				{staffId:10,staffName:'灏忓畫',checked:false},
+				{staffId:11,staffName:'灏忓畫',checked:false},
+				{staffId:12,staffName:'灏忓畫',checked:false},
+				{staffId:13,staffName:'灏忓畫',checked:false},
+				{staffId:14,staffName:'灏忓畫',checked:false},
+				{staffId:15,staffName:'灏忓畫',checked:false},
+				{staffId:16,staffName:'灏忓畫',checked:false},
+				{staffId:17,staffName:'灏忓畫',checked:false},
+				{staffId:18,staffName:'灏忚揪',checked:false}],
+				originList: []
+			};
+		},
+		onLoad(option) {
+			if (option.item) {
+						let obj = JSON.parse(decodeURIComponent(option.item));
+						console.log(obj)
+						this.personList = obj
+						// this.getInfo(obj.id)
+					}
+		},
+		onShow() {
+
+		},
+		methods: {
+			loadList() {
+
+				// uni.showLoading({
+				// 			title: '姝e湪璇锋眰...',
+				// 			mask: true
+				// 		});	
+
+				// 鏌ヨ宸ュ崟鍒楄〃
+				/*this.$u.api.pigxWareHouse.fetchList().then(res => {
+
+					// uni.hideLoading();
+					this.originList = res.data
+					this.optaskList = this.originList
+				})*/
+			},
+			//纭閫変腑
+			confirmPerson(){
+				//绛涢�夊嚭 personList涓璫hecked==true鐨勪汉
+				this.refreshLastPage()
+			},
+			clickPerson(person){
+				person.checked=!person.checked
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setProductPerson(this.personList)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.duty-person-scroll{
+		background-color: #f8f8f8;
+	}
+	.duty-person-scroll{
+		::v-deep .u-cell-item-box{
+			background-color: #f8f8f8;
+		}
+	}
+	.person-row{
+		height: 70rpx;
+		display: flex;
+		align-items: center;
+	}
+	.person-btn-view{
+		display: flex;
+		justify-content: space-between;
+		margin-top: 20rpx;
+	}
+</style>
diff --git a/pages/product/outputRegister/editProductOut.vue b/pages/product/outputRegister/editProductOut.vue
new file mode 100644
index 0000000..28061c0
--- /dev/null
+++ b/pages/product/outputRegister/editProductOut.vue
@@ -0,0 +1,270 @@
+<template>
+	<view class="wrap">
+		<view>
+			<scroll-view class="scroll-list edit-product-out-scroll" scroll-y="true">
+				<u-cell-group class="list" :border="false">
+					<u-card :title="item.username" :sub-title="item.phone" v-for="(item, index) in editProductOutList"
+						:key="item.id" :index="item.id" :showHead="showEditCardHead">
+						<view slot="body">
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">SN鍙�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<span>{{item.outBatchNo}}</span>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">IFS鎵规鍙�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.ifsBatchNo" type="text"
+												:clearable=false height="50"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">璧峰绫虫爣</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.startMeterMark" type="digit"
+												:clearable=false height="50" @blur="startMeterBlur(item)"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鎴绫虫爣</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.endMeterMark" 
+												:clearable=false height="50" type="digit" @blur="endMeterBlur(item)"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鐢熶骇鏁伴噺</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<span>{{item.productQty}}</span>											
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鎶ュ簾鏁伴噺</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.scrapQty" 
+												:clearable=false height="50" type="digit"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鍒嗘鎻忚堪</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.segmentDesc" type="text"
+												:clearable=false height="50"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+						</view>
+					</u-card>
+				</u-cell-group>
+			</scroll-view>
+		</view>
+		<view class="edit-product-out-btn-view">
+			<u-button text="纭畾" type="success" size="medium" :customStyle="{width:'150rpx'}" @click="updateProductOut">
+				纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				editProductOutList:[],
+				showEditCardHead: false
+			};
+		},
+		onLoad(params) {			
+			if (params.item) {
+				let list = JSON.parse(decodeURIComponent(params.item));
+				this.editProductOutList =list
+				}
+		},
+		onShow() {
+
+		},
+		methods: {
+			startMeterBlur(item)
+			{
+				if(item.endMeterMark!="")
+				{
+					let qty= parseFloat(item.endMeterMark) - parseFloat(item.startMeterMark)	
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(item, 'productQty', qty);
+				}				
+			},
+			endMeterBlur(item )
+			{
+				if(item.startMeterMark!="")
+				{
+					let qty= parseFloat(item.endMeterMark) - parseFloat(item.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(item, 'productQty', qty);
+				}
+			},
+			async updateProductOut() {
+				
+				for (let i = 0; i < this.editProductOutList.length; i++) {
+				        
+				         // 璧峰绫虫爣鏍¢獙
+				         if (!this.isNumber(this.editProductOutList[i].startMeterMark)) {				             
+											  this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愯捣濮嬬背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+											  return
+				         }
+				         // 鎴绫虫爣鏍¢獙
+				         if (!this.isNumber(this.editProductOutList[i].endMeterMark)) {
+											  this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+											  return
+				         }
+				         // 鎴绫虫爣闇�澶т簬寮�濮嬬背鏍�
+				         if (
+				           Number(this.editProductOutList[i].endMeterMark) <
+				           Number(this.editProductOutList[i].startMeterMark)
+				         ) {
+								  this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戦渶澶т簬銆愯捣濮嬬背鏍囥��')
+								  return
+				         }
+				}
+				
+				let data=[]
+			   this.editProductOutList.forEach((el) => {
+					  let productVo = {}
+					  productVo.id = el.id
+					  let productOuts = []
+					  let productOut = {}
+					  productOut.startMeterMark = parseFloat(el.startMeterMark)
+					  productOut.endMeterMark = parseFloat(el.endMeterMark)
+					  productOut.productQty = el.productQty
+					  productOut.segmentDesc = el.segmentDesc
+					  productOut.scrapQty = el.scrapQty
+					  productOut.ifsBatchNo = el.ifsBatchNo
+					  productOut.reelNumber = el.reelNumber
+					  productOut.remark = el.remark
+					  productOuts.push(productOut)
+					  productVo.productOutputList = productOuts
+					  data.push(productVo)
+				  })				 
+				   
+				  let res=  await this.$u.api.outputRegister.batchUpdateProductMain(data)
+				  let that = this				
+				  if(res.code==0)
+				  {
+					   uni.showModal({
+						title: '鎻愮ず',
+						content: '缂栬緫鎴愬姛',
+						showCancel: false,
+						success: function() {	
+							that.refreshLastPage()	
+							// setTimeout(()=> {								
+							// 	that.refreshLastPage()	
+							// 	}, 5500);							 				  
+							}
+					   })
+									 
+				  }else
+				  {
+					   uni.showModal({
+						title: '鎻愮ず',
+						content: '缂栬緫澶辫触',
+						showCancel: false,
+						success: function() {
+						}
+					   })
+				  }
+			},
+			isNumber(value) {
+			      var reg = /^[0-9]+(.[0-9]{1,4})?$/
+			      if (
+			        value == undefined ||
+			        value == null ||
+			        value === '' ||
+			        value.trim === ''
+			      ) {
+			        return false
+			      } else {
+			        if (!reg.test(value)) {
+			          return false
+			        } else {
+			          return true
+			        }
+			      }
+			    },
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.refreshTrackingRecord()
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.edit-product-out-scroll{
+		background-color: #f8f8f8;
+	}
+	.edit-product-out-scroll{
+		::v-deep .u-cell-item-box{
+			background-color: #f8f8f8;
+		}
+	}
+	.edit-product-out-btn-view{
+		display: flex;
+		justify-content: space-between;
+		margin-top: 20rpx;
+	}
+	.custom-edit-input{
+		border-bottom: 2rpx solid #F8F8F8;
+	}
+	
+</style>
diff --git a/pages/product/outputRegister/index.vue b/pages/product/outputRegister/index.vue
new file mode 100644
index 0000000..5abd4a2
--- /dev/null
+++ b/pages/product/outputRegister/index.vue
@@ -0,0 +1,816 @@
+<template>
+	<view class="wrap">
+		<view class="row-list">
+			<u-row justify="space-between" class="outputregister-main-row">
+				<u-col span="4">
+					<span class="span-lable">宸ヤ綔绔�</span>
+				</u-col>
+				<u-col span="8">
+					<view class="outputregister-main-info">
+						<view>
+							<span>{{outputregisterMainInfo.workstationName}}</span>
+						</view>
+						<view>
+							<u-button size="mini" @click="toWorkstation">鐐瑰嚮閫夋嫨</u-button>
+						</view>
+					</view>
+				</u-col>
+			</u-row>
+			<u-row justify="space-between" class="outputregister-main-row last-main-row">
+				<u-col span="4">
+					<span class="span-lable">宸ュ崟鍙�</span>
+				</u-col>
+				<u-col span="8">
+					<view class="outputregister-main-info">
+						<view>
+							<span>{{outputregisterMainInfo.optaskNo}}</span>
+						</view>
+						<view>
+							<u-button size="mini" @click="toOptask">鐐瑰嚮閫夋嫨</u-button>
+						</view>
+					</view>
+				</u-col>
+			</u-row>
+			<u-row justify="space-between" class="outputregister-main-row outputregister-main-operate-view">
+				<u-col span="6">
+					<u-radio-group v-model="reportStyle">
+						<u-radio v-for="(item, index) in reportStyleList" :key="index" :name="item.value">
+							{{item.name}}
+						</u-radio>
+					</u-radio-group>
+				</u-col>
+				<u-col span="6">
+					<view class="outputregister-main-out-view">
+						<view>
+							<u-button type="warning" size="mini" @click="openShiftProductOut">浜ょ彮浜у嚭</u-button>
+						</view>
+						<view style="margin-left: 20rpx;">
+							<u-button type="success" size="mini" @click="openProductOut">鏂板浜у嚭</u-button>
+						</view>
+					</view>
+				</u-col>
+			</u-row>
+		</view>
+		<scroll-view class="scroll-list tracking-scan-record" scroll-y="true">
+			<u-cell-group class="list tracking-scan-record-cell" :border="false">
+						<view class="item u-border-bottom tracking-scan-record-view" v-for="(item, index) in trackingList" :key="item.id" @click="trackingCardClick(item)"
+					:style="{backgroundColor: item.selected?backgroundColor.selectedColor:backgroundColor.unSelectedColor}">
+					
+					  
+							<view class="tracking-record-operate-btn-view">
+								<view style="text-align: right;">
+									<u-button type="success" text="鎶曞叆" size="mini"
+										@click.stop="toProductIn(item)">鎶曞叆
+									</u-button>
+								</view>
+								<view style="text-align: right;margin-left: 16rpx;">
+									<u-button v-show="item.state == '01draft' && item.shiftState == '01draft'"
+										type="warning" text="浜ょ彮" size="mini"
+										@click.stop="translate(item,'DRAFTTOCHANGESHIFT','浜ょ彮')">浜ょ彮</u-button>
+									<u-button v-show="item.state == '01draft' && item.shiftState == '03changeshift'"
+										type="warning" text="鍙栨秷浜ょ彮" size="mini"
+										@click.stop="translate(item,'CHANGESHIFTTODRAFT','鍙栨秷浜ょ彮')">鍙栨秷浜ょ彮</u-button>
+								</view>
+								<view style="text-align: right;margin-left: 16rpx;">
+									<u-button type="error" text="鍒犻櫎" size="mini" @click.stop="deleteTracking(item)">
+										鍒犻櫎</u-button>
+								</view>
+							</view>
+							<view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鎶ュ伐鍗曞彿</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.productNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢缂栧彿</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.partNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鍚嶇О</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.partName}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">SN鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.outBatchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">IFS鎵规鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.ifsBatchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鐢熶骇鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.productQty}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鎶ュ簾鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.scrapQty}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">杞藉叿缂栧彿</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.reelNumber}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鍒嗘鎻忚堪</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{item.segmentDesc}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鐘舵��</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{formatState(item.state)}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">浜ょ彮鐘舵��</span>
+										</u-col>
+										<u-col span="8">
+											<view class="tracking-val-col">
+												<span>{{formatShiftState(item.shiftState)}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+							</view>
+						</view>				
+			</u-cell-group>
+			
+		</scroll-view>
+		<!--<view class="view-fixed-one">
+			<u-button type="success" text="鎵爜" size="medium" :customStyle="{width:'160rpx'}"
+				@click="scanMaterialCodeClick()">鎵爜</u-button>
+		</view>-->
+		<view class="view-fixed-two tracking-bottom-btns">
+			<u-button text="缂栬緫" size="medium"
+				:customStyle="{height:'60rpx',paddingLeft:'35rpx',paddingRight:'35rpx',color:'#41A2F9'}"
+				@click="toEditProductOut">
+				缂栬緫</u-button>
+			<u-button text="鎵撳嵃" size="medium"
+				:customStyle="{height:'60rpx',paddingLeft:'35rpx',paddingRight:'35rpx',color:'#41A2F9'}"
+				@click="printTrackingLabel">
+				鎵撳嵃</u-button>
+			<u-button text="鎶ユ" size="medium"
+				:customStyle="{height:'60rpx',paddingLeft:'35rpx',paddingRight:'35rpx',color:'#41A2F9'}"
+				@click="openInspectionApplication">
+				鎶ユ</u-button>
+			<u-button text="鎻愪氦" size="medium"
+				:customStyle="{height:'60rpx',paddingLeft:'35rpx',paddingRight:'35rpx',color:'#41A2F9'}"
+				@click="submitTracking">
+				鎻愪氦</u-button>
+			<u-button text="鎾ら攢" size="medium"
+				:customStyle="{height:'60rpx',paddingLeft:'35rpx',paddingRight:'35rpx',color:'#41A2F9'}"
+				@click="revokeTracking">
+				鎾ら攢</u-button>
+		</view>
+		<u-mask :show="inspectionApplicationShow">
+			<view class="inspection-application-mask">
+				<view class="inspection-application-mask-view">
+					<view>
+						<view style="height: 60rpx;line-height:60rpx;text-align:right;margin-right: 20rpx;">
+							<u-icon name="close" @click="inspectionApplicationShow = false"></u-icon>
+						</view>
+					</view>
+					<view>
+						<view style="height: 60rpx;line-height:60rpx;">
+							<span style="font-weight: bold;margin-left:30rpx;font-size: 32rpx;">鎶ユ</span>
+						</view>
+					</view>
+					<view class="inspection-application-reporttype-view">
+						<view class="inspection-application-reporttype-row">
+							<u-row justify="space-between">
+								<u-col span="3">
+									<view>
+										<span style="margin-left: 16rpx;">鎶ユ绫诲瀷</span>
+									</view>
+								</u-col>
+								<u-col span="9">
+									<view style="border: 1px solid #d6d4d4;border-radius: 10rpx;">
+										<u-select v-model="reportTypeListShow" :list="reportTypeList"
+											@confirm="confirmReportType"></u-select>
+										<view
+											style="height: 60rpx;display: flex;justify-content:space-between;align-items: center;"
+											@click="reportTypeListShow = true">
+											<span
+												style="margin-left: 10rpx;">{{reportTypeValue!=null?reportTypeLabel:'璇烽�夋嫨'}}</span>
+											<u-icon style="margin-right: 6rpx;" name="arrow-down-fill"></u-icon>
+										</view>
+									</view>
+								</u-col>
+							</u-row>
+						</view>
+					</view>
+					<view class="edit-product-out-btn-view">
+						<u-button text="纭畾" type="success" size="medium" :customStyle="{width:'150rpx'}"
+							@click="saveReportType">
+							纭畾</u-button>
+					</view>
+				</view>
+			</view>
+		</u-mask>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				showCardHead: false,
+				outputregisterMainInfo: {
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null,
+					optaskId: null,
+					optaskNo: null,
+					partId: null,
+					partName: null,
+					partNo: null,
+					unit: null
+				},
+				trackingList: [],
+				reportStyle: 'shift',
+				reportStyleList: [{
+					value: 'shift',
+					name: '鎸夌彮缁�'
+				}, {
+					value: 'person',
+					name: '鎸変汉鍛�'
+				}],
+				inspectionApplicationShow: false,
+				reportTypeList: [{
+						value: '1',
+						label: '姹�'
+					},
+					{
+						value: '2',
+						label: '婀�'
+					}
+				],
+				reportTypeListShow: false,
+				reportTypeValue: null,
+				reportTypeLabel: null,
+				bodyStyle: {
+					background: '#bbf59c'
+				},
+				dutyForm: {
+					workstationId: null,
+					dutyNo: null,
+					crewId: null,
+					dutyDate: null,
+					startTime: null,
+					endTime: null,
+					dutyTime: null,
+					shiftId: null,
+					id: null,
+					isSubmit: null
+				},
+				stateTagArr: [
+				        { value: '01draft', label: '鑽夌' },
+				        { value: '02submitted', label: '宸叉彁浜�' },
+				        { value: '03changeshift', label: '浜ょ彮' }
+				],
+				stateShiftTagArr: [{ value: '03changeshift', label: '浜ょ彮' }],
+				backgroundColor:{
+					selectedColor:'#bbf59c',
+					unSelectedColor:'#ffffff'
+				}
+			};
+		},
+		onLoad() {},
+		onShow() {
+
+		},
+		methods: {
+			formatState(state){
+				for (let i = 0, len = this.stateTagArr.length; i < len; i++) {
+				    if (state === this.stateTagArr[i].value) {
+				      return this.stateTagArr[i].label
+				    }
+				  }
+				  return ''
+			},
+			formatShiftState(shiftState){
+				for (let i = 0, len = this.stateShiftTagArr.length; i < len; i++) {
+				    if (shiftState === this.stateShiftTagArr[i].value) {
+				      return this.stateShiftTagArr[i].label
+				    }
+				  }
+				  return ''
+			},
+			printTrackingLabel() {
+				let initList = this.trackingList.filter(item => item.selected == true)
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愭墦鍗般�戠殑鏁版嵁')
+					return
+				}
+				uni.navigateTo({
+					url: '/pages/util/bleConnect?data='+ JSON.stringify(initList[0]),
+				})
+			},
+			//鎻愪氦
+			submitTracking() {
+
+				let initList = this.trackingList.filter(item => item.selected == true)
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愭彁浜ゃ�戠殑鏁版嵁')
+					return
+				}
+				
+				const l_index = initList.findIndex((el) => el.state == '02submitted')
+				if (l_index > -1) {
+				    this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪宸叉彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+				    return
+				}
+					  
+				let outIds = initList.map((item) => {
+					return item.id
+				})
+
+				let queryParam = {
+					event: 'SUBMIT',
+					ids: outIds
+				}
+				this.batchChange(queryParam, "鎻愪氦")
+			},
+			//鎾ら攢
+			revokeTracking() {
+
+				let initList = this.trackingList.filter(item => item.selected == true)
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愭挙閿�銆戠殑鏁版嵁')
+					return
+				}
+				
+				let l_index = initList.findIndex(
+				        (el) => el.state == null || el.state == '01draft'
+				      )
+				if (l_index > -1) {
+				    this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪鏈彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+				    return
+				}
+					  
+				let outIds = initList.map((item) => {
+					return item.id
+				})
+
+				let queryParam = {
+					event: 'REVOKE',
+					ids: outIds
+				}
+				this.batchChange(queryParam, "鎾ら攢")
+			},
+			//鎻愪氦銆佹挙閿�鎿嶄綔
+			batchChange(queryParam, title) {
+				let that = this
+				that.$u.api.outputRegister.batchChange(queryParam).then(res => {
+					if (res.code == 0) {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: title + '鎴愬姛',
+							showCancel: false,
+							success: function() {
+								that.loadList()
+							}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: title + '澶辫触',
+							showCancel: false,
+							success: function() {}
+						})
+					}
+				})
+			},
+			trackingCardClick(item) {
+				item.selected = !item.selected
+			},
+			saveReportType() {
+				this.inspectionApplicationShow = false
+				console.log('reportTypeValue', this.reportTypeValue)
+			},
+			confirmReportType(item) {
+				console.log('item', item)
+				this.reportTypeValue = item[0].value
+				this.reportTypeLabel = item[0].label
+			},
+			openInspectionApplication() {
+				this.inspectionApplicationShow = true
+			},
+			toEditProductOut() {
+				let initList = this.trackingList.filter(item => item.selected == true)
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愮紪杈戙�戠殑鏁版嵁')
+					return
+				}
+				//TODO鏍¢獙鎶ュ伐鐘舵��
+				let l_index = initList.findIndex((el) => el.state == '02submitted')
+				if (l_index > -1) {
+				    this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪宸叉彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+				    return 
+				}
+				
+				uni.navigateTo({
+					url: '/pages/product/outputRegister/editProductOut?item=' + encodeURIComponent(JSON.stringify(initList))
+				})
+			},
+			refreshTrackingRecord() {
+				this.loadList();
+			},
+			setWorkstation(workstation) {
+				this.outputregisterMainInfo.workstationId = workstation.id
+				this.outputregisterMainInfo.workstationNo = workstation.workstationNo
+				this.outputregisterMainInfo.workstationName = workstation.name
+
+				//鑾峰彇褰撶彮璁板綍
+				this.dutyForm.workstationId = this.outputregisterMainInfo.workstationId
+				if (this.dutyForm.workstationId != "" || this.dutyForm.workstationId != undefined) {
+					let queryParam = {
+						id: this.dutyForm.workstationId
+					}
+					//鏍规嵁宸ヤ綔绔欙紝鍔犺浇鐝
+					this.$u.api.outputRegister.getDutyRecordByWorkstationId(queryParam).then(res => {
+						if (res.data != null) {
+							this.dutyForm = res.data
+						}
+					})
+				}
+			},
+			setOptask(task) {
+				this.outputregisterMainInfo.optaskId = task.id
+				this.outputregisterMainInfo.optaskNo = task.optaskNo
+				this.outputregisterMainInfo.partId = task.partId
+				this.outputregisterMainInfo.partName = task.partName
+				this.outputregisterMainInfo.partNo = task.partNo
+				this.outputregisterMainInfo.unit = task.unit
+				this.loadList()
+			},
+			openShiftProductOut() {
+				//鏌ユ壘鍑洪渶浜ゆ帴鐨勪骇鍑鸿褰�
+				if (this.dutyForm.workstationId == null) {
+					this.$u.toast('璇烽�夋嫨宸ヤ綔绔�');
+					return
+				}
+				if (this.outputregisterMainInfo.optaskId == null) {
+					this.$u.toast('璇烽�夋嫨宸ュ崟');
+					return
+				}
+				let queryParam = {
+					workstationId: this.dutyForm.workstationId,
+					opeartionTaskId: this.outputregisterMainInfo.optaskId
+				}
+				this.$u.api.outputRegister.getShiftProductOutByOpIdAndWsId(queryParam).then(res => {
+					let resCode = res.code
+					let resData = res.data
+					if (resCode === 0) {
+						if (resData != null) {
+							if (this.dutyForm.id !== resData.dutyRecordId) {
+								uni.navigateTo({
+									url: '/pages/product/outputRegister/shiftProductOut?' +
+										"type=" + this.reportStyle + "&dutyId=" + this.dutyForm.id +
+										"&workstationId=" + this.dutyForm.workstationId +
+										"&operationTaskId=" + this.outputregisterMainInfo.optaskId +
+										"&partId=" + this.outputregisterMainInfo.partId +
+										"&partName=" + this.outputregisterMainInfo.partName +
+										"&partNo=" + this.outputregisterMainInfo.partNo +
+										"&unit=" + this.outputregisterMainInfo.unit +
+										"&outBatchNo=" + resData.outBatchNo +
+										"&endMeterMark=" + resData.endMeterMark
+								})
+							} else {
+								this.$u.toast('宸ュ崟涓嬪瓨鍦ㄤ氦鐝姤鍛婏紝寰呬笅涓�涓彮缁勮繘琛屻�愪氦鐝骇鍑恒��');
+							}
+						} else {
+							this.$u.toast('宸ュ崟涓嬬殑鎶ュ憡锛屾棤闇�銆愪氦鐝骇鍑恒��');
+						}
+					} else {
+						this.$u.toast('鏌ユ壘宸ュ崟浜ょ彮璁板綍澶辫触');
+					}
+				})
+			},
+			openProductOut() {
+				if (this.outputregisterMainInfo.optaskId != null) {
+					let queryParam = {
+						workstationId: this.dutyForm.workstationId,
+						opeartionTaskId: this.outputregisterMainInfo.optaskId
+					}
+					this.$u.api.outputRegister.getShiftProductOutByOpIdAndWsId(queryParam).then(res => {
+						let resCode = res.code
+						let resData = res.data
+						if (resCode === 0) {
+							if (resData != null) {
+								if (this.dutyForm.id !== resData.dutyRecordId) {
+									this.$u.toast('宸ュ崟涓嬪瓨鍦ㄥ緟浜ょ彮鎶ュ憡锛屼笉鍙繘琛屻�愭柊澧炰骇鍑恒��');
+								} else {
+									uni.navigateTo({
+										url: '/pages/product/outputRegister/addProductOut?' +
+											"type=" + this.reportStyle + "&dutyId=" + this.dutyForm.id +
+											"&workstationId=" + this.dutyForm.workstationId +
+											"&operationTaskId=" + this.outputregisterMainInfo.optaskId +
+											"&partId=" + this.outputregisterMainInfo.partId +
+											"&partName=" + this.outputregisterMainInfo.partName +
+											"&partNo=" + this.outputregisterMainInfo.partNo +
+											"&unit=" + this.outputregisterMainInfo.unit
+									})
+								}
+							} else {
+								uni.navigateTo({
+									url: '/pages/product/outputRegister/addProductOut?' +
+										"type=" + this.reportStyle + "&dutyId=" + this.dutyForm.id +
+										"&workstationId=" + this.dutyForm.workstationId +
+										"&operationTaskId=" + this.outputregisterMainInfo.optaskId +
+										"&partId=" + this.outputregisterMainInfo.partId +
+										"&partName=" + this.outputregisterMainInfo.partName +
+										"&partNo=" + this.outputregisterMainInfo.partNo +
+										"&unit=" + this.outputregisterMainInfo.unit
+								})
+							}
+						} else {
+							this.$u.toast('鏌ユ壘宸ュ崟浜ょ彮璁板綍澶辫触');
+						}
+					})
+					
+				} else {
+					this.$u.toast('璇烽�夋嫨宸ュ崟');
+				}
+			},
+			toOptask() {
+				if (this.outputregisterMainInfo.workstationName != null || this.outputregisterMainInfo.workstationName !=
+					"") {
+					uni.navigateTo({
+						url: '/pages/product/outputRegister/optaskList?workstationId=' + this
+							.outputregisterMainInfo.workstationId
+					})
+				} else {
+					this.$u.toast('璇烽�夋嫨宸ヤ綔绔�');
+				}
+			},
+			toWorkstation() {
+				uni.navigateTo({
+					url: '/pages/product/outputRegister/workstationList'
+				})
+			},
+			toProductIn(item) {
+				if(item.state == '02submitted'){
+					this.$u.toast('宸叉彁浜わ紝涓嶅彲杩涜銆愭姇鍏ャ��');
+					return
+				}
+				let id=item.id
+				let productMainId=item.productMainId
+				let productNo=item.productNo
+				uni.navigateTo({
+					url: '/pages/product/outputRegister/productInList?workstationId=' + this.dutyForm
+						.workstationId + '&id=' + id + '&productMainId=' + productMainId + '&productNo=' +
+						productNo
+				})
+			},
+			translate(item, event, btnName) {
+				let changeStateParam = {
+					id: item.id,
+					event: event
+				}
+				this.$u.api.outputRegister.productOutPutStateByMainId(changeStateParam).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.$u.toast(btnName + '鎴愬姛');
+						this.search('')
+					} else {
+						this.$u.toast(btnName + '澶辫触');
+					}
+				});
+			},
+			deleteTracking(item) {
+				if(item.state == '02submitted'){
+					this.$u.toast('宸叉彁浜わ紝涓嶅彲杩涜銆愬垹闄ゃ��');
+					return
+				}
+				this.$u.api.outputRegister.batchCancelProductMain([item.id]).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.$u.toast('鍒犻櫎鎴愬姛');
+						this.search('')
+					} else {
+						this.$u.toast('鍒犻櫎澶辫触');
+					}
+				});
+			},
+			loadList() {
+				let that=this
+				that.trackingList = []
+				let queryParam = {
+					workstationId: that.dutyForm.workstationId,
+					operationTaskId: that.outputregisterMainInfo.optaskId
+				}
+				that.$u.api.outputRegister.getProductMainV1(queryParam).then(res => {
+					let resList = res.data.records
+					resList.map((item) => {
+					});
+					that.trackingList=resList
+				});
+			},
+			search(value) {
+				this.loadList();
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.outputregister-main-info {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.outputregister-main-operate-view {
+		height: 80rpx;
+	}
+
+	.outputregister-main-out-view {
+		display: flex;
+		justify-content: flex-end;
+		align-items: center;
+	}
+
+	.outputregister-main-row {
+		padding-bottom: 2px;
+		padding-top: 2px;
+	}
+
+	.last-main-row {
+		border-bottom: 1px solid #F3F3F6;
+	}
+
+	.tracking-val-col {
+		display: flex;
+		justify-content: flex-end;
+	}
+
+	.tracking-scan-record {
+		background-color: #F8F8F8;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 308rpx);
+	}
+
+	.tracking-scan-record-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+
+	.tracking-record-operate-btn-view {
+		display: flex;
+		justify-content: flex-end;
+		align-items: center;
+	}
+
+	.edit-product-out-view {
+		background-color: #F8F8F8;
+		height: calc(100vh - 220rpx);
+		overflow-x: hidden;
+		overflow-y: auto;
+	}
+
+	.edit-product-out-view-cell {
+		padding-top: 2rpx;
+	}
+
+	.edit-product-out-view-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+
+	.edit-product-out-btn-view {
+		display: flex;
+		justify-content: space-between;
+		margin-top: 20rpx;
+	}
+
+	.tracking-bottom-btns {
+		width: 750rpx;
+		height: 100rpx;
+		background-color: #3281FF;
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+	}
+
+	.inspection-application-mask {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		height: 100%;
+	}
+
+	.inspection-application-mask-view {
+		width: 600rpx;
+		height: 450rpx;
+		background-color: #fff;
+		border-radius: 10rpx;
+	}
+
+	.inspection-application-reporttype-view {
+		display: flex;
+		align-items: center;
+		height: 220rpx;
+	}
+
+	.inspection-application-reporttype-row {
+		width: 100%;
+	}
+
+	.custom-edit-input {
+		border-bottom: 2rpx solid #F8F8F8;
+	}
+	
+	.tracking-scan-record-view{
+		margin-left: 30rpx;
+		margin-right: 30rpx;
+		margin-top: 30rpx;
+		margin-bottom: 30rpx;
+		border-radius: 20rpx;
+		padding-left: 10rpx;
+		padding-right: 10rpx;
+		padding-bottom: 10rpx;
+		padding-top: 10rpx;
+	}
+</style>
diff --git a/pages/product/outputRegister/optaskList.vue b/pages/product/outputRegister/optaskList.vue
new file mode 100644
index 0000000..53a3391
--- /dev/null
+++ b/pages/product/outputRegister/optaskList.vue
@@ -0,0 +1,96 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true">
+			<u-cell-group class="list" :border="false">
+				<view class="content" v-for="(item, index) in optaskList" :key="item.optaskNo" :index="index"
+					@click="selectTask(item)">
+					<view class="row-list task-row">
+						<span class="span-lable">宸ュ崟缂栧彿: </span>{{ item.optaskNo }}
+					</view>
+					<view class="row-list task-row">
+						<span class="span-lable">闆朵欢缂栧彿: </span>{{ item.partNo }}
+					</view>
+					<view class="row-list task-row">
+						<span class="span-lable">闆朵欢鎻忚堪: </span>{{ item.partName }}
+					</view>
+					<view class="row-list task-row">
+						<span class="span-lable">璁″垝鏁伴噺: </span>{{ item.plannedQuantity }}
+					</view>
+					<view class="row-list task-row">
+						<span class="span-lable">宸ュ簭: </span>{{ item.operationName }}
+					</view>
+					<view class="row-list task-row">
+						<span class="span-lable">宸ヤ綔绔�: </span>{{ item.workstationName }}
+					</view>
+					<view class="row-list task-row">
+						<span class="span-lable">鐘舵��: </span>{{ item.state }}
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				optaskList: []
+			};
+		},
+		onLoad(params) {
+			if (params && params.workstationId !== "undefined") {
+			   this.loadList(params.workstationId);
+			}
+		},
+		onShow() {
+			
+		},
+		methods: {
+			loadList(workstationId) {
+				let queryParam={
+					workstationId:workstationId
+				}
+				// 鏌ヨ宸ュ崟鍒楄〃
+				this.$u.api.outputRegister.getOperationTask(queryParam).then(res => {
+					this.optaskList = res.data
+				})
+			},
+			selectTask(task) {
+				this.refreshLastPage(task)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(task) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setOptask(task)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	.task-row{
+		display: flex;
+		justify-content:space-between;
+	}
+</style>
diff --git a/pages/product/outputRegister/printProductOutLabel.vue b/pages/product/outputRegister/printProductOutLabel.vue
new file mode 100644
index 0000000..75b1dbc
--- /dev/null
+++ b/pages/product/outputRegister/printProductOutLabel.vue
@@ -0,0 +1,495 @@
+<template>
+	<view class="content">
+		<view class="body">
+			<view>
+				<textarea class="result" v-model="returnResult"></textarea>
+			</view>
+			<textarea class="input" @input="inputEvent" />
+			<button type="primary" @tap="sendData">鍙戦��(绁ㄦ嵁鍙娇鐢�)</button> 
+		
+			<view style='margin-top:4%;display: flex;flex-direction: row;'>
+			   <button type='primary' @tap='receiptTest' :loading='isReceiptSend' :disabled='isReceiptSend'>绁ㄦ嵁娴嬭瘯</button>
+			   <button type='primary' @tap='labelTest' :loading='isLabelSend' :disabled='isLabelSend'>鏍囩娴嬭瘯</button>
+			</view>
+		
+			<view style='margin-top:4%;display: flex;flex-direction: row;'>
+				<!-- hidden='true' -->
+				<canvas  canvas-id='edit_area_canvas' :style="{width:canvasWidth+'px',height:canvasHeight+'px'}"></canvas>
+			</view>
+		
+		    <picker style='margin:20px' mode='selector' :range='buffSize' :value='buffIndex' @change='buffBindChange'>
+				褰撳墠姣忔鍙戦�佸瓧鑺傛暟涓�(鐐瑰嚮鍙洿鎹�)锛歿{buffSize[buffIndex]}}
+			</picker>
+		
+			<picker style='margin:20px' mode='selector' :range='printNum' :value='printNumIndex' @change='printNumBindChange'>
+				褰撳墠鎵撳嵃浠芥暟(鐐瑰嚮鍙洿鎹�)锛歿{printNum[printNumIndex]}}
+			</picker>
+		
+		</view>
+	</view>
+</template>
+
+<script>
+	var tsc = require("../../../util/ble/tsc.js");
+	var esc = require("../../../util/ble/esc.js");
+	var encode = require("../../../util/ble/encoding.js");
+	import {
+		mapState
+	} from 'vuex';
+	export default {
+		data() {
+			return {
+				sendContent: "",
+				looptime: 0,
+				currentTime: 1,
+				lastData: 0,
+				oneTimeData: 0,
+				returnResult: "",
+				canvasWidth: 180,
+				canvasHeight: 180,
+				imageSrc: '../../static/img/abc_ic_star_black_16dp.png',
+				buffSize: [],
+				buffIndex: 0,
+				printNum: [],
+				printNumIndex: 0,
+				printerNum: 1,
+				currentPrint: 1,
+				isReceiptSend: false,
+				isLabelSend: false,
+				printData:null
+			};
+		},
+		computed: mapState(['sysinfo', 'Bluetooth']),
+		onLoad(params) {
+			let that = this;
+			let {
+				BLEInformation
+			} = that.Bluetooth;
+			if (params.data) {
+				that.printData =JSON.parse(params.data);
+			}
+			// uni.notifyBLECharacteristicValueChange({
+			//   deviceId: BLEInformation.deviceId,
+			//   serviceId: BLEInformation.notifyServiceId,
+			//   characteristicId: BLEInformation.notifyCharaterId,
+			//   state: true,
+			//   success(res) {
+			// 	uni.onBLECharacteristicValueChange(function(r) {
+			// 	  console.log(`characteristic ${r.characteristicId} has changed, now is ${r}`)
+			// 	})
+			//   },
+			//   fail: function(e) {
+			// 	console.log(e)
+			//   },
+			//   complete: function(e) {
+			// 	console.log(e)
+			//   }
+			// })
+		},
+		onReady(){
+			let list = []
+			let numList = []
+			let j = 0
+			for (let i = 20; i < 200; i += 10) {
+			  list[j] = i;
+			  j++
+			}
+			for (let i = 1; i < 10; i++) {
+			  numList[i - 1] = i
+			}
+			this.buffSize = list;
+			this.oneTimeData = list[0];
+			this.printNum = numList;
+			this.printerNum = numList[0];
+		},
+		onShow(){
+			let that = this;
+			let width;
+			let height;
+			uni.getImageInfo({
+			  src: that.imageSrc,
+			  success(res) {
+				console.log(res.width)
+				console.log(res.height)
+				width = res.width
+				height = res.height
+				that.canvasWidth = res.width;
+				that.canvasHeight = res.height;
+			  }
+			})
+			const ctx = uni.createCanvasContext("edit_area_canvas", this);
+			// if (app.globalData.platform == "android") {
+			//   ctx.translate(width, height)
+			//   ctx.rotate(180 * Math.PI / 180)
+			// }
+			ctx.drawImage(this.imageSrc, 0, 0, width, height);
+			ctx.draw();
+		},
+		onUnload() {
+			let that = this;
+			let {
+				BLEInformation
+			} = that.Bluetooth;
+			// uni.closeBLEConnection({
+		 //      deviceId: BLEInformation.deviceId,
+		 //      success: function(res) {
+		 //        console.log("鍏抽棴钃濈墮鎴愬姛")
+		 //      },
+		 //    })	
+		},
+		methods:{
+			//鑾峰彇杈撳叆鍐呭
+			inputEvent(e){
+				this.sendContent = e.detail.value;
+			},
+			//杈撳叆妗嗙偣鍑诲彂閫�
+			sendData(){
+				let data = this.sendContent + "\n"
+				this.looptime = 0;
+				var content = new encode.TextEncoder(
+				  'gb18030', {
+					NONSTANDARD_allowLegacyEncoding: true
+				  }).encode(data);
+			
+				this.prepareSend(content);
+			},
+			//鏍囩娴嬭瘯
+			labelTest(){
+				let that = this;
+				let canvasWidth = that.canvasWidth
+				let canvasHeight = that.canvasHeight
+				let command = tsc.jpPrinter.createNew()
+				command.setSize(48, 48)
+				command.setGap(0)
+				command.setCls()
+				command.setQR(0, 32, "L", 5, "A", "www.smarnet.cc浣冲崥鏅烘眹")
+				command.setText(0, 64, "TSS24.BF2", 1, 1, "瀹㈡埛璁㈠崟鍙�")
+				command.setText(64, 64, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(128, 64, "TSS24.BF2", 1, 1, "瀹㈡埛鍚嶇О")
+				command.setText(192, 64, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(128, 104, "TSS24.BF2", 1, 1, "宸ュ簭锛�")
+				command.setText(192, 104, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(256, 104, "TSS24.BF2", 1, 1, "宸ヤ綔绔欙細")
+				command.setText(320, 104, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(128, 144, "TSS24.BF2", 1, 1, "闆朵欢鎻忚堪锛�")
+				command.setText(192, 144, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(256, 144, "TSS24.BF2", 1, 1, "SN鍙凤細")
+				command.setText(320, 144, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(128, 184, "TSS24.BF2", 1, 1, "鐢熶骇鏁伴噺锛�")
+				command.setText(192, 184, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(256, 184, "TSS24.BF2", 1, 1, "杞藉叿缂栧彿锛�")
+				command.setText(320, 184, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(128, 224, "TSS24.BF2", 1, 1, "鐢熶骇鏃ユ湡锛�")
+				command.setText(192, 224, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(256, 224, "TSS24.BF2", 1, 1, "鐢熶骇浜哄憳锛�")
+				command.setText(320, 224, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(0, 264, "TSS24.BF2", 1, 1, "妫�楠岀粨璁猴細")
+				command.setText(64, 264, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(128, 264, "TSS24.BF2", 1, 1, "妫�娴嬩汉鍛橈細")
+				command.setText(192, 264, "TSS24.BF2", 1, 1, "xxxxxxx")
+				command.setText(256, 264, "TSS24.BF2", 1, 1, "妫�娴嬫椂闂达細")
+				command.setText(320, 264, "TSS24.BF2", 1, 1, "xxxxxxx")
+				command.setText(0, 304, "TSS24.BF2", 1, 1, "鎵撳嵃鏃堕棿锛�")
+				command.setText(64, 304, "TSS24.BF2", 1, 1, "xxxxxx")
+				command.setText(0, 344, "TSS24.BF2", 1, 1, "澶囨敞锛�")
+				command.setText(64, 344, "TSS24.BF2", 1, 1, "")
+				command.setBarCode(0, 104, "EAN8", 64, 1, 3, 3, "1234567")
+				uni.canvasGetImageData({
+				  canvasId: 'edit_area_canvas',
+				  x: 0,
+				  y: 0,
+				  width: canvasWidth,
+				  height: canvasHeight,
+				  success: function(res) {
+					command.setBitmap(60, 0, 1, res)
+				  },
+				  complete: function() {
+					command.setPagePrint()
+					that.isLabelSend = true;
+					that.prepareSend(command.getData())
+				  }
+				})
+			},
+
+			//绁ㄦ嵁娴嬭瘯
+			receiptTest(){
+				var that = this;
+				var canvasWidth = that.canvasWidth
+				var canvasHeight = that.canvasHeight
+				var command = esc.jpPrinter.createNew()
+				command.init()
+				// 鏍囬
+				command.bold(1);//鍔犵矖
+				command.setFontSize(16);//瀛椾綋澶у皬
+				command.setSelectJustification(1)//灞呬腑
+				command.rowSpace(100);
+				command.setText("鏉窞鎬诲簵");
+				command.setPrint();
+				command.rowSpace(60);
+				
+				command.bold(0);//鍙栨秷鍔犵矖
+				command.setFontSize(0);//姝e父瀛椾綋
+				//鏃堕棿
+				command.setSelectJustification(0);//灞呭乏
+				command.setText("鏃堕棿锛�2019-11-11 12:10:30");
+				command.setPrint();
+				//缂栧彿
+				command.setSelectJustification(0);//灞呭乏
+				command.setText("缂栧彿锛歋D10000000000000000");
+				command.setPrintAndFeed(80);//鎵撳嵃骞惰蛋绾竑eed涓崟浣�
+				//鍒楄〃
+				command.rowSpace(80);//闂磋窛
+				command.bold(5);//鍔犵矖
+				command.setText("璐у彿");
+				command.setAbsolutePrintPosition(100);
+				command.setText("棰滆壊");
+				command.setAbsolutePrintPosition(180);
+				command.setText("灏虹爜");
+				command.setAbsolutePrintPosition(270);
+				command.setText("鍗曚环");
+				command.setAbsolutePrintPosition(380);
+				command.setText("鏁伴噺");
+				command.setAbsolutePrintPosition(480);
+				command.setText("閲戦");
+				command.setPrint()
+				command.bold(0);//鍔犵矖
+				// -------1
+				command.setText("86001W");
+				command.setAbsolutePrintPosition(100);
+				command.setText("榛勮壊");
+				command.setAbsolutePrintPosition(180);
+				command.setText("鍧囩爜");
+				command.setAbsolutePrintPosition(270);
+				command.setText("16947.92");
+				command.setAbsolutePrintPosition(390);
+				command.setText("1");
+				command.setAbsolutePrintPosition(480);
+				command.setText("19647.92");
+				command.setPrint()
+				// ------2
+				command.setText("86001W");
+				command.setAbsolutePrintPosition(100);
+				command.setText("榛勮壊");
+				command.setAbsolutePrintPosition(180);
+				command.setText("鍧囩爜");
+				command.setAbsolutePrintPosition(270);
+				command.setText("16947.92");
+				command.setAbsolutePrintPosition(390);
+				command.setText("1");
+				command.setAbsolutePrintPosition(480);
+				command.setText("19647.92");
+				command.setPrint()
+				// -------3
+				command.setText("86001W");
+				command.setAbsolutePrintPosition(100);
+				command.setText("榛勮壊");
+				command.setAbsolutePrintPosition(180);
+				command.setText("鍧囩爜");
+				command.setAbsolutePrintPosition(270);
+				command.setText("16947.92");
+				command.setAbsolutePrintPosition(390);
+				command.setText("1");
+				command.setAbsolutePrintPosition(480);
+				command.setText("19647.92");
+				command.setPrint();
+			
+			
+				//鍚堣
+				command.bold(5);//鍔犵矖
+				command.setAbsolutePrintPosition(120);
+				command.setText("鎬绘暟锛�10");
+				command.setAbsolutePrintPosition(320);
+				command.setText("鍚堣锛�10000");
+				command.setPrint();
+				command.setAbsolutePrintPosition(120);
+				command.setText("瀹炴敹锛�10000");
+				command.setAbsolutePrintPosition(320);
+				command.setText("鎵鹃浂锛�0");
+				command.setPrint();
+				// 鏀堕摱鍛�
+				command.rowSpace(120);//闂磋窛
+				command.setAbsolutePrintPosition(120);
+				command.setText("搴楀憳锛氫綍涓�");
+				command.setAbsolutePrintPosition(320);
+				command.setText("浼氬憳锛�1000000000");
+				command.setPrint()
+			
+				//鎻愮ず
+				command.rowSpace(80);//闂磋窛
+				command.bold(2);//鍔犵矖
+				command.setSelectJustification(1);//灞呬腑
+				command.setText("鍞嚭鍟嗗搧璐拱鍚�7澶╁唴,鍙嚟灏忕エ閫�鎹�");
+				command.setPrint();
+				command.setText("(娉細鍚婄墝鏈媶鍓�,鍟嗗搧鏈礂娑�)");
+				command.setPrint();
+			
+				//鐢佃瘽
+				command.setSelectJustification(0);//灞呭乏
+				command.setText("瀹㈡湇鐢佃瘽:(0571)86011123");
+				command.setPrint();
+				command.setText("鑱旂郴鍦板潃:娴欐睙鐪佽鏆ㄥ競鏆ㄩ槼琛楅亾鍋ュ悍璺�1-1鍙�");
+				command.setPrint();
+			
+				command.setPrintAndFeedRow(3);
+				
+				that.isReceiptSend = true;
+				that.prepareSend(command.getData());
+			
+			
+			},
+			
+			//鍑嗗鍙戦�侊紝鏍规嵁姣忔鍙戦�佸瓧鑺傛暟鏉ュ鐞嗗垎鍖呮暟閲�
+			prepareSend(buff){
+				console.log(buff);
+				let that = this
+				let time = that.oneTimeData
+				let looptime = parseInt(buff.length / time);
+				let lastData = parseInt(buff.length % time);
+				console.log(looptime + "---" + lastData)
+				this.looptime = looptime + 1;
+				this.lastData = lastData;
+				this.currentTime = 1;
+				that.Send(buff)
+			},
+			//鏌ヨ鎵撳嵃鏈虹姸鎬�
+			queryStatus(){
+				let command = esc.jpPrinter.Query();
+				command.getRealtimeStatusTransmission(1);
+			},
+			//鍒嗗寘鍙戦��
+			Send(buff){
+				let that = this
+				let {currentTime,looptime:loopTime,lastData,oneTimeData:onTimeData,printerNum:printNum,currentPrint}=that;
+				let buf;
+				let dataView;
+				if (currentTime < loopTime) {
+				  buf = new ArrayBuffer(onTimeData)
+				  dataView = new DataView(buf)
+				  for (var i = 0; i < onTimeData; ++i) {
+					dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
+				  }
+				} else {
+				  buf = new ArrayBuffer(lastData)
+				  dataView = new DataView(buf)
+				  for (var i = 0; i < lastData; ++i) {
+					dataView.setUint8(i, buff[(currentTime - 1) * onTimeData + i])
+				  }
+				}
+				console.log("绗�" + currentTime + "娆″彂閫佹暟鎹ぇ灏忎负锛�" + buf.byteLength)
+				let {
+					BLEInformation
+				} = that.Bluetooth;
+				
+				plus.bluetooth.writeBLECharacteristicValue({
+				  deviceId: BLEInformation.deviceId,
+				  serviceId: BLEInformation.writeServiceId,
+				  characteristicId: BLEInformation.writeCharaterId,
+				  value: buf,
+				  success: function(res) {
+					console.log(res)
+				  },
+				  fail: function(e) {
+					console.log(e)
+				  },
+				  complete: function() {
+					currentTime++
+					if (currentTime <= loopTime) {
+					  that.currentTime = currentTime;
+					  that.Send(buff)
+					} else {
+					  uni.showToast({
+						title: '宸叉墦鍗扮' + currentPrint + '寮�',
+					  })
+					  if (currentPrint == printNum) {
+						that.looptime = 0;
+						that.lastData = 0;
+						that.currentTime = 1;
+						that.isReceiptSend = false;
+						that.isLabelSend = false;
+						that.currentPrint = 1;
+					  } else {
+						currentPrint++;
+						that.currentPrint = currentPrint;
+						that.currentTime = 1;
+						that.Send(buff)
+					  }
+					}
+				  }
+				})
+			},
+			buffBindChange: function(res) { //鏇存敼鎵撳嵃瀛楄妭鏁�
+			    let index = res.detail.value
+			    let time = this.buffSize[index]
+			    this.buffIndex = index;
+			    this.oneTimeData = time;
+			},
+			printNumBindChange: function(res) { //鏇存敼鎵撳嵃浠芥暟
+			    let index = res.detail.value
+			    let num = this.printNum[index]
+			    this.printNumIndex = index;
+			    this.printerNum = num;
+			},
+		}
+	}
+</script>
+
+<style lang="less">
+	.input{  
+		text-align: top; 
+		 width: 90%;  
+		 height: 150px;  
+		 margin-left: 4%; 
+		 margin-right: 4%;  
+		 margin-top: 10px; 
+		 margin-bottom: 12px; 
+		border: 1px solid slategray;
+	}
+	.receiver_info_scroll_view{ 
+		width: 90%; 
+		height: 200px; 
+		margin-left: 4%;
+		margin-right: 4%; 
+		margin-top: 10px;
+		margin-bottom: 25px;
+		border: 1px solid black;
+	}
+	.result{ 
+		width: 90%;  
+		height: 150px; 
+		border: 1px solid black; 
+		margin-left: 4%;
+		margin-bottom: 4%; 
+		margin-top: 5%;
+	}
+    button{ 
+	  width: 90%; 
+	  margin-left: 5%; 
+	  margin-right: 5%;
+	}
+	.switch{ 
+		float: right; 
+		margin-right: 20px; 
+		margin-bottom: 16px;
+	}
+    text{ 
+	   color: #fff; 
+	   display: block;
+	}
+	input{  
+		color: gainsboro;  
+		float: left;
+	}
+	.v_net_ssid{  
+		width: 100%; 
+		background:  #fff;
+	}
+	.v_net_passw{ 
+		width: 100%; 
+		background: antiquewhite;
+	}
+    .swiper{ 
+	   width: 100%; 
+	   height: 100%;
+	}
+
+</style>
diff --git a/pages/product/outputRegister/productInList.vue b/pages/product/outputRegister/productInList.vue
new file mode 100644
index 0000000..0aeab44
--- /dev/null
+++ b/pages/product/outputRegister/productInList.vue
@@ -0,0 +1,293 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list proudct-in-list" scroll-y="true">
+			<u-cell-group class="list proudct-in-list-cell" :border="false">
+				<u-card :title="item.partNo" :sub-title="item.partNo" v-for="(item, index) in list" :key="item.id"
+					:index="item.id" :showHead="showCardHead">
+					<view slot="body">
+						<view class="item u-border-bottom">
+							<view>
+								<view style="text-align: right;">
+									<u-button v-show="item.id==null" type="success" text="淇濆瓨" size="mini"
+										@click.stop="saveProductIn(item)">淇濆瓨</u-button>
+									<u-button v-show="item.id!=null" type="primary" text="鏇存柊" size="mini"
+										@click.stop="updateProductIn(item)">鏇存柊</u-button>
+									<u-button type="error" text="鍒犻櫎" size="mini" :customStyle="{marginLeft:'20rpx'}"
+										@click.stop="deleteProductIn(index,item)">鍒犻櫎</u-button>
+								</view>
+							</view>
+							<view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鎶ュ伐鍗曞彿</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.productNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">SN鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partBatchNo}}</span>
+
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢缂栧彿</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鍚嶇О</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partName}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">IFS鎵规鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.ifsBatchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鎶曞叆鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<u-input class="custom-edit-input" v-model="item.inputQuantity"
+													type="text" :clearable=false height="50">
+												</u-input>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鍗曚綅</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+
+												<span>{{item.unit}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+							</view>
+						</view>
+					</view>
+
+				</u-card>
+			</u-cell-group>
+		</scroll-view>
+		<view class="view-fixed-two" style="width: 750rpx;text-align: center;">
+			<u-button type="success" text="鎶曞叆" size="medium" :customStyle="{borderRadius:'0rpx'}" @click="openFeed()">鎶曞叆
+			</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				showCardHead: false,
+				list: [],
+				currId: null,
+				workstationId: null,
+				productMainId: null,
+				productNo: null
+			};
+		},
+		onLoad(params) {
+			if (params && params.id !== "undefined") {
+				this.currId = params.id
+				this.workstationId = params.workstationId
+				this.productMainId = params.productMainId
+				this.productNo = params.productNo
+				this.loadList();
+			}
+		},
+		onShow() {
+
+		},
+		methods: {
+			updateProductIn(item) {
+				if (item.inputQuantity != null && item.inputQuantity.trim != '') {
+					let updateParam = {
+						id: item.id,
+						inputQuantity: item.inputQuantity
+					}
+
+					this.$u.api.outputRegister.updateProductInput(updateParam).then(res => {
+						let _code = res.code
+						let _data = res.data
+						let _msg = res.msg
+						if (_code === 0) {
+							this.$u.toast(`鏇存柊鎶曞叆鎴愬姛`);
+							this.search('')
+						} else {
+							this.$u.toast('鏇存柊鎶曞叆澶辫触');
+						}
+
+					});
+				} else {
+					this.$u.toast('鎶曞叆涓嶈兘涓虹┖');
+				}
+			},
+			deleteProductIn(index, item) {
+				if (item.id != null) {
+					// 鍒欓渶璋冪敤鍚庡彴鍒犻櫎骞跺垹闄ゅ墠绔姇鍏�
+					let delParam = {
+						id: item.id
+					}
+					this.$u.api.outputRegister.deleteProductInputById(delParam).then(res => {
+						let _code = res.code
+						let _data = res.data
+						let _msg = res.msg
+						if (_code === 0) {
+							this.list.splice(index, 1)
+							this.$u.toast('鍒犻櫎鎶曞叆鎴愬姛');
+							this.search('')
+						} else {
+							this.$u.toast('鍒犻櫎鎶曞叆澶辫触');
+						}
+					});
+				} else {
+					// 鍒犻櫎鍓嶇鎶曞叆
+					this.list.splice(index, 1)
+					this.$message.success('鍒犻櫎鎶曞叆鎴愬姛')
+				}
+			},
+			openFeed() {
+				uni.navigateTo({
+					url: '/pages/product/outputRegister/workstationFeedList?workstationId=' + this.workstationId,
+				})
+			},
+			selectWorkstationFeed(selectedFeedList) {
+				if (selectedFeedList != null && selectedFeedList.length > 0) {
+					for (let i = 0; i < selectedFeedList.length; i++) {
+						this.addProductIn(selectedFeedList[i])
+					}
+				}
+			},
+			addProductIn(inPartInfo) {
+				let productInput = {}
+				productInput.id = null
+				productInput.stockId = inPartInfo.id
+				productInput.inputQuantity = null
+				productInput.productMainId = this.productMainId
+				productInput.productNo = this.productNo
+				productInput.partNo = inPartInfo.partNo
+				productInput.partName = inPartInfo.partName
+				productInput.partDescription = null
+				productInput.unit = inPartInfo.unit
+				productInput.partBatchNo = inPartInfo.partBatchNo
+				productInput.ifsBatchNo = inPartInfo.ifsBatchNo
+				this.list.push(productInput)
+			},
+			saveProductIn(item) {
+				if (item.inputQuantity != null && item.inputQuantity.trim != '') {
+					let saveParam = {
+						stockId: item.stockId,
+						productMainId: item.productMainId,
+						inputQuantity: item.inputQuantity
+					}
+					this.$u.api.outputRegister.saveProductInput(saveParam).then(res => {
+						let _code = res.code
+						let _data = res.data
+						let _msg = res.msg
+						//淇濆瓨鏄庣粏鎴愬姛鏃�
+						if (_code === 0) {
+							this.$u.toast('娣诲姞鎶曞叆鎴愬姛');
+							item.id = _data
+							this.search('')
+						} else {
+							this.$u.toast('娣诲姞鎶曞叆澶辫触');
+						}
+					});
+				} else {
+					this.$u.toast('鎶曞叆涓嶈兘涓虹┖');
+				}
+			},
+			loadList() {
+				let queryParam = {
+					id: this.currId
+				}
+				this.$u.api.outputRegister.queryProductMainDetail(queryParam).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.list = _data.productInputList
+					} else {
+						this.list = []
+					}
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.$nextTick(() => {
+					this.loadList();
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.custom-edit-input {
+		border-bottom: 2rpx solid #F8F8F8;
+	}
+
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+
+	.proudct-in-list {
+		background-color: #F8F8F8;
+	}
+
+	.proudct-in-list-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+</style>
diff --git a/pages/product/outputRegister/shiftProductOut.vue b/pages/product/outputRegister/shiftProductOut.vue
new file mode 100644
index 0000000..5491c2a
--- /dev/null
+++ b/pages/product/outputRegister/shiftProductOut.vue
@@ -0,0 +1,392 @@
+<template>
+	<view class="wrap">
+		<view class="row-list" v-if="info.type!='shift'">
+			<u-row justify="space-between" class="shift-product-out-main-row">
+				<u-col span="4">
+					<span class="span-lable">浜哄憳</span>
+				</u-col>
+				<u-col span="8">
+					<view class="shift-product-out-main-info">
+						<view>
+							<u-button size="mini" @click="toDutyPerson">鐐瑰嚮閫夋嫨</u-button>
+						</view>
+					</view>
+				</u-col>
+			</u-row>
+		</view>
+		<view class="row-list">
+			<u-form class="shift-product-out-form" :model="productOutForm" ref="productOutForm" label-width="180"
+				:label-style="{paddingLeft:'10rpx'}">
+				<u-form-item label="闆朵欢缂栧彿">
+					<u-input v-model="productOutForm.partNo" disabled placeholder="" />
+				</u-form-item>
+				<u-form-item label="闆朵欢鍚嶇О">
+					<u-input v-model="productOutForm.partName" disabled placeholder="" />
+				</u-form-item>
+				<u-form-item label="璧峰绫虫爣">
+					<u-input v-model="productOutForm.startMeterMark" placeholder="璇疯緭鍏ヨ捣濮嬬背鏍�" type="digit" />
+				</u-form-item>
+				<u-form-item label="鎴绫虫爣">
+					<u-input v-model="productOutForm.endMeterMark" placeholder="璇疯緭鍏ユ埅姝㈢背鏍�" type="digit" />
+				</u-form-item>
+				<u-form-item label="姣忕洏浜ч噺">
+					<u-input v-model="productOutForm.productQty" placeholder="璇疯緭鍏ユ瘡鐩樹骇閲�" type="digit" />
+				</u-form-item>
+				<u-form-item label="鎶ュ簾鏁伴噺">
+					<u-input v-model="productOutForm.scrapQty" placeholder="璇疯緭鍏ユ姤搴熸暟閲�" type="digit" />
+				</u-form-item>
+				<u-form-item label="杞藉叿缂栧彿">
+					<u-input v-model="productOutForm.reelNumber" placeholder="璇疯緭鍏ヨ浇鍏风紪鍙�" />
+				</u-form-item>
+				<u-form-item label="鍗曚綅">
+					<u-input v-model="productOutForm.unit" disabled placeholder="" />
+				</u-form-item>
+				<u-form-item label="鍒嗘鎻忚堪">
+					<u-input v-model="productOutForm.segmentDesc" />
+				</u-form-item>
+				<u-form-item label="鐢熶骇浜哄憳">{{productOutForm.staffName}}</u-form-item>
+				<u-form-item label="浜у嚭鏃ユ湡">
+					<u-input v-model="productOutForm.date" disabled/>
+				</u-form-item>
+			</u-form>
+		</view>
+		<view class="shift-product-out-bottom-view">
+			<u-button text="纭畾" type="success" size="medium" :customStyle="{width:'150rpx'}" @click="addShiftProudctOut">
+				纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			const currentDateTime = this.getDateTime();
+			return {
+				productOutForm: {
+					workstationId: null,
+					operationTaskId: null,
+					partId: null,
+					partNo: null,
+					partName: null,
+					unit: null,
+					outBatchNo: null,
+					reelNumber: null,
+					ifsBatchNo: null,
+					startMeterMark: null,
+					endMeterMark: null,
+					productQty: null,
+					segmentDesc: null,
+					scrapQty: null,
+					remark: null,
+					staffName: null,
+					date: currentDateTime,
+					status: null,
+					disNumber: null
+				},
+				info: {},
+				personInitList: [],
+				personBoardList: [],
+				products: []
+
+			};
+		},
+		onLoad(option) {
+			//type:shift  鎸夌彮缁�  person 鎸変汉鍛� 
+			this.info.type = option.type
+			this.info.dutyId = option.dutyId
+			this.info.workstationId = option.workstationId
+
+			this.productOutForm.workstationId = option.workstationId
+			this.productOutForm.operationTaskId = option.operationTaskId
+			this.productOutForm.partId = option.partId
+			this.productOutForm.partName = option.partName == "null" ? "" : option.partName
+			this.productOutForm.partNo = option.partNo == "null" ? "" : option.partNo
+			this.productOutForm.unit = option.unit == "null" ? "" : option.unit
+			this.productOutForm.outBatchNo = option.outBatchNo
+			this.productOutForm.startMeterMark = option.endMeterMark
+			this.productOutForm.endMeterMark = option.endMeterMark
+			this.getPerson()
+		},
+		onShow() {
+
+		},
+		methods: {
+			getDateTime() {
+				let year = new Date().getFullYear(); //骞�
+				let month = new Date().getMonth() + 1; //娉ㄦ剰锛佹湀浠芥槸浠�0鏈堝紑濮嬭幏鍙栫殑锛屾墍浠ヨ+1;
+				let day = new Date().getDate(); //鏃�
+				let hour = new Date().getHours(); //鏃�
+				let minute = new Date().getMinutes(); //鍒�
+				let second = new Date().getSeconds(); //绉�
+				//鎷兼帴鏃ユ湡 YYYY/MM/DD HH:mm
+				let currentDate =
+					year +
+					'/' +
+					(month >= 10 ? month : '0' + month) +
+					'/' +
+					(day >= 10 ? day : '0' + day);
+				let currentTime =
+					(hour >= 10 ? hour : '0' + hour) +
+					':' +
+					(minute >= 10 ? minute : '0' + minute) +
+					':' +
+					(second >= 10 ? second : '0' + second);
+			
+				return currentDate + " " + currentTime
+			},
+			async getPerson() {
+				let queryUserParam = {
+					id: this.info.dutyId
+				}
+				console.log(queryUserParam)
+				let resUser = await this.$u.api.outputRegister.getPersonByDutyRecordId(queryUserParam)
+
+				let userList = resUser.data
+				if (userList.length > 0) {
+					this.personInitList = []
+					let staffName = ""
+					userList.map((item, index) => {
+
+						if (index == userList.length - 1) {
+							staffName = staffName + item.staffName
+						} else {
+							staffName = staffName + item.staffName + ","
+						}
+
+						let data = {
+							staffId: item.staffId,
+							staffName: item.staffName,
+							staffNo: item.staffNo,
+							checked: false
+						}
+
+						this.personInitList.push(data)
+					});
+
+					//type:shift  鎸夌彮缁�  person 鎸変汉鍛�
+					if (this.info.type == "shift") {
+						this.personBoardList = this.personInitList
+						this.productOutForm.staffName = staffName
+					} else {
+						this.personBoardList = []
+						this.productOutForm.staffName = ''
+					}
+
+				}
+
+			},
+			toDutyPerson() {
+				if (this.personInitList.length > 0) {
+					uni.navigateTo({
+						url: '/pages/product/outputRegister/dutyPersonList?item=' + encodeURIComponent(JSON
+							.stringify(this.personInitList))
+					})
+				}
+			},
+			setProductPerson(userList) {
+				//type:shift  鎸夌彮缁�  person 鎸変汉鍛�
+				if (this.info.type == "person") {
+					//杩囨护鎺夐�変腑鐨勪汉鍛樹俊鎭�
+					userList = userList.filter(item => item.checked == true)
+					this.personBoardList = []
+
+					if (userList.length > 0) {
+						let staffName = ""
+						userList.map((item, index) => {
+
+							if (index == userList.length - 1) {
+								staffName = staffName + item.staffName
+							} else {
+								staffName = staffName + item.staffName + ","
+							}
+
+							let data = {
+								staffId: item.staffId,
+								staffName: item.staffName,
+								staffNo: item.staffNo,
+								checked: item.checked
+							}
+
+							this.personBoardList.push(data)
+						});
+						this.productOutForm.staffName = staffName
+					}
+				}
+			},
+			async addShiftProudctOut() {
+				// 璧峰绫虫爣鏍¢獙
+				if (!this.isNumber(this.productOutForm.startMeterMark)) {
+					this.$u.toast('銆愯捣濮嬬背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+					return
+				}
+				// 鎴绫虫爣鏍¢獙
+				if (!this.isNumber(this.productOutForm.endMeterMark)) {
+					this.$u.toast('銆愭埅姝㈢背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+					return
+				}
+				// 鎴绫虫爣闇�澶т簬寮�濮嬬背鏍�
+				if (
+					Number(this.productOutForm.endMeterMark) <
+					Number(this.productOutForm.startMeterMark)
+				) {
+					this.$u.toast('銆愭埅姝㈢背鏍囥�戦渶澶т簬銆愯捣濮嬬背鏍囥��')
+					return
+				}
+				let productStaffs = []
+				let productStaffIds = []
+				this.personBoardList.forEach((item) => {
+					productStaffs.push(item.staffNo)
+					productStaffIds.push(item.staffId)
+				})
+				let productOuts = []
+				let productVo = {
+					isChangeShift: true,
+					id: null,
+					workstationId: this.productOutForm.workstationId,
+					operationTaskId: this.productOutForm.operationTaskId,
+					productOutputList: productOuts
+				}
+				if (this.info.type == "person") {
+					let productOut = null
+					this.personBoardList.forEach((item) => {
+						productOut = {
+							workstationId: this.productOutForm.workstationId,
+							operationTaskId: this.productOutForm.operationTaskId,
+							partId: this.productOutForm.partId,
+							startMeterMark: this.productOutForm.startMeterMark,
+							endMeterMark: this.productOutForm.endMeterMark,
+							productQty: null,
+							productStaffs: [item.staffNo],
+							productStaffIds: [item.staffId],
+							outBatchNo: this.productOutForm.outBatchNo,
+							reelNumber: this.productOutForm.reelNumber,
+							status: true,
+							dutyRecordId: this.info.dutyId,
+							ifsBatchNo: this.productOutForm.ifsBatchNo,
+							scrapQty: this.productOutForm.scrapQty,
+							segmentDesc: this.productOutForm.segmentDesc,
+							remark: this.productOutForm.remark
+						}
+						productOuts.push(productOut)
+					})
+				} else {
+					let productOut = {
+						workstationId: this.productOutForm.workstationId,
+						operationTaskId: this.productOutForm.operationTaskId,
+						partId: this.productOutForm.partId,
+						startMeterMark: this.productOutForm.startMeterMark,
+						endMeterMark: this.productOutForm.endMeterMark,
+						productQty: null,
+						productStaffs: productStaffs,
+						productStaffIds: productStaffIds,
+						outBatchNo: this.productOutForm.outBatchNo,
+						reelNumber: this.productOutForm.reelNumber,
+						status: false,
+						dutyRecordId: this.info.dutyId,
+						ifsBatchNo: this.productOutForm.ifsBatchNo,
+						scrapQty: this.productOutForm.scrapQty,
+						segmentDesc: this.productOutForm.segmentDesc,
+						remark: this.productOutForm.remark
+					}
+					productOuts.push(productOut)
+				}
+				let res = await this.$u.api.outputRegister.saveProductOutput(productVo)
+				let that = this
+				if (res.code == 0) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '淇濆瓨鎴愬姛',
+						showCancel: false,
+						success: function() {
+							that.refreshLastPage()
+						}
+					})
+				
+				} else {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '淇濆瓨澶辫触',
+						showCancel: false,
+						success: function() {}
+					})
+				}
+				
+			},
+			isNumber(value) {
+				var reg = /^[0-9]+(.[0-9]{1,4})?$/
+				if (
+					value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+				} else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+					}
+				}
+			},
+			isPositiveIntegerNumber(value) {
+				var reg = /^[1-9]\d*$/
+				if (
+			 	value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+				} else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+			 	}
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.refreshTrackingRecord()
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.shift-product-out-main-info {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.shift-product-out-main-row {
+		padding-bottom: 2px;
+		padding-top: 2px;
+	}
+
+	.shift-product-out-form {
+		.u-form-item {
+			padding: 7rpx;
+		}
+	}
+
+	.shift-product-out-bottom-view {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 1062rpx);
+	}
+</style>
diff --git a/pages/product/outputRegister/workstationFeedList.vue b/pages/product/outputRegister/workstationFeedList.vue
new file mode 100644
index 0000000..724530e
--- /dev/null
+++ b/pages/product/outputRegister/workstationFeedList.vue
@@ -0,0 +1,211 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list workstation-feed-list" scroll-y="true">
+			<u-cell-group class="list workstation-feed-list-cell" :border="false">
+							<view class="item u-border-bottom workstation-feed-view" :style="{backgroundColor: item.selected?backgroundColor.selectedColor:backgroundColor.unSelectedColor}" v-for="(item, index) in list" :key="item.id" @click="materialCardClick(item)"
+								>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partName}}</span>
+
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">IFS鎵规鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.ifsBatchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鎵瑰彿</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partBatchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">瑙勬牸鍨嬪彿</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.specs}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鍙敤鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+								
+												<span>{{item.availableStockQuantity}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">搴撳瓨鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+
+												<span>{{item.stockQuantity}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鍗曚綅</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.unit}}</span>
+
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+							</view>
+			</u-cell-group>
+		</scroll-view>
+		<view class="view-fixed-two" style="width: 750rpx;text-align: center;">
+			<u-button type="success" text="纭畾" size="medium" :customStyle="{borderRadius:'0rpx'}"
+				@click="addFeed()">纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				queryParams: {
+					workstationId: null
+				},
+				list: [],
+				backgroundColor:{
+					selectedColor:'#bbf59c',
+					unSelectedColor:'#ffffff'
+				}
+			};
+		},
+		onLoad(params) {
+			if (params && params.workstationId !== "undefined") {
+				this.queryParams.workstationId=params.workstationId
+				this.loadList();
+			}
+		},
+		onShow() {
+		  },
+		methods: {
+			materialCardClick(item) {
+				item.selected = !item.selected
+			},
+			addFeed(){
+				let selectedFeedList=[]
+				this.list.forEach((item) => {
+					if(item.selected){
+						selectedFeedList.push(item)
+					}
+				})
+				this.refreshLastPage(selectedFeedList)
+			},
+			loadList() {
+				let that=this
+				that.$u.api.pigxFeed.getFeedingStock(that.queryParams).then(res => {
+					that.list = res.data
+					that.list.forEach((item) => {
+						that.$set(item, 'selected', false)
+					})
+				});
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(selectedFeedList) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+			
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+			
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.selectWorkstationFeed(selectedFeedList)
+			
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.custom-edit-input {
+		border-bottom: 2rpx solid #F8F8F8;
+	}
+
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	.workstation-feed-list{
+		background-color: #F8F8F8;
+	}
+	.workstation-feed-list-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+	.workstation-feed-view{
+		margin-left: 30rpx;
+		margin-right: 30rpx;
+		margin-top: 30rpx;
+		border-radius: 20rpx;
+		padding-left: 10rpx;
+		padding-right: 10rpx;
+		padding-bottom: 10rpx;
+	}
+</style>
diff --git a/pages/product/outputRegister/workstationList.vue b/pages/product/outputRegister/workstationList.vue
new file mode 100644
index 0000000..036ea00
--- /dev/null
+++ b/pages/product/outputRegister/workstationList.vue
@@ -0,0 +1,156 @@
+<template>
+	<view class="wrap">
+		<view class="search">
+			<u-search v-model="query.workstationNo" placeholder="璇疯緭鍏ュ伐浣滅珯缂栧彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+
+			<u-cell-group class="list" :border="false">
+				<view class="content" v-for="(item, index) in workStationList" :key="item.workstationNo" :index="index"
+					@click="selectWorkstation(item)">
+					<view class="row-list">
+						<span class="span-lable">宸ヤ綔绔欑紪鍙�: </span>{{ item.workstationNo }}
+					</view>
+					<view class="row-list">
+						<span class="span-lable">宸ヤ綔绔欏悕绉�: </span>{{ item.name }}
+					</view>
+					<view class="row-list">
+						<span class="span-lable">澶囨敞: </span>{{ item.remark }}
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>		
+		<scan></scan>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+		   scan
+		  },
+		data() {
+			return {
+				query: {
+					current: 1,
+					size: 20
+				},
+				workStationList: [],
+				loadStatus: 'loadmore',
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			let that = this
+			  
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+			 console.log('onscan');
+			 //鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+			 console.log('鎵爜缁撴灉锛�', data.code);
+				let sanCode=data.code
+				let formatData = JSON.parse(sanCode.replace(/\n/g,"").replace(/\s*/g,''));
+				// console.log('formatData锛�', formatData);
+				// console.log('formatData.lot_batch_no锛�', formatData.workstation);
+				
+				if(formatData.workstation!=""||formatData.workstation!=undefined)
+				{
+					that.findWorkstation(formatData.workstation)
+				}
+						
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+		
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			findWorkstation(workstationNo){
+				let queryParam={
+					current:1,
+					size:20,
+					workstationNo:workstationNo
+				}
+				this.$u.api.outputRegister.fetchWorkstationList(queryParam).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.$u.toast('鏈壘鍒板搴斿伐浣滅珯');
+					}else{
+						this.selectWorkstation(res.data.records[0])
+					}
+				});
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				// 鏌ヨ宸ヤ綔绔欏垪琛�
+				this.$u.api.outputRegister.fetchWorkstationList(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+				
+					this.workStationList = this.workStationList.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			search(value) {
+				this.workStationList = [];
+				this.query.current = 1;
+				this.query.workstationNo = value;
+				this.loadList();
+			},
+			selectWorkstation(workstation) {
+				this.refreshLastPage(workstation)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(workstation) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setWorkstation(workstation)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+</style>
diff --git a/pages/product/pick/ifsLocationList.vue b/pages/product/pick/ifsLocationList.vue
new file mode 100644
index 0000000..8b2e422
--- /dev/null
+++ b/pages/product/pick/ifsLocationList.vue
@@ -0,0 +1,132 @@
+<template>
+	<view class="wrap">
+		<view>
+			<view class="search">
+				<u-search v-model="query.locationDesc" @custom="search" @search="search" placeholder="搴撲綅鎻忚堪"></u-search>
+			</view>
+		<scroll-view class="scroll-list" scroll-y="true">
+			<u-cell-group class="list" :border="false">
+				<view class="content" v-for="(item, index) in locationList" :key="item.id" :index="index" @click="locationCardClick(item)">
+					<view class="row-list location-row">
+						<span class="span-lable">搴撲綅鍙�: </span>{{ item.locationNo }}
+					</view>
+					<view class="row-list location-row">
+						<span class="span-lable">浠撳簱: </span>{{ item.warehouseDesc }}
+					</view>
+					<view class="row-list location-row">
+						<span class="span-lable">搴撲綅鎻忚堪: </span>{{ item.locationDesc }}
+					</view>
+					<view class="row-list location-row">
+						<span class="span-lable">搴撲綅绫诲瀷: </span>{{ item.locationTypeDesc }}
+					</view>
+				</view>
+				<view v-if="locationList.length===0">
+					<view style="text-align: center;">
+						<span>鏈煡璇㈠埌IFS搴撲綅璁板綍</span>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		</view>
+		<!--<view style="position: absolute;bottom: 0">
+			<view style="height: 50rpx;display: flex;align-items: flex-end;">
+				<u-button type="success" text="搴撲綅鎵爜" size="medium"
+					:customStyle="{width:'750rpx',borderRadius:'0rpx'}" @click="scanLocationCodeClick()">搴撲綅鎵爜
+				</u-button>
+			</view>
+		</view>-->
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				locationList: [],
+				originList: [],
+				query:{locationDesc:''}
+			};
+		},
+		onLoad() {
+			   this.loadList();
+		},
+		onShow() {
+			
+		},
+		methods: {
+			loadList() {
+				// 鏌ヨ搴撲綅鍒楄〃
+				this.$u.api.ifsLocation.page(this.query).then(res => {
+					let _code =res.code
+					let _data =res.data
+					if(_code===0){
+					          this.locationList = _data.map((item, index) => {
+					            return {
+					              id: index + 1,
+					              locationNo: item.LOCATION_NO,
+					              locationDesc: item.LOCATION_DESC,
+					              locationGroupDesc: item.LOCATION_GROUP_DESC,
+					              locationTypeDesc: item.LOCATION_TYPE_DESC,
+								  warehouseDesc: item.WAREHOUSE_DESC
+					            }
+					          })
+							  }else{
+								  this.locationList=[]
+							  }
+				})
+			},
+			search(value){
+				this.locationList = [];
+				this.query.locationDesc = value;
+				this.loadList();
+			},
+			scanLocationCodeClick() {
+				uni.scanCode({
+					scanType: ['qrCode'],
+					success: function(res) {
+						console.log('鏉$爜绫诲瀷锛�' + res.scanType);
+						console.log('鏉$爜鍐呭锛�' + res.result);
+					},
+					fail: function() {
+						console.log('鎵爜澶辫触');
+					}
+				});
+			},
+			locationCardClick(task) {
+				this.refreshLastPage(task)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(task) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setMaterialLocation(task)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	.location-row{
+		display: flex;
+		justify-content:space-between;
+	}
+</style>
diff --git a/pages/product/pick/ifsStock.vue b/pages/product/pick/ifsStock.vue
new file mode 100644
index 0000000..6cfa685
--- /dev/null
+++ b/pages/product/pick/ifsStock.vue
@@ -0,0 +1,180 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list ifs-stock-scan-record" scroll-y="true">
+			<u-cell-group class="list ifs-stock-scan-record-cell" :border="false">
+				<u-card :title="item.partName" :sub-title="item.partNo" v-for="(item, index) in stockList" :key="item.id"
+					:index="item.id" :showHead="showCardHead" @click="stockCardClick(item)" :bodyStyle="item.selected?bodyStyle:{}">
+					<view slot="body">
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="stock-val-col">
+											    <span>{{item.partNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鎻忚堪</span>
+										</u-col>
+										<u-col span="8">
+											<view class="stock-val-col">
+											    <span>{{item.partDesc}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">搴撲綅</span>
+										</u-col>
+										<u-col span="8">
+											<view class="stock-val-col">
+											    <span>{{item.locationDesc}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鎵规鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="stock-val-col">
+											    <span>{{item.batchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">WDR</span>
+										</u-col>
+										<u-col span="8">
+											<view class="stock-val-col">
+											    <span>{{item.wdr}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鍙敤搴撳瓨</span>
+										</u-col>
+										<u-col span="8">
+											<view class="stock-val-col">
+											    <span>{{item.available}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+					</view>
+				</u-card>
+			</u-cell-group>
+		</scroll-view>
+		<view class="view-fixed-two ifs-stock-bottom-btns">
+				<u-button type="success" text="纭畾" size="medium"
+					@click="toFindMaterialNeed()">纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				showCardHead: false,
+				stockList: [],
+				bodyStyle: {
+					background: '#bbf59c'
+				}
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+
+		},
+		methods: {
+			loadList(){
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()		
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+				this.stockList=prevPage.$vm.getIsfStockList()
+				
+			},
+			stockCardClick(item){
+				item.selected=!item.selected
+				this.stockList.forEach((el)=>{
+					if(el!==item){
+						el.selected=false
+					}
+				})
+			},
+			toFindMaterialNeed() {
+				let selectStock=this.stockList.find((item)=>{
+					return item.selected
+				})
+				if(selectStock){
+					this.refreshLastPage(selectStock)
+				}else{
+					this.$u.toast('璇烽�夋嫨IFS搴撳瓨');
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(item) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+			
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+			
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.findMaterial(item)
+			
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+			
+		}
+	};
+</script>
+<style lang="scss">
+	.stock-val-col{
+		 display: flex;
+		 justify-content:flex-end;
+	}
+	.ifs-stock-scan-record {
+		background-color: #F8F8F8;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 100rpx);
+	}
+
+	.ifs-stock-scan-record-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+
+	.ifs-stock-bottom-btns{
+		width: 750rpx;
+		height: 100rpx;
+		background-color: #fff;
+		display: flex;
+		justify-content:center;
+		align-items: center;
+	}
+	
+</style>
diff --git a/pages/product/pick/index.vue b/pages/product/pick/index.vue
new file mode 100644
index 0000000..ed28ad3
--- /dev/null
+++ b/pages/product/pick/index.vue
@@ -0,0 +1,126 @@
+<template>
+	<view class="wrap">
+		<view class="search">
+			<u-search v-model="query.transportsNo" @custom="search" @search="search" placeholder="璐х洏杩愯緭浠诲姟鏍囪瘑鍙�"></u-search>
+		</view>
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.transportsNo" :sub-title="item.transportsNo" v-for="(item, index) in list" :key="item.id"
+					:index="item.id" @click="cardClick(item.id)" >
+					<view slot="head">
+						<view class="row-list">
+							<span class="span-lable">銆愪换鍔℃爣璇嗗彿銆憑{item.transportsNo}}</span>
+						</view>
+					</view>
+					<view slot="body">
+						<view class="row-list">
+							<u-row justify="space-between">
+								<u-col span="4">
+									<span class="span-lable">鐗╂枡闇�姹�: </span>
+								</u-col>
+								<u-col span="4">
+									<u-button type="primary" size="mini" style="height: 80rpx;line-height: 80rpx;width: 100rpx;" @click="requirePartClick(item.id)">鏌ョ湅</u-button>
+								</u-col>
+							</u-row>
+						</view>
+						<view class="row-list">
+							<u-row justify="space-between">
+								<u-col span="4">
+									<span class="span-lable">绉诲簱鏄庣粏: </span>
+								</u-col>
+								<u-col span="4">
+									<u-button type="primary" size="mini" style="height: 80rpx;line-height: 80rpx;width: 100rpx;" @click="moveDetailClick(item.id)">鏌ョ湅</u-button>
+								</u-col>
+							</u-row>
+						</view>
+						
+						<view class="row-list">
+							<u-row justify="space-between">
+								<u-col span="4">
+									<span class="span-lable">鍒涘缓鏃堕棿: </span>
+								</u-col>
+								<u-col span="7">
+									<view><span class="span-lable">{{item.createTime}}</span></view>
+								</u-col>
+							</u-row>
+						</view>
+					</view>
+					
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore'
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			/*if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}*/
+		},
+		methods: {
+			moveDetailClick(id){
+				uni.navigateTo({
+					url: '/pages/product/pick/moveDetailRecordList?id='+id
+				})
+			},
+			requirePartClick(id) {
+				uni.navigateTo({
+					url: '/pages/product/pick/requirePartRecordList?id='+id
+				})
+			},
+			cardClick(id) {
+				console.log('adasdad')
+				uni.navigateTo({
+					url: '/pages/product/pick/materialTransfer?id=' + id
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.palletTransports.page(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					//this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.query.transportsNo = value;
+				this.loadList();
+			}
+		}
+	};
+</script>
diff --git a/pages/product/pick/materialNeed.vue b/pages/product/pick/materialNeed.vue
new file mode 100644
index 0000000..62746ed
--- /dev/null
+++ b/pages/product/pick/materialNeed.vue
@@ -0,0 +1,179 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list material-need-scan-record" scroll-y="true">
+			<u-cell-group class="list material-need-scan-record-cell" :border="false">
+				<u-card :title="item.partName" :sub-title="item.partNo" v-for="(item, index) in materialNeedList" :key="item.id"
+					:index="item.id" :showHead="showCardHead" @click="materialNeedCardClick(item)" :bodyStyle="item.selected?bodyStyle:{}">
+					<view slot="body">
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="material-need-val-col">
+											    <span>{{item.partNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鎻忚堪</span>
+										</u-col>
+										<u-col span="8">
+											<view class="material-need-val-col">
+											    <span>{{item.partDesc}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闇�姹傛暟閲�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="material-need-val-col">
+											    <span>{{item.demandQuantity}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">绉诲簱鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view class="material-need-val-col">
+											    <span>{{item.transferQuantity}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鍓╀綑鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view class="material-need-val-col">
+											    <span>{{item.surplusQuantity}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">IFS鑷冲簱浣�</span>
+										</u-col>
+										<u-col span="8">
+											<view class="material-need-val-col">
+											    <span>{{item.toIfsLocationNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+					</view>
+				</u-card>
+			</u-cell-group>
+		</scroll-view>
+		<view class="view-fixed-two material-need-bottom-btns">
+				<u-button type="success" text="纭畾" size="medium"
+					@click="toSaveDetail()">纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				showCardHead: false,
+				materialNeedList: [],
+				bodyStyle: {
+					background: '#bbf59c'
+				}
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+
+		},
+		methods: {
+			loadList(){
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()		
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+				this.materialNeedList=prevPage.$vm.getMaterialNeedList()
+			},
+			materialNeedCardClick(item){
+				item.selected=!item.selected
+				this.materialNeedList.forEach((el)=>{
+					if(el!==item){
+						el.selected=false
+					}
+				})
+			},
+			toSaveDetail() {
+				let materialNeed=this.materialNeedList.find((item)=>{
+					return item.selected
+				})
+				if(materialNeed){
+					this.refreshLastPage(materialNeed)
+				}else{
+					this.$u.toast('璇烽�夋嫨鐗╂枡闇�姹�');
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(materialNeed) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+			
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+			
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.saveDetail(materialNeed)
+			
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+			
+		}
+	};
+</script>
+<style lang="scss">
+	.material-need-val-col{
+		 display: flex;
+		 justify-content:flex-end;
+	}
+	.material-need-scan-record {
+		background-color: #F8F8F8;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 100rpx);
+	}
+
+	.material-need-scan-record-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+
+	.material-need-bottom-btns{
+		width: 750rpx;
+		height: 100rpx;
+		background-color: #fff;
+		display: flex;
+		justify-content:center;
+		align-items: center;
+	}
+	
+</style>
diff --git a/pages/product/pick/materialTransfer.vue b/pages/product/pick/materialTransfer.vue
new file mode 100644
index 0000000..6210972
--- /dev/null
+++ b/pages/product/pick/materialTransfer.vue
@@ -0,0 +1,582 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list material-transfer-detail" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list material-transfer-detail-cell" :border="false">
+				<u-card :title="item.partNo" :sub-title="item.partNo" v-for="(item, index) in list" :key="item.id"
+					:index="item.id" @click="materialCardClick(item)" :showHead="showCardHead"
+					:bodyStyle="item.selected?bodyStyle:{}">
+					<view slot="body">
+							<view class="item u-border-bottom" 
+								>
+								<view>
+									<view style="text-align: right;">
+										<u-button type="primary" style="height: 80rpx;line-height: 80rpx;width: 100rpx;" text="鏇存柊" size="mini"
+											@click.stop="updateDetail(item.id)">鏇存柊</u-button>
+											<u-button type="error" style="height: 80rpx;line-height: 80rpx;width: 100rpx;" text="鍒犻櫎" size="mini" :customStyle="{marginLeft:'20rpx'}"
+												@click.stop="deleteDetail(item.id)">鍒犻櫎</u-button>
+									</view>
+								</view>
+								<view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">闆朵欢鎻忚堪</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.partDesc}}</span>
+
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">鎵规鍙�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.batchNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">绉诲簱鏁伴噺</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<u-input class="custom-edit-input" v-model="item.transferQuantity"
+													type="text" :clearable=false height="50">
+												</u-input>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">IFS浠庡簱浣�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+
+												<span>{{item.fromIfsLocationNo}}</span>
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								<view class="row-list">
+									<u-row justify="space-between">
+										<u-col span="4">
+											<span class="span-lable">IFS鑷冲簱浣�</span>
+										</u-col>
+										<u-col span="8">
+											<view>
+												<span>{{item.toIfsLocationNo}}</span>
+
+											</view>
+										</u-col>
+									</u-row>
+								</view>
+								</view>
+							</view>
+					</view>
+
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<!--<view class="view-fixed-one">
+			<u-button type="success" text="鎵爜" size="medium" 
+				@click="scanMaterialCodeClick()">鎵爜</u-button>
+		</view>-->
+		<view class="view-fixed-two">
+			<u-button type="success" text="搴撲綅" style="height: 80rpx;line-height: 80rpx;" size="medium" :customStyle="{borderRadius:'0rpx'}"
+				@click="toLocations()">搴撲綅</u-button>
+			<u-button type="success" text="鎵ц" style="height: 80rpx;line-height: 80rpx;" size="medium"
+				:customStyle="{width:'320rpx',marginLeft:'30rpx',borderRadius:'0rpx'}" @click="executeMove()">鎵ц</u-button>
+		</view>
+		<scan></scan>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+		   scan
+		  },
+		data() {
+			return {
+				showCardHead: false,
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				options: [{
+						text: '鏇存柊',
+						style: {
+							backgroundColor: '#007aff'
+						}
+					},
+					{
+						text: '鍒犻櫎',
+						style: {
+							backgroundColor: '#dd524d'
+						}
+					}
+				],
+				loadStatus: 'loadmore',
+				bodyStyle: {
+					background: '#bbf59c'
+				},
+				isfStockList: [],
+				materialNeedList: [],
+				transportsId: null,
+				currStock: null
+			};
+		},
+		onLoad(params) {
+			if (params && params.id !== "undefined") {
+				this.transportsId = params.id
+				this.query.transportsId = params.id
+				this.loadList();
+			}
+		},
+		onShow() {
+		   
+		   let that = this
+		     
+		   uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+		   uni.$on('scan', function(data) {
+		    console.log('onscan');
+		    //鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+		    console.log('鎵爜缁撴灉锛�', data.code);
+			let sanCode=data.code
+		    let formatData = JSON.parse(sanCode.replace(/\n/g,"").replace(/\s*/g,''));
+			console.log('formatData锛�', formatData);
+			console.log('formatData.BatchNumber锛�', formatData.BatchNumber);
+			
+			let materialInfo={
+				batchNo: formatData.BatchNumber,
+				partNo:  formatData.erpPartNo,
+				wdr: formatData.wdr
+			}
+			that.scanMaterialCodeClick(materialInfo)
+		   })
+		  },
+		  onNavigationBarButtonTap(e) {
+		  	uni.scanCode({
+		  		success: res => {
+		  			try {
+		  				const result = JSON.parse(res.result)
+		  
+		  			} catch (e) {}
+		  		}
+		  	});
+		  },
+		methods: {
+			updateDetail(id){
+				let k = this.list.findIndex(
+					(item) => item.id === id
+				)
+				let material = this.list.find((item) => {
+					return item.id === id
+				})
+				let transportsDetail = {
+					id: id,
+					transferQuantity: material.transferQuantity
+				}
+				
+				this.$u.api.palletTransportsDetail.updateDetail(transportsDetail).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.list[k].show = false;
+						this.$u.toast(`鏇存柊鎴愬姛`);
+						this.search('')
+					} else {
+						this.$u.toast('鏇存柊澶辫触');
+					}
+				
+				});
+			},
+			deleteDetail(id){
+				let k = this.list.findIndex(
+					(item) => item.id === id
+				)
+				let transportsDetail = {
+					id: id
+				}
+				
+				this.$u.api.palletTransportsDetail.delObj(transportsDetail).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.list.splice(k, 1);
+						this.$u.toast('鍒犻櫎鎴愬姛');
+						this.search('')
+					} else {
+						this.$u.toast('鍒犻櫎澶辫触');
+					}
+				});
+			},
+			clickOperateBtn(id, index1) {
+				let k = this.list.findIndex(
+					(item) => item.id === id
+				)
+				if (index1 == 1) {
+					let transportsDetail = {
+						id: id
+					}
+					
+					this.$u.api.palletTransportsDetail.delObj(transportsDetail).then(res => {
+						let _code = res.code
+						let _data = res.data
+						let _msg = res.msg
+						if (_code === 0) {
+							this.list.splice(k, 1);
+							this.$u.toast('鍒犻櫎鎴愬姛');
+							this.search('')
+						} else {
+							this.$u.toast('鍒犻櫎澶辫触');
+						}
+					});
+
+				} else {
+					let material = this.list.find((item) => {
+						return item.id === id
+					})
+					let transportsDetail = {
+						id: id,
+						transferQuantity: material.transferQuantity
+					}
+					
+					this.$u.api.palletTransportsDetail.updateDetail(transportsDetail).then(res => {
+						let _code = res.code
+						let _data = res.data
+						let _msg = res.msg
+						if (_code === 0) {
+							this.list[k].show = false;
+							this.$u.toast(`鏇存柊鎴愬姛`);
+							this.search('')
+						} else {
+							this.$u.toast('鏇存柊澶辫触');
+						}
+					
+					});
+				}
+			},
+			// 濡傛灉鎵撳紑涓�涓殑鏃跺�欙紝涓嶉渶瑕佸叧闂叾浠栵紝鍒欐棤闇�瀹炵幇鏈柟娉�
+			openOperateBtn(id) {
+				// 鍏堝皢姝e湪琚搷浣滅殑swipeAction鏍囪涓烘墦寮�鐘舵�侊紝鍚﹀垯鐢变簬props鐨勭壒鎬ч檺鍒讹紝
+				// 鍘熸湰涓�'false'锛屽啀娆¤缃负'false'浼氭棤鏁�
+				let k = this.list.findIndex(
+					(item) => item.id === id
+				)
+				this.list[k].show = true;
+				this.list.map((val, idx) => {
+					if (k != idx) this.list[idx].show = false;
+				})
+			},
+			setMaterialLocation(loc) {
+				let transportsDetails = []
+				this.list.forEach((item) => {
+					if (item.selected) {
+						transportsDetails.push({
+							id: item.id,
+							toIfsLocationNo: loc.locationNo
+						})
+					}
+				})
+				this.$u.api.palletTransportsDetail.updateBatch(transportsDetails).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.$u.toast('鏇存柊IFS浠庡簱浣嶆垚鍔�');
+						this.search('')
+					} else {
+						this.$u.toast('鏇存柊IFS浠庡簱浣嶅け璐�');
+					}
+
+				});
+			},
+			toLocations() {
+				let selectFlag = false
+				this.list.forEach((item) => {
+					if (item.selected) {
+						selectFlag = true
+					}
+				})
+				if (selectFlag) {
+					uni.navigateTo({
+						url: '/pages/product/pick/ifsLocationList',
+					})
+				} else {
+					this.$u.toast('璇烽�夋嫨绉诲簱鏄庣粏');
+				}
+			},
+			scanMaterialCodeClick(materialInfo) {
+				//鎵爜 杩斿洖part_no銆乴ot_batch_no銆亀dr
+				//璋冪敤IFS搴撳瓨鏌ヨ鎺ュ彛锛岃嫢杩斿洖澶氭潯搴撳瓨锛岄渶璺宠浆鑷矷FS搴撳瓨鍒楄〃閫夋嫨鏌愭潯搴撳瓨
+				//閫変腑鏌愭潯搴撳瓨鍚庯紝璋冪敤鐗╂枡闇�姹傛煡璇㈡帴鍙o紝鑻ュ瓨鍦ㄥ鏉$墿鏂欓渶姹傦紝鍒欒烦杞嚦鐗╂枡闇�姹傚垪琛ㄩ�夋嫨鏌愭潯鐗╂枡闇�姹�
+				//淇濆瓨褰撳墠绉诲簱鏄庣粏锛屽苟灏嗚鏉$Щ搴撴槑缁嗘覆鏌撳埌椤甸潰
+				let queryParam = {
+					batchNo: materialInfo.batchNo,
+					partNo:  materialInfo.partNo,
+					transportsId: this.transportsId,
+					wdr: materialInfo.wdr
+				}
+				this.$u.api.ifsStock.page(queryParam).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					this.isfStockList = []
+					if (_code === 0) {
+						if (_data != null && _data.length > 0) {
+							if (_data.length > 1) {
+								_data.forEach((item, index) => {
+									this.isfStockList.push({
+										id: index + 1,
+										partNo: item.PART_NO,
+										partDesc: item.PART_DESC,
+										locationDesc: item.LOCATION_DESC,
+										locationNo: item.LOCATION_NO,
+										batchNo: item.LOT_BATCH_NO,
+										wdr: item.WAIV_DEV_REJ_NO,
+										available: item.QTY_AVAILABLE,
+										unit: item.UNIT_MEAS_DESC,
+										engChgLevel: item.ENG_CHG_LEVEL,
+										planMoveQuality: item.QTY_AVAILABLE,
+										selected: false
+									})
+								})
+								uni.navigateTo({
+									url: '/pages/product/pick/ifsStock',
+								})
+							} else {
+								this.currStock = {
+									id: 1,
+									partNo: _data[0].PART_NO,
+									partDesc: _data[0].PART_DESC,
+									locationDesc: _data[0].LOCATION_DESC,
+									locationNo: _data[0].LOCATION_NO,
+									batchNo: _data[0].LOT_BATCH_NO,
+									wdr: _data[0].WAIV_DEV_REJ_NO,
+									available: _data[0].QTY_AVAILABLE,
+									unit: _data[0].UNIT_MEAS_DESC,
+									engChgLevel: _data[0].ENG_CHG_LEVEL,
+									planMoveQuality: _data[0].QTY_AVAILABLE
+								}
+								this.queryMaterialNeedList(queryParam.partNo)
+							}
+						} else {
+							this.$u.toast('鏈壘鍒癐FS搴撳瓨');
+						}
+
+					} else {
+
+					}
+				});
+			},
+			getIsfStockList() {
+				return this.isfStockList
+			},
+			getMaterialNeedList() {
+				return this.materialNeedList
+			},
+			findMaterial(ifsStock) {
+				this.currStock = ifsStock
+				this.queryMaterialNeedList(ifsStock.partNo)
+			},
+			//鏍规嵁闆朵欢鍙峰幓鏌ヨ鐗╂枡闇�姹�
+			queryMaterialNeedList(partNo) {
+				let queryParam = {
+					current: 1,
+					size: 100,
+					transportsId: this.transportsId,
+					partNo: partNo
+				}
+				this.$u.api.palletTransportsMaterial.page(queryParam).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					this.materialNeedList = []
+					if (_code === 0) {
+						if (_data.records != null && _data.records.length > 0) {
+							if (_data.records.length > 1) {
+								_data.records.forEach((item, index) => {
+									this.materialNeedList.push({
+						   	id: item.id,
+										partDesc: item.partDesc,
+										demandQuantity: item.demandQuantity,
+										partId: item.partId,
+										partNo: item.partNo,
+										surplusQuantity: item.surplusQuantity,
+										toIfsLocationName: item.toIfsLocationName,
+										toIfsLocationNo: item.toIfsLocationNo,
+										transferQuantity: item.transferQuantity,
+										unit: item.unit,
+										transportsId: item.transportsId,
+										detailExistState: item.detailExistState,
+										selected: false
+									})
+								})
+								uni.navigateTo({
+									url: '/pages/product/pick/materialNeed',
+								})
+							} else {
+								let materialNeed = {
+									id: _data.records[0].id
+								}
+								this.saveDetail(materialNeed)
+							}
+						} else {
+							this.$u.toast('鏈壘鍒板搴旂殑鐗╂枡闇�姹�');
+						}
+					} else {
+
+					}
+				});
+			},
+			saveDetail(materialNeed) {
+				let postDetailParam = {
+					partNo: this.currStock.partNo,
+					partDesc: this.currStock.partDesc,
+					batchNo: this.currStock.batchNo,
+					wdr: this.currStock.wdr,
+					transferQuantity: this.currStock.planMoveQuality,
+					fromIfsLocationNo: this.currStock.locationNo,
+					transportsMaterialId: materialNeed.id,
+					transportsId: this.transportsId
+				}
+				this.$u.api.palletTransportsDetail.addDetail(postDetailParam).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					//淇濆瓨鏄庣粏鎴愬姛鏃�
+					if (_code === 0) {
+						this.$u.toast('娣诲姞绉诲簱鏄庣粏鎴愬姛');
+						this.search('')
+					} else {
+						this.$u.toast('娣诲姞绉诲簱鏄庣粏澶辫触');
+					}
+
+				});
+			},
+			executeMove(){
+				let moveFlag = true
+				let detailIds = []
+				this.list.forEach((item) => {
+					if (item.selected) {
+						detailIds.push(item.id)
+						if (item.state === '02submitted') {
+						    moveFlag = false
+						}
+					}
+				})
+				if(moveFlag){					
+					if(detailIds.length>0){
+						this.$u.api.palletTransports.executeMove(detailIds).then(res => {
+							let _code = res.code
+							let _data = res.data
+							let _msg = res.msg
+							//淇濆瓨鏄庣粏鎴愬姛鏃�
+							if (_code === 0) {
+								this.$u.toast('鎵ц鎴愬姛');
+								this.search('')
+							} else {
+								this.$u.toast('鎵ц澶辫触');
+							}
+						
+						});
+					}else{
+						this.$u.toast('璇烽�夋嫨宸插垱寤虹姸鎬佺殑鏄庣粏');
+					}
+				}else{
+					this.$u.toast('鍙湁宸插垱寤虹姸鎬佺殑鏄庣粏锛屾墠鑳借鎵ц');
+				}
+			},
+			materialCardClick(item) {
+				item.selected = !item.selected
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				let that=this
+				that.$u.api.palletTransportsDetail.page(that.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						that.loadStatus = "nomore";
+						return;
+					}
+					that.list = that.list.concat(res.data.records);
+					that.list.forEach((item) => {
+						that.$set(item, 'selected', false)
+						that.$set(item, 'show', false)
+					})
+					//this.total = res.data.total;
+					that.query.current = res.data.current;
+					that.query.size = res.data.size;
+					that.loadStatus = "loadmore";
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.$nextTick(() => {
+					this.loadList();
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.custom-edit-input {
+		border-bottom: 2rpx solid #F8F8F8;
+	}
+
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	.material-transfer-detail{
+		background-color: #F8F8F8;
+	}
+	.material-transfer-detail-cell {
+		::v-deep .u-cell-item-box {
+			background-color: #F8F8F8;
+		}
+	}
+</style>
diff --git a/pages/product/pick/moveDetailRecordList.vue b/pages/product/pick/moveDetailRecordList.vue
new file mode 100644
index 0000000..9783835
--- /dev/null
+++ b/pages/product/pick/moveDetailRecordList.vue
@@ -0,0 +1,98 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true"  @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<view class="content" v-for="(item, index) in moveDetailList" :key="item.id" :index="index">
+					<view class="row-list detail-row">
+						<span class="span-lable">闆朵欢缂栧彿: </span>{{ item.partNo }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">闆朵欢鎻忚堪: </span>{{ item.partDesc }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">鎵规鍙�: </span>{{ item.batchNo }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">WDR: </span>{{ item.wdr }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">绉诲簱鏁伴噺: </span>{{ item.transferQuantity }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">IFS浠庡簱浣�: </span>{{ item.fromIfsLocationNo }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">IFS鑷冲簱浣�: </span>{{ item.toIfsLocationNo }}
+					</view>
+					<view class="row-list detail-row">
+						<span class="span-lable">鐘舵��: </span>{{ item.state }}
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				moveDetailList: [],
+				query: {
+					current: 1,
+					size: 20
+				},
+				originList: [],
+				loadStatus: 'loadmore'
+			};
+		},
+		onLoad(params) {
+			if (params && params.id !== "undefined") {
+				this.query.transportsId=params.id 
+				this.loadList();
+			}
+		},
+		onShow() {
+			
+		},
+		methods: {
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.palletTransportsDetail.page(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.moveDetailList = this.moveDetailList.concat(res.data.records);
+					//this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	.detail-row{
+		display: flex;
+		justify-content:space-between;
+	}
+</style>
diff --git a/pages/product/pick/requirePartRecordList.vue b/pages/product/pick/requirePartRecordList.vue
new file mode 100644
index 0000000..3bd2d39
--- /dev/null
+++ b/pages/product/pick/requirePartRecordList.vue
@@ -0,0 +1,95 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<view class="content" v-for="(item, index) in requirePartList" :key="item.id" :index="index">
+					<view class="row-list part-row">
+						<span class="span-lable">闆朵欢缂栧彿: </span>{{ item.partNo }}
+					</view>
+					<view class="row-list part-row">
+						<span class="span-lable">闆朵欢鎻忚堪: </span>{{ item.partDesc }}
+					</view>
+					<view class="row-list part-row">
+						<span class="span-lable">闇�姹傛暟閲�: </span>{{ item.demandQuantity }}
+					</view>
+					<view class="row-list part-row">
+						<span class="span-lable">绉诲簱鏁伴噺: </span>{{ item.transferQuantity }}
+					</view>
+					<view class="row-list part-row">
+						<span class="span-lable">鍓╀綑鏁伴噺: </span>{{ item.surplusQuantity }}
+					</view>
+					<view class="row-list part-row">
+						<span class="span-lable">璁¢噺鍗曚綅: </span>{{ item.unit }}
+					</view>
+					<view class="row-list part-row">
+						<span class="span-lable">IFS鑷冲簱浣�: </span>{{ item.toIfsLocationNo }}
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				requirePartList: [],
+				query: {
+					current: 1,
+					size: 20
+				},
+				originList: [],
+				loadStatus: 'loadmore'
+			};
+		},
+		onLoad(params) {
+			if (params && params.id !== "undefined") {
+				this.query.transportsId=params.id 
+			this.loadList();
+			}
+		},
+		onShow() {
+			
+		},
+		methods: {
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.palletTransportsMaterial.page(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.requirePartList = this.requirePartList.concat(res.data.records);
+					//this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	.part-row{
+		display: flex;
+		justify-content:space-between;
+	}
+</style>
diff --git a/pages/product/produce/createReportWork.vue b/pages/product/produce/createReportWork.vue
new file mode 100644
index 0000000..06ce357
--- /dev/null
+++ b/pages/product/produce/createReportWork.vue
@@ -0,0 +1,664 @@
+<template>
+	<view class="page">
+		<view class="production-index-bg" />
+		<u-navbar title="浜у嚭" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+		<view class="wrap">
+			<view class="content">
+				<view class="content-body">
+					<view class="content-body-item param-extra" v-if="info.type!='group'">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">鐢熶骇浜哄憳锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<wu-button shape="circle" size="small" type="primary" @click="toDutyPerson">
+								鐐瑰嚮閫夋嫨
+							</wu-button>
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">闆朵欢缂栧彿锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<text class="_text">{{ info.partNo }}</text>
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">闆朵欢鍚嶇О锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<text class="_text">{{ info.partName }}</text>
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">SN鍙凤細</text>
+						</view>
+						<view class="content-body-item-right">
+							<text class="_text">{{ info.outBatchNo }}</text>
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">杞藉叿缂栧彿锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text u-input" v-model="info.reelNumber" placeholder="璇峰~鍐�" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">浜у嚭濂楁暟锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" type="number" v-model="info.disNumber" placeholder-style="color:#F76260" placeholder="璇峰~鍐�(蹇呭~)" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">姣忓浜ч噺锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<text class="_text">{{ info.productQty }}</text>
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">璧峰鏁伴噺锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" type="number" v-model="info.startMeterMark" placeholder-style="color:#F76260" placeholder="璇峰~鍐�(蹇呭~)" @blur="startMeterBlur" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">鎴鏁伴噺锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" type="number" v-model="info.endMeterMark" placeholder-style="color:#F76260" placeholder="璇峰~鍐�(蹇呭~)" @blur="endMeterBlur" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">璁¢噺鍗曚綅锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<text class="_text">{{info.unit}}</text>
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">鐢熶骇璇存槑锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" v-model="info.segmentDesc" placeholder="璇峰~鍐�" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">鎶ュ簾鏁伴噺锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" v-model="info.scrapQty" placeholder="璇峰~鍐�" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">杞藉叿閲嶉噺锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" v-model="info.reelWeight" placeholder="璇峰~鍐�" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">浜у嚭姣涢噸锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" v-model="info.grossWeight" placeholder="璇峰~鍐�" />
+						</view>
+					</view>
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">鐢熶骇浜哄憳锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<text class="_text">{{ info.staffName }}</text>
+						</view>
+					</view>
+					<view class="content-body-item">
+						<view class="content-body-item-left">
+							<text class="slot-box slot-text">澶囨敞璇存槑锛�</text>
+						</view>
+						<view class="content-body-item-right">
+							<input class="_text" v-model="info.mainRemark" placeholder="璇峰~鍐�" />
+						</view>
+					</view>
+				</view>
+				<view class="bottom">
+					<view class="bottom-btn">
+						<wu-button :custom-style="customStyleOne" size="normal" @click="onCancel">
+							鍙栨秷
+						</wu-button>
+					</view>
+					<view class="bottom-btn">
+						<wu-button :custom-style="customStyleTwo" size="normal" @click="onSubmit">
+							纭畾
+						</wu-button>
+					</view>
+				</view>
+				<!-- </form> -->
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+
+	export default {
+		components: {},
+		computed: {
+			customStyleOne() {
+				return {
+					color: '#666666',
+					background: '#FFFFFF',
+					width: '350rpx'
+				}
+			},
+			customStyleTwo() {
+				return {
+					color: '#FFFFFF',
+					background: '#234EED',
+					width: '350rpx'
+				}
+			},
+		},
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				info: {
+					partId: null,
+					partNo: null,
+					partName: null,
+					outBatchNo: null,
+					reelNumber: null,
+					disNumber: 1,
+					productQty: null,
+					startMeterMark: 0,
+					endMeterMark: null,
+					unit: null,
+					segmentDesc: null,
+					scrapQty: null,
+					reelWeight: null,
+					grossWeight: null,
+					staffName: null,
+					mainRemark: null,
+					productStaffIds: [],
+					productStaffs: [],
+					workstationId: null,
+					operationTaskId: null,
+					dutyRecordId: null,
+				},
+				dutyForm: [],
+				personInitList: [],
+				personBoardList: [],
+				products: [],
+			};
+		},
+		onLoad(option) {
+			if (option.params) {
+				const params = JSON.parse(decodeURIComponent(option.params));
+				this.info.partId = params.partId;
+				this.info.partNo = params.partNo;
+				this.info.partName = params.partName;
+				this.info.unit = params.unit;
+				this.info.workstationId = params.workstationId;
+				this.info.operationTaskId = params.operationTaskId;
+				this.info.dutyRecordId = params.dutyRecordId;
+				this.info.type = params.type;
+
+				//鑾峰彇褰撶彮浜哄憳
+				this.getPerson()
+			}
+		},
+		onShow() {
+
+		},
+		methods: {
+			onCancel() {
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			async getPerson() {
+				let queryParam = {
+					id: this.info.workstationId
+				}
+
+				let queryUserParam = {
+					id: this.info.dutyRecordId
+				}
+
+				let resUser = await this.$u.api.outputRegister.getPersonByDutyRecordId(queryUserParam)
+
+				let userList = resUser.data
+				if (userList.length > 0) {
+					this.personInitList = []
+					this.$set(this.info, 'staffName', "");
+					let staffName = ""
+					userList.map((item, index) => {
+
+						if (index == userList.length - 1) {
+							staffName = staffName + item.staffName
+						} else {
+							staffName = staffName + item.staffName + ","
+						}
+
+						let data = {
+							staffId: item.staffId,
+							staffName: item.staffName,
+							staffNo: item.staffNo,
+							checked: false
+						}
+
+						this.personInitList.push(data)
+					});
+
+					//type:shift  鎸夌彮缁�  person 鎸変汉鍛�
+					if (this.info.type == "group") {
+						this.personBoardList = this.personInitList
+						this.$set(this.info, 'staffName', staffName);
+					} else {
+						this.personBoardList = []
+						this.$set(this.info, 'staffName', "");
+					}
+				}
+			},
+			setProducts() {
+				let productStaffs = []
+				let productStaffIds = []
+				let newProduct = {}
+				this.products = []
+				//type:group  鎸夌彮缁�  person 鎸変汉鍛�
+				if (this.info.type == "group") {
+					// 鎸夌彮缁勬姤宸ワ紝涓�鏉¤褰�
+					let staffName = ''
+					let staffNo = ''
+					for (let i = 0; i < this.personBoardList.length; i++) {
+						staffName += this.personBoardList[i].staffName + ','
+						staffNo += this.personBoardList[i].staffNo + ','
+						productStaffs.push(this.personBoardList[i].staffNo)
+						productStaffIds.push(this.personBoardList[i].staffId)
+					}
+
+					staffName = staffName.substring(0, staffName.length - 1)
+					staffNo = staffNo.substring(0, staffNo.length - 1)
+
+					newProduct = {}
+					newProduct.staffName = staffName
+					newProduct.staffNo = staffNo
+					newProduct.productNo = null
+					newProduct.partId = this.info.partId
+					newProduct.partNo = this.info.partNo
+					newProduct.partName = this.info.partName
+					newProduct.outBatchNo = null
+					newProduct.disNumber = this.info.disNumber
+					newProduct.productQty = 0
+					newProduct.sproductQty = 0
+					newProduct.ifsBatchNo = null
+					newProduct.unit = this.info.unit
+					newProduct.productStaffs = productStaffs
+					newProduct.productStaffIds = productStaffIds
+					newProduct.status = false
+					newProduct.systemNo = null
+					newProduct.date = this.info.date
+					newProduct.dutyRecordId = this.info.dutyRecordId
+					newProduct.startMeterMark = this.info.startMeterMark
+					newProduct.endMeterMark = this.info.endMeterMark
+					newProduct.scrapQty = this.info.scrapQty
+					newProduct.segmentDesc = this.info.segmentDesc
+					newProduct.remark = null
+					newProduct.outBatchNo = null
+					newProduct.reelNumber = this.info.reelNumber
+					this.products.push(newProduct)
+
+				} else {
+					let newProduct
+					for (let i = 0; i < this.personBoardList.length; i++) {
+						newProduct = {}
+						productStaffs = []
+						productStaffIds = []
+						productStaffIds.push(this.personBoardList[i].staffId)
+						productStaffs.push(this.personBoardList[i].staffNo)
+						newProduct.staffName = this.personBoardList[i].staffName
+						newProduct.staffNo = this.personBoardList[i].staffNo
+						newProduct.productNo = null
+						newProduct.partId = this.info.partId
+						newProduct.partNo = this.info.partNo
+						newProduct.partName = this.info.partName
+						newProduct.outBatchNo = null
+						newProduct.disNumber = this.info.disNumber
+						newProduct.productQty = 0
+						newProduct.sproductQty = 0
+						newProduct.unit = this.info.unit
+						newProduct.productStaffs = productStaffs
+						newProduct.productStaffIds = productStaffIds
+						newProduct.status = true
+						newProduct.systemNo = null
+						newProduct.date = this.info.date
+						newProduct.dutyRecordId = this.info.dutyRecordId
+						newProduct.startMeterMark = this.info.startMeterMark
+						newProduct.endMeterMark = this.info.endMeterMark
+						newProduct.reelNumber = this.info.reelNumber
+						newProduct.ifsBatchNo = null
+						newProduct.scrapQty = this.info.scrapQty
+						newProduct.segmentDesc = this.info.segmentDesc
+						newProduct.remark = null
+						this.products.push(newProduct)
+					}
+				}
+			},
+			async onSubmit() {
+								
+				// 鐢熶骇浜哄憳
+				if (this.info.staffName==""||this.info.staffName==undefined||this.info.staffName==null) {
+				
+					this.$u.toast('鐢熶骇浜哄憳涓嶈兘涓虹┖')
+					return
+				}
+			    
+				//璁剧疆宸ュ崟淇℃伅
+				this.setProducts();
+			
+				for (let i = 0; i < this.products.length; i++) {
+			
+					// 鐩樻暟鏍¢獙
+					if (!this.isPositiveIntegerNumber(this.products[i].disNumber)) {
+			
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愮洏鏁般�戣杈撳叆姝f暣鏁帮紒')
+						return
+					}
+					// 璧峰绫虫爣鏍¢獙
+					if (!this.isNumber(this.products[i].startMeterMark)) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愯捣濮嬬背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+						return
+					}
+					// 鎴绫虫爣鏍¢獙
+					if (!this.isNumber(this.products[i].endMeterMark)) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+						return
+					}
+					// 鎴绫虫爣闇�澶т簬寮�濮嬬背鏍�
+					if (
+						Number(this.products[i].endMeterMark) <
+						Number(this.products[i].startMeterMark)
+					) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戦渶澶т簬銆愯捣濮嬬背鏍囥��')
+						return
+					}
+				}
+			
+				// 褰撳墠鏄骇鍑虹殑鏂板
+				const list = []
+				for (let i = 0; i < this.products.length; i++) {
+					let productVo = {}
+					productVo.isChangeShift = false
+					productVo.id = null
+					productVo.workstationId = this.info.workstationId
+					productVo.operationTaskId = this.info.operationTaskId
+					productVo.discsNumber = this.products[i].disNumber
+					let productOuts = []
+					let productOut = {}
+					productOut.workstationId = this.info.workstationId
+					productOut.operationTaskId = this.info.operationTaskId
+					productOut.partId = this.products[i].partId
+					productOut.disNumber = this.products[i].disNumber
+					productOut.productQty = this.products[i].productQty
+					productOut.sproductQty = this.products[i].sproductQty
+					productOut.productStaffs = this.products[i].productStaffs
+					productOut.productStaffIds = this.products[i].productStaffIds
+					productOut.outBatchNo = this.products[i].outBatchNo
+					productOut.status = this.products[i].status
+					productOut.dutyRecordId = this.products[i].dutyRecordId
+					productOut.startMeterMark = this.products[i].startMeterMark
+					productOut.endMeterMark = this.products[i].endMeterMark
+			
+					productOut.outBatchNo = this.products[i].outBatchNo
+					productOut.reelNumber = this.products[i].reelNumber
+					productOut.ifsBatchNo = this.products[i].ifsBatchNo
+					productOut.scrapQty = this.products[i].scrapQty
+					productOut.segmentDesc = this.products[i].segmentDesc
+					productOut.remark = this.products[i].remark
+			
+					productOuts.push(productOut)
+					productVo.productOutputList = productOuts
+					list.push(productVo)
+				}				
+			
+				let res = await this.$u.api.outputRegister.batchSaveProductMain(list)
+				let that = this
+			
+				if (res.code == 0) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '鎻愪氦鎴愬姛',
+						showCancel: false,
+						success: function() {
+							that.refreshLastPage()
+						}
+					})
+			
+				} else {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '鎻愪氦澶辫触',
+						showCancel: false,
+						success: function() {}
+					})
+				}
+			},
+			isNumber(value) {
+				var reg = /^[0-9]+(.[0-9]{1,4})?$/
+				if (
+					value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+			 } else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+					}
+				}
+			},
+			isPositiveIntegerNumber(value) {
+				var reg = /^[1-9]\d*$/
+				if (
+					value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+				} else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+					}
+				}
+			},
+			startMeterBlur(obj) {
+				if ((this.info.startMeterMark != "" ) && (this.info.endMeterMark!= "")) {
+					let qty = parseFloat(this.info.endMeterMark) - parseFloat(this.info.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(this.info, 'productQty', qty);
+				}	
+			},
+			endMeterBlur(obj) {	
+				if ((this.info.startMeterMark != "" ) && (this.info.endMeterMark!= "")) {
+					let qty = parseFloat(this.info.endMeterMark) - parseFloat(this.info.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(this.info, 'productQty', qty);
+				}
+			},
+			toDutyPerson() {
+				if (this.personInitList.length > 0) {
+					uni.navigateTo({
+						url: '/pages/product/outputRegister/dutyPersonList?item=' + encodeURIComponent(JSON
+							.stringify(this.personInitList))
+					})
+				}
+			},
+			setProductPerson(userList) {
+				//type:group  鎸夌彮缁�  person 鎸変汉鍛�
+				if (this.info.type == "person") {
+					//杩囨护鎺夐�変腑鐨勪汉鍛樹俊鎭�
+					userList = userList.filter(item => item.checked == true)
+					this.personBoardList = []
+					this.$set(this.info, 'staffName', "");
+					// this.personBoardList = userList
+					if (userList.length > 0) {
+						let staffName = ""
+						userList.map((item, index) => {
+			
+							if (index == userList.length - 1) {
+								staffName = staffName + item.staffName
+							} else {
+								staffName = staffName + item.staffName + ","
+							}
+			
+							let data = {
+								staffId: item.staffId,
+								staffName: item.staffName,
+								staffNo: item.staffNo,
+								checked: item.checked
+							}
+			
+							this.personBoardList.push(data)
+						});
+						this.$set(this.info, 'staffName', staffName);
+					}
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+			
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+			
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.refreshTrackingRecord()
+			
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.production-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.content {
+		font-size: 12px;
+		background-color: rgba(250, 252, 255, 0.36);
+		box-sizing: border-box;
+		border-radius: 10rpx;
+		margin: 0rpx 0rpx 24rpx;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 334rpx);
+		padding: 10rpx 20rpx;
+		box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+		position: relative;
+
+		.content-body {
+			margin-top: 20rpx;
+			background-color: white;
+			// height: 1030rpx;
+
+			.content-body-title {
+				font-size: 35rpx;
+				font-weight: bolder;
+				color: #1D2541;
+			}
+
+			.content-body-item {
+				// height: 90rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display: flex;
+				justify-content: space-between;
+				border: none;
+				margin: 0rpx 40rpx;
+				align-items: center;
+
+				.content-body-item-left {
+					line-height: 100rpx;
+					
+					
+					.slot-box {
+						font-size: 32rpx;
+					}
+				}
+
+				.content-body-item-right {
+					width: 400rpx;
+					line-height: 30rpx;
+					text-align: right;
+					._text {
+						font-size: 26rpx;
+					}
+				}
+			}
+
+			.param-extra {
+				border-bottom: 1px solid #D5D5D5;
+			}
+		}
+
+		.content-footer {
+			margin-top: 30rpx;
+			display: flex;
+			justify-content: flex-end;
+
+			.footer-button {
+				margin-right: 35rpx;
+			}
+		}
+
+		.bottom {
+			display: flex;
+			justify-content: space-between;
+			height: 100rpx;
+			margin-top: 30rpx;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/editReportWork.vue b/pages/product/produce/editReportWork.vue
new file mode 100644
index 0000000..04f025a
--- /dev/null
+++ b/pages/product/produce/editReportWork.vue
@@ -0,0 +1,292 @@
+<template>
+	<view class="wrap">
+		<view class="production-index-bg" />
+		<u-navbar title="缂栬緫浜у嚭" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+		<view class="content">
+			<scroll-view class="scroll-list edit-product-out-scroll" scroll-y="true">
+				<u-cell-group class="list" :border="false">
+					<u-card :title="item.username" :sub-title="item.phone" v-for="(item, index) in editProductOutList"
+						:key="item.id" :index="item.id" :showHead="showEditCardHead">
+						<view slot="body">
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">SN鍙凤細</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<span>{{item.outBatchNo}}</span>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">璧峰鏁伴噺锛�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.startMeterMark"
+												type="digit" :clearable=false height="50"
+												@blur="startMeterBlur(item)"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鎴鏁伴噺锛�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.endMeterMark"
+												:clearable=false height="50" type="digit"
+												@blur="endMeterBlur(item)"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鐢熶骇鏁伴噺锛�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<span>{{item.productQty}}</span>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鎶ュ簾鏁伴噺锛�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.scrapQty" :clearable=false
+												height="50" type="digit"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+							<view class="row-list">
+								<u-row justify="space-between">
+									<u-col span="4">
+										<span class="span-lable">鐢熶骇鎻忚堪锛�</span>
+									</u-col>
+									<u-col span="8">
+										<view>
+											<u-input class="custom-edit-input" v-model="item.segmentDesc" type="text"
+												:clearable=false height="50"></u-input>
+										</view>
+									</u-col>
+								</u-row>
+							</view>
+						</view>
+					</u-card>
+				</u-cell-group>
+			</scroll-view>
+		</view>
+		<view class="edit-product-out-btn-view">
+			<u-button text="纭畾" type="primary" size="medium" :customStyle="{width:'150rpx'}" @click="updateProductOut">
+				纭畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+
+	export default {
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				editProductOutList: [],
+				showEditCardHead: false
+			};
+		},
+		onLoad(params) {
+			if (params.item) {
+				let list = JSON.parse(decodeURIComponent(params.item));
+				this.editProductOutList = list
+			}
+		},
+		onShow() {
+
+		},
+		methods: {
+			startMeterBlur(item) {
+				if (item.endMeterMark !== "") {
+					let qty = parseFloat(item.endMeterMark) - parseFloat(item.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(item, 'productQty', qty);
+				}
+			},
+			endMeterBlur(item) {
+				if (item.startMeterMark !== "") {
+					let qty = parseFloat(item.endMeterMark) - parseFloat(item.startMeterMark)
+					qty = parseFloat(qty.toFixed(4))
+					this.$set(item, 'productQty', qty);
+				}
+			},
+			async updateProductOut() {
+
+				for (let i = 0; i < this.editProductOutList.length; i++) {
+
+					// 璧峰绫虫爣鏍¢獙
+					if (!this.isNumber(this.editProductOutList[i].startMeterMark)) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愯捣濮嬫暟閲忋�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+						return
+					}
+					// 鎴绫虫爣鏍¢獙
+					if (!this.isNumber(this.editProductOutList[i].endMeterMark)) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈡暟閲忋�戣杈撳叆闈炶礋鏁帮紝灏忔暟浣嶆渶澶�4浣嶏紒')
+						return
+					}
+					// 鎴绫虫爣闇�澶т簬寮�濮嬬背鏍�
+					if (
+						Number(this.editProductOutList[i].endMeterMark) <
+						Number(this.editProductOutList[i].startMeterMark)
+					) {
+						this.$u.toast('绗�' + (i + 1) + '琛岋紝銆愭埅姝㈢背鏍囥�戦渶澶т簬銆愯捣濮嬬背鏍囥��')
+						return
+					}
+				}
+
+				let data = []
+				this.editProductOutList.forEach((el) => {
+					let productVo = {}
+					productVo.id = el.id
+					let productOuts = []
+					let productOut = {}
+					productOut.startMeterMark = parseFloat(el.startMeterMark)
+					productOut.endMeterMark = parseFloat(el.endMeterMark)
+					productOut.productQty = el.productQty
+					productOut.segmentDesc = el.segmentDesc
+					productOut.scrapQty = el.scrapQty
+					productOut.ifsBatchNo = el.ifsBatchNo
+					productOut.reelNumber = el.reelNumber
+					productOut.remark = el.remark
+					productOuts.push(productOut)
+					productVo.productOutputList = productOuts
+					data.push(productVo)
+				})
+
+				let res = await this.$u.api.outputRegister.batchUpdateProductMain(data)
+				let that = this
+				if (res.code == 0) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '缂栬緫鎴愬姛',
+						showCancel: false,
+						success: function() {
+							that.refreshLastPage()
+							// setTimeout(()=> {								
+							// 	that.refreshLastPage()	
+							// 	}, 5500);							 				  
+						}
+					})
+
+				} else {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '缂栬緫澶辫触',
+						showCancel: false,
+						success: function() {}
+					})
+				}
+			},
+			isNumber(value) {
+				var reg = /^[0-9]+(.[0-9]{1,4})?$/
+				if (
+					value == undefined ||
+					value == null ||
+					value === '' ||
+					value.trim === ''
+				) {
+					return false
+				} else {
+					if (!reg.test(value)) {
+						return false
+					} else {
+						return true
+					}
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.refreshTrackingRecord()
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.production-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.content {
+		display: flex;
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 334rpx);
+		width: 100%;
+		line-height: 80rpx;
+		font-size: 28rpx;
+	}
+
+	.edit-product-out-scroll {
+		background-color: #f8f8f8;
+	}
+
+	.edit-product-out-scroll {
+		::v-deep .u-cell-item-box {
+			background-color: #f8f8f8;
+		}
+	}
+
+	.edit-product-out-btn-view {
+		display: flex;
+		justify-content: space-between;
+		margin-top: 20rpx;
+	}
+
+	.custom-edit-input {
+		border-bottom: 2rpx solid #F8F8F8;
+	}
+	
+	.row-list{
+		font-size: 32rpx;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/index.vue b/pages/product/produce/index.vue
new file mode 100644
index 0000000..6d619c8
--- /dev/null
+++ b/pages/product/produce/index.vue
@@ -0,0 +1,698 @@
+<template>
+	<view class="page">
+		<view class="production-index-bg" />
+		<u-navbar title="宸ュ崟鍒楄〃" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+		<view class="operation-task-param">
+			<view class="operation-task-param-view">
+				<view class="operation-task-param-item">
+					<view class="operation-task-param-item-left">
+						<text class="item-one">宸ヤ綔绔�</text>
+					</view>
+					<view class="operation-task-param-item-right">
+						<text class="item-one" @click="toWorkstation">( {{ workstationInfo.workCenter }} )  {{workstationInfo.workstationName}}</text>
+						<u-icon name="arrow-right" color="#687792" size="28" @click="toWorkstation"></u-icon>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="operation-task-list-search">
+			<u-search v-model="query.optaskNo" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false"
+				placeholder="宸ュ崟鍙�" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+		<view class="operation-task-tab">
+			<scroll-view id="tab-bar" class="scroll-h" :scroll-x="true" :show-scrollbar="false" enable-flex>
+				<view v-for="(tab,index) in tabBars" :key="tab.id" class="uni-tab-item" :id="tab.id"
+					:data-current="index" @click="ontabtap">
+					<text class="uni-tab-item-title"
+						:class="tabIndex==index ? 'uni-tab-item-title-active' : ''">{{tab.name}}</text>
+				</view>
+			</scroll-view>
+		</view>
+		<view class="line-h"></view>
+		<view class="wrap" :current="tabIndex" @change="ontabchange">
+			<scroll-view class="operation-task-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+				<u-cell-group class="operation-task-scroll-list-group" :border="false">
+					<div class="tip" style="text-align:center;" v-if="list.length==0">-鏆傛棤宸ュ崟-</div>
+					<view class="content" v-for="(item, index) in list" :key="item.id" :index="index" @click="goDetail(item)">
+						<view class="content-header">
+							<view class="header-item-top">
+								<viem class="header-item-right" @click.stop="toReportWork(item)">
+									<wu-button :custom-style="customStyle" size="mini" class="header-item-button" >
+										鎶ュ伐
+										<image src="/static/custom/operationTask/enter-icon.png"
+											style="width: 30rpx; height: 30rpx; padding-left: 5rpx; "></image>
+									</wu-button>
+								</viem>
+								<view class="header-item-left">
+									<view class="content-header-icon-one"></view>
+									<view class="content-header-title">宸ュ崟缂栧彿锛�</view>
+									<view class="content-header-value">{{ item.optaskNo }}</view>
+								</view>
+							</view>
+							<view class="header-item-top">
+								<view class="header-item-left">
+									<view class="content-header-icon-one"></view>
+									<view class="content-header-title">闆朵欢鍚嶇О锛�</view>
+									<view class="content-header-value">{{ item.partName }}</view>
+								</view>
+							</view>
+							<view class="header-item-top">
+								<view class="header-item-left">
+									<view class="content-header-icon-one"></view>
+									<view class="content-header-title">闆朵欢缂栧彿锛�</view>
+									<view class="content-header-value">{{ item.partNo }}</view>
+								</view>
+							</view>
+							<view class="header-item-top">
+								<view class="header-item-left">
+									<view class="content-header-icon-one"></view>
+									<view class="content-header-title">璁″垝缂栧彿锛�</view>
+									<view class="content-header-value">{{ item.mpsNo }}</view>
+								</view>
+							</view>
+							<view class="header-item-top">
+								<view class="header-item-left">
+									<view class="content-header-icon-one"></view>
+									<view class="content-header-title">鎴愬搧鍚嶇О锛�</view>
+									<view class="content-header-value">{{ item.productName }}</view>
+								</view>
+							</view>
+						</view>
+						<view class="content-footer">
+							<view class="row-list">
+								<view class="content-footer-time-icon"></view>
+								<view class="_label">
+									璁″垝瀹屾垚鏃堕棿锛�
+								</view>
+								<view class="_content">
+									{{ item.planFinishDay }}
+								</view>
+							</view>
+							<view class="progress-box">
+								<progress :percent="item.ratio" show-info stroke-width="8" />
+							</view>
+						</view>
+					</view>
+				</u-cell-group>
+				<view class="loadmore" @click="loadMore">
+					<u-loadmore :status="loadStatus"></u-loadmore>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+
+	// 缂撳瓨姣忛〉鏈�澶�
+	const MAX_CACHE_DATA = 100;
+	// 缂撳瓨椤电鏁伴噺
+	const MAX_CACHE_PAGE = 3;
+
+	export default {
+		components: {},
+		computed: {
+			customStyle() {
+				return {
+					color: '#FFFFFF',
+					background: '#30AFFF',
+					width: '120rpx',
+					height: '80rpx',
+					
+				}
+			},
+		},
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				newsList: [],
+				cacheTab: [],
+				tabIndex: 0,
+				tabBars: [{
+					name: '鍏ㄩ儴',
+					id: 'total'
+				}, {
+					name: '寰呭紑濮�',
+					id: '01pending'
+				}, {
+					name: '杩涜涓�',
+					id: '02inProgress'
+				}, {
+					name: '宸茬粨鏉�',
+					id: '04completed'
+				}],
+				scrollInto: "",
+				showTips: false,
+				navigateFlag: false,
+				pulling: false,
+				refreshIcon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAB5QTFRFcHBw3Nzct7e39vb2ycnJioqK7e3tpqam29vb////D8oK7wAAAAp0Uk5T////////////ALLMLM8AAABxSURBVHja7JVBDoAgDASrjqj//7CJBi90iyYeOHTPMwmFZrHjYyyFYYUy1bwUZqtJIYVxhf1a6u0R7iUvWsCcrEtwJHp8MwMdvh2amHduiZD3rpWId9+BgPd7Cc2LIkPyqvlQvKxKBJ//Qwq/CacAAwDUv0a0YuKhzgAAAABJRU5ErkJggg==",
+				list: [],
+				array: [],
+				query: {
+					current: 1,
+					size: 10,
+					optaskNo: null,
+					state: null,
+					workstationId: null,
+					workCenter:null
+				},
+				workstationInfo: {
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null,
+					workCenter: null,
+					dutyRecordId: null
+				},
+				loadStatus: 'loadmore',
+			};
+		},
+		onLoad() {
+			setTimeout(() => {
+				const workstation = JSON.parse(uni.getStorageSync('workstation'));
+				if (workstation) {
+					this.setWorkstation(workstation);
+				} else {
+					this.loadList(0);
+				}
+			}, 350)
+		},
+		onShow() {
+
+		},
+		methods: {
+			loadList(index) {
+				if (this.tabBars[index].id != "total") {
+					this.query.state = this.tabBars[index].id;
+				}
+				if (this.workstationInfo.workstationId) {
+					this.query.workstationId = this.workstationInfo.workstationId;
+					this.query.workCenter = this.workstationInfo.workCenter;
+				} else {
+					return;
+				}
+
+				this.$u.api.operationTask.getOperationTaskPage(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			goDetail(item) {
+				if (this.navigateFlag) {
+					return;
+				}
+				this.navigateFlag = true;
+				uni.navigateTo({
+					url: './operationTaskInfo?item=' + encodeURIComponent(JSON.stringify(item))
+				});
+				setTimeout(() => {
+					this.navigateFlag = false;
+				}, 200)
+			},
+			loadMore() {
+				if (this.loadStatus == "nomore") {
+					return;
+				}
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList(this.tabIndex);
+				}, 100);
+			},
+			ontabtap(e) {
+				let index = e.target.dataset.current || e.currentTarget.dataset.current;
+				this.switchTab(index);
+			},
+			ontabchange(e) {
+				let index = e.target.current || e.detail.current;
+				this.switchTab(index);
+			},
+			switchTab(index) {
+				if (this.tabIndex === index) {
+					return;
+				}
+
+				// 娓呯┖鏁版嵁
+				this.clearTabData();
+
+				if (this.list.length === 0) {
+					this.loadList(index);
+				}
+
+				this.tabIndex = index;
+				this.scrollInto = this.tabBars[index].id;
+			},
+			clearTabData(e) {
+				this.query.current = 1;
+				this.list = [];
+				this.query.state = null;
+			},
+			refreshData() {},
+			onrefresh(e) {
+				var tab = this.list[this.tabIndex];
+				if (!tab.refreshFlag) {
+					return;
+				}
+				tab.refreshing = true;
+				tab.refreshText = "姝e湪鍒锋柊...";
+
+				setTimeout(() => {
+					this.refreshData();
+					this.pulling = true;
+					tab.refreshing = false;
+					tab.refreshFlag = false;
+					tab.refreshText = "宸插埛鏂�";
+					setTimeout(() => { // TODO fix ios鍜孉ndroid 鍔ㄧ敾鏃堕棿鐩稿弽闂
+						this.pulling = false;
+					}, 500);
+				}, 2000);
+			},
+			onpullingdown(e) {
+				var tab = this.list[this.tabIndex];
+				if (tab.refreshing || this.pulling) {
+					return;
+				}
+				if (Math.abs(e.pullingDistance) > Math.abs(e.viewHeight)) {
+					tab.refreshFlag = true;
+					tab.refreshText = "閲婃斁绔嬪嵆鍒锋柊";
+				} else {
+					tab.refreshFlag = false;
+					tab.refreshText = "涓嬫媺鍙互鍒锋柊";
+				}
+			},
+
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.loadList(this.tabIndex);
+			},
+
+			toWorkstation() {
+				uni.navigateTo({
+					url: '/pages/product/produce/workstationList/index?id=' + this.workstationInfo.workstationId
+				})
+			},
+			toReportWork(operationTask) {
+				const params = {
+					operationTaskId: operationTask.id,
+					partId: operationTask.partId,
+					partNo: operationTask.partNo,
+					partName: operationTask.partName,
+					unit: operationTask.unit,
+					workstationId: this.workstationInfo.workstationId,
+					dutyRecordId: this.workstationInfo.dutyRecordId
+				};
+				uni.navigateTo({
+					url: '/pages/product/produce/reportWork?params=' + encodeURIComponent(JSON.stringify(params))
+				})
+			},
+			setWorkstation(workstation) {
+				this.workstationInfo.workstationId = workstation.id;
+				this.workstationInfo.workstationNo = workstation.workstationNo;
+				this.workstationInfo.workstationName = workstation.name;
+				this.workstationInfo.workCenter = workstation.workCenter;
+				this.workstationInfo.dutyRecordId = workstation.dutyRecordId;
+
+				this.clearTabData();
+				this.loadList(0);
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.operation-task-list-search {
+		padding: 10rpx 30rpx 20rpx 30rpx;
+	}
+
+	.operation-task-tab {
+		.scroll-h {
+			width: 750rpx;
+			display: flex;
+			justify-content: space-between;
+			height: 80rpx;
+			white-space: nowrap;
+
+			.uni-tab-item {
+				display: inline-block;
+				padding-left: 55rpx;
+				padding-right: 55rpx;
+			}
+		}
+	}
+
+	.line-h {
+		height: 1rpx;
+		background-color: #cccccc;
+	}
+
+	.uni-tab-item-title {
+		color: #555;
+		font-size: 30rpx;
+		height: 80rpx;
+		line-height: 80rpx;
+		flex-wrap: nowrap;
+		/* #ifndef APP-PLUS */
+		white-space: nowrap;
+		/* #endif */
+		font-weight: bold;
+	}
+
+	.uni-tab-item-title-active {
+		color: #00aaff;
+	}
+
+	.production-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.operation-task-param {
+		padding: 30rpx 30rpx 0rpx 30rpx;
+
+		.operation-task-param-view {
+			height: 100rpx;
+			background: rgba(255, 255, 255, 0.61);
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110, 120, 135, 0.09);
+			border-radius: 10rpx;
+			padding: 0rpx 23rpx;
+			margin-bottom: 30rpx;
+
+			.operation-task-param-item {
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display: flex;
+				justify-content: space-between;
+				border: none;
+
+				.operation-task-param-item-left {
+					.item-one {
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+
+				.operation-task-param-item-right {
+					display: flex;
+					align-items: center;
+
+					.item-one {
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+
+					.item-two {
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+
+					.item-three {
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+
+					.scan {
+						background-image: url('~@/static/custom/materialReturn/scan.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 32rpx;
+						width: 32rpx;
+					}
+				}
+			}
+
+			.param-extra {
+				border-bottom: 1px solid #E8EBEE;
+			}
+		}
+	}
+
+	.wrap .operation-task-scroll-list {
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 494rpx);
+		width: 100%;
+	}
+
+	.operation-task-scroll-list-group {
+		::v-deep .u-cell-item-box {
+			background-color: rgba(250, 252, 255, 0.36) !important;
+			// padding: 0rpx 30rpx;
+		}
+
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 30rpx;
+			// height: 412rpx;
+			line-height: normal;
+			padding: 20rpx 20rpx;
+			box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position: relative;
+
+			.content-header {
+				background-color: #d2e2fa;
+				padding: 20rpx;
+				
+				.header-item-top {
+					
+					
+					// display: flex;
+					// justify-content: space-between;
+					.header-item-left {
+						height: 80rpx;
+						display: flex;
+						// align-items: center;
+						justify-content: flex-start;
+						font-size: 26rpx;
+
+						.content-header-title {
+							margin-left: 11rpx;
+							margin-top: -4rpx;
+							font-weight: bold;
+						}
+						
+						.content-header-value {
+							width: 400rpx;
+						}
+
+						.content-header-icon-one {
+							background-image: url('~@/static/custom/materialReturn/label-icon-1.png');
+							background-size: 100% auto;
+							background-repeat: no-repeat;
+							height: 20rpx;
+							width: 20rpx;
+						}
+						
+						.content-footer-time-icon {
+							background-image: url('~@/static/custom/operationTask/time-icon.png');
+							background-size: 100% auto;
+							background-repeat: no-repeat;
+							height: 28rpx;
+							width: 28rpx;
+							margin-right: 3px;
+						}
+					}
+
+					.header-item-right {
+						position: absolute;
+						right: 20rpx;
+						top: 20rpx;
+						// float: left;
+						// top: 0rpx;
+						// .header-item-button {
+						// 	width: 120rpx;
+						// 	color: #00aff0;
+						// 	background-color: #00aff0;
+						// }
+					}
+				}
+
+				.header-item-bottom {
+					line-height: normal;
+					display: flex;
+					align-items: center;
+
+					.content-header-icon-two {
+						background-image: url('~@/static/custom/materialReturn/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+					}
+
+					.content-header-title-ne {
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+				}
+
+				.header-item-toolbar-selected {
+					position: absolute;
+					background-image: url('~@/static/custom/materialReturn/selected-btn-1.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height: 50rpx;
+					width: 50rpx;
+					right: 20rpx;
+					top: 12rpx;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+				}
+
+				.header-item-toolbar-unselected {
+					position: absolute;
+					background-image: url('~@/static/custom/materialReturn/unselected-btn-1.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height: 50rpx;
+					width: 50rpx;
+					right: 20rpx;
+					top: 12rpx;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+				}
+			}
+
+			.content-body {
+				height: 200rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 25rpx 23rpx;
+
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.row-list ._label {
+					// display: flex;
+					// color: #666666;
+					// font-size: 26rpx;
+					// align-items: center;
+					// width: 170rpx;
+
+					.content-body-icon-one {
+						background-image: url('~@/static/custom/operationTask/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 18rpx;
+						width: 18rpx;
+						margin-right: 10rpx;
+					}
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+
+					.edit_icon {
+						background-image: url('~@/static/custom/materialReturn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 26rpx;
+						width: 26rpx;
+					}
+
+					::v-deep .uni-input-input {
+						color: #D35651;
+					}
+				}
+
+				.row-list .s1 {
+					display: flex;
+					color: #214DED;
+					font-size: 26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+			}
+
+			.content-footer {
+				padding-left: 5rpx;
+				margin-top: 5rpx;
+				.row-list {
+					display: flex;
+					align-items: center;
+
+					.content-footer-time-icon {
+						background-image: url('~@/static/custom/operationTask/time-icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+						margin-right: 3px;
+					}
+				}
+
+				.row-list ._label {
+					// display: flex;
+					// color: #666666;
+					// font-size: 26rpx;
+					// align-items: center;
+					// width: 200rpx;
+				}
+
+				.row-list ._content {
+					._content-text {
+						
+					}
+				}
+			}
+		}
+	}
+
+	.scan {
+		width: 60rpx;
+		height: 60rpx;
+		font-size: 60rpx;
+		color: #3281ff;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/operationTaskInfo.vue b/pages/product/produce/operationTaskInfo.vue
new file mode 100644
index 0000000..46062ab
--- /dev/null
+++ b/pages/product/produce/operationTaskInfo.vue
@@ -0,0 +1,70 @@
+<template>
+	<view class="page">
+		<view class="operation-task-info-index-bg" />
+		<u-navbar title="宸ュ崟璇︽儏" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+		<view class="wrap">
+			<uni-list>
+				<uni-list-item title="閿�鍞鍗�:" :rightText="operationTaskInfo.customerOrderNo" />
+				<uni-list-item title="涓昏鍒掑彿:" :rightText="operationTaskInfo.mpsNo" />
+				<uni-list-item title="闆朵欢缂栧彿:" :rightText="operationTaskInfo.partNo" />
+				<uni-list-item title="闆朵欢鍚嶇О:" :note="operationTaskInfo.partName" />
+				<uni-list-item title="杞﹂棿璁㈠崟:" :rightText="operationTaskInfo.moNo" />
+				<uni-list-item title="宸ュ簭鍚嶇О:" :rightText="operationTaskInfo.operationName" />
+				<uni-list-item title="鎴愬搧鍚嶇О:" :note="operationTaskInfo.productName" />
+				<uni-list-item title="璁″垝鏁伴噺:" :rightText="operationTaskInfo.plannedQuantity.toString()" />
+			</uni-list>
+		</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		components: {},
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				operationTaskInfo: {}
+			};
+		},
+		onLoad(option) {
+			if (option.item) {
+				this.operationTaskInfo = JSON.parse(decodeURIComponent(option.item));
+			}
+		},
+		onShow() {
+
+		},
+		methods: {
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.operation-task-info-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.wrap {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		padding: 20px 10px;
+	}
+
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/reportWork.vue b/pages/product/produce/reportWork.vue
new file mode 100644
index 0000000..3dfd6fd
--- /dev/null
+++ b/pages/product/produce/reportWork.vue
@@ -0,0 +1,865 @@
+<template>
+	<view class="page">
+		<view class="production-index-bg" />
+		<u-navbar title="鎶ュ伐浜у嚭" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+		<view class="operation-task-tab">
+			<scroll-view id="tab-bar" class="scroll-h" :scroll-x="true" :show-scrollbar="false" enable-flex>
+				<view v-for="(tab,index) in tabBars" :key="tab.id" class="uni-tab-item" :id="tab.id"
+					:data-current="index" @click="ontabtap">
+					<text class="uni-tab-item-title"
+						:class="tabIndex==index ? 'uni-tab-item-title-active' : ''">{{tab.name}}</text>
+				</view>
+			</scroll-view>
+		</view>
+		<view class="line-h"></view>
+		<view class="wrap" :current="tabIndex" @change="ontabchange">
+			<scroll-view class="operation-task-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+				<u-cell-group class="operation-task-scroll-list-group" :border="false">
+					<div class="tip" style="text-align:center;" v-if="list.length==0">-鏆傛棤鎶ュ伐鍗�-</div>
+					<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+						<view class="content-header">
+							<view class="content-header-left">
+								<radio :checked="item.isChecked" style="transform:scale(0.6)" @click="choose(item)" />
+							</view>
+							<viem class="content-header-right">
+								<view style="display: flex; justify-content: center; align-items: center;"
+									v-if="item.state == '02submitted'">
+									<image src="/static/custom/operationTask/submit-state-icon.png"
+										style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+									<text style="text-align: center; color: #007145;">宸叉彁浜�</text>
+								</view>
+
+								<view style="display: flex; justify-content: center; align-items: center;"
+									v-if="item.state == '01draft'">
+									<image src="/static/custom/operationTask/unsubmit-state-icon.png"
+										style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+									<text style="text-align: center; color: #F46F6C;">鑽夌</text>
+								</view>
+
+								<view style="display: flex; justify-content: center; align-items: center;"
+									v-if="item.state == '04processing'">
+									<image src="/static/custom/operationTask/in-progress-state-icon.png"
+										style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+									<text style="text-align: center; color: #c8af3c;">澶勭悊涓�</text>
+								</view>
+							</viem>
+						</view>
+						<view class="content-body" @click="choose(item)">
+							<view class="row-list">
+								<view class="_label">
+									鎶ュ伐鍗曞彿锛�
+								</view>
+								<view class="_content">
+									{{ item.productNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									闆朵欢缂栧彿锛�
+								</view>
+								<view class="_content">
+									{{ item.partNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									闆朵欢鍚嶇О锛�
+								</view>
+								<view class="_content">
+									<text>{{ item.partName }}</text>
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									SN鍙凤細
+								</view>
+								<view class="_content">
+									{{ item.outBatchNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									杞藉叿缂栧彿锛�
+								</view>
+								<view class="_content">
+									{{ item.reelNumber }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									璧峰鏁伴噺锛�
+								</view>
+								<view class="_content">
+									{{ item.startMeterMark }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鎴鏁伴噺锛�
+								</view>
+								<view class="_content">
+									{{ item.endMeterMark }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鐢熶骇鏁伴噺锛�
+								</view>
+								<view class="_content">
+									{{ item.productQty }}
+								</view>
+							</view>
+							<!-- <view class="content-body-collapse">
+								<uni-collapse class="collapse" ref="collapse" v-model="value" @change="change">
+									<uni-collapse-item title="灞曞紑" open="false" style="height: 10rpx;">
+										<view class="content">
+											<text
+												class="text">鎶樺彔鍐呭涓讳綋锛岃繖鏄竴娈垫瘮杈冮暱鍐呭銆傞粯璁ゆ姌鍙犱富瑕佸唴瀹癸紝鍙樉绀哄綋鍓嶉」鏍囬銆傜偣鍑绘爣棰樺睍寮�锛屾墠鑳界湅鍒拌繖娈垫枃瀛椼�傚啀娆$偣鍑绘爣棰橈紝鎶樺彔鍐呭銆�</text>
+										</view>
+									</uni-collapse-item>
+								</uni-collapse>
+							</view> -->
+						</view>
+						<view class="content-footer">
+							<view class="footer-btn">
+								<wu-button :custom-style="customStyleEight" size="small" @click="deleteTracking(item)">
+									<image src="/static/custom/operationTask/red-delete-icon.png"
+										style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+									鍒犻櫎
+								</wu-button>
+							</view>
+							<view class="footer-btn">
+								<wu-button :custom-style="customStyleThree" size="small"
+									@click="toEditProductOut(item)">
+									<image src="/static/custom/operationTask/black-edit-icon.png"
+										style="width: 26rpx; height: 26rpx; margin-right: 5rpx;"></image>
+									缂栬緫
+								</wu-button>
+							</view>
+							<view class="footer-btn">
+								<wu-button :custom-style="customStyleSix" size="small" @click="revokeTracking(item)">
+									<image src="/static/custom/operationTask/black-revoke-icon.png"
+										style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+									鎾ら攢
+								</wu-button>
+							</view>
+							<view class="footer-btn">
+								<wu-button :custom-style="customStyleFour" size="small" @click="submitTracking(item)">
+									<image src="/static/custom/operationTask/blue-submit-icon.png"
+										style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+									鎻愪氦
+								</wu-button>
+							</view>
+						</view>
+					</view>
+				</u-cell-group>
+				<view class="loadmore" @click="loadMore">
+					<u-loadmore :status="loadStatus"></u-loadmore>
+				</view>
+			</scroll-view>
+			<view class="suspend">
+				<wu-button class="suspend-btn" :custom-style="customStyleFive" size="small" @click="toCreateReport">
+					<image src="/static/custom/operationTask/book-icon.png"
+						style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+					浜у嚭
+				</wu-button>
+			</view>
+			<view class="bottom">
+				<view class="bottom-left">
+					<!-- <radio-group @change="chooseAll" v-model="chooseAllState"> -->
+					<label>
+						<radio :checked="chooseAllState" @click="chooseAll" style="transform:scale(0.6)" />鍏ㄩ��
+					</label>
+					<!-- </radio-group>	 -->
+				</view>
+				<view class="bottom-right">
+					<view class="bottom-btn">
+						<wu-button :custom-style="customStyleOne" shape="circle" size="small" @click="deleteTracking">
+							鍒犻櫎
+						</wu-button>
+					</view>
+					<view class="bottom-btn">
+						<wu-button :custom-style="customStyleTwo" shape="circle" size="small" @click="revokeTracking">
+							鎾ら攢
+						</wu-button>
+					</view>
+					
+					<view class="bottom-btn">
+						<wu-button :custom-style="customStyleTwo" shape="circle" size="small" @click="submitTracking">
+							鎻愪氦
+						</wu-button>
+					</view>
+					<view class="bottom-btn">
+						<wu-button :custom-style="customStyleTwo" shape="circle" size="small">
+							浜ょ彮浜у嚭
+						</wu-button>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+
+	export default {
+		components: {},
+		computed: {
+			customStyleOne() {
+				return {
+					color: '#FFFFFF',
+					background: '#F46F6C',
+					width: '120rpx'
+				}
+			},
+			customStyleTwo() {
+				return {
+					color: '#FFFFFF',
+					background: '#234EED',
+					width: '140rpx'
+				}
+			},
+			customStyleThree() {
+				return {
+					color: '#333333',
+					background: '#FFFFFF',
+					width: '140rpx'
+				}
+			},
+			customStyleFour() {
+				return {
+					color: '#234EED',
+					background: '##FFFFFF',
+					width: '140rpx',
+				}
+			},
+			customStyleFive() {
+				return {
+					color: '#FFFFFF',
+					background: '#234EED',
+					width: '90rpx',
+					height: '120rpx',
+					borderRadius: '100%'
+				}
+			},
+			customStyleSix() {
+				return {
+					color: '#333333',
+					background: '##FFFFFF',
+					width: '120rpx',
+				}
+			},
+			customStyleSeven() {
+				return {
+					color: '#FFFFFF',
+					background: '#0e932e',
+					width: '120rpx'
+				}
+			},
+			customStyleEight() {
+				return {
+					color: '#F46F6C',
+					background: '#FFFFFF',
+					width: '120rpx'
+				}
+			},
+		},
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				newsList: [],
+				cacheTab: [],
+				tabIndex: 0,
+				tabBars: [{
+					name: '鎸夌粍鎶ュ伐',
+					id: 'group'
+				}, {
+					name: '鎸変汉鍛樻姤宸�',
+					id: 'person'
+				}],
+				scrollInto: "group",
+				showTips: false,
+				navigateFlag: false,
+				pulling: false,
+				refreshIcon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAB5QTFRFcHBw3Nzct7e39vb2ycnJioqK7e3tpqam29vb////D8oK7wAAAAp0Uk5T////////////ALLMLM8AAABxSURBVHja7JVBDoAgDASrjqj//7CJBi90iyYeOHTPMwmFZrHjYyyFYYUy1bwUZqtJIYVxhf1a6u0R7iUvWsCcrEtwJHp8MwMdvh2amHduiZD3rpWId9+BgPd7Cc2LIkPyqvlQvKxKBJ//Qwq/CacAAwDUv0a0YuKhzgAAAABJRU5ErkJggg==",
+				list: [],
+				array: [],
+				chooseAllState: false,
+				query: {
+					current: 1,
+					size: 10,
+					workstationId: null,
+					operationTaskId: null
+				},
+				workstationInfo: {
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null,
+					workCenter: null
+				},
+				staffs: [],
+				dutyRecordId: null,
+				operationTaskInfo: {},
+				loadStatus: 'loadmore',
+			};
+		},
+		onLoad(option) {
+			if (option.params) {
+				const params = JSON.parse(decodeURIComponent(option.params));
+				if (params.operationTaskId && params.workstationId) {
+					this.query.operationTaskId = params.operationTaskId;
+					this.query.workstationId = params.workstationId;
+					this.operationTaskInfo = params;
+					this.loadList();
+				}
+			}
+		},
+		onShow() {},
+		methods: {
+			loadList() {
+				this.$u.api.outputRegister.getProductMainV1(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.list.forEach(el => {
+						this.$set(el, 'isChecked', false);
+					})
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			goDetail(item) {
+				if (this.navigateFlag) {
+					return;
+				}
+				this.navigateFlag = true;
+				uni.navigateTo({
+					url: './operationTaskInfo?item=' + encodeURIComponent(JSON.stringify(item))
+				});
+				setTimeout(() => {
+					this.navigateFlag = false;
+				}, 200)
+			},
+			loadMore() {
+				if (this.loadStatus == "nomore") {
+					return
+				}
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			ontabtap(e) {
+				let index = e.target.dataset.current || e.currentTarget.dataset.current;
+				this.switchTab(index);
+			},
+			ontabchange(e) {
+				let index = e.target.current || e.detail.current;
+				this.switchTab(index);
+			},
+			switchTab(index) {
+				if (this.tabIndex === index) {
+					return;
+				}
+
+				// // 娓呯┖鏁版嵁
+				// this.clearTabData();
+
+				// if (this.list.length === 0) {
+				// 	this.loadList(index);
+				// }
+
+				this.tabIndex = index;
+				this.scrollInto = this.tabBars[index].id;
+			},
+			clearTabData(e) {
+				this.list = [];
+				this.query.state = null;
+			},
+			refreshData() {},
+			onrefresh(e) {
+				var tab = this.list[this.tabIndex];
+				if (!tab.refreshFlag) {
+					return;
+				}
+				tab.refreshing = true;
+				tab.refreshText = "姝e湪鍒锋柊...";
+
+				setTimeout(() => {
+					this.refreshData();
+					this.pulling = true;
+					tab.refreshing = false;
+					tab.refreshFlag = false;
+					tab.refreshText = "宸插埛鏂�";
+					setTimeout(() => { // TODO fix ios鍜孉ndroid 鍔ㄧ敾鏃堕棿鐩稿弽闂
+						this.pulling = false;
+					}, 500);
+				}, 2000);
+			},
+			onpullingdown(e) {
+				var tab = this.list[this.tabIndex];
+				if (tab.refreshing || this.pulling) {
+					return;
+				}
+				if (Math.abs(e.pullingDistance) > Math.abs(e.viewHeight)) {
+					tab.refreshFlag = true;
+					tab.refreshText = "閲婃斁绔嬪嵆鍒锋柊";
+				} else {
+					tab.refreshFlag = false;
+					tab.refreshText = "涓嬫媺鍙互鍒锋柊";
+				}
+			},
+			choose(item) {
+				if (item.isChecked) {
+					item.isChecked = false
+				} else {
+					item.isChecked = true
+				}
+			},
+
+			chooseAll() {
+				if (this.chooseAllState) {
+					this.chooseAllState = false;
+					this.list.forEach(el => {
+						el.isChecked = false;
+					})
+				} else {
+					this.chooseAllState = true;
+					this.list.forEach(el => {
+						el.isChecked = true;
+					})
+				}
+			},
+
+			//鎻愪氦
+			submitTracking(item) {
+				let initList = [];
+				if (item) {
+					initList.push(item);
+				} else {
+					initList = this.list.filter(item => item.isChecked == true)
+				}
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愭彁浜ゃ�戠殑鏁版嵁')
+					return
+				}
+
+				const l_index = initList.findIndex((el) => el.state == '02submitted')
+				if (l_index > -1) {
+					this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪宸叉彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+					return
+				}
+
+				let outIds = initList.map((item) => {
+					return item.id
+				})
+
+				let queryParam = {
+					event: 'SUBMIT',
+					ids: outIds
+				}
+				this.batchChange(queryParam, "鎻愪氦")
+			},
+			//鎾ら攢
+			revokeTracking(item) {
+				let initList = [];
+				if (item) {
+					initList.push(item);
+				} else {
+					initList = this.list.filter(item => item.isChecked == true)
+				}
+
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愭挙閿�銆戠殑鏁版嵁')
+					return
+				}
+
+				let l_index = initList.findIndex(
+					(el) => el.state == null || el.state == '01draft'
+				)
+				if (l_index > -1) {
+					this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪鏈彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+					return
+				}
+
+				let outIds = initList.map((item) => {
+					return item.id
+				})
+
+				let queryParam = {
+					event: 'REVOKE',
+					ids: outIds
+				}
+				this.batchChange(queryParam, "鎾ら攢")
+			},
+			// 鍒犻櫎
+			deleteTracking(item) {
+				let initList = [];
+				if (item) {
+					initList.push(item);
+				} else {
+					initList = this.list.filter(item => item.isChecked == true)
+				}
+
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愬垹闄ゃ�戠殑鏁版嵁')
+					return
+				}
+
+				const l_index = initList.findIndex((el) => el.state == '02submitted')
+				if (l_index > -1) {
+					this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪宸叉彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+					return
+				}
+
+				let outIds = initList.map((item) => {
+					return item.id
+				})
+
+				this.$u.api.outputRegister.batchCancelProductMain(outIds).then(res => {
+					let _code = res.code
+					let _data = res.data
+					let _msg = res.msg
+					if (_code === 0) {
+						this.$u.toast('鍒犻櫎鎴愬姛');
+						this.clear();
+						this.loadList();
+					} else {
+						this.$u.toast('鍒犻櫎澶辫触');
+					}
+				});
+			},
+
+			//鎻愪氦銆佹挙閿�鎿嶄綔
+			batchChange(queryParam, title) {
+				let that = this
+				that.$u.api.outputRegister.batchChange(queryParam).then(res => {
+					if (res.code == 0) {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: title + '鎴愬姛',
+							showCancel: false,
+							success: function() {
+								that.clear();
+								that.loadList();
+							}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: title + '澶辫触',
+							showCancel: false,
+							success: function() {}
+						})
+					}
+				})
+			},
+
+			// 缂栬緫
+			toEditProductOut(item) {
+				let initList = [];
+				if (item) {
+					initList.push(item);
+				} else {
+					this.list.filter(item => item.isChecked == true)
+				}
+
+				if (initList.length == 0) {
+					this.$u.toast('璇烽�夋嫨闇�瑕併�愮紪杈戙�戠殑鏁版嵁')
+					return
+				}
+
+				//TODO鏍¢獙鎶ュ伐鐘舵��
+				let l_index = initList.findIndex((el) => el.state == '02submitted')
+				if (l_index > -1) {
+					this.$u.toast('鎮ㄩ�夋嫨鐨勫璞′腑瀛樺湪宸叉彁浜ょ殑鏁版嵁锛岃閲嶆柊閫夋嫨锛�')
+					return
+				}
+
+				uni.navigateTo({
+					url: './editReportWork?item=' + encodeURIComponent(JSON.stringify(
+						initList))
+				})
+			},
+
+			toCreateReport() {
+				this.$set(this.operationTaskInfo, 'type', this.scrollInto);
+				uni.navigateTo({
+					url: './createReportWork?params=' + encodeURIComponent(JSON.stringify(this
+						.operationTaskInfo))
+				});
+			},
+
+			refreshTrackingRecord() {
+				this.clear();
+				this.loadList();
+			},
+
+			clear() {
+				this.query.current = 1;
+				this.list = [];
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.operation-task-list-search {
+		padding: 10rpx 30rpx 20rpx 30rpx;
+	}
+
+	.operation-task-tab {
+		.scroll-h {
+			width: 750rpx;
+			display: flex;
+			justify-content: space-between;
+			height: 80rpx;
+			white-space: nowrap;
+
+			.uni-tab-item {
+				display: inline-block;
+				padding-left: 55rpx;
+				padding-right: 55rpx;
+			}
+		}
+	}
+
+	.line-h {
+		height: 1rpx;
+		background-color: #cccccc;
+	}
+
+	.uni-tab-item-title {
+		color: #555;
+		font-size: 30rpx;
+		height: 80rpx;
+		line-height: 80rpx;
+		flex-wrap: nowrap;
+		/* #ifndef APP-PLUS */
+		white-space: nowrap;
+		/* #endif */
+		font-weight: bold;
+	}
+
+	.uni-tab-item-title-active {
+		color: #00aaff;
+	}
+
+	.production-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.operation-task-param {
+		padding: 30rpx 30rpx 0rpx 30rpx;
+
+		.operation-task-param-view {
+			height: 100rpx;
+			background: rgba(255, 255, 255, 0.61);
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110, 120, 135, 0.09);
+			border-radius: 10rpx;
+			padding: 0rpx 23rpx;
+			margin-bottom: 30rpx;
+
+			.operation-task-param-item {
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display: flex;
+				justify-content: space-between;
+				border: none;
+
+				.operation-task-param-item-left {
+					.item-one {
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+
+				.operation-task-param-item-right {
+					display: flex;
+					align-items: center;
+
+					.item-one {
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+
+					.item-two {
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+
+					.item-three {
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+
+					.scan {
+						background-image: url('~@/static/custom/materialReturn/scan.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 32rpx;
+						width: 32rpx;
+					}
+				}
+			}
+
+			.param-extra {
+				border-bottom: 1px solid #E8EBEE;
+			}
+		}
+	}
+
+	.wrap .operation-task-scroll-list {
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 334rpx);
+		width: 100%;
+	}
+
+	.operation-task-scroll-list-group {
+		::v-deep .u-cell-item-box {
+			background-color: rgba(250, 252, 255, 0.36) !important;
+			padding: 0rpx 30rpx;
+		}
+
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 20rpx 0rpx;
+			height: 572rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position: relative;
+
+			.content-header {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				.content-header-left {
+					// align-items: center;
+				}
+
+				.content-header-right {
+					// align-items: center;
+				}
+			}
+
+			.content-body {
+				height: 420rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 15rpx 13rpx;
+
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					// justify-content: space-between;
+
+					._label {
+						display: flex;
+						color: #666666;
+						font-size: 26rpx;
+						align-items: center;
+						width: 160rpx;
+						margin-right: 20rpx;
+					}
+
+					._content {
+						width: 500rpx;
+						display: flex;
+						// text-align: right;
+						color: #909399;
+						font-size: 24rpx;
+						// margin-top: 30rpx;
+					}
+				}
+
+				.content-body-collapse {
+					.collapse {
+						height: 20rpx;
+					}
+				}
+			}
+
+			.content-footer {
+				display: flex;
+				justify-content: space-between;
+				margin-top: 15rpx;
+				align-items: center;
+
+				.footer-btn {
+					padding-right: 10rpx;
+				}
+			}
+		}
+	}
+
+	.bottom {
+		bottom: 0;
+		height: 100rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+
+		.bottom-left {
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			margin-top: 30rpx;
+			padding-left: 20rpx;
+		}
+
+		.bottom-right {
+			margin-top: 30rpx;
+			padding-right: 20rpx;
+			display: flex;
+			justify-content: flex-end;
+
+			.bottom-btn {
+				margin-right: 10rpx;
+			}
+		}
+	}
+
+	.suspend {
+		position: fixed;
+		right: 10px;
+		bottom: 150rpx;
+		z-index: 1;
+	}
+
+	.scan {
+		width: 60rpx;
+		height: 60rpx;
+		font-size: 60rpx;
+		color: #3281ff;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/workstationList/dutyRecordHistory.vue b/pages/product/produce/workstationList/dutyRecordHistory.vue
new file mode 100644
index 0000000..fd5d215
--- /dev/null
+++ b/pages/product/produce/workstationList/dutyRecordHistory.vue
@@ -0,0 +1,403 @@
+<template>
+	<view class="page">
+		<view class="workstation-index-bg" />
+		<u-navbar title="鐝璁板綍" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+
+		<view class="wrap">
+			<scroll-view class="operation-task-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+				<u-cell-group class="duty-record-scroll-list-group" :border="false">
+					<radio-group @change="radioChange">
+						<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+							<view class="content-header">
+								<radio :value="item.id" style="transform:scale(0.6)" />
+								<view class="content-header-title">鐝缂栧彿锛歿{ item.dutyNo }}</view>
+							</view>
+							<view class="content-body">
+								<view class="row-list">
+									<view class="_label">
+										<view class="content-body-icon-one"></view>
+										鐝鏃ユ湡锛�
+									</view>
+									<view class="_content">
+										{{ item.dutyDate }}
+									</view>
+								</view>
+
+								<view class="row-list">
+									<view class="_label">
+										<view class="content-body-icon-one"></view>
+										鐢熶骇鐝锛�
+									</view>
+									<view class="_content">
+										{{ item.shiftName }}
+									</view>
+								</view>
+
+								<view class="row-list">
+									<view class="_label">
+										<view class="content-body-icon-one"></view>
+										宸ヤ綔绔欙細
+									</view>
+									<view class="_content">
+										{{ item.workstationName }}
+									</view>
+								</view>
+
+								<view class="row-list">
+									<view class="_label">
+										<view class="content-body-icon-one"></view>
+										鐢熶骇鐝粍锛�
+									</view>
+									<view class="_content">
+										{{ item.crewName }}
+									</view>
+								</view>
+
+								<view class="row-list">
+									<view class="_label">
+										<view class="content-body-icon-one"></view>
+										鐝浜ч噺锛�
+									</view>
+									<view class="_content">
+										{{ item.dutyOutput }}
+									</view>
+								</view>
+
+								<view class="row-list">
+									<view class="_label">
+										<view class="content-body-icon-one"></view>
+										鏄惁鎻愪氦锛�
+									</view>
+									<view class="_content">
+										{{ item.isSubmit == true ? '鏄�' : '鍚�' }}
+									</view>
+								</view>
+							</view>
+						</view>
+					</radio-group>
+				</u-cell-group>
+				<view class="loadmore" @click="loadMore">
+					<u-loadmore :status="loadStatus"></u-loadmore>
+				</view>
+			</scroll-view>
+			<view class="bottom">
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleOne" size="normal" @click="onCancel"
+						style="padding-left: 15rpx;">
+						鍙栨秷
+					</wu-button>
+				</view>
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleTwo" size="normal" @click="onSubmit"
+						style="padding-right: 15rpx;">
+						纭畾
+					</wu-button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				params: {
+					current: 1,
+					size: 10,
+					workstationId: null
+				},
+				list: [],
+				current: 0,
+				loadStatus: 'loadmore',
+			}
+		},
+		computed: {
+			customStyleOne() {
+				return {
+					color: '#666666',
+					background: '#FFFFFF',
+					width: '350rpx'
+				}
+			},
+			customStyleTwo() {
+				return {
+					color: '#FFFFFF',
+					background: '#234EED',
+					width: '350rpx'
+				}
+			},
+		},
+		onLoad(option) {
+			if (option.id) {
+				this.params.workstationId = option.id;
+			}
+			this.loadList();
+		},
+		methods: {
+			loadList() {
+				this.$u.api.operationTask.getDutyRecordList(this.params).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.params.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			radioChange: function(evt) {
+				this.current = evt.detail.value;
+			},
+			onCancel() {
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			onSubmit() {
+				const params = {
+					id: null,
+					dutyRecordId: this.current
+				}
+
+				this.list.forEach(el => {
+					if (el.id == this.current) {
+						params.id = el.workstationId;
+						return;
+					}
+				});
+
+				this.$u.api.operationTask.updWorkstation(params).then(res => {
+					if (res.code != 0) {
+						return;
+					}
+				});
+
+				this.$u.api.operationTask.getWorkstationList({
+					id: params.id
+				}).then(res => {
+					if (res.code == 0) {
+						const workstation = res.data[0];
+
+						// 鑾峰彇椤甸潰鏍�
+						let pages = getCurrentPages()
+
+						// 鑾峰彇涓婁竴椤垫爤
+						let prevPage = pages[pages.length - 2]
+						let prevTwoPage = pages[pages.length - 3]
+
+						// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+						prevPage.$vm.setWorkstation(workstation)
+						prevTwoPage.$vm.setWorkstation(workstation)
+
+						// 杩斿洖涓婁竴椤�
+						uni.navigateBack({
+							delta: 1
+						})
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.workstation-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.wrap {}
+
+	.wrap .operation-task-scroll-list {
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 254rpx);
+		width: 100%;
+	}
+
+	.bottom {
+		display: flex;
+		justify-content: space-between;
+		height: 100rpx;
+		margin-top: 20rpx;
+	}
+
+	.duty-record-scroll-list-group {
+		::v-deep .u-cell-item-box {
+			background-color: rgba(250, 252, 255, 0.36) !important;
+			padding: 0rpx 30rpx;
+		}
+
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 24rpx;
+			height: 392rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position: relative;
+
+			.content-header {
+				display: flex;
+				align-items: center;
+
+				.header-item-bottom {
+					height: 50rpx;
+					display: flex;
+					align-items: center;
+
+					.content-header-icon-two {
+						background-image: url('~@/static/custom/materialReturn/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+					}
+
+					.content-header-title-ne {
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+				}
+			}
+
+			.content-body {
+				height: 320rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 10rpx 23rpx;
+
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size: 26rpx;
+					align-items: center;
+					width: 170rpx;
+
+					.content-body-icon-one {
+						background-image: url('~@/static/custom/operationTask/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 18rpx;
+						width: 18rpx;
+						margin-right: 10rpx;
+					}
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+
+					.edit_icon {
+						background-image: url('~@/static/custom/materialReturn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 26rpx;
+						width: 26rpx;
+					}
+
+					::v-deep .uni-input-input {
+						color: #D35651;
+					}
+				}
+
+				.row-list .s1 {
+					display: flex;
+					color: #214DED;
+					font-size: 26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+			}
+
+			.content-footer {
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					// justify-content: space-between;
+
+					.content-footer-time-icon {
+						background-image: url('~@/static/custom/operationTask/time-icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+						margin-right: 3px;
+					}
+				}
+
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size: 26rpx;
+					align-items: center;
+					width: 200rpx;
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/workstationList/dutyRecordWorkstation.vue b/pages/product/produce/workstationList/dutyRecordWorkstation.vue
new file mode 100644
index 0000000..12f86c6
--- /dev/null
+++ b/pages/product/produce/workstationList/dutyRecordWorkstation.vue
@@ -0,0 +1,342 @@
+<template>
+	<view class="page">
+		<view class="workstation-index-bg" />
+		<u-navbar title="鐝閫夋嫨" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+
+		<view class="wrap">
+			<scroll-view class="operation-task-scroll-list" scroll-y="true">
+				<u-cell-group class="duty-record-scroll-list-group" :border="false">
+					<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+						<view class="content-header">
+							<radio :value="item.id" :checked="item.isChecked" style="transform:scale(0.6)"
+								@click="choose(item)" />
+						</view>
+						<view class="content-body" @click="choose(item)">
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									宸ヤ綔绔欑紪鍙凤細
+								</view>
+								<view class="_content">
+									{{ item.workstationNo }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									宸ヤ綔绔欙細
+								</view>
+								<view class="_content">
+									{{ item.name }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									宸ヤ綔绔欑被鍨嬶細
+								</view>
+								<view class="_content">
+									{{ item.type }}
+								</view>
+							</view>
+
+						</view>
+					</view>
+				</u-cell-group>
+			</scroll-view>
+			<view class="bottom">
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleOne" size="normal" @click="onCancel"
+						style="padding-left: 15rpx;">
+						鍙栨秷
+					</wu-button>
+				</view>
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleTwo" size="normal" @click="onSubmit"
+						style="padding-right: 15rpx;">
+						纭畾
+					</wu-button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				workCenter: null,
+				list: [],
+				current: 0,
+				params: null,
+			}
+		},
+		computed: {
+			customStyleOne() {
+				return {
+					color: '#666666',
+					background: '#FFFFFF',
+					width: '350rpx'
+				}
+			},
+			customStyleTwo() {
+				return {
+					color: '#FFFFFF',
+					background: '#234EED',
+					width: '350rpx'
+				}
+			},
+		},
+		onLoad(option) {
+			if (option.params) {
+				this.params = JSON.parse(decodeURIComponent(option.params));
+				this.loadList();
+			}
+		},
+		methods: {
+			loadList() {
+				this.$u.api.operationTask.getDutyRecordWorkstation({
+					workCenter: this.params.workCenter
+				}).then(res => {
+					if (res.code == 0 && res.data.length > 0) {
+						this.list = res.data;
+						this.list.forEach(el => {
+							this.$set(el, 'isChecked', false);
+						})
+					}
+				});
+			},
+			choose(item) {
+				if (item.isChecked) {
+					item.isChecked = false
+				} else {
+					item.isChecked = true
+				}
+			},
+			onCancel() {
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			onSubmit() {
+				const initList = this.list.filter(item => item.isChecked == true);
+
+				const ids = initList.map((item) => {
+					return item.id
+				});
+				
+				this.$set(this.params, 'workstationIdList', ids);
+
+				this.$u.api.operationTask.batchSaveDutyRecord(this.params).then(res => {
+					if (res.code == 0) {
+						this.$u.toast('鎻愪氦鎴愬姛');
+						// 杩斿洖涓婁竴椤�
+						setTimeout(() => {
+							uni.navigateBack({
+								delta: 1
+							});
+						}, 1000)
+					} else {
+						this.$u.toast('鎻愪氦澶辫触锛�' + res.msg);
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.workstation-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.wrap {}
+
+	.wrap .operation-task-scroll-list {
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 254rpx);
+		width: 100%;
+	}
+
+	.bottom {
+		display: flex;
+		justify-content: space-between;
+		height: 100rpx;
+		margin-top: 20rpx;
+	}
+
+	.duty-record-scroll-list-group {
+		::v-deep .u-cell-item-box {
+			background-color: rgba(250, 252, 255, 0.36) !important;
+			padding: 0rpx 30rpx;
+		}
+
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 24rpx;
+			line-height: normal;
+			padding: 10rpx 20rpx;
+			box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position: relative;
+
+			.content-header {
+				display: flex;
+				align-items: center;
+
+				.header-item-bottom {
+					height: 50rpx;
+					display: flex;
+					align-items: center;
+
+					.content-header-icon-two {
+						background-image: url('~@/static/custom/materialReturn/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+					}
+
+					.content-header-title-ne {
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+				}
+			}
+
+			.content-body {
+				line-height: normal;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 10rpx 23rpx;
+
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size: 26rpx;
+					align-items: center;
+					width: 190rpx;
+
+					.content-body-icon-one {
+						background-image: url('~@/static/custom/operationTask/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 18rpx;
+						width: 18rpx;
+						margin-right: 10rpx;
+					}
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+
+					.edit_icon {
+						background-image: url('~@/static/custom/materialReturn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 26rpx;
+						width: 26rpx;
+					}
+
+					::v-deep .uni-input-input {
+						color: #D35651;
+					}
+				}
+
+				.row-list .s1 {
+					display: flex;
+					color: #214DED;
+					font-size: 26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+			}
+
+			.content-footer {
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					// justify-content: space-between;
+
+					.content-footer-time-icon {
+						background-image: url('~@/static/custom/operationTask/time-icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+						margin-right: 3px;
+					}
+				}
+
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size: 26rpx;
+					align-items: center;
+					width: 200rpx;
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/workstationList/index.vue b/pages/product/produce/workstationList/index.vue
new file mode 100644
index 0000000..ce47ae6
--- /dev/null
+++ b/pages/product/produce/workstationList/index.vue
@@ -0,0 +1,795 @@
+<template>
+	<view class="page">
+		<view class="workstation-index-bg" />
+		<u-navbar title="鏈哄彴绠$悊" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+
+		<view class="wrap">
+			<view>
+				<uni-notice-bar class="content-notice" background-color="#A3E0C8" color="#007145" single
+					v-if="submitNotice" :text="submitNotice"></uni-notice-bar>
+				<uni-notice-bar class="content-notice" color="#D53F3F" single v-if="unsubmitNotice"
+					:text="unsubmitNotice"></uni-notice-bar>
+			</view>
+			<view class="content">
+				<view class="content-header">
+					<view class="content-header-left">
+						<view class="content-header-icon-one"></view>
+						<view class="content-header-title">缂栧彿锛�</view>
+						<text>{{dutyRecordInfo.dutyNo}}</text>
+					</view>
+					<view class="content-header-right">
+						<view class="clear-icon" @click="clear()"></view>
+						<view class="edit-icon" @click="edit()"></view>
+					</view>
+				</view>
+				<view class="content-body">
+					<view class="content-body-title">
+						鐝鐧昏
+					</view>
+
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							鏈�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鍙帮細
+						</view>
+						<view class="content-body-item-right" @click="toWorkstation()">
+							( {{ workstationInfo.workCenter }} ) {{workstationInfo.workstationName}}
+							<u-icon name="arrow-right" color="#687792" size="28" @click="toWorkstation"
+								style="padding-left: 10rpx;"></u-icon>
+						</view>
+					</view>
+
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							鐝�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;娆★細
+						</view>
+						<view class="content-body-item-right">
+							<uni-data-select class="_select" v-model="dutyRecordInfo.shiftId" :localdata="shiftList"
+								:border="false" :disabled="editState" @change="selectShiftChanged"></uni-data-select>
+						</view>
+					</view>
+
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							鐝�&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;缁勶細
+						</view>
+						<view class="content-body-item-right">
+							<uni-data-select class="_select" v-model="dutyRecordInfo.crewId" :localdata="crewList"
+								:border="false" :disabled="editState"></uni-data-select>
+						</view>
+					</view>
+
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							鐝鏃ユ湡锛�
+						</view>
+						<view class="content-body-item-right">
+							<uni-datetime-picker type="date" :clear-icon="false"
+								v-model="dutyRecordInfo.dutyDate" :disabled="editState" @change="dutyDateChange" />
+						</view>
+					</view>
+
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							寮�濮嬫椂闂达細
+						</view>
+						<view class="content-body-item-right">
+							<uni-datetime-picker type="datetime" v-model="dutyRecordInfo.startTime"
+								:disabled="editState" />
+						</view>
+					</view>
+
+					<view class="content-body-item param-extra">
+						<view class="content-body-item-left">
+							缁撴潫鏃堕棿锛�
+						</view>
+						<view class="content-body-item-right">
+							<uni-datetime-picker class="_time-picker" type="datetime" v-model="dutyRecordInfo.endTime"
+								:disabled="editState" />
+						</view>
+					</view>
+				</view>
+				<view class="content-footer">
+					<view class="footer-button">
+						<wu-button :custom-style="customStyleOne" size="normal" text="鎻愪氦"
+							@click="submitDutyRecord"></wu-button>
+					</view>
+					<view class="footer-button">
+						<wu-button :custom-style="customStyleTwo" size="normal" text="淇濆瓨"
+							@click="saveDutyRecord"></wu-button>
+					</view>
+				</view>
+			</view>
+			<view class="bottom">
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleFive" shape="circle" :hairline="true" size="small"
+						@click="deleteDutyRecord" :plain="true">
+						<image src="/static/custom/operationTask/red-delete-icon.png"
+							style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+						鍒犻櫎
+					</wu-button>
+				</view>
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleThree" shape="circle" :hairline="true" size="small"
+						@click="toDutyRecordHistory" :plain="true">
+						<image src="/static/custom/operationTask/workstation/icon_history.png"
+							style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+						鍘嗗彶
+					</wu-button>
+				</view>
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleFour" shape="circle" :hairline="true" size="small"
+						@click="toUnSubmitDutyRecord" :plain="true">
+						<image src="/static/custom/operationTask/workstation/icon_batch_submit.png"
+							style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+						鎵归噺鎻愪氦
+					</wu-button>
+				</view>
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleFour" shape="circle" :hairline="true" size="small"
+						@click="toBatchSaveDutyRecord" :plain="true">
+						<image src="/static/custom/operationTask/workstation/icon_batch_save.png"
+							style="width: 30rpx; height: 30rpx; margin-right: 5rpx;"></image>
+						鎵归噺淇濆瓨
+					</wu-button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	import {
+		dateFormat
+	} from "@/utils/date.js";
+	export default {
+		components: {},
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				dutyRecordInfo: {
+					crewId: null,
+					dutyDate: null,
+					dutyNo: null,
+					dutyTime: null,
+					endTime: null,
+					id: null,
+					isLimitUpd: true,
+					isSubmit: null,
+					operationType: null,
+					shiftId: null,
+					startTime: null,
+					isConfirm: null,
+					workstationId: null
+				},
+				updateDutyForm: {
+					dutyNo: null,
+					crewId: null,
+					dutyDate: null,
+					startTime: null,
+					endTime: null,
+					dutyTime: null,
+					shiftId: null,
+					id: null,
+					isSubmit: null
+				},
+				status: false,
+				editState: true,
+				shiftList: [],
+				crewList: [],
+				shifts: [],
+				submitNotice: "",
+				unsubmitNotice: "",
+				workstationInfo: {
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null,
+					workCenter: null,
+					dutyRecordId: null
+				}
+			}
+		},
+		computed: {
+			customStyleOne() {
+				return {
+					color: '#FFFFFF',
+					background: '#214DED',
+					width: '140rpx'
+				}
+			},
+			customStyleTwo() {
+				return {
+					color: '#000000',
+					// background: '#214DED',
+					width: '150rpx'
+				}
+			},
+			customStyleThree() {
+				return {
+					color: '#214DED',
+					// background: 'rgba(250, 252, 255, 0.36);',
+					width: '150rpx',
+					border: "1px solid #214DED"
+				}
+			},
+			customStyleFour() {
+				return {
+					color: '#214DED',
+					// background: 'rgba(250, 252, 255, 0.36);',
+					width: '190rpx',
+					border: "1px solid #214DED"
+				}
+			},
+			customStyleFive() {
+				return {
+					color: 'red',
+					width: '140rpx',
+					border: "1px solid red"
+				}
+			}
+		},
+		onLoad(option) {
+			this.getShiftList();
+			this.getCrewList();
+
+			if (option && option.id !== "null") {
+				this.getWorkstationList(option.id);
+			}
+		},
+		onShow() {
+
+		},
+		methods: {
+			toWorkstation() {
+				uni.navigateTo({
+					url: '/pages/product/produce/workstationList/workstationList'
+				})
+			},
+			toDutyRecordHistory() {
+				uni.navigateTo({
+					url: './dutyRecordHistory?id=' + this.workstationInfo.workstationId
+				})
+			},
+			toUnSubmitDutyRecord() {
+				uni.navigateTo({
+					url: './unSubmitDutyRecord?workCenter=' + this.workstationInfo.workCenter
+				})
+			},
+			toBatchSaveDutyRecord() {
+				const validResult = this.validDutyForm()
+				if (validResult.result) {
+					if (this.dutyRecordInfo.id) {
+						this.$u.toast('璇ョ彮娆″凡瀛樺湪锛屼笉鍙繘琛屾壒閲忎繚瀛樻搷浣�')
+					} else {
+						let params = this.dutyRecordInfo;
+						this.$set(params, 'workCenter', this.workstationInfo.workCenter)
+
+						uni.navigateTo({
+							url: './dutyRecordWorkstation?params=' + encodeURIComponent(JSON.stringify(params))
+						})
+					}
+				} else {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: validResult.msg,
+						showCancel: false,
+						success: function() {}
+					});
+				}
+			},
+			setWorkstation(workstation) {
+				this.workstationInfo.workstationId = workstation.id;
+				this.workstationInfo.workstationNo = workstation.workstationNo;
+				this.workstationInfo.workstationName = workstation.name;
+				this.workstationInfo.workCenter = workstation.workCenter;
+				this.workstationInfo.dutyRecordId = workstation.dutyRecordId;
+				// 瀛樺叆缂撳瓨
+				uni.setStorage({
+					key: 'workstation',
+					data: JSON.stringify(workstation),
+					success: function() {}
+				});
+
+				this.clear();
+				this.getDutyRecordByWorkstationId(workstation.id);
+			},
+			getShiftList() {
+				this.$u.api.operationTask.getShiftList({}).then(res => {
+					res.data.forEach((el) => {
+						const shift = {
+							text: el.name,
+							value: el.id
+						};
+						this.shiftList.push(shift);
+						this.shifts = res.data;
+					});
+				});
+			},
+			getCrewList() {
+				this.$u.api.operationTask.getCrewList({}).then(res => {
+					res.data.forEach((el) => {
+						const crew = {
+							text: el.crewName,
+							value: el.id
+						};
+						this.crewList.push(crew);
+					});
+				});
+			},
+			getDutyRecordByWorkstationId(workstationId) {
+				this.$u.api.outputRegister.getDutyRecordByWorkstationId({
+					id: workstationId
+				}).then(res => {
+					if (res.data) {
+						this.dutyRecordInfo = res.data;
+						this.workstationInfo.dutyRecordId = this.dutyRecordInfo.id;
+						if (this.dutyRecordInfo.isConfirm) {
+							this.status = true;
+						} else {
+							this.status = false;
+						}
+						this.noticeShow();
+					}
+				});
+			},
+			saveDutyRecord() {
+				this.dutyRecordInfo.workstationId = this.workstationInfo.workstationId;
+				const validResult = this.validDutyForm();
+				if (validResult.result) {
+					if (this.dutyRecordInfo.id) {
+						if (!this.status) {
+							this.updateDutyForm.dutyNo = this.dutyRecordInfo.dutyNo
+							this.updateDutyForm.crewId = this.dutyRecordInfo.crewId
+							this.updateDutyForm.dutyDate = this.dutyRecordInfo.dutyDate
+							this.updateDutyForm.startTime = this.dutyRecordInfo.startTime
+							this.updateDutyForm.endTime = this.dutyRecordInfo.endTime
+							this.updateDutyForm.dutyTime = this.dutyRecordInfo.dutyTime
+							this.updateDutyForm.shiftId = this.dutyRecordInfo.shiftId
+							this.updateDutyForm.id = this.dutyRecordInfo.id
+							this.updateDutyForm.isSubmit = this.dutyRecordInfo.isSubmit
+
+							this.$set(this.updateDutyForm, 'operationType', '缂栬緫');
+							this.$set(this.updateDutyForm, 'isLimitUpd', true);
+
+							this.updDutyRecord();
+						} else {
+							uni.showModal({
+								title: '鎻愮ず',
+								content: '璇ョ彮娆″凡纭锛屼笉鍙慨鏀�',
+								showCancel: false,
+								success: function() {}
+							});
+							return;
+						}
+					} else {
+						this.dutyRecordInfo.isSubmit = false;
+						this.addDutyRecord();
+					}
+				} else {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: validResult.msg,
+						showCancel: false,
+						success: function() {}
+					});
+					return;
+				}
+			},
+			addDutyRecord() {
+				this.$u.api.operationTask.addDutyRecord(this.dutyRecordInfo).then(res => {
+					if (res.code == 0) {
+						this.dutyRecordInfo = res.data;
+						this.status = false;
+						this.editState = true;
+						this.updWorkstation();
+
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '淇濆瓨鎴愬姛',
+							showCancel: false,
+							success: function() {}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: res.msg,
+							showCancel: false,
+							success: function() {}
+						})
+					}
+				});
+			},
+			updDutyRecord() {
+				this.$u.api.operationTask.updDutyRecord(this.updateDutyForm).then(res => {
+					if (res.code == 0) {
+						this.editState = true;
+						this.dutyRecordInfo = res.data;
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '淇敼鎴愬姛',
+							showCancel: false,
+							success: function() {}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: res.msg,
+							showCancel: false,
+							success: function() {
+
+							}
+						})
+					}
+				});
+			},
+			submitDutyRecord() {
+				if (!this.dutyRecordInfo.id) {
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '璇烽�夋嫨鐝鎻愪氦',
+						showCancel: false,
+						success: function() {}
+					});
+					return;
+				}
+
+				const params = {
+					id: this.dutyRecordInfo.id,
+					isLimitUpd: true,
+					isSubmit: true,
+					operationType: '鎻愪氦'
+				}
+
+				this.$u.api.operationTask.updDutyRecord(params).then(res => {
+					if (res.code == 0) {
+						this.dutyRecordInfo = res.data;
+						this.noticeShow();
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦鎴愬姛',
+							showCancel: false,
+							success: function() {}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: res.msg,
+							showCancel: false,
+							success: function() {
+
+							}
+						})
+					}
+				});
+			},
+			// 宸ヤ綔绔欑粦瀹氱彮娆�
+			updWorkstation() {
+				const params = {
+					id: this.workstationInfo.workstationId,
+					dutyRecordId: this.dutyRecordInfo.id
+				};
+				this.$u.api.operationTask.updWorkstation(params);
+			},
+			getWorkstationList(workstationId) {
+				this.$u.api.operationTask.getWorkstationList({
+					id: workstationId
+				}).then(res => {
+					if (res.code == 0) {
+						const workstation = res.data[0];
+						this.workstationInfo.workstationId = workstation.id;
+						this.workstationInfo.workstationNo = workstation.workstationNo;
+						this.workstationInfo.workstationName = workstation.name;
+						this.workstationInfo.workCenter = workstation.workCenter;
+
+						this.getDutyRecordByWorkstationId(workstation.id);
+					}
+				});
+			},
+			selectShiftChanged(shiftId) {
+				const shift = this.shifts.find((item) => item.id === shiftId)
+				let date = new Date()
+				if (this.dutyRecordInfo.dutyDate) {
+					date = this.dutyRecordInfo.dutyDate
+				} else {
+					this.dutyRecordInfo.dutyDate = dateFormat(date)
+				}
+				this.autoValue(shift, date)
+			},
+			selectDutyDate(dutyDate) {
+				const shift = this.shifts.find(
+					(item) => item.id === this.dutyRecordInfo.shiftId
+				)
+				if (shift) {
+					this.autoValue(shift, dutyDate)
+				}
+			},
+			deleteDutyRecord() {
+				if (this.dutyRecordInfo.isSubmit) {
+					this.$u.toast('璇ョ彮娆″凡鎻愪氦锛佷笉鍙垹闄わ紒');
+					return;
+				}
+				let that = this
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭鍒犻櫎鐝璁板綍缂栧彿涓猴細' + this.dutyRecordInfo.dutyNo,
+					success: function(res) {
+						if (res.confirm) {
+							that.$u.api.operationTask.delDutyRecord({
+								id: that.dutyRecordInfo.id
+							}).then(res => {
+								if (res.code == 0) {
+									that.clear();
+								}
+							});
+						} else if (res.cancel) {
+							return;
+						}
+					}
+				});
+			},
+			autoValue(shift, date) {
+				const a = [
+					'sunday',
+					'monday',
+					'tuesday',
+					'wensday',
+					'thursday',
+					'friday',
+					'saturday'
+				]
+				const day = a[new Date().getDay()]
+				const hours = day + 'Hours'
+				const workHours = day + 'WorkHours'
+				const start = shift[`${hours}`].split('-')[0]
+				const end = shift[`${hours}`].split('-')[1]
+				this.dutyRecordInfo.startTime =
+					this.dutyRecordInfo.dutyDate.split(' ')[0] + ' ' + start + ':00'
+				// 澶滅彮杩欑鎯呭喌缁撴潫鏃堕棿瑕佽绠楀埌涓嬩竴澶�
+				if (start < end) {
+					this.dutyRecordInfo.endTime =
+						this.dutyRecordInfo.dutyDate.split(' ')[0] + ' ' + end + ':00'
+				} else {
+					const nextDay = dateFormat(
+						new Date(new Date().setDate(new Date(date).getDate() + 1))
+					)
+					this.dutyRecordInfo.endTime = nextDay.split(' ')[0] + ' ' + end + ':00'
+				}
+				this.dutyRecordInfo.dutyTime = shift[`${workHours}`]
+			},
+			dutyDateChange(e) {
+				this.dutyRecordInfo.dutyDate = e + ' 00:00:00';
+				this.selectDutyDate();
+			},
+			validDutyForm() {
+				if (!this.dutyRecordInfo.dutyDate) {
+					return {
+						result: false,
+						msg: '鐝鏃ユ湡涓嶈兘涓虹┖'
+					}
+				}
+				if (!this.dutyRecordInfo.startTime) {
+					return {
+						result: false,
+						msg: '寮�濮嬫椂闂翠笉鑳戒负绌�'
+					}
+				}
+				if (!this.dutyRecordInfo.endTime) {
+					return {
+						result: false,
+						msg: '缁撴潫鏃堕棿涓嶈兘涓虹┖'
+					}
+				}
+				if (!this.dutyRecordInfo.dutyTime) {
+					return {
+						result: false,
+						msg: '鐝鏃堕棿涓嶈兘涓虹┖'
+					}
+				}
+				if (!this.dutyRecordInfo.shiftId) {
+					return {
+						result: false,
+						msg: '鐝涓嶈兘涓虹┖'
+					}
+				}
+				if (!this.dutyRecordInfo.workstationId) {
+					return {
+						result: false,
+						msg: '宸ヤ綔绔欎笉鑳戒负绌�'
+					}
+				}
+				return {
+					result: true,
+					msg: ''
+				}
+			},
+			noticeShow() {
+				if (this.dutyRecordInfo.isSubmit) {
+					this.submitNotice = "璇ョ彮娆″凡鎻愪氦!";
+					this.unsubmitNotice = "";
+				} else {
+					this.unsubmitNotice = "璇ョ彮娆℃湭鎻愪氦!";
+					this.submitNotice = "";
+				}
+			},
+			clear() {
+				Object.keys(this.dutyRecordInfo).forEach(key => {
+					this.dutyRecordInfo[key] = null;
+				});
+				if (this.workstationInfo.workstationId) {
+					this.dutyRecordInfo.workstationId = this.workstationInfo.workstationId;
+				}
+				this.submitNotice = "";
+				this.unsubmitNotice = "";
+			},
+			edit() {
+				this.editState = !this.editState;
+			}
+		},
+	}
+</script>
+<style lang="scss" scoped>
+	.workstation-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.slot-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.slot-text {
+		flex: 1;
+		font-size: 30rpx;
+		margin-right: 10px;
+	}
+
+	.content-notice {
+		height: 45rpx;
+		text-align: center;
+		margin: 0;
+	}
+
+	.content {
+		font-size: 12px;
+		background-color: rgba(250, 252, 255, 0.36);
+		box-sizing: border-box;
+		border-radius: 10rpx;
+		margin: 0rpx 0rpx 24rpx;
+		padding: 10rpx 20rpx;
+		box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+		position: relative;
+
+		.content-header {
+			height: 90rpx;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+
+			.content-header-left {
+				display: flex;
+				align-items: center;
+				margin-left: 10rpx;
+
+				.content-header-icon-one {
+					background-image: url('~@/static/custom/materialReturn/label-icon-1.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height: 32rpx;
+					width: 32rpx;
+				}
+
+				.content-header-title {
+					margin-left: 11rpx;
+					font-size: 32rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+
+				text {
+					font-size: 32rpx;
+				}
+			}
+
+			.content-header-right {
+				display: flex;
+
+				.edit-icon {
+					background-image: url('~@/static/custom/operationTask/edit-icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height: 32rpx;
+					width: 32rpx;
+					margin-right: 35rpx;
+				}
+
+				.clear-icon {
+					background-image: url('~@/static/custom/operationTask/workstation/icon_clear.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height: 32rpx;
+					width: 32rpx;
+					margin-right: 35rpx;
+				}
+			}
+		}
+
+		.content-body {
+			margin-top: 20rpx;
+
+			.content-body-title {
+				margin-left: 30rpx;
+				font-size: 38rpx;
+				font-weight: bold;
+			}
+
+			.content-body-item {
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display: flex;
+				justify-content: space-between;
+				border: none;
+				margin: 20rpx 30rpx 0rpx 30rpx;
+				font-size: 32rpx;
+
+				.content-body-item-left {}
+
+				.content-body-item-right {
+
+
+	
+	
+					._select {
+						padding-top: 10rpx;
+						width: 300rpx;
+						border: none;
+						text-align: right;
+					}
+				}
+			}
+
+			.param-extra {
+				border-bottom: 1px solid #D5D5D5;
+			}
+		}
+
+		.content-footer {
+			margin: 30rpx ;
+			display: flex;
+			justify-content: flex-end;
+
+			.footer-button {
+				margin-right: 35rpx;
+			}
+		}
+	}
+
+	.bottom {
+		height: 100rpx;
+		display: flex;
+		justify-content: space-between;
+
+		.bottom-btn {
+			margin: 10rpx 10rpx;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/workstationList/unSubmitDutyRecord.vue b/pages/product/produce/workstationList/unSubmitDutyRecord.vue
new file mode 100644
index 0000000..24db420
--- /dev/null
+++ b/pages/product/produce/workstationList/unSubmitDutyRecord.vue
@@ -0,0 +1,369 @@
+<template>
+	<view class="page">
+		<view class="workstation-index-bg" />
+		<u-navbar title="鐝閫夋嫨" :background="background" :border-bottom="false" :title-bold="true" title-color="#000"
+			back-icon-color="#000" />
+
+		<view class="wrap">
+			<scroll-view class="operation-task-scroll-list" scroll-y="true">
+				<u-cell-group class="duty-record-scroll-list-group" :border="false">
+					<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+						<view class="content-header">
+							<radio :value="item.id" :checked="item.isChecked" style="transform:scale(0.6)"
+								@click="choose(item)" />
+							<view class="content-header-title">鐝缂栧彿锛歿{ item.dutyNo }}</view>
+						</view>
+						<view class="content-body" @click="choose(item)">
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									宸ヤ綔绔欑紪鍙凤細
+								</view>
+								<view class="_content">
+									{{ item.workstationNo }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									宸ヤ綔绔欙細
+								</view>
+								<view class="_content">
+									{{ item.workstationName }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									鐢熶骇鐝锛�
+								</view>
+								<view class="_content">
+									{{ item.shiftName }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									鐢熶骇鐝粍锛�
+								</view>
+								<view class="_content">
+									{{ item.crewName }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									寮�濮嬫椂闂达細
+								</view>
+								<view class="_content">
+									{{ item.startTime }}
+								</view>
+							</view>
+
+							<view class="row-list">
+								<view class="_label">
+									<view class="content-body-icon-one"></view>
+									缁撴潫鏃堕棿锛�
+								</view>
+								<view class="_content">
+									{{ item.endTime }}
+								</view>
+							</view>
+						</view>
+					</view>
+				</u-cell-group>
+			</scroll-view>
+			<view class="bottom">
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleOne" size="normal" @click="onCancel"
+						style="padding-left: 15rpx;">
+						鍙栨秷
+					</wu-button>
+				</view>
+				<view class="bottom-btn">
+					<wu-button :custom-style="customStyleTwo" size="normal" @click="onSubmit"
+						style="padding-right: 15rpx;">
+						纭畾
+					</wu-button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	export default {
+		data() {
+			return {
+				background: {
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				workCenter: null,
+				list: [],
+				current: 0,
+			}
+		},
+		computed: {
+			customStyleOne() {
+				return {
+					color: '#666666',
+					background: '#FFFFFF',
+					width: '350rpx'
+				}
+			},
+			customStyleTwo() {
+				return {
+					color: '#FFFFFF',
+					background: '#234EED',
+					width: '350rpx'
+				}
+			},
+		},
+		onLoad(option) {
+			if (option.workCenter) {
+				this.workCenter = option.workCenter;
+				this.loadList();
+			}
+		},
+		methods: {
+			loadList() {
+				this.$u.api.operationTask.getUnsubmitDutyRecord({
+					workCenter: this.workCenter
+				}).then(res => {
+					if (res.code == 0 && res.data.length > 0) {
+						this.list = res.data;
+						this.list.forEach(el => {
+							this.$set(el, 'isChecked', true);
+						})
+					}
+				});
+			},
+			choose(item) {
+				if (item.isChecked) {
+					item.isChecked = false
+				} else {
+					item.isChecked = true
+				}
+			},
+			onCancel() {
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			onSubmit() {
+				const initList = this.list.filter(item => item.isChecked == true);
+
+				const ids = initList.map((item) => {
+					return item.id
+				})
+
+				this.$u.api.operationTask.batchSubmitDutyRecord(ids).then(res => {
+					if (res.code == 0) {
+						this.$u.toast('鎻愪氦鎴愬姛');
+						// 杩斿洖涓婁竴椤�
+						setTimeout(() => {
+							uni.navigateBack({
+								delta: 1
+							});
+						}, 1000)
+					} else {
+						this.$u.toast('鎻愪氦澶辫触锛�' + res.msg);
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.workstation-index-bg {
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+
+	.wrap {}
+
+	.wrap .operation-task-scroll-list {
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 254rpx);
+		width: 100%;
+	}
+
+	.bottom {
+		display: flex;
+		justify-content: space-between;
+		height: 100rpx;
+		margin-top: 20rpx;
+	}
+
+	.duty-record-scroll-list-group {
+		::v-deep .u-cell-item-box {
+			background-color: rgba(250, 252, 255, 0.36) !important;
+			padding: 0rpx 30rpx;
+		}
+
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 24rpx;
+			height: 392rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: 0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position: relative;
+
+			.content-header {
+				display: flex;
+				align-items: center;
+
+				.header-item-bottom {
+					height: 50rpx;
+					display: flex;
+					align-items: center;
+
+					.content-header-icon-two {
+						background-image: url('~@/static/custom/materialReturn/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+					}
+
+					.content-header-title-ne {
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+				}
+			}
+
+			.content-body {
+				height: 320rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 10rpx 23rpx;
+
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size: 26rpx;
+					align-items: center;
+					width: 190rpx;
+
+					.content-body-icon-one {
+						background-image: url('~@/static/custom/operationTask/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 18rpx;
+						width: 18rpx;
+						margin-right: 10rpx;
+					}
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+
+					.edit_icon {
+						background-image: url('~@/static/custom/materialReturn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 26rpx;
+						width: 26rpx;
+					}
+
+					::v-deep .uni-input-input {
+						color: #D35651;
+					}
+				}
+
+				.row-list .s1 {
+					display: flex;
+					color: #214DED;
+					font-size: 26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+			}
+
+			.content-footer {
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					// justify-content: space-between;
+
+					.content-footer-time-icon {
+						background-image: url('~@/static/custom/operationTask/time-icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height: 28rpx;
+						width: 28rpx;
+						margin-right: 3px;
+					}
+				}
+
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size: 26rpx;
+					align-items: center;
+					width: 200rpx;
+				}
+
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+
+					._content-text {
+						color: #214ded;
+					}
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/product/produce/workstationList/workstationList.vue b/pages/product/produce/workstationList/workstationList.vue
new file mode 100644
index 0000000..438127d
--- /dev/null
+++ b/pages/product/produce/workstationList/workstationList.vue
@@ -0,0 +1,287 @@
+<template>
+	<view class="page">
+	  <view class="productfeed-workstation-bg"/>
+		<!-- <u-navbar title="宸ヤ綔绔�" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/> -->
+		<view class="productfeed-workstation-search">
+			<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ伐浣滅珯缂栧彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+	  </view>
+	  <view class="wrap">
+		<scroll-view class="productfeed-workstation-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="productfeed-workstation-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.workstationNo" :index="index"
+					@click="selectWorkstation(item)">
+					<view class="content-header">
+							<view class="content-header-icon"></view>
+							<view class="content-header-title">{{ item.workstationNo }}</view>
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-1">
+									</view>
+									<view class="_label-name">缂栧彿锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.workstationNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-2">
+									</view>
+									<view class="_label-name">鍚嶇О锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.name }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-3">
+									</view>
+									<view class="_label-name">澶囨敞锛�</view>	
+								</view>
+								<view class="_content s1">
+									{{ item.remark }}
+								</view>
+							</view>
+						</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<scan></scan>		
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/product/productBg.png'
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				workStationList:[],
+				originList: [],
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				query: {
+					current: 1,
+					size: 10,
+					workstationNo:""
+				},
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			
+			let that = this
+					
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.search(data.code);					
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+		
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {	
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+
+				// 鏌ヨ宸ヤ綔绔欏垪琛�
+				this.$u.api.pigxFeed.fetchWorkstationList(this.query).then(res => {
+					
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}									
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			search(value) {
+							
+				let that = this
+				that.list = [];
+				that.total = 0;
+				
+				that.query= {
+					current: 1,
+					size: 20,
+					workstationNo:value
+				}
+				that.loadList()
+			},
+			selectWorkstation(workstation) {
+				this.refreshLastPage(workstation)
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(workstation) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+				let prevTwoPage = pages[pages.length - 3]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setWorkstation(workstation)
+				prevTwoPage.$vm.setWorkstation(workstation)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.productfeed-workstation-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/product/productBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	.productfeed-workstation-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.wrap .productfeed-workstation-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.productfeed-workstation-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}	
+</style>
diff --git a/pages/product/report/index.scss b/pages/product/report/index.scss
new file mode 100644
index 0000000..9f36785
--- /dev/null
+++ b/pages/product/report/index.scss
@@ -0,0 +1,113 @@
+.body {
+  background: linear-gradient(to bottom, #e5f0ff, #f6f9ff);
+  box-sizing: border-box;
+  padding-top: 26rpx;
+  height: 100vh;
+}
+.top_code {
+  height: 80rpx;
+  display: flex;
+  align-items: center;
+  margin: 0 30rpx;
+  margin-bottom: 10rpx;
+}
+.top_code_edit {
+  text-align: right;
+  flex: 1;
+  margin-bottom: 18rpx;
+}
+.main_view {
+  margin-top: 5rpx;
+  background-image: url("~@/static/custom/home/home_img_bg.png");
+  background-repeat: no-repeat;
+  background-size: 100% auto;
+  border-radius: 15rpx;
+  height: 936rpx;
+  margin: 0 30rpx;
+  box-sizing: border-box;
+  padding: 37rpx 25rpx;
+}
+
+.product-number-icon {
+  background-image: url("~@/static/custom/daily/icon_number.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  height: 32rpx;
+  width: 32rpx;
+  position: relative;
+  margin-right: 8rpx;
+}
+
+.product-edit-icon {
+  background-image: url("~@/static/custom/daily/icon_edit.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  height: 32rpx;
+  width: 32rpx;
+  position: relative;
+}
+.icon_history {
+  background-image: url("~@/static/custom/daily/icon_history.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  height: 26rpx;
+  width: 26rpx;
+  margin-right: 8rpx;
+  position: relative;
+}
+.icon_save {
+  background-image: url("~@/static/custom/daily/icon_save.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  height: 26rpx;
+  width: 26rpx;
+  margin-right: 8rpx;
+  position: relative;
+}
+.icon_right {
+  background-image: url("~@/static/custom/daily/icon_right.png");
+  background-repeat: no-repeat;
+  background-size: cover;
+  height: 26rpx;
+  width: 26rpx;
+  margin-right: 8rpx;
+  position: relative;
+}
+.main_top_title {
+  font-weight: 800;
+  font-size: 34rpx;
+  color: #1d2541;
+  margin-bottom: 20rpx;
+}
+.main_item {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  font-size: 30rpx;
+  line-height: 112rpx;
+  border-bottom: 1rpx solid rgba(213, 213, 213, 0.67);
+  box-sizing: border-box;
+  .value2 {
+    width: 450rpx; /*鐩掑瓙鏈�澶у搴�*/
+    overflow: hidden;
+    text-overflow: ellipsis; /* 璁剧疆鏂囨湰婧㈠嚭鏃舵樉绀虹渷鐣ュ彿 */
+    white-space: nowrap; /* 璁剧疆涓嶆崲琛� */
+    text-align: right;
+    padding-left: 40rpx;
+  }
+}
+.btns {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  margin-top: 33rpx;
+  .uni-button {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  ::v-deep.u-icon__icon {
+    height: 26rpx;
+    width: 26rpx;
+  }
+}
diff --git a/pages/product/report/index.vue b/pages/product/report/index.vue
new file mode 100644
index 0000000..e12c3ec
--- /dev/null
+++ b/pages/product/report/index.vue
@@ -0,0 +1,489 @@
+<template>
+	<view class="body">
+		<view class="top_code">
+			<u-icon class="product-number-icon"></u-icon>缂栧彿锛�
+			<text selectable>{{ dutyNo }}</text>
+			<view class="top_code_edit">
+				<u-icon class="product-edit-icon" @click="edit" v-show="true"></u-icon>
+			</view>
+		</view>
+		<view class="main_view">
+			<h3 class="main_top_title">宸ヤ綔鍙�</h3>
+			<view class="main_item" @click="goPage(0)">
+				<span style="color:#4F4F4F">宸ヤ綔绔�</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.workstationName }}</span>
+					<u-icon v-if="isShowButton" name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(1)">
+				<span style="color:#4F4F4F">宸ュ簭</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.operationName }}</span>
+					<u-icon v-if="isShowButton" name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(2)">
+				<span style="color:#4F4F4F">鏃ユ湡</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.updateTime }}</span>
+					<u-icon v-if="isShowButton" name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(3)">
+				<span style="color:#4F4F4F">鐝</span>
+				<view>
+					<span style="color:#333333;margin-right: 20rpx;">{{ query.clazzType }}</span>
+					<u-icon v-if="isShowButton" name="arrow-right" color="#687792" size="28"></u-icon>
+				</view>
+			</view>
+			<view class="main_item" @click="goPage(4)">
+				<span style="color:#4F4F4F;width: 118rpx;">鐢熶骇浜哄憳</span>
+				<view class="value2">
+					<span style="color:#333333;margin-right: 20rpx;">{{ staffNameJoin }}</span>
+				</view>
+				<u-icon v-if="isShowButton" name="arrow-right" color="#687792" size="28"></u-icon>
+			</view>
+			<view class="main_item">
+				<span style="color:#4F4F4F">鍒涘缓浜�</span>
+				<view>
+					<span style="color:#333333;">{{ query.createUser }}</span>
+				</view>
+			</view>
+			<view class="btns">
+				<u-button :custom-style="customStyle" @click="goPage(9)">鏉傚伐</u-button>
+				<u-button :custom-style="customStyle" style="width: 150rpx;" @click="goPage(6)">
+					<u-icon class="icon_history" size="26rpx" />
+					<span style="line-height: 40rpx;">鍘嗗彶</span>
+				</u-button>
+				<u-button v-if="isShowButton" @click="submit" :custom-style="customStyle"
+					style="background: #30AFFF;color: #fff;border: 0;width: 150rpx;">
+					<u-icon class="icon_save" size="26rpx" />
+					<span style="line-height: 40rpx;">淇濆瓨</span>
+				</u-button>
+				<u-button :custom-style="customStyle" style="background: #214DED;color: #fff;border: 0;width: 150rpx;"
+					@click="goPage(8)">
+					<u-icon class="icon_right" size="26rpx" />
+					<span style="line-height: 40rpx;">鎶ュ伐</span></u-button>
+			</view>
+		</view>
+		<u-calendar v-model="calendarShow" :mode="mode" @change="changeCalendar"></u-calendar>
+		<!--宸ュ簭涓嬫媺妗�-->
+		<u-select :default-value="[operationIndex]" v-model="selectShowOperation" :list="operationList"
+			@confirm="confirmOperation"></u-select>
+		<u-select v-model="selectShowClazzType" :list="clazzTypeList" @confirm="confirmClazzType"></u-select>
+		<u-toast ref="uToast" />
+	</view>
+</template>
+
+<script>
+import {
+	dateFormat
+} from "@/utils/date.js";
+import UIcon from "../../../uview-ui/components/u-icon/u-icon.vue";
+export default {
+	components: {
+		UIcon
+	},
+	data() {
+		return {
+			customStyle: {
+				'background': '#FFFFFF',
+				'border-radius': '8rpx',
+				'border': '1px solid #D2D2D2',
+				'width': '121rpx',
+				'height': '65rpx',
+				'font-weight': 500,
+				'font-size': '28rpx',
+				'color': '#333333',
+				'pading': '0 30rpx'
+			},
+			calendarShow: false,
+			selectShowOperation: false,
+			selectShowClazzType: false,
+			mode: 'date',
+			id: '',
+			dutyNo: '', // 缂栧彿
+			query: {
+				updateTime: dateFormat(
+					new Date(), 'yyyy-MM-dd'),
+				workstationName: '', // 宸ヤ綔绔欏悕绉�
+				workstationId: '', // 宸ヤ綔绔檌d
+				clazzType: '', // 鐝
+				productionUser: '',
+				operationId: '', // 宸ュ簭id
+				operationName: '', // 宸ュ簭鍚嶇О
+				userList: [],
+				createUser: ''
+			},
+			toId: '',
+			operationList: [],
+			clazzTypeList: [{
+				label: '鐧界彮'
+			},
+			{
+				label: '鏅氱彮'
+			},
+			],
+			workstation: '',
+			staffNameJoin: '',
+			operationIndex: '',
+			isEdit: false, // 鏄惁淇敼
+			isShowButton: false,
+			workCenter: '',
+			addOrEdit: '',
+			info: {},
+			firstOperationId: null,
+			lastOperationId: null,
+		}
+	},
+	onShow() {
+		// this.getLastDutyRecordFun()
+	},
+	onLoad() {
+		uni.$on('dailyListInfo', (info) => {
+			this.dutyNo = info.dutyNo
+			this.id = info.id
+			this.query.createUser = this.vuex_username
+			this.query.clazzType = info.clazzType
+			this.query.workstationId = info.workstationId
+			this.query.workstationName = info.workstationName
+			this.query.productionUser = info.productionUser.split(',').reverse()
+			this.query.userList = info.productionUserList.split(',')
+			this.query.operationId = info.operationId
+			this.getOperation()
+		})
+
+		uni.$on('returnData', (data) => {
+			// 涓存椂瀛樺偍宸ヤ綔绔欑殑鏁版嵁
+			this.workstation = data
+			// 缁欓〉闈㈠伐浣滅珯璧嬪��
+			this.query.workstationName = '(' + data.workCenter + ')' + data.name
+			this.query.workstationId = data.id
+			// 娓呯┖宸ュ簭閫夐」
+			this.query.operationName = ''
+			this.query.operationId = ''
+			this.operationIndex = 0
+			this.getOperationTaskFun(data.workCenter)
+		})
+		uni.$on('checkedList', (data) => {
+			let staffNameList = []
+			let staffNoList = []
+			data.forEach(i => {
+				staffNameList.push(i.staffName)
+				staffNoList.push(i.staffNo)
+			})
+			this.query.productionUser = staffNameList
+			this.query.userList = staffNoList
+		});
+	},
+	onReady() {
+		// 棣栨杩涘叆椤甸潰鑾峰彇褰撳墠鐧诲綍浜烘渶鍚庝竴娆℃彁浜ょ殑鏃ユ姤
+		this.getLastDutyRecordFun()
+	},
+	methods: {
+		isNotOperationName(workCenter, operationName, workCenterTwo) {
+			// 鍒ゆ柇鏄惁涓鸿宸ヤ綔绔�
+			if (workCenter.includes(workCenterTwo)) {
+				// 鍒ゆ柇鏄惁鍖呭惈宸ュ簭鍚嶇О
+				if (!operationName.includes(this.query.operationName)) {
+					return true
+				} else {
+					return false
+				}
+			} else {
+				return false
+			}
+		},
+		// 鍒ゆ柇宸ュ崟鏄惁绛変簬,鍚屾椂鍒ゆ柇鏄惁涓虹涓�閬撳伐搴�
+		isFirstOperationId(workCenter, workCenterTwo) {
+			if (workCenter.includes(workCenterTwo)) {
+				// 鍒ゆ柇鏄惁涓嶄负绗竴閬撳伐搴�
+				if (this.query.operationId !== this.firstOperationId) {
+					return true
+				} else {
+					return false
+				}
+			} else {
+				return false
+			}
+		},
+		// 棣栨杩涘叆椤甸潰鑾峰彇褰撳墠鐧诲綍浜烘渶鍚庝竴娆℃彁浜ょ殑鏃ユ姤
+		getLastDutyRecordFun() {
+			this.$u.api.dailyPaper.getLastDutyRecord().then(res => {
+				if (res.code === 0) {
+					this.dutyNo = res.data.dutyNo
+					this.id = res.data.id
+					this.query.createUser = this.vuex_username
+					this.query.clazzType = res.data.clazzType
+					this.query.workstationId = res.data.workstationId
+					this.query.workstationName = res.data.workstationName
+					this.query.productionUser = res.data.productionUser.split(',').reverse()
+					this.query.userList = res.data.productionUserList.split(',')
+					this.query.operationId = res.data.operationId
+					this.getOperation()
+				} else {
+					this.$u.toast(res.msg)
+				}
+			})
+		},
+		// 娓呯┖閫昏緫
+		onNavigationBarButtonTap(e) {
+			this.isEdit = true
+			this.isShowButton = true
+			this.addOrEdit = 'add'
+			this.query.productionUser = ''
+			this.query.productionUserList = []
+			this.staffNameJoin = ''
+			this.query.updateTime = ''
+		},
+		edit() {
+			this.isEdit = !this.isEdit
+			this.isShowButton = this.isEdit
+			this.addOrEdit = 'edit'
+		},
+		goPage(index) {
+			switch (index) {
+				// 璺宠浆鍒板巻鍙查〉闈�
+				case 6:
+					uni.navigateTo({
+						url: '/pages/daily/daily/daily-list'
+					})
+					break;
+				// 璺宠浆鍒版姤宸ラ〉闈�
+				case 8:
+					if (this.isEdit) {
+						this.$refs.uToast.show({
+							title: '璇峰厛淇濆瓨淇敼',
+							type: 'warning '
+						})
+						return
+					}
+
+					let workCenter = this.query.workstationName.split(')')[0].substring(1)
+					let operation = this.query.workstationName.split(')')[1]
+					console.log(workCenter, operation, this.firstOperationId, this.query.operationId, this.query)
+					if (workCenter == "TM-01" || workCenter == "JG-01" || workCenter == "YB-04" || this.isFirstOperationId('DY-01,GY-01,YB-01,YB-02', workCenter) || this.isNotOperationName('ZZ-02', '浜岃,娉ㄦ补', workCenter)) {
+						let item = {
+							workstationId: this.query.workstationId,
+							clazzType: this.query.clazzType,
+							dutyNo: this.dutyNo,
+							userStaffNo: this.query.userList,
+							workstationName: this.query.workstationName,
+							staffNameJoin: this.staffNameJoin,
+							workCenter: workCenter,
+							operationId: this.query.operationId,
+							firstOperationId: this.firstOperationId,
+							lastOperationId: this.lastOperationId
+						}
+						uni.navigateTo({
+							url: '/pages/daily/common/work-reporting?info=' + encodeURIComponent(JSON
+								.stringify(item))
+						})
+					} else if (this.query.workstationName.includes("TX-02") && !this.query.operationName.includes("鍙犺")) {
+						let item = {
+							workstationId: this.query.workstationId,
+							clazzType: this.query.clazzType,
+							dutyNo: this.dutyNo,
+							userStaffNo: this.query.userList,
+							workstationName: this.query.workstationName,
+							staffNameJoin: this.staffNameJoin,
+							workCenter: "TX-02",
+							operationId: this.query.operationId,
+							firstOperationId: this.firstOperationId,
+							lastOperationId: this.lastOperationId
+						}
+						uni.navigateTo({
+							url: '/pages/daily/common/work-reporting?info=' + encodeURIComponent(JSON
+								.stringify(item))
+						})
+					} else {
+						uni.navigateTo({
+							url: `/pages/daily/common/work-order-list?workstationId=${this.query.workstationId}&toId=${this.toId}&clazzType=${this.query.clazzType}&dutyNo=${this.dutyNo}&userStaffNo=${this.query.userList}&workstationName=${this.query.workstationName}&staffNameJoin=${this.staffNameJoin}`
+						})
+					}
+					break;
+				// 璺宠浆鍒版潅宸ラ〉闈�
+				case 9:
+					if (this.isEdit) {
+						this.$refs.uToast.show({
+							title: '璇峰厛淇濆瓨淇敼',
+							type: 'warning '
+						})
+						return
+					}
+					uni.navigateTo({
+						url: `/pages/daily/handyman/handyman?dutyNo=${this.query.dutyNo}&updateTime=${this.query.updateTime}&userList=${this.query.productionUser}&staffList=${this.query.userList}`
+					})
+					break;
+			}
+			if (!this.isEdit) {
+				return
+			} else {
+				switch (index) {
+					case 0:
+						uni.navigateTo({
+							url: '/pages/daily/workstation/index'
+						})
+						break;
+					case 1:
+						if (!this.query.workstationName) {
+							this.$refs.uToast.show({
+								title: '璇峰厛閫夋嫨宸ヤ綔绔�',
+								type: 'warning '
+							})
+						} else {
+							this.selectShowOperation = true;
+						}
+						break;
+					case 2:
+						this.calendarShow = true;
+						break;
+					case 3:
+						this.selectShowClazzType = true;
+						break;
+					case 4:
+						let staffList = this.query.productionUser
+						let staffNoList = this.query.userList
+						const list = []
+						for (const i in staffList) {
+							const obj = {
+								staffName: staffList[i],
+								staffNo: staffNoList[i]
+							}
+							list.push(obj)
+						}
+						uni.navigateTo({
+							url: '/pages/daily/production-person/production-person?list=' + encodeURIComponent(
+								JSON.stringify(list))
+						})
+						break;
+				}
+			}
+		},
+		// 鎻愪氦鏃ユ姤淇敼
+		submit() {
+			if (!this.query.workstationId) {
+				this.$u.toast('璇烽�夋嫨宸ヤ綔绔�')
+				return
+			} else if (!this.query.operationId) {
+				this.$u.toast('璇烽�夋嫨宸ュ簭')
+				return
+			} else if (!this.query.clazzType) {
+				this.$u.toast('璇烽�夋嫨鐝')
+				return
+			} else if (!this.query.productionUser) {
+				this.$u.toast('璇烽�夋嫨鐢熶骇浜哄憳')
+				return
+			} else if (!this.query.updateTime) {
+				this.$u.toast('璇烽�夋嫨鏃堕棿')
+				return
+			}
+
+			let params = JSON.parse(JSON.stringify(this.query))
+			this.$delete(params, 'productionUser')
+			this.$delete(params, 'productionUserList')
+			params.updateTime = params.updateTime + ' 00:00:00'
+			params.id = null
+			if (this.addOrEdit === 'add') {
+				this.$u.api.dailyPaper.addDailyPaper(params).then(res => {
+					if (res.code === 0) {
+						// this.getLastDutyRecordFun()
+						this.query.createUser = this.vuex_username
+						this.$u.toast('淇濆瓨鎴愬姛')
+						this.isShowButton = false
+						this.getLastDutyRecordFun()
+					}
+				})
+			} else {
+				params.id = this.id
+				this.$u.api.dailyPaper.editDailyPaper(params).then(res => {
+					if (res.code === 0) {
+						// this.getLastDutyRecordFun()
+						this.$u.toast('淇敼鎴愬姛')
+						this.isShowButton = false
+					}
+				})
+			}
+			this.isEdit = false
+		},
+		changeCalendar(e) {
+			this.query.updateTime = e.result;
+		},
+		confirmOperation(e) {
+			this.query.operationName = e[0].label
+			this.query.operationId = e[0].value
+			const index = this.operationList.findIndex(item => item.value === this.query.operationId)
+			if (index > -1) {
+				this.operationIndex = index
+				this.toId = this.operationList[index].value
+			}
+		},
+		confirmClazzType(e) {
+			this.query.clazzType = e[0].label
+		},
+		// 鏌ヨ宸ヤ綔绔�
+		getOperation() {
+			this.$u.api.dailyPaper.getWorkstation().then(res => {
+				if (res.code === 0) {
+					const index = res.data.findIndex(item => item.name === this.query.workstationName)
+					if (index > -1) {
+						this.workCenter = res.data[index].workCenter
+					}
+					this.query.workstationName = '(' + this.workCenter + ')' + this.query.workstationName
+					this.getOperationTaskFun(this.workCenter, this.query.operationId)
+				}
+			})
+		},
+		getOperationTaskFun(id, operationId) {
+			this.operationList = []
+			const params = {
+				workCenter: id,
+				current: 1,
+				size: -1
+			}
+			// 鏌ヨ宸ュ簭鍒楄〃
+			this.$u.api.dailyPaper.getOperation(params).then(res => {
+				if (res.code === 0) {
+					if (res.data.records.length > 0) {
+						res.data.records.forEach(i => {
+							const obj = Object.assign({
+								label: i.name,
+								value: i.id,
+							})
+							this.operationList.push(obj)
+						})
+						if (operationId) {
+							const index = this.operationList.findIndex(item => item.value === operationId)
+							if (index > -1) {
+								this.operationIndex = index
+								this.query.operationName = this.operationList[index].label
+								this.toId = this.operationList[index].value
+							}
+						}
+						this.firstOperationId = this.operationList[0].value
+						this.lastOperationId = this.operationList[this.operationList.length - 1].value
+					}
+				}
+			})
+		}
+	},
+	watch: {
+		'query.productionUser': {
+			handler(newName, oldName) {
+				if (this.query.productionUser.length > 0) {
+					this.staffNameJoin = this.query.productionUser.join()
+				} else {
+					this.staffNameJoin = ''
+				}
+			},
+			immediate: true,
+			deep: true
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+@import 'index.scss';
+</style>
\ No newline at end of file
diff --git a/pages/product/tailHandle/index.vue b/pages/product/tailHandle/index.vue
new file mode 100644
index 0000000..f52a313
--- /dev/null
+++ b/pages/product/tailHandle/index.vue
@@ -0,0 +1,412 @@
+<template>
+	<view class="wrap">
+		<view class="list" :border="false">
+			<view class="content" style="background: #fff;">		
+				<view class="row-list">
+					<view style="font-size: 28rpx;color: #909399;margin-right: 10rpx;">
+						宸ヤ綔绔�:
+					</view>
+					<view class="_content" style="text-align: left;">
+						{{ tailHandle.workstationName }}
+					</view>
+					<view style="margin-right: 30rpx;">
+						<u-icon name="scan" class="scan" @click="goScan"></u-icon>
+					</view>
+					<view >
+						<u-button type="primary" style="width:150rpx;" @click="toWorkstation">閫夋嫨</u-button>
+					</view>
+				</view>
+			</view>
+		</view> 
+		<view class="title">
+			<view>
+				<u-icon class="grid-icon" name="column-line" :size="40" :style="{ color: '#0081ff' }"></u-icon>
+			</view>
+			<view class="text-black text-bold basis-xl">鏈哄彴鐗╂枡</view>
+		</view>
+		<scroll-view class="scroll-list mid" scroll-y="true">	
+				<div class="tip" v-if="list.length==0">-鏆傛棤鐗╂枡-</div>
+				<view :class="['content',item.isSelected?'select-class':'']" v-for="(item, index) in list" :key="item.id" :index="index" @click="selectRow(item)">
+					<view class="row-list" style="padding-top: 8px;">
+						<view class="_label">
+							闆朵欢鍙�:
+						</view>
+						<view class="_content">
+							{{ item.partNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							闆朵欢鍚嶇О:
+						</view>
+						<view class="_content">
+							{{ item.partName }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							SN鍙�:
+						</view>
+						<view class="_content">
+							{{ item.partBatchNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							ifs鎵规鍙�:
+						</view>
+						<view class="_content">
+							{{ item.ifsBatchNo }}
+						</view>
+					</view>		
+					<view class="row-list">
+						<view class="_label">
+							鍙敤鏁伴噺:
+						</view>
+						<view class="_content">
+							{{ item.availableStockQuantity+'('+item.unit+')' }}
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+			
+		<view class="view-fixed-two bottom">
+			<u-button class="r" size="medium" type="primary" @click="goSubmit">灏炬枡鍙戞斁</u-button>
+		</view>
+		<scan></scan>	
+		<u-modal v-model="showConfirm" content="鏄惁纭灏嗗熬鏂欐墸闄わ紝姝ゆ搷浣滀笉鍙�嗭紒"  @confirm="confirm" :show-cancel-button="true"/>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				tailHandle:{
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null
+				},	
+				list:[],
+				showConfirm:false
+			};
+		},
+		onLoad() {
+		
+		},
+		onShow() {
+			let that = this		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				// console.log(data.code.replace(/\n/g,'').replace(/\s*/g,''))
+				// console.log('鎵爜缁撴灉1锛�', JSON.parse(data.code.replace(/\n/g,"").replace(/\s*/g,'')));
+								
+				that.loadList(data.code);
+				that.$forceUpdate();
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			this.goScan()
+		},
+		methods: {
+			goScan(){
+				 //let scanresult={"part_no":"88.118.1/A0044193","package_code":"TP092022101200001","unit_meas":"璺�","wdr":"*","lot_batch_no":"*","qty_arrived":12}
+				 //this.scanHandle(JSON.stringify(scanresult))
+				
+				uni.scanCode({
+					scanType: ['qrCode'],
+					success: res => {
+						try {
+							console.log('鎵爜缁撴灉锛�', res);
+							this.scanHandle(res.result)
+						} catch (e) {}
+					}
+				});
+			},
+			//鏍规嵁鏈哄彴鍙凤紝鏌ヨ鏈哄彴淇℃伅锛屽啀鏌ヨ鐗╂枡淇℃伅
+			scanHandle(workstationNo){
+				if(workstationNo!=''){
+					this.$u.api.pigxFeed.fetchWorkstationList({workstationNo:workstationNo}).then(resp => {
+						
+						if (!resp.data.records || resp.data.records.length == 0) {
+							this.$u.toast('銆�'+workstationNo+'銆�,鏈煡璇㈠埌鏈哄彴淇℃伅')
+						}else{
+							let workstationList=resp.data.records
+							let scanWorkstationInfo=workstationList[0]
+							this.tailHandle.workstationId = scanWorkstationInfo.id
+							this.tailHandle.workstationNo = scanWorkstationInfo.workstationNo
+							this.tailHandle.workstationName = scanWorkstationInfo.name
+							this.list=[]
+							this.$u.api.pigxTailHandle.getFeedingStock({workstationId:scanWorkstationInfo.id}).then(res => {
+												   let reList = []					   
+												   reList = res.data;	
+												   if(reList.length!=0)
+													{
+														// 鎸夊彲鐢ㄦ暟閲忔帓涓簭
+														reList.sort(this.compare('availableStockQuantity'))
+														reList.forEach((item)=>{
+															this.list.push({
+																locationId:item.locationId,
+																locNo:item.locNo,
+																partBatchNo:item.partBatchNo,
+																partId:item.partId,
+																partNo:item.partNo,
+																partName:item.partName,
+																availableStockQuantity:item.availableStockQuantity,
+																unit:item.unit,
+																ifsBatchNo:item.ifsBatchNo,
+																id:item.id,
+																isSelected:false
+															})
+														})
+													}
+							})
+						}								
+					})
+				}else{
+					this.$u.toast('鏈壂鎻忓埌鏈哄彴鍙�')
+				}
+			},
+			selectRow(stock){
+				stock.isSelected=!stock.isSelected	
+				/*this.list.forEach((item,index)=>{
+					if(item.id ==stock.id){
+						this.list.splice(index,1)
+						return;
+					}
+				})*/
+				//if(stock.isSelected){
+					//灞曠ず鍦ㄥ垪琛ㄦ渶涓婃柟
+				//	this.list.unshift(stock)
+				//}else{
+					//灞曠ず鍦ㄥ垪琛ㄦ渶涓嬫柟
+				//	this.list.push(stock)
+				//}
+				
+			},
+			setWorkstation(workstation) {
+				this.list=[]
+				this.tailHandle.workstationId = workstation.id
+				this.tailHandle.workstationNo = workstation.workstationNo
+				this.tailHandle.workstationName = workstation.name
+				this.$u.api.pigxTailHandle.getFeedingStock({workstationId:workstation.id}).then(res => {
+									   let reList = []					   
+									   reList = res.data;	
+									   if(reList.length!=0)
+										{
+											// 鎸夊彲鐢ㄦ暟閲忔帓涓簭
+											reList.sort(this.compare('availableStockQuantity'))
+											reList.forEach((item)=>{
+												this.list.push({
+													locationId:item.locationId,
+													locNo:item.locNo,
+													partBatchNo:item.partBatchNo,
+													partId:item.partId,
+													partNo:item.partNo,
+													partName:item.partName,
+													availableStockQuantity:item.availableStockQuantity,
+													unit:item.unit,
+													ifsBatchNo:item.ifsBatchNo,
+													id:item.id,
+													isSelected:false
+												})
+											})
+										}
+				});
+			},
+			toWorkstation() {
+				uni.navigateTo({
+					url: '/pages/product/tailHandle/workstationList'
+				})
+			},
+			loadList(sanCode) {
+				let that = this
+				if(sanCode!="")
+				{
+					//鏍规嵁鎵叆鐨勫瓧绗︿覆淇℃伅锛屽垽鏂壂鐨勬槸鏉″舰鐮侊紝杩樻槸浜岀淮鐮�
+					let snNo
+					if (sanCode.indexOf('sn_no') != -1) {
+					    // 浜岀淮鐮�
+					    const scanContentJson = JSON.parse(
+					        sanCode.replace(/\n/g, '').replace(/\s*/g, '')
+					    )
+						snNo=scanContentJson.sn_no
+					    
+					} else {
+					    // 鏉″舰鐮�
+					    snNo = sanCode										    
+					}				   
+				    //鏍规嵁sn鍙烽�変腑鐗╂枡
+					let exsitMaterial=this.list.find((item)=>{
+						return item.partBatchNo==snNo
+					})
+					if(exsitMaterial){
+						exsitMaterial.isSelected=true
+						/*this.list.forEach((item,index)=>{
+							if(item.id ==exsitMaterial.id){
+								this.list.splice(index,1)
+								return;
+							}
+						})*/
+						//灞曠ず鍦ㄥ垪琛ㄦ渶涓婃柟
+						//this.list.unshift(exsitMaterial)
+						
+					}
+				}			
+			},
+			goSubmit(){
+				this.showConfirm=true
+			},
+			confirm(){
+				let stockIds = []
+				this.list.forEach((item) => {
+					if(item.isSelected){
+						stockIds.push(item.id)
+					}
+				})
+				if(stockIds.length>0){
+					this.$u.api.pigxTailHandle.tailStockIssue(stockIds).then(res => {
+						let reData = res.data;
+						this.$u.toast('灏炬枡鍙戞斁鎴愬姛!')
+						this.getWorkstationMaterial(this.tailHandle.workstationId)
+					})	
+				}else{
+					this.$u.toast('璇烽�夋嫨闇�鍙戞斁鐨勭墿鏂�!')
+				}
+			},
+			getWorkstationMaterial(workstationId){
+				this.list=[]
+				this.$u.api.pigxTailHandle.getFeedingStock({workstationId:workstationId}).then(res => {
+									   let reList = []					   
+									   reList = res.data;	
+									   if(reList.length!=0)
+										{
+											// 鎸夊彲鐢ㄦ暟閲忔帓涓簭
+											reList.sort(this.compare('availableStockQuantity'))
+											reList.forEach((item)=>{
+												this.list.push({
+													locationId:item.locationId,
+													locNo:item.locNo,
+													partBatchNo:item.partBatchNo,
+													partId:item.partId,
+													partNo:item.partNo,
+													partName:item.partName,
+													availableStockQuantity:item.availableStockQuantity,
+													unit:item.unit,
+													ifsBatchNo:item.ifsBatchNo,
+													id:item.id,
+													isSelected:false
+												})
+											})
+										}
+				});
+			},
+			compare(pro){
+				return function(obj1, obj2) {
+				    const val1 = obj1[pro]
+				    const val2 = obj2[pro]
+				    if (val2 < val1) {
+				      // 姝e簭
+				      return 1
+				    } else if (val2 > val1) {
+				      return -1
+				    } else {
+				      return 0
+				    }
+				  }
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>	
+	.mid {
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 286rpx);
+		padding: 30rpx 30rpx 0;
+		box-sizing: border-box;
+		.tip{
+			text-align: center;
+			padding-top: 50rpx;
+			font-size: 30rpx;
+		}
+		.u-card{
+			margin: 0 0 30rpx!important;
+			position: relative;
+			box-shadow: 0px 3px 6px 1px rgba(127, 127, 127, 0.2)!important;
+			&+.u-card{
+				// margin-top: 30rpx!important;
+			}
+			.u-form-item{
+				padding: 2px 0;
+			}
+		}
+		.index{
+			text-align: center;
+			padding-top: 20rpx;
+		}
+	}
+	
+	
+	 .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+		position: relative;
+	}
+	
+	.title {
+		display: flex;
+		flex-direction: row;
+	}
+	
+	.row-list {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+	}
+	
+	.row-list ._label {
+		flex: 0.8;
+		color: #909399;
+	}
+	
+	.row-list ._content {
+		flex: 1.5;
+		text-align: right;
+	}
+	.bottom {
+		width: 750rpx;
+		height: 90rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		margin-bottom:5rpx ;
+		.u-btn{
+			margin: initial;
+			height: 100%;
+			border-radius: 14rpx;
+			width: 90%;
+			background:#3281FF;
+		}
+		.l{
+			
+		}
+	}
+	.scan{
+		width: 60rpx;
+		height: 60rpx;
+		font-size: 60rpx;
+		color: #3281ff;
+	}
+	.select-class{
+		background-color: #9FFF5F;
+	}
+</style>
diff --git a/pages/product/tailHandle/workstationList.vue b/pages/product/tailHandle/workstationList.vue
new file mode 100644
index 0000000..a95a5ff
--- /dev/null
+++ b/pages/product/tailHandle/workstationList.vue
@@ -0,0 +1,285 @@
+<template>
+	<view class="page">
+		<view class="tailHandle-workstation-bg"/>
+				<u-navbar title="宸ヤ綔绔�" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+				<view class="tailHandle-workstation-search">
+					<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ伐浣滅珯缂栧彿" @clear="search" @custom="search" @search="search">
+					</u-search>
+		</view>
+	  <view class="wrap">
+		<scroll-view class="tailHandle-workstation-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="tailHandle-workstation-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.workstationNo" :index="index"
+					@click="selectWorkstation(item)">
+					<view class="content-header">
+							<view class="content-header-icon"></view>
+							<view class="content-header-title">{{ item.workstationNo }}</view>
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-1">
+									</view>
+									<view class="_label-name">缂栧彿锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.workstationNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-2">
+									</view>
+									<view class="_label-name">鍚嶇О锛�</view>	
+								</view>
+								<view class="_content">
+									{{ item.name }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									<view class="_label-icon-3">
+									</view>
+									<view class="_label-name">澶囨敞锛�</view>	
+								</view>
+								<view class="_content s1">
+									{{ item.remark }}
+								</view>
+							</view>
+						</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<scan></scan>		
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/tailHandle/locNoBg.png'
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				workStationList:[],
+				originList: [],
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				query: {
+					current: 1,
+					size: 10,
+					workstationNo:""
+				},
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			
+			let that = this
+					
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.search(data.code);					
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+		
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {	
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+
+				// 鏌ヨ宸ヤ綔绔欏垪琛�
+				this.$u.api.pigxFeed.fetchWorkstationList(this.query).then(res => {
+					
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}									
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			search(value) {
+							
+				let that = this
+				that.list = [];
+				that.total = 0;
+				
+				that.query= {
+					current: 1,
+					size: 20,
+					workstationNo:value
+				}
+				that.loadList()
+			},
+			selectWorkstation(workstation) {
+				this.refreshLastPage(workstation)
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(workstation) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setWorkstation(workstation)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.tailHandle-workstation-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/tailHandle/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	.tailHandle-workstation-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.wrap .tailHandle-workstation-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.tailHandle-workstation-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}	
+</style>
diff --git a/pages/sys/home/index.vue b/pages/sys/home/index.vue
new file mode 100644
index 0000000..114f6a3
--- /dev/null
+++ b/pages/sys/home/index.vue
@@ -0,0 +1,122 @@
+<template>
+	<view class="wrap">
+		<template v-for="(item, index) in tabList">
+			<view class="work-stage-title">
+				<view>
+					<u-line style="border:5rpx solid #264DE9" length="33rpx" direction="col" color="#264DE9"
+						:hair-line="false"></u-line>
+				</view>
+				<view class="title-label">{{ item.title }}</view>
+			</view>
+			<u-grid :border="false">
+				<u-grid-item v-for="(baseListItem, baseListIndex) in item.list" :key="baseListIndex"
+					@click="navTo(baseListItem.url)">
+					<img :src="require(`@/static/custom/home/feed.png`)" alt="">
+					<text class="grid-text">{{ baseListItem.name }}</text>
+				</u-grid-item>
+			</u-grid>
+		</template>
+	</view>
+</template>
+<script>
+export default {
+	data() {
+		return {
+			tabList: [
+				{
+					title: '鐢熶骇绠$悊',
+					list: [
+						{
+							name: '鎶ュ伐',
+							url: '/pages/product/report/index',
+							icon: 'feeding'
+						},
+						{
+							name: '鍙栨秷鎶ュ伐',
+							url: '/',
+							icon: 'feeding'
+						},
+						{
+							name: '鎺ユ敹锛堥摐鏉嗭級',
+							url: '/',
+							icon: 'feeding'
+						},
+					]
+				},
+				{
+					title: '鍙戣揣绠$悊',
+					list: [
+						{
+							name: '绉诲簱',
+							url: '/pages/wareHouse/moveWareHouse/index',
+							icon: 'feeding'
+						},
+						{
+							name: '鐩樼偣鎶ュ憡鐩樼偣',
+							url: '/pages/wareHouse/inventory/index',
+							icon: 'feeding'
+						},
+						{
+							name: '鏍哥褰曞叆',
+							url: '/pages/wareHouse/packing/registration',
+							icon: 'feeding'
+						},
+					]
+				},
+				{
+					title: '浠撳簱绠$悊',
+					list: [
+						{
+							name: '棰嗘枡',
+							url: '/pages/wareHouse/moveWareHouse/index',
+							icon: 'feeding'
+						},
+						{
+							name: '鍙栨秷棰嗘枡',
+							url: '/pages/wareHouse/inventory/index',
+							icon: 'feeding'
+						},
+					]
+				}
+			]
+		};
+	},
+	onShow() {
+		//this.refreshCount();
+	},
+	methods: {
+		navTo(url) {
+			console.log(url)
+			uni.navigateTo({
+				url: url
+			});
+		}
+	}
+};
+</script>
+<style lang="scss">
+.wrap {
+	height: calc(100vh - 200rpx);
+	background: linear-gradient(to bottom, #e5f0ff, #f6f9ff);
+}
+
+.work-stage-title {
+	display: flex;
+	flex-direction: row;
+	align-items: center;
+	margin-bottom: 38rpx;
+	padding: 30rpx 30rpx;
+	padding-bottom: 0;
+
+	.title-label {
+		margin-left: 14rpx;
+		font-size: 34rpx;
+		font-weight: bold;
+		color: #283E65;
+	}
+}
+
+.u-grid-item {
+	background: transparent !important;
+}
+</style>
\ No newline at end of file
diff --git a/pages/sys/login/bindUser.vue b/pages/sys/login/bindUser.vue
new file mode 100644
index 0000000..bba66f4
--- /dev/null
+++ b/pages/sys/login/bindUser.vue
@@ -0,0 +1,86 @@
+<template>
+  <view class="wrap">
+
+    <!--logo-->
+    <view class="logo">
+      <image src="/static/custom/logoPig.png"></image>
+    </view>
+
+    <!--鍙戦�佺煭淇¢獙璇佺爜-->
+     <sms-code/>
+
+  </view>
+</template>
+<script>
+import smsCode from "./smsCode";
+
+export default {
+  components: {smsCode},
+  data() {
+    return {
+    };
+  },
+  onLoad() {
+  },
+  methods: {
+  }
+}
+</script>
+
+<style lang="scss">
+@import 'index.scss';
+
+.logo {
+  width: 260rpx;
+  height: 260rpx;
+  //background: rgba(59, 121, 235, 1);
+  //box-shadow: 0rpx 5rpx 20rpx 5rpx rgba(45, 127, 235, 0.5);
+  border-radius: 50%;
+  margin: 70rpx auto 10rpx auto;
+}
+
+.logo image {
+  width: 260rpx;
+  height: 260rpx;
+  border-radius: 50%;
+}
+
+.base-url js-select {
+  width: 100%;
+}
+
+.button {
+  margin: 30rpx auto 0;
+}
+
+.footer {
+  display: flex;
+  flex-direction: row;
+  justify-content: center;
+  align-items: center;
+  text-align: center;
+  color: #46afff;
+  height: 40rpx;
+  line-height: 40rpx;
+  font-size: 35rpx;
+  margin-top: 60rpx;
+}
+
+.footer text {
+  font-size: 30rpx;
+  margin-left: 25rpx;
+  margin-right: 25rpx;
+}
+
+.oauth2 {
+  display: flex;
+  flex-direction: row;
+  justify-content: space-around;
+  margin: 55rpx 100rpx;
+
+  image {
+    height: 100rpx;
+    width: 100rpx;
+  }
+}
+</style>
diff --git a/pages/sys/login/index.scss b/pages/sys/login/index.scss
new file mode 100644
index 0000000..79b1ccd
--- /dev/null
+++ b/pages/sys/login/index.scss
@@ -0,0 +1,115 @@
+.wrap {
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+
+	background: url(../../../static/custom/login/login-bg.png) no-repeat left top;
+	background-size: 100% auto;
+
+}
+
+
+.list {
+	display: flex;
+	flex-direction: column;
+	padding: 40rpx 70rpx 40rpx 70rpx;
+}
+
+.list-call {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	padding-top: 10rpx;
+	height: 120rpx;
+	font-weight: normal;
+	color: #333333;
+	border-bottom: 0.5px solid #e2e2e2;
+}
+
+.list-call .u-input {
+	flex: 1;
+	font-size: 39rpx;
+	text-align: left;
+	margin-left: 16rpx;
+}
+
+.list-call .u-icon-right {
+	color: #aaaaaa;
+	width: 50rpx;
+	height: 40rpx;
+}
+
+.button {
+	color: #ffffff;
+	font-size: 32rpx;
+	width: 80%;
+	height: 80rpx;
+	background: #497bff;
+	box-shadow: 0rpx 0rpx 13rpx 0rpx rgba(15, 168, 250, 0.4);
+	border-radius: 10rpx;
+	line-height: 80rpx;
+	text-align: center;
+	margin: 50rpx auto 0;
+}
+
+.img-valid-code img {
+	width: 30rpx;
+	heigth: 50rpx;
+}
+
+.btn-valid-code {
+	color: #da7918;
+	font-size: 30rpx;
+	line-height: 48rpx;
+	padding: 6rpx 35rpx;
+	border: 1rpx solid #da7918;
+	border-radius: 50rpx;
+}
+
+.btn-valid-code-hover {
+	background-color: #f3f3f3;
+}
+
+.btn-valid-codes {
+	color: #999999 !important;
+	border: 1rpx solid #999999;
+}
+
+.login-bottom-box {
+	position: fixed;
+	bottom: 40rpx;
+	text-align: center;
+	width: 100%;
+}
+
+.copyright {
+	text-align: center;
+	color: #939393;
+	width: 100%;
+	font-size: 24rpx;
+
+	.u-link {
+		margin: 0 10rpx;
+		font-size: 24rpx !important;
+	}
+}
+
+.pages-sys-login-index,
+.pages-sys-login-reg,
+.pages-sys-login-forget {
+	.u-checkbox__label {
+		font-size: 28rpx !important;
+	}
+
+	.u-label {
+		flex: 0 0 35px !important;
+		width: 35px !important;
+	}
+}
+
+.reg-text {
+	font-size: 42rpx;
+	color: #000;
+	padding: 40rpx 70rpx 10rpx;
+}
\ No newline at end of file
diff --git a/pages/sys/login/index.vue b/pages/sys/login/index.vue
new file mode 100644
index 0000000..4fa471d
--- /dev/null
+++ b/pages/sys/login/index.vue
@@ -0,0 +1,322 @@
+<template>
+	<view class="wrap">
+		<view class="login-back-img"></view>
+		<!--鍥介檯鍖�-->
+		<js-lang title="login.title" :showBtn="false"></js-lang>
+		<view
+			style="background-color: #fff;z-index:20;width:750rpx;margin-top:514rpx;padding-bottom: 70rpx;border-radius: 20rpx;">
+			<view class="logo">娆㈣繋鐧诲綍</view>
+
+			<!--鐢ㄦ埛鍚嶅瘑鐮佺櫥褰�-->
+			<user-password />
+
+
+			<view class="chooseServer" @click="chooseServer.visible = true" v-if="env == 'production'">
+				鏈嶅姟鍣ㄥ湴鍧�閫夋嫨
+			</view>
+		</view>
+		<u-popup v-model="chooseServer.visible" mode="bottom">
+			<view class="chooseServer__content">
+				<u-radio-group v-model="chooseServer.type" :wrap="true">
+					<u-radio v-for="(item, index) in serverList" :key="item.type" :name="item.type">
+						<view v-if="index < 2">
+							<u-field v-model="item.url" :label="item.name" label-width="70" disabled />
+						</view>
+						<view v-else>
+							<u-field v-model="chooseServer.url" label-width="70" :label="item.name" />
+						</view>
+					</u-radio>
+				</u-radio-group>
+				<view class="button" hover-class="button-hover" @click="serverSure()">
+					<text>纭</text>
+				</view>
+			</view>
+		</u-popup>
+
+		<!-- #ifdef MP -->
+		<button class="button" @click.stop="getUserProfile" :disabled="btnLoading" :loading="btnLoading">
+			<text>{{ $t("login.vxLoginButton") }}</text>
+		</button>
+		<!-- #endif -->
+		<!-- <view class="login-bottom-box">
+			<view class="copyright">
+				姹熻嫃涓ぉ浜掕仈绉戞妧鏈夐檺鍏徃鐗堟潈鎵�鏈�</br>Copyright 漏2024.All Rights Reserved.
+			</view>
+		</view> -->
+	</view>
+</template>
+<script>
+import userPassword from "./userPassword";
+import config from '@/common/config.js';
+
+export default {
+	components: {
+		userPassword
+	},
+	data() {
+		return {
+			env: config.env,
+			btnLoading: false,
+			chooseServer: {
+				visible: false,
+				type: 2,
+				url: ''
+			}
+		};
+	},
+	computed: {
+		serverList() {
+			return [{
+				type: 0,
+				name: '鍐呯綉',
+				url: 'http://rfcable.chinaztt.cn'
+			}, {
+				type: 1,
+				name: '澶栫綉',
+				url: 'http://rfcable.chinaztt.cn:8200'
+			}, {
+				type: 2,
+				name: '鍏朵粬',
+				url: ''
+			}]
+		}
+	},
+	onLoad() {
+		//宸茬粡鐧诲綍 璺宠浆鍒伴椤�
+		if (this.vuex_token) {
+			uni.reLaunch({
+				url: "/pages/sys/home/index",
+			});
+		}
+	},
+	onShow() {
+		if (this.vuex_config.baseUrl === 'http://rfcable.chinaztt.cn') {
+			this.chooseServer.type = 0
+		} else if (this.vuex_config.baseUrl === 'http://rfcable.chinaztt.cn:8200') {
+			this.chooseServer.type = 1
+		} else {
+			this.chooseServer.type = 2
+			this.chooseServer.url = this.vuex_config.baseUrl
+		}
+	},
+	methods: {
+		serverSure() {
+			let baseUrl = ''
+			if (this.chooseServer.type == 0) {
+				baseUrl = 'http://rfcable.chinaztt.cn'
+			} else if (this.chooseServer.type == 1) {
+				baseUrl = 'http://rfcable.chinaztt.cn:8200'
+			} else {
+				if (this.IsURL(this.chooseServer.url)) {
+					baseUrl = this.chooseServer.url
+				} else {
+					this.$u.toast("鍦板潃杈撳叆涓嶆纭�");
+					return
+				}
+			}
+			let config = this.vuex_config
+			config.baseUrl = baseUrl
+			this.$u.vuex("vuex_config", config);
+			this.$u.http.setConfig({
+				baseUrl
+			});
+			this.$u.toast("璁剧疆鎴愬姛");
+			this.chooseServer.visible = false
+		},
+		IsURL(str_url) {
+			var strRegex = "^((https|http|ftp|rtsp|mms)?://)" +
+				"?(([0-9a-z_!~*'().&=+$%-]+: )?[0-9a-z_!~*'().&=+$%-]+@)?" //ftp鐨剈ser@ 
+				+
+				"(([0-9]{1,3}\.){3}[0-9]{1,3}" // IP褰㈠紡鐨刄RL- 199.194.52.184 
+				+
+				"|" // 鍏佽IP鍜孌OMAIN锛堝煙鍚嶏級
+				+
+				"([0-9a-z_!~*'()-]+\.)*" // 鍩熷悕- www. 
+				+
+				"([0-9a-z][0-9a-z-]{0,61})?[0-9a-z]\." // 浜岀骇鍩熷悕 
+				+
+				"[a-z]{2,6})" // first level domain- .com or .museum 
+				+
+				"(:[0-9]{1,4})?" // 绔彛- :80 
+				+
+				"((/?)|" // a slash isn't required if there is no file name 
+				+
+				"(/[0-9a-z_!~*'().;?:@&=+$,%#-]+)+/?)$";
+			var re = new RegExp(strRegex);
+			//re.test()
+			if (re.test(str_url)) {
+				return (true);
+			} else {
+				return (false);
+			}
+		},
+		getUserProfile() {
+			this.btnLoading = true;
+			//鑾峰彇code锛岀劧鍚庤皟鐢ㄥ井淇$櫥褰曟帴鍙e垽鏂槸鍚︾櫥褰� 401鍒欒烦杞埌缁戝畾椤甸潰
+			var tmp = this;
+			uni.login({
+				provider: "weixin",
+				success: function (res) {
+					console.log("code", res.code);
+
+					let grant_type = "mobile";
+					let code = res.code;
+
+					tmp.$u.api
+						.vxLogin({
+							grant_type,
+							code,
+						}, {
+							Authorization: "Basic c29jaWFsOnNvY2lhbA==",
+						})
+						.then((res) => {
+							tmp.btnLoading = false;
+							//鎻愮ず
+							tmp.$u.toast("鎭枩鎮紝鐧诲綍鎴愬姛锛�");
+
+							// 鐧婚檰鎴愬姛锛屽瓨鍌ㄧ浉鍏充俊鎭�
+							tmp.$u.vuex("vuex_token", res.access_token);
+							tmp.$u.vuex("vuex_refresh_token", res.refresh_token);
+							tmp.$u.vuex("vuex_username", res.username);
+							tmp.$u.vuex("vuex_userId", res.user_id);
+							tmp.$u.vuex("vuex_client_id", res.client_id);
+
+							//鏌ヨ鐢ㄦ埛璇︾粏淇℃伅骞跺偍瀛�
+							tmp.$u.api.user.getUserInfo().then((res) => {
+								console.log("鑾峰彇鐢ㄦ埛淇℃伅:", res);
+								tmp.$u.vuex("vuex_user", res.data.sysUser);
+							});
+
+							//璺宠浆椤甸潰
+							setTimeout(() => {
+								uni.reLaunch({
+									url: "/pages/sys/home/index",
+								});
+							}, 500);
+						})
+						.catch((e) => {
+							tmp.btnLoading = false;
+							if (e.statusCode === 401 || e.message === "鐢ㄦ埛涓嶅瓨鍦�") {
+								console.log(
+									"鐢ㄦ埛鏈粦瀹氾紝璇蜂娇鐢� sys_user 琛ㄥ瓨鍦ㄧ殑鎵嬫満鍙疯繘琛岀粦瀹�"
+								);
+								tmp.$u.toast(
+									"鐢ㄦ埛鏈粦瀹氾紝璇蜂娇鐢� sys_user 琛ㄥ瓨鍦ㄧ殑鎵嬫満鍙疯繘琛岀粦瀹�"
+								);
+								uni.reLaunch({
+									url: "/pages/sys/login/bindUser",
+								});
+								console.log("椤甸潰璺宠浆...");
+							}
+						});
+				},
+			});
+		},
+	},
+};
+</script>
+<style lang="scss">
+@import "index.scss";
+
+.login-back-img {
+	background-image: url('~@/static/custom/login/img_bg.png');
+	background-size: 100% auto;
+	background-repeat: no-repeat;
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 750rpx;
+	height: 540rpx;
+}
+
+
+.logo {
+	width: 90%;
+	font-size: 48rpx;
+	color: #333333;
+	margin: 50rpx auto 0;
+	margin-left: 80rpx;
+	text-align: left;
+	font-weight: bold;
+}
+
+.list-call-icon {
+	color: #ff0000;
+}
+
+.currentPhone-box {
+	text-align: center;
+	padding: 40rpx 80rpx;
+
+	.number-text {
+		color: #000000;
+		font-size: 60rpx;
+	}
+
+	.other-text {
+		color: #999999;
+		font-size: 26rpx;
+		padding: 20rpx 0;
+	}
+
+	.u-btn {
+		margin: 30rpx auto;
+	}
+
+	.u-hairline-border {
+		border: 1px solid #fff;
+	}
+}
+
+
+
+.register {
+	display: inline-block;
+	color: #497bff;
+	height: 40rpx;
+	line-height: 40rpx;
+	font-size: 28rpx;
+	float: right;
+	margin-top: 6rpx;
+}
+
+.register-link {
+	float: right;
+	padding: 0 16rpx;
+}
+
+.reg-link {
+	display: inline-block;
+	color: #497bff;
+}
+
+.oauth2 {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-around;
+	margin: 0rpx 100rpx 30rpx;
+
+	image {
+		height: 80rpx;
+		width: 80rpx;
+	}
+}
+
+.u-tabs {
+	padding: 0 70rpx;
+}
+
+.chooseServer {
+	margin: 20px 35px 20px 35px;
+	text-align: right;
+	text-decoration: underline;
+}
+
+.chooseServer__content {
+	padding: 20rpx 40rpx;
+
+	::v-deep .u-radio__label {
+		flex: 1;
+	}
+}
+</style>
diff --git a/pages/sys/login/smsCode.vue b/pages/sys/login/smsCode.vue
new file mode 100644
index 0000000..4537333
--- /dev/null
+++ b/pages/sys/login/smsCode.vue
@@ -0,0 +1,214 @@
+<template>
+	<view>
+		<view class="list">
+			<view class="list-call">
+				<u-icon class="u-icon" size="40" name="account"></u-icon>
+				<input class="u-input" type="text" v-model="model.mobile" maxlength="32"
+					:placeholder="$t('login.placeholderMobile')" />
+			</view>
+			<view class="list-call">
+				<u-icon class="u-icon" size="40" name="coupon"></u-icon>
+				<input class="u-input" type="text" v-model="model.code" maxlength="4" placeholder="鎵嬫満楠岃瘉鐮�" />
+				<u-button :disabled="smsCodeBtnDisabled" @click="getSmsCode">
+					<text v-if="!smsCodeBtnDisabled">鑾峰彇楠岃瘉鐮�</text>
+					<text v-else>{{
+					  `閲嶆柊鍙戦�� (${codeSeconds})`
+					}}
+					</text>
+				</u-button>
+
+			</view>
+			<view class="button" hover-class="button-hover" @click="toLogin">
+				<text>缁戝畾鐢ㄦ埛</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import moment from '@/common/moment';
+
+	export default {
+		name: 'smsCode',
+		data() {
+			return {
+				smsCodeBtnDisabled: false, //楠岃瘉鐮佹寜閽�
+				codeSeconds: 0, // 楠岃瘉鐮佸彂閫佹椂闂撮棿闅�
+				model: {
+					mobile: '',
+					code: ''
+				}, //缁戝畾鐨勬墜鏈哄彿銆侀獙璇佺爜鏁版嵁
+			};
+		},
+		onLoad() {
+			//楠岃瘉鐮佸彂閫侀棿闅�
+			const time = moment().valueOf() / 1000 - uni.getStorageSync('loginSmsCodeTime');
+
+			//鏄惁鍏佽閲嶆柊鍙戦�侀獙璇佺爜
+			if (time < 60) {
+				this.codeSeconds = 60 - parseInt(time, 10);
+				this.handleSmsCodeTime(this.codeSeconds);
+			} else {
+				this.codeSeconds = 60
+				this.smsCodeBtnDisabled = false;
+				uni.removeStorageSync('loginSmsCodeTime');
+			}
+		},
+		methods: {
+			// 鍙戦�侀獙璇佺爜骞惰繘鍏ュ�掕鏃�
+			getSmsCode() {
+				//琛ㄥ崟鏍¢獙
+				if (this.model.mobile.length === 0) {
+					this.$u.toast("璇疯緭鍏ユ墜鏈哄彿");
+					return;
+				}
+
+				this.$u.api.sendCode({
+					mobile: this.model.mobile
+				}, {
+					'Authorization': 'Basic c29jaWFsOnNvY2lhbA=='
+				}).then(r => {
+					if (r.data) {
+						this.$u.toast(`楠岃瘉鐮佸彂閫佹垚鍔�!`);
+						this.smsCodeBtnDisabled = true;
+						uni.setStorageSync('loginSmsCodeTime', moment().valueOf() / 1000);
+						this.handleSmsCodeTime(59);
+						console.log(`楠岃瘉鐮佹槸${r.msg}`)
+					} else {
+						this.$u.toast(r.msg === '鎵嬫満鍙锋湭娉ㄥ唽' ? '鎵嬫満鍙锋湭缁戝畾璐﹀彿' : r.msg);
+					}
+				})
+			},
+			handleSmsCodeTime(time) {
+				let timer = setInterval(() => {
+					if (time === 0) {
+						clearInterval(timer);
+						this.smsCodeBtnDisabled = false;
+					} else {
+						this.codeSeconds = time;
+						this.smsCodeBtnDisabled = true;
+						time--;
+					}
+				}, 1000);
+			},
+			// 鎻愪氦琛ㄥ崟
+			async toLogin() {
+				//琛ㄥ崟鏍¢獙
+				if (this.model.mobile.length === 0) {
+					this.$u.toast('璇疯緭鍏ユ墜鏈哄彿');
+					return;
+				}
+				if (this.model.code.length === 0) {
+					this.$u.toast('璇疯緭鍏ラ獙璇佺爜');
+					return;
+				}
+
+				//缁戝畾鐢ㄦ埛淇℃伅
+				await this.setUserBind()
+			},
+
+			// 寰俊缁戝畾鐢ㄦ埛
+			async setUserBind() {
+				let ctx = this
+				let mobile = this.model.mobile
+				//鑾峰彇code
+				uni.login({
+					provider: 'weixin',
+					success: function(res) {
+						let code = res.code
+						console.log('vxCode:', code)
+						//鎵嬫満鍙风櫥褰�
+						ctx.$u.api.smsLogin({
+							mobile,
+							code
+						}, {
+							Authorization: 'Basic c29jaWFsOnNvY2lhbA=='
+						}).then(res => {
+							let token = res.access_token
+							console.log('鎵嬫満鐧诲綍鎴愬姛:', res)
+
+							//鍌ㄥ瓨鐢ㄦ埛淇℃伅
+							ctx.$u.vuex('vuex_token', res.access_token)
+							ctx.$u.vuex('vuex_refresh_token', res.refresh_token)
+							ctx.$u.vuex('vuex_username', res.username)
+							ctx.$u.vuex('vuex_userId', res.user_id)
+							ctx.$u.vuex('vuex_client_id', res.client_id)
+
+							//缁戝畾鐢ㄦ埛
+							ctx.$u.api.bingUser({
+								code
+							}, {
+								'Authorization': 'Bearer ' + token
+							}).then(res => {
+								console.log('缁戝畾鐢ㄦ埛鎴愬姛')
+								uni.reLaunch({
+									url: '/pages/sys/home/index'
+								});
+							})
+						})
+					}
+				})
+			}
+
+		}
+	};
+</script>
+
+
+<style lang="scss">
+	@import 'index.scss';
+
+	.logo {
+		width: 260rpx;
+		height: 260rpx;
+		//background: rgba(59, 121, 235, 1);
+		//box-shadow: 0rpx 5rpx 20rpx 5rpx rgba(45, 127, 235, 0.5);
+		border-radius: 50%;
+		margin: 70rpx auto 10rpx auto;
+	}
+
+	.logo image {
+		width: 260rpx;
+		height: 260rpx;
+		border-radius: 50%;
+	}
+
+	.base-url js-select {
+		width: 100%;
+	}
+
+	.button {
+		margin: 30rpx auto 0;
+	}
+
+	.footer {
+		display: flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		text-align: center;
+		color: #46afff;
+		height: 40rpx;
+		line-height: 40rpx;
+		font-size: 35rpx;
+		margin-top: 60rpx;
+	}
+
+	.footer text {
+		font-size: 30rpx;
+		margin-left: 25rpx;
+		margin-right: 25rpx;
+	}
+
+	.oauth2 {
+		display: flex;
+		flex-direction: row;
+		justify-content: space-around;
+		margin: 55rpx 100rpx;
+
+		image {
+			height: 100rpx;
+			width: 100rpx;
+		}
+	}
+</style>
diff --git a/pages/sys/login/userPassword.vue b/pages/sys/login/userPassword.vue
new file mode 100644
index 0000000..42d1f45
--- /dev/null
+++ b/pages/sys/login/userPassword.vue
@@ -0,0 +1,177 @@
+<template>
+  <view>
+    <view class="list">
+      <view class="list-call">
+        <u-icon class="u-icon" size="40" name="account"></u-icon>
+        <input
+          class="u-input"
+          type="text"
+          v-model="userInfo.username"
+          maxlength="32"
+          :placeholder="$t('login.placeholderAccount')"
+        />
+      </view>
+      <view class="list-call">
+        <u-icon class="u-icon" size="40" name="lock"></u-icon>
+        <input
+          class="u-input"
+          type="text"
+          v-model="userInfo.password"
+          maxlength="32"
+          :placeholder="$t('login.placeholderPassword')"
+          :password="!showPassword"
+        />
+        <image
+          class="u-icon-right"
+          :src="
+            '/static/custom/login/eye_' +
+            (showPassword ? 'open' : 'close') +
+            '.png'
+          "
+          @click="showPass()"
+        ></image>
+      </view>
+      <u-radio-group v-model="remember" style="margin-top: 30rpx;" @change="checkboxChange">
+        <u-radio shape="square" name="1" :checked="1" >璁颁綇瀵嗙爜</u-radio>
+      </u-radio-group>
+    </view>
+    <view class="button custom-botton" hover-class="button-hover" @click="submit()">
+      <text>{{ $t("login.loginButton") }}</text>
+    </view>
+  </view>
+</template>
+
+<script>
+import { encryption } from "@/utils";
+
+export default {
+	name: "userPassword",
+	data() {
+		return {
+			userInfo: {
+				username: "",
+				password: ""
+			},
+			showPassword: false,
+			remember: '',
+			baseUrl: "",
+		};
+	},
+	created() {
+		if (process.env.NODE_ENV == 'development') {
+			// this.userInfo = {
+			//      username: "admin",
+			// 	password: "zttZTT123!"
+			// }
+		}
+		this.remember = uni.getStorageSync('remember');
+		// 妫�鏌ユ湰鍦板瓨鍌ㄤ腑鏄惁鏈夎浣忕殑鐢ㄦ埛鍚嶅拰瀵嗙爜
+		const savedUsername = uni.getStorageSync('username');
+		const savedPassword = uni.getStorageSync('password');
+		if (savedUsername && savedPassword) {
+			this.userInfo.username = savedUsername;
+			this.userInfo.password = savedPassword;
+		}
+	},
+	methods: {
+		showPass() {
+			this.showPassword = !this.showPassword;
+		},
+		//鐧诲綍
+		submit() {
+			//琛ㄥ崟鏍¢獙
+			if (this.userInfo.username.length === 0) {
+				this.$u.toast("璇疯緭鍏ヨ处鍙�");
+				return;
+			}
+			if (this.userInfo.password.length === 0) {
+				this.$u.toast("璇疯緭鍏ュ瘑鐮�");
+				return;
+			}
+
+			//鏋勯�犵櫥褰曞弬鏁�
+			const user = encryption({
+				data: this.userInfo,
+				key: "pigxpigxpigxpigx",
+				param: ["password"],
+			});
+
+			let grant_type = "password";
+			//鐧诲綍鎺ュ彛
+			this.$u.api
+					.login(
+							{
+								randomStr: 'blockPuzzle',
+								code: '',
+								grant_type
+							},
+							{
+								username: user.username,
+								password: user.password
+							},
+							{
+								Authorization: "Basic cGlnOnBpZw==",
+								"content-type": "application/x-www-form-urlencoded",
+								isToken: false,
+								"TENANT-ID": "1",
+							}
+					)
+					.then((res) => {
+						//鎻愮ず
+						this.$u.toast("鎭枩鎮紝鐧诲綍鎴愬姛锛�");
+						if (this.remember == 1) {
+							uni.setStorageSync('username', this.userInfo.username);
+							uni.setStorageSync('password', this.userInfo.password);
+							uni.setStorageSync('remember', this.remember);
+						} else {
+							// 濡傛灉鐢ㄦ埛鏈嬀閫夆�滆浣忔垜鈥濓紝娓呴櫎鏈湴瀛樺偍涓殑鐢ㄦ埛鍚嶅拰瀵嗙爜
+							uni.removeStorageSync('username');
+							uni.removeStorageSync('password');
+							uni.removeStorageSync('remember');
+						}
+						console.log('dadasd', res)
+						// 鐧婚檰鎴愬姛锛屽瓨鍌ㄧ浉鍏充俊鎭�
+						this.$u.vuex("vuex_token", res.access_token);
+						this.$u.vuex("vuex_refresh_token", res.refresh_token);
+						this.$u.vuex("vuex_username", res.user_info.staffName);
+						this.$u.vuex("vuex_userId", res.user_info.id);
+						//this.$u.vuex("vuex_client_id", res.client_id);
+						this.$u.vuex("vuex_user", res.user_info);
+
+						//鏌ヨ鐢ㄦ埛璇︾粏淇℃伅骞跺偍瀛�
+						/*this.$u.api.user.getUserInfo().then((res) => {
+            console.log("鑾峰彇鐢ㄦ埛淇℃伅:", res);
+            this.$u.vuex("vuex_user", res.data.sysUser);
+          });*/
+
+						//璺宠浆椤甸潰
+						setTimeout(() => {
+							uni.reLaunch({
+								url: "/pages/sys/home/index",
+							});
+						}, 500);
+					})
+					.catch((e) => {
+						this.$u.toast(e);
+					});
+		},
+		checkboxChange(e) {
+			console.log('e---', e)
+			this.remember = e
+			console.log('this.remember222---', this.remember)
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+@import "index.scss";
+
+.custom-botton{
+		height: 96rpx;
+		background: #214DED;
+		box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		border-radius: 16rpx;
+		line-height: 96rpx;
+	}
+</style>
diff --git a/pages/sys/logs/form.vue b/pages/sys/logs/form.vue
new file mode 100644
index 0000000..4ec8481
--- /dev/null
+++ b/pages/sys/logs/form.vue
@@ -0,0 +1,54 @@
+<template>
+	<view class="wrap">
+		<u-form class="form" :model="model" ref="uForm" label-position="left">
+			<u-form-item label="鏍囬" prop="title" label-width="180">
+				<u-input v-model="model.title" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+			<u-form-item label="绫诲瀷" prop="logType" label-width="180">
+				<u-input  v-model="model.logType" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+			<u-form-item label="ip鍦板潃" prop="remoteAddr" label-width="180">
+				<u-input v-model="model.remoteAddr" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+			<u-form-item label="璇锋眰鏂瑰紡" prop="method" label-width="180">
+				<u-input v-model="model.method" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+			<u-form-item label="瀹㈡埛绔�" prop="serviceId" label-width="180">
+				<u-input v-model="model.serviceId" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+			<u-form-item label="璇锋眰鏃堕棿" prop="time" label-width="180">
+				<u-input v-model="model.time" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+			<u-form-item label="鍒涘缓鏃堕棿" prop="createTime" label-width="180">
+				<u-input v-model="model.createTime" type="text" maxlength="64" :disabled="true"></u-input>
+			</u-form-item>
+		</u-form>
+
+		<view class="form-footer">
+			<u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				model: {}
+			};
+		},
+		onLoad(params) {
+			console.log(params.logInfo)
+			Object.assign(this.model, JSON.parse(params.logInfo));
+			
+			this.model = JSON.parse(params.logInfo)
+		},
+		methods: {
+			cancel() {
+				uni.navigateBack();
+			}
+		}
+	};
+</script>
+<style lang="scss">
+
+</style>
diff --git a/pages/sys/logs/index.vue b/pages/sys/logs/index.vue
new file mode 100644
index 0000000..59a464a
--- /dev/null
+++ b/pages/sys/logs/index.vue
@@ -0,0 +1,115 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-swipe-action :options="options" v-for="(item, index) in list" :key="item.id" :index="index"
+					@click="optionsClick">
+					<u-cell-item :arrow="true" @click="navTo('form?logInfo='+JSON.stringify(item))">
+						<text slot="title">{{ item.title }}</text>
+						<text slot="label">鍒涘缓鏃堕棿锛歿{ item.createTime }}</text>
+					</u-cell-item>
+				</u-swipe-action>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxLog.page(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			optionsClick(rowIndex, btnIndex) {
+				if (btnIndex == 0) {
+					let self = this;
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+						showCancel: true,
+						success: function(res2) {
+							if (res2.confirm) {
+								let row = self.list[rowIndex];
+								self.$u.api.pigxLog.delete({
+									id: row.id
+								}).then(res => {
+									self.$u.toast('鍒犻櫎鎴愬姛');
+									self.query.current = 1
+									self.list = []
+									self.loadList()
+								});
+							}
+						}
+					});
+				}
+			},
+			navTo(url) {
+				uni.navigateTo({
+					url: '/pages/sys/logs/' + url
+				});
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	page {
+		background-color: #f8f8f8;
+	}
+
+	.btn-plus {
+		position: absolute;
+		bottom: 50rpx;
+		right: 50rpx;
+		z-index: 1;
+		opacity: 0.6;
+	}
+
+	.btn-plus:hover {
+		opacity: 1;
+	}
+</style>
diff --git a/pages/sys/pigxParam/form.vue b/pages/sys/pigxParam/form.vue
new file mode 100644
index 0000000..1851e25
--- /dev/null
+++ b/pages/sys/pigxParam/form.vue
@@ -0,0 +1,171 @@
+<template>
+  <view class="wrap">
+    <u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+      <u-form-item label="鍚嶇О" prop="publicName" label-width="180">
+        <u-input v-model="model.publicName" placeholder="publicName"></u-input>
+      </u-form-item>
+      <u-form-item label="閿�" prop="publicKey" label-width="180">
+        <u-input v-model="model.publicKey" placeholder="publicKey"></u-input>
+      </u-form-item>
+      <u-form-item label="鍊�" prop="publicValue" label-width="180">
+        <u-input v-model="model.publicValue" placeholder="publicValue"></u-input>
+      </u-form-item>
+      <u-form-item label="鐘舵��" prop="status" label-width="180">
+        <js-radio v-model="model.status" itemLabel="label" itemValue="value"
+                  :items="lockData"></js-radio>
+      </u-form-item>
+      <u-form-item label="缂栫爜" prop="validateCode" label-width="180">
+        <u-input v-model="model.validateCode" placeholder="validateCode"></u-input>
+      </u-form-item>
+      <u-form-item label="绫诲瀷" prop="publicType" label-width="180">
+        <js-select v-model="model.publicType" placeholder="璇烽�夋嫨绫诲瀷" itemLabel="label" itemValue="value"
+                   dictType="param_type" ></js-select>
+      </u-form-item>
+      <u-form-item label="鍐呯疆" prop="systemFlag" label-width="180">
+        <js-radio v-model="model.systemFlag" itemLabel="label" itemValue="value"
+                  :items="systemData"></js-radio>
+      </u-form-item>
+    </u-form>
+    <view class="form-footer">
+      <u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+      <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      type: '',
+      model: {
+        publicId: 0,
+        publicName: '',
+        publicKey: '',
+        publicValue: '',
+        status: '',
+        validateCode: '',
+        createBy: '',
+        updateBy: '',
+        createTime: '',
+        updateTime: '',
+        publicType: '',
+        systemFlag: '',
+        delFlag: '',
+        tenantId: '',
+      },
+      lockData: [{
+        label: '鏈夋晥',
+        value: '0'
+      }, {
+        label: '閿佸畾',
+        value: '9'
+      }],
+      systemData: [{
+        label: '鍚�',
+        value: '0'
+      }, {
+        label: '鏄�',
+        value: '1'
+      }],
+      rules: {
+        publicName: [
+          {required: true, message: 'publicName涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        publicKey: [
+          {required: true, message: 'publicKey涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        publicValue: [
+          {required: true, message: 'publicValue涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        status: [
+          {required: true, message: 'status涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        validateCode: [
+          {required: true, message: 'validateCode涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        createBy: [
+          {required: true, message: '鍒涘缓浜轰笉鑳戒负绌�', trigger: 'blur'}
+        ],
+
+        updateBy: [
+          {required: true, message: '淇敼浜轰笉鑳戒负绌�', trigger: 'blur'}
+        ],
+
+        createTime: [
+          {required: true, message: '鍒涘缓鏃堕棿涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        updateTime: [
+          {required: true, message: '淇敼鏃堕棿涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        publicType: [
+          {required: true, message: 'publicType涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        systemFlag: [
+          {required: true, message: 'systemFlag涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        delFlag: [
+          {required: true, message: 'delFlag涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        tenantId: [
+          {required: true, message: '绉熸埛ID涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+      }
+    }
+  },
+  onLoad(params) {
+    if (params && params.id !== "undefined") {
+      this.type = 'edit'
+      this.$u.api.pigxParam.getObj(params).then(res => {
+        this.model = res.data;
+      });
+    } else {
+      this.type = 'add'
+      this.model = {}
+    }
+  },
+  methods: {
+    submit() {
+      this.$refs.uForm.validate(async valid => {
+        if (valid) {
+          if (this.type === 'edit') {
+            await this.$u.api.pigxParam.putObj(this.model)
+          } else {
+            await this.$u.api.pigxParam.addObj(this.model)
+          }
+          setTimeout(() => {
+            uni.showModal({
+              title: '鎻愮ず',
+              content: this.type === 'edit' ? '淇敼鎴愬姛' : '娣诲姞鎴愬姛',
+              showCancel: false,
+              success: function () {
+                uni.setStorageSync('refreshList', true);
+                uni.navigateTo({
+                  url: '/pages/sys/pigxParam/index'
+                })
+              }
+            })
+          }, 200)
+        } else {
+          this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�')
+        }
+      });
+    },
+    cancel() {
+      uni.navigateBack();
+    }
+  }
+}
+</script>
+
diff --git a/pages/sys/pigxParam/index.vue b/pages/sys/pigxParam/index.vue
new file mode 100644
index 0000000..3f2c739
--- /dev/null
+++ b/pages/sys/pigxParam/index.vue
@@ -0,0 +1,122 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.publicName" v-for="(item, index) in list" :key="item.publicId" :index="item.publicId"
+					@click="cardClick(item.publicId)">
+					<view class="" slot="body">
+						<view class="row-list">
+							<span class="span-lable">鍚嶇О: </span>{{ item.publicName }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">閿�: </span>{{ item.publicKey }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">鍊�: </span>{{ item.publicValue }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">缂栫爜: </span>{{ item.validateCode }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">鐘舵��: </span>
+							<dict-tag dict-type="status_type" :value="item.status"></dict-tag>
+						</view>
+						<view class="row-list">
+							<span class="span-lable">绫诲瀷: </span>
+							<dict-tag dict-type="param_type" :value="item.publicType"></dict-tag>
+						</view>
+					</view>
+					<view class="card-foot" slot="foot">
+						<u-button type="primary" size="medium" @click="cardClick(item.publicId)">缂栬緫</u-button>
+						<u-button size="medium" @click="del(item.publicId)">鍒犻櫎</u-button>
+					</view>
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="cardClick()">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			cardClick(id) {
+				uni.navigateTo({
+					url: '/pages/sys/pigxParam/form?id=' + id
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxParam.fetchList(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			del(id) {
+				let self = this;
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+					showCancel: true,
+					success: function(res2) {
+						if (res2.confirm) {
+							self.$u.api.pigxParam.delObj({
+								id: id
+							}).then(res => {
+								self.$u.toast('鍒犻櫎鎴愬姛');
+								self.query.current = 1
+								self.list = []
+								self.loadList()
+							});
+						}
+					}
+				});
+			}
+		}
+	};
+</script>
diff --git a/pages/sys/pigxPost/form.vue b/pages/sys/pigxPost/form.vue
new file mode 100644
index 0000000..7ca1077
--- /dev/null
+++ b/pages/sys/pigxPost/form.vue
@@ -0,0 +1,130 @@
+<template>
+  <view class="wrap">
+    <u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+      <u-form-item label="宀椾綅缂栫爜" prop="postCode" label-width="180">
+        <u-input v-model="model.postCode" placeholder="宀椾綅缂栫爜"></u-input>
+      </u-form-item>
+      <u-form-item label="宀椾綅鍚嶇О" prop="postName" label-width="180">
+        <u-input v-model="model.postName" placeholder="宀椾綅鍚嶇О"></u-input>
+      </u-form-item>
+      <u-form-item label="宀椾綅鎺掑簭" prop="postSort" label-width="180">
+        <u-input v-model="model.postSort" placeholder="宀椾綅鎺掑簭"></u-input>
+      </u-form-item>
+      <u-form-item label="宀椾綅鎻忚堪" prop="remark" label-width="180">
+        <u-input v-model="model.remark" placeholder="宀椾綅鎻忚堪"></u-input>
+      </u-form-item>
+    </u-form>
+    <view class="form-footer">
+      <u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+      <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      type: '',
+      model: {
+        postId: 0,
+        postCode: '',
+        postName: '',
+        postSort: '',
+        remark: '',
+        delFlag: '',
+        createTime: '',
+        createBy: '',
+        updateTime: '',
+        updateBy: '',
+        tenantId: '',
+      },
+      rules: {
+        postCode: [
+          {required: true, message: '宀椾綅缂栫爜涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        postName: [
+          {required: true, message: '宀椾綅鍚嶇О涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        postSort: [
+          {required: true, message: '宀椾綅鎺掑簭涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        remark: [
+          {required: true, message: '宀椾綅鎻忚堪涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        delFlag: [
+          {required: true, message: '鏄惁鍒犻櫎  -1锛氬凡鍒犻櫎  0锛氭甯镐笉鑳戒负绌�', trigger: 'blur'}
+        ],
+
+        createTime: [
+          {required: true, message: '鍒涘缓鏃堕棿涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        createBy: [
+          {required: true, message: '鍒涘缓浜轰笉鑳戒负绌�', trigger: 'blur'}
+        ],
+
+        updateTime: [
+          {required: true, message: '鏇存柊鏃堕棿涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        updateBy: [
+          {required: true, message: '鏇存柊浜轰笉鑳戒负绌�', trigger: 'blur'}
+        ],
+
+        tenantId: [
+          {required: true, message: '绉熸埛ID涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+      }
+    }
+  },
+  onLoad(params) {
+    if (params && params.id !== "undefined") {
+      this.type = 'edit'
+      this.$u.api.pigxPost.getObj(params).then(res => {
+        this.model = res.data;
+      });
+    } else {
+      this.type = 'add'
+      this.model = {}
+    }
+  },
+  methods: {
+    submit() {
+      this.$refs.uForm.validate(async valid => {
+        if (valid) {
+          if (this.type === 'edit') {
+            await this.$u.api.pigxPost.putObj(this.model)
+          } else {
+            await this.$u.api.pigxPost.addObj(this.model)
+          }
+          setTimeout(() => {
+            uni.showModal({
+              title: '鎻愮ず',
+              content: this.type === 'edit' ? '淇敼鎴愬姛' : '娣诲姞鎴愬姛',
+              showCancel: false,
+              success: function () {
+                uni.setStorageSync('refreshList', true);
+                uni.navigateTo({
+                  url: '/pages/sys/pigxPost/index'
+                })
+              }
+            })
+          }, 200)
+        } else {
+          this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�')
+        }
+      });
+    },
+    cancel() {
+      uni.navigateBack();
+    }
+  }
+}
+</script>
+
diff --git a/pages/sys/pigxPost/index.vue b/pages/sys/pigxPost/index.vue
new file mode 100644
index 0000000..1495bdb
--- /dev/null
+++ b/pages/sys/pigxPost/index.vue
@@ -0,0 +1,113 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.postName" v-for="(item, index) in list" :key="item.postId" :index="item.postId"
+					@click="cardClick(item.postId)">
+					<view slot="body">
+						<view class="row-list">
+							<span class="span-lable">宀椾綅缂栫爜: </span>{{ item.postCode }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">宀椾綅鍚嶇О: </span>{{ item.postName }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">宀椾綅鎻忚堪: </span>{{ item.remark }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">宀椾綅鎺掑簭: </span>{{ item.postSort }}
+						</view>
+					</view>
+					<view class="card-foot" slot="foot">
+						<u-button type="primary" size="medium" @click="cardClick(item.postId)">缂栬緫</u-button>
+						<u-button size="medium" @click="del(item.postId)">鍒犻櫎</u-button>
+					</view>
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="cardClick()">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			cardClick(id) {
+				uni.navigateTo({
+					url: '/pages/sys/pigxPost/form?id=' + id
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxPost.fetchList(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			del(id) {
+				let self = this;
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+					showCancel: true,
+					success: function(res2) {
+						if (res2.confirm) {
+							self.$u.api.pigxPost.delObj({
+								id: id
+							}).then(res => {
+								self.$u.toast('鍒犻櫎鎴愬姛');
+								self.query.current = 1
+								self.list = []
+								self.loadList()
+							});
+						}
+					}
+				});
+			}
+		}
+	};
+</script>
diff --git a/pages/sys/pigxRole/form.vue b/pages/sys/pigxRole/form.vue
new file mode 100644
index 0000000..c2ff136
--- /dev/null
+++ b/pages/sys/pigxRole/form.vue
@@ -0,0 +1,142 @@
+<template>
+  <view class="wrap">
+    <u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+      <u-form-item label="鍚嶇О" prop="roleName" label-width="180">
+        <u-input v-model="model.roleName" placeholder="roleName"></u-input>
+      </u-form-item>
+      <u-form-item label="缂栫爜" prop="roleCode" label-width="180">
+        <u-input v-model="model.roleCode" placeholder="roleCode"></u-input>
+      </u-form-item>
+      <u-form-item label="鍚嶇О" prop="roleDesc" label-width="180">
+        <u-input v-model="model.roleDesc" placeholder="roleDesc"></u-input>
+      </u-form-item>
+      <u-form-item label="绫诲瀷" prop="dsType" label-width="180">
+        <js-select v-model="model.dsType" placeholder="璇烽�夋嫨鏁版嵁鏉冮檺绫诲瀷"
+                   itemLabel="label" itemValue="value" :items="dsType"></js-select>
+      </u-form-item>
+      <u-form-item label="鑼冨洿" prop="dsType" label-width="180" v-if="checkedDsScopeShow">
+        <js-checkbox v-model="checkedDsScope" itemLabel="name" itemValue="deptId" :multiple="true" :items="deptList">
+        </js-checkbox>
+      </u-form-item>
+    </u-form>
+    <view class="form-footer">
+      <u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+      <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      type: '',
+      model: {
+        roleId: 0,
+        roleName: '',
+        roleCode: '',
+        roleDesc: '',
+        dsType: '',
+        dsScope: '',
+        createBy: '',
+        updateBy: '',
+        createTime: '',
+        updateTime: '',
+        delFlag: '',
+        tenantId: '',
+      },
+      rules: {
+        roleName: [
+          {required: true, message: 'roleName涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        roleCode: [
+          {required: true, message: 'roleCode涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        roleDesc: [
+          {required: true, message: 'roleDesc涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        dsType: [
+          {required: true, message: 'dsType涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        dsScope: [
+          {required: true, message: 'dsScope涓嶈兘涓虹┖', trigger: 'blur'}
+        ]
+      },
+      dsType: [
+        {
+          label: '鍏ㄩ儴',
+          value: '0'
+        }, {
+          label: '鑷畾涔�',
+          value: '1'
+        }, {
+          label: '鏈骇鍙婂瓙绾�',
+          value: '2'
+        }, {
+          label: '鏈骇',
+          value: '3'
+        }
+      ],
+      deptList: [],
+      checkedDsScope: [],
+      checkedDsScopeShow: false
+    }
+  },
+  onLoad(params) {
+    if (params && params.id !== "undefined") {
+      this.type = 'edit'
+      this.$u.api.pigxRole.getObj(params).then(res => {
+        Object.assign(this.model, res.data);
+        this.checkedDsScope = (this.model.dsScope).split(',')
+        this.checkedDsScopeShow = true
+      });
+    } else {
+      this.type = 'add'
+      this.model = {}
+    }
+  },
+  onReady() {
+    this.$refs.uForm.setRules(this.rules);
+    this.$u.api.pigxDept.list().then(res => {
+      this.deptList = res.data;
+    });
+  },
+  methods: {
+    submit() {
+      this.$refs.uForm.validate(async valid => {
+        if (valid) {
+          this.model.dsScope = this.checkedDsScope
+          if (this.type === 'edit') {
+            await this.$u.api.pigxRole.putObj(this.model)
+          } else {
+            await this.$u.api.pigxRole.addObj(this.model)
+          }
+          setTimeout(() => {
+            uni.showModal({
+              title: '鎻愮ず',
+              content: this.type === 'edit' ? '淇敼鎴愬姛' : '娣诲姞鎴愬姛',
+              showCancel: false,
+              success: function () {
+                uni.setStorageSync('refreshList', true);
+                uni.navigateTo({
+                  url: '/pages/sys/pigxRole/index'
+                })
+              }
+            })
+          }, 200)
+        } else {
+          this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�')
+        }
+      });
+    },
+    cancel() {
+      uni.navigateBack();
+    }
+  }
+}
+</script>
+
diff --git a/pages/sys/pigxRole/index.vue b/pages/sys/pigxRole/index.vue
new file mode 100644
index 0000000..e7bef3f
--- /dev/null
+++ b/pages/sys/pigxRole/index.vue
@@ -0,0 +1,124 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.roleName" v-for="(item, index) in list" :key="item.roleId" :index="item.roleId"
+					@click="cardClick(item.roleId)">
+					<view slot="body">
+						<view class="row-list">
+							<span class="span-lable">瑙掕壊缂栫爜: </span>{{ item.roleCode }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">瑙掕壊鎻忚堪: </span>{{ item.roleDesc }}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">鏁版嵁鏉冮檺: </span>
+							<dict-tag :items="dsType" :value="item.dsType"></dict-tag>
+						</view>
+					</view>
+					<view class="card-foot" slot="foot">
+						<u-button size="medium" type="primary" @click="cardClick(item.roleId)">缂栬緫</u-button>
+						<u-button size="medium" @click="del(item.roleId)">鍒犻櫎</u-button>
+					</view>
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="cardClick()">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}],
+				dsType: [{
+					label: '鍏ㄩ儴',
+					value: '0'
+				}, {
+					label: '鑷畾涔�',
+					value: '1'
+				}, {
+					label: '鏈骇鍙婂瓙绾�',
+					value: '2'
+				}, {
+					label: '鏈骇',
+					value: '3'
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			cardClick(id) {
+				uni.navigateTo({
+					url: '/pages/sys/pigxRole/form?id=' + id
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxRole.fetchList(this.query).then(res => {
+					if (!res.data.records || res.data.records.length === 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			del(id) {
+				let self = this;
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+					showCancel: true,
+					success: function(res2) {
+						if (res2.confirm) {
+							self.$u.api.pigxRole.delObj({
+								id: id
+							}).then(res => {
+								self.$u.toast('鍒犻櫎鎴愬姛');
+								self.query.current = 1
+								self.list = []
+								self.loadList()
+							});
+						}
+					}
+				});
+			}
+		}
+	};
+</script>
diff --git a/pages/sys/pigxTenant/form.vue b/pages/sys/pigxTenant/form.vue
new file mode 100644
index 0000000..555cba4
--- /dev/null
+++ b/pages/sys/pigxTenant/form.vue
@@ -0,0 +1,128 @@
+<template>
+  <view class="wrap">
+    <u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+      <u-form-item label="name" prop="name" label-width="180">
+        <u-input v-model="model.name" placeholder="name"></u-input>
+      </u-form-item>
+      <u-form-item label="code" prop="code" label-width="180">
+        <u-input v-model="model.code" placeholder="code"></u-input>
+      </u-form-item>
+      <u-form-item label="tenantDomain" prop="tenantDomain" label-width="180">
+        <u-input v-model="model.tenantDomain" placeholder="tenantDomain"></u-input>
+      </u-form-item>
+      <u-form-item label="寮�濮嬫椂闂�" prop="startTime" label-width="180">
+        <u-input v-model="model.startTime" placeholder="寮�濮嬫椂闂�"></u-input>
+      </u-form-item>
+      <u-form-item label="缁撴潫鏃堕棿" prop="endTime" label-width="180">
+        <u-input v-model="model.endTime" placeholder="缁撴潫鏃堕棿"></u-input>
+      </u-form-item>
+      <u-form-item label="鐘舵��" prop="status" label-width="180">
+        <js-radio v-model="model.status" itemLabel="label" itemValue="value"
+                  :items="lockData"></js-radio>
+      </u-form-item>
+    </u-form>
+    <view class="form-footer">
+      <u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+      <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      type: '',
+      model: {
+        id: 0,
+        name: '',
+        code: '',
+        tenantDomain: '',
+        startTime: '',
+        endTime: '',
+        status: '',
+        delFlag: '',
+        createBy: '',
+        updateBy: '',
+        createTime: '',
+        updateTime: '',
+      },
+      lockData: [{
+        label: '鏈夋晥',
+        value: '0'
+      }, {
+        label: '閿佸畾',
+        value: '9'
+      }],
+      rules: {
+        name: [
+          {required: true, message: 'name涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        code: [
+          {required: true, message: 'code涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        tenantDomain: [
+          {required: true, message: 'tenantDomain涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        startTime: [
+          {required: true, message: '寮�濮嬫椂闂翠笉鑳戒负绌�', trigger: 'blur'}
+        ],
+
+        endTime: [
+          {required: true, message: '缁撴潫鏃堕棿涓嶈兘涓虹┖', trigger: 'blur'}
+        ],
+
+        status: [
+          {required: true, message: 'status涓嶈兘涓虹┖', trigger: 'blur'}
+        ]
+      }
+    }
+  },
+  onLoad(params) {
+    if (params && params.id !== "undefined") {
+      this.type = 'edit'
+      this.$u.api.pigxTenant.getObj(params).then(res => {
+        this.model = res.data[0]
+      });
+    } else {
+      this.type = 'add'
+      this.model = {}
+    }
+  },
+  methods: {
+    submit() {
+      this.$refs.uForm.validate(async valid => {
+        if (valid) {
+          if (this.type === 'edit') {
+            await this.$u.api.pigxTenant.putObj(this.model)
+          } else {
+            await this.$u.api.pigxTenant.addObj(this.model)
+          }
+          setTimeout(() => {
+            uni.showModal({
+              title: '鎻愮ず',
+              content: this.type === 'edit' ? '淇敼鎴愬姛' : '娣诲姞鎴愬姛',
+              showCancel: false,
+              success: function () {
+                uni.setStorageSync('refreshList', true);
+                uni.navigateTo({
+                  url: '/pages/sys/pigxTenant/index'
+                })
+              }
+            })
+          }, 200)
+        } else {
+          this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�')
+        }
+      });
+    },
+    cancel() {
+      uni.navigateBack();
+    }
+  }
+}
+</script>
+
diff --git a/pages/sys/pigxTenant/index.vue b/pages/sys/pigxTenant/index.vue
new file mode 100644
index 0000000..c02d15c
--- /dev/null
+++ b/pages/sys/pigxTenant/index.vue
@@ -0,0 +1,121 @@
+<template>
+	<view class="wrap">
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.name" v-for="(item, index) in list" :key="item.id" :index="item.id"
+					@click="cardClick(item.id)">
+					<view slot="body">
+						<view class="row-list">
+							<span class="span-lable">鍚嶇О: </span>{{item.name}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">缂栫爜: </span>{{item.code}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">鍩熷悕: </span>{{item.tenantDomain}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">寮�濮嬫椂闂�: </span>{{item.startTime}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">缁撴潫鏃堕棿: </span>{{item.endTime}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">鐘舵��: </span>
+							<dict-tag dict-type="status_type" :value="item.status"></dict-tag>
+						</view>
+					</view>
+					<view class="card-foot" slot="foot">
+						<u-button type="primary" size="medium" @click="cardClick(item.id)">缂栬緫</u-button>
+						<u-button size="medium" @click="del(item.id)">鍒犻櫎</u-button>
+					</view>
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="cardClick()">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			cardClick(id) {
+				uni.navigateTo({
+					url: '/pages/sys/pigxTenant/form?id=' + id
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxTenant.fetchList(this.query).then(res => {
+					if (!res.data.records || res.data.records.length === 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+
+					this.loadStatus = "loadmore";
+				});
+			},
+			del(id) {
+				let self = this;
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+					showCancel: true,
+					success: function(res2) {
+						if (res2.confirm) {
+							self.$u.api.pigxTenant.delObj({
+								id: id
+							}).then(res => {
+								self.$u.toast('鍒犻櫎鎴愬姛');
+								self.query.current = 1
+								self.list = []
+								self.loadList()
+							});
+						}
+					}
+				});
+			}
+		}
+	};
+</script>
diff --git a/pages/sys/pigxUser/form.vue b/pages/sys/pigxUser/form.vue
new file mode 100644
index 0000000..a40b76b
--- /dev/null
+++ b/pages/sys/pigxUser/form.vue
@@ -0,0 +1,156 @@
+<template>
+  <view class="wrap">
+    <u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+      <u-form-item label="userId" prop="userId" label-width="180">
+        <u-input v-model="model.userId" type="text" maxlength="64" :disabled="true"></u-input>
+      </u-form-item>
+      <u-form-item label="濮撳悕" prop="username" label-width="180">
+        <u-input placeholder="璇疯緭鍏ュ鍚�" v-model="model.username" type="text" maxlength="200"></u-input>
+      </u-form-item>
+      <u-form-item label="瀵嗙爜" prop="password" label-width="180">
+        <u-input placeholder="璇疯緭鍏ュ瘑鐮�" v-model="model.password" type="password" maxlength="500"></u-input>
+      </u-form-item>
+      <u-form-item label="鎵嬫満鍙�" prop="phone" label-width="180">
+        <u-input placeholder="璇疯緭鍏ユ墜鏈哄彿" v-model="model.phone" type="text" maxlength="200"></u-input>
+      </u-form-item>
+      <u-form-item label="鎵�灞為儴闂�" prop="deptId" label-width="260">
+        <js-select v-model="model.deptId"  placeholder="璇烽�夋嫨閮ㄩ棬"
+                   itemLabel="name" itemValue="deptId" :items="deptList"></js-select>
+      </u-form-item>
+      <u-form-item label="宀椾綅" prop="post" label-width="180">
+        <js-checkbox v-model="post" itemLabel="postName" itemValue="postId" :multiple="true" :items="postList">
+        </js-checkbox>
+      </u-form-item>
+      <u-form-item label="瑙掕壊" prop="role" label-width="180">
+        <js-checkbox v-model="role" itemLabel="roleName" itemValue="roleId" :multiple="true" :items="roleList">
+        </js-checkbox>
+      </u-form-item>
+      <u-form-item label="鐘舵��" prop="lockFlag" label-width="180">
+        <js-radio v-model="model.lockFlag" itemLabel="label" itemValue="value" :multiple="true"
+                  :items="lockData"></js-radio>
+      </u-form-item>
+      <u-form-item label="鏄电О" prop="nickname" label-width="180">
+        <u-input v-model="model.nickname" type="text" maxlength="64" placeholder="璇疯緭鍏ユ樀绉�"></u-input>
+      </u-form-item>
+      <u-form-item label="閭" prop="email" label-width="180">
+        <u-input v-model="model.email" type="text" maxlength="64" placeholder="璇疯緭鍏ラ偖绠�"></u-input>
+      </u-form-item>
+    </u-form>
+    <view class="form-footer">
+      <u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+      <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+    </view>
+  </view>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      model: {
+        userId: '',
+        username: '',
+        password: '',
+        phone: '',
+        post: [],
+        role: [],
+        lockFlag: '',
+        nickname: '',
+        email: '',
+        createTime: ''
+      },
+      rules: {
+        username: [{
+          required: true,
+          message: '璇疯緭鍏ョ敤鎴峰悕',
+          trigger: ['change', 'blur'],
+        }],
+        password: [{
+          required: true,
+          message: '璇疯緭鍏ュ瘑鐮�',
+          trigger: ['change', 'blur'],
+        }]
+      },
+      lockData: [{
+        label: '鏈夋晥',
+        value: '0'
+      }, {
+        label: '閿佸畾',
+        value: '9'
+      }],
+      post: '',
+      role: '',
+      deptList: [],
+      postList: [],
+      roleList: [],
+      officeSelectList: [],
+      userSelectList: [],
+    };
+  },
+  onLoad(params) {
+    if (params && params.id !== "undefined") {
+      this.type = 'edit'
+      this.$u.api.pigxUser.getOne(params).then(res => {
+        Object.assign(this.model, res.data);
+        this.model.password = ''
+        this.role = '';
+        if (this.model.roleList && this.model.roleList.length > 0) {
+          this.role = this.model.roleList.map(item => item.roleId).join()
+        }
+
+        this.post = ''
+        if (this.model.postList && this.model.postList.length > 0) {
+          this.post = this.model.postList.map(item => item.postId).join()
+        }
+      });
+    } else {
+      this.type = 'add'
+      this.model = {}
+    }
+
+  },
+  onReady() {
+    this.$refs.uForm.setRules(this.rules);
+    // todo 鏌ヨ鏈烘瀯鏁版嵁
+    this.$u.api.pigxDept.list().then(res => {
+      this.deptList = res.data;
+    });
+    // 鏌ヨ宀椾綅淇℃伅
+    this.$u.api.pigxPost.list().then(res => {
+      this.postList = res.data
+    })
+    //鏌ヨ瑙掕壊鍒楄〃
+    this.$u.api.pigxRole.list().then(res => {
+      this.roleList = res.data
+    })
+  },
+  methods: {
+    confirmSelect(e) {
+      this.show = false
+    },
+    submit() {
+      this.$refs.uForm.validate(valid => {
+        if (valid) {
+          this.model.post = this.post.split(',')
+          this.model.role = this.role.split(',')
+          this.$u.api.pigxUser.putObj(this.model).then(res => {
+            uni.showModal({
+              title: '鎻愮ず',
+              content: '淇敼鎴愬姛',
+              showCancel: false,
+              success: function () {
+                uni.setStorageSync('refreshList', true);
+                uni.navigateBack();
+              }
+            });
+          });
+        } else {
+          this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�');
+        }
+      });
+    },
+    cancel() {
+      uni.navigateBack();
+    }
+  }
+};
+</script>
diff --git a/pages/sys/pigxUser/index.vue b/pages/sys/pigxUser/index.vue
new file mode 100644
index 0000000..1a94c16
--- /dev/null
+++ b/pages/sys/pigxUser/index.vue
@@ -0,0 +1,126 @@
+<template>
+	<view class="wrap">
+		<view class="search">
+			<u-search v-model="query.username" @custom="search" @search="search"></u-search>
+		</view>
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<u-card :title="item.username" :sub-title="item.phone" v-for="(item, index) in list" :key="item.userId"
+					:index="item.userId" @click="cardClick(item.userId)">
+					<view slot="body">
+						<view class="row-list">
+							<span class="span-lable">濮撳悕: </span>{{item.name}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">鏄电О:</span> {{item.nickname}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">閭:</span> {{item.email}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">閮ㄩ棬:</span>{{item.deptName}}
+						</view>
+						<view class="row-list">
+							<span class="span-lable">瑙掕壊:</span>
+							<u-tag :text="role.roleName" mode="plain" v-for="(role, idx) in item.roleList" :key="role.roleId" />
+						</view>
+					</view>
+					<view class="card-foot" slot="foot">
+						<u-button type="primary" size="medium" @click="cardClick(item.userId)">缂栬緫</u-button>
+						<u-button size="medium" @click="del(item.userId)">鍒犻櫎</u-button>
+					</view>
+				</u-card>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="cardClick()">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				options: [{
+					text: '鍒犻櫎',
+					style: {
+						background: '#dd524d'
+					}
+				}]
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			cardClick(id) {
+				uni.navigateTo({
+					url: '/pages/sys/pigxUser/form?id=' + id
+				})
+			},
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.pigxUser.page(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},
+			del(leaveId) {
+				let self = this;
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+					showCancel: true,
+					success: function(res2) {
+						if (res2.confirm) {
+							self.$u.api.pigxUser.delete({
+								id: row.userId
+							}).then(res => {
+								self.$u.toast('鍒犻櫎鎴愬姛');
+								self.query.current = 1
+								self.list = []
+								self.loadList()
+							});
+						}
+					}
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.query.username = value;
+				this.loadList();
+			}
+		}
+	};
+</script>
diff --git a/pages/sys/token/index.vue b/pages/sys/token/index.vue
new file mode 100644
index 0000000..cac40ee
--- /dev/null
+++ b/pages/sys/token/index.vue
@@ -0,0 +1,99 @@
+<template>
+  <view class="wrap">
+    <view class="search">
+      <u-search v-model="query.username" @custom="search" @search="search" placeholder="鐢ㄦ埛鍚�"></u-search>
+    </view>
+    <scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+      <u-cell-group class="list" :border="false">
+        <u-swipe-action :options="options" v-for="(item, index) in list" :key="item.userId" :index="index"
+                        @click="optionsClick">
+          <u-cell-item :arrow="true" >
+            <text slot="title">鐢ㄦ埛:{{ item.username }} </text>
+            <text slot="label">瀹㈡埛绔�:{{ item.client_id }} | 浠ょ墝锛歿{ item.access_token }}</text>
+          </u-cell-item>
+        </u-swipe-action>
+      </u-cell-group>
+      <view class="loadmore" @click="loadMore">
+        <u-loadmore :status="loadStatus"></u-loadmore>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+<script>
+
+export default {
+  data() {
+    return {
+      query: {
+        current: 1,
+        size: 20,
+        username: ''
+      },
+      list: [],
+      count: 0,
+      loadStatus: 'loadmore',
+      options: [
+        {text: '鍒犻櫎', style: {background: '#dd524d'}}
+      ]
+    };
+  },
+  onLoad() {
+    this.loadList();
+  },
+  onShow() {
+    if (uni.getStorageSync('refreshList') === true) {
+      uni.removeStorageSync('refreshList');
+      this.search('');
+    }
+  },
+  methods: {
+    loadMore() {
+      this.loadStatus = "loading";
+      setTimeout(() => {
+        this.query.current += 1;
+        this.loadList();
+      }, 100);
+    },
+    loadList() {
+      this.$u.api.pigxToken.page(this.query).then(res => {
+        if (!res.data.records || res.data.records.length == 0) {
+          this.loadStatus = "nomore";
+          return;
+        }
+        this.list = this.list.concat(res.data.records);
+        this.total = res.data.total;
+        this.query.current = res.data.current;
+        this.query.size = res.data.size;
+        this.loadStatus = "loadmore";
+      });
+    },
+    optionsClick(rowIndex, btnIndex) {
+      if (btnIndex == 0) {
+        let self = this;
+        uni.showModal({
+          title: '鎻愮ず',
+          content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+          showCancel: true,
+          success: function (res2) {
+            if (res2.confirm) {
+              let row = self.list[rowIndex];
+              self.$u.api.pigxToken.delete({token: row.access_token}).then(res => {
+                self.$u.toast('鍒犻櫎鎴愬姛');
+                self.query.current = 1
+                self.list = []
+                self.loadList()
+              });
+            }
+          }
+        });
+      }
+    },
+    search(value) {
+      this.list = [];
+      this.query.current = 1;
+      this.query.username = value;
+      this.loadList();
+    }
+  }
+};
+</script>
diff --git a/pages/sys/user/index-old.scss b/pages/sys/user/index-old.scss
new file mode 100644
index 0000000..cf62f53
--- /dev/null
+++ b/pages/sys/user/index-old.scss
@@ -0,0 +1,94 @@
+.header {
+	background: url(../../../static/custom/banner/4.png) no-repeat left top;
+	background-size: 100% auto;
+	
+	.userinfo {
+		display: flex;
+		padding: 60rpx;
+
+		.image {
+			flex-shrink: 0;
+			width: 120rpx;
+			height: 120rpx;
+			image {
+				border-radius: 100%;
+				width: 100%;
+				height: 100%;
+			}
+		}
+
+		.info {
+			display: flex;
+			flex-flow: wrap;
+			padding-left: 30rpx;
+			color: #fff;
+
+			.username {
+				width: 100%;
+				font-size: 40rpx;
+				padding-top: 8rpx;
+			}
+
+			.usercode {
+				height: 48rpx;
+				padding: 0 20rpx;
+				margin-top: 10rpx;
+				background-color: rgba(0, 0, 0, 0.1);
+				border-radius: 20rpx;
+				font-size: 30rpx;
+			}
+		}
+	}
+
+	.logout {
+		flex-shrink: 0;
+		position: absolute;
+		right: 70rpx;
+		top: 65rpx;
+		.u-btn {
+			font-size: 30rpx;
+		}
+	}
+}
+
+.toolbar {
+	padding: 0 4%;
+	margin-bottom: 5rpx;
+	border-radius: 0 0 100% 100%;
+	background-color: #4094ff;
+
+	.box {
+		display: flex;
+		flex-direction: row;
+		justify-content: space-around;
+		padding: 10rpx;
+		border-radius: 15rpx;
+		box-shadow: 0 0 20rpx rgba(0, 0, 0, 0.15);
+		background-color: #fefefe;
+
+		.item {
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			justify-content: center;
+			// flex-flow: wrap;
+			height: 120rpx;
+			color: #666666;
+			font-size: 30rpx;
+			padding: 10rpx 10rpx;
+
+			.icon {
+				font-size: 50rpx;
+			}
+
+			.label {
+				padding: 10rpx;
+			}
+		}
+
+		.hover {
+			background-color: #f6f6f6;
+			border-radius: 15rpx;
+		}
+	}
+}
diff --git a/pages/sys/user/index-old.vue b/pages/sys/user/index-old.vue
new file mode 100644
index 0000000..6777cda
--- /dev/null
+++ b/pages/sys/user/index-old.vue
@@ -0,0 +1,122 @@
+<template>
+  <view class="wrap">
+    <js-lang title="user.title"></js-lang>
+    <view class="header">
+      <view class="userinfo">
+        <view class="image" @click="navTo('info')"
+        >
+          <image :src="image"></image
+          >
+        </view>
+        <view class="info">
+          <view class="username">{{
+              vuex_username || $t("login.noLogin")
+            }}
+          </view>
+          <view class="usercode">{{
+              vuex_client_id || $t("login.noLogin")
+            }}
+          </view>
+        </view>
+      </view>
+      <view class="logout"
+      >
+        <u-button type="success" shape="circle" size="mini" @click="logout">{{
+            $t("login.logoutButton")
+          }}
+        </u-button>
+      </view
+      >
+    </view>
+    <view class="u-p-t-10 u-p-b-20">
+      <view class="u-m-t-20">
+        <u-cell-group>
+          <u-cell-item
+              icon="account"
+              :iconSize="iconSize"
+              :iconStyle="{ color: '#266bff' }"
+              title="涓汉淇℃伅"
+              @click="navTo('info')"
+          ></u-cell-item>
+          <u-cell-item
+              icon="lock"
+              :iconSize="iconSize"
+              :iconStyle="{ color: '#1bca6a' }"
+              title="淇敼瀵嗙爜"
+              @click="navTo('pwd')"
+          ></u-cell-item>
+          <u-cell-item
+              icon="question-circle"
+              :iconSize="iconSize"
+              :iconStyle="{ color: '#d99e59' }"
+              title="鍦ㄧ嚎瀹㈡湇"
+              @click="chat()"
+          ></u-cell-item>
+        </u-cell-group>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+import config from "../../../common/config";
+
+export default {
+  data() {
+    return {
+      iconSize: 38,
+      image: undefined,
+    };
+  },
+  onLoad() {
+    this.image = config.baseUrl + this.vuex_user.avatar;
+  },
+  methods: {
+    navTo(url) {
+      uni.navigateTo({
+        url: url,
+      });
+    },
+    logout() {
+      this.$u.api.logout().then((res) => {
+        this.$u.toast(res.message);
+
+        //娓呯┖瀛樺偍淇℃伅
+        this.$u.vuex("vuex_token", "");
+        this.$u.vuex("vuex_refresh_token", "");
+        this.$u.vuex("vuex_username", "");
+        this.$u.vuex("vuex_userId", "");
+        this.$u.vuex("vuex_client_id", "");
+        this.$u.vuex("vuex_user", {});
+
+        setTimeout(() => {
+          uni.reLaunch({
+            url: "/pages/sys/login/index",
+          });
+        }, 500);
+      });
+    },
+    chat() {
+      // #ifdef MP
+      wx.openCustomerServiceChat({
+        extInfo: {
+          url: 'https://work.weixin.qq.com/kfid/kfc72b7650fd8e9f664'
+        },
+        corpId: 'wwdfd8cc3eb1127464',
+        success(res) {
+        },
+        fail(res) {
+          console.log(res)
+        }
+      })
+      // #endif
+    }
+  },
+};
+</script>
+<style lang="scss">
+@import "index-old.scss";
+
+page {
+  background-color: #f8f8f8;
+}
+</style>
diff --git a/pages/sys/user/index.vue b/pages/sys/user/index.vue
new file mode 100644
index 0000000..8400653
--- /dev/null
+++ b/pages/sys/user/index.vue
@@ -0,0 +1,100 @@
+<template>
+  <view class="my">
+    <view class="my-head">
+      <u-navbar title="鎴戠殑" :border-bottom="false" :background="background" :title-bold="true" title-color="#fff"
+        :is-back="false" />
+      <view class="my-head-content" @click="navTo('info')">
+        <u-avatar :src="image" size="240"></u-avatar>
+        <p style="font-weight: bold;
+font-size: 34rpx;
+color: #333333;margin-bottom: 12rpx;">{{
+  vuex_username || $t("login.noLogin")
+          }}</p>
+        <!-- TODO 瀵规帴閮ㄩ棬 -->
+        <p style="font-weight: 500;
+font-size: 28rpx;
+color: #666666;">鐢熶骇閮ㄩ棬涓�</p>
+      </view>
+    </view>
+    <u-button type="primary" style="margin: 30rpx;" :loading="loading" @click="logout" :custom-style="{
+      backgroundColor: '#214DED',
+      height: '80rpx'
+    }" class="btn">{{ $t("login.logoutButton") }}</u-button>
+  </view>
+</template>
+
+<script>
+import config from "../../../common/config";
+export default {
+  data() {
+    return {
+      background: {
+        background: 'transparent'
+      },
+      loading: false,
+      image: undefined,
+    }
+  },
+  onLoad() {
+    this.image = config.baseUrl + this.vuex_user.avatar;
+  },
+  methods: {
+    logout() {
+      this.$u.api.logout().then((res) => {
+        this.$u.toast(res.message);
+
+        //娓呯┖瀛樺偍淇℃伅
+        this.$u.vuex("vuex_token", "");
+        this.$u.vuex("vuex_refresh_token", "");
+        this.$u.vuex("vuex_username", "");
+        this.$u.vuex("vuex_userId", "");
+        this.$u.vuex("vuex_client_id", "");
+        this.$u.vuex("vuex_user", {});
+
+        setTimeout(() => {
+          uni.reLaunch({
+            url: "/pages/sys/login/index",
+          });
+        }, 500);
+      });
+    },
+    navTo(url) {
+      // uni.navigateTo({
+      //   url: url,
+      // });
+    },
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.my {
+  height: calc(100vh - 100rpx);
+  background: linear-gradient(to bottom, #E5F0FF, #F6F9FF);
+
+  .my-head {
+    height: 320rpx;
+    background-image: url('~@/static/custom/user/bg2.png');
+    background-size: 100% auto;
+    background-repeat: no-repeat;
+    position: relative;
+
+    .my-head-content {
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      flex-direction: column;
+      position: absolute;
+      left: 50%;
+      transform: translate(-50%, 0);
+      bottom: -220rpx;
+    }
+  }
+
+  .btn {
+    position: fixed;
+    bottom: 160rpx;
+    width: calc(100% - 60rpx);
+  }
+}
+</style>
\ No newline at end of file
diff --git a/pages/sys/user/info.vue b/pages/sys/user/info.vue
new file mode 100644
index 0000000..c382afe
--- /dev/null
+++ b/pages/sys/user/info.vue
@@ -0,0 +1,161 @@
+<template>
+	<view class="wrap">
+		<view class="u-m-t-50 u-flex u-flex-col u-text-center">
+			<u-avatar size="150" :src="image"></u-avatar>
+			<u-button size="medium" shape="circle" class="u-m-t-40"
+				style="font-size:34rpx" @click="chooseAvatar">閫夋嫨澶村儚</u-button>
+		</view>
+		<u-form class="form" :model="model" :rules="rules" ref="uForm">
+			<u-form-item label="鐢ㄦ埛鍚�" prop="username" label-width="120">
+				<u-input placeholder="璇疯緭鍏ョ敤鎴峰悕" v-model="model.username" type="text"></u-input>
+			</u-form-item>
+      <u-form-item label="鎵嬫満" prop="phone" label-width="120">
+        <u-input placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" v-model="model.phone" type="text" maxlength="11"></u-input>
+      </u-form-item>
+      <u-form-item label="鏄电О" prop="nickname" label-width="120">
+        <u-input placeholder="璇疯緭鍏ユ樀绉�" v-model="model.nickname" type="text"></u-input>
+      </u-form-item>
+      <u-form-item label="濮撳悕" prop="name" label-width="120">
+        <u-input placeholder="璇疯緭鍏ュ鍚�" v-model="model.name" type="text"></u-input>
+      </u-form-item>
+			<u-form-item label="閭" prop="email" label-width="120">
+				<u-input placeholder="璇疯緭鍏ョ數瀛愰偖绠�" v-model="model.email" type="text"></u-input>
+			</u-form-item>
+      <u-form-item label="瀵嗙爜" prop="password" label-width="120">
+        <u-input placeholder="璇疯緭鍏ュ瘑鐮�" v-model="model.password" type="text"></u-input>
+      </u-form-item>
+		</u-form>
+		<view class="form-footer">
+			<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+			 <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+		</view>
+	</view>
+</template>
+<script>
+import config from "../../../common/config";
+
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+export default {
+	data() {
+		return {
+      image: '',
+			model: {
+        avatar:undefined,
+        username:undefined,
+        phone:undefined,
+        nickname:undefined,
+        name:undefined,
+        email:undefined
+      },
+			rules: {
+				username: [
+					{
+						required: true,
+						message: '璇疯緭鍏ュ鍚�',
+						trigger: 'blur' ,
+					},
+					{
+						min: 2,
+						max: 32,
+						message: '濮撳悕闀垮害鍦� 2 鍒� 32 涓瓧绗�',
+						trigger: ['change', 'blur'],
+					}
+				],
+        phone: [
+					{
+						validator: (rule, value, callback) => {
+							return value == '' || this.$u.test.mobile(value);
+						},
+						message: '鎵嬫満鍙风爜涓嶆纭�',
+						trigger: ['change','blur'],
+					}
+				],
+        password:[
+          {
+            required: true,
+            message: '璇疯緭鍏ュ瘑鐮�',
+            trigger: 'blur' ,
+          },
+        ]
+			},
+			avatarBase64: ''
+		};
+	},
+	onLoad() {
+	  this.model = this.vuex_user
+    this.model.password = undefined
+    this.image = this.vuex_config.baseUrl+this.model.avatar
+  },
+	onReady() {
+		this.$refs.uForm.setRules(this.rules);
+	},
+	methods: {
+		chooseAvatar() {
+		  let token = this.vuex_token
+      let temp = this
+      uni.chooseImage({
+        success: (chooseImageRes) => {
+          const tempFilePaths = chooseImageRes.tempFilePaths;
+          uni.uploadFile({
+            url: temp.vuex_config.baseUrl+config.adminPath+'/sys-file/upload',
+            filePath: tempFilePaths[0],
+            name: 'file',
+            header: {Authorization:'Bearer '+token},
+            success: (res) => {
+              let result =JSON.parse(res.data)
+              temp.image = temp.vuex_config.baseUrl+result.data.url
+              temp.model.avatar = result.data.url
+            }
+          });
+        }
+      });
+		},
+		submit() {
+			this.$refs.uForm.validate(valid => {
+				if (valid) {
+				  this.model.userId = this.vuex_userId
+				  this.model.username = this.vuex_username
+
+					//鏇存柊鐢ㄦ埛淇℃伅
+					this.$u.api.user.updateUserInfo(this.model).then(res => {
+            let temp = this
+            uni.showModal({
+              title: '鎻愮ず',
+              content: '鏇存柊鐢ㄦ埛淇℃伅鎴愬姛,璇烽噸鏂扮櫥褰�.',
+              showCancel: false,
+              success: function () {
+                temp.$u.api.logout().then(res => {
+                  //娓呯┖瀛樺偍淇℃伅
+                  temp.$u.vuex('vuex_token', '')
+                  temp.$u.vuex('vuex_refresh_token', '')
+                  temp.$u.vuex('vuex_username', '')
+                  temp.$u.vuex('vuex_userId', '')
+                  temp.$u.vuex('vuex_client_id', '')
+                  temp.$u.vuex('vuex_user', {})
+
+                  setTimeout(() => {
+                    uni.reLaunch({
+                      url: '/pages/sys/login/index'
+                    });
+                  }, 500);
+
+                });
+              }
+            });
+          })
+        } else {
+					this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�');
+				}
+			});
+		},
+		cancel() {
+			uni.navigateBack();
+		}
+	}
+};
+</script>
+<style lang="scss">
+
+</style>
diff --git a/pages/sys/user/pwd.vue b/pages/sys/user/pwd.vue
new file mode 100644
index 0000000..9309e5e
--- /dev/null
+++ b/pages/sys/user/pwd.vue
@@ -0,0 +1,121 @@
+<template>
+	<view class="wrap">
+		<u-form class="form" :model="model" :rules="rules" ref="uForm">
+			<u-form-item label="鏃у瘑鐮�" prop="oldPassword" label-width="180">
+				<u-input type="password" v-model="model.password" placeholder="璇疯緭鍏ユ棫瀵嗙爜"></u-input>
+			</u-form-item>
+			<u-form-item label="鏂板瘑鐮�" prop="newPassword" label-width="180">
+				<u-input type="password" v-model="model.newpassword1" placeholder="璇疯緭鍏ユ柊瀵嗙爜"></u-input>
+			</u-form-item>
+			<u-form-item label="纭瀵嗙爜" prop="confirmNewPassword" label-width="180">
+				<u-input type="password" v-model="model.newpassword2" placeholder="璇风‘璁ゆ柊瀵嗙爜"></u-input>
+			</u-form-item>
+		</u-form>
+		<view class="form-footer">
+			<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+      <u-button class="btn" type="default" @click="cancel">鍏抽棴</u-button>
+		</view>
+	</view>
+</template>
+<script>
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+export default {
+	data() {
+		return {
+			model: {
+        password: '',
+        newpassword1: '',
+        newpassword2: ''
+			},
+			rules: {
+        password: [
+					{
+						required: true,
+						message: '璇疯緭鍏ユ棫瀵嗙爜',
+						trigger: ['change','blur'],
+					}
+				],
+        newpassword1: [
+					{
+						required: true,
+						message: '璇疯緭鍏ユ柊瀵嗙爜',
+						trigger: ['change','blur'],
+					},
+					{
+						pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]+\S{5,12}$/,
+						message: '闇�鍚屾椂鍚湁瀛楁瘝鍜屾暟瀛楋紝闀垮害鍦�6-12涔嬮棿',
+						trigger: ['change','blur'],
+					}
+				],
+        newpassword2: [
+					{
+						required: true,
+						message: '璇烽噸鏂拌緭鍏ュ瘑鐮�',
+						trigger: ['change','blur'],
+					},
+					{
+						validator: (rule, value, callback) => {
+							return value === this.model.newpassword1;
+						},
+						message: '涓ゆ杈撳叆鐨勫瘑鐮佷笉鐩哥瓑',
+						trigger: ['change','blur'],
+					}
+				],
+			}
+		};
+	},
+	onReady() {
+		this.$refs.uForm.setRules(this.rules);
+	},
+	methods: {
+		submit() {
+			this.$refs.uForm.validate(valid => {
+				if (valid) {
+				  //淇敼瀵嗙爜鏃舵惡甯︿笂userid涓巙sername
+					this.$u.api.user.updateUserInfo({
+            userId:this.vuex_userId,
+            username:this.vuex_username,
+            password: this.model.password,
+            newpassword1: this.model.newpassword1
+					}).then(res => {
+					  let temp = this
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '淇敼瀵嗙爜鎴愬姛,璇烽噸鏂扮櫥褰�.',
+							showCancel: false,
+							success: function () {
+                temp.$u.api.logout().then(res => {
+                  //娓呯┖瀛樺偍淇℃伅
+                  temp.$u.vuex('vuex_token', '')
+                  temp.$u.vuex('vuex_refresh_token','')
+                  temp.$u.vuex('vuex_username', '')
+                  temp.$u.vuex('vuex_userId', '')
+                  temp.$u.vuex('vuex_client_id', '')
+                  temp.$u.vuex('vuex_user',{})
+
+                  setTimeout(() => {
+                    uni.reLaunch({
+                      url: '/pages/sys/login/index'
+                    });
+                  }, 500);
+
+                });
+							}
+						});
+					});
+				} else {
+					this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�');
+				}
+			});
+		},
+		cancel() {
+			uni.navigateBack();
+		}
+	}
+};
+</script>
+<style lang="scss">
+
+</style>
diff --git a/pages/util/bleConnect.vue b/pages/util/bleConnect.vue
new file mode 100644
index 0000000..a12812b
--- /dev/null
+++ b/pages/util/bleConnect.vue
@@ -0,0 +1,376 @@
+<template>
+	<view class="content">
+		
+		<button class="btn" type="primary" :loading="isSearching" @tap="startSearch">寮�濮嬫悳绱� </button>
+		<button class="btn" type="warn" @tap="stopSearch">鍋滄鎼滅储</button>
+		
+		
+		<view v-for="(item) in list" :data-title="item.deviceId" :data-name="item.name" :data-advertisData="item.advertisServiceUUIDs"
+		 :key="item.deviceId" @tap="bindViewTap">
+			<view class="item">
+				<view class="deviceId block">{{item.deviceId}}</view>
+				<view class="name block">{{item.name}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState
+	} from 'vuex';
+	export default {
+		data() {
+			return {
+				isSearching: false, //鏄惁姝e湪鎼滅储涓�
+				list: [],
+				services: [],
+				serviceId: 0,
+				writeCharacter: false,
+				readCharacter: false,
+				notifyCharacter: false,
+				printData:null
+			};
+		},
+		computed: mapState(['sysinfo', 'Bluetooth']),
+		onLoad(params) {
+			if (params.data) {
+				this.printData =JSON.parse(params.data);
+			}
+		},
+		onUnload() {
+			//鍋滄鎼滅储钃濈墮璁惧
+			if (this.isSearching) {
+				uni.stopBluetoothDevicesDiscovery();
+			}
+		},
+		methods: {
+			//閿欒鐮佹彁绀�
+			errorCodeTip(code) {
+				if (code == 0) {
+					//姝e父
+				} else if (code == 10000) {
+					uni.showToast({
+						title: '鏈垵濮嬪寲钃濈墮閫傞厤鍣�',
+						icon: 'none'
+					})
+				} else if (code == 10001) {
+					uni.showToast({
+						title: '褰撳墠钃濈墮閫傞厤鍣ㄤ笉鍙敤',
+						icon: 'none'
+					})
+				} else if (code == 10002) {
+					uni.showToast({
+						title: '娌℃湁鎵惧埌鎸囧畾璁惧',
+						icon: 'none'
+					})
+				} else if (code == 10003) {
+					uni.showToast({
+						title: '杩炴帴澶辫触',
+						icon: 'none'
+					})
+				} else if (code == 10004) {
+					uni.showToast({
+						title: '娌℃湁鎵惧埌鎸囧畾鏈嶅姟',
+						icon: 'none'
+					})
+				} else if (code == 10005) {
+					uni.showToast({
+						title: '娌℃湁鎵惧埌鎸囧畾鐗瑰緛鍊�',
+						icon: 'none'
+					})
+				} else if (code == 10006) {
+					uni.showToast({
+						title: '褰撳墠杩炴帴宸叉柇寮�',
+						icon: 'none'
+					})
+				} else if (code == 10007) {
+					uni.showToast({
+						title: '褰撳墠鐗瑰緛鍊间笉鏀寔姝ゆ搷浣�',
+						icon: 'none'
+					})
+				} else if (code == 10008) {
+					uni.showToast({
+						title: '鍏朵綑鎵�鏈夌郴缁熶笂鎶ョ殑寮傚父',
+						icon: 'none'
+					})
+				} else if (code == 10009) {
+					uni.showToast({
+						title: 'Android 绯荤粺鐗规湁锛岀郴缁熺増鏈綆浜� 4.3 涓嶆敮鎸� BLE',
+						icon: 'none'
+					})
+				}
+			},
+			//寮�濮嬫悳绱㈣摑鐗�
+			startSearch() {
+				let that = this
+				uni.openBluetoothAdapter({
+					success(res) {
+						uni.getBluetoothAdapterState({
+							success(res2) {
+								console.log('getBluetoothAdapterState:', res2)
+								if (res2.available) {
+									that.isSearching = true;
+									if (res2.discovering) {
+										uni.showToast({
+											title: '姝e湪鎼滅储闄勮繎鎵撳嵃鏈鸿澶�',
+											icon: "none"
+										})
+										return;
+									}
+			
+									//鑾峰彇钃濈墮璁惧淇℃伅
+									that.getBluetoothDevices()
+			
+									// that.checkPemission()
+								} else {
+									uni.showModal({
+										title: '鎻愮ず',
+										content: '鏈満钃濈墮涓嶅彲鐢�',
+									})
+								}
+							}
+						});
+					},
+					fail() {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '钃濈墮鍒濆鍖栧け璐ワ紝璇锋墦寮�钃濈墮',
+						})
+					}
+				})
+			},
+			stopSearch() {
+				uni.stopBluetoothDevicesDiscovery({
+					success: (res) => {
+						this.isSearching = false;
+						console.log('stop:', res)
+					},
+					fail: (e) => {
+						console.log('stop:', e)
+						this.errorCodeTip(e.errCode);
+					}
+				})
+			},
+			//鏍¢獙鏉冮檺
+			checkPemission() {
+				let that = this
+				let {
+					BLEInformation
+				} = that.Bluetooth;
+				let platform = BLEInformation.platform;
+				that.getBluetoothDevices();
+			},
+			//鑾峰彇钃濈墮璁惧淇℃伅
+			getBluetoothDevices() {
+				let that = this
+				that.list = [];
+				uni.startBluetoothDevicesDiscovery({
+					success(res) {
+						// console.log(res)
+						//钃濈墮璁惧鐩戝惉 uni.onBluetoothDeviceFound
+						plus.bluetooth.onBluetoothDeviceFound((result) => {
+							console.log('onBluetoothDeviceFound:', result)
+							let arr = that.list;
+							let devices = [];
+							let list = result.devices;
+							for (let i = 0; i < list.length; ++i) {
+								if (list[i].name && list[i].name != "鏈煡璁惧") {
+									let arrNew = arr.filter((item) => {
+										return item.deviceId == list[i].deviceId;
+									});
+									// console.log('arrNew:',arrNew.length)
+									if (arrNew.length == 0) {
+										devices.push(list[i]);
+									}
+								}
+							}
+			
+							that.list = arr.concat(devices);
+						});
+						that.time = setTimeout(() => {
+							// uni.getBluetoothDevices
+							plus.bluetooth.getBluetoothDevices({
+								success(res2) {
+									let devices = [];
+									let list = res2.devices;
+									for (let i = 0; i < list.length; ++i) {
+										if (list[i].name && list[i].name != "鏈煡璁惧") {
+											devices.push(list[i]);
+										}
+									}
+			
+									that.list = devices;
+									console.log('getBluetoothDevices:',res2);
+								},
+							})
+			
+							clearTimeout(that.time);
+						}, 3000);
+					}
+				});
+			
+			},
+			//缁戝畾钃濈墮
+			bindViewTap(e) {
+				let that = this;
+				let {
+					title
+				} = e.currentTarget.dataset;
+				let {
+					BLEInformation
+				} = that.Bluetooth;
+				this.stopSearch();
+				
+				that.serviceId = 0;
+				that.writeCharacter = false;
+				that.readCharacter = false;
+				that.notifyCharacter = false;
+				uni.showLoading({
+					title: '姝e湪杩炴帴',
+				})
+				console.log('deviceId:', title)
+				// uni.createBLEConnection
+				plus.bluetooth.createBLEConnection({
+					deviceId: title,
+					success(res) {
+						console.log('createBLEConnection success:', res)
+						BLEInformation.deviceId = title;
+						that.$store.commit('BLEInformationSet', BLEInformation);
+						uni.hideLoading()
+						that.getSeviceId()
+					},
+					fail(e) {
+						that.errorCodeTip(e.errCode);
+						uni.hideLoading()
+					}
+				})
+			},
+			//鑾峰彇钃濈墮璁惧鎵�鏈夋湇鍔�(service)銆�
+			getSeviceId() {
+				let that = this;
+				let {
+					BLEInformation
+				} = that.Bluetooth;
+				console.log('BLEInformation.deviceId:',BLEInformation.deviceId)
+				// uni.getBLEDeviceServices
+				let t=setTimeout(()=>{
+					plus.bluetooth.getBLEDeviceServices({
+						deviceId: BLEInformation.deviceId,
+						success(res) {
+							console.log('getBLEDeviceServices success:',res)
+							that.services = res.services;
+							that.getCharacteristics()
+						},
+						fail: function(e) {
+							that.errorCodeTip(e.code);	
+							console.log('getBLEDeviceServices fail:',e)
+						}
+					})
+					clearTimeout(t);
+				},1500)
+			},
+			getCharacteristics() {
+				var that = this
+				let {
+					services: list,
+					serviceId: num,
+					writeCharacter: write,
+					readCharacter: read,
+					notifyCharacter: notify
+				} = that;
+				let {
+					BLEInformation
+				} = that.Bluetooth;
+				// uni.getBLEDeviceCharacteristics
+				plus.bluetooth.getBLEDeviceCharacteristics({
+					deviceId: BLEInformation.deviceId,
+					serviceId: list[num].uuid,
+					success(res) {
+						// console.log(res)
+						for (var i = 0; i < res.characteristics.length; ++i) {
+							var properties = res.characteristics[i].properties
+							var item = res.characteristics[i].uuid
+							if (!notify) {
+								if (properties.notify) {
+									BLEInformation.notifyCharaterId = item;
+									BLEInformation.notifyServiceId = list[num].uuid;
+									that.$store.commit('BLEInformationSet', BLEInformation);
+									notify = true
+								}
+							}
+							if (!write) {
+								if (properties.write) {
+									BLEInformation.writeCharaterId = item;
+									BLEInformation.writeServiceId = list[num].uuid;
+									that.$store.commit('BLEInformationSet', BLEInformation);
+									write = true
+								}
+							}
+							if (!read) {
+								if (properties.read) {
+									BLEInformation.readCharaterId = item;
+									BLEInformation.readServiceId = list[num].uuid;
+									that.$store.commit('BLEInformationSet', BLEInformation);
+									read = true
+								}
+							}
+						}
+						if (!write || !notify || !read) {
+							num++
+							that.writeCharacter = write;
+							that.readCharacter = read;
+							that.notifyCharacter = notify;
+							that.serviceId = num;
+							if (num == list.length) {
+								uni.showModal({
+									title: '鎻愮ず',
+									content: '鎵句笉鍒拌璇诲啓鐨勭壒寰佸��',
+								})
+							} else {
+								that.getCharacteristics()
+							}
+						} else {
+							that.openControl()
+						}
+					},
+					fail: function(e) {
+						console.log("getBLEDeviceCharacteristics fail锛�",e);
+						that.errorCodeTip(e.errCode);	
+					}
+				})
+			},
+			openControl: function() {
+				uni.navigateTo({
+					url: '/pages/product/outputRegister/printProductOutLabel?data='+ JSON.stringify(this.printData),
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="less">
+	.btn {
+		margin-top: 50rpx;
+		height: 40px;
+		width: 600rpx;
+		line-height: 40px;
+	}
+
+	.item {
+		display: block;
+		font-family: Arial, Helvetica, sans-serif;
+		font-size: 14px;
+		margin: 0 30px;
+		margin-top: 10px;
+		background-color: #FFA850;
+		border-radius: 5px;
+		border-bottom: 2px solid #68BAEA;
+	}
+
+	.block {
+		display: block;
+		color: #ffffff;
+		padding: 5px;
+	}
+</style>
diff --git a/pages/wareHouse/finishProductIn/index.vue b/pages/wareHouse/finishProductIn/index.vue
new file mode 100644
index 0000000..be6f4d7
--- /dev/null
+++ b/pages/wareHouse/finishProductIn/index.vue
@@ -0,0 +1,718 @@
+<template>
+	<view class="page">
+	  <view class="finishProductIn-index-bg"/>
+	  <u-navbar title="鎴愬搧鍏ュ簱" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+	  <view class="finishProductIn-index-param">
+	  		  <view class="finishProductIn-index-param-view">
+	  			  <view class="finishProductIn-index-param-item param-extra">
+	  			  	<view class="finishProductIn-index-param-item-left">
+	  			  	  <text class="item-one">鑷冲簱浣嶅彿</text>
+	  			  	</view>
+	  			  	<view class="finishProductIn-index-param-item-right" @click="seachLocationNo">
+	  			  	   <text class="item-one">{{tolocationNo}}</text>
+	  			  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+	  			  	</view>
+	  			  </view>
+	  			  <view class="finishProductIn-index-param-item param-extra">
+	  			  	<view class="finishProductIn-index-param-item-left">
+	  			  	  <text class="item-one">鑷姩鎻愪氦</text>
+	  			  	</view>
+	  			  	<view class="finishProductIn-index-param-item-right">
+	  			  	   <!--<text class="item-one">{{isAuto?'鏄�':'鍚�'}}</text>-->
+	  			  	   <picker class="item-one" style="width: 100%;" @change="autoNumBindChange($event,isAutoList)" :value="autoNumIndex" :range="isAutoList"
+	  			  	   	range-key="label">
+	  			  	   	<view>
+	  			  	   		<text>{{isAutoList[autoNumIndex].label}}</text>
+	  			  	   	</view>
+	  			  	   </picker>
+	  			  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+	  			  	</view>
+	  			  </view>
+	  			  <view class="finishProductIn-index-param-item">
+	  			  	<view class="finishProductIn-index-param-item-left">
+	  			  	  <text class="item-one">鏄惁棰勭暀</text>
+	  			  	</view>
+	  			  	<view class="finishProductIn-index-param-item-right">
+	  			  	   <!--<text class="item-one">{{isAuto?'鏄�':'鍚�'}}</text>-->
+	  			  	   <picker class="item-one" style="width: 100%;" @change="reserveNumBindChange($event,isReserveList)" :value="reserveNumIndex" :range="isReserveList"
+	  			  	   	range-key="label">
+	  			  	   	<view>
+	  			  	   		<text>{{isReserveList[reserveNumIndex].label}}</text>
+	  			  	   	</view>
+	  			  	   </picker>
+	  			  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+	  			  	</view>
+	  			  </view>
+	  		  </view>
+	  </view>
+	  <view class="finishProductIn-index-operate-info">
+		  <view class="finishProductIn-index-operate-info-view">
+			  <view class="info-one">
+				  <view class="t1">{{totalQty}}</view>
+				  <view class="t2">鎬绘暟</view>
+			  </view>
+			  <view class="info-two">
+			  		<view class="t1">{{totalPan}}</view>
+			  		<view class="t2">鎬荤洏鏁�</view>		  
+			  </view>
+		  </view>
+	  </view>
+	  <view class="wrap">
+		<scroll-view class="finishProductIn-index-scroll-list" scroll-y="true">
+			<u-cell-group class="finishProductIn-index-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+					<view class="content-header">
+							<view class="header-item">
+								<view class="content-header-icon-one"></view>
+								<view class="content-header-title">{{ item.partBatchNo }}</view>
+							</view>
+							<view class="header-item">
+								<view class="content-header-icon-two"></view>
+								<view class="content-header-title-ne">{{ item.partName }}</view>
+							</view>
+							<view class="header-item-toolbar" @click="deleteHandle(item)">
+								<view class="header-item-toolbar-del-icon">
+									
+								</view>
+								<view class="header-item-toolbar-del-text">
+									鍒犻櫎
+								</view>
+							</view>
+					</view>
+					<view class="content-body">
+						<view class="part-one">
+							<view class="part-one-left">
+								<text>璁㈠崟鍙�: {{ item.customerOrderNo }}</text>
+							</view>
+							<view class="part-one-right">
+								<text>闆朵欢鍙�: {{ item.partNo }}</text>
+							</view>
+						</view>
+						<view class="part-two">
+							<view class="list-row">
+								<view class="list-row-left">{{'&nbsp;'}}erp鎵瑰彿: {{ item.ifsBatchNo }}</view>
+								<view class="list-row-right">浠庡簱浣嶅彿: {{ item.locationNo }}</view>
+							</view>
+							<view class="list-row">
+								<view class="list-row-left">璁¢噺鍗曚綅: {{ item.unit }}</view>
+								<view class="list-row-right">鑷冲簱浣嶅彿: {{ item.arriveLocationNo }}</view>
+							</view>
+						</view>
+						<view class="part-three">
+							<view class="part-three-left">
+								<view class="_label">
+									鍙敤搴撳瓨鏁伴噺
+								</view>
+								<view class="_content">
+									{{ item.availableStockQuantity }}
+								</view>
+							</view>
+							<view class="part-three-right">
+								<view class="_label">
+									绉诲簱搴撳瓨鏁伴噺
+								</view>
+								<view class="_content">
+									<u-input placeholder="璇疯緭鍏ユ暟閲�" v-model="item.moveQty" type="digit"></u-input>
+									<!--<text>{{ item.moveQty }}</text>-->
+									<view class="edit_icon"></view>
+								</view>
+							</view>
+						</view>
+					</view>
+					<!--<view class="row-list">
+						<view class="_label">
+							绉诲簱搴撳瓨鏁伴噺:
+						</view>
+						<view class="_content">
+							<u-input placeholder="璇疯緭鍏ョЩ搴撳簱瀛樻暟閲�" v-model="item.moveQty" type="digit"></u-input>
+						</view>
+					</view>-->
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		<scan></scan>
+
+		<view class="finishProductIn-form-footer" v-if="list.length>0">
+			<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+		</view>
+	</view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+    import content_bg from '@/static/custom/finishProductIn/locNoBg.png'
+	
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				list: [],
+				tolocationNo: "CPK01",
+				isUseLotBatchNo:false,
+				isAuto:false,
+				isReserve:false,
+				index:0,
+				isAutoList:[
+					{value:false,label:'鍚�'},
+					{value:true,label:'鏄�'}
+				],
+				autoNumIndex:0,
+				isReserveList:[
+					{value:false,label:'鍚�'},
+					{value:true,label:'鏄�'}
+				],
+				reserveNumIndex:0,
+			};
+		},
+		onLoad() {
+			// this.loadList({"part_no":"88.118.1/A0048179","wdr":"221026000567N","qty_arrived":"1","wdr":"221026000567N","unit_meas":"pcs","material_code":null});
+			// this.loadList({"part_no":"88.118.1/A0187345","lot_batch_no":"230315003687N","qty_arrived":2.64,"wdr":"妫�5","unit_meas":"km","material_code":"25070076","sn_no":"妫�5"});
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+
+				if (data.code != "" && (that.tolocationNo == "")) {
+					uni.showToast({
+						title: '璇烽�夋嫨鑷冲簱浣嶅彿',
+						icon: 'none'
+					})
+					return
+				}
+				//鍒ゆ柇浜岀淮鐮佷腑鏄惁鏈塻n_no锛屽吋瀹硅�佹爣绛句簩缁寸爜
+				let snNoIndex=data.code.indexOf('sn_no')
+				if(snNoIndex>-1){
+					this.isUseLotBatchNo=false
+				}else{
+					this.isUseLotBatchNo=true
+				}
+				const result = JSON.parse(data.code)
+				//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦�  SN鍜宲artNo 鏄惁宸茬粡瀛樺湪
+				let initList = that.list.filter(item => {
+					return item.partNo === result.part_no && item.partBatchNo === (this.isUseLotBatchNo?result.lot_batch_no:result.sn_no) && that.tolocationNo === item.arriveLocationNo
+				})
+				if (initList.length > 0) {
+					uni.showToast({
+						title: "姝ゆ潯璁板綍宸插瓨鍦ㄣ��",
+						icon: "none"
+					});
+					return
+				}
+				that.loadList(result);
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		computed: {
+			totalQty(){
+				const total=this.list.reduce((prev, curr) => {
+					return prev + (parseFloat(curr.moveQty)||0)
+				}, 0)
+				return parseFloat(total.toFixed(6))
+			},
+			totalPan(){
+				return this.list.length
+			}
+		},
+		methods: {
+			autoNumBindChange(e,storage){
+				if (storage.length <= 0) {
+					this.autoNumIndex = null
+					return
+				}
+				this.autoNumIndex = e.target.value
+				this.isAuto = storage[this.autoNumIndex].value
+			},
+			reserveNumBindChange(e,storage){
+				if (storage.length <= 0) {
+					this.reserveNumIndex = null
+					return
+				}
+				this.reserveNumIndex = e.target.value
+				this.isReserve = storage[this.reserveNumIndex].value
+			},
+			//鑷冲簱浣�
+			seachLocationNo() {
+				uni.navigateTo({
+					url: '/pages/wareHouse/finishProductIn/locNoList'
+				})
+			},
+			loadList(result) {
+				
+				uni.showLoading({
+					mask: true,
+					title: "鍔犺浇涓�",
+				});
+				let that = this
+				if(that.list.length > 1) {
+					uni.showToast({
+						title: '鎴愬搧鍏ュ簱涓嶆敮鎸佹壒閲忔搷浣�',
+						icon: "none"
+					});
+					return
+				}
+				if (result) {
+					let data = {
+						sn: (this.isUseLotBatchNo?result.lot_batch_no:result.sn_no),
+						partNo: result.part_no
+					}
+					// 鏌ヨ搴撳瓨淇℃伅
+					that.$u.api.finishProductIn.list(data).then(res => {
+						that.index++
+						let reList = res.data
+						
+						if (reList.length == 0) {
+							uni.showToast({
+								title: `搴撲綅鍙�:${that.tolocationNo},闆朵欢鍙�:${data.partNo},SN:${data.sn},鏈壂鍒板簱瀛樹俊鎭痐,
+								icon: "none"
+							});
+						} else {
+							for (let i = 0; i < reList.length; i++) {
+								let item = {
+									id: reList[i].id,
+									partNo: reList[i].partNo,
+									partName: reList[i].partName,
+									partBatchNo: reList[i].partBatchNo,
+									ifsBatchNo: reList[i].ifsBatchNo,
+									unit: reList[i].unit,
+									locationNo: reList[i].locationNo,
+									availableStockQuantity: reList[i].availableStockQuantity,
+									arriveLocationNo: that.tolocationNo,
+									moveQty: reList[i].availableStockQuantity,
+									customerOrderNo: reList[i].customerOrderNo,
+									materialCode:result.material_code
+								}
+								
+								that.list.push(item)
+							}
+							if(this.isAuto){
+								this.submit()
+							}
+						}
+						uni.hideLoading();
+					})
+					
+				}
+			},
+			//鑷冲簱浣嶅彿璁剧疆
+			setNo(no) {
+				this.tolocationNo = no
+			},
+			deleteHandle(obj) {
+				let that = this
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '姝ゆ搷浣滃皢鍒犻櫎璇ュ叆搴撲俊鎭�, 鏄惁缁х画?',
+					success: function(res) {
+						if (res.confirm) {
+							that.list.map((item, index) => {
+								if (obj.id == item.id) {
+									that.list.splice(index, 1)
+								}
+							});
+						}
+					}
+				});
+			},
+			submit() {
+				let that = this
+				that.list.map((item) => {
+					if (item.moveQty <= 0) {
+						uni.showToast({
+							title: '璇峰叆搴撴暟閲忓繀椤诲ぇ浜�0',
+							icon: "none"
+						});
+						return
+					}
+					if (item.moveQty > item.availableStockQuantity) {
+						uni.showToast({
+							title: '鍏ュ簱鏁伴噺涓嶈兘澶т簬鍙敤搴撳瓨鏁伴噺',
+							icon: "none"
+						});
+						return
+					}
+				});
+				if(that.list.length > 1) {
+					uni.showToast({
+						title: '鎴愬搧鍏ュ簱涓嶆敮鎸佹壒閲忔搷浣�',
+						icon: "none"
+					});
+					return
+				}
+				let subList = []
+				that.list.map((item) => {
+					let sub = {
+						stockId: item.id,
+						arriveLocationNo: item.arriveLocationNo,
+						moveQty: item.moveQty,
+						materialCode:item.materialCode,
+						snNo:item.partBatchNo,
+						isReserve:that.isReserve
+					}
+					subList.push(sub)
+				});
+				
+				that.$u.api.finishProductIn.addList(subList).then(res => {
+					if (res.code == 0) {
+						uni.showToast({
+							title: '鎻愪氦鎴愬姛',
+							duration: 2000
+						});
+						that.index = 0
+						that.list = []
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: res.msg||'鎻愪氦澶辫触',
+							showCancel: false,
+							success: function() {
+
+							}
+						})
+					}
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.finishProductIn-index-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/finishProductIn/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	.finishProductIn-index-param{
+		padding: 50rpx 30rpx 0rpx 30rpx;
+		.finishProductIn-index-param-view{
+			height: 300rpx;
+			background: rgba(255,255,255,0.61);
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.09);
+			border-radius: 10rpx;
+			padding:0rpx 23rpx;
+			margin-bottom: 20rpx;
+			.finishProductIn-index-param-item{
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display:flex;
+				justify-content: space-between;
+				border: none;
+				.finishProductIn-index-param-item-left{
+					.item-one{
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+				.finishProductIn-index-param-item-right{
+					display: flex;
+					.item-one{
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+					.item-two{
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+					.item-three{
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+				}
+			}
+			.param-extra{
+				border-bottom: 1px solid #E8EBEE;
+			}
+		}
+	}
+	
+	.finishProductIn-index-operate-info{
+		height: 144rpx;
+		width: 690rpx;
+		margin: 0 auto 20rpx;
+		.finishProductIn-index-operate-info-view{
+			background-image: url('~@/static/custom/finishProductIn/info-bg.png');
+			background-size: 100% auto;
+			background-repeat: no-repeat;
+			height: 144rpx;
+			position: relative;
+			.info-one{
+				position:absolute;
+				top:0rpx;
+				left:60rpx;
+				height:144rpx;
+				display: flex;
+				flex-direction:column;
+				justify-content: center;
+                text-align: center;
+				.t1{
+					font-size: 36rpx;
+					color: #0C72FF;
+					font-weight: bold;
+				}
+				.t2{
+					font-size: 28rpx;
+					color: #4C4E4E;
+				}
+			}
+			.info-two{
+				position:absolute;
+				top:0rpx;
+				left:270rpx;
+				height:144rpx;
+				display: flex;
+				flex-direction:column;
+				justify-content: center;
+				text-align: center;
+				.t1{
+					font-size: 36rpx;
+					color: #0C72FF;
+					font-weight: bold;
+				}
+				.t2{
+					font-size: 28rpx;
+					color: #4C4E4E;
+				}
+			}
+		}
+	}
+	
+	.wrap .finishProductIn-index-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 756rpx);
+	    width:100%;
+	}
+	.finishProductIn-index-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 26rpx;
+			height: 450rpx;
+			padding: 10rpx 20rpx;
+			box-shadow:0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position:relative;
+			.content-header{
+				.header-item{
+					height: 50rpx;
+					display: flex;
+					align-items:center;
+					.content-header-icon-one{
+						background-image: url('~@/static/custom/finishProductIn/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-icon-two{
+						background-image: url('~@/static/custom/finishProductIn/header_icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+					.content-header-title-ne{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+			    }
+				.header-item-toolbar{
+					position: absolute;
+					background-image: url('~@/static/custom/finishProductIn/del-icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:60rpx;
+					width:140rpx;
+					right:0;
+					top:0;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+					.header-item-toolbar-del-icon{
+						background-image: url('~@/static/custom/finishProductIn/icon_dele.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:25rpx;
+						width:22rpx;
+						margin-top: 5rpx;
+					}
+					.header-item-toolbar-del-text{
+						margin-left:7rpx;
+						height: 23rpx;
+						font-size: 24rpx;
+						color: #FFFFFF;
+					}
+				}
+			}
+			
+			.content-body{
+				margin-top:8rpx;
+				.part-one{
+					display: flex;
+					justify-content: space-between;
+					margin-bottom: 16rpx;
+					.part-one-left{
+						padding: 8rpx 16rpx;
+						height: 50rpx;
+						background: #EFF5FF;
+						border-radius: 20rpx;
+						font-size: 24rpx;
+						color: #2D85EC;
+					}
+					.part-one-right{
+						padding: 8rpx 16rpx;
+						height: 50rpx;
+						background: #EBFEFD;
+						border-radius: 20rpx;
+						font-size: 24rpx;
+						color: #139FAC;
+					}
+				}
+				.part-two{
+					background: #F5F9FF;
+					border-radius: 10rpx;
+					padding-left: 20rpx;
+					padding-top: 10rpx;
+					padding-bottom: 10rpx;
+					height: 130rpx;
+					margin-bottom: 16rpx;
+					.list-row{
+						display: flex;
+						justify-content: space-between;
+						height: 55rpx;
+						line-height: 55rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+						.list-row-left{
+							width: 54%;
+						}
+						.list-row-right{
+							width: 46%;
+						}
+					}
+				}
+				
+				.part-three{
+					display: flex;
+					justify-content: space-between;
+					padding-left: 20rpx;
+					.part-three-left{
+						width: 54%;
+						._label{
+							font-size: 26rpx;
+							color: #444444;
+						}
+						._content{
+							margin-top: 12rpx;
+							height: 56rpx;
+							line-height: 52rpx;
+							background: #F6FAFF;
+							border: 1px solid #4FA0FF;
+							border-radius: 8rpx;
+							width:265rpx;
+							padding-left: 20rpx;
+							color: #214DED;
+							font-weight: bold;
+						}
+					}
+					.part-three-right{
+						width: 46%;
+						._label{
+							font-size: 26rpx;
+							color: #444444;
+						}
+						._content{
+							margin-top: 12rpx;
+							height: 56rpx;
+							line-height: 52rpx;
+							background: #F6FAFF;
+							border: 1px solid #4FA0FF;
+							border-radius: 8rpx;
+							width:265rpx;
+							padding-left: 20rpx;
+							padding-right: 10rpx;
+							color: #214DED;
+							font-weight: bold;
+							display: flex;
+							justify-content: space-between;
+							align-items: center;
+							.edit_icon{
+								background-image: url('~@/static/custom/finishProductIn/icon_edit.png');
+								background-size: 100% auto;
+								background-repeat: no-repeat;
+								height:26rpx;
+								width:26rpx;
+							}
+							::v-deep .u-input__input{
+								font-size: 26rpx !important;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	.finishProductIn-form-footer{
+		display: flex;
+		margin-top: 10rpx;
+		margin-bottom: 10rpx;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		padding-bottom: 14rpx;
+		.btn {
+		  flex: 1;
+		  margin: 10rpx;
+		  background: #214DED;
+		  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		  font-weight: bold;
+		  color: #FEFEFE;
+		  font-family: PingFang SC;
+		}
+	}
+</style>
diff --git a/pages/wareHouse/finishProductIn/locNoList.vue b/pages/wareHouse/finishProductIn/locNoList.vue
new file mode 100644
index 0000000..eed5e21
--- /dev/null
+++ b/pages/wareHouse/finishProductIn/locNoList.vue
@@ -0,0 +1,257 @@
+<template>
+	<view class="page">
+		<view class="finishProductIn-locno-bg"/>
+		<u-navbar title="鎴愬搧搴撲綅" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="finishProductIn-locno-search">
+			<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ簱浣嶅彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+	   <view class="wrap">
+		<scroll-view class="finishProductIn-locno-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="finishProductIn-locno-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.locNo" :index="index"
+					@click="selectNo(item.locNo)">
+					<view class="content-header">
+						<view class="content-header-icon"></view>
+						<view class="content-header-title">{{ item.locName }}</view>
+					</view>
+					<view class="content-body">
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-1">
+								</view>
+								<view class="_label-name">搴撲綅缂栧彿锛�</view>	
+							</view>
+							<view class="_content">
+								{{ item.locNo }}
+							</view>
+						</view>
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-2">
+								</view>
+								<view class="_label-name">搴撲綅绫诲瀷锛�</view>	
+							</view>
+							<view class="_content">
+								{{ item.locTypeName }}
+							</view>
+						</view>
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-3">
+								</view>
+								<view class="_label-name">搴撲綅鐘舵�侊細</view>	
+							</view>
+							<view class="_content s1">
+								{{ item.locStatusName }}
+							</view>
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/finishProductIn/locNoBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				alllist: [],
+				originList: [],
+				
+				query: {
+					current: 1,
+					size: 10
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loading'
+			};
+		},
+		onLoad() {
+			this.$u.api.finishProductIn.fetchList().then(res => {
+				this.alllist = res.data
+				this.originList = res.data
+				this.loadList()
+			})
+		},
+		methods: {
+			loadMore() {
+				if(this.loadStatus == "nomore" || this.loadStatus == "loading"){
+					return
+				}
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				const data = this.originList.slice((this.query.current-1)*this.query.size,this.query.current*this.query.size)
+				this.list = this.list.concat(data);
+				this.loadStatus = "loadmore";
+				if (!data || data.length < this.query.size) {
+					this.loadStatus = "nomore";
+				}
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				if (value) {
+					this.originList = this.alllist.filter(item => item.locNo.includes(value))
+				} else {
+					this.originList = this.alllist
+				}
+				this.loadList()
+			},
+			selectNo(no) {
+				this.refreshLastPage(no)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(no) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setNo(no)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.finishProductIn-locno-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/finishProductIn/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.finishProductIn-locno-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.wrap .finishProductIn-locno-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.finishProductIn-locno-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}
+	
+</style>
diff --git a/pages/wareHouse/inventory/detail.vue b/pages/wareHouse/inventory/detail.vue
new file mode 100644
index 0000000..55d9bec
--- /dev/null
+++ b/pages/wareHouse/inventory/detail.vue
@@ -0,0 +1,640 @@
+<template>
+	<view class="page">
+	  <view class="inventory-detail-bg"/>
+	  <view class="inventory-detail-carmera">
+		  <view class="inventory-detail-carmera-icon" @click="goScan">
+		  </view>
+		  <view class="inventory-detail-carmera-tip">
+			  <text>鎵竴鎵�</text>
+		  </view>
+	  </view>
+	  <u-navbar title="鎵爜鐩樼偣" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+	  <view class="inventory-detail-param">
+		  <view class="inventory-detail-param-view">
+			  <view class="inventory-detail-param-item param-extra">
+			  	<view class="inventory-detail-param-item-left">
+			  	  <text class="item-one">鐩樼偣缂栧彿</text>
+			  	</view>
+			  	<view class="inventory-detail-param-item-right">
+			  	   <text class="item-one">{{inyInfo.inyNo}}</text>
+			  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+			  	</view>
+			  </view>
+			  <view class="inventory-detail-param-item param-extra">
+			  	<view class="inventory-detail-param-item-left">
+			  	  <text class="item-one">鐩樼偣搴撲綅</text>
+			  	</view>
+			  	<view class="inventory-detail-param-item-right" @click="goLoc()">
+			  	   <text v-if="inyInfo.locNo" class="item-one">{{inyInfo.locNo}}</text>
+			  	   <text v-if="!inyInfo.locNo" class="item-one item-two">璇烽�夋嫨</text>
+			  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+			  	</view>
+			  </view>
+			  <view class="inventory-detail-param-item">
+			  	<view class="inventory-detail-param-item-left">
+			  	  <text class="item-one">鑷姩鎻愪氦</text>
+			  	</view>
+			  	<view class="inventory-detail-param-item-right">
+			  	   <!--<text class="item-one">{{isAuto?'鏄�':'鍚�'}}</text>-->
+				   <picker class="item-one" style="width: 100%;" @change="autoNumBindChange($event,isAutoList)" :value="autoNumIndex" :range="isAutoList"
+				   	range-key="label">
+				   	<view>
+				   		<text>{{isAutoList[autoNumIndex].label}}</text>
+				   	</view>
+				   </picker>
+			  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+			  	</view>
+			  </view>
+		  </view>
+	  </view>
+	  <view class="wrap">
+		<scroll-view class="inventory-detail-scroll-list" scroll-y="true">
+			<u-cell-group class="inventory-detail-scroll-list-group" :border="false">
+				<view class="tip" v-if="list.length==0">-璇锋柊澧炴垨鎵爜-</view>
+				<view class="content" v-for="(x, index) in list" :key="index" :index="index">
+					<u-form :model="x" ref="uForm" labelWidth="6em" >
+						<u-form-item label="闆朵欢鍙�" prop="partNo" required>
+							<u-input v-model="x.partNo" disabled @click="x.isScan?null:goPart(index)"/>
+							<u-icon slot="right" name="arrow-right" color="#687792" size="28"></u-icon>
+						</u-form-item>
+						<u-form-item label="闆朵欢鍚嶇О" prop="partName">
+							<u-input v-model="x.partName" disabled @click="x.isScan?null:goPart(index)"/>
+							<u-icon slot="right" name="arrow-right" color="#687792" size="28"></u-icon>
+						</u-form-item>
+						<u-form-item label="SN鍙�" prop="sn" required>
+							<u-input v-model="x.sn" :disabled="x.isScan"/>
+							<u-icon slot="right" name="arrow-right" color="#687792" size="28"></u-icon>
+						</u-form-item>
+						<u-form-item label="IFS鎵规鍙�" prop="ifsBatchNo" required>
+							<u-input v-model="x.ifsBatchNo" :disabled="x.isScan"/>
+							<u-icon slot="right" name="arrow-right" color="#687792" size="28"></u-icon>
+						</u-form-item>
+						<u-form-item label="鐩樼偣鏁伴噺" prop="inyQty" required>
+							<u-input v-model="x.inyQty" type="number"/>
+							<u-icon slot="right" name="arrow-right" color="#687792" size="28"></u-icon>
+						</u-form-item>
+						<u-form-item label="鍗曚綅" prop="unit">
+							<u-input v-model="x.unit" :disabled="x.isScan"/>
+							<u-icon slot="right" name="arrow-right" color="#687792" size="28"></u-icon>
+						</u-form-item>
+					</u-form>
+					<view class="content-btn">
+						<u-button size="mini" :custom-style="customStyle" @click="goMinus(index)">
+							<u-icon name="trash" color="#fff" size="28"></u-icon>
+							<text style="margin-left:4rpx;">鍒犻櫎</text>
+						</u-button>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		<view class="inventory-footer">
+			<u-button class="btn-left" size="medium" type="primary" @click="goAdd">鏂板</u-button>
+			<u-button class="btn-right" size="medium" type="primary" @click="goSubmit">鎻愪氦</u-button>
+		</view>
+		<scan></scan>
+		<u-modal v-model="showConfirm" content="璇ラ浂浠舵壒娆″凡鎵弿杩�,鏄惁缁х画鎵弿"  @confirm="confirm" :show-cancel-button="true"/>
+		<u-modal v-model="showScanConfirm" content="璇ラ浂浠舵壒娆″凡鎵弿杩�,鏄惁缁х画鎵弿"  @confirm="confirmGoOn" :show-cancel-button="true"/>
+	</view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import content_bg from '@/static/custom/inventory/locNoBg.png'
+	export default {
+		components: { scan },
+		data() {
+			const rr=(type)=>{
+				return [
+						{ 
+							required: true, 
+							message: `${type}涓哄繀濉」`, 
+							trigger: ['change'],
+						}
+					]
+			}
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				customStyle:{
+					color:'#fff',
+					background:'#ED837B'
+				},
+				labelStyle:{
+					fontSize:'32rpx',
+					whiteSpace:'nowrap'
+				},
+				bodyStyle:{
+					padding: '0 40rpx 10rpx'
+				},
+				inyInfo:{
+					inyid:'',
+					inyNo:'',
+					locNo:''
+				},
+				isAuto:false,
+				list:[
+				],
+				hasScanSnList:[],
+				currentIndex:-1,
+				rules:{
+					partNo:rr('闆朵欢鍙�'),
+					sn:rr('SN鍙�'),
+					ifsBatchNo:rr('IFS鎵规鍙�'),
+					inyQty:rr('鐩樼偣鏁伴噺')
+				},
+				showConfirm:false,
+				currResult:null,
+				currScanresult:null,
+				isBarcode:true,
+				showScanConfirm:false,
+				isAutoList:[
+					{value:false,label:'鍚�'},
+					{value:true,label:'鏄�'}
+				],
+				autoNumIndex:0
+			};
+		},
+		onLoad(option) {
+			this.inyInfo.inyid=option.id
+			this.inyInfo.inyNo=option.no
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.scanHandle(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		onNavigationBarButtonTap(){
+			this.goScan()
+		},
+		methods: {
+			autoNumBindChange(e,storage){
+				if (storage.length <= 0) {
+					this.autoNumIndex = null
+					return
+				}
+				this.autoNumIndex = e.target.value
+				this.isAuto = storage[this.autoNumIndex].value
+			},
+			goScan(){
+				 //let scanresult={"part_no":"88.118.1/A0044193","package_code":"TP092022101200001","unit_meas":"璺�","wdr":"*","lot_batch_no":"*","qty_arrived":12}
+				 //this.scanHandle(JSON.stringify(scanresult))
+				// return
+				if(!this.inyInfo.locNo){
+					this.$u.toast('璇峰厛閫夋嫨鐩樼偣搴撲綅')
+					return
+				}
+				uni.scanCode({
+					scanType: ['qrCode'],
+					success: res => {
+						try {
+							console.log('鎵爜缁撴灉锛�', res);
+							this.scanHandle(res.result)
+						} catch (e) {}
+					}
+				});
+			},
+			confirmGoOn(){
+				if(this.isBarcode){
+					this.hasScanSnList.push(this.currScanresult)
+					//涓嶈嚜鍔紝濉啓鐩樼偣鏁伴噺
+					this.$u.api.inventory.getStockByLocNoAndSn({
+						locationNo:this.inyInfo.locNo,
+						sn:this.currScanresult
+					}).then(res=>{
+						let resultArr=[]
+						if(res.data.data!=null && res.data.data.length>0){
+							 let resDataArr=res.data.data
+							resultArr =resDataArr.map(e=>{
+								return {
+									partNo: e.partNo,
+									partName: e.partName,
+									sn: this.currScanresult,
+									ifsBatchNo: e.ifsBatchNo,
+									inyQty: e.inyQty,
+									unit: e.unit,
+									isScan: true
+								}
+							})
+						}
+						if(resultArr.length==0){
+							this.$u.toast('鏃犳暟鎹�')
+							let hasScanSnIndex=this.hasScanSnList.indexOf(this.currScanresult)
+							this.hasScanSnList.splice(hasScanSnIndex,1)
+						}else{
+							this.$u.api.inventory.goCheck({
+								...resultArr[0],
+								inventoryMainId:this.inyInfo.inyid,
+								locNo:this.inyInfo.locNo
+							}).then(res2=>{
+								if (!res2.data.data.success) {
+									this.showConfirm=true
+									this.confirmData=resultArr
+								} else {
+									this.scanSave(resultArr)
+								}
+								let hasScanSnIndex=this.hasScanSnList.indexOf(this.currScanresult)
+								this.hasScanSnList.splice(hasScanSnIndex,1)
+							}).catch((e) => {
+								let hasScanSnIndex=this.hasScanSnList.indexOf(this.currScanresult)
+								this.hasScanSnList.splice(hasScanSnIndex,1)
+							    console.log(e)
+							})
+						}
+					}).catch((e) => {
+						  let hasScanSnIndex=this.hasScanSnList.indexOf(this.currScanresult)
+						  this.hasScanSnList.splice(hasScanSnIndex,1)
+						  console.log(e)
+						})
+				}else{
+					this.hasScanSnList.push(this.currResult.wdr+' '+this.currResult.lot_batch_no)
+					this.$u.api.inventory.getPartNo({
+						partNo:this.currResult.part_no,
+					}).then(res=>{
+						const obj=[{
+							partNo: this.currResult.part_no,
+							partName: res.data.partName,
+							sn: this.currResult.wdr,
+							ifsBatchNo: this.currResult.lot_batch_no,
+							inyQty: this.currResult.qty_arrived,
+							unit: this.currResult.unit_meas,
+							isScan: true
+						}]
+						this.$u.api.inventory.goCheck({
+							...obj[0],
+							inventoryMainId:this.inyInfo.inyid,
+							locNo:this.inyInfo.locNo
+						}).then(res2=>{
+							if (!res2.data.data.success) {
+								this.showConfirm=true
+								this.confirmData=obj
+							} else {
+								
+								this.scanSave(obj)
+							}
+							let hasScanSnIndex=this.hasScanSnList.indexOf(this.currResult.wdr+' '+this.currResult.lot_batch_no)
+							this.hasScanSnList.splice(hasScanSnIndex,1)
+						}).catch((e) => {
+						  let hasScanSnIndex=this.hasScanSnList.indexOf(this.currResult.wdr+' '+this.currResult.lot_batch_no)
+						  this.hasScanSnList.splice(hasScanSnIndex,1)
+						  console.log(e)
+						})
+					}).catch((e) => {
+						  let hasScanSnIndex=this.hasScanSnList.indexOf(this.currResult.wdr+' '+this.currResult.lot_batch_no)
+						  this.hasScanSnList.splice(hasScanSnIndex,1)
+						  console.log(e)
+						})
+				}
+			},
+			scanHandle(scanresult){
+				if(!this.inyInfo.locNo){
+					this.$u.toast('璇峰厛閫夋嫨鐩樼偣搴撲綅')
+					return
+				}
+				scanresult = scanresult.replace(/[\r\n]/g, "")
+				console.log(scanresult)
+				// const reg = /^{[\w\W]*}$/
+				// console.log(reg.test(scanresult))
+				if (scanresult.indexOf('{')>-1) {
+					//浜岀淮鐮�
+					const result = JSON.parse(scanresult)
+					this.isBarcode=false
+					this.currResult=result
+					let flag=true
+					if(this.list.length>0){
+						let exist=this.list.find((item)=>{return (item.sn+' '+item.ifsBatchNo)==(result.wdr+' '+result.lot_batch_no)})
+						if(exist){
+							flag=false
+						}
+					}
+					//澧炲姞SN鏍¢獙
+					let snFlag=true
+					console.log('this.hasScanSnList',this.hasScanSnList.length)
+					if(this.hasScanSnList.length>0){
+						let hasScanSnIndex=this.hasScanSnList.indexOf(result.wdr+' '+result.lot_batch_no)
+						if(hasScanSnIndex>-1){
+							snFlag=false
+						}
+					}
+					if(flag && snFlag){
+					    this.confirmGoOn()
+					}else{
+						this.showScanConfirm=true
+					}
+					
+				} else {
+					//鏉″舰鐮�
+					if(this.isAuto){
+						//鑷姩鎻愪氦
+						this.$u.toast('鏉″舰鐮佷笉鏀寔鑷姩鎻愪氦')
+						// this.$u.api.inventory.getInventoryDetailByLocNoAndSn({
+						// 	id:this.inyInfo.inyid,
+						// 	locationNo:this.inyInfo.locNo,
+						// 	sn:scanresult
+						// }).then(res=>{
+						// 	this.$u.toast('鎻愪氦鎴愬姛')
+						// })
+					}else{
+						this.isBarcode=true
+						this.currScanresult=scanresult
+						let flag=true
+						if(this.list.length>0){
+							let exist=this.list.find((item)=>{return item.sn==scanresult})
+							if(exist){
+								flag=false
+							}
+						}
+						//澧炲姞SN鏍¢獙
+						let snFlag=true
+						if(this.hasScanSnList.length>0){
+							let hasScanSnIndex=this.hasScanSnList.indexOf(scanresult)
+							if(hasScanSnIndex>-1){
+								snFlag=false
+							}
+						}
+						if(flag && snFlag){
+							this.confirmGoOn()
+						}else{
+							this.showScanConfirm=true
+						}
+					}
+				}
+				
+			},
+			confirm(){
+				this.scanSave(this.confirmData)
+			},
+			scanSave(resultArr){
+				if(this.isAuto){
+					this.save(resultArr)
+				}else{
+					//寰�鏁扮粍鍓嶆帓娣诲姞鍏冪礌
+					resultArr.forEach((item)=>{
+						this.list.unshift(item)
+					})
+					//this.list=this.list.concat(resultArr)
+				}
+			},
+			goAdd() {
+				if(!this.inyInfo.locNo){
+					this.$u.toast('璇峰厛閫夋嫨鐩樼偣搴撲綅')
+					return
+				}
+				this.list.unshift({
+					partNo: '',
+					partName: '',
+					sn: '',
+					ifsBatchNo: '',
+					inyQty: '',
+					unit: '',
+					isScan: false
+				})
+				this.$nextTick(()=>{
+					this.$refs.uForm[this.list.length-1].setRules(this.rules);
+				})
+			},
+			goMinus(i){
+				this.list.splice(i, 1)
+			},
+			goPart(index){
+				this.currentIndex=index;
+				uni.navigateTo({
+					url: `/pages/wareHouse/inventory/partchoose`
+				})
+			},
+			setPart(item){
+				this.list[this.currentIndex].partNo=item.partNo
+				this.list[this.currentIndex].partName=item.partName
+			},
+			goLoc(){
+				uni.navigateTo({
+					url: '/pages/wareHouse/inventory/locNoList'
+				})
+			},
+			setNo(no) {
+				this.inyInfo.locNo=no
+			},
+			goSubmit() {
+				if(this.list.length==0){
+					this.$u.toast('鏃犲緟鎻愪氦鐨勭洏鐐规槑缁�')
+					return
+				}
+				let pass=true
+				this.list.forEach((e,i)=>{
+					this.$refs.uForm[i].validate(valid => {
+						if(!valid){
+							pass=false
+						}
+					})
+				})
+				if(pass){
+					this.save(this.list,true)
+				}
+			},
+			save(list,clear){
+				uni.showLoading({
+					title: '姝e湪鎻愪氦...',
+					mask: true
+				});	
+				let p=[]
+				list.forEach((e,i)=>{
+					const param={
+						...e,
+						inventoryMainId:this.inyInfo.inyid,
+						locNo:this.inyInfo.locNo
+					}
+					p.push(this.$u.api.inventory.addDetail(param))
+				})
+				Promise.all(p).then(()=>{
+					this.$u.toast('鎻愪氦鎴愬姛')
+					if(clear){
+						this.list=[]
+						this.hasScanSnList=[]
+					}
+					uni.hideLoading();
+				})
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.page{
+		position: relative;
+	}
+	.inventory-detail-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/inventory/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.inventory-detail-carmera{
+		position: absolute;
+		top:10rpx;
+		right: 30rpx;
+		height: 82rpx;
+		width: 82rpx;
+		z-index: 1000;
+		.inventory-detail-carmera-icon{
+			background-image: url('~@/static/custom/inventory/carmera.png');
+			background-size: 100% auto;
+			background-repeat: no-repeat;
+			width: 82rpx;
+			height: 82rpx;
+		}
+		.inventory-detail-carmera-tip{
+			text{
+				font-size: 20rpx;
+				color:#3D8BFF;
+			}
+		}
+	}
+	
+	.inventory-detail-param{
+		padding: 50rpx 30rpx 0rpx 30rpx;
+		.inventory-detail-param-view{
+			height: 300rpx;
+			background: rgba(255,255,255,0.61);
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.09);
+			border-radius: 10rpx;
+			padding:0rpx 23rpx;
+			margin-bottom: 30rpx;
+			.inventory-detail-param-item{
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display:flex;
+				justify-content: space-between;
+				border: none;
+				.inventory-detail-param-item-left{
+					.item-one{
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+				.inventory-detail-param-item-right{
+					display: flex;
+					.item-one{
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+					.item-two{
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+					.item-three{
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+				}
+			}
+			.param-extra{
+				border-bottom: 1px solid #E8EBEE;
+			}
+		}
+	}
+	
+	.wrap .inventory-detail-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 596rpx);
+	    width:100%;
+	}
+	.inventory-detail-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(255,255,255,0) !important;
+			margin:0rpx 30rpx;
+			padding:0rpx 0rpx 0rpx 0rpx;
+		}
+		.tip{
+			text-align: center;
+		}
+		.content {
+			background-color: #fff;
+			border-radius: 10rpx;
+			margin-bottom: 20rpx;
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.09);
+			::v-deep .u-form{
+				.u-form-item{
+					padding: 10rpx 22rpx 10rpx 10rpx !important;
+					 .u-form-item--left__content{
+						 justify-content: flex-end !important;
+						 .u-form-item--left__content--required{
+							 position:relative !important;
+						 }
+						 .u-form-item--left__content__label{
+							flex: none !important;
+							color: #666666;
+						 }
+					}
+					.u-form-item--right__content{
+						.u-input{
+							text-align: right !important;
+							.u-input__input{
+								color: #B1B5BB !important;
+							}
+						}
+					}
+				}
+			}
+			.content-btn{
+				padding: 10rpx 0rpx;
+				text-align: right;
+				margin-right: 22rpx;
+			}
+			
+		}
+	}
+
+	.inventory-footer{
+		padding: 0rpx 30rpx 0rpx 30rpx;
+		margin-bottom: 20rpx;
+		display: flex;
+		justify-content: space-between;
+		.btn-left{
+			width: 310rpx;
+			height: 90rpx;
+			background: #30AFFF;
+			border: 1px solid #BFCFE4 !important;
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.3);
+			border-radius: 16rpx;	
+			font-size: 40rpx;
+			font-weight: bold;
+			color: #FEFEFE;
+		}
+		.btn-left:after{
+				border:none !important;
+		}
+		.btn-right{
+			width: 310rpx;
+			height: 90rpx;
+			background: #214DED;
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+			border-radius: 16rpx;
+			font-size: 40rpx;
+			font-weight: bold;
+			color: #FEFEFE;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/wareHouse/inventory/index.vue b/pages/wareHouse/inventory/index.vue
new file mode 100644
index 0000000..dedccde
--- /dev/null
+++ b/pages/wareHouse/inventory/index.vue
@@ -0,0 +1,272 @@
+<template>
+	<view class="page">
+	  <view class="inventory-list-bg"/>
+	  <u-navbar title="鐩樼偣鍒楄〃" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+	  <view class="inventory-list-search">
+	  	<u-search v-model="query.inyNo" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="鐩樼偣缂栧彿" @clear="search" @custom="search" @search="search">
+	  	</u-search>
+	  </view>
+	  <view class="wrap">
+		<scroll-view class="inventory-list-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="inventory-list-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="index" :index="index"
+					@click="goDetail(item)">
+				    <view class="content-header">
+						<view class="content-header-left">
+							<view class="content-header-icon"></view>
+							<view class="content-header-title">鐩樼偣缂栧彿锛歿{ item.inyNo }}</view>
+						</view>
+						<view class="content-header-right">
+							{{item.inyStatus=='finished'?'宸插畬鎴�':'鑽夌'}}
+						</view>
+				    </view>
+				    <view class="content-body">
+				    	<view class="row-list">
+				    		<view class="_label">
+				    			<view class="_label-icon-1">
+				    			</view>
+				    			<view class="_label-name">鐩樼偣鎻忚堪锛�</view>	
+				    		</view>
+				    		<view class="_content">
+				    			{{ item.inyDesc||'鏃�' }}
+				    		</view>
+				    	</view>
+				    	<view class="row-list">
+				    		<view class="_label">
+				    			<view class="_label-icon-2">
+				    			</view>
+				    			<view class="_label-name">鍒� 寤� 浜猴細</view>	
+				    		</view>
+				    		<view class="_content">
+				    			{{ item.createUser }}
+				    		</view>
+				    	</view>
+				    	<view class="row-list">
+				    		<view class="_label">
+				    			<view class="_label-icon-3">
+				    			</view>
+				    			<view class="_label-name">鍒涘缓鏃堕棿锛�</view>	
+				    		</view>
+				    		<view class="_content">
+				    			{{ item.createTime }}
+				    		</view>
+				    	</view>
+				    </view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/inventory/locNoBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				query: {
+					current: 1,
+					size: 20,
+					criteria:JSON.stringify({
+						orderBy:{
+							column:'createTime',
+							direction:'desc'
+						}
+					})
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loading'
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+
+		},
+		filters: {
+			inyStatus(val) {
+				let inyStatus = {
+					finished: '宸插畬鎴�',
+					draft: '鑽夌',
+				}
+				return inyStatus[val]
+			}
+		},
+		methods: {
+			loadMore() {
+				if(this.loadStatus == "nomore"){
+					return
+				}
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.inventory.getMain(this.query).then(res => {
+					this.list = this.list.concat(res.data.records);
+					//this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+					if (!res.data.records || res.data.records.length < this.query.size) {
+						this.loadStatus = "nomore";
+					}
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.loadList();
+			},
+			goDetail(item) {
+				if(item.inyStatus === 'finished'){
+					uni.showToast({
+						title: "鐩樼偣宸插畬鎴愩��",
+						icon: "none"
+					});
+					return
+				}
+				uni.navigateTo({
+					url: `/pages/wareHouse/inventory/detail?id=${item.id}&no=${item.inyNo}`
+				})
+			}
+		}
+	};
+</script>
+<style scoped lang="scss">
+	.inventory-list-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/inventory/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.inventory-list-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.wrap .inventory-list-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.inventory-list-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				justify-content: space-between;
+				.content-header-left{
+					display: flex;
+					align-items:center;
+					.content-header-icon{
+						background-image: url('~@/static/custom/inventory/icon_5.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 28rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+				}
+				.content-header-right{
+					text-align: right;
+					font-weight: bold;
+					color: #FB5B25;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.6;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/inventory/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/inventory/icon3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/inventory/icon4.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #909399;
+						
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					color: #666666;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}
+</style>
diff --git a/pages/wareHouse/inventory/locNoList.vue b/pages/wareHouse/inventory/locNoList.vue
new file mode 100644
index 0000000..450580b
--- /dev/null
+++ b/pages/wareHouse/inventory/locNoList.vue
@@ -0,0 +1,281 @@
+<template>
+	<view class="page">
+		<view class="inventory-locno-bg"/>
+		<u-navbar title="搴撲綅" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="inventory-locno-search">
+			<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ簱浣嶅彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+	  <view class="wrap">
+		<scroll-view class="inventory-locno-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="inventory-locno-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.locNo" :index="index"
+					@click="selectNo(item.locNo)">
+					<view class="content-header">
+						<view class="content-header-icon"></view>
+						<view class="content-header-title">{{ item.locName }}</view>
+					</view>
+					<view class="content-body">
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-1">
+								</view>
+								<view class="_label-name">搴撲綅缂栧彿锛�</view>	
+							</view>
+							<view class="_content">
+								{{ item.locNo }}
+							</view>
+						</view>
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-2">
+								</view>
+								<view class="_label-name">搴撲綅绫诲瀷锛�</view>	
+							</view>
+							<view class="_content">
+								{{ item.locTypeName }}
+							</view>
+						</view>
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-3">
+								</view>
+								<view class="_label-name">搴撲綅鐘舵�侊細</view>	
+							</view>
+							<view class="_content s1">
+								{{ item.locStatusName }}
+							</view>
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/inventory/locNoBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				alllist: [],
+				originList: [],
+				
+				query: {
+					current: 1,
+					size: 10
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loading'
+			};
+		},
+		onLoad() {
+			this.$u.api.pigxWareHouse.fetchList().then(res => {
+				this.alllist = res.data
+				this.originList = res.data
+				this.loadList()
+			})
+		},
+		methods: {
+			loadMore() {
+				if(this.loadStatus == "nomore" || this.loadStatus == "loading"){
+					return
+				}
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				const data = this.originList.slice((this.query.current-1)*this.query.size,this.query.current*this.query.size)
+				this.list = this.list.concat(data);
+				this.loadStatus = "loadmore";
+				if (!data || data.length < this.query.size) {
+					this.loadStatus = "nomore";
+				}
+			},
+			optionsClick(rowIndex, btnIndex) {
+				if (btnIndex == 0) {
+					let self = this;
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+						showCancel: true,
+						success: function(res2) {
+							if (res2.confirm) {
+								let row = self.list[rowIndex];
+								self.$u.api.pigxUser.delete({
+									id: row.userId
+								}).then(res => {
+									self.$u.toast('鍒犻櫎鎴愬姛');
+									self.query.current = 1
+									self.list = []
+									self.loadList()
+								});
+							}
+						}
+					});
+				}
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				if (value) {
+					this.originList = this.alllist.filter(item => item.locNo.includes(value))
+				} else {
+					this.originList = this.alllist
+				}
+				this.loadList()
+			},
+			selectNo(no) {
+				this.refreshLastPage(no)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(no) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setNo(no)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.inventory-locno-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/inventory/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.inventory-locno-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	
+	.wrap .inventory-locno-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.inventory-locno-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}
+	
+</style>
diff --git a/pages/wareHouse/inventory/partchoose.vue b/pages/wareHouse/inventory/partchoose.vue
new file mode 100644
index 0000000..b2dc15f
--- /dev/null
+++ b/pages/wareHouse/inventory/partchoose.vue
@@ -0,0 +1,238 @@
+<template>
+	<view class="page">
+		<view class="inventory-part-bg"/>
+		<u-navbar title="闆朵欢" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="inventory-part-search">
+			<u-search v-model="query.partNo" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ラ浂浠跺彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+	  <view class="wrap">
+		<scroll-view class="inventory-part-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="inventory-part-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="item.id"
+					@click="goOk(item)">
+				    <view class="content-header">
+				    	<view class="content-header-icon"></view>
+				    	<view class="content-header-title">{{ item.partNo }}</view>
+				    </view>
+				    <view class="content-body">
+				    	<view class="row-list">
+				    		<view class="_label">
+				    			<view class="_label-icon-1">
+				    			</view>
+				    			<view class="_label-name">闆朵欢鍚嶇О锛�</view>	
+				    		</view>
+				    		<view class="_content">
+				    			{{ item.partName }}
+				    		</view>
+				    	</view>
+				    	<view class="row-list">
+				    		<view class="_label">
+				    			<view class="_label-icon-2">
+				    			</view>
+				    			<view class="_label-name">鍗曚綅锛�</view>	
+				    		</view>
+				    		<view class="_content">
+				    			{{ item.unit }}
+				    		</view>
+				    	</view>
+				    	<view class="row-list">
+				    		<view class="_label">
+				    			<view class="_label-icon-3">
+				    			</view>
+				    			<view class="_label-name">瑙勬牸锛�</view>	
+				    		</view>
+				    		<view class="_content s1">
+				    			{{ item.specs }}
+				    		</view>
+				    	</view>
+				    </view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+	</view>
+    </view>
+</template>
+<script>
+	import content_bg from '@/static/custom/inventory/locNoBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				query: {
+					current: 1,
+					size: 20
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore'
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			
+		},
+		methods: {
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				this.$u.api.inventory.getPart(this.query).then(res => {
+					this.list = this.list.concat(res.data.records);
+					//this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+					
+					if (!res.data.records || res.data.records.length < this.query.size) {
+						this.loadStatus = "nomore";
+					}
+				});
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				this.loadList();
+			},
+			goOk(item){
+				let pages = getCurrentPages(); // 褰撳墠椤甸潰
+				let beforePage = pages[pages.length - 2]; // 涓婁竴椤�								
+				uni.navigateBack({
+					delta: 1,
+					success: ()=>{
+						beforePage.$vm.setPart(item);
+					}
+				})
+			}
+		}
+	};
+</script>
+<style scoped lang="scss">
+	.inventory-part-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/inventory/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.inventory-part-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+
+    .wrap .inventory-part-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
+	    width:100%;
+	}
+	.inventory-part-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/wareHouse/jumpFinishProductIn/index.vue b/pages/wareHouse/jumpFinishProductIn/index.vue
new file mode 100644
index 0000000..9afdc21
--- /dev/null
+++ b/pages/wareHouse/jumpFinishProductIn/index.vue
@@ -0,0 +1,296 @@
+<template>
+	<view class="wrap">
+		<view class="top">
+			<u-form label-position="left">
+				<u-form-item label="鑷冲簱浣嶅彿" label-width="180">
+					<input v-model="tolocationNo" type="text" style="text-align: left!important;font-size: 12px;"
+						placeholder="璇烽�夋嫨" maxlength="64" :disabled="true" />
+					<u-button type="primary" size="medium" @click="seachLocationNo">閫夋嫨</u-button>
+				</u-form-item>
+			</u-form>
+			<view class="row3 flex-row">
+				<view class="switch">
+					<u-switch v-model="isAuto"/>
+					<view style="padding-left: 10rpx;">鑷姩鎻愪氦</view>
+				</view>
+			</view>
+		</view>
+		<u-cell-group class="list" :border="false" v-if="scanInfo.id">
+			<view class="content">
+				<view class="row-list" style="padding-top: 8px;">
+					<view class="_content">
+						<u-button type="error" size="mini" @click="delScanInfo">鍒犻櫎</u-button>
+					</view>
+				</view>
+				<view class="row-list" style="padding-top: 8px;">
+					<view class="_label">缂栧彿:</view>
+					<view class="_content">{{ scanInfo.no }}</view>
+				</view>
+				<view class="row-list" style="padding-top: 8px;">
+					<view class="_label">SN鍙�:</view>
+					<view class="_content">
+						<view v-for="(no,i) in scanInfo.snList">
+							{{ no }}
+						</view>
+					</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鐗╂枡缂栫爜:</view>
+					<view class="_content">{{ scanInfo.cusMaterialCode }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鍖呰灏哄:</view>
+					<view class="_content">{{ format(scanInfo.packSize,'pack_size') }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鍖呮潗:</view>
+					<view class="_content">{{ format(scanInfo.packMaterial,'pack_material') }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鏁伴噺(鏍�):</view>
+					<view class="_content">{{ scanInfo.number }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鍑�閲�(kg):</view>
+					<view class="_content">{{ scanInfo.netWeight }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">姣涢噸(kg):</view>
+					<view class="_content">{{ scanInfo.grossWeight }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">瀹為檯閲嶉噺(kg):</view>
+					<view class="_content">{{ scanInfo.realWeight }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">宸紓閲嶉噺(kg):</view>
+					<view class="_content">{{ scanInfo.differenceWeight }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鏄惁纭:</view>
+					<view class="_content">{{ scanInfo.isConfirm?'鏄�':'鍚�' }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鍒涘缓鏃ユ湡:</view>
+					<view class="_content">{{ scanInfo.createTime }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鏇存柊鏃ユ湡:</view>
+					<view class="_content">{{ scanInfo.updateTime }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鍒涘缓浜�:</view>
+					<view class="_content">{{ scanInfo.createUser }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鏇存柊浜�:</view>
+					<view class="_content">{{ scanInfo.updateUser }}</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鐞嗚瑁呯鏁伴噺:</view>
+					<view class="_content">{{ scanInfo.theoreticalNumber }}</view>
+				</view>
+			</view>
+		</u-cell-group>
+		<scan></scan>
+		<view class="form-footer" v-if="scanInfo.id&&tolocationNo">
+			<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				isAuto:false,
+				list: [],
+				tolocationNo: "CPK01",
+				scanInfo:{},
+				
+				pack_size:[],
+				pack_material:[]
+				
+			};
+		},
+		onLoad() {
+			//this.scanHandle({"part_no":"88.118.1/A0044193","package_code":"BZ0000000003","unit_meas":"璺�","wdr":"*","lot_batch_no":"*","qty_arrived":12});
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				const result = JSON.parse(data.code.replace(/[\r\n]/g, ""))
+				that.scanHandle(result)
+			})
+			setTimeout(()=>{
+				this.init()
+			},500)
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			delScanInfo(){
+				this.scanInfo={}
+			},
+			init(){
+				this.$u.api.dictData({
+					dictType: 'pack_size'
+				}).then(res => {
+					this.pack_size = res.data;
+				})
+				this.$u.api.dictData({
+					dictType: 'pack_material'
+				}).then(res => {
+					this.pack_material = res.data;
+				})
+			},
+			format(value,type){
+				this[type].forEach((obj) => {
+					if (obj.value === value) {
+						value = obj.label
+					}
+				})
+				return value
+			},
+			//鑷冲簱浣�
+			seachLocationNo() {
+				uni.navigateTo({
+					url: '/pages/wareHouse/finishProductIn/locNoList'
+				})
+			},
+			//鑷冲簱浣嶅彿璁剧疆
+			setNo(no) {
+				this.tolocationNo = no
+			},
+			scanHandle(result){
+				if(!this.tolocationNo){
+					this.$u.toast('璇烽�夋嫨鑷冲簱浣嶅彿')
+					return
+				}
+				this.$u.api.finishProductIn.getPackagingAndSizeByPackagingNo({
+					packagingNo:result.package_code,
+				}).then(res => {
+					if(res.data){
+						this.scanInfo={
+							packagingNo:result.package_code,
+							...res.data
+						}
+						if(this.isAuto){
+							this.submit()
+						}
+					}else{
+						this.$u.toast('鏃犵粦瀹氫俊鎭�')
+					}
+				})
+			},
+			submit() {
+				let that = this
+				that.$u.api.finishProductIn.addListJump({
+					inLocationNo:that.tolocationNo,
+					packagingNo:that.scanInfo.packagingNo,
+				}).then(res => {
+					if (res.code == 0) {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦鎴愬姛',
+							showCancel: false,
+							success: function() {
+								that.scanInfo={}
+							}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦澶辫触',
+							showCancel: false,
+							success: function() {
+								
+							}
+						})
+					}
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.top{
+		padding:0 20rpx 25rpx;
+		border-bottom: 1px solid #eee;
+		.row3{
+			margin-top: 20rpx;
+			justify-content: space-between;
+			padding: 0 15rpx;
+			font-size: 30rpx;
+			.switch{
+				display: flex;
+				align-items: center;
+			}
+			.u-btn{
+				margin: initial;
+				background:#3281FF;
+			}
+		}
+	}
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+		position: relative;
+	}
+	.scroll-list{
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 300rpx);
+	}
+
+	.row-list {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.row-list ._label {
+		flex: 0.8;
+		color: #909399;
+	}
+
+	.row-list ._content {
+		flex: 1.5;
+		text-align: right;
+	}
+
+	.row-img {
+		position: absolute;
+		right: 2px;
+		top: 0px;
+	}
+
+	>>>.uni-input-input {
+		font-size: 12px;
+	}
+
+	::v-deep.u-input__input {
+		min-height: unset !important;
+		text-align: right;
+	}
+</style>
diff --git a/pages/wareHouse/jumpZTE/jumpZTE.vue b/pages/wareHouse/jumpZTE/jumpZTE.vue
new file mode 100644
index 0000000..d0caabf
--- /dev/null
+++ b/pages/wareHouse/jumpZTE/jumpZTE.vue
@@ -0,0 +1,285 @@
+<template>
+	<view class="wrap">
+		<view class="top">
+			<u-form label-position="left">
+				<u-form-item label="搴撲綅鍙�" label-width="180">
+					<input v-model="tolocationNo" type="text" style="text-align: left!important;font-size: 12px;"
+						placeholder="璇烽�夋嫨" maxlength="64" :disabled="true" />
+					<u-button type="primary" size="medium" @click="seachLocationNo">閫夋嫨</u-button>
+				</u-form-item>
+			</u-form>
+			<view class="row3 flex-row">
+				<view class="switch">
+					<u-switch v-model="isAuto"/>
+					<view style="padding-left: 10rpx;">鑷姩鎻愪氦</view>
+				</view>
+			</view>
+		</view>
+		<u-cell-group class="list" :border="false" v-if="scanInfo.newMesCode || scanInfo.pkg || scanInfo.cusMaterialCode" >
+			<view class="content">
+				<view class="row-list" style="padding-top: 8px;">
+					<view class="_label">MES:</view>
+					<view class="_content">
+						<textarea disabled v-model="scanInfo.newMesCode"  auto-height />
+					</view>
+				</view>
+				<view class="row-list" style="padding-top: 8px;">
+					<view class="_label">涓叴:</view>
+					<view class="_content">
+						<textarea disabled v-model="scanInfo.pkg"  auto-height />
+					</view>
+				</view>
+				<view class="row-list">
+					<view class="_label">鐗╂枡缂栫爜:</view>
+					<view class="_content"><textarea disabled v-model="scanInfo.cusMaterialCode"  auto-height /></view>
+				</view>
+			</view>
+		</u-cell-group>
+		<scan></scan>
+		<view class="form-footer" v-if="scanInfo.newMesCode&&tolocationNo&&scanInfo.pkg&&scanInfo.cusMaterialCode">
+			<u-button class="btn" type="primary" @click="submit">鍒ゅ畾</u-button>
+		</view>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				isAuto:false,
+				list: [],
+				tolocationNo: "CPK01",
+				scanInfo:{
+					newMesCode:'',
+					pkg:'',
+					cusMaterialCode:'',
+					packagingCode:'',
+					pkgCode:''
+				},
+				
+			};
+		},
+		onLoad() {
+			// this.scanHandle('{"package_code":"TX0922101204332","unit_meas":"m","wdr":"TP09221250000002","lot_batch_no":"*","qty_arrived":"1.2","material_code":"052530100006"}');
+			// this.scanHandle('1HIU102211150010&052530100006&1200&GDVV 2G.657A2(Bow-type)+2脳1.5mm^2&CN&涓ぉ&2022-11-15&221115');
+			// this.scanHandle('052530100006');
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				const result = data.code.replace(/[\r\n]/g, "")
+				that.scanHandle(result)
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = res.result
+
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			format(value,type){
+				this[type].forEach((obj) => {
+					if (obj.value === value) {
+						value = obj.label
+					}
+				})
+				return value
+			},
+			//鑷冲簱浣�
+			seachLocationNo() {
+				uni.navigateTo({
+					url: '/pages/wareHouse/finishProductIn/locNoList'
+				})
+			},
+			//鑷冲簱浣嶅彿璁剧疆
+			setNo(no) {
+				this.tolocationNo = no
+			},
+			scanHandle(result){
+				console.log(result)
+				if(!this.tolocationNo){
+					this.$u.toast('璇烽�夋嫨鑷冲簱浣嶅彿')
+					return
+				}
+				if (result.indexOf('{') >= 0) {
+					//鏂癿es鐮�
+					this.scanInfo.newMesCode = result
+				} else if (result.indexOf('&') >= 0) {
+					//pkg鐮�
+					this.scanInfo.pkg = result
+				} else {
+					//鐗╂枡缂栫爜
+					this.scanInfo.cusMaterialCode = result
+				}
+				//鑷姩鎻愪氦
+				if(this.isAuto && this.scanInfo.newMesCode && this.scanInfo.pkg && this.scanInfo.cusMaterialCode){
+					this.submit()
+				}
+			},
+			submit() {
+				if (!this.scanInfo.newMesCode) {
+					this.$u.toast('璇锋壂鎻忔柊MES鐮�')
+					return
+				}
+				if (!this.scanInfo.pkg) {
+					this.$u.toast('璇锋壂鎻忎腑鍏寸爜')
+					return
+				}
+				if (!this.scanInfo.cusMaterialCode) {
+					this.$u.toast('璇锋壂鎻忕墿鏂欑紪鐮�')
+					return
+				}
+				
+				let mesCodeJSON = JSON.parse(this.scanInfo.newMesCode)
+				let mes_materialCode = mesCodeJSON.material_code
+				let mes_qty = mesCodeJSON.qty_arrived
+				this.scanInfo.packagingCode = mesCodeJSON.package_code
+				
+				let pkg_sub = this.scanInfo.pkg.substring(this.scanInfo.pkg.indexOf('&')+1)
+				let pkg_sub2 = pkg_sub.substring(pkg_sub.indexOf('&')+1)
+				let pkg_materialCode = pkg_sub.substring(0,pkg_sub.indexOf('&'))
+				let pkg_qty = pkg_sub2.substring(0,pkg_sub2.indexOf('&')) -0 
+				this.scanInfo.pkgCode = this.scanInfo.pkg.substring(0, this.scanInfo.pkg.indexOf('&'))
+				// let pkg_materialCode = this.scanInfo.pkg.substring(this.scanInfo.pkg.indexOf('&')+1, this.scanInfo.pkg.indexOf('&',1))
+				// let pkg_qty = this.scanInfo.pkg.substring(this.scanInfo.pkg.indexOf('&',1)+1, this.scanInfo.pkg.indexOf('&',2)) - 0
+				
+				console.log(mes_qty+' ' + pkg_qty);
+				if (mes_materialCode != pkg_materialCode || mes_materialCode != this.scanInfo.cusMaterialCode) {
+					this.$u.toast('鐗╂枡缂栫爜涓嶄竴鑷�')
+					return
+				}
+				if (mes_qty*1000 != pkg_qty) {
+					this.$u.toast('鏁伴噺涓嶄竴鑷�')
+					return
+				}
+				
+				//1銆佹牎楠�
+				this.$u.api.finishZTE.validateJump({
+					packagingCode: this.scanInfo.packagingCode,
+					pkgCode: this.scanInfo.pkgCode
+				}).then(res => {
+					if (res.code == 0) {
+						// this.$u.toast('ok')
+						//2銆佸垽瀹�
+						this.$u.api.finishZTE.addJumpZTE({
+							packagingCode: this.scanInfo.packagingCode,
+							pkgCode: this.scanInfo.pkgCode,
+							inLocationNo : this.tolocationNo
+						}).then(res => {
+							if (res.code == 0) {
+								uni.showModal({
+									title: '鎻愮ず',
+									content: '鎴愬姛',
+									showCancel: false,
+									success: ()=> {
+										this.scanInfo={}
+									}
+								})
+							} else {
+								uni.showModal({
+									title: '鎻愮ず',
+									content: '澶辫触',
+									showCancel: false,
+									success: ()=> {
+										
+									}
+								})
+							}
+						}).catch(res => {
+							// this.scanInfo={}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鏍¢獙澶辫触',
+							showCancel: false,
+							success: ()=> {
+								
+							}
+						})
+					}
+				})
+				
+			},
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.top{
+		padding:0 20rpx 25rpx;
+		border-bottom: 1px solid #eee;
+		.row3{
+			margin-top: 20rpx;
+			justify-content: space-between;
+			padding: 0 15rpx;
+			font-size: 30rpx;
+			.switch{
+				display: flex;
+				align-items: center;
+			}
+			.u-btn{
+				margin: initial;
+				background:#3281FF;
+			}
+		}
+	}
+	.list .content {
+		font-size: 14px;
+		// background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+		position: relative;
+		border: 1px solid #dddddd;
+	}
+	.scroll-list{
+		height: calc(100vh - var(--window-top) - var(--window-bottom) - 300rpx);
+	}
+
+	.row-list {
+		display: flex;
+		flex-direction: column;
+	}
+
+	.row-list ._label {
+		flex: 0.8;
+		color: #909399;
+	}
+
+	.row-list ._content {
+		flex: 1.5;
+		// text-align: right;
+	}
+
+	.row-img {
+		position: absolute;
+		right: 2px;
+		top: 0px;
+	}
+
+	>>>.uni-input-input {
+		font-size: 12px;
+	}
+
+	::v-deep.u-input__input {
+		min-height: unset !important;
+		text-align: right;
+	}
+</style>
diff --git a/pages/wareHouse/materialReturn/index.vue b/pages/wareHouse/materialReturn/index.vue
new file mode 100644
index 0000000..6dcbbad
--- /dev/null
+++ b/pages/wareHouse/materialReturn/index.vue
@@ -0,0 +1,641 @@
+<template>
+	<view class="page">
+	  <view class="warehouse-materialreturn-bg"/>
+	  <u-navbar title="鎵爜閫�鏂�" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+	  <view class="warehouse-materialreturn-param">
+	  		  <view class="warehouse-materialreturn-param-view">
+	  			  <view class="warehouse-materialreturn-param-item">
+	  			  	<view class="warehouse-materialreturn-param-item-left">
+	  			  	  <text class="item-one">宸ヤ綔绔�</text>
+	  			  	</view>
+	  			  	<view class="warehouse-materialreturn-param-item-right">
+	  			  	   <text class="item-one" @click="toWorkstation">{{tailHandle.workstationName}}</text>
+					   <view class="scan" style="margin-right: 24rpx;" @click="goScan">
+					   </view>
+	  			  	   <u-icon name="arrow-right" color="#687792" size="28" @click="toWorkstation"></u-icon>
+	  			  	</view>
+	  			  </view>
+	  		  </view>
+	  </view>
+	  <view class="materialreturn-index-body-title">
+	  	<view>
+	  		<u-line style="border:5rpx solid #264DE9" length="33rpx"  direction="col" color="#264DE9" :hair-line="false"></u-line>
+	  	</view>
+	  	<view class="title-label">鏈哄彴鐗╂枡</view>
+	  </view>
+	  <view class="wrap"> 
+		<scroll-view class="warehouse-materialreturn-scroll-list" scroll-y="true">	
+		  <u-cell-group class="warehouse-materialreturn-scroll-list-group" :border="false">
+				<div class="tip" style="text-align:center;" v-if="list.length==0">-鏆傛棤鐗╂枡-</div>
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="index" @click="selectRow(item)">
+					<view class="content-header">
+							<view class="header-item">
+								<view class="content-header-icon-one"></view>
+								<view class="content-header-title">{{ item.partBatchNo }}</view>
+							</view>
+							<view class="header-item">
+								<view class="content-header-icon-two"></view>
+								<view class="content-header-title-ne">{{ item.partName }}</view>
+							</view>
+							<view :class="[item.isSelected?'header-item-toolbar-selected':'header-item-toolbar-unselected']">
+								
+							</view>
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									闆朵欢缂栧彿锛�
+								</view>
+								<view class="_content">
+									{{ item.partNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									erp鎵� 鍙凤細
+								</view>
+								<view class="_content">
+									{{ item.ifsBatchNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鍙敤鏁伴噺锛�
+								</view>
+								<view class="_content">
+									<text class="_content-text">{{ item.availableStockQuantity+'('+item.unit+')' }}</text>
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label s1">
+									閫�鏂欐暟閲忥細
+								</view>
+								<view class="_content _input">
+									<u-input placeholder="璇疯緭鍏ラ��鏂欐暟閲�" v-model="item.returnValue" type="digit"></u-input>
+									<view class="edit_icon"></view>
+								</view>
+							</view>
+						</view>
+				</view>
+				</u-cell-group>
+			</scroll-view>
+			
+		<view class="materialReturn-form-footer">
+			<u-button class="btn" type="primary" @click="goSubmit">閫�鍥�</u-button>
+		</view>
+		<scan></scan>	
+		<u-modal v-model="showConfirm" :title="''" content="鏄惁纭灏嗗熬鏂欐墸闄わ紝姝ゆ搷浣滀笉鍙�嗭紒"  @confirm="confirm" :show-cancel-button="true">
+			<view class="slot-content">
+				<view @click="showPicker=true" style="padding: 20rpx;">
+					<view>
+						<text style="margin-right: 20rpx;">閫�鏂欏簱浣�</text>
+						<text style="color: #e6db74;">{{active}}</text>
+					</view>
+				</view>
+			</view>
+		</u-modal>
+				<u-picker v-model="showPicker" mode="selector" :range="arr" range-key="locName" @confirm="confirmPicker"></u-picker>
+	</view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import content_bg from '@/static/custom/materialReturn/backBg.png'
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				showPicker:false,
+				tailHandle:{
+					workstationId: null,
+					workstationNo: null,
+					workstationName: null
+				},	
+				list:[{partNo:'88.118.1/A0138298',partName:'鍦伴搧鍙婅建閬撶敤杞數缂嗗拰杞嚎 /1000V 1脳35 A0',partBatchNo:'231115000002N',ifsBatchNo:'231115000002N',availableStockQuantity:56.3,unit:'绫�',returnValue:56.6},
+				   {partNo:'BS-1704',partName:'涓夊眰鍏辨尋杈撴恫鐢ㄨ啘',partBatchNo:'231115000002N',ifsBatchNo:'231115000002N',availableStockQuantity:72.3,unit:'绫�',returnValue:84},
+				   {partNo:'BS-1704',partName:'涓夊眰鍏辨尋杈撴恫鐢ㄨ啘',partBatchNo:'231115000002N',ifsBatchNo:'231115000002N',availableStockQuantity:72.3,unit:'绫�',returnValue:84}
+				],
+				showConfirm:false,
+				arr:[],
+				active:'鐐瑰嚮閫夋嫨搴撲綅',
+				obj:{}
+			};
+		},
+		onLoad() {
+		
+		},
+		onShow() {
+			let that = this		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				// console.log(data.code.replace(/\n/g,'').replace(/\s*/g,''))
+				// console.log('鎵爜缁撴灉1锛�', JSON.parse(data.code.replace(/\n/g,"").replace(/\s*/g,'')));
+								
+				that.loadList(data.code);
+				that.$forceUpdate();
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			this.goScan()
+		},
+		methods: {
+			confirmPicker(val) {
+				this.obj = {}
+				this.active = this.arr[val[0]].locName
+				this.obj = this.arr[val[0]]
+			},
+			goScan(){
+				 //let scanresult={"part_no":"88.118.1/A0044193","package_code":"TP092022101200001","unit_meas":"璺�","wdr":"*","lot_batch_no":"*","qty_arrived":12}
+				 //this.scanHandle(JSON.stringify(scanresult))
+				
+				uni.scanCode({
+					scanType: ['qrCode'],
+					success: res => {
+						try {
+							console.log('鎵爜缁撴灉锛�', res);
+							this.scanHandle(res.result)
+						} catch (e) {}
+					}
+				});
+			},
+			//鏍规嵁鏈哄彴鍙凤紝鏌ヨ鏈哄彴淇℃伅锛屽啀鏌ヨ鐗╂枡淇℃伅
+			scanHandle(workstationNo){
+				if(workstationNo!=''){
+					this.$u.api.pigxFeed.fetchWorkstationList({workstationNo:workstationNo}).then(resp => {
+						
+						if (!resp.data.records || resp.data.records.length == 0) {
+							this.$u.toast('銆�'+workstationNo+'銆�,鏈煡璇㈠埌鏈哄彴淇℃伅')
+						}else{
+							let workstationList=resp.data.records
+							let scanWorkstationInfo=workstationList[0]
+							this.tailHandle.workstationId = scanWorkstationInfo.id
+							this.tailHandle.workstationNo = scanWorkstationInfo.workstationNo
+							this.tailHandle.workstationName = scanWorkstationInfo.name
+							this.list=[]
+							this.$u.api.returnMaterial.getFeedingStockByWorkstationNo({workstationNo:scanWorkstationInfo.workstationNo}).then(res => {
+												   let reList = []					   
+												   reList = res.data;	
+												   if(reList.length!=0)
+													{
+														// 鎸夊彲鐢ㄦ暟閲忔帓涓簭
+														reList.sort(this.compare('availableStockQuantity'))
+														reList.forEach((item)=>{
+															this.list.push({
+																locationId:item.locationId,
+																locNo:item.locNo,
+																partBatchNo:item.partBatchNo,
+																partId:item.partId,
+																partNo:item.partNo,
+																partName:item.partName,
+																availableStockQuantity:item.availableStockQuantity,
+																unit:item.unit,
+																ifsBatchNo:item.ifsBatchNo,
+																id:item.id,
+																systemNo:item.systemNo,
+																isSelected:false
+															})
+														})
+													}
+							})
+						}								
+					})
+				}else{
+					this.$u.toast('鏈壂鎻忓埌鏈哄彴鍙�')
+				}
+			},
+			selectRow(stock){
+				stock.isSelected=!stock.isSelected	
+				if(stock.isSelected) {
+					stock.returnValue = stock.availableStockQuantity
+				} else {
+					stock.returnValue = ''
+				}
+				/*this.list.forEach((item,index)=>{
+					if(item.id ==stock.id){
+						this.list.splice(index,1)
+						return;
+					}
+				})*/
+				//if(stock.isSelected){
+					//灞曠ず鍦ㄥ垪琛ㄦ渶涓婃柟
+				//	this.list.unshift(stock)
+				//}else{
+					//灞曠ず鍦ㄥ垪琛ㄦ渶涓嬫柟
+				//	this.list.push(stock)
+				//}
+				
+			},
+			setWorkstation(workstation) {
+				this.list=[]
+				this.tailHandle.workstationId = workstation.id
+				this.tailHandle.workstationNo = workstation.workstationNo
+				this.tailHandle.workstationName = workstation.name
+				this.$u.api.returnMaterial.getFeedingStockByWorkstationNo({workstationNo:workstation.workstationNo}).then(res => {
+									   let reList = []					   
+									   reList = res.data;	
+									   if(reList.length!=0)
+										{
+											// 鎸夊彲鐢ㄦ暟閲忔帓涓簭
+											reList.sort(this.compare('availableStockQuantity'))
+											reList.forEach((item)=>{
+												this.list.push({
+													locationId:item.locationId,
+													locNo:item.locNo,
+													partBatchNo:item.partBatchNo,
+													partId:item.partId,
+													partNo:item.partNo,
+													partName:item.partName,
+													availableStockQuantity:item.availableStockQuantity,
+													unit:item.unit,
+													ifsBatchNo:item.ifsBatchNo,
+													id:item.id,
+													systemNo:item.systemNo,
+													isSelected:false
+												})
+											})
+										}
+				});
+			},
+			toWorkstation() {
+				uni.navigateTo({
+					url: '/pages/product/tailHandle/workstationList'
+				})
+			},
+			loadList(sanCode) {
+				let that = this
+				if(sanCode!="")
+				{
+					//鏍规嵁鎵叆鐨勫瓧绗︿覆淇℃伅锛屽垽鏂壂鐨勬槸鏉″舰鐮侊紝杩樻槸浜岀淮鐮�
+					let snNo
+					if (sanCode.indexOf('sn_no') != -1) {
+					    // 浜岀淮鐮�
+					    const scanContentJson = JSON.parse(
+					        sanCode.replace(/\n/g, '').replace(/\s*/g, '')
+					    )
+						snNo=scanContentJson.sn_no
+					    
+					} else {
+					    // 鏉″舰鐮�
+					    snNo = sanCode										    
+					}				   
+				    //鏍规嵁sn鍙烽�変腑鐗╂枡
+					let exsitMaterial=this.list.find((item)=>{
+						return item.partBatchNo==snNo
+					})
+					if(exsitMaterial){
+						exsitMaterial.isSelected=true
+						/*this.list.forEach((item,index)=>{
+							if(item.id ==exsitMaterial.id){
+								this.list.splice(index,1)
+								return;
+							}
+						})*/
+						//灞曠ず鍦ㄥ垪琛ㄦ渶涓婃柟
+						//this.list.unshift(exsitMaterial)
+						
+					}
+				}			
+			},
+			goSubmit(){
+				let stockIds = []
+				this.list.forEach((item) => {
+					if(item.isSelected){
+						stockIds.push(item)
+					}
+				})
+				if(stockIds.length>0){
+					this.showConfirm=true
+					this.$u.api.returnMaterial.getReturnLocations({workstationId:this.tailHandle.workstationId}).then((res) => {
+						console.log(res);
+						console.log(stockIds);
+						this.arr = res.data
+					})
+				} else {
+					this.$u.toast('璇烽�夋嫨闇�鍙戞斁鐨勭墿鏂�!')
+				}
+			},
+			confirm(){
+				let stockIds = []
+				if(this.active === '鐐瑰嚮閫夋嫨搴撲綅') {
+					this.$u.toast('璇烽�夋嫨搴撲綅')
+					this.showConfirm = true
+				} else {
+					this.list.forEach((item) => {
+						if(item.isSelected){
+							stockIds.push({
+								id:item.id,
+								partBatchNo:item.partBatchNo,
+								partId:item.partId,
+								returnLocationId:this.obj.id,
+								returnQuantity:item.returnValue,
+								systemNo:item.systemNo,
+								workstationId:this.tailHandle.workstationId
+							})
+						}
+					})
+					if(stockIds.length>0){
+						this.$u.api.returnMaterial.returnMaterial(stockIds).then(res => {
+							let reData = res.data;
+							this.$u.toast('閫�鏂欐垚鍔�!')
+							this.getWorkstationMaterial(this.tailHandle.workstationNo)
+						})	
+					}
+				}
+			},
+			getWorkstationMaterial(workstationNo){
+				this.list=[]
+				this.$u.api.returnMaterial.getFeedingStockByWorkstationNo({workstationNo:workstationNo}).then(res => {
+									   let reList = []					   
+									   reList = res.data;	
+									   if(reList.length!=0)
+										{
+											// 鎸夊彲鐢ㄦ暟閲忔帓涓簭
+											reList.sort(this.compare('availableStockQuantity'))
+											reList.forEach((item)=>{
+												this.list.push({
+													locationId:item.locationId,
+													locNo:item.locNo,
+													partBatchNo:item.partBatchNo,
+													partId:item.partId,
+													partNo:item.partNo,
+													partName:item.partName,
+													availableStockQuantity:item.availableStockQuantity,
+													unit:item.unit,
+													ifsBatchNo:item.ifsBatchNo,
+													id:item.id,
+													systemNo:item.systemNo,
+													isSelected:false
+												})
+											})
+										}
+				});
+			},
+			compare(pro){
+				return function(obj1, obj2) {
+				    const val1 = obj1[pro]
+				    const val2 = obj2[pro]
+				    if (val2 < val1) {
+				      // 姝e簭
+				      return 1
+				    } else if (val2 > val1) {
+				      return -1
+				    } else {
+				      return 0
+				    }
+				  }
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>	
+    .warehouse-materialreturn-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/materialReturn/backBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.warehouse-materialreturn-param{
+		padding: 50rpx 30rpx 0rpx 30rpx;
+		.warehouse-materialreturn-param-view{
+			height: 100rpx;
+			background: rgba(255,255,255,0.61);
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.09);
+			border-radius: 10rpx;
+			padding:0rpx 23rpx;
+			margin-bottom: 30rpx;
+			.warehouse-materialreturn-param-item{
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display:flex;
+				justify-content: space-between;
+				border: none;
+				.warehouse-materialreturn-param-item-left{
+					.item-one{
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+				.warehouse-materialreturn-param-item-right{
+					display: flex;
+					align-items: center;
+					.item-one{
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+					.item-two{
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+					.item-three{
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+					.scan{
+						background-image: url('~@/static/custom/materialReturn/scan.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:32rpx;
+						width:32rpx;
+					}
+				}
+			}
+			.param-extra{
+				border-bottom: 1px solid #E8EBEE;
+			}
+		}
+	}
+	
+	.materialreturn-index-body-title{
+		padding: 0rpx 30rpx 0rpx 30rpx;
+		margin-bottom: 32rpx;
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		.title-label{
+			margin-left: 14rpx;
+			font-size: 34rpx;
+			font-weight: bold;
+			color: #283E65;
+		}
+	}
+	
+	.wrap .warehouse-materialreturn-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 494rpx);
+	    width:100%;
+	}
+	
+	.warehouse-materialreturn-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+		}
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 24rpx;
+			height: 382rpx;
+			padding: 10rpx 20rpx;
+			box-shadow:0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position:relative;
+			.content-header{
+				.header-item{
+					height: 50rpx;
+					display: flex;
+					align-items:center;
+					.content-header-icon-one{
+						background-image: url('~@/static/custom/materialReturn/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-icon-two{
+						background-image: url('~@/static/custom/materialReturn/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+					.content-header-title-ne{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+			    }
+				.header-item-toolbar-selected{
+					position: absolute;
+					background-image: url('~@/static/custom/materialReturn/selected-btn-1.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:50rpx;
+					width:50rpx;
+					right:20rpx;
+					top:12rpx;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+				}
+				.header-item-toolbar-unselected{
+					position: absolute;
+					background-image: url('~@/static/custom/materialReturn/unselected-btn-1.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:50rpx;
+					width:50rpx;
+					right:20rpx;
+					top:12rpx;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+				}
+			}
+			
+			.content-body{
+				height:250rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 25rpx 23rpx;
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size:26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+				
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+					._content-text{
+						color:#214ded;
+					}
+				}
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+					.edit_icon{
+						background-image: url('~@/static/custom/materialReturn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					::v-deep .uni-input-input{
+						color:#D35651;
+					}
+				}
+				
+				.row-list .s1 {
+					display: flex;
+					color: #214DED;
+					font-size:26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+			}
+		}
+	}
+	
+	.materialReturn-form-footer{
+		display: flex;
+		margin-top: 10rpx;
+		margin-bottom: 10rpx;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		padding-bottom: 14rpx;
+		.btn {
+		  flex: 1;
+		  margin: 10rpx;
+		  background: #214DED;
+		  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		  font-weight: bold;
+		  color: #FEFEFE;
+		  font-family: PingFang SC;
+		}
+	}
+</style>
diff --git a/pages/wareHouse/moveWareHouse/index.vue b/pages/wareHouse/moveWareHouse/index.vue
new file mode 100644
index 0000000..e1d9638
--- /dev/null
+++ b/pages/wareHouse/moveWareHouse/index.vue
@@ -0,0 +1,525 @@
+<template>
+	<view class="page">
+		<view class="movewarehouse-index-bg"/>
+		<u-navbar title="绉诲簱" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="movewarehouse-index-search">
+			<!--<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ簱浣嶅彿" @clear="search" @custom="search" @search="search">
+			</u-search>-->
+			<view class="movewarehouse-index-search-view">
+				<view class="movewarehouse-index-search-view-item">
+			      <text class="item-one">鑷冲簱浣嶅彿</text>
+				  <text class="item-one-content">{{tolocationNo}}</text>
+			    </view>
+				<view class="movewarehouse-index-search-view-item" @click="seachLocationNo()">
+				   <text class="item-two">璇烽�夋嫨</text>
+			       <u-icon name="arrow-right" color="#2979ff" size="28"></u-icon>
+				</view>
+			</view>
+		</view>
+		 <view class="wrap">
+			<scroll-view class="movewarehouse-index-scroll-list" scroll-y="true">
+				<u-cell-group class="movewarehouse-index-scroll-list-group" :border="false">
+					<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+						<view class="content-header">
+							<view class="header-item">
+								<view class="content-header-icon-one"></view>
+								<view class="content-header-title">{{ item.partNo }}</view>
+							</view>
+							<view class="header-item">
+								<view class="content-header-icon-two"></view>
+								<view class="content-header-title">{{ item.partBatchNo }}</view>
+							</view>
+							<view class="header-item-toolbar" @click="deleteHandle(item)">
+								<view class="header-item-toolbar-del-icon">
+									
+								</view>
+								<view class="header-item-toolbar-del-text">
+									鍒犻櫎
+								</view>
+							</view>
+						</view>
+						<!--<view class="row-img" @click="deleteHandle(item)">
+							<u-image width="18px" height="18px" src="@/static/custom/delete.png"></u-image>
+						</view>-->
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									闆朵欢鍚嶇О锛�
+								</view>
+								<view class="_content">
+									{{ item.partName }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									浠庡簱浣嶅彿锛�
+								</view>
+								<view class="_content">
+									{{ item.locationNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鑷冲簱浣嶅彿锛�
+								</view>
+								<view class="_content">
+									{{ item.arriveLocationNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鍙敤搴撳瓨锛�
+								</view>
+								<view class="_content">
+									<text class="_content-text">{{ item.availableStockQuantity }}</text>
+									 ({{ item.unit }})
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									绉诲簱搴撳瓨锛�
+								</view>
+								<view class="_content _input">
+									<u-input placeholder="璇疯緭鍏ョЩ搴撴暟閲�" v-model="item.moveQty" type="digit"></u-input>
+									<view class="edit_icon"></view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</u-cell-group>
+			</scroll-view>
+			<scan></scan>
+			<view class="new-form-footer" v-if="list.length>0">
+				<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+			</view>
+		</view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+    import content_bg from '@/static/custom/moveWareHouse/locNoBg.png'
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				list: [],
+				tolocationNo: "",
+				keywords:''
+			};
+		},
+		onLoad() {
+			// this.loadList("221206000739N");
+			// let data = '{"part_no":"88.118.1/A0047954","lot_batch_no":"221112000082N","qty_arrived":0.5,"wdr":"221112000082N"}'
+			// let data = '221206000739N'
+			// let sn = ''
+			// if (data.indexOf('{') >= 0) {
+			// 	//澶ф爣绛句簩浣嶇爜
+			// 	sn = JSON.parse(data).lot_batch_no
+			// } else {
+			// 	//灏忔爣绛炬潯鐮�
+			// 	sn = data
+			// }
+			// console.log(sn);
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+
+				if (data.code != "" && (that.tolocationNo == "")) {
+					uni.showToast({
+						title: '璇烽�夋嫨鑷冲簱浣嶅彿',
+						icon: 'none'
+					})
+					return
+				}
+				
+				let sn = ''
+				if (data.code.indexOf('{') >= 0) {
+					//澶ф爣绛句簩浣嶇爜
+					let snNoIndex=data.code.indexOf('sn_no')
+					if(snNoIndex>-1){
+						sn = JSON.parse(data.code).sn_no
+					}else{
+						sn = JSON.parse(data.code).lot_batch_no
+					}
+				} else {
+					//灏忔爣绛炬潯鐮�
+					sn = data.code
+				}
+
+				//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦�  SN 鏄惁宸茬粡瀛樺湪
+				let initList = that.list.filter(item => item
+					.partBatchNo == sn)
+				if (initList.length > 0) {
+					uni.showToast({
+						title: "SN:" + sn + ",宸插瓨鍦�,璇烽�夋嫨鍙︿竴涓猄N鍙�",
+						icon: "none"
+					});
+					return
+				}
+
+				that.loadList(sn);
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			//鑷冲簱浣�
+			seachLocationNo() {
+				uni.navigateTo({
+					url: '/pages/wareHouse/moveWareHouse/locNoList'
+				})
+			},
+			loadList(sanCode) {
+				uni.showLoading({
+					mask: true,
+					title: "鍔犺浇涓�",
+				});
+				let that = this
+
+				if (sanCode != "") {
+					let data = {
+						sn: sanCode
+					}
+
+					//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦� 鑷冲簱浣嶅彿 SN 
+					let initList = that.list.filter(item => item.arriveLocationNo == that.tolocationNo).filter(item => item
+						.partBatchNo == sanCode)
+					if (initList.length > 0) {
+						uni.showToast({
+							title: "搴撲綅鍙�:" + that.tolocationNo + ",SN:" + sanCode + ",宸茬粡鎵繃鐮�",
+							icon: "none"
+						});
+						return
+					}
+
+					// 鏌ヨ绉诲簱淇℃伅
+					that.$u.api.pigxWareHouse.list(data).then(res => {
+						let reList = []
+						reList = res.data
+
+						if (reList.length == 0) {
+							uni.showToast({
+								title: "搴撲綅鍙�:" + that.tolocationNo + ",SN:" + sanCode + ",鏈壂鍒扮Щ搴撲俊鎭�",
+								icon: "none"
+							});
+						} else {
+							for (let i = 0; i < reList.length; i++) {
+								if (reList[i].locationNo !== that.tolocationNo) {
+									let item = {
+										id: reList[i].id,
+										partNo: reList[i].partNo,
+										partName: reList[i].partName,
+										partBatchNo: reList[i].partBatchNo,
+										ifsBatchNo: reList[i].ifsBatchNo,
+										unit: reList[i].unit,
+										locationNo: reList[i].locationNo,
+										availableStockQuantity: reList[i].availableStockQuantity,
+										arriveLocationNo: that.tolocationNo,
+										moveQty: 0
+									}
+									that.list.push(item)
+								}
+							}
+						}
+
+						uni.hideLoading();
+					})
+				}
+			},
+			//鑷冲簱浣嶅彿璁剧疆
+			setNo(no) {
+				this.tolocationNo = no
+			},
+			deleteHandle(obj) {
+				let that = this
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '姝ゆ搷浣滃皢鍒犻櫎璇ョЩ搴撲俊鎭�, 鏄惁缁х画?',
+					success: function(res) {
+						if (res.confirm) {
+							that.list.map((item, index) => {
+								if (obj.id == item.id) {
+									that.list.splice(index, 1)
+								}
+							});
+						}
+					}
+				});
+			},
+			submit() {
+				let that = this
+
+				that.list.map((item) => {
+
+
+					if (item.moveQty <= 0) {
+						uni.showToast({
+							title: '璇风Щ搴撴暟閲忓繀椤诲ぇ浜�0',
+							icon: "none"
+						});
+						return
+					}
+
+					if (item.moveQty > item.availableStockQuantity) {
+						uni.showToast({
+							title: '绉诲簱鏁伴噺涓嶈兘澶т簬鍙敤搴撳瓨鏁伴噺',
+							icon: "none"
+						});
+						return
+					}
+				});
+
+
+				let subList = []
+				that.list.map((item) => {
+
+					let sub = {
+						stockId: item.id,
+						arriveLocationNo: item.arriveLocationNo,
+						moveQty: item.moveQty
+					}
+
+					subList.push(sub)
+
+				});
+
+				that.$u.api.pigxWareHouse.addList(subList).then(res => {
+
+					if (res.code == 0) {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦鎴愬姛',
+							showCancel: false,
+							success: function() {
+								that.list = []
+								that.tolocationNo = ""
+							}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦澶辫触',
+							showCancel: false,
+							success: function() {
+
+							}
+						})
+					}
+
+				})
+
+
+			},
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.movewarehouse-index-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/moveWareHouse/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	.movewarehouse-index-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.movewarehouse-index-search-view{
+		height: 66rpx;
+		border: 1px solid #ADC8E4;
+		border-radius: 8rpx;
+		background: rgba(250,252,255,0.36);
+		line-height: 66rpx;
+		padding-left:33rpx;
+		padding-right:10rpx;
+		display:flex;
+		justify-content: space-between;
+		.movewarehouse-index-search-view-item{
+			.item-one{
+				font-size: 30rpx;
+				color: #283E65;
+			}
+			.item-one-content{
+				margin-left: 10rpx;
+				color: #909399;
+				font-size: 26rpx;
+			}
+			.item-two{
+				font-size: 30rpx;
+				color: #A6B4CC;
+			}
+		}
+	}
+	.wrap .movewarehouse-index-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 378rpx);
+	    width:100%;
+	}
+	.movewarehouse-index-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 432rpx;
+			padding: 10rpx 20rpx;
+			box-shadow:0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position:relative;
+			.content-header{
+				.header-item{
+					height: 50rpx;
+					display: flex;
+					align-items:center;
+					.content-header-icon-one{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-icon-two{
+						background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+			    }
+				.header-item-toolbar{
+					position: absolute;
+					background-image: url('~@/static/custom/moveWareHouse/del-icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:60rpx;
+					width:140rpx;
+					right:0;
+					top:0;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+					.header-item-toolbar-del-icon{
+						background-image: url('~@/static/custom/moveWareHouse/icon_dele.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:25rpx;
+						width:22rpx;
+						margin-top: 5rpx;
+					}
+					.header-item-toolbar-del-text{
+						margin-left:7rpx;
+						height: 23rpx;
+						font-size: 24rpx;
+						color: #FFFFFF;
+					}
+				}
+			}
+			
+			.content-body{
+				height:300rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 25rpx 23rpx;
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size:26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+				
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+					._content-text{
+						color:#214ded;
+					}
+				}
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+					.edit_icon{
+						background-image: url('~@/static/custom/finishProductIn/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					::v-deep .uni-input-input{
+						color:#D35651;
+					}
+				}
+			}
+		}
+	}
+
+    .new-form-footer{
+		display: flex;
+		margin-top: 10rpx;
+		margin-bottom: 10rpx;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		padding-bottom: 14rpx;
+		.btn {
+		  flex: 1;
+		  margin: 10rpx;
+		  background: #214DED;
+		  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		  font-weight: bold;
+		  color: #FEFEFE;
+		  font-family: PingFang SC;
+		}
+	}
+</style>
diff --git a/pages/wareHouse/moveWareHouse/locNoList.vue b/pages/wareHouse/moveWareHouse/locNoList.vue
new file mode 100644
index 0000000..9e69d86
--- /dev/null
+++ b/pages/wareHouse/moveWareHouse/locNoList.vue
@@ -0,0 +1,263 @@
+<template>
+	<view class="page">
+		<view class="movewarehouse-locno-bg"/>
+		<u-navbar title="搴撲綅" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="movewarehouse-locno-search">
+			<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ュ簱浣嶅彿" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+	<view class="wrap">
+		<scroll-view class="movewarehouse-locno-scroll-list" scroll-y="true">
+			<u-cell-group class="movewarehouse-locno-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.locNo" :index="index"
+					@click="selectNo(item.locNo)">
+					<view class="content-header">
+						<view class="content-header-icon"></view>
+						<view class="content-header-title">{{ item.locName }}</view>
+					</view>
+					<view class="content-body">
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-1">
+								</view>
+								<view class="_label-name">搴撲綅缂栧彿锛�</view>	
+							</view>
+							<view class="_content">
+								{{ item.locNo }}
+							</view>
+						</view>
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-2">
+								</view>
+								<view class="_label-name">搴撲綅绫诲瀷锛�</view>	
+							</view>
+							<view class="_content">
+								{{ item.locTypeName }}
+							</view>
+						</view>
+						<view class="row-list">
+							<view class="_label">
+								<view class="_label-icon-3">
+								</view>
+								<view class="_label-name">搴撲綅鐘舵�侊細</view>	
+							</view>
+							<view class="_content s1">
+								{{ item.locStatusName }}
+							</view>
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+	</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/moveWareHouse/locNoBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				list: [],
+				originList: [],
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			loadList() {
+
+				// uni.showLoading({
+				// 			title: '姝e湪璇锋眰...',
+				// 			mask: true
+				// 		});	
+
+				// 鏌ヨ搴撲綅鍒楄〃
+				this.$u.api.pigxWareHouse.fetchList().then(res => {
+
+					// uni.hideLoading();
+					this.originList = res.data
+					this.list = this.originList
+				})
+			},
+			optionsClick(rowIndex, btnIndex) {
+				if (btnIndex == 0) {
+					let self = this;
+					uni.showModal({
+						title: '鎻愮ず',
+						content: '纭瑕佸垹闄よ鏁版嵁鍚楋紵',
+						showCancel: true,
+						success: function(res2) {
+							if (res2.confirm) {
+								let row = self.list[rowIndex];
+								self.$u.api.pigxUser.delete({
+									id: row.userId
+								}).then(res => {
+									self.$u.toast('鍒犻櫎鎴愬姛');
+									self.query.current = 1
+									self.list = []
+									self.loadList()
+								});
+							}
+						}
+					});
+				}
+			},
+			search(value) {
+				let that = this
+				if (value) {
+					that.list = that.originList.filter(item => item.locNo.includes(value))
+				} else {
+					that.list = that.originList
+				}
+			},
+			selectNo(no) {
+				this.refreshLastPage(no)
+			},
+
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage(no) {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setNo(no)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.movewarehouse-locno-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/moveWareHouse/locNoBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	.movewarehouse-locno-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	.wrap .movewarehouse-locno-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 242rpx);
        width:100%;
+	}
+	.movewarehouse-locno-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 16rpx;
+			height: 298rpx;
+			padding: 10rpx 20rpx;
+			box-shadow: none;
+			.content-header{
+				height: 90rpx;
+				display: flex;
+				align-items:center;
+				.content-header-icon{
+					background-image: url('~@/static/custom/moveWareHouse/header_icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:28rpx;
+				}
+				.content-header-title{
+					margin-left: 11rpx;
+					font-size: 26rpx;
+					font-weight: bold;
+					color: #333333;
+				}
+			}
+			.content-body{
+				height:184rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 0rpx 23rpx;
+				.row-list {
+					height: 60rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+				}
+				.row-list ._label {
+					display: flex;
+					flex: 0.8;
+					color: #909399;
+					align-items: center;
+					._label-icon-1{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-2{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-icon-3{
+						background-image: url('~@/static/custom/moveWareHouse/label-icon-3.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					._label-name{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: 500;
+						color: #666666;
+					}
+				}
+				
+				.row-list ._content {
+					flex: 1.5;
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+				}
+				.row-list .s1 {
+					color:#D35651;
+				}
+			}
+		}
+	}	
+</style>
diff --git a/pages/wareHouse/outsource/check.vue b/pages/wareHouse/outsource/check.vue
new file mode 100644
index 0000000..514bcf1
--- /dev/null
+++ b/pages/wareHouse/outsource/check.vue
@@ -0,0 +1,209 @@
+<template>
+	<layout title="妫�娴�" @scanHandle="addScanCode">
+		<view style="padding-top: 100rpx;" v-if="list.length == 0">
+			<u-empty text="璇锋壂鐮�" mode="list" icon-color="black" color="black"></u-empty>
+		</view>
+		<view class="formWrap">
+			<view class="formBox" v-for="(item, index) in list" :key="item.certificateNumber" :index="index">
+				<u-form class="form" :model="item" :rules="rules" :ref="item.certificateNumber" label-position="left">
+					<u-form-item label="鎶ユ娴佹按鍙�" prop="inspectionSerialNo" label-width="180" >
+						<text>{{item.inspectionSerialNo}}</text>
+					</u-form-item>
+					<u-form-item label="鍚堟牸璇佸彿" prop="certificateNumber" label-width="180" >
+						<text>{{item.certificateNumber}}</text>
+					</u-form-item>
+					<u-form-item label="闀垮害(km)" prop="inspectionQuantity" label-width="180" >
+						<text>{{item.inspectionQuantity}}</text>
+					</u-form-item>
+					<u-form-item label="鎶ユ鐘舵��" prop="samplingState" label-width="180" >
+						<text>{{defaultState}}</text>
+					</u-form-item>
+					<u-form-item label="妫�娴嬬粨鏋�" prop="result" label-width="180" >
+						<view @click="showSelect(item, index)">{{formatResult(item.inspState) || '璇烽�夋嫨'}}<u-icon name="arrow-down-fill"></u-icon></view>
+						<u-select v-model="item.selectShow" :list="results" @confirm="selectResult"></u-select>
+					</u-form-item>
+					<u-form-item label="妫�娴嬫椂闂�" prop="createTime" label-width="180" >
+						<text>{{nowTime}}</text>
+					</u-form-item>
+					
+				</u-form>
+				<view class="delBtnWrap">
+					<u-button class="delBtn" type="primary" size="mini"  @click="deleteItem(item)">
+						<u-icon size="30" name="trash" class="icon"/>鍒犻櫎
+					</u-button>
+				</view>	
+			</view>
+			
+		</view>
+		<view class="form-footer" v-if="list.length > 0">
+			<u-button class="btn" type="primary" @click="submit">妫�娴�</u-button>
+		</view>
+		<scan></scan>
+	</layout>
+</template>
+
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import util from "@/util/ble/util.js";
+	import layout from "./layout";
+	export default {
+		components: {
+			scan,layout
+		},
+		data() {
+			return {
+				defaultState:'宸叉姤妫�',
+				type: 'declaration',//inspDeclaration锛氭姤妫�  sampling锛氭娊妫�  declaration锛氭娴�  packaging锛氬寘瑁�  stock锛氬叆搴�
+				list: [
+					// {
+					// id: 0,
+					// no: 'BJ00001',
+					// certificateNo:'00001',
+					// len:0.2,
+					// state:defaultState,
+					// result:'r0',
+					// selectShow:false,
+					// createTime:util.formatTime(new Date())
+					// },
+				],
+				selectIndex:0,
+				results:[{
+					value: 'inspPass',
+					label: '鍚堟牸'
+				},
+				{
+					value: 'insp_release',
+					label: '璁╂鏀捐'
+				},{
+					value: 'insp_reverse',
+					label: '閫�鍥�'
+				}],
+				rules: {
+					// len: [{
+					// 	required: true,
+					// 	message: '闀垮害涓嶈兘涓虹┖',
+					// 	trigger: 'blur'
+					// }],
+				},
+				nowTime:util.formatTime(new Date())
+			}
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.addScanCode(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						// uni.showToast({
+						// 	title:res.result
+						// })
+						// const result = JSON.parse(res.result)
+						// console.log('鎵爜缁撴灉锛�', result);
+						this.addScanCode(res.result)
+					} catch (e) {}
+				}
+			});
+		},
+		onLoad(){
+			// this.addScanCode('00004')
+			// this.addScanCode('00001')
+		},
+		methods: {
+			showSelect(item, index) {
+				this.$set(item, 'selectShow', true)
+				this.selectIndex = index
+			},
+			selectResult(e){
+				console.log(e);
+				this.list[this.selectIndex].inspState = e[0].value
+			},
+			formatResult(value){
+				let res = ''
+				for (var i = 0; i < this.results.length; i++) {
+					if(this.results[i].value == value) {
+						res = this.results[i].label
+						break
+					}
+				}
+				return res
+			},
+			//鑾峰彇鎵竴鎵暟鎹�
+			addScanCode(code){
+				//妫�娴嬫槸鍚﹀凡鎵繃
+				let result = this.list.find(item => item.certificateNumber==code)
+				if (result) {
+					this.$u.toast('宸插瓨鍦ㄥ垪琛ㄤ腑')
+				} else {
+					//娣诲姞涓�鏉℃暟鎹�
+					let param = {
+						current: 1,
+						size: 100,
+						certificateNumber:code
+					}
+					this.$u.api.outsource.queryData(param).then(res => {
+						if (res.code === 0) {
+							let data = res.data.records
+							console.log(data);
+							let exist = false
+							if (data.length > 0) {
+								for (var i = 0; i < data.length; i++) {
+									if (data[i].state == 'unInsp') {
+										//鍙栧凡鎶芥銆佸緟妫�娴嬬殑,妫�娴嬬粨鏋滈粯璁ゅ悎鏍�
+										data[i].inspState = 'inspPass'
+										this.list.push(data[i])
+										exist = true
+									}
+								}
+							} 
+							if (!exist){
+								this.$u.toast('娌℃湁鍙娴嬬殑鏁版嵁')
+							}
+							
+						}
+						
+					});
+				}
+				
+			},
+			//鎻愪氦
+			submit(){
+				this.$u.api.outsource.submitReport(this.list, this.type).then(res => {
+					if (res.code == 0) { 
+						this.$u.toast('鎻愪氦鎴愬姛')
+						this.list = []
+					} else {
+						this.$u.toast('鎻愪氦澶辫触')
+					}
+				});
+			},
+			deleteItem(model) {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭畾鍒犻櫎?',
+					success: res => {
+						if (res.confirm) {
+							this.list = this.list.filter(item => item.certificateNo!=model.certificateNo)
+						}
+					}
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>
diff --git a/pages/wareHouse/outsource/index.vue b/pages/wareHouse/outsource/index.vue
new file mode 100644
index 0000000..5a46c86
--- /dev/null
+++ b/pages/wareHouse/outsource/index.vue
@@ -0,0 +1,162 @@
+<template>
+	<view class="page">
+		<view class="bigbg"/>
+		<u-navbar title="" :background="background" :border-bottom="false"/>
+		<view class="title">鎴愬搧澶栧崗</view>
+		<view class="wrap">
+			<u-row justify="space-between" gutter="30">
+				<u-col span="6">
+					<view class="box box1" @click="navTo('/pages/wareHouse/outsource/report')">
+						<view class="row1">鎶ユ鎴愬搧</view>
+						<view class="row2">鎵弿</view>
+						<view class="row3">鍚堟牸璇佸彿</view>
+					</view>
+				</u-col>
+				<u-col span="6">
+					<view class="box box2" @click="navTo('/pages/wareHouse/outsource/check')">
+						<view class="row1">妫�娴�</view>
+						<view class="row2"><text class="text">{{unInspNum}}</text>涓緟妫�娴�</view>
+						<view class="row3">璇疯繘鍏�</view>
+					</view>
+				</u-col>
+			</u-row>
+			<u-row justify="space-between" gutter="30">
+				<u-col span="6">
+					<view class="box box3" @click="navTo('/pages/wareHouse/outsource/packing')">
+						<view class="row1">鍖呰</view>
+						<view class="row2"><text class="text">{{inspedNum}}</text>涓緟楠岃瘉</view>
+						<view class="row3">璇疯繘鍏�</view>
+					</view>
+				</u-col>
+				<u-col span="6">
+					<view class="box box4" @click="navTo('/pages/wareHouse/outsource/instock')">
+						<view class="row1">鍏ュ簱</view>
+						<view class="row2"><text class="text">{{packagingNum}}</text>涓緟楠岃瘉</view>
+						<view class="row3">璇疯繘鍏�</view>
+					</view>
+				</u-col>
+			</u-row>
+		</view>
+	</view>
+</template>
+
+<script>
+	import content_bg from '@/static/custom/outsource/index_bg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				unInspNum:0,//寰呮娴嬫暟閲�
+				inspedNum:0,//宸叉娴嬶紙寰呭寘瑁咃級鏁伴噺
+				packagingNum:0 //宸插寘瑁咃紙寰呭叆搴擄級鏁伴噺
+			}
+		},
+		onShow() {
+			this.queryData('unInsp')
+			this.queryData('insped')
+			this.queryData('packaging')
+		},
+		methods: {
+			//鏌ヨ鏁伴噺
+			queryData(state){
+				let param = {
+					current: 1,
+					size: 100,
+					state: state
+				}
+				this.$u.api.outsource.queryData(param).then(res => {
+					console.log(res);
+					if (res.code === 0) {
+						this[state+'Num'] = res.data.total
+					}
+				});
+			},
+			navTo(url) {
+				uni.navigateTo({
+					url: url
+				});
+			},
+			goBack(){
+				uni.navigateBack({
+					
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+.bigbg{
+	background-color: #F6F9FF;
+	background-image: url('~@/static/custom/outsource/index_bg.png');
+	// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+	padding: 0 20rpx;
+	background-attachment: fixed;
+	background-size: 100% auto;
+	background-repeat: no-repeat;
+	position: fixed;
+	top: 0;
+	bottom: 0;
+	width: 100%;
+	z-index: -1;
+}
+.page{
+	
+}
+.title{
+	font-weight: bold;
+	font-size: 50rpx;
+	padding: 60rpx 0 130rpx 20rpx;
+}
+.box {
+	background-color: rgba(255,255,255,0.7);
+	border-radius: 20rpx;
+	margin-bottom: 30rpx;
+	padding: 30rpx;
+	font-size: 32rpx;
+	color: #666666;
+	box-shadow: 0 0 6rpx 2rpx #f0f0f0;
+	background-repeat: no-repeat;
+	background-position: right 10rpx top 10rpx;
+	background-size: 40% auto;
+	.row1{
+		padding-bottom: 40rpx;
+	}
+	.row2{
+		color: #666666;
+		padding: 10rpx 0;
+		.text{
+			color: black;
+			font-weight: bold;
+			font-size: 38rpx;
+			padding-right: 10rpx;
+		}
+	}
+	.row3{
+		color: #B4B4B6;
+	}
+}
+.box1{
+	.row2{
+		color: black;
+		font-weight: bold;
+		font-size: 38rpx;
+	}
+	background-image: url('~@/static/custom/outsource/bg1.png');
+}
+.box2{
+	background-image: url('~@/static/custom/outsource/bg2.png');
+	background-size: 35% auto;
+}
+.box3{
+	background-image: url('~@/static/custom/outsource/bg3.png');
+}
+.box4{
+	background-image: url('~@/static/custom/outsource/bg4.png');
+}
+</style>
diff --git a/pages/wareHouse/outsource/instock.vue b/pages/wareHouse/outsource/instock.vue
new file mode 100644
index 0000000..5abc20a
--- /dev/null
+++ b/pages/wareHouse/outsource/instock.vue
@@ -0,0 +1,206 @@
+<template>
+	<layout title="鍏ュ簱" @scanHandle="addScanCode">
+		<view style="padding-top: 100rpx;" v-if="list.length == 0">
+			<u-empty text="璇锋壂鐮�" mode="list" icon-color="black" color="black"></u-empty>
+		</view>
+		<view class="formWrap">
+			<view class="formBox" v-for="(item, index) in list" :key="item.certificateNumber" :index="index">
+				<u-form class="form" :model="item" :rules="rules" :ref="item.certificateNumber" label-position="left">
+					<u-form-item label="鎶ユ娴佹按鍙�" prop="inspectionSerialNo" label-width="180" >
+						<text>{{item.inspectionSerialNo}}</text>
+					</u-form-item>
+					<u-form-item label="鍚堟牸璇佸彿" prop="certificateNumber" label-width="180" >
+						<text>{{item.certificateNumber}}</text>
+					</u-form-item>
+					<u-form-item label="闀垮害(km)" prop="inspectionQuantity" label-width="180" >
+						<text>{{item.inspectionQuantity}}</text>
+					</u-form-item>
+					<!-- <u-form-item label="鎶芥鐘舵��" prop="samplingState" label-width="180" >
+						<text>{{item.samplingState=='1'?'宸叉娊妫�':'鏈娊妫�'}}</text>
+					</u-form-item> -->
+					<u-form-item label="妫�娴嬬粨鏋�" prop="result" label-width="180" >
+						<view>{{formatResult(item.inspState) || ''}}</view>
+					</u-form-item>
+					<u-form-item label="鏄惁鍖呰" prop="packing" label-width="180" >
+						<text>{{item.packagingState=='1'?'鏄�':'鍚�'}}</text>
+					</u-form-item>
+					<u-form-item label="鏄惁鍏ュ簱" prop="packing" label-width="180" >
+						<text>{{item.stockState=='1'?'鏄�':'鍚�'}}</text>
+					</u-form-item>
+					<u-form-item label="鍏ュ簱鏃堕棿" prop="createTime" label-width="180" >
+						<text>{{nowTime}}</text>
+					</u-form-item>
+					
+				</u-form>
+				<view class="form-footer" v-if="list.length > 0">
+					<u-button class="btn" type="primary" @click="submit">鍏ュ簱</u-button>
+				</view>
+			</view>
+			
+		</view>
+		<scan></scan>
+	</layout>
+</template>
+
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import util from "@/util/ble/util.js";
+	import layout from "./layout";
+	let defaultState = '宸叉娊妫�'
+	let defaultPacking = '鏄�'
+	export default {
+		components: {
+			scan,layout
+		},
+		data() {
+			return {
+				type: 'stock',//inspDeclaration锛氭姤妫�  sampling锛氭娊妫�  declaration锛氭娴�  packaging锛氬寘瑁�  stock锛氬叆搴�
+				list: [
+					// {
+					// id: 0,
+					// no: 'BJ00001',
+					// certificateNo:'00001',
+					// len:0.2,
+					// state:defaultState,
+					// result:'r0',
+					// packing:defaultPacking,
+					// instock:'鏄�',
+					// createTime:util.formatTime(new Date())
+					// },
+				],
+				selectIndex:0,
+				results:[{
+					value: 'inspPass',
+					label: '鍚堟牸'
+				},
+				{
+					value: 'insp_release',
+					label: '璁╂鏀捐'
+				},{
+					value: 'insp_reverse',
+					label: '閫�鍥�'
+				}],
+				rules: {
+					// len: [{
+					// 	required: true,
+					// 	message: '闀垮害涓嶈兘涓虹┖',
+					// 	trigger: 'blur'
+					// }],
+				},
+				nowTime:util.formatTime(new Date())
+			}
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.addScanCode(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						// uni.showToast({
+						// 	title:res.result
+						// })
+						// const result = JSON.parse(res.result)
+						// console.log('鎵爜缁撴灉锛�', result);
+						this.addScanCode(res.result)
+					} catch (e) {}
+				}
+			});
+		},
+		onLoad(){
+			// this.addScanCode('00004')
+			// this.addScanCode('00001')
+		},
+		methods: {
+			selectResult(e){
+				console.log(e);
+				this.list[this.selectIndex].result = e[0].value
+			},
+			formatResult(value){
+				let res = ''
+				for (var i = 0; i < this.results.length; i++) {
+					if(this.results[i].value == value) {
+						res = this.results[i].label
+						break
+					}
+				}
+				return res
+			},
+			//鑾峰彇鎵竴鎵暟鎹�
+			addScanCode(code){
+				//妫�娴嬫槸鍚﹀凡鎵繃
+				let result = this.list.find(item => item.certificateNumber==code)
+				if (result) {
+					this.$u.toast('宸插瓨鍦ㄥ垪琛ㄤ腑')
+				} else {
+					//娣诲姞涓�鏉℃暟鎹�
+					let param = {
+						current: 1,
+						size: 100,
+						certificateNumber:code
+					}
+					this.$u.api.outsource.queryData(param).then(res => {
+						if (res.code === 0) {
+							let data = res.data.records
+							console.log(data);
+							let exist = false
+							if (data.length > 0) {
+								for (var i = 0; i < data.length; i++) {
+									if (data[i].state == 'packaging') {
+										//鍙栧凡鍖呰鐨�
+										this.list.push(data[i])
+										exist = true
+									}
+								}
+							} 
+							if (!exist){
+								this.$u.toast('娌℃湁鍙叆搴撶殑鏁版嵁')
+							}
+							
+						}
+						
+					});
+				}
+				
+			},
+			//鎻愪氦
+			submit(){
+				this.$u.api.outsource.submitReport(this.list, this.type).then(res => {
+					if (res.code == 0) { 
+						this.$u.toast('鎻愪氦鎴愬姛')
+						this.list = []
+					} else {
+						this.$u.toast('鎻愪氦澶辫触')
+					}
+				});
+			},
+			deleteItem(model) {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭畾鍒犻櫎?',
+					success: res => {
+						if (res.confirm) {
+							this.list = this.list.filter(item => item.certificateNo!=model.certificateNo)
+						}
+					}
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>
diff --git a/pages/wareHouse/outsource/layout.vue b/pages/wareHouse/outsource/layout.vue
new file mode 100644
index 0000000..8d30da6
--- /dev/null
+++ b/pages/wareHouse/outsource/layout.vue
@@ -0,0 +1,111 @@
+<template>
+	<view class="page">
+		<u-navbar :title="title" :background="background" :border-bottom="false">
+			<view @click="scanClick" class="rightScan" slot="right">
+				<image class="i" src="@/static/custom/outsource/scan.png" mode="widthFix"/>
+			</view>
+		</u-navbar>
+		<view class="bigbg"/>
+		<view class="content">
+			<slot />
+		</view>	
+	</view>
+</template>
+
+<script>
+	import content_bg from '@/static/custom/outsource/content_bg.png'
+	export default {
+		props:{
+			title:{
+				default: () => {
+					return ''
+				}
+			}
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				}
+			}
+		},
+		methods: {
+			scanClick(){
+				uni.scanCode({
+					success: res => {
+						try {
+							this.$emit('scanHandle',res.result)
+						} catch (e) {}
+					}
+				});
+			}
+		}
+	}
+</script>
+<style scoped lang="scss">
+.bigbg{
+	background-color: #F6F9FF;
+	background-image: url('~@/static/custom/outsource/content_bg.png');
+	// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+	padding: 0 20rpx 40rpx;
+	background-attachment: fixed;
+	background-size: 100% auto;
+	background-repeat: no-repeat;
+	position: fixed;
+	top: 0;
+	bottom: 0;
+	width: 100%;
+	z-index: -1;
+}
+.rightScan{
+	padding-top: 10px;
+	padding-right: 5px;
+	.i{
+		width: 45px;
+	}
+}
+.content{
+	padding: 0 20rpx;
+}
+::v-deep .formWrap{
+	padding-top: 120rpx;
+	.formBox{
+		border-radius: 20rpx;
+		background-color: #fff;
+		margin-bottom: 30rpx;
+		padding: 10rpx 40rpx;
+		&:first-child{
+			background: linear-gradient(180deg,rgba(255,255,255,0.1),rgba(255,255,255,0.8) 15%,rgba(255,255,255,0.9) 30%,rgba(255,255,255,1));
+		}
+		input{
+			text-align: right;
+			width: 100%;
+		}
+		.delBtnWrap{
+			text-align:right;
+			padding: 20rpx 0 10rpx 0;
+			.delBtn{
+				background-color: #E4EBF5;
+				color: black;
+				display: inline-block;
+				width: 65px;
+				height: 30px;
+				line-height: 30px;
+				.icon{
+					padding-right: 3px;
+				}
+			}
+		}
+	}
+	.form-footer{
+		padding: 10px 0;
+		.btn{
+			background-color: #214DED;
+			box-shadow: 1px 3px 4px rgba(33, 77, 237, 0.5);
+		}
+	}
+}
+</style>
\ No newline at end of file
diff --git a/pages/wareHouse/outsource/packing.vue b/pages/wareHouse/outsource/packing.vue
new file mode 100644
index 0000000..699277a
--- /dev/null
+++ b/pages/wareHouse/outsource/packing.vue
@@ -0,0 +1,207 @@
+<template>
+	<layout title="鍖呰" @scanHandle="addScanCode">
+		<view style="padding-top: 100rpx;" v-if="list.length == 0">
+			<u-empty text="璇锋壂鐮�" mode="list" icon-color="black" color="black"></u-empty>
+		</view>
+		<view class="formWrap">
+			<view class="formBox" v-for="(item, index) in list" :key="item.certificateNumber" :index="index">
+				<u-form class="form" :model="item" :rules="rules" :ref="item.certificateNumber" label-position="left">
+					<u-form-item label="鎶ユ娴佹按鍙�" prop="inspectionSerialNo" label-width="180" >
+						<text>{{item.inspectionSerialNo}}</text>
+					</u-form-item>
+					<u-form-item label="鍚堟牸璇佸彿" prop="certificateNumber" label-width="180" >
+						<text>{{item.certificateNumber}}</text>
+					</u-form-item>
+					<u-form-item label="闀垮害(km)" prop="inspectionQuantity" label-width="180" >
+						<text>{{item.inspectionQuantity}}</text>
+					</u-form-item>
+					<!-- <u-form-item label="鎶芥鐘舵��" prop="samplingState" label-width="180" >
+						<text>{{item.samplingState=='1'?'宸叉娊妫�':'鏈娊妫�'}}</text>
+					</u-form-item> -->
+					<u-form-item label="妫�娴嬬粨鏋�" prop="result" label-width="180" >
+						<view>{{formatResult(item.inspState) || ''}}</view>
+					</u-form-item>
+					<u-form-item label="鏄惁鍖呰" prop="packing" label-width="180" >
+						<text>{{item.packagingState=='1'?'鏄�':'鍚�'}}</text>
+					</u-form-item>
+					<u-form-item label="鍖呰鏃堕棿" prop="createTime" label-width="180" >
+						<text>{{nowTime}}</text>
+					</u-form-item>
+					
+				</u-form>
+				<view class="delBtnWrap">
+					<u-button class="delBtn" type="primary" size="mini"  @click="deleteItem(item)">
+						<u-icon size="30" name="trash" class="icon"/>鍒犻櫎
+					</u-button>
+				</view>	
+			</view>
+			
+		</view>
+		<view class="form-footer" v-if="list.length > 0">
+			<u-button class="btn" type="primary" @click="submit">鍖呰</u-button>
+		</view>
+		<scan></scan>
+	</layout>
+</template>
+
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import util from "@/util/ble/util.js";
+	import layout from "./layout";
+	let defaultState = '宸叉娊妫�'
+	let defaultPacking = '鏄�'
+	export default {
+		components: {
+			scan,layout
+		},
+		data() {
+			return {
+				type: 'packaging',//inspDeclaration锛氭姤妫�  sampling锛氭娊妫�  declaration锛氭娴�  packaging锛氬寘瑁�  stock锛氬叆搴�
+				list: [
+					// {
+					// id: 0,
+					// no: 'BJ00001',
+					// certificateNo:'00001',
+					// len:0.2,
+					// state:defaultState,
+					// result:'r0',
+					// packing:defaultPacking,
+					// createTime:util.formatTime(new Date())
+					// },
+				],
+				selectIndex:0,
+				results:[{
+					value: 'inspPass',
+					label: '鍚堟牸'
+				},
+				{
+					value: 'insp_release',
+					label: '璁╂鏀捐'
+				},{
+					value: 'insp_reverse',
+					label: '閫�鍥�'
+				}],
+				rules: {
+					// len: [{
+					// 	required: true,
+					// 	message: '闀垮害涓嶈兘涓虹┖',
+					// 	trigger: 'blur'
+					// }],
+				},
+				nowTime:util.formatTime(new Date())
+			}
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.addScanCode(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						// uni.showToast({
+						// 	title:res.result
+						// })
+						// const result = JSON.parse(res.result)
+						// console.log('鎵爜缁撴灉锛�', result);
+						this.addScanCode(res.result)
+					} catch (e) {}
+				}
+			});
+		},
+		onLoad(){
+			// this.addScanCode('00004')
+			// this.addScanCode('00001')
+		},
+		methods: {
+			selectResult(e){
+				console.log(e);
+				this.list[this.selectIndex].result = e[0].value
+			},
+			formatResult(value){
+				let res = ''
+				for (var i = 0; i < this.results.length; i++) {
+					if(this.results[i].value == value) {
+						res = this.results[i].label
+						break
+					}
+				}
+				return res
+			},
+			//鑾峰彇鎵竴鎵暟鎹�
+			addScanCode(code){
+				//妫�娴嬫槸鍚﹀凡鎵繃
+				let result = this.list.find(item => item.certificateNumber==code)
+				if (result) {
+					this.$u.toast('宸插瓨鍦ㄥ垪琛ㄤ腑')
+				} else {
+					//娣诲姞涓�鏉℃暟鎹�
+					let param = {
+						current: 1,
+						size: 100,
+						certificateNumber:code
+					}
+					this.$u.api.outsource.queryData(param).then(res => {
+						if (res.code === 0) {
+							let data = res.data.records
+							console.log(data);
+							let exist = false
+							if (data.length > 0) {
+								for (var i = 0; i < data.length; i++) {
+									if (data[i].state == 'insped') {
+										//鍙栧凡妫�娴嬬殑
+										this.list.push(data[i])
+										exist = true
+									}
+								}
+							} 
+							if (!exist){
+								this.$u.toast('娌℃湁鍙寘瑁呯殑鏁版嵁')
+							}
+							
+						}
+						
+					});
+				}
+				
+			},
+			//鎻愪氦
+			submit(){
+				this.$u.api.outsource.submitReport(this.list, this.type).then(res => {
+					if (res.code == 0) { 
+						this.$u.toast('鎻愪氦鎴愬姛')
+						this.list = []
+					} else {
+						this.$u.toast('鎻愪氦澶辫触')
+					}
+				});
+			},
+			deleteItem(model) {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭畾鍒犻櫎?',
+					success: res => {
+						if (res.confirm) {
+							this.list = this.list.filter(item => item.certificateNo!=model.certificateNo)
+						}
+					}
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>
diff --git a/pages/wareHouse/outsource/report.vue b/pages/wareHouse/outsource/report.vue
new file mode 100644
index 0000000..bd58f1b
--- /dev/null
+++ b/pages/wareHouse/outsource/report.vue
@@ -0,0 +1,160 @@
+<template>
+	<layout title="鎶ユ" @scanHandle="addScanCode">
+		<view style="padding-top: 100rpx;" v-if="list.length == 0">
+			<u-empty text="璇锋壂鐮�" mode="list" icon-color="black" color="black"></u-empty>
+		</view>
+		<view class="formWrap">
+			<view class="formBox" v-for="(item, index) in list" :key="item.certificateNo" :index="index">
+				<u-form class="form" :model="item" :rules="rules" :ref="item.certificateNo" label-position="left">
+					<u-form-item label="鎶ユ娴佹按鍙�" prop="no" label-width="180" >
+						<input v-model="item.no" placeholder="淇濆瓨鍚庤嚜鍔ㄧ敓鎴�" :disabled="true"></input>
+					</u-form-item>
+					<u-form-item label="鍚堟牸璇佸彿" prop="certificateNo" label-width="180" >
+						<input v-model="item.certificateNo" placeholder="" :disabled="true"></input>
+					</u-form-item>
+					<u-form-item label="闀垮害(km)" prop="len" label-width="180" >
+						<input v-model="item.len" placeholder="璇疯緭鍏ラ暱搴�" type="digit" ></input>
+					</u-form-item>
+					<u-form-item label="鍒涘缓鏃堕棿" prop="createTime" label-width="180" >
+						<input v-model="item.createTime" placeholder="" :disabled="true"></input>
+					</u-form-item>
+				</u-form>
+				<view class="delBtnWrap">
+					<u-button class="delBtn" type="primary" size="mini"  @click="deleteItem(item)">
+						<u-icon size="30" name="trash" class="icon"/>鍒犻櫎
+					</u-button>
+				</view>	
+			</view>
+			<view class="form-footer" v-if="list.length > 0">
+				<u-button class="btn" type="primary" @click="submit">鎶ユ</u-button>
+			</view>
+		</view>
+		<scan></scan>
+	</layout>
+</template>
+
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import util from "@/util/ble/util.js";
+	import layout from "./layout";
+	export default {
+		components: {
+			scan,layout
+		},
+		data() {
+			return {
+				type: 'inspDeclaration',//inspDeclaration锛氭姤妫�  sampling锛氭娊妫�  declaration锛氭娴�  packaging锛氬寘瑁�  stock锛氬叆搴�
+				list: [
+					// {
+					// id: 0,
+					// no: null,
+					// certificateNo:'00004',
+					// len:0.2,
+					// createTime:util.formatTime(new Date())
+					// },
+				],
+				rules: {
+					// len: [{
+					// 	required: true,
+					// 	message: '闀垮害涓嶈兘涓虹┖',
+					// 	trigger: 'blur'
+					// }],
+				},
+				nowTime:util.formatTime(new Date())
+			}
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.addScanCode(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		methods: {
+			//鑾峰彇鎵竴鎵暟鎹�
+			addScanCode(code){
+				//妫�娴嬫槸鍚﹀凡鎵繃
+				let that = this
+				// that.$u.api.outsource.queryReportExist().then(res => {
+				// 	let exist = false
+				// 	if (exist) {
+				// 		this.$u.toast('璇ュ悎鏍艰瘉鍙峰凡鎶ユ')
+				// 	} else {
+						//鏌ョ湅鍒楄〃涓瓨涓嶅瓨鍦�
+						let result = that.list.find(item => item.certificateNo==code)
+						if (result) {
+							this.$u.toast('宸插瓨鍦ㄥ垪琛ㄤ腑')
+						} else {
+							//娣诲姞涓�鏉℃姤妫�鏁版嵁
+							that.list.push({
+								id: 0,
+								no: null,
+								certificateNo:code,
+								len:0.2,
+								createTime:util.formatTime(new Date())
+								
+							})
+						}
+						
+				// 	}
+				// });
+				
+			},
+			//鎻愪氦
+			submit(){
+				for (var i = 0; i < this.list.length; i++) {
+					if (!this.list[i].len) {
+						this.$u.toast('璇峰~鍐欓暱搴�')
+						return
+					}
+				}
+				let param = []
+				for (var i = 0; i < this.list.length; i++) {
+					param.push({
+						// "id": null,
+						// "createTime": "",//鍒涘缓鏃堕棿
+						// "createUser": "",//鍒涘缓浜�
+						"certificateNumber": this.list[i].certificateNo,//鍚堟牸璇佸彿
+						// "inspState": null,// 妫�娴嬬姸鎬�   unInsp:寰呮娴� inspPass:妫�娴嬪悎鏍�  insp_un_pass:妫�娴嬩笉鍚堟牸  insp_reverse:妫�娴嬮��鍥�  insp_release:妫�娴嬫斁琛�
+						"inspectionQuantity": this.list[i].len,//鎶ユ闀垮害
+						// "inspectionSerialNo": null,//鎶ユ娴佹按鍙�
+						// "packagingOperator": null,//鍖呰浜哄憳
+						// "packagingState": null,//鏄惁鍖呰 0-鍚︼紝1-鏄�
+						// "samplingState": 1,//鏄惁鎶芥 0-鍚︼紝1-鏄�
+						// "state": '',//鐘舵��  unSampling锛氬緟鎶芥  unInsp锛氬緟妫�娴�  insped锛氬凡妫�娴�  packaging锛氬凡鍖呰  stock锛氬凡鍏ュ簱
+						// "stockOperator": '',//鍏ュ簱浜哄憳
+						// "stockState": '',//鏄惁鍏ュ簱 0-鍚︼紝1-鏄�
+						
+					}) 
+				}
+				this.$u.api.outsource.submitReport(param, this.type).then(res => {
+					if (res.code == 0) { 
+						this.$u.toast('鎻愪氦鎴愬姛')
+						this.list = []
+					} else {
+						this.$u.toast('鎻愪氦澶辫触')
+					}
+				});
+			},
+			deleteItem(model) {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭畾鍒犻櫎?',
+					success: res => {
+						if (res.confirm) {
+							this.list = this.list.filter(item => item.certificateNo!=model.certificateNo)
+						}
+					}
+				});
+				
+			}
+		}
+	}
+</script>
\ No newline at end of file
diff --git a/pages/wareHouse/outsource/sampling.vue b/pages/wareHouse/outsource/sampling.vue
new file mode 100644
index 0000000..804ff5f
--- /dev/null
+++ b/pages/wareHouse/outsource/sampling.vue
@@ -0,0 +1,173 @@
+<template>
+	<layout title="鎶芥" @scanHandle="addScanCode">
+		<view style="padding-top: 100rpx;" v-if="list.length == 0">
+			<u-empty text="璇锋壂鐮�" mode="list" icon-color="black" color="black"></u-empty>
+		</view>
+		<view class="formWrap">
+			<view class="formBox" v-for="(item, index) in list" :key="item.certificateNo" :index="index">
+				<u-form class="form" :model="item" :rules="rules" :ref="item.certificateNo" label-position="left">
+					<u-form-item label="鎶ユ娴佹按鍙�" prop="inspectionSerialNo" label-width="180" >
+						<text>{{item.inspectionSerialNo}}</text>
+					</u-form-item>
+					<u-form-item label="鍚堟牸璇佸彿" prop="certificateNumber" label-width="180" >
+						<text>{{item.certificateNumber}}</text>
+					</u-form-item>
+					<u-form-item label="闀垮害(km)" prop="inspectionQuantity" label-width="180" >
+						<text>{{item.inspectionQuantity}}</text>
+					</u-form-item>
+					<u-form-item label="鎶芥鐘舵��" prop="samplingState" label-width="180" >
+						<!-- <text>{{item.samplingState=='1'?'宸叉娊妫�':'鏈娊妫�'}}</text> -->
+						<text>寰呮娊妫�</text>
+					</u-form-item>
+					<u-form-item label="鎶芥鏃堕棿" prop="createTime" label-width="180" >
+						<text>{{nowTime}}</text>
+					</u-form-item>
+				</u-form>
+				<view class="delBtnWrap">
+					<u-button class="delBtn" type="primary" size="mini"  @click="deleteItem(item)">
+						<u-icon size="30" name="trash" class="icon"/>鍒犻櫎
+					</u-button>
+				</view>	
+			</view>
+			
+		</view>
+		<view class="form-footer" v-if="list.length > 0">
+			<u-button class="btn" type="primary" @click="submit">鎶芥</u-button>
+		</view>
+		<scan></scan>
+	</layout>
+</template>
+
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import util from "@/util/ble/util.js";
+	import layout from "./layout";
+	let defaultState = '寰呮娊妫�'
+	export default {
+		components: {
+			scan,layout
+		},
+		data() {
+			return {
+				type: 'sampling',//inspDeclaration锛氭姤妫�  sampling锛氭娊妫�  declaration锛氭娴�  packaging锛氬寘瑁�  stock锛氬叆搴�
+				list: [
+					// {
+					// id: 0,
+					// no: 'BJ00001',
+					// certificateNo:'00001',
+					// len:0.2,
+					// state:defaultState,
+					// createTime:util.formatTime(new Date())
+					// },
+				],
+				rules: {
+					// len: [{
+					// 	required: true,
+					// 	message: '闀垮害涓嶈兘涓虹┖',
+					// 	trigger: 'blur'
+					// }],
+				},
+				nowTime:util.formatTime(new Date())
+			}
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.addScanCode(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						// uni.showToast({
+						// 	title:res.result
+						// })
+						// const result = JSON.parse(res.result)
+						// console.log('鎵爜缁撴灉锛�', result);
+						this.addScanCode(res.result)
+					} catch (e) {}
+				}
+			});
+		},
+		onLoad(){
+			// this.addScanCode('00003')
+			// this.addScanCode('00001')
+		},
+		methods: {
+			//鑾峰彇鎵竴鎵暟鎹�
+			addScanCode(code){
+				//妫�娴嬫槸鍚﹀凡鎵繃
+				let result = this.list.find(item => item.certificateNumber==code)
+				if (result) {
+					this.$u.toast('宸插瓨鍦ㄥ垪琛ㄤ腑')
+				} else {
+					//娣诲姞涓�鏉℃暟鎹�
+					let param = {
+						current: 1,
+						size: 100,
+						certificateNumber:code
+					}
+					this.$u.api.outsource.queryData(param).then(res => {
+						console.log(res);
+						if (res.code === 0) {
+							let data = res.data.records
+							let exist = false
+							if (data.length > 0) {
+								for (var i = 0; i < data.length; i++) {
+									if (data[i].state == 'unSampling') {
+										//鍙栧緟鎶芥鐨�
+										this.list.push(data[i])
+										exist = true
+									}
+								}
+							} 
+							if (!exist){
+								this.$u.toast('娌℃湁鍙娊妫�鐨勬暟鎹�')
+							}
+							
+						}
+						
+					});
+				}
+				
+				
+			},
+			//鎻愪氦
+			submit(){
+				this.$u.api.outsource.submitReport(this.list, this.type).then(res => {
+					if (res.code == 0) { 
+						this.$u.toast('鎻愪氦鎴愬姛')
+						this.list = []
+					} else {
+						this.$u.toast('鎻愪氦澶辫触')
+					}
+				});
+			},
+			deleteItem(model) {
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '鏄惁纭畾鍒犻櫎?',
+					success: res => {
+						if (res.confirm) {
+							this.list = this.list.filter(item => item.certificateNo!=model.certificateNo)
+						}
+					}
+				});
+				
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>
diff --git a/pages/wareHouse/packing/detail.vue b/pages/wareHouse/packing/detail.vue
new file mode 100644
index 0000000..3c93dba
--- /dev/null
+++ b/pages/wareHouse/packing/detail.vue
@@ -0,0 +1,398 @@
+<template>
+	<view class="wrap">
+		<u-form class="form" label-position="left">
+			<u-form-item label="鑷冲簱浣嶅彿" label-width="180">
+				<picker @change="bindPackLocationChange($event,locationNo)" :value="locationIndex" :range="locationNo"
+					range-key="value">
+					<view>
+						<text>{{locationIndex==null ? "璇烽�夋嫨":locationNo[locationIndex].value}}</text>
+					</view>
+				</picker>
+			</u-form-item>
+		</u-form>
+		<scroll-view class="scroll-list" scroll-y="true">
+			<view class="list" :border="false" style="margin-top: 20rpx;">
+				<view class="title">
+					<view>
+						<u-icon class="grid-icon" name="column-line" :size="40" :style="{ color: '#0081ff' }"></u-icon>
+					</view>
+					<view class="text-black text-bold basis-xl">鍖呰淇℃伅</view>
+				</view>
+				<view class="content" style="background: #fff;">
+					<view class="row-list">
+						<view class="_label">
+							缂栧彿:
+						</view>
+						<view class="_content">
+							{{ packingInfo.no }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鐗╂枡缂栫爜:
+						</view>
+						<view class="_content">
+							{{ packingInfo.cusMaterialCode }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍖呰灏哄:
+						</view>
+						<view class="_content">
+							{{ packingInfo.packSize }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍖呰:
+						</view>
+						<view class="_content">
+							{{ packingInfo.packMaterial }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍖呰閲嶉噺:
+						</view>
+						<view class="_content">
+							{{ packingInfo.packWeight }}
+						</view>
+					</view>
+				</view>
+			</view>
+			<u-cell-group class="list" :border="false">
+				<view class="title">
+					<view>
+						<u-icon class="grid-icon" name="column-line" :size="40" :style="{ color: '#0081ff' }"></u-icon>
+					</view>
+					<view class="text-black text-bold basis-xl">鍖呰绉诲簱淇℃伅</view>
+				</view>
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+					<view class="row-img" @click="deleteHandle(item)">
+						<u-image width="18px" height="18px" src="@/static/custom/delete.png"></u-image>
+					</view>
+					<view class="row-list" style="padding-top: 8px;">
+						<view class="_label">
+							闆朵欢鍙�:
+						</view>
+						<view class="_content">
+							{{ item.partNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							闆朵欢鍚嶇О:
+						</view>
+						<view class="_content">
+							{{ item.partName }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							绯荤粺缂栧彿:
+						</view>
+						<view class="_content">
+							{{ item.systemNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							SN:
+						</view>
+						<view class="_content">
+							{{ item.partBatchNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							IFS鎵规鍙�:
+						</view>
+						<view class="_content">
+							{{ item.ifsBatchNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍗曚綅:
+						</view>
+						<view class="_content">
+							{{ item.unit }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							浠庡簱浣嶅彿:
+						</view>
+						<view class="_content">
+							{{ item.locationNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鑷冲簱浣嶅彿:
+						</view>
+						<view class="_content">
+							{{ item.inLocationNo }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍙敤搴撳瓨鏁伴噺:
+						</view>
+						<view class="_content">
+							{{ item.availableStockQuantity }}
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		<scan></scan>
+	</view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				list: [],
+				packingInfo: {},
+				locationNo: [],
+				tolocationNo: "", //鑷冲簱浣嶅彿
+				tolocationId: undefined, //鑷冲簱浣嶅彿id
+				locationIndex: null,
+			};
+		},
+		onReady() {
+			let that = this
+			//鑾峰彇鑷冲簱浣嶅彿
+			that.$u.api.pigxPacking.packHeadBasicInfoList().then(res => {
+				let locationNoList = res.data.locationNoList
+				locationNoList.map((item, index) => {
+
+					let location = {
+						lable: item,
+						value: item
+					}
+					that.locationNo.push(location)
+				});
+
+			});
+
+		},
+		onLoad(option) {
+			if (option.item) {
+				let obj = JSON.parse(decodeURIComponent(option.item));
+				this.packingInfo = obj
+			}
+			this.loadList()
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+
+				if (data.code != "" && (that.tolocationNo == "")) {
+					uni.showToast({
+						title: '璇烽�夋嫨鑷冲簱浣嶅彿',
+						icon: 'none'
+					})
+					return
+				}
+
+				that.scanHandler(data.code);
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			//鎵爜鎿嶄綔
+			scanHandler(scanCode) {
+				let that = this
+				let data = {
+					partBatchNo: scanCode
+				}
+				that.$u.api.pigxPacking.getStockInfoByBatchNo(data).then(res => {
+
+					let resList = []
+					resList = res.data.records
+
+					if (resList.length > 0) {
+						let paramObj = {
+							stockList: resList,
+							inLocationId: that.tolocationId, //鑷冲簱浣峣d
+							id: that.packingInfo.id
+						}
+
+						that.$u.api.pigxPacking.addPackagingItem(paramObj).then(res1 => {
+
+							setTimeout(() => {
+								uni.showModal({
+									title: '鎻愮ず',
+									content: '鍖呰绉诲簱鎴愬姛',
+									showCancel: false,
+									success: function() {
+										that.loadList();
+									}
+								})
+							}, 200)
+
+						})
+
+					}
+
+				});
+			},
+			async loadList() {
+
+				let that = this
+				that.list = []
+
+				let paramObj = {
+					packagingId: that.packingInfo.id
+				}
+
+				let res = await that.$u.api.pigxPacking.getPackagingItemList(paramObj);
+				let reList = res.data.records
+
+				for (let i = 0; i < reList.length; i++) {
+
+					//搴撳瓨淇℃伅
+					let data = {
+						systemNo: reList[i].systemNo
+					}
+					let resStock = await that.$u.api.pigxPacking.getStockInfo(data)
+					let stockList = resStock.data.records
+					//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦�
+					let stockInfoList = stockList.filter(item => item.id == reList[i].stockId)
+
+					//鍖呰淇℃伅	
+					let item = {
+						id: reList[i].id,
+						partNo: reList[i].partNo,
+						partName: reList[i].partName,
+						partBatchNo: "",
+						ifsBatchNo: "",
+						unit: "",
+						locationNo: "",
+						availableStockQuantity: "",
+						inLocationNo: reList[i].inLocationNo,
+						systemNo: reList[i].systemNo
+					}
+
+					//搴撳瓨淇℃伅	
+					if (stockInfoList.length > 0) {
+						item.partBatchNo = stockInfoList[0].partBatchNo
+						item.ifsBatchNo = stockInfoList[0].ifsBatchNo
+						item.unit = stockInfoList[0].unit
+						item.locationNo = stockInfoList[0].locationNo
+						item.availableStockQuantity = stockInfoList[0].availableStockQuantity
+					}
+
+					that.list.push(item)
+
+				}
+			},
+			//鑷冲簱浣嶅彿
+			bindPackLocationChange(e, storage) {
+
+				if (storage.length <= 0) {
+					this.locationIndex = null
+					return
+				}
+				this.locationIndex = e.target.value
+				this.tolocationNo = storage[this.locationIndex].value
+
+				//鑾峰彇鑷冲簱浣嶅彿瀵瑰簲鐨刬d鍩虹鏁版嵁
+				let data = {
+					locNo: this.tolocationNo
+				}
+				this.$u.api.pigxPacking.getBasicLocation(data).then(res => {
+
+					let reList = res.data.records
+					if (reList.length > 0) {
+						this.tolocationId = reList[0].id
+						//娴嬭瘯鐢�
+						// this.scanHandler("KC000006");
+					}
+				});
+
+			},
+			deleteHandle(obj) {
+				let that = this
+
+				uni.showModal({
+					title: '鎻愮ず',
+					content: '姝ゆ搷浣滃皢姘镐箙鍒犻櫎绯荤粺鍙�:' + obj.systemNo + ', 鏄惁缁х画?',
+					success: function(res) {
+						if (res.confirm) {
+
+							that.$u.api.pigxPacking.delPackagingItem(obj).then(res => {
+								that.loadList();
+							})
+						}
+					}
+				});
+			}
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.wrap .form {
+		padding: 0px 13px;
+		;
+	}
+
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+		position: relative;
+	}
+
+	.list .title {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.row-list {
+		display: flex;
+		flex-direction: row;
+	}
+
+	.row-list ._label {
+		flex: 0.8;
+		color: #909399;
+	}
+
+	.row-list ._content {
+		flex: 1.5;
+		text-align: right;
+	}
+
+	.row-img {
+		position: absolute;
+		right: 2px;
+		top: 0px;
+	}
+</style>
diff --git a/pages/wareHouse/packing/form.vue b/pages/wareHouse/packing/form.vue
new file mode 100644
index 0000000..7e8d302
--- /dev/null
+++ b/pages/wareHouse/packing/form.vue
@@ -0,0 +1,224 @@
+<template>
+	<view class="wrap">
+		<u-form class="form" :model="model" :rules="rules" ref="uForm" label-position="left">
+			<u-form-item label="绠卞彿" prop="no" label-width="180" :required="true">
+				<input v-model="model.no" placeholder="璇锋壂绠卞彿" :disabled="true"></input>
+			</u-form-item>
+			<u-form-item label="鐗╂枡缂栫爜" prop="cusMaterialCode" label-width="180" >
+				<input v-model="model.cusMaterialCode" placeholder="璇锋壂鐗╂枡缂栫爜" :disabled="true"></input>
+			</u-form-item>
+			<u-form-item label="鍖呰灏哄" prop="packSize" label-width="180" >
+				<picker @change="bindPackSizeChange($event,packSizeList)" :value="packSizeIndex" :range="packSizeList"
+					range-key="value">
+					<view>
+						<text>{{packSizeIndex==null ? "璇烽�夋嫨":packSizeList[packSizeIndex].value}}</text>
+					</view>
+				</picker>
+			</u-form-item>
+			<u-form-item label="鍖呮潗" prop="packMaterial" label-width="180" >
+				<picker @change="bindPackMaterialChange($event,packMaterialList)" :value="packMaterialIndex"
+					:range="packMaterialList" range-key="value">
+					<view>
+						<text>{{packMaterialIndex==null ? "璇烽�夋嫨":packMaterialList[packMaterialIndex].value}}</text>
+					</view>
+				</picker>
+			</u-form-item>
+			<u-form-item label="鍖呰閲嶉噺" prop="packWeight" label-width="180" >
+				<input placeholder="璇疯緭鍏ュ寘瑁呴噸閲�" v-model="model.packWeight" type="digit" :disabled="true"></input>
+			</u-form-item>
+		</u-form>
+		<view class="form-footer">
+			<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+			<u-button class="btn" type="default" @click="cancel">娓呯┖鎵爜</u-button>
+		</view>
+		<scan></scan>
+	</view>
+</template>
+
+<script>
+	import scan from "@/components/scan/scan.vue";
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				type: '',
+				model: {
+					id: 0,
+					// no: 'BZ0000000011',
+					// cusMaterialCode: '88.118.1/A0306595',
+					no: '',
+					cusMaterialCode: '',
+					packWeight: '',
+					packSize: '',
+					packMaterial: ''
+				},
+				rules: {
+					no: [{
+						required: true,
+						message: '缂栧彿涓嶈兘涓虹┖',
+						trigger: 'blur'
+					}],
+					packWeight: [{
+						required: true,
+						message: '鍖呰閲嶉噺涓嶈兘涓虹┖',
+						trigger: 'blur'
+					}],
+					packSize: [{
+						required: true,
+						message: '鍖呰灏哄涓嶈兘涓虹┖',
+						trigger: 'blur'
+					}],
+					packMaterial: [{
+						required: true,
+						message: '鍖呮潗涓嶈兘涓虹┖',
+						trigger: 'blur'
+					}],
+				},
+				packMaterialList: [],
+				packMaterialIndex: null,
+				packSizeList: [],
+				packSizeIndex: null,
+				packWeightList: [],
+			}
+		},
+		onLoad() {
+			this.type = 'add'
+			this.model = {}
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				if (that.model.no == "undefined" || that.model.no == "" || that.model.no == undefined) {
+					that.model.no = data.code
+				} else {
+					that.model.cusMaterialCode = data.code
+				}
+				that.$forceUpdate();
+
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		onReady() {
+			// this.$refs.uForm.setRules(this.rules);
+
+			let that = this
+			that.$u.api.pigxPacking.packHeadBasicInfoList().then(res => {
+
+				let packSizeList = res.data.packSizeWeightList
+				let packMaterialList = res.data.packMaterialList
+
+				that.packWeightList = packSizeList
+
+				if (packSizeList.length > 0) {
+					packSizeList.map((item, index) => {
+
+						let packSize = {
+							lable: item.packSize,
+							value: item.packSize
+						}
+						that.packSizeList.push(packSize)
+					});
+				}
+
+				packMaterialList.map((item, index) => {
+					let packMaterial = {
+						lable: item,
+						value: item
+					}
+					that.packMaterialList.push(packMaterial)
+				});
+			});
+
+
+		},
+		methods: {
+			submit() {
+
+
+				if (JSON.stringify(this.model) == "{}") {
+					this.$u.toast('璇峰~鍐欏繀濉俊鎭�')
+					return
+				}
+
+				this.$refs.uForm.validate(async valid => {
+					if (valid) {
+
+						await this.$u.api.pigxPacking.addObj(this.model)
+						setTimeout(() => {
+							uni.showModal({
+								title: '鎻愮ず',
+								content: '娣诲姞鎴愬姛',
+								showCancel: false,
+								success: function() {
+									uni.setStorageSync('refreshList', true);
+									uni.navigateTo({
+										url: '/pages/wareHouse/packing/index'
+									})
+								}
+							})
+						}, 200)
+					} else {
+						this.$u.toast('鎮ㄥ~鍐欑殑淇℃伅鏈夎锛岃鏍规嵁鎻愮ず淇銆�')
+					}
+				});
+			},
+			cancel() {
+				this.model.no = ""
+				this.model.cusMaterialCode = ""
+				this.$forceUpdate();
+			},
+			//鍖呰澶у皬閫夋嫨
+			bindPackSizeChange(e, storage) {
+
+				if (storage.length <= 0) {
+					this.packSizeIndex = null
+					return
+				}
+				this.packSizeIndex = e.target.value
+				this.model.packSize = storage[this.packSizeIndex].value
+
+				let list = this.packWeightList.filter(item => item.packSize = storage[this.packSizeIndex].value)
+				if (list.length > 0) {
+					this.model.packWeight = list[0].packWeight
+				}
+			},
+			//鍖呮潗閫夋嫨
+			bindPackMaterialChange(e, storage) {
+
+				if (storage.length <= 0) {
+					this.packMaterialIndex = null
+					return
+				}
+				this.packMaterialIndex = e.target.value
+				this.model.packMaterial = storage[this.packMaterialIndex].value
+			},
+
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-input-placeholder {
+		font-size: 12px;
+	}
+	
+	uni-input{font-size: 12px;}
+	
+	
+</style>
diff --git a/pages/wareHouse/packing/index.vue b/pages/wareHouse/packing/index.vue
new file mode 100644
index 0000000..0b915b7
--- /dev/null
+++ b/pages/wareHouse/packing/index.vue
@@ -0,0 +1,213 @@
+<template>
+	<view class="wrap">
+		<view class="search">
+			<u-search v-model="keywords" placeholder="璇疯緭鍏ョ紪鍙�" @clear="search" @custom="search" @search="search">
+			</u-search>
+		</view>
+		<scroll-view class="scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="list" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="index" >
+					<view class="row-list">
+						<view class="_label">
+							缂栧彿:
+						</view>
+						<view class="_content">
+							{{ item.no }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鐗╂枡缂栫爜:
+						</view>
+						<view class="_content">
+							{{ item.cusMaterialCode }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍖呰灏哄:
+						</view>
+						<view class="_content">
+							{{ item.packSize }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍖呰:
+						</view>
+						<view class="_content">
+							{{ item.packMaterial }}
+						</view>
+					</view>
+					<view class="row-list">
+						<view class="_label">
+							鍖呰閲嶉噺:
+						</view>
+						<view class="_content">
+							{{ item.packWeight }}
+						</view>
+					</view>
+					<view class="row-list bottom-btn">
+						<view class="_label" style="flex:1;">
+							<button class="_btn" style="height: 80rpx;line-height: 80rpx;" @click="selectNo(item)">绉诲簱</button>
+						</view>
+						<view class="_content" style="flex:1;">
+							<button class="_btn" style="height: 80rpx;line-height: 80rpx;" @click="weightHandle(item)">绉伴噸</button>
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+		<view class="btn-plus" @click="cardClick()">
+			<u-icon name="plus-circle-fill" size="90" color="#3d87ff"></u-icon>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				keywords: '',
+				list: [],
+				count: 0,
+				loadStatus: 'loadmore',
+				query: {
+					current: 1,
+					size: 20,
+					isConfirm:false,
+					no:"",
+					criteria:{
+						dateTimeFilters:{},
+						multiSearchFilter:{},
+						orderBy:{
+							column:'createTime',
+							direction:'desc'
+						}
+					}
+				},
+			};
+		},
+		onLoad() {
+			this.loadList();
+		},
+		onShow() {
+			if (uni.getStorageSync('refreshList') === true) {
+				uni.removeStorageSync('refreshList');
+				this.search('');
+			}
+		},
+		methods: {
+			loadList() {
+				this.$u.api.pigxPacking.fetchList(this.query).then(res => {
+					if (!res.data.records || res.data.records.length == 0) {
+						this.loadStatus = "nomore";
+						return;
+					}									
+					this.list = this.list.concat(res.data.records);
+					this.total = res.data.total;
+					this.query.current = res.data.current;
+					this.query.size = res.data.size;
+					this.loadStatus = "loadmore";
+				});
+			},			
+			loadMore() {
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			search(value) {
+				let that = this
+				that.list = [];
+				that.total = 0;
+				
+				that.query= {
+					current: 1,
+					size: 20,
+					isConfirm:false,
+					no:value,
+					criteria:{
+						dateTimeFilters:{},
+						multiSearchFilter:{},
+						orderBy:{
+							column:'createTime',
+							direction:'desc'
+						}
+					},
+				}
+				that.loadList()
+				
+			},
+			cardClick() {
+				uni.navigateTo({
+					url: '/pages/wareHouse/packing/form'
+				})
+			},
+			selectNo(e)
+			{
+				uni.navigateTo({
+					url: '/pages/wareHouse/packing/detail?item=' + encodeURIComponent(JSON.stringify(e))
+				})
+			},
+			weightHandle(item)
+			{
+				let that = this
+				that.$u.api.pigxPacking.updWeight(item).then(res => {
+					
+					setTimeout(() => {
+					  uni.showModal({
+					    title: '鎻愮ず',
+					    content: '绉伴噸鏇存柊鎴愬姛',
+					    showCancel: false,
+					    success: function () {
+					     that.loadList();
+					    }
+					  })
+					}, 200)
+					
+				})
+				
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	.list .content {
+		font-size: 12px;
+		background-color: #efefef;
+		box-sizing: border-box;
+		border-radius: 14rpx;
+		margin: 8px;
+		padding: 5px 10px;
+		box-shadow: none;
+	}
+	
+	.row-list {
+		display: flex;
+		flex-direction: row;
+	}
+	
+	.row-list ._label {
+		flex: 0.8;
+		color: #909399;
+	}
+	
+	.row-list ._content {
+		flex: 1.5;
+		text-align: right;
+	}	
+
+	._btn {
+		background: #3A80F4;
+		color: #FFF;
+		margin: 0 7px;
+		justify-content: center;
+		height: 28px;
+		line-height: 28px;
+		font-size: 12px;
+	}
+</style>
diff --git a/pages/wareHouse/packing/personnelList.vue b/pages/wareHouse/packing/personnelList.vue
new file mode 100644
index 0000000..2bc1830
--- /dev/null
+++ b/pages/wareHouse/packing/personnelList.vue
@@ -0,0 +1,290 @@
+<template>
+	<view class="page">
+		<view class="packing-personnelList-bg"/>
+				<u-navbar title="浜哄憳鍒楄〃" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+				<view class="packing-personnelList-search">
+					<u-search v-model="keywords" shape="square" bg-color="rgba(250,252,255,0.36)" :show-action="false" placeholder="璇疯緭鍏ヤ汉鍛樺悕绉�" @clear="search" @custom="search" @search="search">
+					</u-search>
+		</view>
+		<view class="packing-personnelList-body-title">
+			<view class="title-label">妫�绱㈢粨鏋滈�夋嫨</view>
+		</view>
+	   <view class="wrap">
+		<scroll-view class="packing-personnelList-scroll-list" scroll-y="true" @scrolltolower="loadMore">
+			<u-cell-group class="packing-personnelList-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+					<view class="row-list" @click="switchSelected(item)">
+						<view class="row-list-item">
+							<view class="no-icon"></view>
+							<view class="no-label">浜哄憳缂栧彿锛�</view>
+							<view class="no-value">{{item.staffNo}}</view>
+						</view>
+						<view class="row-list-item">
+							<view class="name-icon"></view>
+							<view class="name-label">浜哄憳鍚嶇О锛�</view>
+							<view class="name-value">{{item.staffName}}</view>
+						</view>
+						<view :class="item.isSelected?'selected-label':'unselected-label'">
+							
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+			<view class="loadmore" @click="loadMore">
+				<u-loadmore :status="loadStatus"></u-loadmore>
+			</view>
+		</scroll-view>
+			<view class="packing-personnelList-form-footer">
+				<u-button class="btn" type="primary" @click="confirm">纭畾</u-button>
+			</view>
+	</view>
+	</view>
+</template>
+<script>
+	import content_bg from '@/static/custom/packing/backBg.png'
+	export default {
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				keywords: '',
+				alllist: [],
+				originList: [],
+				
+				query: {
+					current: 1,
+					size: 10
+				},
+				list: [],
+				count: 0,
+				loadStatus: 'loading',
+				idList:[]
+			};
+		},
+		onLoad() {
+			this.$u.api.pigxPacking.getStaff().then(res => {
+				console.log(res);
+				let resData=res.data
+				resData.forEach((item)=>{
+					item.isSelected=false
+				})
+				this.alllist = resData
+				this.originList = resData
+				this.loadList()
+			})
+		},
+		methods: {
+			change(e) {
+				this.idList = e.detail.value
+			},
+			switchSelected(item){
+				item.isSelected=!item.isSelected
+			},
+			loadMore() {
+				if(this.loadStatus == "nomore" || this.loadStatus == "loading"){
+					return
+				}
+				this.loadStatus = "loading";
+				setTimeout(() => {
+					this.query.current += 1;
+					this.loadList();
+				}, 100);
+			},
+			loadList() {
+				const data = this.originList.slice((this.query.current-1)*this.query.size,this.query.current*this.query.size)
+				this.list = this.list.concat(data);
+				this.loadStatus = "loadmore";
+				if (!data || data.length < this.query.size) {
+					this.loadStatus = "nomore";
+				}
+			},
+			search(value) {
+				this.list = [];
+				this.query.current = 1;
+				if (value) {
+					this.originList = this.alllist.filter(item => item.staffName.includes(value))
+				} else {
+					this.originList = this.alllist
+				}
+				this.loadList()
+			},
+			confirm(){
+				this.idList=[]
+				this.list.forEach((item)=>{
+					if(item.isSelected){
+						let staffInfo=item.id.toString() + ',' + item.staffName + ',' + item.staffNo
+						this.idList.push(staffInfo)
+					}
+				})
+				if(this.idList.length>0){
+					this.refreshLastPage()
+				}else{
+					this.$u.toast('璇峰厛閫夋嫨浜哄憳')
+				}
+			},
+			//鍒锋柊涓婁竴涓〉闈�
+			refreshLastPage() {
+				// 鍛婄煡 A.vue 鏇存柊鏁版嵁
+				// 鑾峰彇椤甸潰鏍�
+				let pages = getCurrentPages()
+
+				// 鑾峰彇涓婁竴椤垫爤
+				let prevPage = pages[pages.length - 2]
+
+				// 瑙﹀彂涓婁竴椤� upData 鍑芥暟(骞舵惡甯﹀弬鏁�)
+				prevPage.$vm.setNo(this.idList)
+
+				// 杩斿洖涓婁竴椤�
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss">
+	.packing-personnelList-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/packing/backBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.packing-personnelList-search{
+		padding: 40rpx 30rpx 20rpx 30rpx;
+	}
+	
+	.packing-personnelList-body-title{
+		padding: 0rpx 30rpx 0rpx 30rpx;
+		margin-top: 20rpx;
+		margin-bottom: 26rpx;
+		.title-label{
+			font-size: 28rpx;
+			color: #6D82A1;
+		}
+	}
+	
+	.wrap .packing-personnelList-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 446rpx);
+	    width:100%;
+	}
+	.packing-personnelList-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+			display: flex;
+			justify-content: space-between;
+			flex-wrap:wrap;
+	    }
+		.content {
+			background-image: url('~@/static/custom/packing/person_row_bg.png');
+			background-size: 100% auto;
+			background-repeat: no-repeat;
+			height:138rpx;
+			width:336rpx;
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 20rpx;
+			padding: 0rpx 16rpx 0rpx 16rpx;
+			box-shadow: none;
+			.row-list{
+				height: 100%;
+				padding-top: 30rpx;
+				padding-bottom: 24rpx;
+				display: flex;
+				flex-direction:column;
+				justify-content: space-between;
+				position: relative;
+				.row-list-item{
+					display: flex;
+					align-items: center;
+					.no-icon{
+						background-image: url('~@/static/custom/packing/icon_1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					.no-label{
+						margin-left:4rpx;
+						color: #666666;
+						font-size: 26rpx;
+					}
+					.no-value{
+						color: #333333;
+						font-size: 26rpx;
+					}
+					.name-icon{
+						background-image: url('~@/static/custom/packing/icon_2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					.name-label{
+						margin-left:4rpx;
+						color: #666666;
+						font-size: 26rpx;
+					}
+					.name-value{
+						color: #333333;
+						font-size: 26rpx;
+					}
+				}
+				.selected-label{
+					position:absolute;
+					bottom: 12rpx;
+					right: 2rpx;
+					background-image: url('~@/static/custom/packing/click-selected.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:26rpx;
+				}
+				.unselected-label{
+					position:absolute;
+					bottom: 12rpx;
+					right: 2rpx;
+					background-image: url('~@/static/custom/packing/click-unselected.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:28rpx;
+					width:26rpx;
+				}
+			}
+		}
+	}
+	
+	.packing-personnelList-form-footer{
+		display: flex;
+		margin-top: 10rpx;
+		margin-bottom: 10rpx;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		padding-bottom: 14rpx;
+		.btn {
+		  flex: 1;
+		  margin: 10rpx;
+		  background: #214DED;
+		  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		  font-weight: bold;
+		  color: #FEFEFE;
+		  font-family: PingFang SC;
+		}
+	}
+	
+</style>
diff --git a/pages/wareHouse/packing/registration.vue b/pages/wareHouse/packing/registration.vue
new file mode 100644
index 0000000..5f1dfb5
--- /dev/null
+++ b/pages/wareHouse/packing/registration.vue
@@ -0,0 +1,579 @@
+<template>
+	<view class="page">
+		<view class="packing-registration-bg"/>
+		<u-navbar title="鍖呰鐧昏" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="packing-registration-param">
+			<view class="packing-registration-param-view">
+					<view class="packing-registration-param-item param-extra">
+						<view class="packing-registration-param-item-left">
+						  <text class="item-one">鍖呰浜�</text>
+						</view>
+						<view>
+							<text class="item-one" @click="showPackerName = true">{{registerInfo.packerNames}}</text>
+						</view>
+						<view class="packing-registration-param-item-right" >
+						   <text class="item-one item-two" @click="seachPersonnelNo()">璇烽�夋嫨</text>
+						   <u-icon name="arrow-right" color="#687792" size="28" @click="seachPersonnelNo()"></u-icon>
+						</view>
+					</view>
+					<view class="packing-registration-param-item param-extra">
+						<view class="packing-registration-param-item-left">
+						  <text class="item-one">宸ュ彿</text>
+						</view>
+						<view class="packing-registration-param-item-right" >
+						   <text class="item-one item-two" @click="showPackerName = true">{{registerInfo.packerNos}}</text>
+						</view>
+					</view>
+					<view class="packing-registration-param-item param-extra">
+						<view class="packing-registration-param-item-left">
+						  <text class="item-one">鐝</text>
+						</view>
+						<view class="packing-registration-param-item-right" >
+						   <picker class="item-one item-two"  @change="shiftNumBindChange($event,shiftList)" :value="shiftNumIndex" :range="shiftList"
+						   	range-key="value">
+						   	<view>
+						   		<text>{{shiftNumIndex==null ? "璇烽�夋嫨":shiftList[shiftNumIndex].value}}</text>
+						   	</view>
+						   </picker>
+						   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+						</view>
+					</view>
+					<view class="packing-registration-param-item param-extra">
+						<view class="packing-registration-param-item-left">
+						  <text class="item-one">鍖呰鏃ユ湡</text>
+						</view>
+						<view class="packing-registration-param-item-right"@click="openDatePicker()">
+						   <text class="item-one item-two" >{{registerInfo.packageDate=='' ? "璇烽�夋嫨":registerInfo.packageDate}}</text>
+						   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+						   <u-calendar v-model="showPackageDatePicker" mode="date" @change="choseDate" max-date="2030-12-31" :mask-close-able="true"></u-calendar>
+						</view>
+					</view>
+					<view class="packing-registration-param-item param-extra">
+						<view class="packing-registration-param-item-left">
+						  <text class="item-one">鍖呰搴撲綅</text>
+						</view>
+						<view class="packing-registration-param-item-right" >
+						   <picker class="item-one item-two"  @change="locNoNumBindChange($event,locNoList)" :value="locNoNumIndex" :range="locNoList"
+						   	range-key="value">
+						   	<view>
+						   		<text>{{locNoNumIndex==null ? "璇烽�夋嫨":locNoList[locNoNumIndex].value}}</text>
+						   	</view>
+						   </picker>
+						   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+						</view>
+					</view>
+			</view>
+		</view>
+	   <view class="wrap">
+		<u-popup v-model="showPackerName" mode="center" :closeable="true" class="packer-popup">
+			<view>
+				<view style="height:800rpx; width: 600rpx; padding: 60rpx 40rpx 40rpx 40rpx;">
+					<view style="padding-top: 20rpx;">
+						<view v-for="(item,index) in staffNameList" :key="item.staffNo" class="packer-namelist">
+							<view class="popup-row">
+								<view style="display: flex;align-items: flex-start;">
+									<view style="font-size: 30rpx;">{{item.staffNo}}</view>
+									<view style="font-size: 30rpx;margin-left: 14rpx;">{{item.staffName}}</view>
+								</view>
+								<view style="color: red; font-size: 30rpx;" @click="del(index)">鍒犻櫎</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		<view style="padding:0rpx 30rpx;margin-bottom:30rpx;height: 26rpx;line-height: 26rpx;font-size:28rpx;color:#6D82A1;">
+			<view>鍖呰鍒楄〃</view>
+		</view>
+		<scroll-view class="packing-registration-scroll-list" scroll-y="true">
+			<u-cell-group class="packing-registration-scroll-list-group" :border="false">
+				<div class="tip" style="text-align: center;" v-if="hasScanSnList.length==0">-璇锋壂鐮�-</div>
+				<view class="content" v-for="(x, index) in hasScanSnList" :key="index" :index="index">
+					<view class="row-list">
+						<view class="row-list-left">
+							<view class="num-icon" style="color: #fff;">{{index+1}}</view>
+							<view style="margin-left: 30rpx;">{{x}}</view>
+						</view>
+						<view class="row-list-right" @click="goMinus(index,x)">
+							<view class="del-icon"></view>
+							<view style="margin-left: 14rpx;">鍒犻櫎</view>
+						</view>
+					</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		<view class="registration-form-footer">
+			<u-button class="btn" type="primary" @click="goSubmit">鎻愪氦</u-button>
+		</view>
+		<scan></scan>
+		<u-modal v-model="showConfirm" :content="delContent"  @confirm="confirm" :show-cancel-button="true"/>
+		
+	</view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+	import content_bg from '@/static/custom/packing/backBg.png'
+	export default {
+		components: { scan },
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				labelStyle:{
+					fontSize:'32rpx',
+					whiteSpace:'nowrap'
+				},
+				registerInfo:{
+					partBatchNo:'',
+					packageDate:'',
+					shiftId:'',
+					shiftName:'',
+					locNo:'',
+					packerName:'',
+					packerNo:'',
+					packerNos:'',
+					packerNames:''
+				},
+				hasScanSnList:[],
+				shiftList:[],
+				shiftNumIndex:null,
+				showPackageDatePicker:false,
+				params:{year: true,
+					month: true,
+					day: true,
+				},
+				locNoList:[],
+				locNoNumIndex:null,
+				delIndex:null,
+				delContent:null,
+				showConfirm:false,
+				staffList:[],
+				showPackerName:false,
+				PackerNameList:[],
+				staffNameList:[]
+			};
+		},
+		onLoad(option) {
+			//TODO
+			// this.getCurrDate()
+		},
+		onShow() {
+		
+			let that = this
+		
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				console.log('鎵爜缁撴灉锛�', data.code);
+				that.scanHandle(data.code)
+				that.$forceUpdate();
+		
+			})
+		},
+		onNavigationBarButtonTap(){
+			this.goScan()
+		},
+		onReady() {
+			this.loadShiftList()
+			this.loadLocNoList()
+			this.loadUserInfo()
+		},
+		methods: {
+			//浜哄憳
+			seachPersonnelNo() {
+				uni.navigateTo({
+					url: '/pages/wareHouse/packing/personnelList'
+				})
+			},
+			setNo(ids) {
+				ids.forEach((item) => {
+					this.PackerNameList.push({
+						staffName:item.split(',')[1],
+						staffNo:item.split(',')[2],
+						id:Number(item.split(',')[0])
+					})
+				})
+				
+				this.staffNameList = []
+				    for (let i = 0; i < this.PackerNameList.length; i++) {
+				      if (!this.staffNameList.some(e => e.id == this.PackerNameList[i].id)) this.staffNameList.push(this.PackerNameList[i]);
+				    }
+				this.PackerNameList = this.staffNameList
+				this.registerInfo.packerNames = this.registerInfo.packerName + `绛�${this.staffNameList.length}浜篳
+				this.registerInfo.packerNos = this.registerInfo.packerNo + `绛�${this.staffNameList.length}浜篳
+				console.log(this.staffNameList);
+			},
+			del(index) {
+				this.staffNameList.splice(index,1)
+				this.registerInfo.packerNames = this.registerInfo.packerName + `绛�${this.staffNameList.length}浜篳
+				this.registerInfo.packerNos = this.registerInfo.packerNo + `绛�${this.staffNameList.length}浜篳
+				if (this.staffNameList.length < 1) {
+					this.registerInfo.packerNames = this.registerInfo.packerName 
+					this.registerInfo.packerNos = this.registerInfo.packerNo 
+				}
+				console.log(this.staffNameList);
+			},
+			goScan(){
+				uni.scanCode({
+					scanType: ['qrCode'],
+					success: res => {
+						try {
+							console.log('鎵爜缁撴灉锛�', res);
+							this.scanHandle(res.result)
+						} catch (e) {}
+					}
+				});
+			},
+			scanHandle(scanresult){
+				scanresult = scanresult.replace(/[\r\n]/g, "")
+				if (scanresult.indexOf('{')>-1) {
+					//浜岀淮鐮�
+					const result = JSON.parse(scanresult)
+					//澧炲姞SN鏍¢獙
+					if(result.sn_no && result.sn_no!=null && result.sn_no!=''){
+						if(this.hasScanSnList.length>0){
+							let hasScanSnIndex=this.hasScanSnList.indexOf(result.sn_no)
+							if(hasScanSnIndex<0){
+								this.hasScanSnList.push(result.sn_no)
+							}else{
+								this.$u.toast('璇峰嬁閲嶅鎵弿')
+							}
+						}else{
+							this.hasScanSnList.push(result.sn_no)
+						}	
+					}
+					
+				} else {
+						//澧炲姞SN鏍¢獙
+						if(this.hasScanSnList.length>0){
+							let hasScanSnIndex=this.hasScanSnList.indexOf(scanresult)
+							if(hasScanSnIndex<0){
+								this.hasScanSnList.push(scanresult)
+							}else{
+								this.$u.toast('璇峰嬁閲嶅鎵弿')
+							}
+						}else{
+							this.hasScanSnList.push(scanresult)
+						}
+				}		
+			},
+			confirm(){
+				this.hasScanSnList.splice(this.delIndex, 1)
+			},
+			goMinus(i,item){
+				this.delContent='纭鍒犻櫎SN鍙凤細'+item
+				this.delIndex=i
+				this.showConfirm=true
+				
+			},
+			goSubmit() {
+				if(this.registerInfo.shiftId==null || this.registerInfo.shiftId==''){
+					this.$u.toast('璇烽�夋嫨鐝')
+					return
+				}
+				if(this.registerInfo.packageDate==null || this.registerInfo.packageDate==''){
+					this.$u.toast('璇烽�夋嫨鏃ユ湡')
+					return
+				}
+				if(this.registerInfo.locNo==null || this.registerInfo.locNo==''){
+					this.$u.toast('璇烽�夋嫨鍖呰搴撲綅')
+					return
+				}
+				if(this.hasScanSnList.length==0){
+					this.$u.toast('鏃犲緟鎻愪氦鐨凷N鍙锋槑缁�')
+					return
+				}
+				let registrList=[]
+				this.staffList = []
+				this.staffNameList.forEach((item) => {
+					this.staffList.push(
+						{
+							staffId: item.id
+						}
+					)
+				})
+				this.hasScanSnList.forEach((item)=>{
+					registrList.push({
+						shiftId:this.registerInfo.shiftId,
+						packageDate:this.registerInfo.packageDate,
+						locNo:this.registerInfo.locNo,
+						partBatchNo:item,
+						staffList:this.staffList
+					})
+				})
+				/*uni.showLoading({
+					title: '姝e湪鎻愪氦...',
+					mask: true
+				});	*/
+				this.$u.api.pigxPacking.addPackageRegister(registrList).then(res => {
+					let resData=res.data
+					this.hasScanSnList=[]
+					//uni.hideLoading();
+					this.$u.toast('鎻愪氦鎴愬姛')
+				}).catch((e) => {
+					//uni.hideLoading();
+				})
+				
+			},
+			loadShiftList(){
+				this.shiftList=[]
+				this.$u.api.pigxPacking.getShiftList({current:1,size:10}).then(res => {
+					let shiftList=res.data.records
+					if (shiftList.length > 0) {
+						shiftList.map((item, index) => {
+							let shift = {
+								label: item.id,
+								value: item.name
+							}
+							this.shiftList.push(shift)
+						});
+					}
+				})
+			},
+			loadLocNoList(){
+				this.locNoList=[]
+				this.$u.api.dictData({dictType:'package_loc_no'}).then(res => {
+					let locNoList=res.data
+					if (locNoList.length > 0) {
+						locNoList.map((item, index) => {
+							let locNo = {
+								label: item.value,
+								value: item.label
+							}
+							this.locNoList.push(locNo)
+						});
+					}
+				})
+			},
+			locNoNumBindChange(e,storage){
+				if (storage.length <= 0) {
+					this.locNoNumIndex = null
+					return
+				}
+				this.locNoNumIndex = e.target.value
+				this.registerInfo.locNo = storage[this.locNoNumIndex].label
+				console.log('locNoNumIndex',this.registerInfo.locNo)
+			},
+			loadUserInfo(){
+				this.registerInfo.packerName=''
+				this.registerInfo.packerNames=''
+				this.registerInfo.packerNo=''
+				this.registerInfo.packerNos=''
+				/*this.$u.api.pigxPacking.getCurrUser().then(res => {
+					let resData=res.data
+					this.registerInfo.packerName=resData.staffName
+					this.registerInfo.packerNames=resData.staffName
+					this.registerInfo.packerNo=resData.staffNo
+					this.registerInfo.packerNos=resData.staffNo
+					console.log(res);
+				}).catch((e) => {
+					
+				})*/
+			},
+			openDatePicker(){
+				this.showPackageDatePicker=true
+				this.staffList = []
+				this.staffNameList.forEach((item) => {
+					this.staffList.push(
+						{
+							staffId: item.id
+						}
+					)
+				})
+				console.log(this.staffList);
+			},
+			choseDate(date){
+				this.registerInfo.packageDate = date.result
+			},
+			shiftNumBindChange(e,storage){
+				if (storage.length <= 0) {
+					this.shiftNumIndex = null
+					return
+				}
+				this.shiftNumIndex = e.target.value
+				this.registerInfo.shiftId = storage[this.shiftNumIndex].label
+				this.registerInfo.value = storage[this.shiftNumIndex].value
+			},
+			// getCurrDate(){
+			// 	let date = new Date()
+			// 	let year = date.getFullYear()
+			// 	let month = date.getMonth() + 1
+			// 	let day = date.getDate();
+			// 	month = (month > 9)?month:("0" + month)
+			// 	day = (day < 10)?("0" + day):day
+			// 	this.registerInfo.packageDate = year + "-" + month + "-" + day
+			// }
+		}
+	};
+</script>
+<style lang="scss" scoped>
+.packing-registration-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/packing/backBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.packing-registration-param{
+		padding: 40rpx 30rpx 10rpx 30rpx;
+		.packing-registration-param-title{
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			margin-bottom: 30rpx;
+			.title-label{
+				margin-left: 14rpx;
+				font-size: 34rpx;
+				font-weight: bold;
+				color: #283E65;
+			}
+		}
+		.packing-registration-param-view{
+			height: 450rpx;
+			background-color: #fff;
+			border-radius: 10rpx;
+			padding:0rpx 23rpx;
+			margin-bottom: 30rpx;
+			.packing-registration-param-item{
+				height: 90rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 90rpx;
+				display:flex;
+				justify-content: space-between;
+				border: none;
+				.packing-registration-param-item-left{
+					.item-one{
+						font-size: 30rpx;
+						color: #666666;
+					}
+				}
+				.packing-registration-param-item-right{
+					display:flex;
+					justify-content: space-between;
+					.item-one{
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+					.item-two{
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+					.item-three{
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+				}
+			}
+			.param-extra{
+				border-bottom: 1px solid #EDEDED;
+			}
+		}
+	}
+	.wrap .packing-registration-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 824rpx);
+	    width:100%;
+	}
+	.packing-registration-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+	    }
+		.content {
+			background-image: url('~@/static/custom/packing/row_bg.png');
+			background-size: 100% auto;
+			background-repeat: no-repeat;
+			height:89rpx;
+			width:691rpx;
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 20rpx;
+			padding: 0rpx 50rpx 0rpx 32rpx;
+			box-shadow: none;
+			.row-list{
+				height: 100%;
+				display: flex;
+				justify-content: space-between;
+				align-items:center;
+				padding-top: 0rpx !important;
+				.row-list-left{
+					display: flex;
+					color: #333333;
+					.num-icon{
+						background-image: url('~@/static/custom/packing/num-bg.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:38rpx;
+						width:38rpx;
+						text-align: center;
+						line-height: 38rpx;
+					}
+				}
+				.row-list-right{
+					display: flex;
+					color: #428BF7;
+					.del-icon{
+						background-image: url('~@/static/custom/packing/icon_dele.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:30rpx;
+						width:28rpx;
+					}
+				}
+			}
+		}
+	}
+	.registration-form-footer{
+		display: flex;
+		margin-top: 10rpx;
+		margin-bottom: 10rpx;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		padding-bottom: 14rpx;
+		.btn {
+		  flex: 1;
+		  margin: 10rpx;
+		  background: #214DED;
+		  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		  font-weight: bold;
+		  color: #FEFEFE;
+		  font-family: PingFang SC;
+		}
+	}
+	
+	.packer-popup{
+          ::v-deep .u-mode-center-box{
+			   border-radius: 30rpx;
+			}
+			.popup-row{
+				background-image: url('~@/static/custom/packing/row_bg.png');
+				background-size: 100% auto;
+				background-repeat: no-repeat;
+				height:89rpx;
+				width:520rpx;
+				display: flex;
+				justify-content: space-between;
+				padding-top:12rpx;
+				padding-left: 14rpx;
+				padding-right: 20rpx;
+			}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/wareHouse/productBack/index.vue b/pages/wareHouse/productBack/index.vue
new file mode 100644
index 0000000..4a603e7
--- /dev/null
+++ b/pages/wareHouse/productBack/index.vue
@@ -0,0 +1,487 @@
+<template>
+	<view class="page">
+		<view class="warehouse-productback-bg"/>
+		<u-navbar title="閫�搴�" :background="background" :border-bottom="false" :title-bold="true" title-color="#000" back-icon-color="#000"/>
+		<view class="warehouse-productback-param">
+				  <view class="warehouse-productback-param-view">
+					  <view class="warehouse-productback-param-item">
+					  	<view class="warehouse-productback-param-item-left">
+					  	  <text class="item-one">鑷姩鎻愪氦</text>
+					  	</view>
+					  	<view class="warehouse-productback-param-item-right">
+					  	   <!--<text class="item-one">{{isAuto?'鏄�':'鍚�'}}</text>-->
+						   <picker class="item-one" style="width: 100%;" @change="autoNumBindChange($event,isAutoList)" :value="autoNumIndex" :range="isAutoList"
+						   	range-key="label">
+						   	<view>
+						   		<text>{{isAutoList[autoNumIndex].label}}</text>
+						   	</view>
+						   </picker>
+					  	   <u-icon name="arrow-right" color="#687792" size="28"></u-icon>
+					  	</view>
+					  </view>
+				  </view>
+		</view>
+	  <view class="wrap">
+		<scroll-view class="warehouse-productback-scroll-list" scroll-y="true">
+			<u-cell-group class="warehouse-productback-scroll-list-group" :border="false">
+				<view class="content" v-for="(item, index) in list" :key="item.id" :index="index">
+					<view class="content-header">
+							<view class="header-item">
+								<view class="content-header-icon-one"></view>
+								<view class="content-header-title">{{ item.partBatchNo }}</view>
+							</view>
+							<view class="header-item">
+								<view class="content-header-icon-two"></view>
+								<view class="content-header-title-ne">{{ item.partName }}</view>
+							</view>
+							<!--<view class="header-item-toolbar" @click="deleteHandle(item)">
+								<view class="header-item-toolbar-del-icon">
+									
+								</view>
+								<view class="header-item-toolbar-del-text">
+									鍒犻櫎
+								</view>
+							</view>-->
+						</view>
+						<view class="content-body">
+							<view class="row-list">
+								<view class="_label">
+									闆朵欢缂栧彿锛�
+								</view>
+								<view class="_content">
+									{{ item.partNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									鍏ュ簱鍓嶅簱浣嶏細
+								</view>
+								<view class="_content">
+									{{ item.locationNo }}
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									搴撳瓨鏁伴噺锛�
+								</view>
+								<view class="_content">
+									<text class="_content-text">{{ Math.abs(item.quantity) }}({{ item.unit }})</text>
+								</view>
+							</view>
+							<view class="row-list">
+								<view class="_label">
+									杞Щ鏁伴噺锛�
+								</view>
+								<view class="_content _input">
+									<u-input placeholder="璇疯緭鍏ヨ浆绉绘暟閲�" v-model="item.moveQty" type="digit"></u-input>
+									<view class="edit_icon"></view>
+								</view>
+							</view>
+						</view>
+				</view>
+			</u-cell-group>
+		</scroll-view>
+		<scan></scan>
+		
+		<view class="productBack-form-footer" v-if="list.length>0">
+			<u-button class="btn" type="primary" @click="submit">鎻愪氦</u-button>
+		</view>
+	</view>
+    </view>
+</template>
+<script>
+	import scan from "@/components/scan/scan.vue";
+    import content_bg from '@/static/custom/productBack/backBg.png'
+	export default {
+		components: {
+			scan
+		},
+		data() {
+			return {
+				background:{
+					backgroundImage: `url(${content_bg})`,
+					backgroundAttachment: 'fixed',
+					backgroundSize: '100% auto',
+					backgroundRepeat: 'no-repeat',
+				},
+				list: [],
+				isAuto:false,
+				isAutoList:[
+					{value:false,label:'鍚�'},
+					{value:true,label:'鏄�'}
+				],
+				autoNumIndex:0
+			};
+		},
+		onLoad() {
+			// this.loadList("221130000923N");
+		},
+		onShow() {
+
+			let that = this
+
+			uni.$off('scan') // 姣忔杩涙潵鍏� 绉婚櫎鍏ㄥ眬鑷畾涔変簨浠剁洃鍚櫒
+			uni.$on('scan', function(data) {
+				console.log('onscan');
+				//鎵爜鎴愬姛鍚庣殑鍥炶皟锛屼綘鍙互鍐欒嚜宸辩殑閫昏緫浠g爜鍦ㄨ繖閲�
+				let sn = ''
+				let snNoIndex=data.code.indexOf('sn_no')
+				if(snNoIndex>-1){
+					sn = JSON.parse(data.code.replace(/\n/g, '').replace(/\s*/g, '')).sn_no.trim()
+				}else{
+					sn = JSON.parse(data.code.replace(/\n/g, '').replace(/\s*/g, '')).lot_batch_no.trim()
+				}
+				console.log('鎵爜缁撴灉锛�' + sn);
+
+				//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦�  SN 鏄惁宸茬粡瀛樺湪
+				let initList = that.list.filter(item => item
+					.partBatchNo == sn)
+				if (initList.length > 0) {
+					uni.showToast({
+						title: "SN:" + sn + ",宸插瓨鍦�,璇烽�夋嫨鍙︿竴涓猄N鍙�",
+						icon: "none"
+					});
+					return
+				}
+
+				that.loadList(sn);
+			})
+		},
+		onNavigationBarButtonTap(e) {
+			uni.scanCode({
+				success: res => {
+					try {
+						const result = JSON.parse(res.result)
+
+					} catch (e) {}
+				}
+			});
+		},
+		methods: {
+			autoNumBindChange(e,storage){
+				if (storage.length <= 0) {
+					this.autoNumIndex = null
+					return
+				}
+				this.autoNumIndex = e.target.value
+				this.isAuto = storage[this.autoNumIndex].value
+			},
+			loadList(sanCode) {
+				uni.showLoading({
+					mask: true,
+					title: "鍔犺浇涓�",
+				});
+				let that = this
+
+				if (sanCode != "") {
+					let data = {
+						sn: sanCode
+					}
+
+					//鍒ゆ柇鏁扮粍涓槸鍚﹀瓨鍦� 鑷冲簱浣嶅彿 SN 
+					let initList = that.list.filter(item => item
+						.partBatchNo == sanCode)
+					if (initList.length > 0) {
+						uni.showToast({
+							title: "SN:" + sanCode + ",宸茬粡鎵繃鐮�",
+							icon: "none"
+						});
+						return
+					}
+
+					// 鏌ヨ閫�搴撲俊鎭�
+					that.$u.api.backWareHouse.getTransactionBySn(data).then(res => {
+						let reList = []
+						reList = res.data
+						if (!reList) {
+							uni.showToast({ 
+								title: "SN:" + sanCode + ",鏈壂鍒扮Щ搴撲俊鎭�",
+								icon: "none"
+							});
+						} else {
+							that.list = []
+							reList.moveQty = Math.abs(reList.quantity)
+							that.list.push(reList)
+						}
+						uni.hideLoading();
+						if(that.isAuto){
+							that.submit()
+						}
+					})
+				}
+			},
+		
+			submit() {
+				let that = this
+				if(that.list.length === 0){
+					uni.showToast({
+						title: '娌℃湁鍙彁浜ょ殑鏁伴噺',
+						icon: "none"
+					});
+					return
+				}
+				let item = that.list[0]
+				if (item.moveQty.length === 0) {
+					uni.showToast({
+						title: '璇疯緭鍏ヨ浆绉婚噺',
+						icon: "none"
+					});
+					return
+				}
+				
+				if (item.moveQty <= 0) {
+					uni.showToast({
+						title: '杞Щ閲忓繀椤诲ぇ浜�0',
+						icon: "none"
+					});
+					return
+				}
+				if (item.moveQty > Math.abs(item.quantity)) {
+					uni.showToast({
+						title: '杞Щ閲忎笉鑳藉ぇ浜庡彲鐢ㄥ簱瀛樻暟閲�',
+						icon: "none"
+					});
+					return
+				}				
+				that.$u.api.backWareHouse.returnStockBySn({
+					sn: that.list[0].partBatchNo,
+					quantity: that.list[0].moveQty
+				}).then(res => {
+					if (res.code == 0) {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦鎴愬姛',
+							showCancel: false,
+							success: function() {
+								that.list = []
+							}
+						})
+					} else {
+						uni.showModal({
+							title: '鎻愮ず',
+							content: '鎻愪氦澶辫触',
+							showCancel: false,
+							success: function() {
+
+							}
+						})
+					}
+
+				})
+			},
+		}
+	};
+</script>
+<style lang="scss" scoped>
+	.warehouse-productback-bg{
+		background-color: #F6F9FF;
+		background-image: url('~@/static/custom/productBack/backBg.png');
+		// background: linear-gradient(180deg,rgba(206,227,254,1),rgba(206,227,254,1) 20%,rgba(206,227,254,0.5) 40%,rgba(206,227,254,0.25) 60%,rgba(206,227,254,0.08) 80%,rgba(206,227,254,0));
+		padding: 0 20rpx;
+		background-attachment: fixed;
+		background-size: 100% auto;
+		background-repeat: no-repeat;
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		width: 100%;
+		z-index: -1;
+	}
+	
+	.warehouse-productback-param{
+		padding: 50rpx 30rpx 0rpx 30rpx;
+		.warehouse-productback-param-view{
+			height: 100rpx;
+			background: rgba(255,255,255,0.61);
+			box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(110,120,135,0.09);
+			border-radius: 10rpx;
+			padding:0rpx 23rpx;
+			margin-bottom: 30rpx;
+			.warehouse-productback-param-item{
+				height: 100rpx;
+				border: 1px solid #ADC8E4;
+				line-height: 100rpx;
+				display:flex;
+				justify-content: space-between;
+				border: none;
+				.warehouse-productback-param-item-left{
+					.item-one{
+						font-size: 30rpx;
+						color: #4F4F4F;
+					}
+				}
+				.warehouse-productback-param-item-right{
+					display: flex;
+					.item-one{
+						font-size: 30rpx;
+						color: #333333;
+						margin-right: 6rpx;
+					}
+					.item-two{
+						font-size: 30rpx;
+						color: #A6B4CC;
+						margin-right: 6rpx;
+					}
+					.item-three{
+						font-size: 30rpx;
+						color: #214DED;
+						margin-right: 6rpx;
+					}
+				}
+			}
+			.param-extra{
+				border-bottom: 1px solid #E8EBEE;
+			}
+		}
+	}
+	
+	.wrap .warehouse-productback-scroll-list{
+		height:calc(100vh - var(--window-top) - var(--window-bottom) - 402rpx);
+	    width:100%;
+	}
+	
+	.warehouse-productback-scroll-list-group{
+		::v-deep .u-cell-item-box {
+			background-color:rgba(250,252,255,0.36) !important;
+			padding:0rpx 30rpx ;
+		}
+		.content {
+			font-size: 12px;
+			background-color: #FFFFFF;
+			box-sizing: border-box;
+			border-radius: 10rpx;
+			margin: 0rpx 0rpx 24rpx;
+			height: 382rpx;
+			padding: 10rpx 20rpx;
+			box-shadow:0rpx 6rpx 12rpx 2rpx rgba(127, 127, 127, 0.1) !important;
+			position:relative;
+			.content-header{
+				.header-item{
+					height: 50rpx;
+					display: flex;
+					align-items:center;
+					.content-header-icon-one{
+						background-image: url('~@/static/custom/productBack/label-icon-1.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-icon-two{
+						background-image: url('~@/static/custom/productBack/label-icon-2.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:28rpx;
+						width:28rpx;
+					}
+					.content-header-title{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						font-weight: bold;
+						color: #333333;
+					}
+					.content-header-title-ne{
+						margin-left: 11rpx;
+						font-size: 26rpx;
+						color: #333333;
+					}
+			    }
+				.header-item-toolbar{
+					position: absolute;
+					background-image: url('~@/static/custom/product/del-icon.png');
+					background-size: 100% auto;
+					background-repeat: no-repeat;
+					height:60rpx;
+					width:140rpx;
+					right:0;
+					top:0;
+					display: flex;
+					justify-content: flex-end;
+					padding-top: 10rpx;
+					padding-right: 18rpx;
+					.header-item-toolbar-del-icon{
+						background-image: url('~@/static/custom/product/icon_dele.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:25rpx;
+						width:22rpx;
+						margin-top: 5rpx;
+					}
+					.header-item-toolbar-del-text{
+						margin-left:7rpx;
+						height: 23rpx;
+						font-size: 24rpx;
+						color: #FFFFFF;
+					}
+				}
+			}
+			
+			.content-body{
+				height:250rpx;
+				background: #F5F9FF;
+				border-radius: 10rpx;
+				padding: 25rpx 23rpx;
+				.row-list {
+					height: 50rpx;
+					display: flex;
+					flex-direction: row;
+					padding: 0px;
+					align-items: center;
+					justify-content: space-between;
+				}
+				.row-list ._label {
+					display: flex;
+					color: #666666;
+					font-size:26rpx;
+					align-items: center;
+					width: 170rpx;
+				}
+				
+				.row-list ._content {
+					text-align: right;
+					color: #909399;
+					font-size: 24rpx;
+					._content-text{
+						color:#214ded;
+					}
+				}
+				.row-list ._input {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+					border-bottom: 1px solid #4FA0FF;
+					height: 56rpx;
+					.edit_icon{
+						background-image: url('~@/static/custom/productBack/icon_edit.png');
+						background-size: 100% auto;
+						background-repeat: no-repeat;
+						height:26rpx;
+						width:26rpx;
+					}
+					::v-deep .uni-input-input{
+						color:#D35651;
+					}
+				}
+			}
+		}
+	}
+	
+	.productBack-form-footer{
+		display: flex;
+		margin-top: 10rpx;
+		margin-bottom: 10rpx;
+		margin-left: 20rpx;
+		margin-right: 20rpx;
+		padding-bottom: 14rpx;
+		.btn {
+		  flex: 1;
+		  margin: 10rpx;
+		  background: #214DED;
+		  box-shadow: 0rpx 6rpx 8rpx 0rpx rgba(4,49,212,0.3);
+		  font-weight: bold;
+		  color: #FEFEFE;
+		  font-family: PingFang SC;
+		}
+	}
+	
+</style>
diff --git a/project.config.json b/project.config.json
new file mode 100644
index 0000000..a6d134b
--- /dev/null
+++ b/project.config.json
@@ -0,0 +1,75 @@
+{
+  "description": "椤圭洰閰嶇疆鏂囦欢",
+  "miniprogramRoot": "unpackage/dist/dev/mp-weixin/",
+  "packOptions": {
+    "ignore": []
+  },
+  "setting": {
+    "urlCheck": false,
+    "es6": true,
+    "enhance": true,
+    "postcss": true,
+    "preloadBackgroundData": false,
+    "minified": true,
+    "newFeature": false,
+    "coverView": true,
+    "nodeModules": false,
+    "autoAudits": false,
+    "showShadowRootInWxmlPanel": true,
+    "scopeDataCheck": false,
+    "uglifyFileName": false,
+    "checkInvalidKey": true,
+    "checkSiteMap": true,
+    "uploadWithSourceMap": true,
+    "compileHotReLoad": false,
+    "lazyloadPlaceholderEnable": false,
+    "useMultiFrameRuntime": true,
+    "useApiHook": true,
+    "useApiHostProcess": true,
+    "babelSetting": {
+      "ignore": [],
+      "disablePlugins": [],
+      "outputPath": ""
+    },
+    "enableEngineNative": false,
+    "useIsolateContext": true,
+    "userConfirmedBundleSwitch": false,
+    "packNpmManually": false,
+    "packNpmRelationList": [],
+    "minifyWXSS": true,
+    "showES6CompileOption": false
+  },
+  "compileType": "miniprogram",
+  "libVersion": "2.23.4",
+  "appid": "wx39812109a4b6cd07",
+  "projectname": "miniprogram-1",
+  "debugOptions": {
+    "hidedInDevtools": []
+  },
+  "scripts": {},
+  "staticServerOptions": {
+    "baseURL": "",
+    "servePath": ""
+  },
+  "isGameTourist": false,
+  "condition": {
+    "search": {
+      "list": []
+    },
+    "conversation": {
+      "list": []
+    },
+    "game": {
+      "list": []
+    },
+    "plugin": {
+      "list": []
+    },
+    "gamePlugin": {
+      "list": []
+    },
+    "miniprogram": {
+      "list": []
+    }
+  }
+}
\ No newline at end of file
diff --git a/static/common/img/iPhoneX.png b/static/common/img/iPhoneX.png
new file mode 100644
index 0000000..257ba00
--- /dev/null
+++ b/static/common/img/iPhoneX.png
Binary files differ
diff --git a/static/common/js/touch-emulator.js b/static/common/js/touch-emulator.js
new file mode 100644
index 0000000..9632413
--- /dev/null
+++ b/static/common/js/touch-emulator.js
@@ -0,0 +1,363 @@
+(function(window, document, exportName, undefined) {
+    "use strict";
+
+    var isMultiTouch = false;
+    var multiTouchStartPos;
+    var eventTarget;
+    var touchElements = {};
+
+    // polyfills
+    if(!document.createTouch) {
+        document.createTouch = function(view, target, identifier, pageX, pageY, screenX, screenY, clientX, clientY) {
+            // auto set
+            if(clientX == undefined || clientY == undefined) {
+                clientX = pageX - window.pageXOffset;
+                clientY = pageY - window.pageYOffset;
+            }
+
+            return new Touch(target, identifier, {
+                pageX: pageX,
+                pageY: pageY,
+                screenX: screenX,
+                screenY: screenY,
+                clientX: clientX,
+                clientY: clientY
+            });
+        };
+    }
+
+    if(!document.createTouchList) {
+        document.createTouchList = function() {
+            var touchList = new TouchList();
+            for (var i = 0; i < arguments.length; i++) {
+                touchList[i] = arguments[i];
+            }
+            touchList.length = arguments.length;
+            return touchList;
+        };
+    }
+
+    /**
+     * create an touch point
+     * @constructor
+     * @param target
+     * @param identifier
+     * @param pos
+     * @param deltaX
+     * @param deltaY
+     * @returns {Object} touchPoint
+     */
+    function Touch(target, identifier, pos, deltaX, deltaY) {
+        deltaX = deltaX || 0;
+        deltaY = deltaY || 0;
+
+        this.identifier = identifier;
+        this.target = target;
+        this.clientX = pos.clientX + deltaX;
+        this.clientY = pos.clientY + deltaY;
+        this.screenX = pos.screenX + deltaX;
+        this.screenY = pos.screenY + deltaY;
+        this.pageX = pos.pageX + deltaX;
+        this.pageY = pos.pageY + deltaY;
+    }
+
+    /**
+     * create empty touchlist with the methods
+     * @constructor
+     * @returns touchList
+     */
+    function TouchList() {
+        var touchList = [];
+
+        touchList.item = function(index) {
+            return this[index] || null;
+        };
+
+        // specified by Mozilla
+        touchList.identifiedTouch = function(id) {
+            return this[id + 1] || null;
+        };
+
+        return touchList;
+    }
+
+
+    /**
+     * Simple trick to fake touch event support
+     * this is enough for most libraries like Modernizr and Hammer
+     */
+    function fakeTouchSupport() {
+        var objs = [window, document.documentElement];
+        var props = ['ontouchstart', 'ontouchmove', 'ontouchcancel', 'ontouchend'];
+
+        for(var o=0; o<objs.length; o++) {
+            for(var p=0; p<props.length; p++) {
+                if(objs[o] && objs[o][props[p]] == undefined) {
+                    objs[o][props[p]] = null;
+                }
+            }
+        }
+    }
+
+    /**
+     * we don't have to emulate on a touch device
+     * @returns {boolean}
+     */
+    function hasTouchSupport() {
+        return ("ontouchstart" in window) || // touch events
+               (window.Modernizr && window.Modernizr.touch) || // modernizr
+               (navigator.msMaxTouchPoints || navigator.maxTouchPoints) > 2; // pointer events
+    }
+
+    /**
+     * disable mouseevents on the page
+     * @param ev
+     */
+    function preventMouseEvents(ev) {
+		// 娉ㄩ噴鍚敤榛樿浜嬩欢
+        // ev.preventDefault();
+        // ev.stopPropagation();
+    }
+
+    /**
+     * only trigger touches when the left mousebutton has been pressed
+     * @param touchType
+     * @returns {Function}
+     */
+    function onMouse(touchType) {
+        return function(ev) {
+            // prevent mouse events
+            preventMouseEvents(ev);
+
+            if (ev.which !== 1) {
+                return;
+            }
+
+            // The EventTarget on which the touch point started when it was first placed on the surface,
+            // even if the touch point has since moved outside the interactive area of that element.
+            // also, when the target doesnt exist anymore, we update it
+            if (ev.type == 'mousedown' || !eventTarget || (eventTarget && !eventTarget.dispatchEvent)) {
+                eventTarget = ev.target;
+            }
+
+            // shiftKey has been lost, so trigger a touchend
+            if (isMultiTouch && !ev.shiftKey) {
+                triggerTouch('touchend', ev);
+                isMultiTouch = false;
+            }
+
+            triggerTouch(touchType, ev);
+
+            // we're entering the multi-touch mode!
+            if (!isMultiTouch && ev.shiftKey) {
+                isMultiTouch = true;
+                multiTouchStartPos = {
+                    pageX: ev.pageX,
+                    pageY: ev.pageY,
+                    clientX: ev.clientX,
+                    clientY: ev.clientY,
+                    screenX: ev.screenX,
+                    screenY: ev.screenY
+                };
+                triggerTouch('touchstart', ev);
+            }
+
+            // reset
+            if (ev.type == 'mouseup') {
+                multiTouchStartPos = null;
+                isMultiTouch = false;
+                eventTarget = null;
+            }
+        }
+    }
+
+    /**
+     * trigger a touch event
+     * @param eventName
+     * @param mouseEv
+     */
+    function triggerTouch(eventName, mouseEv) {
+        var touchEvent = document.createEvent('Event');
+        touchEvent.initEvent(eventName, true, true);
+
+        touchEvent.altKey = mouseEv.altKey;
+        touchEvent.ctrlKey = mouseEv.ctrlKey;
+        touchEvent.metaKey = mouseEv.metaKey;
+        touchEvent.shiftKey = mouseEv.shiftKey;
+
+        touchEvent.touches = getActiveTouches(mouseEv, eventName);
+        touchEvent.targetTouches = getActiveTouches(mouseEv, eventName);
+        touchEvent.changedTouches = getChangedTouches(mouseEv, eventName);
+
+        eventTarget.dispatchEvent(touchEvent);
+    }
+
+    /**
+     * create a touchList based on the mouse event
+     * @param mouseEv
+     * @returns {TouchList}
+     */
+    function createTouchList(mouseEv) {
+        var touchList = new TouchList();
+
+        if (isMultiTouch) {
+            var f = TouchEmulator.multiTouchOffset;
+            var deltaX = multiTouchStartPos.pageX - mouseEv.pageX;
+            var deltaY = multiTouchStartPos.pageY - mouseEv.pageY;
+
+            touchList.push(new Touch(eventTarget, 1, multiTouchStartPos, (deltaX*-1) - f, (deltaY*-1) + f));
+            touchList.push(new Touch(eventTarget, 2, multiTouchStartPos, deltaX+f, deltaY-f));
+        } else {
+            touchList.push(new Touch(eventTarget, 1, mouseEv, 0, 0));
+        }
+
+        return touchList;
+    }
+
+    /**
+     * receive all active touches
+     * @param mouseEv
+     * @returns {TouchList}
+     */
+    function getActiveTouches(mouseEv, eventName) {
+        // empty list
+        if (mouseEv.type == 'mouseup') {
+            return new TouchList();
+        }
+
+        var touchList = createTouchList(mouseEv);
+        if(isMultiTouch && mouseEv.type != 'mouseup' && eventName == 'touchend') {
+            touchList.splice(1, 1);
+        }
+        return touchList;
+    }
+
+    /**
+     * receive a filtered set of touches with only the changed pointers
+     * @param mouseEv
+     * @param eventName
+     * @returns {TouchList}
+     */
+    function getChangedTouches(mouseEv, eventName) {
+        var touchList = createTouchList(mouseEv);
+
+        // we only want to return the added/removed item on multitouch
+        // which is the second pointer, so remove the first pointer from the touchList
+        //
+        // but when the mouseEv.type is mouseup, we want to send all touches because then
+        // no new input will be possible
+        if(isMultiTouch && mouseEv.type != 'mouseup' &&
+            (eventName == 'touchstart' || eventName == 'touchend')) {
+            touchList.splice(0, 1);
+        }
+
+        return touchList;
+    }
+
+    /**
+     * show the touchpoints on the screen
+     */
+    function showTouches(ev) {
+        var touch, i, el, styles;
+
+        // first all visible touches
+        for(i = 0; i < ev.touches.length; i++) {
+            touch = ev.touches[i];
+            el = touchElements[touch.identifier];
+            if(!el) {
+                el = touchElements[touch.identifier] = document.createElement("div");
+                document.body.appendChild(el);
+            }
+
+            styles = TouchEmulator.template(touch);
+            for(var prop in styles) {
+                el.style[prop] = styles[prop];
+            }
+        }
+
+        // remove all ended touches
+        if(ev.type == 'touchend' || ev.type == 'touchcancel') {
+            for(i = 0; i < ev.changedTouches.length; i++) {
+                touch = ev.changedTouches[i];
+                el = touchElements[touch.identifier];
+                if(el) {
+                    el.parentNode.removeChild(el);
+                    delete touchElements[touch.identifier];
+                }
+            }
+        }
+    }
+
+    /**
+     * TouchEmulator initializer
+     */
+    function TouchEmulator() {
+        if (hasTouchSupport()) {
+            return;
+        }
+
+        fakeTouchSupport();
+
+        window.addEventListener("mousedown", onMouse('touchstart'), true);
+        window.addEventListener("mousemove", onMouse('touchmove'), true);
+        window.addEventListener("mouseup", onMouse('touchend'), true);
+
+        window.addEventListener("mouseenter", preventMouseEvents, true);
+        window.addEventListener("mouseleave", preventMouseEvents, true);
+        window.addEventListener("mouseout", preventMouseEvents, true);
+        window.addEventListener("mouseover", preventMouseEvents, true);
+
+        // it uses itself!
+        window.addEventListener("touchstart", showTouches, true);
+        window.addEventListener("touchmove", showTouches, true);
+        window.addEventListener("touchend", showTouches, true);
+        window.addEventListener("touchcancel", showTouches, true);
+    }
+
+    // start distance when entering the multitouch mode
+    TouchEmulator.multiTouchOffset = 75;
+
+    /**
+     * css template for the touch rendering
+     * @param touch
+     * @returns object
+     */
+    TouchEmulator.template = function(touch) {
+        var size = 0;
+        var transform = 'translate('+ (touch.clientX-(size/2)) +'px, '+ (touch.clientY-(size/2)) +'px)';
+        return {
+            position: 'fixed',
+            left: 0,
+            top: 0,
+            background: '#fff',
+            border: 'solid 1px #999',
+            opacity: .6,
+            borderRadius: '100%',
+            height: size + 'px',
+            width: size + 'px',
+            padding: 0,
+            margin: 0,
+            display: 'block',
+            overflow: 'hidden',
+            pointerEvents: 'none',
+            webkitUserSelect: 'none',
+            mozUserSelect: 'none',
+            userSelect: 'none',
+            webkitTransform: transform,
+            mozTransform: transform,
+            transform: transform,
+            zIndex: 100
+        }
+    };
+
+    // export
+    if (typeof define == "function" && define.amd) {
+        define(function() {
+            return TouchEmulator;
+        });
+    } else if (typeof module != "undefined" && module.exports) {
+        module.exports = TouchEmulator;
+    } else {
+        window[exportName] = TouchEmulator;
+    }
+})(window, document, "TouchEmulator");
\ No newline at end of file
diff --git a/static/custom/banner/1.svg b/static/custom/banner/1.svg
new file mode 100644
index 0000000..e74cca8
--- /dev/null
+++ b/static/custom/banner/1.svg
@@ -0,0 +1,158 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M555.325 288.652C498.694 276.011 344.293 257.365 260.686 304.458C218.061 328.467 208.72 358.67 256.049 382.403C306.21 407.555 422.581 412.203 550.12 374.727C692.577 332.867 599.607 298.536 555.325 288.652Z" fill="url(#paint0_linear)"/>
+<ellipse cx="169.476" cy="531.411" rx="89.4761" ry="16.5469" fill="#414E7C"/>
+<ellipse cx="633.54" cy="367.951" rx="52.6324" ry="10.5265" fill="#A7A7A7" fill-opacity="0.2"/>
+<ellipse cx="580.907" cy="239.24" rx="37.3212" ry="7.17715" fill="#A7A7A7" fill-opacity="0.14"/>
+<ellipse cx="436.407" cy="264.6" rx="44.9768" ry="8.61258" fill="#A7A7A7" fill-opacity="0.14"/>
+<path d="M447.499 246.844L451.693 252.403L450.02 253.336L445.94 248.124L437.623 249.307L445.241 247.198L441.161 241.986L432.518 240.964L440.348 240.712L434.543 231.442L441.907 239.431L444.973 231.879L442.72 240.705L446.8 245.917L451.751 239.289L447.499 246.844Z" fill="#F9759C"/>
+<ellipse rx="3.38407" ry="3.29434" transform="matrix(-0.95036 0.311153 0.311153 0.95036 452.58 239.403)" fill="#F9AEC5"/>
+<ellipse rx="3.38407" ry="3.29434" transform="matrix(-0.95036 0.311153 0.311153 0.95036 445.103 231.066)" fill="#F9AEC5"/>
+<ellipse rx="3.38407" ry="3.29434" transform="matrix(-0.95036 0.311153 0.311153 0.95036 433.958 230.864)" fill="#F9AEC5"/>
+<ellipse rx="3.38407" ry="3.29434" transform="matrix(-0.95036 0.311153 0.311153 0.95036 431.202 241.78)" fill="#F9AEC5"/>
+<ellipse rx="3.38407" ry="3.29434" transform="matrix(-0.95036 0.311153 0.311153 0.95036 436.307 250.123)" fill="#F9AEC5"/>
+<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="685" y="317" width="59" height="51">
+<ellipse cx="714.458" cy="342.673" rx="14.8779" ry="35.5618" transform="rotate(51.1954 714.458 342.673)" fill="#C4C4C4"/>
+</mask>
+<g mask="url(#mask0)">
+<ellipse cx="722.036" cy="351.879" rx="14.8779" ry="35.5618" transform="rotate(51.1954 722.036 351.879)" fill="#F9AEC5"/>
+</g>
+<mask id="mask1" mask-type="alpha" maskUnits="userSpaceOnUse" x="678" y="288" width="45" height="82">
+<ellipse cx="700.597" cy="329.005" rx="17.7673" ry="42.4682" transform="rotate(20.6409 700.597 329.005)" fill="#8D8D8D"/>
+</mask>
+<g mask="url(#mask1)">
+<ellipse cx="712.763" cy="333.588" rx="17.7673" ry="42.4682" transform="rotate(20.6409 712.763 333.588)" fill="#F9759C"/>
+</g>
+<path d="M682.032 231.158C683.727 237.493 682.51 240.074 683.582 241.985C683.985 242.704 683.577 244.316 682.767 244.162C681.113 243.849 679.686 242.6 678.398 240.693C676.439 237.793 677.013 237.228 675.461 231.386C673.91 225.544 668.695 221.851 667.068 221.539C674.145 220.492 680.336 224.823 682.032 231.158Z" fill="#6885EF" fill-opacity="0.5"/>
+<path d="M682.484 222.784C686.877 213.818 694.196 209.8 697.653 207.464C697.799 209.35 697.376 210.964 696.105 214.768C694.834 218.571 692.215 223.157 687.888 225.888C692.035 229.912 684.323 243.188 683.594 244.544C683.59 244.579 683.58 244.607 683.565 244.628C683.522 244.686 683.535 244.654 683.594 244.544C683.747 243.316 677.144 233.683 682.484 222.784Z" fill="#6885EF"/>
+<path d="M274.406 457.872C260.294 469.562 253.817 495.608 252 507C260.042 496.473 285.777 476.639 285.777 476.639C285.777 476.639 313.294 453.423 321.885 441.034C314.661 449.591 292.045 443.26 274.406 457.872Z" fill="#7F9AF8"/>
+<path d="M248.633 449.228C240.247 465.5 247.336 494.568 252 507C254.534 493.686 271.763 465.588 271.763 465.588C271.763 465.588 287.869 433.418 289.912 418C287.114 429.019 259.115 428.889 248.633 449.228Z" fill="#6785EF"/>
+<path d="M287.234 471.211C270.939 475.957 257.04 497.19 252 507C262.436 500.699 291.978 493.612 291.978 493.612C291.978 493.612 323.879 483.964 335.368 476.17C326.261 480.993 307.603 465.278 287.234 471.211Z" fill="#6785EF" fill-opacity="0.6"/>
+<path d="M464.5 235.5C464.5 200.405 460.398 156.187 420.5 137.5C380.602 118.813 330 129.5 310 175" stroke="#B2C3FF" stroke-width="2.78633" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="9.29 13.93"/>
+<path d="M603 215C603 162.354 576.54 105.61 504 85.5C431.46 65.3898 320.5 100.5 298.5 171.5" stroke="#B2C3FF" stroke-width="2.78633" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="9.29 13.93"/>
+<path d="M662 316C662 89.8555 353.5 91.5 322.5 178.5" stroke="#B2C3FF" stroke-width="2.78633" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="9.29 13.93"/>
+<path d="M252.763 169.97C253.922 164.636 259.28 161.332 264.567 162.692L350.631 184.822C355.753 186.139 358.853 191.342 357.573 196.474L312.221 378.335C310.932 383.504 305.69 386.643 300.525 385.338L219.912 364.981C214.879 363.71 211.76 358.677 212.862 353.605L252.763 169.97Z" fill="#F3F3F3"/>
+<rect x="254.306" y="160.879" width="105.477" height="202.617" rx="9.18838" transform="rotate(13.9638 254.306 160.879)" fill="white" stroke="#F3F3F3" stroke-width="0.875084"/>
+<path d="M247.318 187.166L252.787 188.526C255.601 189.226 257.315 192.074 256.615 194.888L247.833 230.207C247.133 233.021 244.285 234.735 241.471 234.035L236.001 232.676L247.318 187.166Z" fill="#BBCAFF" fill-opacity="0.48"/>
+<path d="M339.21 258.339L333.741 256.979C330.927 256.279 329.213 253.431 329.913 250.617L338.695 215.298C339.395 212.484 342.243 210.77 345.057 211.47L350.527 212.83L339.21 258.339Z" fill="#BBCAFF" fill-opacity="0.48"/>
+<path d="M325.652 253.872C324.952 256.686 322.104 258.4 319.289 257.7L253.902 241.441C251.088 240.741 249.374 237.893 250.074 235.079L260.877 191.633C261.576 188.819 264.425 187.105 267.239 187.805L332.626 204.064C335.44 204.764 337.154 207.612 336.455 210.426L325.652 253.872Z" fill="#334891"/>
+<rect x="279.869" y="225.469" width="29.7018" height="2.91996" rx="1.45998" transform="rotate(14.3109 279.869 225.469)" fill="#D2D9F1"/>
+<rect x="269.649" y="229.319" width="47.6042" height="2.91996" rx="1.45998" transform="rotate(14.3109 269.649 229.319)" fill="#D2D9F1"/>
+<rect x="237.447" y="251.156" width="93.7904" height="0.837414" transform="rotate(13.9638 237.447 251.156)" fill="#F3F3F3"/>
+<rect x="232.193" y="272.285" width="93.7904" height="0.837414" transform="rotate(13.9638 232.193 272.285)" fill="#F3F3F3"/>
+<rect x="226.939" y="293.415" width="93.7904" height="0.837414" transform="rotate(13.9638 226.939 293.415)" fill="#F3F3F3"/>
+<rect x="230.782" y="309.04" width="79.6276" height="23.4476" rx="11.7238" transform="rotate(13.9638 230.782 309.04)" fill="#F9759C"/>
+<circle cx="246.197" cy="264.55" r="6.69931" transform="rotate(13.9638 246.197 264.55)" fill="#B2C3FF"/>
+<circle cx="240.943" cy="285.679" r="6.69931" transform="rotate(13.9638 240.943 285.679)" fill="#B2C3FF"/>
+<rect x="257.974" y="262.301" width="61.9687" height="3.34966" transform="rotate(13.9638 257.974 262.301)" fill="#E2E2E2"/>
+<rect x="256.155" y="269.615" width="32.6591" height="3.34966" transform="rotate(13.9638 256.155 269.615)" fill="#E2E2E2"/>
+<rect x="252.72" y="283.43" width="61.9687" height="3.34966" transform="rotate(13.9638 252.72 283.43)" fill="#E2E2E2"/>
+<rect x="250.901" y="290.744" width="32.6591" height="3.34966" transform="rotate(13.9638 250.901 290.744)" fill="#E2E2E2"/>
+<rect x="243.868" y="350.262" width="32.6591" height="3.34966" transform="rotate(13.9638 243.868 350.262)" fill="#E2E2E2"/>
+<path d="M277.087 333.113C277.397 332.926 277.497 332.523 277.311 332.212L274.265 327.151C274.078 326.841 273.675 326.74 273.364 326.927C273.054 327.114 272.953 327.517 273.14 327.828L275.847 332.327L271.349 335.034C271.038 335.221 270.938 335.624 271.125 335.934C271.311 336.245 271.715 336.345 272.025 336.158L277.087 333.113ZM257.086 328.338L276.59 333.188L276.907 331.914L257.403 327.064L257.086 328.338Z" fill="white"/>
+<path d="M140.672 416.808C140.672 437.032 144.774 447.271 141.898 466.449C139.288 483.845 129.641 521.77 129.641 521.77C130.866 522.996 132.705 522.383 135.769 522.383C138.833 522.383 140.672 522.996 141.898 522.383L157.832 466.449L160.896 443.16L176.703 464.512L179.265 520.379C179.265 520.379 179.894 521.605 183.571 521.605C187.249 521.605 189.087 520.379 189.087 520.379C189.087 520.379 194.607 468.637 193.994 460.67C193.381 452.703 178.056 417.624 178.056 414.56V403.938H143.736C143.736 403.938 140.672 412.106 140.672 416.808Z" fill="#3C56C6"/>
+<path d="M128.525 427.949C127.913 425.498 127.912 421.004 128.525 418.757C130.16 417.531 133.428 415.447 133.428 416.918C133.428 418.757 135.267 421.208 137.105 425.498C138.576 428.93 136.492 431.626 133.428 432.239C130.364 432.852 129.138 430.401 128.525 427.949Z" fill="#FCD8E3"/>
+<path d="M156.606 331.622C156.606 332.602 155.789 336.116 155.38 337.75C156.197 338.771 158.567 340.814 161.509 340.814C164.45 340.814 166.82 339.18 167.637 338.363C167.229 336.116 166.779 331.622 168.25 331.622C169.721 331.622 172.54 329.17 173.766 327.944C174.379 324.267 172.54 315.075 171.927 306.495C171.314 297.915 160.283 294.851 155.38 298.528C150.477 302.205 148.639 309.559 148.639 316.3C148.639 323.042 156.606 330.396 156.606 331.622Z" fill="#FCD8E3"/>
+<path d="M257.222 323.685C255.648 326.285 251.567 330.515 249.129 331.896C248.458 331.797 245.578 337.781 245.578 337.781L240.063 332.878C240.063 332.878 243.1 329.57 243.405 329.266C244.975 327.709 245.511 324.062 247.617 318.858C248.275 317.232 251.134 312.614 252.32 312.041C254.171 311.146 253.425 313.222 255.997 316.944C258.569 320.666 258.797 321.085 257.222 323.685Z" fill="#FCD8E3"/>
+<path d="M177.984 408.796C177.984 408.796 146.8 411.137 143.736 406.234V387.662V369.618L137.105 386.275L134.041 417.531C132.406 418.961 128.525 419.369 127.912 417.531C127.077 415.026 124.235 384.437 124.848 380.76C125.461 377.083 139.556 348.892 139.556 348.892L151.703 341.427L154.155 336.524C154.972 337.137 156.974 337.137 160.896 337.137C164.818 337.137 168.046 337.137 168.863 336.524L170.089 341.427L182.958 345.104C182.958 345.104 205.021 359.813 207.472 359.813C209.924 359.813 234.438 337.75 234.438 337.75L239.953 332.234L246.695 337.75L242.405 345.104C242.405 345.104 212.988 378.811 209.924 378.811C206.86 378.811 180.507 367.78 180.507 367.78C180.099 367.78 179.281 371.089 179.281 374.521C179.281 384.346 177.984 408.796 177.984 408.796Z" fill="#B2C3FF"/>
+<path d="M170.089 341.427C167.147 343.388 156.197 342.653 151.09 342.04C151.907 339.997 153.664 336.034 154.155 336.524C154.767 337.137 158.445 337.137 161.509 337.137C163.96 337.137 167.433 336.729 168.863 336.524L170.089 341.427Z" fill="#B2C3FF"/>
+<path d="M176.83 530.185C176.83 529.695 177.851 523.444 178.669 520.379L189.7 520.379C191.722 523.413 198.116 526.313 201.344 527.121C203.305 527.611 203.387 530.185 203.183 531.411C198.484 532.023 193.867 532.023 188.474 532.023C181.733 532.023 176.83 530.798 176.83 530.185Z" fill="#2B3A7C"/>
+<path d="M127.189 529.682L129.641 520.49L141.898 521.102C143.123 523.554 152.316 526.005 154.767 527.844C156.729 529.315 153.95 531.725 152.316 532.747H136.995C134.053 532.747 129.232 530.704 127.189 529.682Z" fill="#2B3A7C"/>
+<path d="M147.413 316.913C147.903 319.365 153.337 326.515 155.993 329.783L164.573 329.17C164.777 326.106 165.186 319.365 165.186 316.913C165.186 314.462 168.863 311.398 170.702 310.172C171.723 309.355 173.888 307.353 174.379 305.882C174.991 304.043 173.153 296.689 170.702 295.463C168.74 294.483 167.024 295.872 166.412 296.689C166.003 295.872 164.328 293.87 160.896 292.399C156.606 290.561 153.542 295.463 148.639 299.141C143.736 302.818 146.8 313.849 147.413 316.913Z" fill="#3049A0"/>
+<path d="M443.106 259.124H481.384V265.504C481.384 265.504 479.064 267.823 462.245 267.823C445.426 267.823 443.106 265.504 443.106 265.504V259.124Z" fill="url(#paint1_linear)"/>
+<ellipse cx="462.245" cy="259.124" rx="19.1391" ry="2.89986" fill="#6885EF"/>
+<path d="M443.106 252.188H481.384V258.568C481.384 258.568 479.064 260.888 462.245 260.888C445.426 260.888 443.106 258.568 443.106 258.568V252.188Z" fill="url(#paint2_linear)"/>
+<ellipse cx="462.245" cy="252.188" rx="19.1391" ry="2.89986" fill="#6885EF"/>
+<path d="M443.106 245.49H481.384V251.869C481.384 251.869 479.064 254.189 462.245 254.189C445.426 254.189 443.106 251.869 443.106 251.869V245.49Z" fill="url(#paint3_linear)"/>
+<ellipse cx="462.245" cy="245.49" rx="19.1391" ry="2.89986" fill="#6885EF"/>
+<path d="M445.977 238.791H484.255V245.171C484.255 245.171 481.935 247.49 465.116 247.49C448.296 247.49 445.977 245.171 445.977 245.171V238.791Z" fill="url(#paint4_linear)"/>
+<ellipse cx="465.116" cy="238.791" rx="19.1391" ry="2.89986" fill="#6785EF"/>
+<path d="M586.116 234.59H618.658V240.013C618.658 240.013 616.686 241.986 602.387 241.986C588.088 241.986 586.116 240.013 586.116 240.013V234.59Z" fill="url(#paint5_linear)"/>
+<ellipse cx="602.387" cy="234.59" rx="16.2713" ry="2.46534" fill="#6885EF"/>
+<path d="M586.116 228.693H618.658V234.117C618.658 234.117 616.686 236.089 602.387 236.089C588.088 236.089 586.116 234.117 586.116 234.117V228.693Z" fill="url(#paint6_linear)"/>
+<ellipse cx="602.387" cy="228.693" rx="16.2713" ry="2.46534" fill="#6885EF"/>
+<path d="M586.116 222.998H618.658V228.422C618.658 228.422 616.686 230.394 602.387 230.394C588.088 230.394 586.116 228.422 586.116 228.422V222.998Z" fill="url(#paint7_linear)"/>
+<ellipse cx="602.387" cy="222.998" rx="16.2713" ry="2.46534" fill="#6885EF"/>
+<path d="M588.557 217.303H621.099V222.727C621.099 222.727 619.127 224.699 604.828 224.699C590.529 224.699 588.557 222.727 588.557 222.727V217.303Z" fill="url(#paint8_linear)"/>
+<ellipse cx="604.828" cy="217.303" rx="16.2713" ry="2.46534" fill="#6785EF"/>
+<path d="M630.668 358.475H685.86V367.674C685.86 367.674 682.515 371.019 658.264 371.019C634.013 371.019 630.668 367.674 630.668 367.674V358.475Z" fill="url(#paint9_linear)"/>
+<ellipse cx="658.264" cy="358.475" rx="27.5959" ry="4.18119" fill="#6885EF"/>
+<path d="M630.668 348.475H685.86V357.674C685.86 357.674 682.515 361.019 658.264 361.019C634.013 361.019 630.668 357.674 630.668 357.674V348.475Z" fill="url(#paint10_linear)"/>
+<ellipse cx="658.264" cy="348.475" rx="27.5959" ry="4.18119" fill="#6885EF"/>
+<path d="M630.668 338.816H685.86V348.015C685.86 348.015 682.515 351.36 658.264 351.36C634.013 351.36 630.668 348.015 630.668 348.015V338.816Z" fill="url(#paint11_linear)"/>
+<ellipse cx="658.264" cy="338.816" rx="27.5959" ry="4.18119" fill="#6885EF"/>
+<path d="M630.668 329.158H685.86V338.357C685.86 338.357 682.515 341.702 658.264 341.702C634.013 341.702 630.668 338.357 630.668 338.357V329.158Z" fill="url(#paint12_linear)"/>
+<ellipse cx="658.264" cy="329.158" rx="27.5959" ry="4.18119" fill="#6885EF"/>
+<path d="M634.808 319.499H690V328.698C690 328.698 686.655 332.043 662.404 332.043C638.153 332.043 634.808 328.698 634.808 328.698V319.499Z" fill="url(#paint13_linear)"/>
+<ellipse cx="662.404" cy="319.499" rx="27.5959" ry="4.18119" fill="#6785EF"/>
+<defs>
+<linearGradient id="paint0_linear" x1="368.421" y1="281.446" x2="398.02" y2="383.946" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6885EF"/>
+<stop offset="1" stop-color="#F9AEC5"/>
+</linearGradient>
+<linearGradient id="paint1_linear" x1="443.106" y1="265.504" x2="481.384" y2="265.504" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint2_linear" x1="443.106" y1="258.568" x2="481.384" y2="258.568" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint3_linear" x1="443.106" y1="251.869" x2="481.384" y2="251.869" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint4_linear" x1="445.977" y1="245.171" x2="484.255" y2="245.171" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint5_linear" x1="586.116" y1="240.013" x2="618.658" y2="240.013" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint6_linear" x1="586.116" y1="234.117" x2="618.658" y2="234.117" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint7_linear" x1="586.116" y1="228.422" x2="618.658" y2="228.422" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint8_linear" x1="588.557" y1="222.727" x2="621.099" y2="222.727" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint9_linear" x1="630.668" y1="367.674" x2="685.86" y2="367.674" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint10_linear" x1="630.668" y1="357.674" x2="685.86" y2="357.674" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint11_linear" x1="630.668" y1="348.015" x2="685.86" y2="348.015" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint12_linear" x1="630.668" y1="338.357" x2="685.86" y2="338.357" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+<linearGradient id="paint13_linear" x1="634.808" y1="328.698" x2="690" y2="328.698" gradientUnits="userSpaceOnUse">
+<stop stop-color="#6785EF"/>
+<stop offset="0.497238" stop-color="#B2C3FF"/>
+<stop offset="1" stop-color="#6785EF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/static/custom/banner/2.svg b/static/custom/banner/2.svg
new file mode 100644
index 0000000..5232951
--- /dev/null
+++ b/static/custom/banner/2.svg
@@ -0,0 +1,88 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="800" height="600" fill="white"/>
+<path d="M206.03 318.295C255.644 373.316 297.609 331.04 345.764 308.01C429.637 267.898 525.767 367.349 568.911 314.169C600.865 274.783 572.639 173.314 505.265 126.279C446.591 85.3189 380.892 85.768 303.441 119.185C220.951 154.776 152.636 259.083 206.03 318.295Z" fill="url(#paint0_linear)" fill-opacity="0.15"/>
+<path d="M551.936 353.75C548.329 384.353 557.322 424.824 562.51 439.195L559.246 445.491C554.131 426.624 544.574 381.765 548.615 353.279C553.81 316.667 571.008 286.975 580.561 271.376L581.642 273.308C573.404 286.011 555.928 319.884 551.936 353.75Z" fill="#FFBDD1"/>
+<path d="M575.159 378.114C557.131 396.319 558.66 425.955 561.678 438.497C569.864 424.135 580.225 403.988 601.765 390.476C626.418 375.01 639.832 356.584 647.96 340.063C640.121 352.035 597.694 355.357 575.159 378.114Z" fill="#7795FF" fill-opacity="0.7"/>
+<path d="M579.022 353.795C560.994 372 559.426 415.277 562.444 427.819C570.631 413.458 583.76 388.982 605.444 371.319C627.234 353.57 640.742 329.102 641.526 311.816C632.444 326.819 601.557 331.038 579.022 353.795Z" fill="#7795FF" fill-opacity="0.7"/>
+<path d="M563.9 358.66C548.514 387.638 555.924 424.528 561.552 439.35C567.345 418.5 582.612 386.492 597.99 366.932C617.128 342.591 622.135 309.375 627.445 285.819C621.549 303.539 583.132 322.438 563.9 358.66Z" fill="#5970C4"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M637.325 181.106C629.692 190.562 615.454 211.236 609.881 222.035C615.525 213.075 629.168 192.517 638.592 181.962L638.511 181.77C643.042 185.079 644.755 196.265 638.575 219.176C633.127 218.218 627.347 217.864 623.601 218.724C626.858 218.86 632.559 219.436 638.147 220.736C636.872 225.308 635.292 230.329 633.37 235.828C632.746 237.613 632.066 239.345 631.334 241.025C626.918 238.465 622.22 236.384 618.769 235.876C621.561 237.104 626.211 239.471 630.704 242.433C627.455 249.487 623.298 255.6 618.645 260.863C614.45 257.542 609.824 254.634 606.326 253.615C608.997 255.255 613.446 258.346 617.606 262.015C602.264 278.701 582.014 286.496 571.015 288.518C571.014 287.056 570.987 285.576 570.959 284.069C570.789 274.938 570.6 264.798 576.259 251.557C576.892 250.076 577.567 248.588 578.279 247.096C581.328 249.233 584.092 252.444 585.374 254.211C584.521 251.546 581.599 248.189 578.84 245.938C584.38 234.632 592.01 223.184 599.873 213.108C602.484 215.184 604.764 217.862 605.893 219.418C605.165 217.145 602.933 214.369 600.581 212.205C601.982 210.427 603.389 208.693 604.791 207.013C607.659 209.14 610.215 212.123 611.433 213.802C610.648 211.35 608.114 208.314 605.565 206.091C617.177 192.323 628.32 182.337 633.019 181.001C634.558 180.563 636.024 180.575 637.325 181.106Z" fill="#FFBDD1"/>
+<path d="M539.493 155.987V359.592H536.216L434.618 294.045L433.799 96.1753H438.305L539.493 155.987Z" fill="#213375"/>
+<path d="M431.341 295.684L433.799 96.1753L536.216 157.626V359.592L431.341 295.684Z" fill="#3E5193"/>
+<path d="M518.19 169.916V373.521H514.913L413.315 307.974L412.496 110.104H417.002L518.19 169.916Z" fill="#4F70E4"/>
+<path d="M410.038 309.612L412.496 110.104L514.913 171.554V373.521L410.038 309.612Z" fill="#6785EF"/>
+<path d="M496.888 184.664V388.269H493.61L392.012 322.722L391.193 124.852H395.699L496.888 184.664Z" fill="#B2C3FF"/>
+<path d="M388.735 324.361L391.193 124.852L493.61 186.302V388.269L388.735 324.361Z" fill="#E8EDFF"/>
+<path d="M396.928 176.88V143.287L487.465 196.134V231.366L396.928 176.88Z" fill="white" fill-opacity="0.3"/>
+<ellipse cx="409.182" cy="168.079" rx="5.93676" ry="10.3112" transform="rotate(-1.59497 409.182 168.079)" fill="white"/>
+<path d="M419.87 167.867V165L448.956 182.615V185.483L419.87 167.867Z" fill="#B2C3FF"/>
+<path d="M419.87 182.206V179.338L436.257 189.58V192.447L419.87 182.206Z" fill="#B2C3FF"/>
+<path d="M419.87 174.832V171.964L457.969 195.315V198.183L419.87 174.832Z" fill="#B2C3FF"/>
+<path d="M472.963 204.796L472.307 208.307L475.913 214.979L482.14 204.796L481.812 200.231L475.913 210.765L472.963 204.796Z" fill="#6785EF"/>
+<path d="M396.928 217.437V183.844L487.465 236.691V271.923L396.928 217.437Z" fill="white" fill-opacity="0.3"/>
+<ellipse cx="409.182" cy="208.636" rx="5.93676" ry="10.3112" transform="rotate(-1.59497 409.182 208.636)" fill="white"/>
+<path d="M419.87 208.424V205.557L448.956 223.172V226.04L419.87 208.424Z" fill="#B2C3FF"/>
+<path d="M419.87 222.763V219.895L436.257 230.137V233.004L419.87 222.763Z" fill="#B2C3FF"/>
+<path d="M419.87 215.389V212.521L457.969 235.872V238.74L419.87 215.389Z" fill="#B2C3FF"/>
+<path d="M472.963 245.353L472.307 248.864L475.913 255.536L482.14 245.353L481.812 240.788L475.913 251.322L472.963 245.353Z" fill="#6785EF"/>
+<path d="M396.928 259.223V225.63L487.465 278.478V313.709L396.928 259.223Z" fill="white" fill-opacity="0.3"/>
+<ellipse cx="409.182" cy="250.422" rx="5.93676" ry="10.3112" transform="rotate(-1.59497 409.182 250.422)" fill="white"/>
+<path d="M419.87 250.211V247.343L448.956 264.959V267.826L419.87 250.211Z" fill="#B2C3FF"/>
+<path d="M419.87 264.549V261.681L436.257 271.923V274.791L419.87 264.549Z" fill="#B2C3FF"/>
+<path d="M419.87 257.175V254.307L457.969 277.658V280.526L419.87 257.175Z" fill="#B2C3FF"/>
+<path d="M472.963 287.139L472.307 290.651L475.913 297.322L482.14 287.139L481.812 282.574L475.913 293.109L472.963 287.139Z" fill="#6785EF"/>
+<path d="M396.928 301.009V267.417L487.465 320.264V355.495L396.928 301.009Z" fill="white" fill-opacity="0.3"/>
+<ellipse cx="409.182" cy="292.208" rx="5.93676" ry="10.3112" transform="rotate(-1.59497 409.182 292.208)" fill="#C4C4C4"/>
+<path d="M419.87 291.997V289.129L448.956 306.745V309.612L419.87 291.997Z" fill="#B2C3FF"/>
+<path d="M419.87 306.335V303.467L436.257 313.709V316.577L419.87 306.335Z" fill="#B2C3FF"/>
+<path d="M419.87 298.961V296.093L457.969 319.444V322.312L419.87 298.961Z" fill="#B2C3FF"/>
+<path d="M472.963 328.925L472.307 332.437L475.913 339.109L482.14 328.925L481.812 324.36L475.913 334.895L472.963 328.925Z" fill="#C4C4C4"/>
+<ellipse cx="483.96" cy="334.115" rx="18.3015" ry="30.1759" transform="rotate(-1.59497 483.96 334.115)" fill="#EE7298"/>
+<ellipse cx="480.79" cy="334.115" rx="18.3015" ry="30.1759" transform="rotate(-1.59497 480.79 334.115)" fill="#F796B3"/>
+<path d="M478.223 346.254V320.854L481.091 322.493V347.892L478.223 346.254Z" fill="white"/>
+<path d="M471.669 331.505V328.228L488.875 338.88V341.747L471.669 331.505Z" fill="white"/>
+<ellipse cx="265.5" cy="434.5" rx="77.5" ry="31.5" fill="#F3F3F3"/>
+<path d="M226.506 343.615C226.507 341.297 227.599 337.606 228.965 333.783V328.867H233.881C233.881 330.505 233.389 334.438 234.7 335.422C236.011 336.405 237.158 346.483 237.158 348.531C237.158 350.579 234.7 347.712 234.7 347.712C234.372 352.955 231.832 352.628 229.784 352.628C226.916 352.628 226.506 346.073 226.506 343.615Z" fill="#FCD8E3"/>
+<path d="M359.006 201.581L352.684 207.009L357.2 213.34L361.264 208.365C362.468 207.31 365.238 205.199 366.683 205.199C368.489 205.199 373.456 198.868 375.714 195.249C377.972 191.631 374.36 183.49 373.456 183.038C372.553 182.586 363.522 193.893 363.07 195.249C362.709 196.335 360.21 199.923 359.006 201.581Z" fill="#FCD8E3"/>
+<path d="M249.448 377.208L240.025 414.897C239.479 415.853 238.715 418.338 240.025 420.633C241.336 422.927 246.853 421.588 249.448 420.633L266.244 377.208L276.896 343.615L287.137 366.147L282.221 413.258H290.415L306.392 366.147L292.463 313.299C289.049 314.119 279.517 316.167 276.896 317.806C274.274 319.444 262.148 318.489 256.412 317.806L249.448 377.208Z" fill="#293354"/>
+<path d="M280.583 421.861L282.221 412.849C286.482 414.16 290.005 412.303 290.824 411.21C292.463 415.143 301.339 419.13 306.392 420.632L305.572 425.139C302.978 425.412 298.444 425.794 294.511 425.139C290.578 424.483 283.314 422.681 280.583 421.861Z" fill="#0E1737"/>
+<path d="M227.735 299.371L226.916 332.554H236.338L243.712 303.467L256.002 282.165L258.46 295.274C258.46 298.224 256.822 312.07 256.002 318.625C258.051 319.035 264.032 320.018 271.57 320.673C279.108 321.329 290.824 315.484 295.74 312.48C295.74 309.203 293.692 290.358 295.74 287.49C297.789 284.623 297.789 269.875 298.608 263.32C299.263 258.076 319.911 249.118 325.236 245.704L360.468 213.34C360.14 211.046 355.415 206.376 353.094 204.328L348.178 208.015L314.585 229.727L287.547 242.017C286.181 245.841 283.041 251.931 278.125 252.259C273.209 252.587 268.156 249.391 266.654 246.523L243.712 260.862L227.735 299.371Z" fill="#6885EF"/>
+<path d="M271.98 235.872C271.98 237.839 271.433 243.383 270.751 244.885C272.799 246.797 277.633 250.456 280.583 249.801C283.532 249.145 284.816 243.246 285.089 240.379C284.106 238.412 284.679 235.189 285.089 233.824C285.417 231.857 288.776 228.908 290.415 227.679C291.234 225.221 286.728 214.569 286.318 213.34C285.908 212.111 285.499 205.147 276.896 203.508C268.293 201.87 263.377 209.244 262.147 212.521C260.918 215.798 262.147 225.221 267.473 230.137C271.734 234.07 271.98 234.916 271.98 235.872Z" fill="#FCD8E3"/>
+<path d="M265.834 248.572L269.112 243.656L279.354 246.523L285.089 239.559L287.957 243.656L285.089 251.849L283.041 249.947C282.767 250.171 281.975 250.784 280.992 251.439C280.009 252.095 278.484 252.259 277.844 252.259L277.305 254.307L265.834 248.572Z" fill="#A4B6F5"/>
+<path d="M258.46 217.027C259.444 222.271 266.517 229.59 269.931 232.595C268.292 229.645 267.883 222.626 267.883 219.485C267.227 215.88 269.521 211.429 270.75 209.653C273.045 207.687 279.627 207.742 282.631 208.015C284.27 208.015 285.499 205.83 285.908 204.737C287.547 199.412 280.992 197.363 276.486 195.315C271.979 193.267 263.786 201.87 261.328 203.508C258.87 205.147 257.231 210.473 258.46 217.027Z" fill="#7D7D7D"/>
+<path d="M241.087 449.154C235.873 448.515 234.524 438.606 235.986 433.427C237.448 428.247 238.3 423.894 239.381 419.228C239.75 419.598 241.138 420.418 243.745 420.738C246.353 421.057 248.169 420.631 248.752 420.377C248.222 424.697 249.616 426.816 250.073 433.206C250.53 439.595 247.606 449.954 241.087 449.154Z" fill="#0E1737"/>
+<ellipse cx="391.5" cy="503.5" rx="77.5" ry="31.5" fill="#F3F3F3"/>
+<path d="M394.962 428.527C392.963 422.253 390.213 406.067 389.439 395.834L414.037 394L414.037 445.564L406.477 495.733C404.892 497.221 403.322 497.152 401.876 496.348C400.856 490.668 396.161 472.257 395.57 466.513C394.98 460.768 398.722 449.506 400.666 444.592C400.725 443.92 396.962 434.8 394.962 428.527Z" fill="#FCD8E3"/>
+<path d="M376.518 411.765C375.379 405.875 375.106 390.1 375.698 380.908L396.5 380.908L390 424.968L375.873 470.702C374.114 471.756 372.207 471.203 370.889 470.249C370.637 465.049 370.682 448.718 370.861 443.532C371.04 438.346 376.218 428.995 378.785 424.968C378.932 424.382 377.656 417.655 376.518 411.765Z" fill="#FCD8E3"/>
+<path d="M406.969 491.804C404.886 493.039 401.863 491.668 400.611 490.828C399.512 496.704 397.719 508.906 399.336 510.708C401.356 512.961 408.584 512.127 413.883 512.293C418.122 512.425 421.709 511.895 422.449 510.929C422.682 509.411 422.099 508.069 421.778 507.589C420.525 508.044 418.322 506.498 415.529 505.422C410.532 503.497 407.8 495.385 406.969 491.804Z" fill="#E1A7B9"/>
+<path d="M377.024 467.531C374.255 469.179 371.915 468.218 371.091 467.531C370.432 473.022 369.212 484.52 369.608 486.579C370.102 489.153 371.091 490.183 375.046 490.183C379.001 490.183 384.934 487.094 384.934 485.549C384.934 484.314 383.945 482.289 383.451 481.431C381.473 482.255 379.99 480.401 379.496 479.372C378.309 478.548 377.353 471.135 377.024 467.531Z" fill="#E1A7B9"/>
+<path d="M374.518 372C374.518 363.664 378.595 355.185 381.313 352.467L384.032 350.202C393.545 350.504 415 341.5 411.579 355.638C410.396 360.532 410.975 366.99 411.579 368.5C414 386.13 416 399.5 422 415.5C420.188 418.037 410.637 422.255 402.5 423.5C382.646 426.537 372.002 417.726 367.576 414.063L367.5 414C367.5 414 369.409 406.143 370.5 401C373.664 386.081 374.518 382.42 374.518 372Z" fill="#3C56C6"/>
+<path d="M364.757 355.228L364.757 351.561H369.716V355.752C369.716 356.276 370.113 358.057 371.7 360.99C373.287 363.924 371.039 369.198 370.212 371.468C369.419 373.563 367.237 371.642 366.245 370.42C366.245 368.848 363.766 364.134 363.27 362.038C362.873 360.362 364.096 356.8 364.757 355.228Z" fill="#FCD8E3"/>
+<path d="M466.094 333.618C464.078 334.022 458.868 337.821 456.516 339.671L458.028 345.219C460.045 344.714 464.884 343.706 468.111 343.706C471.337 343.706 472.816 342.024 473.152 341.184C473.992 338.662 475.37 333.316 474.16 332.105C472.648 330.592 468.615 333.114 466.094 333.618Z" fill="#FCD8E3"/>
+<path d="M398.439 294.045C395.817 297.65 394.479 297.596 393.523 297.322V302.648C393.523 303.468 396.8 306.745 401.716 309.613C405.649 311.907 412.094 307.564 414.825 305.106C411.876 303.795 408.68 299.371 411.138 294.045C411.138 294.045 413.596 293.635 414.825 291.177C416.054 288.719 418.594 284.869 420.561 277.658C423.019 268.646 415.235 262.091 408.68 260.862C402.126 259.633 397.784 264.068 395.981 270.284C394.598 275.05 395.121 281.461 398.439 285.442C400.487 287.9 401.061 290.44 398.439 294.045Z" fill="#FCD8E3"/>
+<path d="M381.853 340.062C383.445 346.431 378.682 356.477 378.682 356.477C388.649 367.803 407.676 367.369 409.488 364.651C411.3 361.933 411.579 355.957 412.938 347.696C412.938 347.696 417.695 333.893 415.204 328.91C418.828 336.158 428.881 350.202 434.77 353.826C436.383 354.818 460.14 345.219 460.14 345.219C460.502 341.957 458.63 340.688 457.422 338.423L435.05 341.141C435.05 341.141 430.373 333.413 426.529 318.037C424.264 308.976 416.5 312.5 414.384 303.54C413.327 306.107 405.777 309.158 400.34 306.258C394.904 303.359 396.547 301.067 397 298.5C397 298.5 396.5 300.572 390.5 301C386.963 301.252 384.128 300.373 380 303C375.017 306.171 368.073 317.864 365.564 331.001C364.179 338.25 364.917 355.465 364.917 355.465C364.917 355.465 370.807 359.089 370.807 353.2C371.713 350.481 373.265 337.344 373.265 337.344C373.265 337.344 376.243 328.283 381.227 319.676C381.227 326.924 380.041 332.813 381.853 340.062Z" fill="#FFBDD1"/>
+<path d="M392.607 272.627C393.96 263.829 401.905 258.245 405.709 256.554C407.54 255.708 412.725 255.2 418.81 259.937C424.896 264.675 423.037 272.909 421.346 276.433C418.641 281.171 417.965 295.326 417.965 301.812C415.26 297.751 415.429 287.995 415.852 283.624C413.739 289.123 415.007 294.621 415.007 298.005C415.007 301.389 419.233 313.655 417.965 314.501C416.951 315.178 413.034 316.757 411.203 317.462L409.513 301.812V318.308C408.245 319.577 401.483 320 399.792 320C398.44 320 399.229 312.668 399.792 309.003L397.679 318.308C392.269 318.646 386.972 313.655 385 311.117C387.958 308.157 390.917 283.624 392.607 272.627Z" fill="#3C56C6"/>
+<mask id="mask0" mask-type="alpha" maskUnits="userSpaceOnUse" x="127" y="370" width="77" height="52">
+<ellipse rx="18.6593" ry="41.8762" transform="matrix(-0.382131 0.924108 0.894002 0.448064 165.568 395.526)" fill="#F4A0D7"/>
+</mask>
+<g mask="url(#mask0)">
+<ellipse rx="18.6593" ry="41.8762" transform="matrix(-0.382131 0.924108 0.894002 0.448064 160.351 408.143)" fill="#BECCFF"/>
+</g>
+<mask id="mask1" mask-type="alpha" maskUnits="userSpaceOnUse" x="150" y="343" width="58" height="77">
+<ellipse rx="17.8734" ry="43.7911" transform="matrix(-0.763594 0.645697 0.572183 0.820126 178.804 381.455)" fill="#C4C4C4"/>
+</mask>
+<g mask="url(#mask1)">
+<ellipse rx="17.8734" ry="43.7911" transform="matrix(-0.763594 0.645697 0.572183 0.820126 168.818 389.899)" fill="#8FA6F9"/>
+</g>
+<mask id="mask2" mask-type="alpha" maskUnits="userSpaceOnUse" x="183" y="344" width="32" height="79">
+<ellipse rx="14.9385" ry="39.1982" transform="matrix(-0.991057 0.133443 0.110413 0.993886 198.867 383.034)" fill="#8D8D8D"/>
+</mask>
+<g mask="url(#mask2)">
+<ellipse rx="14.9385" ry="39.1982" transform="matrix(-0.991057 0.133443 0.110413 0.993886 188.035 384.492)" fill="#6785EF"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear" x1="569.849" y1="192.399" x2="185.105" y2="265.196" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FFBDD1"/>
+<stop offset="1" stop-color="#7795FF" stop-opacity="0.58"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/static/custom/banner/3.svg b/static/custom/banner/3.svg
new file mode 100644
index 0000000..ff3e4c7
--- /dev/null
+++ b/static/custom/banner/3.svg
@@ -0,0 +1,56 @@
+<svg width="800" height="600" viewBox="0 0 800 600" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M639.283 312.28C615.028 371.143 555.549 366.891 499.991 384.891C454.73 399.555 419.004 442.234 329.415 434.188C239.827 426.141 166.339 345.333 191.195 255.79C216.051 166.248 321.613 114.787 451.123 170.935C580.633 227.083 663.539 253.417 639.283 312.28Z" fill="url(#paint0_linear)"/>
+<ellipse cx="501" cy="457" rx="98" ry="7" fill="#414E7C"/>
+<rect x="399.567" y="130.459" width="172.112" height="257.364" rx="18.0861" fill="#B2C3FF"/>
+<rect x="397.142" y="127.544" width="172.112" height="257.364" rx="18.0861" fill="url(#paint1_linear)"/>
+<ellipse cx="483.198" cy="256.656" rx="60.8689" ry="62.4043" fill="white"/>
+<path d="M474.802 250.201C474.802 256.965 465.567 260.099 462.628 260.96C466.266 264.116 475.725 270.428 484.457 270.428C493.189 270.428 499.849 264.116 502.088 260.96C499.429 259.382 492.853 255.021 492.853 250.201V240.302H474.802V250.201Z" fill="#FCD8E3"/>
+<path d="M439.54 279.681V300.124C439.54 300.124 452.134 318.63 484.877 318.63C517.62 318.63 525.596 300.124 525.596 300.124C526.436 292.377 527.611 287.256 525.596 279.681C523.581 272.107 505.756 260.443 497.5 257C495.541 260.156 489.724 265 482 265C474.276 265 472.319 260.156 470.5 257C470.5 257 439.54 271.418 439.54 279.681Z" fill="#B2C3FF"/>
+<path d="M466.146 211.103C465.16 200.68 473.358 191.67 483.828 191.67C494.144 191.67 502.29 200.43 501.541 210.719L499.793 234.738C499.194 242.969 492.342 249.34 484.09 249.34C475.969 249.34 469.18 243.163 468.415 235.079L466.146 211.103Z" fill="#FCD8E3"/>
+<path d="M468.085 229.973C466.266 226.387 462.628 210.434 464.307 202.86C466.406 193.391 489.075 186.936 487.815 181.771C492.433 183.923 502.088 194.424 502.088 207.163C502.088 219.479 500.833 223.556 500.264 226.564C500.198 227.529 500.103 228.393 499.989 229.112C499.989 228.235 500.097 227.445 500.264 226.564C500.681 220.407 499.887 210.14 494.952 207.163C487.815 202.86 479.42 201.705 471.863 207.163C465.986 211.409 466.966 226.485 468.085 229.973Z" fill="#F9759C"/>
+<rect x="430.725" y="171.442" width="4.19785" height="19.7972" fill="#D84AA8"/>
+<rect x="430.725" y="175.746" width="4.30375" height="19.3101" transform="rotate(-90 430.725 175.746)" fill="#D84AA8"/>
+<rect width="4.19785" height="19.7972" transform="matrix(-1 0 0 1 536.51 171.442)" fill="#D84AA8"/>
+<rect width="4.30375" height="19.3101" transform="matrix(4.37114e-08 -1 -1 -4.37114e-08 536.51 175.746)" fill="#D84AA8"/>
+<rect width="4.19785" height="21.5187" transform="matrix(1 0 0 -1 430.725 331.541)" fill="#D84AA8"/>
+<rect width="4.67798" height="19.3101" transform="matrix(-4.02145e-08 1 1 4.75124e-08 430.725 326.863)" fill="#D84AA8"/>
+<rect x="536.51" y="331.541" width="4.19785" height="21.5187" transform="rotate(-180 536.51 331.541)" fill="#D84AA8"/>
+<rect x="536.51" y="326.863" width="4.67798" height="19.3101" transform="rotate(90 536.51 326.863)" fill="#D84AA8"/>
+<rect x="452.553" y="343.592" width="61.2887" height="6.02524" rx="3.01262" fill="#D2D9F1"/>
+<rect x="434.083" y="356.503" width="98.2298" height="6.02524" rx="3.01262" fill="#D2D9F1"/>
+<rect x="408.896" y="136.151" width="28.5454" height="23.2402" rx="3.61722" fill="#ABB8E7"/>
+<rect x="424.848" y="143.037" width="13.4331" height="8.60749" rx="0.904306" fill="#DBE1F4"/>
+<ellipse cx="568.673" cy="129" rx="28.2865" ry="30" fill="#6386FF"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M584.279 121.963L565.604 142L555.018 130.642L557.779 127.679L565.604 136.074L581.518 119L584.279 121.963Z" fill="white"/>
+<ellipse cx="335.5" cy="515.296" rx="84.5" ry="11.0291" fill="#414E7C"/>
+<path d="M305.098 507.932V491.78L306.232 484.553L315.303 485.097L310.838 507.932H305.098Z" fill="#FCD8E3"/>
+<path d="M357.041 502.255L354.718 480.075L364.871 479.097L364.373 501.548L357.041 502.255Z" fill="#FCD8E3"/>
+<path d="M303.965 515.544C303.965 506.845 305.098 498.146 305.098 498.146C306.799 499.233 310.201 499.233 312.468 498.146C312.468 501.951 313.602 507.388 315.87 508.476L315.87 508.476C318.137 509.563 318.137 509.563 318.137 511.738C318.137 513.913 314.169 515.544 314.169 515.544H303.965Z" fill="#6885EF"/>
+<path d="M378.528 509.442C372.292 511.073 362.277 510.892 355.852 510.529L356.219 494.146C360.954 495.233 364.355 493.602 364.355 494.146C364.355 494.689 366.056 504.005 372.859 505.636C378.301 506.941 378.717 508.717 378.528 509.442Z" fill="#6885EF"/>
+<path d="M327.208 441.058C327.208 444.973 317.759 477.765 313.035 493.894C309.407 495.199 305.287 494.438 303.965 493.894L310.767 441.058C309.634 428.01 313.035 386.363 313.035 380.709C313.035 375.054 315.303 364.217 315.303 359.505H357.82C359.521 380.709 372 428.846 372 434.5C372 440.154 366.056 489.807 366.056 489.807C366.056 489.807 356.986 490.713 354.718 489.807C354.718 487.088 355.364 455.194 352.718 441.058L333.443 407.35C332.121 416.049 327.208 437.144 327.208 441.058Z" fill="#3C56C6"/>
+<path d="M402.771 296.338C400.957 300.253 400.882 305.943 401.071 308.299C402.582 309.749 405.606 312.323 405.606 311.018C405.606 309.387 410.708 308.299 412.409 303.95C413.769 300.47 420.345 291.989 415.81 288.726C414.109 286.008 405.039 291.445 402.771 296.338Z" fill="#FCD8E3"/>
+<path d="M295.388 387.118C295.19 382.822 296.671 378.272 295.409 376.212C293.387 375.518 294.254 374.234 290.888 375.564C290.237 375.821 286.411 381.189 286.912 385.834C287.313 389.549 285.855 394.655 291.416 395.752C294.216 395.816 295.636 392.489 295.388 387.118Z" fill="#FCD8E3"/>
+<path d="M353.852 340.476C354.759 342.65 370.859 367.116 378.795 379.078L382 377.192L356.119 336.67C354.986 337.032 352.945 338.301 353.852 340.476Z" fill="#4066EA"/>
+<path d="M328.341 279.039C328.341 282.518 327.019 290.819 325.507 292.087C327.019 294.262 331.062 298.612 335.144 298.612C340.246 298.612 345.348 293.718 343.081 292.087C341.267 290.782 341.567 281.214 341 279.039C337.977 277.589 328.341 275.559 328.341 279.039Z" fill="#FCD8E3"/>
+<path d="M341.869 282.676L336.284 283.836C333.064 284.271 323.789 271.565 322.845 264.215C321.9 256.865 321.965 248.88 338.062 246.706C354.159 244.532 348.151 276.344 347.393 278.939C346.786 281.015 343.457 282.296 341.869 282.676Z" fill="#FCD8E3"/>
+<path d="M313.849 259.264C314.625 266.18 324.24 275.606 326.857 278.595C329.856 279.9 334.181 277.773 334.181 277.773C335.293 275.824 335.301 268.087 335.664 265.57C336.306 261.122 339.811 255.237 343.84 252.009C351.691 245.718 342.953 233.932 342.548 230.33C338.969 234.015 336.958 236.429 326.254 237.63C313.86 239.021 312.879 250.62 313.849 259.264Z" fill="#F9759C"/>
+<path d="M292.696 337.8L288.5 377.5H295.979C298 369.217 304.662 351.089 305.516 347C306.371 342.911 313.344 330.627 315.303 326.027C315.303 328.412 317.069 338.405 317.069 345.766C317.069 354.966 313.38 363.595 313.38 369.217C313.38 374.84 320.122 379 329.203 379C338.285 379 359.018 373.348 359.018 369.258V348.62V326.027C363.47 333.864 369.198 339.121 376.035 339.121C382.873 339.121 402.246 323.175 406.876 309.545L401 307.5L376.035 322.765C370.337 313.905 360.659 295.674 355.531 293.63C349.12 291.074 344.887 291.585 342.75 291.585C340.614 291.585 341.148 296.186 334.203 296.186C327.259 296.186 327.259 291.585 325.656 291.585C324.374 291.585 317.069 293.63 312.261 296.186C307.453 298.741 292.696 337.8 292.696 337.8Z" fill="#B2C3FF"/>
+<path d="M370 385L367.457 387.233C361.776 382.785 347.283 362.382 336 339C328.367 323.183 322.5 306 318.704 293.478C318.893 293.113 319.299 293.048 321 292.5C322.701 291.952 323.617 291.65 323.806 291.833C324.94 297.316 326.771 310.843 340.246 336.792C351 357.5 366.032 379.883 370 385Z" fill="#6885EF"/>
+<path d="M369.725 384.515L366.323 385.602L371.426 423.66L387.299 420.398L379.929 402.456L382.764 400.282L369.725 384.515Z" fill="#4066EA"/>
+<path d="M369.725 384.515L382.197 376.903L394.668 389.951L393.111 391.303L399.771 403.544L387.299 420.398L379.929 402.456L382.764 400.282L369.725 384.515Z" fill="#6885EF"/>
+<path d="M202.637 482.668C164.215 472.088 158.637 459.374 138.154 459.374C147.137 449.668 203.514 430.607 230.191 466.168C256.868 501.728 251.984 513.764 251.984 513.764C251.984 513.764 237.137 492.168 202.637 482.668Z" fill="#FEC6D7"/>
+<path d="M190.551 443C122.051 397.5 131.551 317 131.551 317C146.551 377 230.135 376.661 251.419 427.363C272.704 478.066 251.419 514.224 251.419 514.224C251.419 514.224 259.051 488.5 190.551 443Z" fill="#6386FF"/>
+<path d="M611.245 359.362C591.505 389.281 593.179 437.986 596.483 458.598C605.447 434.995 616.792 401.886 640.378 379.678C667.372 354.262 682.059 323.979 690.959 296.828C682.376 316.504 635.92 321.964 611.245 359.362Z" fill="#7795FF" fill-opacity="0.7"/>
+<path d="M615.475 319.396C595.735 349.315 597.408 398.019 600.713 418.631C609.677 395.029 621.021 361.919 644.607 339.712C671.601 314.295 683.055 278.815 683.914 250.407C674.686 254.125 640.149 281.997 615.475 319.396Z" fill="#7795FF" fill-opacity="0.7"/>
+<path d="M598.917 327.392C582.07 375.015 590.183 435.641 596.346 460.001C602.689 425.735 619.406 373.131 636.245 340.986C657.199 300.984 668.739 247.345 674.553 208.633C668.097 237.754 619.975 267.863 598.917 327.392Z" fill="#6386FF"/>
+<defs>
+<linearGradient id="paint0_linear" x1="438.692" y1="160.949" x2="385.025" y2="445.462" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FEC6D7"/>
+<stop offset="1" stop-color="#6386FF"/>
+</linearGradient>
+<linearGradient id="paint1_linear" x1="483.198" y1="127.544" x2="483.198" y2="384.908" gradientUnits="userSpaceOnUse">
+<stop stop-color="#D8E1FF"/>
+<stop offset="1" stop-color="#F5F4FF"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/static/custom/banner/4.png b/static/custom/banner/4.png
new file mode 100644
index 0000000..6a53886
--- /dev/null
+++ b/static/custom/banner/4.png
Binary files differ
diff --git a/static/custom/daily/background.png b/static/custom/daily/background.png
new file mode 100644
index 0000000..c74f595
--- /dev/null
+++ b/static/custom/daily/background.png
Binary files differ
diff --git a/static/custom/daily/icon_1.png b/static/custom/daily/icon_1.png
new file mode 100644
index 0000000..31f51c4
--- /dev/null
+++ b/static/custom/daily/icon_1.png
Binary files differ
diff --git a/static/custom/daily/icon_2.png b/static/custom/daily/icon_2.png
new file mode 100644
index 0000000..3f85c82
--- /dev/null
+++ b/static/custom/daily/icon_2.png
Binary files differ
diff --git a/static/custom/daily/icon_3.png b/static/custom/daily/icon_3.png
new file mode 100644
index 0000000..66713ed
--- /dev/null
+++ b/static/custom/daily/icon_3.png
Binary files differ
diff --git a/static/custom/daily/icon_4.png b/static/custom/daily/icon_4.png
new file mode 100644
index 0000000..ebcd237
--- /dev/null
+++ b/static/custom/daily/icon_4.png
Binary files differ
diff --git a/static/custom/daily/icon_5.png b/static/custom/daily/icon_5.png
new file mode 100644
index 0000000..eeaba5d
--- /dev/null
+++ b/static/custom/daily/icon_5.png
Binary files differ
diff --git a/static/custom/daily/icon_6.png b/static/custom/daily/icon_6.png
new file mode 100644
index 0000000..a16a21e
--- /dev/null
+++ b/static/custom/daily/icon_6.png
Binary files differ
diff --git a/static/custom/daily/icon_7.png b/static/custom/daily/icon_7.png
new file mode 100644
index 0000000..b59bbac
--- /dev/null
+++ b/static/custom/daily/icon_7.png
Binary files differ
diff --git a/static/custom/daily/icon_8.png b/static/custom/daily/icon_8.png
new file mode 100644
index 0000000..2efddbc
--- /dev/null
+++ b/static/custom/daily/icon_8.png
Binary files differ
diff --git a/static/custom/daily/icon_bt_bg.png b/static/custom/daily/icon_bt_bg.png
new file mode 100644
index 0000000..c2ae173
--- /dev/null
+++ b/static/custom/daily/icon_bt_bg.png
Binary files differ
diff --git a/static/custom/daily/icon_camera.png b/static/custom/daily/icon_camera.png
new file mode 100644
index 0000000..9719405
--- /dev/null
+++ b/static/custom/daily/icon_camera.png
Binary files differ
diff --git a/static/custom/daily/icon_choose.png b/static/custom/daily/icon_choose.png
new file mode 100644
index 0000000..745009b
--- /dev/null
+++ b/static/custom/daily/icon_choose.png
Binary files differ
diff --git a/static/custom/daily/icon_del.png b/static/custom/daily/icon_del.png
new file mode 100644
index 0000000..ee7d812
--- /dev/null
+++ b/static/custom/daily/icon_del.png
Binary files differ
diff --git a/static/custom/daily/icon_dy.png b/static/custom/daily/icon_dy.png
new file mode 100644
index 0000000..66a6fcf
--- /dev/null
+++ b/static/custom/daily/icon_dy.png
Binary files differ
diff --git a/static/custom/daily/icon_edit.png b/static/custom/daily/icon_edit.png
new file mode 100644
index 0000000..a2c08c7
--- /dev/null
+++ b/static/custom/daily/icon_edit.png
Binary files differ
diff --git a/static/custom/daily/icon_history.png b/static/custom/daily/icon_history.png
new file mode 100644
index 0000000..b445fba
--- /dev/null
+++ b/static/custom/daily/icon_history.png
Binary files differ
diff --git a/static/custom/daily/icon_num.png b/static/custom/daily/icon_num.png
new file mode 100644
index 0000000..b5e4daf
--- /dev/null
+++ b/static/custom/daily/icon_num.png
Binary files differ
diff --git a/static/custom/daily/icon_number.png b/static/custom/daily/icon_number.png
new file mode 100644
index 0000000..7e56b3c
--- /dev/null
+++ b/static/custom/daily/icon_number.png
Binary files differ
diff --git a/static/custom/daily/icon_person.png b/static/custom/daily/icon_person.png
new file mode 100644
index 0000000..e3dd7a8
--- /dev/null
+++ b/static/custom/daily/icon_person.png
Binary files differ
diff --git a/static/custom/daily/icon_report.png b/static/custom/daily/icon_report.png
new file mode 100644
index 0000000..4e09b08
--- /dev/null
+++ b/static/custom/daily/icon_report.png
Binary files differ
diff --git a/static/custom/daily/icon_right.png b/static/custom/daily/icon_right.png
new file mode 100644
index 0000000..898c3b1
--- /dev/null
+++ b/static/custom/daily/icon_right.png
Binary files differ
diff --git a/static/custom/daily/icon_save.png b/static/custom/daily/icon_save.png
new file mode 100644
index 0000000..9b31820
--- /dev/null
+++ b/static/custom/daily/icon_save.png
Binary files differ
diff --git a/static/custom/daily/icon_zl.png b/static/custom/daily/icon_zl.png
new file mode 100644
index 0000000..5a96ab4
--- /dev/null
+++ b/static/custom/daily/icon_zl.png
Binary files differ
diff --git a/static/custom/daily/img8.png b/static/custom/daily/img8.png
new file mode 100644
index 0000000..7ff9620
--- /dev/null
+++ b/static/custom/daily/img8.png
Binary files differ
diff --git a/static/custom/delete.png b/static/custom/delete.png
new file mode 100644
index 0000000..7203685
--- /dev/null
+++ b/static/custom/delete.png
Binary files differ
diff --git a/static/custom/favicon.png b/static/custom/favicon.png
new file mode 100644
index 0000000..72734e5
--- /dev/null
+++ b/static/custom/favicon.png
Binary files differ
diff --git a/static/custom/finishProductIn/del-icon.png b/static/custom/finishProductIn/del-icon.png
new file mode 100644
index 0000000..a25d9c1
--- /dev/null
+++ b/static/custom/finishProductIn/del-icon.png
Binary files differ
diff --git a/static/custom/finishProductIn/header_icon.png b/static/custom/finishProductIn/header_icon.png
new file mode 100644
index 0000000..83a1b1d
--- /dev/null
+++ b/static/custom/finishProductIn/header_icon.png
Binary files differ
diff --git a/static/custom/finishProductIn/icon_dele.png b/static/custom/finishProductIn/icon_dele.png
new file mode 100644
index 0000000..b8d17cd
--- /dev/null
+++ b/static/custom/finishProductIn/icon_dele.png
Binary files differ
diff --git a/static/custom/finishProductIn/icon_edit.png b/static/custom/finishProductIn/icon_edit.png
new file mode 100644
index 0000000..fa71a7a
--- /dev/null
+++ b/static/custom/finishProductIn/icon_edit.png
Binary files differ
diff --git a/static/custom/finishProductIn/info-bg.png b/static/custom/finishProductIn/info-bg.png
new file mode 100644
index 0000000..8c673f7
--- /dev/null
+++ b/static/custom/finishProductIn/info-bg.png
Binary files differ
diff --git a/static/custom/finishProductIn/label-icon-1.png b/static/custom/finishProductIn/label-icon-1.png
new file mode 100644
index 0000000..46bee54
--- /dev/null
+++ b/static/custom/finishProductIn/label-icon-1.png
Binary files differ
diff --git a/static/custom/finishProductIn/label-icon-2.png b/static/custom/finishProductIn/label-icon-2.png
new file mode 100644
index 0000000..fd635d8
--- /dev/null
+++ b/static/custom/finishProductIn/label-icon-2.png
Binary files differ
diff --git a/static/custom/finishProductIn/label-icon-3.png b/static/custom/finishProductIn/label-icon-3.png
new file mode 100644
index 0000000..c7a0273
--- /dev/null
+++ b/static/custom/finishProductIn/label-icon-3.png
Binary files differ
diff --git a/static/custom/finishProductIn/locNoBg.png b/static/custom/finishProductIn/locNoBg.png
new file mode 100644
index 0000000..a5c55b6
--- /dev/null
+++ b/static/custom/finishProductIn/locNoBg.png
Binary files differ
diff --git a/static/custom/home/banner.png b/static/custom/home/banner.png
new file mode 100644
index 0000000..20312d8
--- /dev/null
+++ b/static/custom/home/banner.png
Binary files differ
diff --git a/static/custom/home/feed.png b/static/custom/home/feed.png
new file mode 100644
index 0000000..382e1b4
--- /dev/null
+++ b/static/custom/home/feed.png
Binary files differ
diff --git a/static/custom/home/feeding.png b/static/custom/home/feeding.png
new file mode 100644
index 0000000..7ed65a7
--- /dev/null
+++ b/static/custom/home/feeding.png
Binary files differ
diff --git a/static/custom/home/finishProductIn.png b/static/custom/home/finishProductIn.png
new file mode 100644
index 0000000..63070f4
--- /dev/null
+++ b/static/custom/home/finishProductIn.png
Binary files differ
diff --git a/static/custom/home/home_img_bg.png b/static/custom/home/home_img_bg.png
new file mode 100644
index 0000000..1d133a5
--- /dev/null
+++ b/static/custom/home/home_img_bg.png
Binary files differ
diff --git a/static/custom/home/icon_edit.png b/static/custom/home/icon_edit.png
new file mode 100644
index 0000000..29d89d7
--- /dev/null
+++ b/static/custom/home/icon_edit.png
Binary files differ
diff --git a/static/custom/home/icon_number.png b/static/custom/home/icon_number.png
new file mode 100644
index 0000000..c9317d1
--- /dev/null
+++ b/static/custom/home/icon_number.png
Binary files differ
diff --git a/static/custom/home/inventory.png b/static/custom/home/inventory.png
new file mode 100644
index 0000000..1ed53fe
--- /dev/null
+++ b/static/custom/home/inventory.png
Binary files differ
diff --git a/static/custom/home/materialReturn.png b/static/custom/home/materialReturn.png
new file mode 100644
index 0000000..1eefec0
--- /dev/null
+++ b/static/custom/home/materialReturn.png
Binary files differ
diff --git a/static/custom/home/moveWareHouse.png b/static/custom/home/moveWareHouse.png
new file mode 100644
index 0000000..d76f5d3
--- /dev/null
+++ b/static/custom/home/moveWareHouse.png
Binary files differ
diff --git a/static/custom/home/packing.png b/static/custom/home/packing.png
new file mode 100644
index 0000000..4ff00e4
--- /dev/null
+++ b/static/custom/home/packing.png
Binary files differ
diff --git a/static/custom/home/productBack.png b/static/custom/home/productBack.png
new file mode 100644
index 0000000..e605fb2
--- /dev/null
+++ b/static/custom/home/productBack.png
Binary files differ
diff --git a/static/custom/inventory/carmera.png b/static/custom/inventory/carmera.png
new file mode 100644
index 0000000..af9e835
--- /dev/null
+++ b/static/custom/inventory/carmera.png
Binary files differ
diff --git a/static/custom/inventory/header_icon.png b/static/custom/inventory/header_icon.png
new file mode 100644
index 0000000..83a1b1d
--- /dev/null
+++ b/static/custom/inventory/header_icon.png
Binary files differ
diff --git a/static/custom/inventory/icon3.png b/static/custom/inventory/icon3.png
new file mode 100644
index 0000000..c22a299
--- /dev/null
+++ b/static/custom/inventory/icon3.png
Binary files differ
diff --git a/static/custom/inventory/icon4.png b/static/custom/inventory/icon4.png
new file mode 100644
index 0000000..b06da2b
--- /dev/null
+++ b/static/custom/inventory/icon4.png
Binary files differ
diff --git a/static/custom/inventory/icon_5.png b/static/custom/inventory/icon_5.png
new file mode 100644
index 0000000..5a9877c
--- /dev/null
+++ b/static/custom/inventory/icon_5.png
Binary files differ
diff --git a/static/custom/inventory/label-icon-1.png b/static/custom/inventory/label-icon-1.png
new file mode 100644
index 0000000..46bee54
--- /dev/null
+++ b/static/custom/inventory/label-icon-1.png
Binary files differ
diff --git a/static/custom/inventory/label-icon-2.png b/static/custom/inventory/label-icon-2.png
new file mode 100644
index 0000000..fd635d8
--- /dev/null
+++ b/static/custom/inventory/label-icon-2.png
Binary files differ
diff --git a/static/custom/inventory/label-icon-3.png b/static/custom/inventory/label-icon-3.png
new file mode 100644
index 0000000..c7a0273
--- /dev/null
+++ b/static/custom/inventory/label-icon-3.png
Binary files differ
diff --git a/static/custom/inventory/locNoBg.png b/static/custom/inventory/locNoBg.png
new file mode 100644
index 0000000..a5c55b6
--- /dev/null
+++ b/static/custom/inventory/locNoBg.png
Binary files differ
diff --git a/static/custom/login/blue.png b/static/custom/login/blue.png
new file mode 100644
index 0000000..5c7a9f3
--- /dev/null
+++ b/static/custom/login/blue.png
Binary files differ
diff --git a/static/custom/login/eye_close.png b/static/custom/login/eye_close.png
new file mode 100644
index 0000000..66d6ea1
--- /dev/null
+++ b/static/custom/login/eye_close.png
Binary files differ
diff --git a/static/custom/login/eye_open.png b/static/custom/login/eye_open.png
new file mode 100644
index 0000000..5aaab64
--- /dev/null
+++ b/static/custom/login/eye_open.png
Binary files differ
diff --git a/static/custom/login/img_bg.png b/static/custom/login/img_bg.png
new file mode 100644
index 0000000..d2b6c7c
--- /dev/null
+++ b/static/custom/login/img_bg.png
Binary files differ
diff --git a/static/custom/login/login-bg.png b/static/custom/login/login-bg.png
new file mode 100644
index 0000000..7034b20
--- /dev/null
+++ b/static/custom/login/login-bg.png
Binary files differ
diff --git a/static/custom/materialReturn/backBg.png b/static/custom/materialReturn/backBg.png
new file mode 100644
index 0000000..a5c55b6
--- /dev/null
+++ b/static/custom/materialReturn/backBg.png
Binary files differ
diff --git a/static/custom/materialReturn/icon_edit.png b/static/custom/materialReturn/icon_edit.png
new file mode 100644
index 0000000..fa71a7a
--- /dev/null
+++ b/static/custom/materialReturn/icon_edit.png
Binary files differ
diff --git a/static/custom/materialReturn/label-icon-1.png b/static/custom/materialReturn/label-icon-1.png
new file mode 100644
index 0000000..2abc991
--- /dev/null
+++ b/static/custom/materialReturn/label-icon-1.png
Binary files differ
diff --git a/static/custom/materialReturn/label-icon-2.png b/static/custom/materialReturn/label-icon-2.png
new file mode 100644
index 0000000..d780120
--- /dev/null
+++ b/static/custom/materialReturn/label-icon-2.png
Binary files differ
diff --git a/static/custom/materialReturn/scan.png b/static/custom/materialReturn/scan.png
new file mode 100644
index 0000000..cfd2a50
--- /dev/null
+++ b/static/custom/materialReturn/scan.png
Binary files differ
diff --git a/static/custom/materialReturn/selected-btn-1.png b/static/custom/materialReturn/selected-btn-1.png
new file mode 100644
index 0000000..0ca9db8
--- /dev/null
+++ b/static/custom/materialReturn/selected-btn-1.png
Binary files differ
diff --git a/static/custom/materialReturn/selected-btn.png b/static/custom/materialReturn/selected-btn.png
new file mode 100644
index 0000000..a1046e4
--- /dev/null
+++ b/static/custom/materialReturn/selected-btn.png
Binary files differ
diff --git a/static/custom/materialReturn/unselected-btn-1.png b/static/custom/materialReturn/unselected-btn-1.png
new file mode 100644
index 0000000..c9c7156
--- /dev/null
+++ b/static/custom/materialReturn/unselected-btn-1.png
Binary files differ
diff --git a/static/custom/materialReturn/unselected-btn.png b/static/custom/materialReturn/unselected-btn.png
new file mode 100644
index 0000000..534ff95
--- /dev/null
+++ b/static/custom/materialReturn/unselected-btn.png
Binary files differ
diff --git a/static/custom/moveWareHouse/del-icon.png b/static/custom/moveWareHouse/del-icon.png
new file mode 100644
index 0000000..e6c247b
--- /dev/null
+++ b/static/custom/moveWareHouse/del-icon.png
Binary files differ
diff --git a/static/custom/moveWareHouse/header_icon.png b/static/custom/moveWareHouse/header_icon.png
new file mode 100644
index 0000000..83a1b1d
--- /dev/null
+++ b/static/custom/moveWareHouse/header_icon.png
Binary files differ
diff --git a/static/custom/moveWareHouse/icon_dele.png b/static/custom/moveWareHouse/icon_dele.png
new file mode 100644
index 0000000..95e4da2
--- /dev/null
+++ b/static/custom/moveWareHouse/icon_dele.png
Binary files differ
diff --git a/static/custom/moveWareHouse/label-icon-1.png b/static/custom/moveWareHouse/label-icon-1.png
new file mode 100644
index 0000000..46bee54
--- /dev/null
+++ b/static/custom/moveWareHouse/label-icon-1.png
Binary files differ
diff --git a/static/custom/moveWareHouse/label-icon-2.png b/static/custom/moveWareHouse/label-icon-2.png
new file mode 100644
index 0000000..fd635d8
--- /dev/null
+++ b/static/custom/moveWareHouse/label-icon-2.png
Binary files differ
diff --git a/static/custom/moveWareHouse/label-icon-3.png b/static/custom/moveWareHouse/label-icon-3.png
new file mode 100644
index 0000000..c7a0273
--- /dev/null
+++ b/static/custom/moveWareHouse/label-icon-3.png
Binary files differ
diff --git a/static/custom/moveWareHouse/locNoBg.png b/static/custom/moveWareHouse/locNoBg.png
new file mode 100644
index 0000000..a5c55b6
--- /dev/null
+++ b/static/custom/moveWareHouse/locNoBg.png
Binary files differ
diff --git a/static/custom/operationTask/black-del-icon.png b/static/custom/operationTask/black-del-icon.png
new file mode 100644
index 0000000..4a2dcb2
--- /dev/null
+++ b/static/custom/operationTask/black-del-icon.png
Binary files differ
diff --git a/static/custom/operationTask/black-edit-icon.png b/static/custom/operationTask/black-edit-icon.png
new file mode 100644
index 0000000..4c10308
--- /dev/null
+++ b/static/custom/operationTask/black-edit-icon.png
Binary files differ
diff --git a/static/custom/operationTask/black-revoke-icon.png b/static/custom/operationTask/black-revoke-icon.png
new file mode 100644
index 0000000..9cad090
--- /dev/null
+++ b/static/custom/operationTask/black-revoke-icon.png
Binary files differ
diff --git a/static/custom/operationTask/blue-submit-icon.png b/static/custom/operationTask/blue-submit-icon.png
new file mode 100644
index 0000000..f664a73
--- /dev/null
+++ b/static/custom/operationTask/blue-submit-icon.png
Binary files differ
diff --git a/static/custom/operationTask/book-icon.png b/static/custom/operationTask/book-icon.png
new file mode 100644
index 0000000..6582b8a
--- /dev/null
+++ b/static/custom/operationTask/book-icon.png
Binary files differ
diff --git a/static/custom/operationTask/edit-icon.png b/static/custom/operationTask/edit-icon.png
new file mode 100644
index 0000000..5cfb468
--- /dev/null
+++ b/static/custom/operationTask/edit-icon.png
Binary files differ
diff --git a/static/custom/operationTask/enter-icon.png b/static/custom/operationTask/enter-icon.png
new file mode 100644
index 0000000..655d927
--- /dev/null
+++ b/static/custom/operationTask/enter-icon.png
Binary files differ
diff --git a/static/custom/operationTask/in-progress-state-icon.png b/static/custom/operationTask/in-progress-state-icon.png
new file mode 100644
index 0000000..d065152
--- /dev/null
+++ b/static/custom/operationTask/in-progress-state-icon.png
Binary files differ
diff --git a/static/custom/operationTask/label-icon-1.png b/static/custom/operationTask/label-icon-1.png
new file mode 100644
index 0000000..5c8e75e
--- /dev/null
+++ b/static/custom/operationTask/label-icon-1.png
Binary files differ
diff --git a/static/custom/operationTask/red-delete-icon.png b/static/custom/operationTask/red-delete-icon.png
new file mode 100644
index 0000000..146bfb8
--- /dev/null
+++ b/static/custom/operationTask/red-delete-icon.png
Binary files differ
diff --git a/static/custom/operationTask/revoke-icon.png b/static/custom/operationTask/revoke-icon.png
new file mode 100644
index 0000000..558d1f2
--- /dev/null
+++ b/static/custom/operationTask/revoke-icon.png
Binary files differ
diff --git a/static/custom/operationTask/submit-state-icon.png b/static/custom/operationTask/submit-state-icon.png
new file mode 100644
index 0000000..05fb02f
--- /dev/null
+++ b/static/custom/operationTask/submit-state-icon.png
Binary files differ
diff --git a/static/custom/operationTask/time-icon.png b/static/custom/operationTask/time-icon.png
new file mode 100644
index 0000000..783ade7
--- /dev/null
+++ b/static/custom/operationTask/time-icon.png
Binary files differ
diff --git a/static/custom/operationTask/unsubmit-state-icon.png b/static/custom/operationTask/unsubmit-state-icon.png
new file mode 100644
index 0000000..33e79a0
--- /dev/null
+++ b/static/custom/operationTask/unsubmit-state-icon.png
Binary files differ
diff --git a/static/custom/operationTask/workstation/icon_batch_save.png b/static/custom/operationTask/workstation/icon_batch_save.png
new file mode 100644
index 0000000..3dea835
--- /dev/null
+++ b/static/custom/operationTask/workstation/icon_batch_save.png
Binary files differ
diff --git a/static/custom/operationTask/workstation/icon_batch_submit.png b/static/custom/operationTask/workstation/icon_batch_submit.png
new file mode 100644
index 0000000..bcbc09f
--- /dev/null
+++ b/static/custom/operationTask/workstation/icon_batch_submit.png
Binary files differ
diff --git a/static/custom/operationTask/workstation/icon_clear.png b/static/custom/operationTask/workstation/icon_clear.png
new file mode 100644
index 0000000..da93635
--- /dev/null
+++ b/static/custom/operationTask/workstation/icon_clear.png
Binary files differ
diff --git a/static/custom/operationTask/workstation/icon_delete.png b/static/custom/operationTask/workstation/icon_delete.png
new file mode 100644
index 0000000..882e3cf
--- /dev/null
+++ b/static/custom/operationTask/workstation/icon_delete.png
Binary files differ
diff --git a/static/custom/operationTask/workstation/icon_history.png b/static/custom/operationTask/workstation/icon_history.png
new file mode 100644
index 0000000..005d15c
--- /dev/null
+++ b/static/custom/operationTask/workstation/icon_history.png
Binary files differ
diff --git a/static/custom/outsource/bg1.png b/static/custom/outsource/bg1.png
new file mode 100644
index 0000000..37db2ec
--- /dev/null
+++ b/static/custom/outsource/bg1.png
Binary files differ
diff --git a/static/custom/outsource/bg2.png b/static/custom/outsource/bg2.png
new file mode 100644
index 0000000..c737c9a
--- /dev/null
+++ b/static/custom/outsource/bg2.png
Binary files differ
diff --git a/static/custom/outsource/bg3.png b/static/custom/outsource/bg3.png
new file mode 100644
index 0000000..f4ac401
--- /dev/null
+++ b/static/custom/outsource/bg3.png
Binary files differ
diff --git a/static/custom/outsource/bg4.png b/static/custom/outsource/bg4.png
new file mode 100644
index 0000000..2fb66e9
--- /dev/null
+++ b/static/custom/outsource/bg4.png
Binary files differ
diff --git a/static/custom/outsource/content_bg.png b/static/custom/outsource/content_bg.png
new file mode 100644
index 0000000..51e5afe
--- /dev/null
+++ b/static/custom/outsource/content_bg.png
Binary files differ
diff --git a/static/custom/outsource/icon_delete.png b/static/custom/outsource/icon_delete.png
new file mode 100644
index 0000000..ccad434
--- /dev/null
+++ b/static/custom/outsource/icon_delete.png
Binary files differ
diff --git a/static/custom/outsource/index_bg.png b/static/custom/outsource/index_bg.png
new file mode 100644
index 0000000..210ef12
--- /dev/null
+++ b/static/custom/outsource/index_bg.png
Binary files differ
diff --git a/static/custom/outsource/scan.png b/static/custom/outsource/scan.png
new file mode 100644
index 0000000..a035814
--- /dev/null
+++ b/static/custom/outsource/scan.png
Binary files differ
diff --git a/static/custom/packing/backBg.png b/static/custom/packing/backBg.png
new file mode 100644
index 0000000..8e9f06a
--- /dev/null
+++ b/static/custom/packing/backBg.png
Binary files differ
diff --git a/static/custom/packing/click-selected.png b/static/custom/packing/click-selected.png
new file mode 100644
index 0000000..a1046e4
--- /dev/null
+++ b/static/custom/packing/click-selected.png
Binary files differ
diff --git a/static/custom/packing/click-unselected.png b/static/custom/packing/click-unselected.png
new file mode 100644
index 0000000..534ff95
--- /dev/null
+++ b/static/custom/packing/click-unselected.png
Binary files differ
diff --git a/static/custom/packing/icon_1.png b/static/custom/packing/icon_1.png
new file mode 100644
index 0000000..7e7d198
--- /dev/null
+++ b/static/custom/packing/icon_1.png
Binary files differ
diff --git a/static/custom/packing/icon_2.png b/static/custom/packing/icon_2.png
new file mode 100644
index 0000000..7f2daa3
--- /dev/null
+++ b/static/custom/packing/icon_2.png
Binary files differ
diff --git a/static/custom/packing/icon_dele.png b/static/custom/packing/icon_dele.png
new file mode 100644
index 0000000..c2af595
--- /dev/null
+++ b/static/custom/packing/icon_dele.png
Binary files differ
diff --git a/static/custom/packing/num-bg.png b/static/custom/packing/num-bg.png
new file mode 100644
index 0000000..26f5236
--- /dev/null
+++ b/static/custom/packing/num-bg.png
Binary files differ
diff --git a/static/custom/packing/person_row_bg.png b/static/custom/packing/person_row_bg.png
new file mode 100644
index 0000000..33c2445
--- /dev/null
+++ b/static/custom/packing/person_row_bg.png
Binary files differ
diff --git a/static/custom/packing/row_bg.png b/static/custom/packing/row_bg.png
new file mode 100644
index 0000000..4704d37
--- /dev/null
+++ b/static/custom/packing/row_bg.png
Binary files differ
diff --git a/static/custom/product/del-icon.png b/static/custom/product/del-icon.png
new file mode 100644
index 0000000..a25d9c1
--- /dev/null
+++ b/static/custom/product/del-icon.png
Binary files differ
diff --git a/static/custom/product/icon_dele.png b/static/custom/product/icon_dele.png
new file mode 100644
index 0000000..b8d17cd
--- /dev/null
+++ b/static/custom/product/icon_dele.png
Binary files differ
diff --git a/static/custom/product/label-icon-1.png b/static/custom/product/label-icon-1.png
new file mode 100644
index 0000000..2abc991
--- /dev/null
+++ b/static/custom/product/label-icon-1.png
Binary files differ
diff --git a/static/custom/product/label-icon-2.png b/static/custom/product/label-icon-2.png
new file mode 100644
index 0000000..d780120
--- /dev/null
+++ b/static/custom/product/label-icon-2.png
Binary files differ
diff --git a/static/custom/product/productBg.png b/static/custom/product/productBg.png
new file mode 100644
index 0000000..8e9f06a
--- /dev/null
+++ b/static/custom/product/productBg.png
Binary files differ
diff --git a/static/custom/productBack/backBg.png b/static/custom/productBack/backBg.png
new file mode 100644
index 0000000..a5c55b6
--- /dev/null
+++ b/static/custom/productBack/backBg.png
Binary files differ
diff --git a/static/custom/productBack/icon_edit.png b/static/custom/productBack/icon_edit.png
new file mode 100644
index 0000000..fa71a7a
--- /dev/null
+++ b/static/custom/productBack/icon_edit.png
Binary files differ
diff --git a/static/custom/productBack/label-icon-1.png b/static/custom/productBack/label-icon-1.png
new file mode 100644
index 0000000..2abc991
--- /dev/null
+++ b/static/custom/productBack/label-icon-1.png
Binary files differ
diff --git a/static/custom/productBack/label-icon-2.png b/static/custom/productBack/label-icon-2.png
new file mode 100644
index 0000000..d780120
--- /dev/null
+++ b/static/custom/productBack/label-icon-2.png
Binary files differ
diff --git a/static/custom/tabbar/home_1.png b/static/custom/tabbar/home_1.png
new file mode 100644
index 0000000..5956ead
--- /dev/null
+++ b/static/custom/tabbar/home_1.png
Binary files differ
diff --git a/static/custom/tabbar/home_2.png b/static/custom/tabbar/home_2.png
new file mode 100644
index 0000000..d145dbc
--- /dev/null
+++ b/static/custom/tabbar/home_2.png
Binary files differ
diff --git a/static/custom/tabbar/kefu_1.png b/static/custom/tabbar/kefu_1.png
new file mode 100644
index 0000000..75b4f48
--- /dev/null
+++ b/static/custom/tabbar/kefu_1.png
Binary files differ
diff --git a/static/custom/tabbar/kefu_2.png b/static/custom/tabbar/kefu_2.png
new file mode 100644
index 0000000..16e78cb
--- /dev/null
+++ b/static/custom/tabbar/kefu_2.png
Binary files differ
diff --git a/static/custom/tabbar/msg_1.png b/static/custom/tabbar/msg_1.png
new file mode 100644
index 0000000..e6e0ce6
--- /dev/null
+++ b/static/custom/tabbar/msg_1.png
Binary files differ
diff --git a/static/custom/tabbar/msg_2.png b/static/custom/tabbar/msg_2.png
new file mode 100644
index 0000000..3642e68
--- /dev/null
+++ b/static/custom/tabbar/msg_2.png
Binary files differ
diff --git a/static/custom/tabbar/my_1.png b/static/custom/tabbar/my_1.png
new file mode 100644
index 0000000..4393097
--- /dev/null
+++ b/static/custom/tabbar/my_1.png
Binary files differ
diff --git a/static/custom/tabbar/my_2.png b/static/custom/tabbar/my_2.png
new file mode 100644
index 0000000..508f91e
--- /dev/null
+++ b/static/custom/tabbar/my_2.png
Binary files differ
diff --git a/static/custom/tailHandle/header_icon.png b/static/custom/tailHandle/header_icon.png
new file mode 100644
index 0000000..83a1b1d
--- /dev/null
+++ b/static/custom/tailHandle/header_icon.png
Binary files differ
diff --git a/static/custom/tailHandle/label-icon-1.png b/static/custom/tailHandle/label-icon-1.png
new file mode 100644
index 0000000..46bee54
--- /dev/null
+++ b/static/custom/tailHandle/label-icon-1.png
Binary files differ
diff --git a/static/custom/tailHandle/label-icon-2.png b/static/custom/tailHandle/label-icon-2.png
new file mode 100644
index 0000000..fd635d8
--- /dev/null
+++ b/static/custom/tailHandle/label-icon-2.png
Binary files differ
diff --git a/static/custom/tailHandle/label-icon-3.png b/static/custom/tailHandle/label-icon-3.png
new file mode 100644
index 0000000..c7a0273
--- /dev/null
+++ b/static/custom/tailHandle/label-icon-3.png
Binary files differ
diff --git a/static/custom/tailHandle/locNoBg.png b/static/custom/tailHandle/locNoBg.png
new file mode 100644
index 0000000..a5c55b6
--- /dev/null
+++ b/static/custom/tailHandle/locNoBg.png
Binary files differ
diff --git a/static/custom/user/bg2.png b/static/custom/user/bg2.png
new file mode 100644
index 0000000..b955fcc
--- /dev/null
+++ b/static/custom/user/bg2.png
Binary files differ
diff --git a/static/custom/user/img_tx.png b/static/custom/user/img_tx.png
new file mode 100644
index 0000000..e223a1d
--- /dev/null
+++ b/static/custom/user/img_tx.png
Binary files differ
diff --git a/static/iconfont/iconfont.css b/static/iconfont/iconfont.css
new file mode 100644
index 0000000..b917e57
--- /dev/null
+++ b/static/iconfont/iconfont.css
@@ -0,0 +1,463 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2874232 */
+  src: url('~@/static/iconfont/iconfont.woff2?t=1636514770782') format('woff2'),
+       url('~@/static/iconfont/iconfont.woff?t=1636514770782') format('woff'),
+       url('~@/static/iconfont/iconfont.ttf?t=1636514770782') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-minus-circle-fill:before {
+  content: "\e844";
+}
+
+.icon-close-circle-fill:before {
+  content: "\e845";
+}
+
+.icon-plus-circle-fill:before {
+  content: "\e846";
+}
+
+.icon-tupian:before {
+  content: "\e8ba";
+}
+
+.icon-xiangji:before {
+  content: "\e8bc";
+}
+
+.icon-zengjia:before {
+  content: "\e8c0";
+}
+
+.icon-youhuiquan:before {
+  content: "\e8c1";
+}
+
+.icon-quanbudingdan:before {
+  content: "\e600";
+}
+
+.icon-moban:before {
+  content: "\e6bb";
+}
+
+.icon-hetongqianzi:before {
+  content: "\e615";
+}
+
+.icon-gongwujiedai:before {
+  content: "\e609";
+}
+
+.icon-kaoqinchuqin:before {
+  content: "\e8d0";
+}
+
+.icon-haocaifei:before {
+  content: "\e6bc";
+}
+
+.icon-huiyishi1:before {
+  content: "\e662";
+}
+
+.icon-baoming1:before {
+  content: "\e632";
+}
+
+.icon-jiabanshenqing:before {
+  content: "\e651";
+}
+
+.icon-hetongxieyi:before {
+  content: "\e64b";
+}
+
+.icon-jiabanshenpi:before {
+  content: "\e774";
+}
+
+.icon-yongche:before {
+  content: "\e601";
+}
+
+.icon-baoming:before {
+  content: "\e664";
+}
+
+.icon-qingjia:before {
+  content: "\e624";
+}
+
+.icon-tianshenpi:before {
+  content: "\eb67";
+}
+
+.icon-icon_yingyongguanli:before {
+  content: "\eb8f";
+}
+
+.icon-xingzhuang-xingxing:before {
+  content: "\eb9a";
+}
+
+.icon-gongnengdingyi:before {
+  content: "\ebb7";
+}
+
+.icon-kongxinduigou:before {
+  content: "\ebe5";
+}
+
+.icon-tianjia:before {
+  content: "\e620";
+}
+
+.icon-chucha:before {
+  content: "\e60f";
+}
+
+.icon-gongdan:before {
+  content: "\ec37";
+}
+
+.icon-daibanshixiang2:before {
+  content: "\ec4e";
+}
+
+.icon-bianjisekuai:before {
+  content: "\ec7c";
+}
+
+.icon-hetongguanli:before {
+  content: "\e625";
+}
+
+.icon-huiyishi:before {
+  content: "\e608";
+}
+
+.icon-ribao:before {
+  content: "\e835";
+}
+
+.icon-banjieshiwu:before {
+  content: "\e602";
+}
+
+.icon-daibanshiwu:before {
+  content: "\e603";
+}
+
+.icon-kaoheguanli:before {
+  content: "\e606";
+}
+
+.icon-shiyanshikaohe:before {
+  content: "\e607";
+}
+
+.icon-baoxiao:before {
+  content: "\e605";
+}
+
+.icon-shenpi:before {
+  content: "\e626";
+}
+
+.icon-baoxiaodan:before {
+  content: "\e61b";
+}
+
+.icon-xinwen:before {
+  content: "\e639";
+}
+
+.icon-tongzhi:before {
+  content: "\e648";
+}
+
+.icon-fujian:before {
+  content: "\e655";
+}
+
+.icon-msg-system:before {
+  content: "\e6b9";
+}
+
+.icon-daibanshixiang:before {
+  content: "\e65d";
+}
+
+.icon-tongzhi1:before {
+  content: "\e64a";
+}
+
+.icon-daibanshixiang1:before {
+  content: "\e6ba";
+}
+
+.icon-search:before {
+  content: "\e6b4";
+}
+
+.icon-view-list:before {
+  content: "\e6b5";
+}
+
+.icon-headset-one:before {
+  content: "\e6b6";
+}
+
+.icon-list-checkbox:before {
+  content: "\e6b7";
+}
+
+.icon-jiyika:before {
+  content: "\e6b8";
+}
+
+.icon-chart-histogram-two:before {
+  content: "\e679";
+}
+
+.icon-audit:before {
+  content: "\e67a";
+}
+
+.icon-check-one:before {
+  content: "\e67b";
+}
+
+.icon-bookmark-one:before {
+  content: "\e67c";
+}
+
+.icon-a-comment1:before {
+  content: "\e67d";
+}
+
+.icon-avatar:before {
+  content: "\e67e";
+}
+
+.icon-collection-files:before {
+  content: "\e67f";
+}
+
+.icon-copy-one:before {
+  content: "\e680";
+}
+
+.icon-add:before {
+  content: "\e681";
+}
+
+.icon-currency:before {
+  content: "\e682";
+}
+
+.icon-edit-two:before {
+  content: "\e683";
+}
+
+.icon-finance:before {
+  content: "\e684";
+}
+
+.icon-find:before {
+  content: "\e685";
+}
+
+.icon-folder-plus:before {
+  content: "\e686";
+}
+
+.icon-link-break:before {
+  content: "\e687";
+}
+
+.icon-financing-one:before {
+  content: "\e688";
+}
+
+.icon-help:before {
+  content: "\e689";
+}
+
+.icon-chart-pie:before {
+  content: "\e68a";
+}
+
+.icon-id-card:before {
+  content: "\e68b";
+}
+
+.icon-a-lock1:before {
+  content: "\e68c";
+}
+
+.icon-list:before {
+  content: "\e68d";
+}
+
+.icon-lock:before {
+  content: "\e68e";
+}
+
+.icon-key:before {
+  content: "\e68f";
+}
+
+.icon-a-key1:before {
+  content: "\e690";
+}
+
+.icon-me:before {
+  content: "\e691";
+}
+
+.icon-equalizer:before {
+  content: "\e692";
+}
+
+.icon-comment:before {
+  content: "\e693";
+}
+
+.icon-log:before {
+  content: "\e694";
+}
+
+.icon-mall-bag:before {
+  content: "\e695";
+}
+
+.icon-list-view:before {
+  content: "\e696";
+}
+
+.icon-send:before {
+  content: "\e697";
+}
+
+.icon-people:before {
+  content: "\e698";
+}
+
+.icon-peoples:before {
+  content: "\e699";
+}
+
+.icon-a-message-one1:before {
+  content: "\e69a";
+}
+
+.icon-phone-telephone:before {
+  content: "\e69b";
+}
+
+.icon-internal-transmission:before {
+  content: "\e69c";
+}
+
+.icon-schedule:before {
+  content: "\e69d";
+}
+
+.icon-more-one:before {
+  content: "\e69e";
+}
+
+.icon-sim:before {
+  content: "\e69f";
+}
+
+.icon-a-peoples1:before {
+  content: "\e6a0";
+}
+
+.icon-wallet:before {
+  content: "\e6a1";
+}
+
+.icon-permissions:before {
+  content: "\e6a2";
+}
+
+.icon-faan:before {
+  content: "\e6a3";
+}
+
+.icon-transporter:before {
+  content: "\e6a4";
+}
+
+.icon-transaction-order:before {
+  content: "\e6a5";
+}
+
+.icon-message-one:before {
+  content: "\e6a6";
+}
+
+.icon-shouji:before {
+  content: "\e6a7";
+}
+
+.icon-liebiaochakanmoshi_view-grid-list:before {
+  content: "\e6a8";
+}
+
+.icon-time:before {
+  content: "\e6a9";
+}
+
+.icon-transaction:before {
+  content: "\e6aa";
+}
+
+.icon-setting-two:before {
+  content: "\e6ab";
+}
+
+.icon-plan:before {
+  content: "\e6ac";
+}
+
+.icon-a-time1:before {
+  content: "\e6ad";
+}
+
+.icon-shezhi_setting:before {
+  content: "\e6ae";
+}
+
+.icon-zanting:before {
+  content: "\e6af";
+}
+
+.icon-sousuo_search:before {
+  content: "\e6b0";
+}
+
+.icon-xiangqingliebiao:before {
+  content: "\e6b1";
+}
+
+.icon-workbench:before {
+  content: "\e6b2";
+}
+
+.icon-shujubiao_data-sheet:before {
+  content: "\e6b3";
+}
+
diff --git a/static/iconfont/iconfont.ttf b/static/iconfont/iconfont.ttf
new file mode 100644
index 0000000..290fccc
--- /dev/null
+++ b/static/iconfont/iconfont.ttf
Binary files differ
diff --git a/static/iconfont/iconfont.woff b/static/iconfont/iconfont.woff
new file mode 100644
index 0000000..f05247a
--- /dev/null
+++ b/static/iconfont/iconfont.woff
Binary files differ
diff --git a/static/iconfont/iconfont.woff2 b/static/iconfont/iconfont.woff2
new file mode 100644
index 0000000..c6d614b
--- /dev/null
+++ b/static/iconfont/iconfont.woff2
Binary files differ
diff --git a/static/index.html b/static/index.html
new file mode 100644
index 0000000..c440d5e
--- /dev/null
+++ b/static/index.html
@@ -0,0 +1,52 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+	<head>
+		<meta charset="utf-8">
+		<meta http-equiv="X-UA-Compatible" content="IE=edge">
+		<meta name="keywords" content="PoweredByJeeSiteV4.0"/>
+		<meta name="description" content="PoweredByJeeSiteV4.0"/>
+		<link rel="shortcut icon" type="image/x-icon" href="custom/favicon.png">
+		<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
+		<title>涓ぉ浜掕仈Asun-MES</title>
+		<script>
+			window.onresize = function () {
+				if (document.documentElement.clientWidth < 768) {
+					window.location.href = '../#/';
+				}
+			};
+			window.onresize();
+		</script>
+		<style>
+			.mobile-model {
+				margin: 10px auto;
+				background-color: #fff;
+				width: 330px;
+				margin-top: calc(50vh - 350px);
+				box-sizing: border-box;
+				background-image: url(common/img/iPhoneX.png);
+				background-repeat: no-repeat;
+				background-size: 100%;
+				border-radius: 30px;
+				padding: 48px 23px 38px 16px;
+			}
+			.mobile-content {
+				box-sizing: border-box;
+				width: 298px;
+				height: 582px;
+				border-bottom-left-radius: 20px;
+			}
+			.mobile-iframe {
+				height: 100%;
+				width: 100%;
+				border-radius: 20px;
+			}
+		</style>
+	</head>
+	<body>
+		<div class="mobile-model">
+			<div class="mobile-content">
+				<iframe src="../#/" class="mobile-iframe" scrolling="auto" frameborder="0"></iframe>
+			</div>
+		</div>
+	</body>
+</html>
diff --git a/static/uview/common/favicon.ico b/static/uview/common/favicon.ico
new file mode 100644
index 0000000..e0af368
--- /dev/null
+++ b/static/uview/common/favicon.ico
Binary files differ
diff --git a/static/uview/common/logo.png b/static/uview/common/logo.png
new file mode 100644
index 0000000..05b3aed
--- /dev/null
+++ b/static/uview/common/logo.png
Binary files differ
diff --git a/static/uview/example/component.png b/static/uview/example/component.png
new file mode 100644
index 0000000..09bd020
--- /dev/null
+++ b/static/uview/example/component.png
Binary files differ
diff --git a/static/uview/example/component_select.png b/static/uview/example/component_select.png
new file mode 100644
index 0000000..3d704a8
--- /dev/null
+++ b/static/uview/example/component_select.png
Binary files differ
diff --git a/static/uview/example/js.png b/static/uview/example/js.png
new file mode 100644
index 0000000..b904664
--- /dev/null
+++ b/static/uview/example/js.png
Binary files differ
diff --git a/static/uview/example/js_bak.png b/static/uview/example/js_bak.png
new file mode 100644
index 0000000..d280e3d
--- /dev/null
+++ b/static/uview/example/js_bak.png
Binary files differ
diff --git a/static/uview/example/js_select.png b/static/uview/example/js_select.png
new file mode 100644
index 0000000..9411c91
--- /dev/null
+++ b/static/uview/example/js_select.png
Binary files differ
diff --git a/static/uview/example/js_select_bak.png b/static/uview/example/js_select_bak.png
new file mode 100644
index 0000000..2ea6122
--- /dev/null
+++ b/static/uview/example/js_select_bak.png
Binary files differ
diff --git a/static/uview/example/min_button.png b/static/uview/example/min_button.png
new file mode 100644
index 0000000..077eb43
--- /dev/null
+++ b/static/uview/example/min_button.png
Binary files differ
diff --git a/static/uview/example/min_button_select.png b/static/uview/example/min_button_select.png
new file mode 100644
index 0000000..703a8bd
--- /dev/null
+++ b/static/uview/example/min_button_select.png
Binary files differ
diff --git a/static/uview/example/template.png b/static/uview/example/template.png
new file mode 100644
index 0000000..5d27f97
--- /dev/null
+++ b/static/uview/example/template.png
Binary files differ
diff --git a/static/uview/example/template_select.png b/static/uview/example/template_select.png
new file mode 100644
index 0000000..be4b338
--- /dev/null
+++ b/static/uview/example/template_select.png
Binary files differ
diff --git a/static/y1253.mp3 b/static/y1253.mp3
new file mode 100644
index 0000000..de51d68
--- /dev/null
+++ b/static/y1253.mp3
Binary files differ
diff --git a/store/$u.mixin.js b/store/$u.mixin.js
new file mode 100644
index 0000000..61ae187
--- /dev/null
+++ b/store/$u.mixin.js
@@ -0,0 +1,27 @@
+import { mapState } from 'vuex'
+import store from "@/store"
+
+// 灏濊瘯灏嗙敤鎴峰湪鏍圭洰褰曚腑鐨剆tore/index.js鐨剉uex鐨剆tate鍙橀噺锛屽叏閮ㄥ姞杞藉埌鍏ㄥ眬鍙橀噺涓�
+let $uStoreKey = [];
+try{
+	$uStoreKey = store.state ? Object.keys(store.state) : [];
+}catch(e){
+	
+}
+
+module.exports = {
+	beforeCreate() {
+		// 灏唙uex鏂规硶鎸傚湪鍒�$u涓�
+		// 浣跨敤鏂规硶涓猴細濡傛灉瑕佷慨鏀箆uex鐨剆tate涓殑user.name鍙橀噺涓�"鍙茶瘲" => this.$u.vuex('user.name', '鍙茶瘲')
+		// 濡傛灉瑕佷慨鏀箆uex鐨剆tate鐨剉ersion鍙橀噺涓�1.0.1 => this.$u.vuex('version', '1.0.1')
+		this.$u.vuex = (name, value) => {
+			this.$store.commit('$uStore', {
+				name,value
+			})
+		}
+	},
+	computed: {
+		// 灏唙uex鐨剆tate涓殑鎵�鏈夊彉閲忥紝瑙f瀯鍒板叏灞�娣峰叆鐨刴ixin涓�
+		...mapState($uStoreKey)
+	}
+}
\ No newline at end of file
diff --git a/store/bluetooth/index.js b/store/bluetooth/index.js
new file mode 100644
index 0000000..988b26b
--- /dev/null
+++ b/store/bluetooth/index.js
@@ -0,0 +1,23 @@
+let sysinfo = uni.getSystemInfoSync();
+const Bluetooth = {
+	state: {
+		//钃濈墮淇℃伅
+		BLEInformation: {
+			platform: sysinfo.platform || "",
+			deviceId: "",
+			writeCharaterId: "",
+			writeServiceId: "",
+			notifyCharaterId: "",
+			notifyServiceId: "",
+			readCharaterId: "",
+			readServiceId: "",
+		}
+	},
+	mutations:{
+		BLEInformationSet(state, info){
+			state.BLEInformation = info;
+		}
+	}
+}
+
+export default Bluetooth;
diff --git a/store/index.js b/store/index.js
new file mode 100644
index 0000000..ef462f7
--- /dev/null
+++ b/store/index.js
@@ -0,0 +1,78 @@
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ */
+import config from '@/common/config.js';
+import Vue from 'vue'
+import Vuex from 'vuex'
+Vue.use(Vuex)
+//钃濈墮璁剧疆
+import Bluetooth from '@/store/bluetooth/index.js'
+
+let lifeData = {};
+
+try{
+	// 灏濊瘯鑾峰彇鏈湴鏄惁瀛樺湪lifeData鍙橀噺锛岀涓�娆″惎鍔ˋPP鏃舵槸涓嶅瓨鍦ㄧ殑
+	lifeData = uni.getStorageSync('lifeData');
+}catch(e){
+
+}
+
+// 闇�瑕佹案涔呭瓨鍌紝涓斾笅娆PP鍚姩闇�瑕佸彇鍑虹殑锛屽湪state涓殑鍙橀噺鍚�
+let saveStateKeys = ['vuex_user', 'vuex_token', 'vuex_remember', 'vuex_locale','vuex_username','vuex_userId','vuex_client_id','vuex_config'];
+
+// 淇濆瓨鍙橀噺鍒版湰鍦板瓨鍌ㄤ腑
+const saveLifeData = function(key, value){
+	// 鍒ゆ柇鍙橀噺鍚嶆槸鍚﹀湪闇�瑕佸瓨鍌ㄧ殑鏁扮粍涓�
+	if(saveStateKeys.indexOf(key) != -1) {
+		// 鑾峰彇鏈湴瀛樺偍鐨刲ifeData瀵硅薄锛屽皢鍙橀噺娣诲姞鍒板璞′腑
+		let tmp = uni.getStorageSync('lifeData');
+		// 绗竴娆℃墦寮�APP锛屼笉瀛樺湪lifeData鍙橀噺锛屾晠鏀句竴涓獅}绌哄璞�
+		tmp = tmp ? tmp : {};
+		tmp[key] = value;
+		// 鎵ц杩欎竴姝ュ悗锛屾墍鏈夐渶瑕佸瓨鍌ㄧ殑鍙橀噺锛岄兘鎸傝浇鍦ㄦ湰鍦扮殑lifeData瀵硅薄涓�
+		uni.setStorageSync('lifeData', tmp);
+	}
+}
+// 绠�鍖� vuex 鎿嶄綔锛屾枃妗o細https://uviewui.com/components/vuexDetail.html
+const store = new Vuex.Store({
+	modules: {
+		Bluetooth
+	},
+	state: {
+		// 濡傛灉涓婇潰浠庢湰鍦拌幏鍙栫殑lifeData瀵硅薄涓嬫湁瀵瑰簲鐨勫睘鎬э紝灏辫祴鍊肩粰state涓搴旂殑鍙橀噺
+		// 鍔犱笂vuex_鍓嶇紑锛屾槸闃叉鍙橀噺鍚嶅啿绐侊紝涔熻浜轰竴鐩簡鐒�
+		vuex_user: lifeData.vuex_user ? lifeData.vuex_user : {userName: 'pig'},
+		vuex_token: lifeData.vuex_token ? lifeData.vuex_token : '',
+		vuex_remember: lifeData.vuex_remember ? lifeData.vuex_remember : '',
+		vuex_locale: lifeData.vuex_locale ? lifeData.vuex_locale : '',
+		vuex_refresh_token:lifeData.vuex_refresh_token ? lifeData.vuex_refresh_token : '',
+		vuex_username:lifeData.vuex_username ? lifeData.vuex_username : '',
+		vuex_userId:lifeData.vuex_userId ? lifeData.vuex_userId : '',
+		vuex_client_id:lifeData.vuex_client_id ? lifeData.vuex_client_id : '',
+		vuex_config: lifeData.vuex_config ? lifeData.vuex_config : config,
+	},
+	mutations: {
+		$uStore(state, payload) {
+			// 鍒ゆ柇鏄惁澶氬眰绾ц皟鐢紝state涓负瀵硅薄瀛樺湪鐨勬儏鍐碉紝璇稿user.info.score = 1
+			let nameArr = payload.name.split('.');
+			let saveKey = '';
+			let len = nameArr.length;
+			if(len >= 2) {
+				let obj = state[nameArr[0]];
+				for(let i = 1; i < len - 1; i ++) {
+					obj = obj[nameArr[i]];
+				}
+				obj[nameArr[len - 1]] = payload.value;
+				saveKey = nameArr[0];
+			} else {
+				// 鍗曞眰绾у彉閲忥紝鍦╯tate灏辨槸涓�涓櫘閫氬彉閲忕殑鎯呭喌
+				state[payload.name] = payload.value;
+				saveKey = payload.name;
+			}
+			// 淇濆瓨鍙橀噺鍒版湰鍦帮紝瑙侀《閮ㄥ嚱鏁板畾涔�
+			saveLifeData(saveKey, state[saveKey])
+		}
+	}
+})
+
+export default store
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..fe2f305
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2013-Now http://jeesite.com All rights reserved.
+ * 涓嬫柟寮曞叆鐨勪负uView UI鐨勯泦鎴愭牱寮忔枃浠讹紝涓簊css棰勫鐞嗗櫒锛屽叾涓寘鍚簡涓�浜�"u-"寮�澶寸殑鑷畾涔夊彉閲�
+ * 浣跨敤鐨勬椂鍊欙紝璇峰皢涓嬮潰鐨勪竴琛屽鍒跺埌鎮ㄧ殑uniapp椤圭洰鏍圭洰褰曠殑uni.scss涓嵆鍙�
+ * uView鑷畾涔夌殑css绫诲悕鍜宻css鍙橀噺锛屽潎浠�"u-"寮�澶达紝涓嶄細閫犳垚鍐茬獊锛岃鏀惧績浣跨敤 
+ */
+
+$u-main-color: #303133;
+$u-content-color: #505256;
+$u-tips-color: #909399;
+$u-light-color: #c0c4cc;
+$u-border-color: #e4e7ed;
+$u-bg-color: #f3f4f6;
+
+$u-type-primary: #497bff;
+$u-type-primary-light: #ecf5ff;
+$u-type-primary-disabled: #a0cfff;
+$u-type-primary-dark: #2b85e4;
+
+$u-type-warning: #ff9900;
+$u-type-warning-disabled: #fcbd71;
+$u-type-warning-dark: #f29100;
+$u-type-warning-light: #fdf6ec;
+
+$u-type-success: #19be6b;
+$u-type-success-disabled: #71d5a1;
+$u-type-success-dark: #18b566;
+$u-type-success-light: #dbf1e1;
+
+$u-type-error: #fa3534;
+$u-type-error-disabled: #fab6b6;
+$u-type-error-dark: #dd6161;
+$u-type-error-light: #fef0f0;
+
+$u-type-info: #909399;
+$u-type-info-disabled: #c8c9cc;
+$u-type-info-dark: #82848a;
+$u-type-info-light: #f4f4f5;
+
+$u-form-item-height: 70rpx;
+$u-form-item-border-color: #dcdfe6;
diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md
new file mode 100644
index 0000000..e352c60
--- /dev/null
+++ b/uni_modules/uni-badge/changelog.md
@@ -0,0 +1,33 @@
+## 1.2.2锛�2023-01-28锛�
+- 淇 杩愯/鎵撳寘 鎺у埗鍙拌鍛婇棶棰�
+## 1.2.1锛�2022-09-05锛�
+- 淇 褰� text 瓒呰繃 max-num 鏃讹紝badge 鐨勫搴﹁绠楁槸鏍规嵁 text 鐨勯暱搴﹁绠楋紝鏇存敼涓� css 璁$畻瀹為檯灞曠ず瀹藉害锛岃瑙�:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473)
+## 1.2.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge)
+## 1.1.7锛�2021-11-08锛�
+- 浼樺寲 鍗囩骇ui
+- 淇敼 size 灞炴�ч粯璁ゅ�艰皟鏁翠负 small
+- 淇敼 type 灞炴�э紝榛樿鍊艰皟鏁翠负 error锛宨nfo 鏇挎崲 default
+## 1.1.6锛�2021-09-22锛�
+- 淇 鍦ㄥ瓧鑺傚皬绋嬪簭涓婃牱寮忎笉鐢熸晥鐨� bug
+## 1.1.5锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.1.4锛�2021-07-29锛�
+- 淇 鍘绘帀 nvue 涓嶆敮鎸乧ss 鐨� align-self 灞炴�э紝nvue 涓嬩笉鏆傛敮鎸� absolute 灞炴��
+## 1.1.3锛�2021-06-24锛�
+- 浼樺寲 绀轰緥椤圭洰
+## 1.1.1锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.1.0锛�2021-05-12锛�
+- 鏂板 uni-badge 鐨� absolute 灞炴�э紝鏀寔瀹氫綅
+- 鏂板 uni-badge 鐨� offset 灞炴�э紝鏀寔瀹氫綅鍋忕Щ
+- 鏂板 uni-badge 鐨� is-dot 灞炴�э紝鏀寔浠呮樉绀烘湁涓�涓皬鐐�
+- 鏂板 uni-badge 鐨� max-num 灞炴�э紝鏀寔鑷畾涔夊皝椤剁殑鏁板瓧鍊硷紝瓒呰繃 99 鏄剧ず99+
+- 浼樺寲 uni-badge 灞炴�� custom-style锛� 鏀寔浠ュ璞″舰寮忚嚜瀹氫箟鏍峰紡
+## 1.0.7锛�2021-05-07锛�
+- 淇 uni-badge 鍦� App 绔紝鏁板瓧灏忎簬10鏃朵笉鏄渾褰㈢殑bug
+- 淇 uni-badge 鍦ㄧ埗鍏冪礌涓嶆槸 flex 甯冨眬鏃讹紝瀹藉害缂╁皬鐨刡ug
+- 鏂板 uni-badge 灞炴�� custom-style锛� 鏀寔鑷畾涔夋牱寮�
+## 1.0.6锛�2021-02-04锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue
new file mode 100644
index 0000000..956354b
--- /dev/null
+++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue
@@ -0,0 +1,268 @@
+<template>
+	<view class="uni-badge--x">
+		<slot />
+		<text v-if="text" :class="classNames" :style="[positionStyle, customStyle, dotStyle]"
+			class="uni-badge" @click="onClick()">{{displayValue}}</text>
+	</view>
+</template>
+
+<script>
+	/**
+	 * Badge 鏁板瓧瑙掓爣
+	 * @description 鏁板瓧瑙掓爣涓�鑸拰鍏跺畠鎺т欢锛堝垪琛ㄣ��9瀹牸绛夛級閰嶅悎浣跨敤锛岀敤浜庤繘琛屾暟閲忔彁绀猴紝榛樿涓哄疄蹇冪伆鑹茶儗鏅�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=21
+	 * @property {String} text 瑙掓爣鍐呭
+	 * @property {String} size = [normal|small] 瑙掓爣鍐呭
+	 * @property {String} type = [info|primary|success|warning|error] 棰滆壊绫诲瀷
+	 * 	@value info 鐏拌壊
+	 * 	@value primary 钃濊壊
+	 * 	@value success 缁胯壊
+	 * 	@value warning 榛勮壊
+	 * 	@value error 绾㈣壊
+	 * @property {String} inverted = [true|false] 鏄惁鏃犻渶鑳屾櫙棰滆壊
+	 * @property {Number} maxNum 灞曠ず灏侀《鐨勬暟瀛楀�硷紝瓒呰繃 99 鏄剧ず 99+
+	 * @property {String} absolute = [rightTop|rightBottom|leftBottom|leftTop] 寮�鍚粷瀵瑰畾浣�, 瑙掓爣灏嗗畾浣嶅埌鍏跺寘瑁圭殑鏍囩鐨勫洓瑙掍笂
+	 * 	@value rightTop 鍙充笂
+	 * 	@value rightBottom 鍙充笅
+	 * 	@value leftTop 宸︿笂
+	 * 	@value leftBottom 宸︿笅
+	 * @property {Array[number]} offset	璺濆畾浣嶈涓績鐐圭殑鍋忕Щ閲忥紝鍙湁瀛樺湪 absolute 灞炴�ф椂鏈夋晥锛屼緥濡傦細[-10, -10] 琛ㄧず鍚戝鍋忕Щ 10px锛孾10, 10] 琛ㄧず鍚� absolute 鎸囧畾鐨勫唴鍋忕Щ 10px
+	 * @property {String} isDot = [true|false] 鏄惁鏄剧ず涓轰竴涓皬鐐�
+	 * @event {Function} click 鐐瑰嚮 Badge 瑙﹀彂浜嬩欢
+	 * @example <uni-badge text="1"></uni-badge>
+	 */
+
+	export default {
+		name: 'UniBadge',
+		emits: ['click'],
+		props: {
+			type: {
+				type: String,
+				default: 'error'
+			},
+			inverted: {
+				type: Boolean,
+				default: false
+			},
+			isDot: {
+				type: Boolean,
+				default: false
+			},
+			maxNum: {
+				type: Number,
+				default: 99
+			},
+			absolute: {
+				type: String,
+				default: ''
+			},
+			offset: {
+				type: Array,
+				default () {
+					return [0, 0]
+				}
+			},
+			text: {
+				type: [String, Number],
+				default: ''
+			},
+			size: {
+				type: String,
+				default: 'small'
+			},
+			customStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			}
+		},
+		data() {
+			return {};
+		},
+		computed: {
+			width() {
+				return String(this.text).length * 8 + 12
+			},
+			classNames() {
+				const {
+					inverted,
+					type,
+					size,
+					absolute
+				} = this
+				return [
+					inverted ? 'uni-badge--' + type + '-inverted' : '',
+					'uni-badge--' + type,
+					'uni-badge--' + size,
+					absolute ? 'uni-badge--absolute' : ''
+				].join(' ')
+			},
+			positionStyle() {
+				if (!this.absolute) return {}
+				let w = this.width / 2,
+					h = 10
+				if (this.isDot) {
+					w = 5
+					h = 5
+				}
+				const x = `${- w  + this.offset[0]}px`
+				const y = `${- h + this.offset[1]}px`
+
+				const whiteList = {
+					rightTop: {
+						right: x,
+						top: y
+					},
+					rightBottom: {
+						right: x,
+						bottom: y
+					},
+					leftBottom: {
+						left: x,
+						bottom: y
+					},
+					leftTop: {
+						left: x,
+						top: y
+					}
+				}
+				const match = whiteList[this.absolute]
+				return match ? match : whiteList['rightTop']
+			},
+			dotStyle() {
+				if (!this.isDot) return {}
+				return {
+					width: '10px',
+					minWidth: '0',
+					height: '10px',
+					padding: '0',
+					borderRadius: '10px'
+				}
+			},
+			displayValue() {
+				const {
+					isDot,
+					text,
+					maxNum
+				} = this
+				return isDot ? '' : (Number(text) > maxNum ? `${maxNum}+` : text)
+			}
+		},
+		methods: {
+			onClick() {
+				this.$emit('click');
+			}
+		}
+	};
+</script>
+
+<style lang="scss" >
+	$uni-primary: #2979ff !default;
+	$uni-success: #4cd964 !default;
+	$uni-warning: #f0ad4e !default;
+	$uni-error: #dd524d !default;
+	$uni-info: #909399 !default;
+
+
+	$bage-size: 12px;
+	$bage-small: scale(0.8);
+
+	.uni-badge--x {
+		/* #ifdef APP-NVUE */
+		// align-self: flex-start;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		display: inline-block;
+		/* #endif */
+		position: relative;
+	}
+
+	.uni-badge--absolute {
+		position: absolute;
+	}
+
+	.uni-badge--small {
+		transform: $bage-small;
+		transform-origin: center center;
+	}
+
+	.uni-badge {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		overflow: hidden;
+		box-sizing: border-box;
+		font-feature-settings: "tnum";
+		min-width: 20px;
+		/* #endif */
+		justify-content: center;
+		flex-direction: row;
+		height: 20px;
+		padding: 0 4px;
+		line-height: 18px;
+		color: #fff;
+		border-radius: 100px;
+		background-color: $uni-info;
+		background-color: transparent;
+		border: 1px solid #fff;
+		text-align: center;
+		font-family: 'Helvetica Neue', Helvetica, sans-serif;
+		font-size: $bage-size;
+		/* #ifdef H5 */
+		z-index: 999;
+		cursor: pointer;
+		/* #endif */
+
+		&--info {
+			color: #fff;
+			background-color: $uni-info;
+		}
+
+		&--primary {
+			background-color: $uni-primary;
+		}
+
+		&--success {
+			background-color: $uni-success;
+		}
+
+		&--warning {
+			background-color: $uni-warning;
+		}
+
+		&--error {
+			background-color: $uni-error;
+		}
+
+		&--inverted {
+			padding: 0 5px 0 0;
+			color: $uni-info;
+		}
+
+		&--info-inverted {
+			color: $uni-info;
+			background-color: transparent;
+		}
+
+		&--primary-inverted {
+			color: $uni-primary;
+			background-color: transparent;
+		}
+
+		&--success-inverted {
+			color: $uni-success;
+			background-color: transparent;
+		}
+
+		&--warning-inverted {
+			color: $uni-warning;
+			background-color: transparent;
+		}
+
+		&--error-inverted {
+			color: $uni-error;
+			background-color: transparent;
+		}
+
+	}
+</style>
diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json
new file mode 100644
index 0000000..b0bac93
--- /dev/null
+++ b/uni_modules/uni-badge/package.json
@@ -0,0 +1,85 @@
+{
+  "id": "uni-badge",
+  "displayName": "uni-badge 鏁板瓧瑙掓爣",
+  "version": "1.2.2",
+  "description": "鏁板瓧瑙掓爣锛堝窘绔狅級缁勪欢锛屽湪鍏冪礌鍛ㄥ洿灞曠ず娑堟伅鎻愰啋锛屼竴鑸敤浜庡垪琛ㄣ�佷節瀹牸銆佹寜閽瓑鍦版柟銆�",
+  "keywords": [
+    "",
+    "badge",
+    "uni-ui",
+    "uniui",
+    "鏁板瓧瑙掓爣",
+    "寰界珷"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "y",
+          "鑱旂洘": "y"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-badge/readme.md b/uni_modules/uni-badge/readme.md
new file mode 100644
index 0000000..bdf175d
--- /dev/null
+++ b/uni_modules/uni-badge/readme.md
@@ -0,0 +1,10 @@
+## Badge 鏁板瓧瑙掓爣
+> **缁勪欢鍚嶏細uni-badge**
+> 浠g爜鍧楋細 `uBadge`
+
+鏁板瓧瑙掓爣涓�鑸拰鍏跺畠鎺т欢锛堝垪琛ㄣ��9瀹牸绛夛級閰嶅悎浣跨敤锛岀敤浜庤繘琛屾暟閲忔彁绀猴紝榛樿涓哄疄蹇冪伆鑹茶儗鏅紝
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-badge)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
+
+
diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md
new file mode 100644
index 0000000..455308a
--- /dev/null
+++ b/uni_modules/uni-collapse/changelog.md
@@ -0,0 +1,38 @@
+## 1.4.4锛�2024-03-20锛�
+- 淇 titleBorder绫诲瀷淇
+## 1.4.3锛�2022-01-25锛�
+- 淇 鍒濆鍖栫殑鏃跺�� 锛宱pen 灞炴�уけ鏁堢殑bug
+## 1.4.2锛�2022-01-21锛�
+- 淇 寰俊灏忕▼搴弐esize鍚庣粍浠舵敹璧风殑bug
+## 1.4.1锛�2021-11-22锛�
+- 淇 vue3涓釜鍒玸css鍙橀噺鏃犳硶鎵惧埌鐨勯棶棰�
+## 1.4.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse)
+## 1.3.3锛�2021-08-17锛�
+- 浼樺寲 show-arrow 灞炴�ч粯璁や负true
+## 1.3.2锛�2021-08-17锛�
+- 鏂板 show-arrow 灞炴�э紝鎺у埗鏄惁鏄剧ず鍙充晶绠ご
+## 1.3.1锛�2021-07-30锛�
+- 浼樺寲 vue3涓嬪皬绋嬪簭浜嬩欢璀﹀憡鐨勯棶棰�
+## 1.3.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.2.2锛�2021-07-21锛�
+- 淇 鐢�1.2.0鐗堟湰寮曡捣鐨� change 浜嬩欢杩斿洖 undefined 鐨凚ug
+## 1.2.1锛�2021-07-21锛�
+- 浼樺寲 缁勪欢绀轰緥
+## 1.2.0锛�2021-07-21锛�
+- 鏂板 缁勪欢鎶樺彔鍔ㄧ敾
+- 鏂板 value\v-model 灞炴�� 锛屽姩鎬佷慨鏀归潰鏉挎姌鍙犵姸鎬�
+- 鏂板 title 鎻掓Ы 锛屽彲瀹氫箟闈㈡澘鏍囬
+- 鏂板 border 灞炴�� 锛屾樉绀洪殣钘忛潰鏉垮唴瀹瑰垎闅旂嚎
+- 鏂板 title-border 灞炴�� 锛屾樉绀洪殣钘忛潰鏉挎爣棰樺垎闅旂嚎
+- 淇 resize 鏂规硶澶辨晥鐨凚ug
+- 淇 change 浜嬩欢杩斿洖鍙傛暟涓嶆纭殑Bug
+- 浼樺寲 H5銆丄pp 骞冲彴鑷姩鏇村叿鍐呭鏇存柊楂樺害锛屾棤闇�璋冪敤 reszie() 鏂规硶
+## 1.1.7锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.1.6锛�2021-02-05锛�
+- 浼樺寲 缁勪欢寮曠敤鍏崇郴锛岄�氳繃uni_modules寮曠敤缁勪欢
+## 1.1.5锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
\ No newline at end of file
diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
new file mode 100644
index 0000000..2f0862e
--- /dev/null
+++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue
@@ -0,0 +1,402 @@
+<template>
+	<view class="uni-collapse-item">
+		<!-- onClick(!isOpen) -->
+		<view @click="onClick(!isOpen)" class="uni-collapse-item__title"
+			:class="{'is-open':isOpen &&titleBorder === 'auto' ,'uni-collapse-item-border':titleBorder !== 'none'}">
+			<view class="uni-collapse-item__title-wrap">
+				<slot name="title">
+					<view class="uni-collapse-item__title-box" :class="{'is-disabled':disabled}">
+						<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" />
+						<text class="uni-collapse-item__title-text">{{ title }}</text>
+					</view>
+				</slot>
+			</view>
+			<view v-if="showArrow"
+				:class="{ 'uni-collapse-item__title-arrow-active': isOpen, 'uni-collapse-item--animation': showAnimation === true }"
+				class="uni-collapse-item__title-arrow">
+				<uni-icons :color="disabled?'#ddd':'#bbb'" size="14" type="bottom" />
+			</view>
+		</view>
+		<view class="uni-collapse-item__wrap" :class="{'is--transition':showAnimation}"
+			:style="{height: (isOpen?height:0) +'px'}">
+			<view :id="elId" ref="collapse--hook" class="uni-collapse-item__wrap-content"
+				:class="{open:isheight,'uni-collapse-item--border':border&&isOpen}">
+				<slot></slot>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom')
+	// #endif
+	/**
+	 * CollapseItem 鎶樺彔闈㈡澘瀛愮粍浠�
+	 * @description 鎶樺彔闈㈡澘瀛愮粍浠�
+	 * @property {String} title 鏍囬鏂囧瓧
+	 * @property {String} thumb 鏍囬宸︿晶缂╃暐鍥�
+	 * @property {String} name 鍞竴鏍囧織绗�
+	 * @property {Boolean} open = [true|false] 鏄惁灞曞紑缁勪欢
+	 * @property {Boolean} titleBorder = [true|false] 鏄惁鏄剧ず鏍囬鍒嗛殧绾�
+	 * @property {String} border = ['auto'|'show'|'none'] 鏄惁鏄剧ず鍒嗛殧绾�
+	 * @property {Boolean} disabled = [true|false] 鏄惁灞曞紑闈㈡澘
+	 * @property {Boolean} showAnimation = [true|false] 寮�鍚姩鐢�
+	 * @property {Boolean} showArrow = [true|false] 鏄惁鏄剧ず鍙充晶绠ご
+	 */
+	export default {
+		name: 'uniCollapseItem',
+		props: {
+			// 鍒楄〃鏍囬
+			title: {
+				type: String,
+				default: ''
+			},
+			name: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鏄惁绂佺敤
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// #ifdef APP-PLUS
+			// 鏄惁鏄剧ず鍔ㄧ敾,app 绔粯璁や笉寮�鍚姩鐢伙紝鍗¢】涓ラ噸
+			showAnimation: {
+				type: Boolean,
+				default: false
+			},
+			// #endif
+			// #ifndef APP-PLUS
+			// 鏄惁鏄剧ず鍔ㄧ敾
+			showAnimation: {
+				type: Boolean,
+				default: true
+			},
+			// #endif
+			// 鏄惁灞曞紑
+			open: {
+				type: Boolean,
+				default: false
+			},
+			// 缂╃暐鍥�
+			thumb: {
+				type: String,
+				default: ''
+			},
+			// 鏍囬鍒嗛殧绾挎樉绀虹被鍨�
+			titleBorder: {
+				type: String,
+				default: 'auto'
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			showArrow: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			// TODO 闅忔満鐢熺敓鍏冪礌ID锛岃В鍐崇櫨搴﹀皬绋嬪簭鑾峰彇鍚屼竴涓厓绱犱綅缃俊鎭殑bug
+			const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+			return {
+				isOpen: false,
+				isheight: null,
+				height: 0,
+				elId,
+				nameSync: 0
+			}
+		},
+		watch: {
+			open(val) {
+				this.isOpen = val
+				this.onClick(val, 'init')
+			}
+		},
+		updated(e) {
+			this.$nextTick(() => {
+				this.init(true)
+			})
+		},
+		created() {
+			this.collapse = this.getCollapse()
+			this.oldHeight = 0
+			this.onClick(this.open, 'init')
+		},
+		// #ifndef VUE3
+		// TODO vue2
+		destroyed() {
+			if (this.__isUnmounted) return
+			this.uninstall()
+		},
+		// #endif
+		// #ifdef VUE3
+		// TODO vue3
+		unmounted() {
+			this.__isUnmounted = true
+			this.uninstall()
+		},
+		// #endif
+		mounted() {
+			if (!this.collapse) return
+			if (this.name !== '') {
+				this.nameSync = this.name
+			} else {
+				this.nameSync = this.collapse.childrens.length + ''
+			}
+			if (this.collapse.names.indexOf(this.nameSync) === -1) {
+				this.collapse.names.push(this.nameSync)
+			} else {
+				console.warn(`name 鍊� ${this.nameSync} 閲嶅`);
+			}
+			if (this.collapse.childrens.indexOf(this) === -1) {
+				this.collapse.childrens.push(this)
+			}
+			this.init()
+		},
+		methods: {
+			init(type) {
+				// #ifndef APP-NVUE
+				this.getCollapseHeight(type)
+				// #endif
+				// #ifdef APP-NVUE
+				this.getNvueHwight(type)
+				// #endif
+			},
+			uninstall() {
+				if (this.collapse) {
+					this.collapse.childrens.forEach((item, index) => {
+						if (item === this) {
+							this.collapse.childrens.splice(index, 1)
+						}
+					})
+					this.collapse.names.forEach((item, index) => {
+						if (item === this.nameSync) {
+							this.collapse.names.splice(index, 1)
+						}
+					})
+				}
+			},
+			onClick(isOpen, type) {
+				if (this.disabled) return
+				this.isOpen = isOpen
+				if (this.isOpen && this.collapse) {
+					this.collapse.setAccordion(this)
+				}
+				if (type !== 'init') {
+					this.collapse.onChange(isOpen, this)
+				}
+			},
+			getCollapseHeight(type, index = 0) {
+				const views = uni.createSelectorQuery().in(this)
+				views
+					.select(`#${this.elId}`)
+					.fields({
+						size: true
+					}, data => {
+						// TODO 鐧惧害涓彲鑳借幏鍙栦笉鍒拌妭鐐逛俊鎭� 锛岄渶瑕佸惊鐜幏鍙�
+						if (index >= 10) return
+						if (!data) {
+							index++
+							this.getCollapseHeight(false, index)
+							return
+						}
+						// #ifdef APP-NVUE
+						this.height = data.height + 1
+						// #endif
+						// #ifndef APP-NVUE
+						this.height = data.height
+						// #endif
+						this.isheight = true
+						if (type) return
+						this.onClick(this.isOpen, 'init')
+					})
+					.exec()
+			},
+			getNvueHwight(type) {
+				const result = dom.getComponentRect(this.$refs['collapse--hook'], option => {
+					if (option && option.result && option.size) {
+						// #ifdef APP-NVUE
+						this.height = option.size.height + 1
+						// #endif
+						// #ifndef APP-NVUE
+						this.height = option.size.height
+						// #endif
+						this.isheight = true
+						if (type) return
+						this.onClick(this.open, 'init')
+					}
+				})
+			},
+			/**
+			 * 鑾峰彇鐖跺厓绱犲疄渚�
+			 */
+			getCollapse(name = 'uniCollapse') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false;
+					parentName = parent.$options.name;
+				}
+				return parent;
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.uni-collapse-item {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+
+		/* #endif */
+		&__title {
+			/* #ifndef APP-NVUE */
+			display: flex;
+			width: 100%;
+			box-sizing: border-box;
+			/* #endif */
+			flex-direction: row;
+			align-items: center;
+			transition: border-bottom-color .3s;
+
+			// transition-property: border-bottom-color;
+			// transition-duration: 5s;
+			&-wrap {
+				width: 100%;
+				flex: 1;
+
+			}
+
+			&-box {
+				padding: 0 15px;
+				/* #ifndef APP-NVUE */
+				display: flex;
+				width: 100%;
+				box-sizing: border-box;
+				/* #endif */
+				flex-direction: row;
+				justify-content: space-between;
+				align-items: center;
+				height: 48px;
+				line-height: 48px;
+				background-color: #fff;
+				color: #303133;
+				font-size: 13px;
+				font-weight: 500;
+				/* #ifdef H5 */
+				cursor: pointer;
+				outline: none;
+
+				/* #endif */
+				&.is-disabled {
+					.uni-collapse-item__title-text {
+						color: #999;
+					}
+				}
+
+			}
+
+			&.uni-collapse-item-border {
+				border-bottom: 1px solid #ebeef5;
+			}
+
+			&.is-open {
+				border-bottom-color: transparent;
+			}
+
+			&-img {
+				height: 22px;
+				width: 22px;
+				margin-right: 10px;
+			}
+
+			&-text {
+				flex: 1;
+				font-size: 14px;
+				/* #ifndef APP-NVUE */
+				white-space: nowrap;
+				color: inherit;
+				/* #endif */
+				/* #ifdef APP-NVUE */
+				lines: 1;
+				/* #endif */
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+
+			&-arrow {
+				/* #ifndef APP-NVUE */
+				display: flex;
+				box-sizing: border-box;
+				/* #endif */
+				align-items: center;
+				justify-content: center;
+				width: 20px;
+				height: 20px;
+				margin-right: 10px;
+				transform: rotate(0deg);
+
+				&-active {
+					transform: rotate(-180deg);
+				}
+			}
+
+
+		}
+
+		&__wrap {
+			/* #ifndef APP-NVUE */
+			will-change: height;
+			box-sizing: border-box;
+			/* #endif */
+			background-color: #fff;
+			overflow: hidden;
+			position: relative;
+			height: 0;
+
+			&.is--transition {
+				// transition: all 0.3s;
+				transition-property: height, border-bottom-width;
+				transition-duration: 0.3s;
+				/* #ifndef APP-NVUE */
+				will-change: height;
+				/* #endif */
+			}
+
+
+
+			&-content {
+				position: absolute;
+				font-size: 13px;
+				color: #303133;
+				// transition: height 0.3s;
+				border-bottom-color: transparent;
+				border-bottom-style: solid;
+				border-bottom-width: 0;
+
+				&.uni-collapse-item--border {
+					border-bottom-width: 1px;
+					border-bottom-color: red;
+					border-bottom-color: #ebeef5;
+				}
+
+				&.open {
+					position: relative;
+				}
+			}
+		}
+
+		&--animation {
+			transition-property: transform;
+			transition-duration: 0.3s;
+			transition-timing-function: ease;
+		}
+
+	}
+</style>
diff --git a/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue
new file mode 100644
index 0000000..384c39a
--- /dev/null
+++ b/uni_modules/uni-collapse/components/uni-collapse/uni-collapse.vue
@@ -0,0 +1,147 @@
+<template>
+	<view class="uni-collapse">
+		<slot />
+	</view>
+</template>
+<script>
+	/**
+	 * Collapse 鎶樺彔闈㈡澘
+	 * @description 灞曠ず鍙互鎶樺彔 / 灞曞紑鐨勫唴瀹瑰尯鍩�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=23
+	 * @property {String|Array} value 褰撳墠婵�娲婚潰鏉挎敼鍙樻椂瑙﹀彂(濡傛灉鏄墜椋庣惔妯″紡锛屽弬鏁扮被鍨嬩负string锛屽惁鍒欎负array)
+	 * @property {Boolean} accordion = [true|false] 鏄惁寮�鍚墜椋庣惔鏁堟灉鏄惁寮�鍚墜椋庣惔鏁堟灉
+	 * @event {Function} change 鍒囨崲闈㈡澘鏃惰Е鍙戯紝濡傛灉鏄墜椋庣惔妯″紡锛岃繑鍥炵被鍨嬩负string锛屽惁鍒欎负array
+	 */
+	export default {
+		name: 'uniCollapse',
+		emits:['change','activeItem','input','update:modelValue'],
+		props: {
+			value: {
+				type: [String, Array],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Array],
+				default: ''
+			},
+			accordion: {
+				// 鏄惁寮�鍚墜椋庣惔鏁堟灉
+				type: [Boolean, String],
+				default: false
+			},
+		},
+		data() {
+			return {}
+		},
+		computed: {
+			// TODO 鍏煎 vue2 鍜� vue3
+			dataValue() {
+				let value = (typeof this.value === 'string' && this.value === '') ||
+					(Array.isArray(this.value) && this.value.length === 0)
+				let modelValue = (typeof this.modelValue === 'string' && this.modelValue === '') ||
+					(Array.isArray(this.modelValue) && this.modelValue.length === 0)
+				if (value) {
+					return this.modelValue
+				}
+				if (modelValue) {
+					return this.value
+				}
+
+				return this.value
+			}
+		},
+		watch: {
+			dataValue(val) {
+				this.setOpen(val)
+			}
+		},
+		created() {
+			this.childrens = []
+			this.names = []
+		},
+		mounted() {
+			this.$nextTick(()=>{
+				this.setOpen(this.dataValue)
+			})
+		},
+		methods: {
+			setOpen(val) {
+				let str = typeof val === 'string'
+				let arr = Array.isArray(val)
+				this.childrens.forEach((vm, index) => {
+					if (str) {
+						if (val === vm.nameSync) {
+							if (!this.accordion) {
+								console.warn('accordion 灞炴�т负 false ,v-model 绫诲瀷搴旇涓� array')
+								return
+							}
+							vm.isOpen = true
+						}
+					}
+					if (arr) {
+						val.forEach(v => {
+							if (v === vm.nameSync) {
+								if (this.accordion) {
+									console.warn('accordion 灞炴�т负 true ,v-model 绫诲瀷搴旇涓� string')
+									return
+								}
+								vm.isOpen = true
+							}
+						})
+					}
+				})
+				this.emit(val)
+			},
+			setAccordion(self) {
+				if (!this.accordion) return
+				this.childrens.forEach((vm, index) => {
+					if (self !== vm) {
+						vm.isOpen = false
+					}
+				})
+			},
+			resize() {
+				this.childrens.forEach((vm, index) => {
+					// #ifndef APP-NVUE
+					vm.getCollapseHeight()
+					// #endif
+					// #ifdef APP-NVUE
+					vm.getNvueHwight()
+					// #endif
+				})
+			},
+			onChange(isOpen, self) {
+				let activeItem = []
+
+				if (this.accordion) {
+					activeItem = isOpen ? self.nameSync : ''
+				} else {
+					this.childrens.forEach((vm, index) => {
+						if (vm.isOpen) {
+							activeItem.push(vm.nameSync)
+						}
+					})
+				}
+				this.$emit('change', activeItem)
+				this.emit(activeItem)
+			},
+			emit(val){
+				this.$emit('input', val)
+				this.$emit('update:modelValue', val)
+			}
+		}
+	}
+</script>
+<style lang="scss" >
+	.uni-collapse {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		display: flex;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+		flex-direction: column;
+		background-color: #fff;
+	}
+</style>
diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json
new file mode 100644
index 0000000..65c5c2e
--- /dev/null
+++ b/uni_modules/uni-collapse/package.json
@@ -0,0 +1,86 @@
+{
+  "id": "uni-collapse",
+  "displayName": "uni-collapse 鎶樺彔闈㈡澘",
+  "version": "1.4.4",
+  "description": "Collapse 缁勪欢锛屽彲浠ユ姌鍙� / 灞曞紑鐨勫唴瀹瑰尯鍩熴��",
+  "keywords": [
+    "uni-ui",
+    "鎶樺彔",
+    "鎶樺彔闈㈡澘",
+    "鎵嬮鐞�"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+      "uni-icons"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-collapse/readme.md b/uni_modules/uni-collapse/readme.md
new file mode 100644
index 0000000..bc758eb
--- /dev/null
+++ b/uni_modules/uni-collapse/readme.md
@@ -0,0 +1,12 @@
+
+
+## Collapse 鎶樺彔闈㈡澘
+> **缁勪欢鍚嶏細uni-collapse**
+> 浠g爜鍧楋細 `uCollapse`
+> 鍏宠仈缁勪欢锛歚uni-collapse-item`銆乣uni-icons`銆�
+
+
+鎶樺彔闈㈡澘鐢ㄦ潵鎶樺彔/鏄剧ず杩囬暱鐨勫唴瀹规垨鑰呮槸鍒楄〃銆傞�氬父鏄湪澶氬唴瀹瑰垎绫婚」浣跨敤锛屾姌鍙犱笉閲嶈鐨勫唴瀹癸紝鏄剧ず閲嶈鍐呭銆傜偣鍑诲彲浠ュ睍寮�鎶樺彔閮ㄥ垎銆�
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-collapse)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
\ No newline at end of file
diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md
new file mode 100644
index 0000000..016e3d2
--- /dev/null
+++ b/uni_modules/uni-data-select/changelog.md
@@ -0,0 +1,39 @@
+## 1.0.8锛�2024-03-28锛�
+- 淇 鍦╲ue2涓�:style鍔ㄦ�佺粦瀹氬鑷寸紪璇戝け璐ョ殑bug
+## 1.0.7锛�2024-01-20锛�
+- 淇 闀挎枃鏈洖鏄捐秴杩囧鍣ㄧ殑bug锛岃秴杩囧鍣ㄩ儴鍒嗘樉绀虹渷鐣ュ彿
+## 1.0.6锛�2023-04-12锛�
+- 淇 寰俊灏忕▼搴忕偣鍑绘椂浼氭敼鍙樿儗鏅鑹茬殑 bug
+## 1.0.5锛�2023-02-03锛�
+- 淇 绂佺敤鏃朵細鏄剧ず娓呯┖鎸夐挳
+## 1.0.4锛�2023-02-02锛�
+- 浼樺寲 鏌ヨ鏉′欢鐭湡鍐呭娆″彉鏇村彧鏌ヨ鏈�鍚庝竴娆″彉鏇村悗鐨勭粨鏋�
+- 璋冩暣 鍐呴儴缂撳瓨閿悕璋冩暣涓� uni-data-select-lastSelectedValue
+## 1.0.3锛�2023-01-16锛�
+- 淇 涓嶅叧鑱旀湇鍔$┖闂存姤閿欑殑闂
+## 1.0.2锛�2023-01-14锛�
+- 鏂板  灞炴�� `format` 鍙敤浜庢牸寮忓寲鏄剧ず閫夐」鍐呭
+## 1.0.1锛�2022-12-06锛�
+- 淇  褰搘here鍙樺寲鏃讹紝鏁版嵁涓嶄細鑷姩鏇存柊鐨勯棶棰�
+## 0.1.9锛�2022-09-05锛�
+- 淇 寰俊灏忕▼搴忎笅鎷夋鍑虹幇鍚庨�夋嫨浼氱偣鍑诲埌钂欐澘鍚庨潰鐨勮緭鍏ユ
+## 0.1.8锛�2022-08-29锛�
+- 淇 鐐瑰嚮鐨勪綅缃笉鍑嗙‘
+## 0.1.7锛�2022-08-12锛�
+- 鏂板 鏀寔 disabled 灞炴��
+## 0.1.6锛�2022-07-06锛�
+- 淇 pc绔搴﹀紓甯哥殑bug
+## 0.1.5
+- 淇 pc绔搴﹀紓甯哥殑bug
+## 0.1.4锛�2022-07-05锛�
+- 浼樺寲 鏄剧ず鏍峰紡
+## 0.1.3锛�2022-06-02锛�
+- 淇 localdata 璧嬪�间笉鐢熸晥鐨� bug
+- 鏂板 鏀寔  uni.scss 淇敼棰滆壊
+- 鏂板 鏀寔閫夐」绂佺敤锛堟暟鎹�夐」璁剧疆 disabled: true 鍗崇鐢級
+## 0.1.2锛�2022-05-08锛�
+- 淇 褰� value 涓� 0 鏃堕�夋嫨涓嶇敓鏁堢殑 bug
+## 0.1.1锛�2022-05-07锛�
+- 鏂板 璁颁綇涓婃鐨勯�夐」锛堜粎 collection 瀛樺湪鏃舵湁鏁堬級
+## 0.1.0锛�2022-04-22锛�
+- 鍒濆鍖�
diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
new file mode 100644
index 0000000..aa873a1
--- /dev/null
+++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue
@@ -0,0 +1,572 @@
+<template>
+	<view class="uni-stat__select">
+		<span v-if="label" class="uni-label-text hide-on-phone">{{label + '锛�'}}</span>
+		<view class="uni-stat-box" :class="{'uni-stat__actived': current}">
+			<view class="uni-select" :class="{'uni-select--disabled':disabled,'uni-select--border':border}">
+				<view class="uni-select__input-box" @click="toggleSelector">
+					<view v-if="current" class="uni-select__input-text">{{textShow}}</view>
+					<view v-else class="uni-select__input-text uni-select__input-placeholder">{{typePlaceholder}}</view>
+					<view v-if="current && clear && !disabled" @click.stop="clearVal">
+						<uni-icons type="clear" color="#c0c4cc" size="24" />
+					</view>
+					<view v-else>
+						<uni-icons :type="showSelector? 'top' : 'bottom'" size="14" color="#999" />
+					</view>
+				</view>
+				<view class="uni-select--mask" v-if="showSelector" @click="toggleSelector" />
+				<view class="uni-select__selector" :style="getOffsetByPlacement" v-if="showSelector">
+					<view :class="placement=='bottom'?'uni-popper__arrow_bottom':'uni-popper__arrow_top'"></view>
+					<scroll-view scroll-y="true" class="uni-select__selector-scroll">
+						<view class="uni-select__selector-empty" v-if="mixinDatacomResData.length === 0">
+							<text>{{emptyTips}}</text>
+						</view>
+						<view v-else class="uni-select__selector-item" v-for="(item,index) in mixinDatacomResData"
+							:key="index" @click="change(item)">
+							<text
+								:class="{'uni-select__selector__disabled': item.disable}">{{formatItemName(item)}}</text>
+						</view>
+					</scroll-view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * DataChecklist 鏁版嵁閫夋嫨鍣�
+	 * @description 閫氳繃鏁版嵁娓叉煋鐨勪笅鎷夋缁勪欢
+	 * @tutorial https://uniapp.dcloud.io/component/uniui/uni-data-select
+	 * @property {String} value 榛樿鍊�
+	 * @property {Array} localdata 鏈湴鏁版嵁 锛屾牸寮� [{text:'',value:''}]
+	 * @property {Boolean} clear 鏄惁鍙互娓呯┖宸查�夐」
+	 * @property {Boolean} emptyText 娌℃湁鏁版嵁鏃舵樉绀虹殑鏂囧瓧 锛屾湰鍦版暟鎹棤鏁�
+	 * @property {String} label 宸︿晶鏍囬
+	 * @property {String} placeholder 杈撳叆妗嗙殑鎻愮ず鏂囧瓧
+	 * @property {Boolean} disabled 鏄惁绂佺敤
+	 * @property {String} placement 寮瑰嚭浣嶇疆
+	 * 	@value top   		椤堕儴寮瑰嚭
+	 * 	@value bottom		搴曢儴寮瑰嚭锛坉efault)
+	 * @event {Function} change  閫変腑鍙戠敓鍙樺寲瑙﹀彂
+	 */
+
+	export default {
+		name: "uni-data-select",
+		mixins: [uniCloud.mixinDatacom || {}],
+		props: {
+			localdata: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			label: {
+				type: String,
+				default: ''
+			},
+			placeholder: {
+				type: String,
+				default: '璇烽�夋嫨'
+			},
+			emptyTips: {
+				type: String,
+				default: '鏃犻�夐」'
+			},
+			clear: {
+				type: Boolean,
+				default: true
+			},
+			defItem: {
+				type: Number,
+				default: 0
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			// 鏍煎紡鍖栬緭鍑� 鐢ㄦ硶 field="_id as value, version as text, uni_platform as label" format="{label} - {text}"
+			format: {
+				type: String,
+				default: ''
+			},
+			placement: {
+				type: String,
+				default: 'bottom'
+			}
+		},
+		data() {
+			return {
+				showSelector: false,
+				current: '',
+				mixinDatacomResData: [],
+				apps: [],
+				channels: [],
+				cacheKey: "uni-data-select-lastSelectedValue",
+			};
+		},
+		created() {
+			this.debounceGet = this.debounce(() => {
+				this.query();
+			}, 300);
+			if (this.collection && !this.localdata.length) {
+				this.debounceGet();
+			}
+		},
+		computed: {
+			typePlaceholder() {
+				const text = {
+					'opendb-stat-app-versions': '鐗堟湰',
+					'opendb-app-channels': '娓犻亾',
+					'opendb-app-list': '搴旂敤'
+				}
+				const common = this.placeholder
+				const placeholder = text[this.collection]
+				return placeholder ?
+					common + placeholder :
+					common
+			},
+			valueCom() {
+				// #ifdef VUE3
+				return this.modelValue;
+				// #endif
+				// #ifndef VUE3
+				return this.value;
+				// #endif
+			},
+			textShow() {
+				// 闀挎枃鏈樉绀�
+				let text = this.current;
+				if (text.length > 10) {
+					return text.slice(0, 25) + '...';
+				}
+				return text;
+			},
+			getOffsetByPlacement() {
+				switch (this.placement) {
+					case 'top':
+						return "bottom:calc(100% + 12px);";
+					case 'bottom':
+						return "top:calc(100% + 12px);";
+				}
+			}
+		},
+
+		watch: {
+			localdata: {
+				immediate: true,
+				handler(val, old) {
+					if (Array.isArray(val) && old !== val) {
+						this.mixinDatacomResData = val
+					}
+				}
+			},
+			valueCom(val, old) {
+				this.initDefVal()
+			},
+			mixinDatacomResData: {
+				immediate: true,
+				handler(val) {
+					if (val.length) {
+						this.initDefVal()
+					}
+				}
+			},
+
+		},
+		methods: {
+			debounce(fn, time = 100) {
+				let timer = null
+				return function(...args) {
+					if (timer) clearTimeout(timer)
+					timer = setTimeout(() => {
+						fn.apply(this, args)
+					}, time)
+				}
+			},
+			// 鎵ц鏁版嵁搴撴煡璇�
+			query() {
+				this.mixinDatacomEasyGet();
+			},
+			// 鐩戝惉鏌ヨ鏉′欢鍙樻洿浜嬩欢
+			onMixinDatacomPropsChange() {
+				if (this.collection) {
+					this.debounceGet();
+				}
+			},
+			initDefVal() {
+				let defValue = ''
+				if ((this.valueCom || this.valueCom === 0) && !this.isDisabled(this.valueCom)) {
+					defValue = this.valueCom
+				} else {
+					let strogeValue
+					if (this.collection) {
+						strogeValue = this.getCache()
+					}
+					if (strogeValue || strogeValue === 0) {
+						defValue = strogeValue
+					} else {
+						let defItem = ''
+						if (this.defItem > 0 && this.defItem <= this.mixinDatacomResData.length) {
+							defItem = this.mixinDatacomResData[this.defItem - 1].value
+						}
+						defValue = defItem
+					}
+					if (defValue || defValue === 0) {
+						this.emit(defValue)
+					}
+				}
+				const def = this.mixinDatacomResData.find(item => item.value === defValue)
+				this.current = def ? this.formatItemName(def) : ''
+			},
+
+			/**
+			 * @param {[String, Number]} value
+			 * 鍒ゆ柇鐢ㄦ埛缁欑殑 value 鏄惁鍚屾椂涓虹鐢ㄧ姸鎬�
+			 */
+			isDisabled(value) {
+				let isDisabled = false;
+
+				this.mixinDatacomResData.forEach(item => {
+					if (item.value === value) {
+						isDisabled = item.disable
+					}
+				})
+
+				return isDisabled;
+			},
+
+			clearVal() {
+				this.emit('')
+				if (this.collection) {
+					this.removeCache()
+				}
+			},
+			change(item) {
+				if (!item.disable) {
+					this.showSelector = false
+					this.current = this.formatItemName(item)
+					this.emit(item.value)
+				}
+			},
+			emit(val) {
+				this.$emit('input', val)
+				this.$emit('update:modelValue', val)
+				this.$emit('change', val)
+				if (this.collection) {
+					this.setCache(val);
+				}
+			},
+			toggleSelector() {
+				if (this.disabled) {
+					return
+				}
+
+				this.showSelector = !this.showSelector
+			},
+			formatItemName(item) {
+				let {
+					text,
+					value,
+					channel_code
+				} = item
+				channel_code = channel_code ? `(${channel_code})` : ''
+
+				if (this.format) {
+					// 鏍煎紡鍖栬緭鍑�
+					let str = "";
+					str = this.format;
+					for (let key in item) {
+						str = str.replace(new RegExp(`{${key}}`, "g"), item[key]);
+					}
+					return str;
+				} else {
+					return this.collection.indexOf('app-list') > 0 ?
+						`${text}(${value})` :
+						(
+							text ?
+							text :
+							`鏈懡鍚�${channel_code}`
+						)
+				}
+			},
+			// 鑾峰彇褰撳墠鍔犺浇鐨勬暟鎹�
+			getLoadData() {
+				return this.mixinDatacomResData;
+			},
+			// 鑾峰彇褰撳墠缂撳瓨key
+			getCurrentCacheKey() {
+				return this.collection;
+			},
+			// 鑾峰彇缂撳瓨
+			getCache(name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				return cacheData[name];
+			},
+			// 璁剧疆缂撳瓨
+			setCache(value, name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				cacheData[name] = value;
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+			// 鍒犻櫎缂撳瓨
+			removeCache(name = this.getCurrentCacheKey()) {
+				let cacheData = uni.getStorageSync(this.cacheKey) || {};
+				delete cacheData[name];
+				uni.setStorageSync(this.cacheKey, cacheData);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-base-color: #6a6a6a !default;
+	$uni-main-color: #333 !default;
+	$uni-secondary-color: #909399 !default;
+	$uni-border-3: #e5e5e5;
+
+	/* #ifndef APP-NVUE */
+	@media screen and (max-width: 500px) {
+		.hide-on-phone {
+			display: none;
+		}
+	}
+
+	/* #endif */
+	.uni-stat__select {
+		display: flex;
+		align-items: center;
+		// padding: 15px;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+		width: 100%;
+		flex: 1;
+		box-sizing: border-box;
+	}
+
+	.uni-stat-box {
+		width: 100%;
+		flex: 1;
+	}
+
+	.uni-stat__actived {
+		width: 100%;
+		flex: 1;
+		// outline: 1px solid #2979ff;
+	}
+
+	.uni-label-text {
+		font-size: 14px;
+		font-weight: bold;
+		color: $uni-base-color;
+		margin: auto 0;
+		margin-right: 5px;
+	}
+
+	.uni-select {
+		font-size: 14px;
+		// border: 1px solid $uni-border-3;
+		box-sizing: border-box;
+		border-radius: 4px;
+		padding: 0 5px;
+		padding-left: 10px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		user-select: none;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		// border-bottom: solid 1px $uni-border-3;
+		width: 100%;
+		flex: 1;
+		height: 35px;
+
+		&--disabled {
+			background-color: #f5f7fa;
+			cursor: not-allowed;
+		}
+
+		&--border {
+			border: 1px solid $uni-border-3;
+			border-bottom: solid 1px $uni-border-3;
+		}
+	}
+
+	.uni-select__label {
+		font-size: 16px;
+		// line-height: 22px;
+		height: 35px;
+		padding-right: 10px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__input-box {
+		height: 35px;
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-select__input {
+		flex: 1;
+		font-size: 14px;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-select__input-plac {
+		font-size: 14px;
+		color: $uni-secondary-color;
+	}
+
+	.uni-select__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border: 1px solid #EBEEF5;
+		border-radius: 6px;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		z-index: 3;
+		padding: 4px 0;
+	}
+
+	.uni-select__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	/* #ifdef H5 */
+	@media (min-width: 768px) {
+		.uni-select__selector-scroll {
+			max-height: 600px;
+		}
+	}
+
+	/* #endif */
+
+	.uni-select__selector-empty,
+	.uni-select__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 35px;
+		font-size: 14px;
+		text-align: center;
+		/* border-bottom: solid 1px $uni-border-3; */
+		padding: 0px 10px;
+	}
+
+	.uni-select__selector-item:hover {
+		background-color: #f9f9f9;
+	}
+
+	.uni-select__selector-empty:last-child,
+	.uni-select__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+
+	.uni-select__selector__disabled {
+		opacity: 0.4;
+		cursor: default;
+	}
+
+	/* picker 寮瑰嚭灞傞�氱敤鐨勬寚绀哄皬涓夎 */
+	.uni-popper__arrow_bottom,
+	.uni-popper__arrow_bottom::after,
+	.uni-popper__arrow_top,
+	.uni-popper__arrow_top::after,
+	{
+	position: absolute;
+	display: block;
+	width: 0;
+	height: 0;
+	border-color: transparent;
+	border-style: solid;
+	border-width: 6px;
+	}
+
+	.uni-popper__arrow_bottom {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow_bottom::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+
+	.uni-popper__arrow_top {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		bottom: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-bottom-width: 0;
+		border-top-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow_top::after {
+		content: " ";
+		bottom: 1px;
+		margin-left: -6px;
+		border-bottom-width: 0;
+		border-top-color: #fff;
+	}
+
+
+	.uni-select__input-text {
+		// width: 280px;
+		width: 100%;
+		color: $uni-main-color;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow: ellipsis;
+		overflow: hidden;
+	}
+
+	.uni-select__input-placeholder {
+		color: $uni-base-color;
+		font-size: 12px;
+	}
+
+	.uni-select--mask {
+		position: fixed;
+		top: 0;
+		bottom: 0;
+		right: 0;
+		left: 0;
+		z-index: 2;
+	}
+</style>
\ No newline at end of file
diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json
new file mode 100644
index 0000000..5864594
--- /dev/null
+++ b/uni_modules/uni-data-select/package.json
@@ -0,0 +1,86 @@
+{
+  "id": "uni-data-select",
+  "displayName": "uni-data-select 涓嬫媺妗嗛�夋嫨鍣�",
+  "version": "1.0.8",
+  "description": "閫氳繃鏁版嵁椹卞姩鐨勪笅鎷夋閫夋嫨鍣�",
+  "keywords": [
+    "uni-ui",
+    "select",
+    "uni-data-select",
+    "涓嬫媺妗�",
+    "涓嬫媺閫�"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.1"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-load-more"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "App": {
+          "app-vue": "u",
+          "app-nvue": "n"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "u",
+          "鐧惧害": "u",
+          "瀛楄妭璺冲姩": "u",
+        "QQ": "u",
+        "浜笢": "u"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md
new file mode 100644
index 0000000..eb58de3
--- /dev/null
+++ b/uni_modules/uni-data-select/readme.md
@@ -0,0 +1,8 @@
+## DataSelect 涓嬫媺妗嗛�夋嫨鍣�
+> **缁勪欢鍚嶏細uni-data-select**
+> 浠g爜鍧楋細 `uDataSelect`
+
+褰撻�夐」杩囧鏃讹紝浣跨敤涓嬫媺鑿滃崟灞曠ず骞堕�夋嫨鍐呭
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-data-select)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md
new file mode 100644
index 0000000..8798e93
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/changelog.md
@@ -0,0 +1,160 @@
+## 2.2.34锛�2024-04-24锛�
+- 鏂板 鏃ユ湡鐐瑰嚮浜嬩欢锛屽湪鐐瑰嚮鏃ユ湡鏃朵細瑙﹀彂璇ヤ簨浠躲��
+## 2.2.33锛�2024-04-15锛�
+- 淇 鎶栭煶灏忕▼搴忎簨浠朵紶閫掑け鏁坆ug
+## 2.2.32锛�2024-02-20锛�
+- 淇 鏃ュ巻鐨刢lose浜嬩欢瑙﹀彂寮傚父鐨刡ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/844)
+## 2.2.31锛�2024-02-20锛�
+- 淇 h5骞冲彴 鍙宠竟鏃ュ巻鐨勬湀浠介粯璁�+1鐨刡ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/841)
+## 2.2.30锛�2024-01-31锛�
+- 淇 闅愯棌鈥滅鈥濇椂锛屽湪IOS15鍙婁互涓嬬増鏈椂鍑虹幇 缁撴潫鏃堕棿鍦ㄥ紑濮嬫椂闂翠箣鍓� 鐨刡ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/788)
+## 2.2.29锛�2024-01-20锛�
+- 鏂板 show浜嬩欢锛屽脊绐楀脊鍑烘椂瑙﹀彂璇ヤ簨浠� [璇︽儏](https://github.com/dcloudio/uni-app/issues/4694)
+## 2.2.28锛�2024-01-18锛�
+- 鍘婚櫎 noChange浜嬩欢锛屽綋杩涜鏃ユ湡鑼冨洿閫夋嫨鏃讹紝鑻ュ彧閫変簡涓�澶╋紝鍒欏紑濮嬬粨鏉熸棩鏈熼兘涓哄悓涓�澶� [璇︽儏](https://github.com/dcloudio/uni-ui/issues/815)
+## 2.2.27锛�2024-01-10锛�
+- 浼樺寲 澧炲姞noChange浜嬩欢锛屽綋杩涜鏃ユ湡鑼冨洿閫夋嫨鏃讹紝鑻ユ湁绌哄�硷紝鍒欒Е鍙戣浜嬩欢 [璇︽儏](https://github.com/dcloudio/uni-ui/issues/815)
+## 2.2.26锛�2024-01-08锛�
+- 淇 瀛楄妭灏忕▼搴忔椂闂撮�夋嫨鑼冨洿鍣ㄥけ鏁堥棶棰� [璇︽儏](https://github.com/dcloudio/uni-ui/issues/834)
+## 2.2.25锛�2023-10-18锛�
+- 淇 PC绔垵娆′慨鏀规椂闂达紝寮�濮嬫椂闂存湭鏇存柊鐨凚ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/737)
+## 2.2.24锛�2023-06-02锛�
+- 淇 閮ㄥ垎鎯呭喌淇敼鏃堕棿锛屽紑濮嬨�佺粨鏉熸椂闂存樉绀哄紓甯哥殑Bug [璇︽儏](https://ask.dcloud.net.cn/question/171146)
+- 浼樺寲 褰撳墠鏈堝彲浠ラ�夋嫨涓婃湀銆佷笅鏈堢殑鏃ユ湡鐨凚ug
+## 2.2.23锛�2023-05-02锛�
+- 淇 閮ㄥ垎鎯呭喌淇敼鏃堕棿锛屽紑濮嬫椂闂存湭鏇存柊鐨凚ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/737)
+- 淇 閮ㄥ垎骞冲彴鍙婅澶囩涓�娆$偣鍑绘棤娉曟樉绀哄脊妗嗙殑Bug
+- 淇 ios 鏃ユ湡鏍煎紡鏈ˉ闆舵樉绀哄強浣跨敤寮傚父鐨凚ug [璇︽儏](https://ask.dcloud.net.cn/question/162979)
+## 2.2.22锛�2023-03-30锛�
+- 淇 鏃ュ巻 picker 淇敼骞存湀鍚庯紝鑷姩閫変腑褰撴湀1鏃ョ殑Bug [璇︽儏](https://ask.dcloud.net.cn/question/165937)
+- 淇 灏忕▼搴忕 浣庣増鏈� ios NaN鐨凚ug [璇︽儏](https://ask.dcloud.net.cn/question/162979)
+## 2.2.21锛�2023-02-20锛�
+- 淇 firefox 娴忚鍣ㄦ樉绀哄尯鍩熺偣鍑绘棤娉曟媺璧锋棩鍘嗗脊妗嗙殑Bug [璇︽儏](https://ask.dcloud.net.cn/question/163362)
+## 2.2.20锛�2023-02-17锛�
+- 浼樺寲 鍊间负绌轰緷鐒堕�変腑褰撳ぉ闂
+- 浼樺寲 鎻愪緵 default-value 灞炴�ф敮鎸侀厤缃�夋嫨鍣ㄦ墦寮�鏃堕粯璁ゆ樉绀虹殑鏃堕棿
+- 浼樺寲 闈炶寖鍥撮�夋嫨鏈�夋嫨鏃ユ湡鏃堕棿锛岀偣鍑荤‘璁ゆ寜閽�変腑褰撳墠鏃ユ湡鏃堕棿
+- 浼樺寲 瀛楄妭灏忕▼搴忔棩鏈熸椂闂磋寖鍥撮�夋嫨锛屽簳閮ㄦ棩鏈熸崲琛岀殑Bug
+## 2.2.19锛�2023-02-09锛�
+- 淇 2.2.18 寮曡捣鑼冨洿閫夋嫨閰嶇疆 end 閫夋嫨鏃犳晥鐨凚ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/686)
+## 2.2.18锛�2023-02-08锛�
+- 淇 绉诲姩绔寖鍥撮�夋嫨change浜嬩欢瑙﹀彂寮傚父鐨凚ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/684)
+- 浼樺寲 PC绔緭鍏ユ棩鏈熸牸寮忛敊璇椂杩斿洖褰撳墠鏃ユ湡鏃堕棿
+- 浼樺寲 PC绔緭鍏ユ棩鏈熸椂闂磋秴鍑� start銆乪nd 闄愬埗鐨凚ug
+- 浼樺寲 绉诲姩绔棩鏈熸椂闂磋寖鍥寸敤娉曟椂闂村睍绀轰笉瀹屾暣闂
+## 2.2.17锛�2023-02-04锛�
+- 淇 灏忕▼搴忕缁戝畾 Date 绫诲瀷鎶ラ敊鐨凚ug [璇︽儏](https://github.com/dcloudio/uni-ui/issues/679)
+- 淇 vue3 time-picker 鏃犳硶鏄剧ず缁戝畾鏃跺垎绉掔殑Bug
+## 2.2.16锛�2023-02-02锛�
+- 淇 瀛楄妭灏忕▼搴忔姤閿欑殑Bug
+## 2.2.15锛�2023-02-02锛�
+- 淇 鏌愪簺鎯呭喌鍒囨崲鏈堜唤閿欒鐨凚ug
+## 2.2.14锛�2023-01-30锛�
+- 淇 鏌愪簺鎯呭喌鍒囨崲鏈堜唤閿欒鐨凚ug [璇︽儏](https://ask.dcloud.net.cn/question/162033)
+## 2.2.13锛�2023-01-10锛�
+- 淇 澶氭鍔犺浇缁勪欢閫犳垚鍐呭瓨鍗犵敤鐨凚ug
+## 2.2.12锛�2022-12-01锛�
+- 淇 vue3 涓� i18n 鍥介檯鍖栧垵濮嬪�间笉姝g‘鐨凚ug
+## 2.2.11锛�2022-09-19锛�
+- 淇 鏀粯瀹濆皬绋嬪簭鏍峰紡閿欎贡鐨凚ug [璇︽儏](https://github.com/dcloudio/uni-app/issues/3861)
+## 2.2.10锛�2022-09-19锛�
+- 淇 鍙嶅悜閫夋嫨鏃ユ湡鑼冨洿锛屾棩鏈熸樉绀哄紓甯哥殑Bug [璇︽儏](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false)
+## 2.2.9锛�2022-09-16锛�
+- 鍙互浣跨敤 uni-scss 鎺у埗涓婚鑹�
+## 2.2.8锛�2022-09-08锛�
+- 淇 close浜嬩欢鏃犳晥鐨凚ug
+## 2.2.7锛�2022-09-05锛�
+- 淇 绉诲姩绔� maskClick 鏃犳晥鐨凚ug [璇︽儏](https://ask.dcloud.net.cn/question/140824)
+## 2.2.6锛�2022-06-30锛�
+- 浼樺寲 缁勪欢鏍峰紡锛岃皟鏁翠簡缁勪欢鍥炬爣澶у皬銆侀珮搴︺�侀鑹茬瓑锛屼笌uni-ui椋庢牸淇濇寔涓�鑷�
+## 2.2.5锛�2022-06-24锛�
+- 淇 鏃ュ巻椤堕儴骞存湀鍙婂簳閮ㄧ‘璁ゆ湭鍥介檯鍖栫殑Bug
+## 2.2.4锛�2022-03-31锛�
+- 淇 Vue3 涓嬪姩鎬佽祴鍊�,鍗曢�夌被鍨嬫湭鍝嶅簲鐨凚ug
+## 2.2.3锛�2022-03-28锛�
+- 淇 Vue3 涓嬪姩鎬佽祴鍊兼湭鍝嶅簲鐨凚ug
+## 2.2.2锛�2021-12-10锛�
+- 淇 clear-icon 灞炴�у湪灏忕▼搴忓钩鍙颁笉鐢熸晥鐨凚ug
+## 2.2.1锛�2021-12-10锛�
+- 淇 鏃ユ湡鑼冨洿閫夊湪灏忕▼搴忓钩鍙帮紝蹇呴』澶氱偣鍑讳竴娆℃墠鑳藉彇娑堥�変腑鐘舵�佺殑Bug
+## 2.2.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮 [璇︽儏](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ [https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+## 2.1.5锛�2021-11-09锛�
+- 鏂板 鎻愪緵缁勪欢璁捐璧勬簮锛岀粍浠舵牱寮忚皟鏁�
+## 2.1.4锛�2021-09-10锛�
+- 淇 hide-second 鍦ㄧЩ鍔ㄧ鐨凚ug
+- 淇 鍗曢�夎祴榛樿鍊兼椂锛岃祴鍊兼棩鏈熸湭楂樹寒鐨凚ug
+- 淇 璧嬮粯璁ゅ�兼椂锛岀Щ鍔ㄧ鏈纭樉绀烘椂闂寸殑Bug
+## 2.1.3锛�2021-09-09锛�
+- 鏂板 hide-second 灞炴�э紝鏀寔鍙娇鐢ㄦ椂鍒嗭紝闅愯棌绉�
+## 2.1.2锛�2021-09-03锛�
+- 浼樺寲 鍙栨秷閫変腑鏃讹紙鑼冨洿閫夛級鐩存帴寮�濮嬩笅涓�娆¢�夋嫨, 閬垮厤澶氱偣涓�娆�
+- 浼樺寲 绉诲姩绔敮鎸佹竻闄ゆ寜閽紝鍚屾椂鏀寔閫氳繃 ref 璋冪敤缁勪欢鐨� clear 鏂规硶
+- 浼樺寲 璋冩暣瀛楀彿澶у皬锛岀編鍖栨棩鍘嗙晫闈�
+- 淇 鍥犲浗闄呭寲瀵艰嚧鐨� placeholder 澶辨晥鐨凚ug
+## 2.1.1锛�2021-08-24锛�
+- 鏂板 鏀寔鍥介檯鍖�
+- 浼樺寲 鑼冨洿閫夋嫨鍣ㄥ湪 pc 绔繃瀹界殑闂
+## 2.1.0锛�2021-08-09锛�
+- 鏂板 閫傞厤 vue3
+## 2.0.19锛�2021-08-09锛�
+- 鏂板 鏀寔浣滀负 uni-forms 瀛愮粍浠剁浉鍏冲姛鑳�
+- 淇 鍦� uni-forms 涓娇鐢ㄦ椂锛岄�夋嫨鏃堕棿鎶� NAN 閿欒鐨凚ug
+## 2.0.18锛�2021-08-05锛�
+- 淇 type 灞炴�у姩鎬佽祴鍊兼棤鏁堢殑Bug
+- 淇 鈥樼‘璁も�欐寜閽 tabbar 閬洊 bug
+- 淇 缁勪欢鏈祴鍊兼椂鑼冨洿閫夊乏銆佸彸鏃ュ巻鐩稿悓鐨凚ug
+## 2.0.17锛�2021-08-04锛�
+- 淇 鑼冨洿閫夋湭姝g‘鏄剧ず褰撳墠鍊肩殑Bug
+- 淇 h5 骞冲彴锛堢Щ鍔ㄧ锛夋姤閿� 'cale' of undefined 鐨凚ug
+## 2.0.16锛�2021-07-21锛�
+- 鏂板 return-type 灞炴�ф敮鎸佽繑鍥� date 鏃ユ湡瀵硅薄
+## 2.0.15锛�2021-07-14锛�
+- 淇 鍗曢�夋棩鏈熺被鍨嬶紝鍒濆璧嬪�煎悗涓嶅湪褰撳墠鏃ュ巻鐨凚ug
+- 鏂板 clearIcon 灞炴�э紝鏄剧ず妗嗙殑娓呯┖鎸夐挳鍙厤缃樉绀洪殣钘忥紙浠� pc 鏈夋晥锛�
+- 浼樺寲 绉诲姩绔Щ闄ゆ樉绀烘鐨勬竻绌烘寜閽紝鏃犲疄闄呯敤閫�
+## 2.0.14锛�2021-07-14锛�
+- 淇 缁勪欢璧嬪�间负绌猴紝鐣岄潰鏈洿鏂扮殑Bug
+- 淇 start 鍜� end 涓嶈兘鍔ㄦ�佽祴鍊肩殑Bug
+- 淇 鑼冨洿閫夌被鍨嬶紝鐢ㄦ埛閫夋嫨鍚庡啀娆¢�夋嫨鍙充晶鏃ュ巻锛堢粨鏉熸棩鏈燂級鏄剧ず涓嶆纭殑Bug
+## 2.0.13锛�2021-07-08锛�
+- 淇 鑼冨洿閫夋嫨涓嶈兘鍔ㄦ�佽祴鍊肩殑Bug
+## 2.0.12锛�2021-07-08锛�
+- 淇 鑼冨洿閫夋嫨鐨勫垵濮嬫椂闂村湪涓�涓湀鍐呮椂锛岄�犳垚鏃犳硶閫夋嫨鐨刡ug
+## 2.0.11锛�2021-07-08锛�
+- 浼樺寲 寮瑰嚭灞傚湪瓒呭嚭瑙嗙獥杈圭紭瀹氫綅涓嶅噯纭殑闂
+## 2.0.10锛�2021-07-08锛�
+- 淇 鑼冨洿璧峰鐐规牱寮忕殑鑳屾櫙鑹蹭笌浠婃棩鏍峰紡鐨勫瓧浣撳墠鏅壊铻嶅悎锛屽鑷存棩鏈熷瓧浣撶湅涓嶆竻鐨凚ug
+- 浼樺寲 寮瑰嚭灞傚湪瓒呭嚭瑙嗙獥杈圭紭琚伄鐩栫殑闂
+## 2.0.9锛�2021-07-07锛�
+- 鏂板 maskClick 浜嬩欢
+- 淇 鐗规畩鎯呭喌鏃ュ巻 rpx 甯冨眬閿欒鐨凚ug锛宺px -> px
+- 淇 鑼冨洿閫夋嫨鏃舵竻绌鸿繑鍥炲�间笉鍚堢悊鐨刡ug锛孾'', ''] -> []
+## 2.0.8锛�2021-07-07锛�
+- 鏂板 鏃ユ湡鏃堕棿鏄剧ず妗嗘敮鎸佹彃妲�
+## 2.0.7锛�2021-07-01锛�
+- 浼樺寲 娣诲姞 uni-icons 渚濊禆
+## 2.0.6锛�2021-05-22锛�
+- 淇 鍥炬爣鍦ㄥ皬绋嬪簭涓婁笉鏄剧ず鐨凚ug
+- 浼樺寲 閲嶅懡鍚嶅紩鐢ㄧ粍浠讹紝閬垮厤娼滃湪缁勪欢鍛藉悕鍐茬獊
+## 2.0.5锛�2021-05-20锛�
+- 浼樺寲 浠g爜鐩綍鎵佸钩鍖�
+## 2.0.4锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 2.0.3锛�2021-05-10锛�
+- 淇 ios 涓嬩笉璇嗗埆 '-' 鏃ユ湡鏍煎紡鐨凚ug
+- 浼樺寲 pc 涓嬪脊鍑哄眰娣诲姞杈规鍜岄槾褰�
+## 2.0.2锛�2021-05-08锛�
+- 淇 鍦� admin 涓幏鍙栧脊鍑哄眰瀹氫綅閿欒鐨刡ug
+## 2.0.1锛�2021-05-08锛�
+- 淇 type 灞炴�у悜涓嬪吋瀹癸紝榛樿鍊间粠 date 鍙樻洿涓� datetime
+## 2.0.0锛�2021-04-30锛�
+- 鏀寔鏃ュ巻褰㈠紡鐨勬棩鏈�+鏃堕棿鐨勮寖鍥撮�夋嫨
+ > 娉ㄦ剰锛氭鐗堟湰涓嶅悜鍚庡吋瀹癸紝涓嶅啀鏀寔鍗曠嫭鏃堕棿閫夋嫨锛坱ype=time锛夊強鐩稿叧鐨� hide-second 灞炴�э紙鏃堕棿閫夊彲浣跨敤鍐呯疆缁勪欢 picker锛�
+## 1.0.6锛�2021-03-18锛�
+- 鏂板 hide-second 灞炴�э紝鏃堕棿鏀寔浠呴�夋嫨鏃躲�佸垎
+- 淇 閫夋嫨璺熸樉绀虹殑鏃ユ湡涓嶄竴鏍风殑Bug
+- 淇 chang浜嬩欢瑙﹀彂2娆$殑Bug
+- 淇 鍒嗐�佺 end 鑼冨洿閿欒鐨凚ug
+- 浼樺寲 鏇村ソ鐨� nvue 閫傞厤
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
new file mode 100644
index 0000000..dba9887
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
@@ -0,0 +1,177 @@
+<template>
+	<view class="uni-calendar-item__weeks-box" :class="{
+		'uni-calendar-item--disable':weeks.disable,
+		'uni-calendar-item--before-checked-x':weeks.beforeMultiple,
+		'uni-calendar-item--multiple': weeks.multiple,
+		'uni-calendar-item--after-checked-x':weeks.afterMultiple,
+		}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)">
+		<view class="uni-calendar-item__weeks-box-item" :class="{
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && (calendar.userChecked || !checkHover),
+				'uni-calendar-item--checked-range-text': checkHover,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">
+			<text v-if="selected && weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
+			<text class="uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text">{{weeks.date}}</text>
+		</view>
+		<view :class="{'uni-calendar-item--today': weeks.isToday}"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			weeks: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			calendar: {
+				type: Object,
+				default: () => {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			checkHover: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			choiceDate(weeks) {
+				this.$emit('change', weeks)
+			},
+			handleMousemove(weeks) {
+				this.$emit('handleMouse', weeks)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	$uni-primary: #007aff !default;
+
+	.uni-calendar-item__weeks-box {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		margin: 1px 0;
+		position: relative;
+	}
+
+	.uni-calendar-item__weeks-box-text {
+		font-size: 14px;
+		// font-family: Lato-Bold, Lato;
+		font-weight: bold;
+		color: darken($color: $uni-primary, $amount: 40%);
+	}
+
+	.uni-calendar-item__weeks-box-item {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 40px;
+		height: 40px;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+
+	.uni-calendar-item__weeks-box-circle {
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		width: 8px;
+		height: 8px;
+		border-radius: 8px;
+		background-color: #dd524d;
+
+	}
+
+	.uni-calendar-item__weeks-box .uni-calendar-item--disable {
+		cursor: default;
+	}
+
+	.uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable {
+		color: #D1D1D1;
+	}
+
+	.uni-calendar-item--today {
+		position: absolute;
+		top: 10px;
+		right: 17%;
+		background-color: #dd524d;
+		width:6px;
+		height: 6px;
+		border-radius: 50%;
+	}
+
+	.uni-calendar-item--extra {
+		color: #dd524d;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item__weeks-box .uni-calendar-item--checked {
+		background-color: $uni-primary;
+		border-radius: 50%;
+		box-sizing: border-box;
+		border: 3px solid #fff;
+	}
+
+	.uni-calendar-item--checked .uni-calendar-item--checked-text {
+		color: #fff;
+	}
+
+	.uni-calendar-item--multiple .uni-calendar-item--checked-range-text {
+		color: #333;
+	}
+
+	.uni-calendar-item--multiple {
+		background-color:  #F6F7FC;
+		// color: #fff;
+	}
+
+	.uni-calendar-item--multiple .uni-calendar-item--before-checked,
+	.uni-calendar-item--multiple .uni-calendar-item--after-checked {
+		background-color: $uni-primary;
+		border-radius: 50%;
+		box-sizing: border-box;
+		border: 3px solid #F6F7FC;
+	}
+
+	.uni-calendar-item--before-checked .uni-calendar-item--checked-text,
+	.uni-calendar-item--after-checked .uni-calendar-item--checked-text {
+		color: #fff;
+	}
+
+	.uni-calendar-item--before-checked-x {
+		border-top-left-radius: 50px;
+		border-bottom-left-radius: 50px;
+		box-sizing: border-box;
+		background-color: #F6F7FC;
+	}
+
+	.uni-calendar-item--after-checked-x {
+		border-top-right-radius: 50px;
+		border-bottom-right-radius: 50px;
+		background-color: #F6F7FC;
+	}
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
new file mode 100644
index 0000000..0f9e121
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
@@ -0,0 +1,947 @@
+<template>
+	<view class="uni-calendar" @mouseleave="leaveCale">
+
+		<view v-if="!insert && show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}"
+			@click="maskClick"></view>
+
+		<view v-if="insert || show" class="uni-calendar__content"
+			:class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}">
+			<view class="uni-calendar__header" :class="{'uni-calendar__header-mobile' :!insert}">
+
+				<view class="uni-calendar__header-btn-box" @click.stop="changeMonth('pre')">
+					<view class="uni-calendar__header-btn uni-calendar--left"></view>
+				</view>
+
+				<picker mode="date" :value="date" fields="month" @change="bindDateChange">
+					<text
+						class="uni-calendar__header-text">{{ (nowDate.year||'') + yearText + ( nowDate.month||'') + monthText}}</text>
+				</picker>
+
+				<view class="uni-calendar__header-btn-box" @click.stop="changeMonth('next')">
+					<view class="uni-calendar__header-btn uni-calendar--right"></view>
+				</view>
+
+				<view v-if="!insert" class="dialog-close" @click="maskClick">
+					<view class="dialog-close-plus" data-id="close"></view>
+					<view class="dialog-close-plus dialog-close-rotate" data-id="close"></view>
+				</view>
+			</view>
+			<view class="uni-calendar__box">
+
+				<view v-if="showMonth" class="uni-calendar__box-bg">
+					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
+				</view>
+
+				<view class="uni-calendar__weeks" style="padding-bottom: 7px;">
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SUNText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{MONText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{TUEText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{WEDText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{THUText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{FRIText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SATText}}</text>
+					</view>
+				</view>
+
+				<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
+					<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
+						<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar" :selected="selected"
+							:checkHover="range" @change="choiceDate" @handleMouse="handleMouse">
+						</calendar-item>
+					</view>
+				</view>
+			</view>
+
+			<view v-if="!insert && !range && hasTime" class="uni-date-changed uni-calendar--fixed-top"
+				style="padding: 0 80px;">
+				<view class="uni-date-changed--time-date">{{tempSingleDate ? tempSingleDate : selectDateText}}</view>
+				<time-picker type="time" :start="timepickerStartTime" :end="timepickerEndTime" v-model="time"
+					:disabled="!tempSingleDate" :border="false" :hide-second="hideSecond" class="time-picker-style">
+				</time-picker>
+			</view>
+
+			<view v-if="!insert && range && hasTime" class="uni-date-changed uni-calendar--fixed-top">
+				<view class="uni-date-changed--time-start">
+					<view class="uni-date-changed--time-date">{{tempRange.before ? tempRange.before : startDateText}}
+					</view>
+					<time-picker type="time" :start="timepickerStartTime" v-model="timeRange.startTime" :border="false"
+						:hide-second="hideSecond" :disabled="!tempRange.before" class="time-picker-style">
+					</time-picker>
+				</view>
+				<view style="line-height: 50px;">
+					<uni-icons type="arrowthinright" color="#999"></uni-icons>
+				</view>
+				<view class="uni-date-changed--time-end">
+					<view class="uni-date-changed--time-date">{{tempRange.after ? tempRange.after : endDateText}}</view>
+					<time-picker type="time" :end="timepickerEndTime" v-model="timeRange.endTime" :border="false"
+						:hide-second="hideSecond" :disabled="!tempRange.after" class="time-picker-style">
+					</time-picker>
+				</view>
+			</view>
+
+			<view v-if="!insert" class="uni-date-changed uni-date-btn--ok">
+				<view class="uni-datetime-picker--btn" @click="confirm">{{confirmText}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		Calendar,
+		getDate,
+		getTime
+	} from './util.js';
+	import calendarItem from './calendar-item.vue'
+	import timePicker from './time-picker.vue'
+
+	import {
+		initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	const {
+		t
+	} = initVueI18n(i18nMessages)
+
+	/**
+	 * Calendar 鏃ュ巻
+	 * @description 鏃ュ巻缁勪欢鍙互鏌ョ湅鏃ユ湡锛岄�夋嫨浠绘剰鑼冨洿鍐呯殑鏃ユ湡锛屾墦鐐规搷浣溿�傚父鐢ㄥ満鏅锛氶厭搴楁棩鏈熼璁€�佺伀杞︽満绁ㄩ�夋嫨璐拱鏃ユ湡銆佷笂涓嬬彮鎵撳崱绛�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=56
+	 * @property {String} date 鑷畾涔夊綋鍓嶆椂闂达紝榛樿涓轰粖澶�
+	 * @property {String} startDate 鏃ユ湡閫夋嫨鑼冨洿-寮�濮嬫棩鏈�
+	 * @property {String} endDate 鏃ユ湡閫夋嫨鑼冨洿-缁撴潫鏃ユ湡
+	 * @property {Boolean} range 鑼冨洿閫夋嫨
+	 * @property {Boolean} insert = [true|false] 鎻掑叆妯″紡,榛樿涓篺alse
+	 * 	@value true 寮圭獥妯″紡
+	 * 	@value false 鎻掑叆妯″紡
+	 * @property {Boolean} clearDate = [true|false] 寮圭獥妯″紡鏄惁娓呯┖涓婃閫夋嫨鍐呭
+	 * @property {Array} selected 鎵撶偣锛屾湡寰呮牸寮廩{date: '2019-06-27', info: '绛惧埌', data: { custom: '鑷畾涔変俊鎭�', name: '鑷畾涔夋秷鎭ご',xxx:xxx... }}]
+	 * @property {Boolean} showMonth 鏄惁閫夋嫨鏈堜唤涓鸿儗鏅�
+	 * @property {[String} defaultValue 閫夋嫨鍣ㄦ墦寮�鏃堕粯璁ゆ樉绀虹殑鏃堕棿
+	 * @event {Function} change 鏃ユ湡鏀瑰彉锛宍insert :ture` 鏃剁敓鏁�
+	 * @event {Function} confirm 纭閫夋嫨`insert :false` 鏃剁敓鏁�
+	 * @event {Function} monthSwitch 鍒囨崲鏈堜唤鏃惰Е鍙�
+	 * @example <uni-calendar :insert="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
+	 */
+	export default {
+		components: {
+			calendarItem,
+			timePicker
+		},
+
+		options: {
+			// #ifdef MP-TOUTIAO
+			virtualHost: false,
+			// #endif
+			// #ifndef MP-TOUTIAO
+			virtualHost: true
+			// #endif
+		},
+		props: {
+			date: {
+				type: String,
+				default: ''
+			},
+			defTime: {
+				type: [String, Object],
+				default: ''
+			},
+			selectableTimes: {
+				type: [Object],
+				default () {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			startDate: {
+				type: String,
+				default: ''
+			},
+			endDate: {
+				type: String,
+				default: ''
+			},
+			startPlaceholder: {
+				type: String,
+				default: ''
+			},
+			endPlaceholder: {
+				type: String,
+				default: ''
+			},
+			range: {
+				type: Boolean,
+				default: false
+			},
+			hasTime: {
+				type: Boolean,
+				default: false
+			},
+			insert: {
+				type: Boolean,
+				default: true
+			},
+			showMonth: {
+				type: Boolean,
+				default: true
+			},
+			clearDate: {
+				type: Boolean,
+				default: true
+			},
+			checkHover: {
+				type: Boolean,
+				default: true
+			},
+			hideSecond: {
+				type: [Boolean],
+				default: false
+			},
+			pleStatus: {
+				type: Object,
+				default () {
+					return {
+						before: '',
+						after: '',
+						data: [],
+						fulldate: ''
+					}
+				}
+			},
+			defaultValue: {
+				type: [String, Object, Array],
+				default: ''
+			}
+		},
+		data() {
+			return {
+				show: false,
+				weeks: [],
+				calendar: {},
+				nowDate: {},
+				aniMaskShow: false,
+				firstEnter: true,
+				time: '',
+				timeRange: {
+					startTime: '',
+					endTime: ''
+				},
+				tempSingleDate: '',
+				tempRange: {
+					before: '',
+					after: ''
+				}
+			}
+		},
+		watch: {
+			date: {
+				immediate: true,
+				handler(newVal) {
+					if (!this.range) {
+						this.tempSingleDate = newVal
+						setTimeout(() => {
+							this.init(newVal)
+						}, 100)
+					}
+				}
+			},
+			defTime: {
+				immediate: true,
+				handler(newVal) {
+					if (!this.range) {
+						this.time = newVal
+					} else {
+						this.timeRange.startTime = newVal.start
+						this.timeRange.endTime = newVal.end
+					}
+				}
+			},
+			startDate(val) {
+				// 瀛楄妭灏忕▼搴� watch 鏃╀簬 created
+				if (!this.cale) {
+					return
+				}
+				this.cale.setStartDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			endDate(val) {
+				// 瀛楄妭灏忕▼搴� watch 鏃╀簬 created
+				if (!this.cale) {
+					return
+				}
+				this.cale.setEndDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			selected(newVal) {
+				// 瀛楄妭灏忕▼搴� watch 鏃╀簬 created
+				if (!this.cale) {
+					return
+				}
+				this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
+				this.weeks = this.cale.weeks
+			},
+			pleStatus: {
+				immediate: true,
+				handler(newVal) {
+					const {
+						before,
+						after,
+						fulldate,
+						which
+					} = newVal
+					this.tempRange.before = before
+					this.tempRange.after = after
+					setTimeout(() => {
+						if (fulldate) {
+							this.cale.setHoverMultiple(fulldate)
+							if (before && after) {
+								this.cale.lastHover = true
+								if (this.rangeWithinMonth(after, before)) return
+								this.setDate(before)
+							} else {
+								this.cale.setMultiple(fulldate)
+								this.setDate(this.nowDate.fullDate)
+								this.calendar.fullDate = ''
+								this.cale.lastHover = false
+							}
+						} else {
+							// 瀛楄妭灏忕▼搴� watch 鏃╀簬 created
+							if (!this.cale) {
+								return
+							}
+
+							this.cale.setDefaultMultiple(before, after)
+							if (which === 'left' && before) {
+								this.setDate(before)
+								this.weeks = this.cale.weeks
+							} else if (after) {
+								this.setDate(after)
+								this.weeks = this.cale.weeks
+							}
+							this.cale.lastHover = true
+						}
+					}, 16)
+				}
+			}
+		},
+		computed: {
+			timepickerStartTime() {
+				const activeDate = this.range ? this.tempRange.before : this.calendar.fullDate
+				return activeDate === this.startDate ? this.selectableTimes.start : ''
+			},
+			timepickerEndTime() {
+				const activeDate = this.range ? this.tempRange.after : this.calendar.fullDate
+				return activeDate === this.endDate ? this.selectableTimes.end : ''
+			},
+			/**
+			 * for i18n
+			 */
+			selectDateText() {
+				return t("uni-datetime-picker.selectDate")
+			},
+			startDateText() {
+				return this.startPlaceholder || t("uni-datetime-picker.startDate")
+			},
+			endDateText() {
+				return this.endPlaceholder || t("uni-datetime-picker.endDate")
+			},
+			okText() {
+				return t("uni-datetime-picker.ok")
+			},
+			yearText() {
+				return t("uni-datetime-picker.year")
+			},
+			monthText() {
+				return t("uni-datetime-picker.month")
+			},
+			MONText() {
+				return t("uni-calender.MON")
+			},
+			TUEText() {
+				return t("uni-calender.TUE")
+			},
+			WEDText() {
+				return t("uni-calender.WED")
+			},
+			THUText() {
+				return t("uni-calender.THU")
+			},
+			FRIText() {
+				return t("uni-calender.FRI")
+			},
+			SATText() {
+				return t("uni-calender.SAT")
+			},
+			SUNText() {
+				return t("uni-calender.SUN")
+			},
+			confirmText() {
+				return t("uni-calender.confirm")
+			},
+		},
+		created() {
+			// 鑾峰彇鏃ュ巻鏂规硶瀹炰緥
+			this.cale = new Calendar({
+				selected: this.selected,
+				startDate: this.startDate,
+				endDate: this.endDate,
+				range: this.range,
+			})
+			// 閫変腑鏌愪竴澶�
+			this.init(this.date)
+		},
+		methods: {
+			leaveCale() {
+				this.firstEnter = true
+			},
+			handleMouse(weeks) {
+				if (weeks.disable) return
+				if (this.cale.lastHover) return
+				let {
+					before,
+					after
+				} = this.cale.multipleStatus
+				if (!before) return
+				this.calendar = weeks
+				// 璁剧疆鑼冨洿閫�
+				this.cale.setHoverMultiple(this.calendar.fullDate)
+				this.weeks = this.cale.weeks
+				// hover鏃讹紝杩涘叆涓�涓棩鍘嗭紝鏇存柊鍙︿竴涓�
+				if (this.firstEnter) {
+					this.$emit('firstEnterCale', this.cale.multipleStatus)
+					this.firstEnter = false
+				}
+			},
+			rangeWithinMonth(A, B) {
+				const [yearA, monthA] = A.split('-')
+				const [yearB, monthB] = B.split('-')
+				return yearA === yearB && monthA === monthB
+			},
+			// 钂欑増鐐瑰嚮浜嬩欢
+			maskClick() {
+				this.close()
+				this.$emit('maskClose')
+			},
+
+			clearCalender() {
+				if (this.range) {
+					this.timeRange.startTime = ''
+					this.timeRange.endTime = ''
+					this.tempRange.before = ''
+					this.tempRange.after = ''
+					this.cale.multipleStatus.before = ''
+					this.cale.multipleStatus.after = ''
+					this.cale.multipleStatus.data = []
+					this.cale.lastHover = false
+				} else {
+					this.time = ''
+					this.tempSingleDate = ''
+				}
+				this.calendar.fullDate = ''
+				this.setDate(new Date())
+			},
+
+			bindDateChange(e) {
+				const value = e.detail.value + '-1'
+				this.setDate(value)
+			},
+			/**
+			 * 鍒濆鍖栨棩鏈熸樉绀�
+			 * @param {Object} date
+			 */
+			init(date) {
+				// 瀛楄妭灏忕▼搴� watch 鏃╀簬 created
+				if (!this.cale) {
+					return
+				}
+				this.cale.setDate(date || new Date())
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+				this.calendar = {
+					...this.nowDate
+				}
+				if (!date) {
+					// 浼樺寲date涓虹┖榛樿涓嶉�変腑浠婂ぉ
+					this.calendar.fullDate = ''
+					if (this.defaultValue && !this.range) {
+						// 鏆傛椂鍙敮鎸佺Щ鍔ㄧ闈炶寖鍥撮�夋嫨
+						const defaultDate = new Date(this.defaultValue)
+						const fullDate = getDate(defaultDate)
+						const year = defaultDate.getFullYear()
+						const month = defaultDate.getMonth() + 1
+						const date = defaultDate.getDate()
+						const day = defaultDate.getDay()
+						this.calendar = {
+								fullDate,
+								year,
+								month,
+								date,
+								day
+							},
+							this.tempSingleDate = fullDate
+						this.time = getTime(defaultDate, this.hideSecond)
+					}
+				}
+			},
+			/**
+			 * 鎵撳紑鏃ュ巻寮圭獥
+			 */
+			open() {
+				// 寮圭獥妯″紡骞朵笖娓呯悊鏁版嵁
+				if (this.clearDate && !this.insert) {
+					this.cale.cleanMultipleStatus()
+					this.init(this.date)
+				}
+				this.show = true
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.aniMaskShow = true
+					}, 50)
+				})
+			},
+			/**
+			 * 鍏抽棴鏃ュ巻寮圭獥
+			 */
+			close() {
+				this.aniMaskShow = false
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false
+						this.$emit('close')
+					}, 300)
+				})
+			},
+			/**
+			 * 纭鎸夐挳
+			 */
+			confirm() {
+				this.setEmit('confirm')
+				this.close()
+			},
+			/**
+			 * 鍙樺寲瑙﹀彂
+			 */
+			change(isSingleChange) {
+				if (!this.insert && !isSingleChange) return
+				this.setEmit('change')
+			},
+			/**
+			 * 閫夋嫨鏈堜唤瑙﹀彂
+			 */
+			monthSwitch() {
+				let {
+					year,
+					month
+				} = this.nowDate
+				this.$emit('monthSwitch', {
+					year,
+					month: Number(month)
+				})
+			},
+			/**
+			 * 娲惧彂浜嬩欢
+			 * @param {Object} name
+			 */
+			setEmit(name) {
+				if (!this.range) {
+					if (!this.calendar.fullDate) {
+						this.calendar = this.cale.getInfo(new Date())
+						this.tempSingleDate = this.calendar.fullDate
+					}
+					if (this.hasTime && !this.time) {
+						this.time = getTime(new Date(), this.hideSecond)
+					}
+				}
+				let {
+					year,
+					month,
+					date,
+					fullDate,
+					extraInfo
+				} = this.calendar
+				this.$emit(name, {
+					range: this.cale.multipleStatus,
+					year,
+					month,
+					date,
+					time: this.time,
+					timeRange: this.timeRange,
+					fulldate: fullDate,
+					extraInfo: extraInfo || {}
+				})
+			},
+			/**
+			 * 閫夋嫨澶╄Е鍙�
+			 * @param {Object} weeks
+			 */
+			choiceDate(weeks) {
+				if (weeks.disable) return
+				this.calendar = weeks
+				this.calendar.userChecked = true
+				// 璁剧疆澶氶��
+				this.cale.setMultiple(this.calendar.fullDate, true)
+				this.weeks = this.cale.weeks
+				this.tempSingleDate = this.calendar.fullDate
+				const beforeDate = new Date(this.cale.multipleStatus.before).getTime()
+				const afterDate = new Date(this.cale.multipleStatus.after).getTime()
+				if (beforeDate > afterDate && afterDate) {
+					this.tempRange.before = this.cale.multipleStatus.after
+					this.tempRange.after = this.cale.multipleStatus.before
+				} else {
+					this.tempRange.before = this.cale.multipleStatus.before
+					this.tempRange.after = this.cale.multipleStatus.after
+				}
+				this.change(true)
+			},
+			changeMonth(type) {
+				let newDate
+				if (type === 'pre') {
+					newDate = this.cale.getPreMonthObj(this.nowDate.fullDate).fullDate
+				} else if (type === 'next') {
+					newDate = this.cale.getNextMonthObj(this.nowDate.fullDate).fullDate
+				}
+
+				this.setDate(newDate)
+				this.monthSwitch()
+			},
+			/**
+			 * 璁剧疆鏃ユ湡
+			 * @param {Object} date
+			 */
+			setDate(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-primary: #007aff !default;
+
+	.uni-calendar {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-calendar__mask {
+		position: fixed;
+		bottom: 0;
+		top: 0;
+		left: 0;
+		right: 0;
+		background-color: rgba(0, 0, 0, 0.4);
+		transition-property: opacity;
+		transition-duration: 0.3s;
+		opacity: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--mask-show {
+		opacity: 1
+	}
+
+	.uni-calendar--fixed {
+		position: fixed;
+		bottom: calc(var(--window-bottom));
+		left: 0;
+		right: 0;
+		transition-property: transform;
+		transition-duration: 0.3s;
+		transform: translateY(460px);
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--ani-show {
+		transform: translateY(0);
+	}
+
+	.uni-calendar__content {
+		background-color: #fff;
+	}
+
+	.uni-calendar__content-mobile {
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.1);
+	}
+
+	.uni-calendar__header {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 50px;
+	}
+
+	.uni-calendar__header-mobile {
+		padding: 10px;
+		padding-bottom: 0;
+	}
+
+	.uni-calendar--fixed-top {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		border-top-color: rgba(0, 0, 0, 0.4);
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--fixed-width {
+		width: 50px;
+	}
+
+	.uni-calendar__backtoday {
+		position: absolute;
+		right: 0;
+		top: 25rpx;
+		padding: 0 5px;
+		padding-left: 10px;
+		height: 25px;
+		line-height: 25px;
+		font-size: 12px;
+		border-top-left-radius: 25px;
+		border-bottom-left-radius: 25px;
+		color: #fff;
+		background-color: #f1f1f1;
+	}
+
+	.uni-calendar__header-text {
+		text-align: center;
+		width: 100px;
+		font-size: 15px;
+		color: #666;
+	}
+
+	.uni-calendar__button-text {
+		text-align: center;
+		width: 100px;
+		font-size: 14px;
+		color: $uni-primary;
+		/* #ifndef APP-NVUE */
+		letter-spacing: 3px;
+		/* #endif */
+	}
+
+	.uni-calendar__header-btn-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 50px;
+		height: 50px;
+	}
+
+	.uni-calendar__header-btn {
+		width: 9px;
+		height: 9px;
+		border-left-color: #808080;
+		border-left-style: solid;
+		border-left-width: 1px;
+		border-top-color: #555555;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--left {
+		transform: rotate(-45deg);
+	}
+
+	.uni-calendar--right {
+		transform: rotate(135deg);
+	}
+
+
+	.uni-calendar__weeks {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-calendar__weeks-item {
+		flex: 1;
+	}
+
+	.uni-calendar__weeks-day {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		height: 40px;
+		border-bottom-color: #F5F5F5;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar__weeks-day-text {
+		font-size: 12px;
+		color: #B2B2B2;
+	}
+
+	.uni-calendar__box {
+		position: relative;
+		// padding: 0 10px;
+		padding-bottom: 7px;
+	}
+
+	.uni-calendar__box-bg {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+
+	.uni-calendar__box-bg-text {
+		font-size: 200px;
+		font-weight: bold;
+		color: #999;
+		opacity: 0.1;
+		text-align: center;
+		/* #ifndef APP-NVUE */
+		line-height: 1;
+		/* #endif */
+	}
+
+	.uni-date-changed {
+		padding: 0 10px;
+		// line-height: 50px;
+		text-align: center;
+		color: #333;
+		border-top-color: #DCDCDC;
+		;
+		border-top-style: solid;
+		border-top-width: 1px;
+		flex: 1;
+	}
+
+	.uni-date-btn--ok {
+		padding: 20px 15px;
+	}
+
+	.uni-date-changed--time-start {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+	}
+
+	.uni-date-changed--time-end {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+	}
+
+	.uni-date-changed--time-date {
+		color: #999;
+		line-height: 50px;
+		/* #ifdef MP-TOUTIAO */
+		font-size: 16px;
+		/* #endif */
+		margin-right: 5px;
+		// opacity: 0.6;
+	}
+
+	.time-picker-style {
+		// width: 62px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center
+	}
+
+	.mr-10 {
+		margin-right: 10px;
+	}
+
+	.dialog-close {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		padding: 0 25px;
+		margin-top: 10px;
+	}
+
+	.dialog-close-plus {
+		width: 16px;
+		height: 2px;
+		background-color: #737987;
+		border-radius: 2px;
+		transform: rotate(45deg);
+	}
+
+	.dialog-close-rotate {
+		position: absolute;
+		transform: rotate(-45deg);
+	}
+
+	.uni-datetime-picker--btn {
+		border-radius: 100px;
+		height: 40px;
+		line-height: 40px;
+		background-color: $uni-primary;
+		color: #fff;
+		font-size: 16px;
+		letter-spacing: 2px;
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-datetime-picker--btn:active {
+		opacity: 0.7;
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
new file mode 100644
index 0000000..024f22f
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
@@ -0,0 +1,22 @@
+{
+	"uni-datetime-picker.selectDate": "select date",
+	"uni-datetime-picker.selectTime": "select time",
+	"uni-datetime-picker.selectDateTime": "select date and time",
+	"uni-datetime-picker.startDate": "start date",
+	"uni-datetime-picker.endDate": "end date",
+	"uni-datetime-picker.startTime": "start time",
+	"uni-datetime-picker.endTime": "end time",
+	"uni-datetime-picker.ok": "ok",
+	"uni-datetime-picker.clear": "clear",
+	"uni-datetime-picker.cancel": "cancel",
+	"uni-datetime-picker.year": "-",
+	"uni-datetime-picker.month": "",
+	"uni-calender.MON": "MON",
+	"uni-calender.TUE": "TUE",
+	"uni-calender.WED": "WED",
+	"uni-calender.THU": "THU",
+	"uni-calender.FRI": "FRI",
+	"uni-calender.SAT": "SAT",
+	"uni-calender.SUN": "SUN",
+	"uni-calender.confirm": "confirm"
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
new file mode 100644
index 0000000..d2df5e7
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
@@ -0,0 +1,22 @@
+{
+	"uni-datetime-picker.selectDate": "閫夋嫨鏃ユ湡",
+	"uni-datetime-picker.selectTime": "閫夋嫨鏃堕棿",
+	"uni-datetime-picker.selectDateTime": "閫夋嫨鏃ユ湡鏃堕棿",
+	"uni-datetime-picker.startDate": "寮�濮嬫棩鏈�",
+	"uni-datetime-picker.endDate": "缁撴潫鏃ユ湡",
+	"uni-datetime-picker.startTime": "寮�濮嬫椂闂�",
+	"uni-datetime-picker.endTime": "缁撴潫鏃堕棿",
+	"uni-datetime-picker.ok": "纭畾",
+	"uni-datetime-picker.clear": "娓呴櫎",
+	"uni-datetime-picker.cancel": "鍙栨秷",
+	"uni-datetime-picker.year": "骞�",
+	"uni-datetime-picker.month": "鏈�",
+	"uni-calender.SUN": "鏃�",
+	"uni-calender.MON": "涓�",
+	"uni-calender.TUE": "浜�",
+	"uni-calender.WED": "涓�",
+	"uni-calender.THU": "鍥�",
+	"uni-calender.FRI": "浜�",
+	"uni-calender.SAT": "鍏�",
+	"uni-calender.confirm": "纭"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
new file mode 100644
index 0000000..d23fa3c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
@@ -0,0 +1,22 @@
+{
+  "uni-datetime-picker.selectDate": "閬告搰鏃ユ湡",
+  "uni-datetime-picker.selectTime": "閬告搰鏅傞枔",
+  "uni-datetime-picker.selectDateTime": "閬告搰鏃ユ湡鏅傞枔",
+  "uni-datetime-picker.startDate": "闁嬪鏃ユ湡",
+  "uni-datetime-picker.endDate": "绲愭潫鏃ユ湡",
+  "uni-datetime-picker.startTime": "闁嬪鏃堕棿",
+  "uni-datetime-picker.endTime": "绲愭潫鏃堕棿",
+  "uni-datetime-picker.ok": "纰哄畾",
+  "uni-datetime-picker.clear": "娓呴櫎",
+  "uni-datetime-picker.cancel": "鍙栨秷",
+  "uni-datetime-picker.year": "骞�",
+  "uni-datetime-picker.month": "鏈�",
+  "uni-calender.SUN": "鏃�",
+  "uni-calender.MON": "涓�",
+  "uni-calender.TUE": "浜�",
+  "uni-calender.WED": "涓�",
+  "uni-calender.THU": "鍥�",
+  "uni-calender.FRI": "浜�",
+  "uni-calender.SAT": "鍏�",
+  "uni-calender.confirm": "纰鸿獚"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
new file mode 100644
index 0000000..1817692
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
@@ -0,0 +1,940 @@
+<template>
+	<view class="uni-datetime-picker">
+		<view @click="initTimePicker">
+			<slot>
+				<view class="uni-datetime-picker-timebox-pointer"
+					:class="{'uni-datetime-picker-disabled': disabled, 'uni-datetime-picker-timebox': border}">
+					<text class="uni-datetime-picker-text">{{time}}</text>
+					<view v-if="!time" class="uni-datetime-picker-time">
+						<text class="uni-datetime-picker-text">{{selectTimeText}}</text>
+					</view>
+				</view>
+			</slot>
+		</view>
+		<view v-if="visible" id="mask" class="uni-datetime-picker-mask" @click="tiggerTimePicker"></view>
+		<view v-if="visible" class="uni-datetime-picker-popup" :class="[dateShow && timeShow ? '' : 'fix-nvue-height']"
+			:style="fixNvueBug">
+			<view class="uni-title">
+				<text class="uni-datetime-picker-text">{{selectTimeText}}</text>
+			</view>
+			<view v-if="dateShow" class="uni-datetime-picker__container-box">
+				<picker-view class="uni-datetime-picker-view" :indicator-style="indicatorStyle" :value="ymd"
+					@change="bindDateChange">
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in years" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in months" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in days" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<!-- 鍏煎 nvue 涓嶆敮鎸佷吉绫� -->
+				<text class="uni-datetime-picker-sign sign-left">-</text>
+				<text class="uni-datetime-picker-sign sign-right">-</text>
+			</view>
+			<view v-if="timeShow" class="uni-datetime-picker__container-box">
+				<picker-view class="uni-datetime-picker-view" :class="[hideSecond ? 'time-hide-second' : '']"
+					:indicator-style="indicatorStyle" :value="hms" @change="bindTimeChange">
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in hours" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in minutes" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!hideSecond">
+						<view class="uni-datetime-picker-item" v-for="(item,index) in seconds" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<!-- 鍏煎 nvue 涓嶆敮鎸佷吉绫� -->
+				<text class="uni-datetime-picker-sign" :class="[hideSecond ? 'sign-center' : 'sign-left']">:</text>
+				<text v-if="!hideSecond" class="uni-datetime-picker-sign sign-right">:</text>
+			</view>
+			<view class="uni-datetime-picker-btn">
+				<view @click="clearTime">
+					<text class="uni-datetime-picker-btn-text">{{clearText}}</text>
+				</view>
+				<view class="uni-datetime-picker-btn-group">
+					<view class="uni-datetime-picker-cancel" @click="tiggerTimePicker">
+						<text class="uni-datetime-picker-btn-text">{{cancelText}}</text>
+					</view>
+					<view @click="setTime">
+						<text class="uni-datetime-picker-btn-text">{{okText}}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	const {
+		t
+	} = initVueI18n(i18nMessages)
+	import {
+		fixIosDateFormat
+	} from './util'
+
+	/**
+	 * DatetimePicker 鏃堕棿閫夋嫨鍣�
+	 * @description 鍙互鍚屾椂閫夋嫨鏃ユ湡鍜屾椂闂寸殑閫夋嫨鍣�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=xxx
+	 * @property {String} type = [datetime | date | time] 鏄剧ず妯″紡
+	 * @property {Boolean} multiple = [true|false] 鏄惁澶氶��
+	 * @property {String|Number} value 榛樿鍊�
+	 * @property {String|Number} start 璧峰鏃ユ湡鎴栨椂闂�
+	 * @property {String|Number} end 璧峰鏃ユ湡鎴栨椂闂�
+	 * @property {String} return-type = [timestamp | string]
+	 * @event {Function} change  閫変腑鍙戠敓鍙樺寲瑙﹀彂
+	 */
+
+	export default {
+		name: 'UniDatetimePicker',
+		data() {
+			return {
+				indicatorStyle: `height: 50px;`,
+				visible: false,
+				fixNvueBug: {},
+				dateShow: true,
+				timeShow: true,
+				title: '鏃ユ湡鍜屾椂闂�',
+				// 杈撳叆妗嗗綋鍓嶆椂闂�
+				time: '',
+				// 褰撳墠鐨勫勾鏈堟棩鏃跺垎绉�
+				year: 1920,
+				month: 0,
+				day: 0,
+				hour: 0,
+				minute: 0,
+				second: 0,
+				// 璧峰鏃堕棿
+				startYear: 1920,
+				startMonth: 1,
+				startDay: 1,
+				startHour: 0,
+				startMinute: 0,
+				startSecond: 0,
+				// 缁撴潫鏃堕棿
+				endYear: 2120,
+				endMonth: 12,
+				endDay: 31,
+				endHour: 23,
+				endMinute: 59,
+				endSecond: 59,
+			}
+		},
+		options: {
+			// #ifdef MP-TOUTIAO
+			virtualHost: false,
+			// #endif
+			// #ifndef MP-TOUTIAO
+			virtualHost: true
+			// #endif
+		},
+		props: {
+			type: {
+				type: String,
+				default: 'datetime'
+			},
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			start: {
+				type: [Number, String],
+				default: ''
+			},
+			end: {
+				type: [Number, String],
+				default: ''
+			},
+			returnType: {
+				type: String,
+				default: 'string'
+			},
+			disabled: {
+				type: [Boolean, String],
+				default: false
+			},
+			border: {
+				type: [Boolean, String],
+				default: true
+			},
+			hideSecond: {
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		watch: {
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+					if (newVal) {
+						this.parseValue(fixIosDateFormat(newVal))
+						this.initTime(false)
+					} else {
+						this.time = ''
+						this.parseValue(Date.now())
+					}
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal) {
+					if (newVal) {
+						this.parseValue(fixIosDateFormat(newVal))
+						this.initTime(false)
+					} else {
+						this.time = ''
+						this.parseValue(Date.now())
+					}
+				},
+				immediate: true
+			},
+			// #endif
+			type: {
+				handler(newValue) {
+					if (newValue === 'date') {
+						this.dateShow = true
+						this.timeShow = false
+						this.title = '鏃ユ湡'
+					} else if (newValue === 'time') {
+						this.dateShow = false
+						this.timeShow = true
+						this.title = '鏃堕棿'
+					} else {
+						this.dateShow = true
+						this.timeShow = true
+						this.title = '鏃ユ湡鍜屾椂闂�'
+					}
+				},
+				immediate: true
+			},
+			start: {
+				handler(newVal) {
+					this.parseDatetimeRange(fixIosDateFormat(newVal), 'start')
+				},
+				immediate: true
+			},
+			end: {
+				handler(newVal) {
+					this.parseDatetimeRange(fixIosDateFormat(newVal), 'end')
+				},
+				immediate: true
+			},
+
+			// 鏈堛�佹棩銆佹椂銆佸垎銆佺鍙�夎寖鍥村彉鍖栧悗锛屾鏌ュ綋鍓嶅�兼槸鍚﹀湪鑼冨洿鍐咃紝涓嶅湪鍒欏綋鍓嶅�奸噸缃负鍙�夎寖鍥寸涓�椤�
+			months(newVal) {
+				this.checkValue('month', this.month, newVal)
+			},
+			days(newVal) {
+				this.checkValue('day', this.day, newVal)
+			},
+			hours(newVal) {
+				this.checkValue('hour', this.hour, newVal)
+			},
+			minutes(newVal) {
+				this.checkValue('minute', this.minute, newVal)
+			},
+			seconds(newVal) {
+				this.checkValue('second', this.second, newVal)
+			}
+		},
+		computed: {
+			// 褰撳墠骞淬�佹湀銆佹棩銆佹椂銆佸垎銆佺閫夋嫨鑼冨洿
+			years() {
+				return this.getCurrentRange('year')
+			},
+
+			months() {
+				return this.getCurrentRange('month')
+			},
+
+			days() {
+				return this.getCurrentRange('day')
+			},
+
+			hours() {
+				return this.getCurrentRange('hour')
+			},
+
+			minutes() {
+				return this.getCurrentRange('minute')
+			},
+
+			seconds() {
+				return this.getCurrentRange('second')
+			},
+
+			// picker 褰撳墠鍊兼暟缁�
+			ymd() {
+				return [this.year - this.minYear, this.month - this.minMonth, this.day - this.minDay]
+			},
+			hms() {
+				return [this.hour - this.minHour, this.minute - this.minMinute, this.second - this.minSecond]
+			},
+
+			// 褰撳墠 date 鏄� start
+			currentDateIsStart() {
+				return this.year === this.startYear && this.month === this.startMonth && this.day === this.startDay
+			},
+
+			// 褰撳墠 date 鏄� end
+			currentDateIsEnd() {
+				return this.year === this.endYear && this.month === this.endMonth && this.day === this.endDay
+			},
+
+			// 褰撳墠骞淬�佹湀銆佹棩銆佹椂銆佸垎銆佺鐨勬渶灏忓�煎拰鏈�澶у��
+			minYear() {
+				return this.startYear
+			},
+			maxYear() {
+				return this.endYear
+			},
+			minMonth() {
+				if (this.year === this.startYear) {
+					return this.startMonth
+				} else {
+					return 1
+				}
+			},
+			maxMonth() {
+				if (this.year === this.endYear) {
+					return this.endMonth
+				} else {
+					return 12
+				}
+			},
+			minDay() {
+				if (this.year === this.startYear && this.month === this.startMonth) {
+					return this.startDay
+				} else {
+					return 1
+				}
+			},
+			maxDay() {
+				if (this.year === this.endYear && this.month === this.endMonth) {
+					return this.endDay
+				} else {
+					return this.daysInMonth(this.year, this.month)
+				}
+			},
+			minHour() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsStart) {
+						return this.startHour
+					} else {
+						return 0
+					}
+				}
+				if (this.type === 'time') {
+					return this.startHour
+				}
+			},
+			maxHour() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsEnd) {
+						return this.endHour
+					} else {
+						return 23
+					}
+				}
+				if (this.type === 'time') {
+					return this.endHour
+				}
+			},
+			minMinute() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsStart && this.hour === this.startHour) {
+						return this.startMinute
+					} else {
+						return 0
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.startHour) {
+						return this.startMinute
+					} else {
+						return 0
+					}
+				}
+			},
+			maxMinute() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsEnd && this.hour === this.endHour) {
+						return this.endMinute
+					} else {
+						return 59
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.endHour) {
+						return this.endMinute
+					} else {
+						return 59
+					}
+				}
+			},
+			minSecond() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsStart && this.hour === this.startHour && this.minute === this.startMinute) {
+						return this.startSecond
+					} else {
+						return 0
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.startHour && this.minute === this.startMinute) {
+						return this.startSecond
+					} else {
+						return 0
+					}
+				}
+			},
+			maxSecond() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsEnd && this.hour === this.endHour && this.minute === this.endMinute) {
+						return this.endSecond
+					} else {
+						return 59
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.endHour && this.minute === this.endMinute) {
+						return this.endSecond
+					} else {
+						return 59
+					}
+				}
+			},
+
+			/**
+			 * for i18n
+			 */
+			selectTimeText() {
+				return t("uni-datetime-picker.selectTime")
+			},
+			okText() {
+				return t("uni-datetime-picker.ok")
+			},
+			clearText() {
+				return t("uni-datetime-picker.clear")
+			},
+			cancelText() {
+				return t("uni-datetime-picker.cancel")
+			}
+		},
+
+		mounted() {
+			// #ifdef APP-NVUE
+			const res = uni.getSystemInfoSync();
+			this.fixNvueBug = {
+				top: res.windowHeight / 2,
+				left: res.windowWidth / 2
+			}
+			// #endif
+		},
+
+		methods: {
+			/**
+			 * @param {Object} item
+			 * 灏忎簬 10 鍦ㄥ墠闈㈠姞涓� 0
+			 */
+
+			lessThanTen(item) {
+				return item < 10 ? '0' + item : item
+			},
+
+			/**
+			 * 瑙f瀽鏃跺垎绉掑瓧绗︿覆锛屼緥濡傦細00:00:00
+			 * @param {String} timeString
+			 */
+			parseTimeType(timeString) {
+				if (timeString) {
+					let timeArr = timeString.split(':')
+					this.hour = Number(timeArr[0])
+					this.minute = Number(timeArr[1])
+					this.second = Number(timeArr[2])
+				}
+			},
+
+			/**
+			 * 瑙f瀽閫夋嫨鍣ㄥ垵濮嬪�硷紝绫诲瀷鍙互鏄瓧绗︿覆銆佹椂闂存埑锛屼緥濡傦細2000-10-02銆�'08:30:00'銆� 1610695109000
+			 * @param {String | Number} datetime
+			 */
+			initPickerValue(datetime) {
+				let defaultValue = null
+				if (datetime) {
+					defaultValue = this.compareValueWithStartAndEnd(datetime, this.start, this.end)
+				} else {
+					defaultValue = Date.now()
+					defaultValue = this.compareValueWithStartAndEnd(defaultValue, this.start, this.end)
+				}
+				this.parseValue(defaultValue)
+			},
+
+			/**
+			 * 鍒濆鍊艰鍒欙細
+			 * - 鐢ㄦ埛璁剧疆鍒濆鍊� value
+			 * 	- 璁剧疆浜嗚捣濮嬫椂闂� start銆佺粓姝㈡椂闂� end锛屽苟 start < value < end锛屽垵濮嬪�间负 value锛� 鍚﹀垯鍒濆鍊间负 start
+			 * 	- 鍙缃簡璧峰鏃堕棿 start锛屽苟 start < value锛屽垵濮嬪�间负 value锛屽惁鍒欏垵濮嬪�间负 start
+			 * 	- 鍙缃簡缁堟鏃堕棿 end锛屽苟 value < end锛屽垵濮嬪�间负 value锛屽惁鍒欏垵濮嬪�间负 end
+			 * 	- 鏃犺捣濮嬬粓姝㈡椂闂达紝鍒欏垵濮嬪�间负 value
+			 * - 鏃犲垵濮嬪�� value锛屽垯鍒濆鍊间负褰撳墠鏈湴鏃堕棿 Date.now()
+			 * @param {Object} value
+			 * @param {Object} dateBase
+			 */
+			compareValueWithStartAndEnd(value, start, end) {
+				let winner = null
+				value = this.superTimeStamp(value)
+				start = this.superTimeStamp(start)
+				end = this.superTimeStamp(end)
+
+				if (start && end) {
+					if (value < start) {
+						winner = new Date(start)
+					} else if (value > end) {
+						winner = new Date(end)
+					} else {
+						winner = new Date(value)
+					}
+				} else if (start && !end) {
+					winner = start <= value ? new Date(value) : new Date(start)
+				} else if (!start && end) {
+					winner = value <= end ? new Date(value) : new Date(end)
+				} else {
+					winner = new Date(value)
+				}
+
+				return winner
+			},
+
+			/**
+			 * 杞崲涓哄彲姣旇緝鐨勬椂闂存埑锛屾帴鍙楁棩鏈熴�佹椂鍒嗙銆佹椂闂存埑
+			 * @param {Object} value
+			 */
+			superTimeStamp(value) {
+				let dateBase = ''
+				if (this.type === 'time' && value && typeof value === 'string') {
+					const now = new Date()
+					const year = now.getFullYear()
+					const month = now.getMonth() + 1
+					const day = now.getDate()
+					dateBase = year + '/' + month + '/' + day + ' '
+				}
+				if (Number(value)) {
+					value = parseInt(value)
+					dateBase = 0
+				}
+				return this.createTimeStamp(dateBase + value)
+			},
+
+			/**
+			 * 瑙f瀽榛樿鍊� value锛屽瓧绗︿覆銆佹椂闂存埑
+			 * @param {Object} defaultTime
+			 */
+			parseValue(value) {
+				if (!value) {
+					return
+				}
+				if (this.type === 'time' && typeof value === "string") {
+					this.parseTimeType(value)
+				} else {
+					let defaultDate = null
+					defaultDate = new Date(value)
+					if (this.type !== 'time') {
+						this.year = defaultDate.getFullYear()
+						this.month = defaultDate.getMonth() + 1
+						this.day = defaultDate.getDate()
+					}
+					if (this.type !== 'date') {
+						this.hour = defaultDate.getHours()
+						this.minute = defaultDate.getMinutes()
+						this.second = defaultDate.getSeconds()
+					}
+				}
+				if (this.hideSecond) {
+					this.second = 0
+				}
+			},
+
+			/**
+			 * 瑙f瀽鍙�夋嫨鏃堕棿鑼冨洿 start銆乪nd锛屽勾鏈堟棩瀛楃涓层�佹椂闂存埑
+			 * @param {Object} defaultTime
+			 */
+			parseDatetimeRange(point, pointType) {
+				// 鏃堕棿涓虹┖锛屽垯閲嶇疆涓哄垵濮嬪��
+				if (!point) {
+					if (pointType === 'start') {
+						this.startYear = 1920
+						this.startMonth = 1
+						this.startDay = 1
+						this.startHour = 0
+						this.startMinute = 0
+						this.startSecond = 0
+					}
+					if (pointType === 'end') {
+						this.endYear = 2120
+						this.endMonth = 12
+						this.endDay = 31
+						this.endHour = 23
+						this.endMinute = 59
+						this.endSecond = 59
+					}
+					return
+				}
+				if (this.type === 'time') {
+					const pointArr = point.split(':')
+					this[pointType + 'Hour'] = Number(pointArr[0])
+					this[pointType + 'Minute'] = Number(pointArr[1])
+					this[pointType + 'Second'] = Number(pointArr[2])
+				} else {
+					if (!point) {
+						pointType === 'start' ? this.startYear = this.year - 60 : this.endYear = this.year + 60
+						return
+					}
+					if (Number(point)) {
+						point = parseInt(point)
+					}
+					// datetime 鐨� end 娌℃湁鏃跺垎绉�, 鍒欎笉闄愬埗
+					const hasTime = /[0-9]:[0-9]/
+					if (this.type === 'datetime' && pointType === 'end' && typeof point === 'string' && !hasTime.test(
+							point)) {
+						point = point + ' 23:59:59'
+					}
+					const pointDate = new Date(point)
+					this[pointType + 'Year'] = pointDate.getFullYear()
+					this[pointType + 'Month'] = pointDate.getMonth() + 1
+					this[pointType + 'Day'] = pointDate.getDate()
+					if (this.type === 'datetime') {
+						this[pointType + 'Hour'] = pointDate.getHours()
+						this[pointType + 'Minute'] = pointDate.getMinutes()
+						this[pointType + 'Second'] = pointDate.getSeconds()
+					}
+				}
+			},
+
+			// 鑾峰彇 骞淬�佹湀銆佹棩銆佹椂銆佸垎銆佺 褰撳墠鍙�夎寖鍥�
+			getCurrentRange(value) {
+				const range = []
+				for (let i = this['min' + this.capitalize(value)]; i <= this['max' + this.capitalize(value)]; i++) {
+					range.push(i)
+				}
+				return range
+			},
+
+			// 瀛楃涓查瀛楁瘝澶у啓
+			capitalize(str) {
+				return str.charAt(0).toUpperCase() + str.slice(1)
+			},
+
+			// 妫�鏌ュ綋鍓嶅�兼槸鍚﹀湪鑼冨洿鍐咃紝涓嶅湪鍒欏綋鍓嶅�奸噸缃负鍙�夎寖鍥寸涓�椤�
+			checkValue(name, value, values) {
+				if (values.indexOf(value) === -1) {
+					this[name] = values[0]
+				}
+			},
+
+			// 姣忎釜鏈堢殑瀹為檯澶╂暟
+			daysInMonth(year, month) { // Use 1 for January, 2 for February, etc.
+				return new Date(year, month, 0).getDate();
+			},
+
+			/**
+			 * 鐢熸垚鏃堕棿鎴�
+			 * @param {Object} time
+			 */
+			createTimeStamp(time) {
+				if (!time) return
+				if (typeof time === "number") {
+					return time
+				} else {
+					time = time.replace(/-/g, '/')
+					if (this.type === 'date') {
+						time = time + ' ' + '00:00:00'
+					}
+					return Date.parse(time)
+				}
+			},
+
+			/**
+			 * 鐢熸垚鏃ユ湡鎴栨椂闂寸殑瀛楃涓�
+			 */
+			createDomSting() {
+				const yymmdd = this.year +
+					'-' +
+					this.lessThanTen(this.month) +
+					'-' +
+					this.lessThanTen(this.day)
+
+				let hhmmss = this.lessThanTen(this.hour) +
+					':' +
+					this.lessThanTen(this.minute)
+
+				if (!this.hideSecond) {
+					hhmmss = hhmmss + ':' + this.lessThanTen(this.second)
+				}
+
+				if (this.type === 'date') {
+					return yymmdd
+				} else if (this.type === 'time') {
+					return hhmmss
+				} else {
+					return yymmdd + ' ' + hhmmss
+				}
+			},
+
+			/**
+			 * 鍒濆鍖栬繑鍥炲�硷紝骞舵姏鍑� change 浜嬩欢
+			 */
+			initTime(emit = true) {
+				this.time = this.createDomSting()
+				if (!emit) return
+				if (this.returnType === 'timestamp' && this.type !== 'time') {
+					this.$emit('change', this.createTimeStamp(this.time))
+					this.$emit('input', this.createTimeStamp(this.time))
+					this.$emit('update:modelValue', this.createTimeStamp(this.time))
+				} else {
+					this.$emit('change', this.time)
+					this.$emit('input', this.time)
+					this.$emit('update:modelValue', this.time)
+				}
+			},
+
+			/**
+			 * 鐢ㄦ埛閫夋嫨鏃ユ湡鎴栨椂闂存洿鏂� data
+			 * @param {Object} e
+			 */
+			bindDateChange(e) {
+				const val = e.detail.value
+				this.year = this.years[val[0]]
+				this.month = this.months[val[1]]
+				this.day = this.days[val[2]]
+			},
+			bindTimeChange(e) {
+				const val = e.detail.value
+				this.hour = this.hours[val[0]]
+				this.minute = this.minutes[val[1]]
+				this.second = this.seconds[val[2]]
+			},
+
+			/**
+			 * 鍒濆鍖栧脊鍑哄眰
+			 */
+			initTimePicker() {
+				if (this.disabled) return
+				const value = fixIosDateFormat(this.time)
+				this.initPickerValue(value)
+				this.visible = !this.visible
+			},
+
+			/**
+			 * 瑙﹀彂鎴栧叧闂脊妗�
+			 */
+			tiggerTimePicker(e) {
+				this.visible = !this.visible
+			},
+
+			/**
+			 * 鐢ㄦ埛鐐瑰嚮鈥滄竻绌衡�濇寜閽紝娓呯┖褰撳墠鍊�
+			 */
+			clearTime() {
+				this.time = ''
+				this.$emit('change', this.time)
+				this.$emit('input', this.time)
+				this.$emit('update:modelValue', this.time)
+				this.tiggerTimePicker()
+			},
+
+			/**
+			 * 鐢ㄦ埛鐐瑰嚮鈥滅‘瀹氣�濇寜閽�
+			 */
+			setTime() {
+				this.initTime()
+				this.tiggerTimePicker()
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-primary: #007aff !default;
+
+	.uni-datetime-picker {
+		/* #ifndef APP-NVUE */
+		/* width: 100%; */
+		/* #endif */
+	}
+
+	.uni-datetime-picker-view {
+		height: 130px;
+		width: 270px;
+		/* #ifndef APP-NVUE */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-item {
+		height: 50px;
+		line-height: 50px;
+		text-align: center;
+		font-size: 14px;
+	}
+
+	.uni-datetime-picker-btn {
+		margin-top: 60px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+	}
+
+	.uni-datetime-picker-btn-text {
+		font-size: 14px;
+		color: $uni-primary;
+	}
+
+	.uni-datetime-picker-btn-group {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-datetime-picker-cancel {
+		margin-right: 30px;
+	}
+
+	.uni-datetime-picker-mask {
+		position: fixed;
+		bottom: 0px;
+		top: 0px;
+		left: 0px;
+		right: 0px;
+		background-color: rgba(0, 0, 0, 0.4);
+		transition-duration: 0.3s;
+		z-index: 998;
+	}
+
+	.uni-datetime-picker-popup {
+		border-radius: 8px;
+		padding: 30px;
+		width: 270px;
+		/* #ifdef APP-NVUE */
+		height: 500px;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		width: 330px;
+		/* #endif */
+		background-color: #fff;
+		position: fixed;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		transition-duration: 0.3s;
+		z-index: 999;
+	}
+
+	.fix-nvue-height {
+		/* #ifdef APP-NVUE */
+		height: 330px;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-time {
+		color: grey;
+	}
+
+	.uni-datetime-picker-column {
+		height: 50px;
+	}
+
+	.uni-datetime-picker-timebox {
+
+		border: 1px solid #E5E5E5;
+		border-radius: 5px;
+		padding: 7px 10px;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-timebox-pointer {
+		/* #ifndef APP-NVUE */
+		cursor: pointer;
+		/* #endif */
+	}
+
+
+	.uni-datetime-picker-disabled {
+		opacity: 0.4;
+		/* #ifdef H5 */
+		cursor: not-allowed !important;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-text {
+		font-size: 14px;
+		line-height: 50px
+	}
+
+	.uni-datetime-picker-sign {
+		position: absolute;
+		top: 53px;
+		/* 鍑忔帀 10px 鐨勫厓绱犻珮搴︼紝鍏煎nvue */
+		color: #999;
+		/* #ifdef APP-NVUE */
+		font-size: 16px;
+		/* #endif */
+	}
+
+	.sign-left {
+		left: 86px;
+	}
+
+	.sign-right {
+		right: 86px;
+	}
+
+	.sign-center {
+		left: 135px;
+	}
+
+	.uni-datetime-picker__container-box {
+		position: relative;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-top: 40px;
+	}
+
+	.time-hide-second {
+		width: 180px;
+	}
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
new file mode 100644
index 0000000..cb7b2f3
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
@@ -0,0 +1,1057 @@
+<template>
+	<view class="uni-date">
+		<view class="uni-date-editor" @click="show">
+			<slot>
+				<view class="uni-date-editor--x"
+					:class="{'uni-date-editor--x__disabled': disabled,'uni-date-x--border': border}">
+					<view v-if="!isRange" class="uni-date-x uni-date-single">
+						<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+						<view class="uni-date__x-input">{{ displayValue || singlePlaceholderText }}</view>
+					</view>
+
+					<view v-else class="uni-date-x uni-date-range">
+						<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+						<view class="uni-date__x-input text-center">{{ displayRangeValue.startDate || startPlaceholderText }}</view>
+
+						<view class="range-separator">{{rangeSeparator}}</view>
+
+						<view class="uni-date__x-input text-center">{{ displayRangeValue.endDate || endPlaceholderText }}</view>
+					</view>
+
+					<view v-if="showClearIcon" class="uni-date__icon-clear" @click.stop="clear">
+						<uni-icons type="clear" color="#c0c4cc" size="22"></uni-icons>
+					</view>
+				</view>
+			</slot>
+		</view>
+
+		<view v-show="pickerVisible" class="uni-date-mask--pc" @click="close"></view>
+
+		<view v-if="!isPhone" v-show="pickerVisible" ref="datePicker" class="uni-date-picker__container">
+			<view v-if="!isRange" class="uni-date-single--x" :style="pickerPositionStyle">
+				<view class="uni-popper__arrow"></view>
+
+				<view v-if="hasTime" class="uni-date-changed popup-x-header">
+					<input class="uni-date__input text-center" type="text" v-model="inputDate" :placeholder="selectDateText" />
+
+					<time-picker type="time" v-model="pickerTime" :border="false" :disabled="!inputDate"
+						:start="timepickerStartTime" :end="timepickerEndTime" :hideSecond="hideSecond" style="width: 100%;">
+						<input class="uni-date__input text-center" type="text" v-model="pickerTime" :placeholder="selectTimeText"
+							:disabled="!inputDate" />
+					</time-picker>
+				</view>
+
+				<Calendar ref="pcSingle" :showMonth="false" :start-date="calendarRange.startDate"
+					:end-date="calendarRange.endDate" :date="calendarDate" @change="singleChange" :default-value="defaultValue"
+					style="padding: 0 8px;" />
+
+				<view v-if="hasTime" class="popup-x-footer">
+					<text class="confirm-text" @click="confirmSingleChange">{{okText}}</text>
+				</view>
+			</view>
+
+			<view v-else class="uni-date-range--x" :style="pickerPositionStyle">
+				<view class="uni-popper__arrow"></view>
+				<view v-if="hasTime" class="popup-x-header uni-date-changed">
+					<view class="popup-x-header--datetime">
+						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate"
+							:placeholder="startDateText" />
+
+						<time-picker type="time" v-model="tempRange.startTime" :start="timepickerStartTime" :border="false"
+							:disabled="!tempRange.startDate" :hideSecond="hideSecond">
+							<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startTime"
+								:placeholder="startTimeText" :disabled="!tempRange.startDate" />
+						</time-picker>
+					</view>
+
+					<uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons>
+
+					<view class="popup-x-header--datetime">
+						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endDate"
+							:placeholder="endDateText" />
+
+						<time-picker type="time" v-model="tempRange.endTime" :end="timepickerEndTime" :border="false"
+							:disabled="!tempRange.endDate" :hideSecond="hideSecond">
+							<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endTime"
+								:placeholder="endTimeText" :disabled="!tempRange.endDate" />
+						</time-picker>
+					</view>
+				</view>
+
+				<view class="popup-x-body">
+					<Calendar ref="left" :showMonth="false" :start-date="calendarRange.startDate"
+						:end-date="calendarRange.endDate" :range="true" :pleStatus="endMultipleStatus" @change="leftChange"
+						@firstEnterCale="updateRightCale" style="padding: 0 8px;"/>
+					<Calendar ref="right" :showMonth="false" :start-date="calendarRange.startDate"
+						:end-date="calendarRange.endDate" :range="true" @change="rightChange" :pleStatus="startMultipleStatus"
+						@firstEnterCale="updateLeftCale" style="padding: 0 8px;border-left: 1px solid #F1F1F1;" />
+				</view>
+
+				<view v-if="hasTime" class="popup-x-footer">
+					<text @click="clear">{{clearText}}</text>
+					<text class="confirm-text" @click="confirmRangeChange">{{okText}}</text>
+				</view>
+			</view>
+		</view>
+
+		<Calendar v-if="isPhone" ref="mobile" :clearDate="false" :date="calendarDate" :defTime="mobileCalendarTime"
+			:start-date="calendarRange.startDate" :end-date="calendarRange.endDate" :selectableTimes="mobSelectableTime"
+			:startPlaceholder="startPlaceholder" :endPlaceholder="endPlaceholder" :default-value="defaultValue"
+			:pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :hasTime="hasTime" :insert="false"
+			:hideSecond="hideSecond" @confirm="mobileChange" @maskClose="close" @change="calendarClick"/>
+	</view>
+</template>
+<script>
+	/**
+	 * DatetimePicker 鏃堕棿閫夋嫨鍣�
+	 * @description 鍚屾椂鏀寔 PC 鍜岀Щ鍔ㄧ浣跨敤鏃ュ巻閫夋嫨鏃ユ湡鍜屾棩鏈熻寖鍥�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3962
+	 * @property {String} type 閫夋嫨鍣ㄧ被鍨�
+	 * @property {String|Number|Array|Date} value 缁戝畾鍊�
+	 * @property {String} placeholder 鍗曢�夋嫨鏃剁殑鍗犱綅鍐呭
+	 * @property {String} start 璧峰鏃堕棿
+	 * @property {String} end 缁堟鏃堕棿
+	 * @property {String} start-placeholder 鑼冨洿閫夋嫨鏃跺紑濮嬫棩鏈熺殑鍗犱綅鍐呭
+	 * @property {String} end-placeholder 鑼冨洿閫夋嫨鏃剁粨鏉熸棩鏈熺殑鍗犱綅鍐呭
+	 * @property {String} range-separator 閫夋嫨鑼冨洿鏃剁殑鍒嗛殧绗�
+	 * @property {Boolean} border = [true|false] 鏄惁鏈夎竟妗�
+	 * @property {Boolean} disabled = [true|false] 鏄惁绂佺敤
+	 * @property {Boolean} clearIcon = [true|false] 鏄惁鏄剧ず娓呴櫎鎸夐挳锛堜粎PC绔�傜敤锛�
+	 * @property {[String} defaultValue 閫夋嫨鍣ㄦ墦寮�鏃堕粯璁ゆ樉绀虹殑鏃堕棿
+	 * @event {Function} change 纭畾鏃ユ湡鏃惰Е鍙戠殑浜嬩欢
+	 * @event {Function} maskClick 鐐瑰嚮閬僵灞傝Е鍙戠殑浜嬩欢
+	 * @event {Function} show 鎵撳紑寮瑰嚭灞�
+	 * @event {Function} close 鍏抽棴寮瑰嚭灞�
+	 * @event {Function} clear 娓呴櫎涓婃閫変腑鐨勭姸鎬佸拰鍊�
+	 **/
+	import Calendar from './calendar.vue'
+	import TimePicker from './time-picker.vue'
+	import {
+		initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	import {
+		getDateTime,
+		getDate,
+		getTime,
+		getDefaultSecond,
+		dateCompare,
+		checkDate,
+		fixIosDateFormat
+	} from './util'
+
+	export default {
+		name: 'UniDatetimePicker',
+
+		options: {
+			// #ifdef MP-TOUTIAO
+			virtualHost: false,
+			// #endif
+			// #ifndef MP-TOUTIAO
+			virtualHost: true
+			// #endif
+		},
+		components: {
+			Calendar,
+			TimePicker
+		},
+		data() {
+			return {
+				isRange: false,
+				hasTime: false,
+				displayValue: '',
+				inputDate: '',
+				calendarDate: '',
+				pickerTime: '',
+				calendarRange: {
+					startDate: '',
+					startTime: '',
+					endDate: '',
+					endTime: ''
+				},
+				displayRangeValue: {
+					startDate: '',
+					endDate: '',
+				},
+				tempRange: {
+					startDate: '',
+					startTime: '',
+					endDate: '',
+					endTime: ''
+				},
+				// 宸﹀彸鏃ュ巻鍚屾鏁版嵁
+				startMultipleStatus: {
+					before: '',
+					after: '',
+					data: [],
+					fulldate: ''
+				},
+				endMultipleStatus: {
+					before: '',
+					after: '',
+					data: [],
+					fulldate: ''
+				},
+				pickerVisible: false,
+				pickerPositionStyle: null,
+				isEmitValue: false,
+				isPhone: false,
+				isFirstShow: true,
+				i18nT: () => {}
+			}
+		},
+		props: {
+			type: {
+				type: String,
+				default: 'datetime'
+			},
+			value: {
+				type: [String, Number, Array, Date],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number, Array, Date],
+				default: ''
+			},
+			start: {
+				type: [Number, String],
+				default: ''
+			},
+			end: {
+				type: [Number, String],
+				default: ''
+			},
+			returnType: {
+				type: String,
+				default: 'string'
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			startPlaceholder: {
+				type: String,
+				default: ''
+			},
+			endPlaceholder: {
+				type: String,
+				default: ''
+			},
+			rangeSeparator: {
+				type: String,
+				default: '-'
+			},
+			border: {
+				type: [Boolean],
+				default: true
+			},
+			disabled: {
+				type: [Boolean],
+				default: false
+			},
+			clearIcon: {
+				type: [Boolean],
+				default: true
+			},
+			hideSecond: {
+				type: [Boolean],
+				default: false
+			},
+			defaultValue: {
+				type: [String, Object, Array],
+				default: ''
+			}
+		},
+		watch: {
+			type: {
+				immediate: true,
+				handler(newVal) {
+					this.hasTime = newVal.indexOf('time') !== -1
+					this.isRange = newVal.indexOf('range') !== -1
+				}
+			},
+			// #ifndef VUE3
+			value: {
+				immediate: true,
+				handler(newVal) {
+					if (this.isEmitValue) {
+						this.isEmitValue = false
+						return
+					}
+					this.initPicker(newVal)
+				}
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				immediate: true,
+				handler(newVal) {
+					if (this.isEmitValue) {
+						this.isEmitValue = false
+						return
+					}
+					this.initPicker(newVal)
+				}
+			},
+			// #endif
+			start: {
+				immediate: true,
+				handler(newVal) {
+					if (!newVal) return
+					this.calendarRange.startDate = getDate(newVal)
+					if (this.hasTime) {
+						this.calendarRange.startTime = getTime(newVal)
+					}
+				}
+			},
+			end: {
+				immediate: true,
+				handler(newVal) {
+					if (!newVal) return
+					this.calendarRange.endDate = getDate(newVal)
+					if (this.hasTime) {
+						this.calendarRange.endTime = getTime(newVal, this.hideSecond)
+					}
+				}
+			},
+		},
+		computed: {
+			timepickerStartTime() {
+				const activeDate = this.isRange ? this.tempRange.startDate : this.inputDate
+				return activeDate === this.calendarRange.startDate ? this.calendarRange.startTime : ''
+			},
+			timepickerEndTime() {
+				const activeDate = this.isRange ? this.tempRange.endDate : this.inputDate
+				return activeDate === this.calendarRange.endDate ? this.calendarRange.endTime : ''
+			},
+			mobileCalendarTime() {
+				const timeRange = {
+					start: this.tempRange.startTime,
+					end: this.tempRange.endTime
+				}
+				return this.isRange ? timeRange : this.pickerTime
+			},
+			mobSelectableTime() {
+				return {
+					start: this.calendarRange.startTime,
+					end: this.calendarRange.endTime
+				}
+			},
+			datePopupWidth() {
+				// todo
+				return this.isRange ? 653 : 301
+			},
+
+			/**
+			 * for i18n
+			 */
+			singlePlaceholderText() {
+				return this.placeholder || (this.type === 'date' ? this.selectDateText : this.selectDateTimeText)
+			},
+			startPlaceholderText() {
+				return this.startPlaceholder || this.startDateText
+			},
+			endPlaceholderText() {
+				return this.endPlaceholder || this.endDateText
+			},
+			selectDateText() {
+				return this.i18nT("uni-datetime-picker.selectDate")
+			},
+			selectDateTimeText() {
+				return this.i18nT("uni-datetime-picker.selectDateTime")
+			},
+			selectTimeText() {
+				return this.i18nT("uni-datetime-picker.selectTime")
+			},
+			startDateText() {
+				return this.startPlaceholder || this.i18nT("uni-datetime-picker.startDate")
+			},
+			startTimeText() {
+				return this.i18nT("uni-datetime-picker.startTime")
+			},
+			endDateText() {
+				return this.endPlaceholder || this.i18nT("uni-datetime-picker.endDate")
+			},
+			endTimeText() {
+				return this.i18nT("uni-datetime-picker.endTime")
+			},
+			okText() {
+				return this.i18nT("uni-datetime-picker.ok")
+			},
+			clearText() {
+				return this.i18nT("uni-datetime-picker.clear")
+			},
+			showClearIcon() {
+				return this.clearIcon && !this.disabled && (this.displayValue || (this.displayRangeValue.startDate && this
+					.displayRangeValue.endDate))
+			}
+		},
+		created() {
+			this.initI18nT()
+			this.platform()
+		},
+		methods: {
+			initI18nT() {
+				const vueI18n = initVueI18n(i18nMessages)
+				this.i18nT = vueI18n.t
+			},
+			initPicker(newVal) {
+				if ((!newVal && !this.defaultValue) || Array.isArray(newVal) && !newVal.length) {
+					this.$nextTick(() => {
+						this.clear(false)
+					})
+					return
+				}
+
+				if (!Array.isArray(newVal) && !this.isRange) {
+					if (newVal) {
+						this.displayValue = this.inputDate = this.calendarDate = getDate(newVal)
+						if (this.hasTime) {
+							this.pickerTime = getTime(newVal, this.hideSecond)
+							this.displayValue = `${this.displayValue} ${this.pickerTime}`
+						}
+					} else if (this.defaultValue) {
+						this.inputDate = this.calendarDate = getDate(this.defaultValue)
+						if (this.hasTime) {
+							this.pickerTime = getTime(this.defaultValue, this.hideSecond)
+						}
+					}
+				} else {
+					const [before, after] = newVal
+					if (!before && !after) return
+					const beforeDate = getDate(before)
+					const beforeTime = getTime(before, this.hideSecond)
+
+					const afterDate = getDate(after)
+					const afterTime = getTime(after, this.hideSecond)
+					const startDate = beforeDate
+					const endDate = afterDate
+					this.displayRangeValue.startDate = this.tempRange.startDate = startDate
+					this.displayRangeValue.endDate = this.tempRange.endDate = endDate
+
+					if (this.hasTime) {
+						this.displayRangeValue.startDate = `${beforeDate} ${beforeTime}`
+						this.displayRangeValue.endDate = `${afterDate} ${afterTime}`
+						this.tempRange.startTime = beforeTime
+						this.tempRange.endTime = afterTime
+					}
+					const defaultRange = {
+						before: beforeDate,
+						after: afterDate
+					}
+					this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, defaultRange, {
+						which: 'right'
+					})
+					this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, defaultRange, {
+						which: 'left'
+					})
+				}
+			},
+			updateLeftCale(e) {
+				const left = this.$refs.left
+				// 璁剧疆鑼冨洿閫�
+				left.cale.setHoverMultiple(e.after)
+				left.setDate(this.$refs.left.nowDate.fullDate)
+			},
+			updateRightCale(e) {
+				const right = this.$refs.right
+				// 璁剧疆鑼冨洿閫�
+				right.cale.setHoverMultiple(e.after)
+				right.setDate(this.$refs.right.nowDate.fullDate)
+			},
+			platform() {
+				if (typeof navigator !== "undefined") {
+					this.isPhone = navigator.userAgent.toLowerCase().indexOf('mobile') !== -1
+					return
+				}
+				const {
+					windowWidth
+				} = uni.getSystemInfoSync()
+				this.isPhone = windowWidth <= 500
+				this.windowWidth = windowWidth
+			},
+			show() {
+				this.$emit("show")
+				if (this.disabled) {
+					return
+				}
+				this.platform()
+				if (this.isPhone) {
+					setTimeout(() => {
+						this.$refs.mobile.open()
+					}, 0);
+					return
+				}
+				this.pickerPositionStyle = {
+					top: '10px'
+				}
+				const dateEditor = uni.createSelectorQuery().in(this).select(".uni-date-editor")
+				dateEditor.boundingClientRect(rect => {
+					if (this.windowWidth - rect.left < this.datePopupWidth) {
+						this.pickerPositionStyle.right = 0
+					}
+				}).exec()
+				setTimeout(() => {
+					this.pickerVisible = !this.pickerVisible
+					if (!this.isPhone && this.isRange && this.isFirstShow) {
+						this.isFirstShow = false
+						const {
+							startDate,
+							endDate
+						} = this.calendarRange
+						if (startDate && endDate) {
+							if (this.diffDate(startDate, endDate) < 30) {
+								this.$refs.right.changeMonth('pre')
+							}
+						} else {
+							// this.$refs.right.changeMonth('next')
+							if (this.isPhone) {
+								this.$refs.right.cale.lastHover = false;
+							}
+						}
+					}
+
+				}, 50)
+			},
+			close() {
+				setTimeout(() => {
+					this.pickerVisible = false
+					this.$emit('maskClick', this.value)
+					this.$refs.mobile && this.$refs.mobile.close()
+				}, 20)
+			},
+			setEmit(value) {
+				if (this.returnType === "timestamp" || this.returnType === "date") {
+					if (!Array.isArray(value)) {
+						if (!this.hasTime) {
+							value = value + ' ' + '00:00:00'
+						}
+						value = this.createTimestamp(value)
+						if (this.returnType === "date") {
+							value = new Date(value)
+						}
+					} else {
+						if (!this.hasTime) {
+							value[0] = value[0] + ' ' + '00:00:00'
+							value[1] = value[1] + ' ' + '00:00:00'
+						}
+						value[0] = this.createTimestamp(value[0])
+						value[1] = this.createTimestamp(value[1])
+						if (this.returnType === "date") {
+							value[0] = new Date(value[0])
+							value[1] = new Date(value[1])
+						}
+					}
+				}
+
+				this.$emit('update:modelValue', value)
+				this.$emit('input', value)
+				this.$emit('change', value)
+				this.isEmitValue = true
+			},
+			createTimestamp(date) {
+				date = fixIosDateFormat(date)
+				return Date.parse(new Date(date))
+			},
+			singleChange(e) {
+				this.calendarDate = this.inputDate = e.fulldate
+				if (this.hasTime) return
+				this.confirmSingleChange()
+			},
+			confirmSingleChange() {
+				if (!checkDate(this.inputDate)) {
+					const now = new Date()
+					this.calendarDate = this.inputDate = getDate(now)
+					this.pickerTime = getTime(now, this.hideSecond)
+				}
+
+				let startLaterInputDate = false
+				let startDate, startTime
+				if (this.start) {
+					let startString = this.start
+					if (typeof this.start === 'number') {
+						startString = getDateTime(this.start, this.hideSecond)
+					}
+					[startDate, startTime] = startString.split(' ')
+					if (this.start && !dateCompare(startDate, this.inputDate)) {
+						startLaterInputDate = true
+						this.inputDate = startDate
+					}
+				}
+
+				let endEarlierInputDate = false
+				let endDate, endTime
+				if (this.end) {
+					let endString = this.end
+					if (typeof this.end === 'number') {
+						endString = getDateTime(this.end, this.hideSecond)
+					}
+					[endDate, endTime] = endString.split(' ')
+					if (this.end && !dateCompare(this.inputDate, endDate)) {
+						endEarlierInputDate = true
+						this.inputDate = endDate
+					}
+				}
+				if (this.hasTime) {
+					if (startLaterInputDate) {
+						this.pickerTime = startTime || getDefaultSecond(this.hideSecond)
+					}
+					if (endEarlierInputDate) {
+						this.pickerTime = endTime || getDefaultSecond(this.hideSecond)
+					}
+					if (!this.pickerTime) {
+						this.pickerTime = getTime(Date.now(), this.hideSecond)
+					}
+					this.displayValue = `${this.inputDate} ${this.pickerTime}`
+				} else {
+					this.displayValue = this.inputDate
+				}
+				this.setEmit(this.displayValue)
+				this.pickerVisible = false
+			},
+			leftChange(e) {
+				const {
+					before,
+					after
+				} = e.range
+				this.rangeChange(before, after)
+				const obj = {
+					before: e.range.before,
+					after: e.range.after,
+					data: e.range.data,
+					fulldate: e.fulldate
+				}
+				this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, obj)
+				this.$emit('calendarClick', e)
+			},
+			rightChange(e) {
+				const {
+					before,
+					after
+				} = e.range
+				this.rangeChange(before, after)
+				const obj = {
+					before: e.range.before,
+					after: e.range.after,
+					data: e.range.data,
+					fulldate: e.fulldate
+				}
+				this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, obj)
+				this.$emit('calendarClick', e)
+			},
+			mobileChange(e) {
+				if (this.isRange) {
+					const {
+						before,
+						after
+					} = e.range
+					if (!before) {
+						return;
+					}
+
+					this.handleStartAndEnd(before, after, true)
+					if (this.hasTime) {
+						const {
+							startTime,
+							endTime
+						} = e.timeRange
+						this.tempRange.startTime = startTime
+						this.tempRange.endTime = endTime
+					}
+					this.confirmRangeChange()
+				} else {
+					if (this.hasTime) {
+						this.displayValue = e.fulldate + ' ' + e.time
+					} else {
+						this.displayValue = e.fulldate
+					}
+					this.setEmit(this.displayValue)
+				}
+				this.$refs.mobile.close()
+			},
+			rangeChange(before, after) {
+				if (!(before && after)) return
+				this.handleStartAndEnd(before, after, true)
+				if (this.hasTime) return
+				this.confirmRangeChange()
+			},
+			confirmRangeChange() {
+				if (!this.tempRange.startDate || !this.tempRange.endDate) {
+					this.pickerVisible = false
+					return
+				}
+				if (!checkDate(this.tempRange.startDate)) {
+					this.tempRange.startDate = getDate(Date.now())
+				}
+				if (!checkDate(this.tempRange.endDate)) {
+					this.tempRange.endDate = getDate(Date.now())
+				}
+
+				let start, end
+
+				let startDateLaterRangeStartDate = false
+				let startDateLaterRangeEndDate = false
+				let startDate, startTime
+				if (this.start) {
+					let startString = this.start
+					if (typeof this.start === 'number') {
+						startString = getDateTime(this.start, this.hideSecond)
+					}
+					[startDate, startTime] = startString.split(' ')
+					if (this.start && !dateCompare(this.start, this.tempRange.startDate)) {
+						startDateLaterRangeStartDate = true
+						this.tempRange.startDate = startDate
+					}
+					if (this.start && !dateCompare(this.start, this.tempRange.endDate)) {
+						startDateLaterRangeEndDate = true
+						this.tempRange.endDate = startDate
+					}
+				}
+				let endDateEarlierRangeStartDate = false
+				let endDateEarlierRangeEndDate = false
+				let endDate, endTime
+				if (this.end) {
+					let endString = this.end
+					if (typeof this.end === 'number') {
+						endString = getDateTime(this.end, this.hideSecond)
+					}
+					[endDate, endTime] = endString.split(' ')
+
+					if (this.end && !dateCompare(this.tempRange.startDate, this.end)) {
+						endDateEarlierRangeStartDate = true
+						this.tempRange.startDate = endDate
+					}
+					if (this.end && !dateCompare(this.tempRange.endDate, this.end)) {
+						endDateEarlierRangeEndDate = true
+						this.tempRange.endDate = endDate
+					}
+				}
+				if (!this.hasTime) {
+					start = this.displayRangeValue.startDate = this.tempRange.startDate
+					end = this.displayRangeValue.endDate = this.tempRange.endDate
+				} else {
+					if (startDateLaterRangeStartDate) {
+						this.tempRange.startTime = startTime || getDefaultSecond(this.hideSecond)
+					} else if (endDateEarlierRangeStartDate) {
+						this.tempRange.startTime = endTime || getDefaultSecond(this.hideSecond)
+					}
+					if (!this.tempRange.startTime) {
+						this.tempRange.startTime = getTime(Date.now(), this.hideSecond)
+					}
+
+					if (startDateLaterRangeEndDate) {
+						this.tempRange.endTime = startTime || getDefaultSecond(this.hideSecond)
+					} else if (endDateEarlierRangeEndDate) {
+						this.tempRange.endTime = endTime || getDefaultSecond(this.hideSecond)
+					}
+					if (!this.tempRange.endTime) {
+						this.tempRange.endTime = getTime(Date.now(), this.hideSecond)
+					}
+					start = this.displayRangeValue.startDate = `${this.tempRange.startDate} ${this.tempRange.startTime}`
+					end = this.displayRangeValue.endDate = `${this.tempRange.endDate} ${this.tempRange.endTime}`
+				}
+				if (!dateCompare(start, end)) {
+					[start, end] = [end, start]
+				}
+				this.displayRangeValue.startDate = start
+				this.displayRangeValue.endDate = end
+				const displayRange = [start, end]
+				this.setEmit(displayRange)
+				this.pickerVisible = false
+			},
+			handleStartAndEnd(before, after, temp = false) {
+				if (!before) return
+				if (!after) after = before;
+				const type = temp ? 'tempRange' : 'range'
+				const isStartEarlierEnd = dateCompare(before, after)
+				this[type].startDate = isStartEarlierEnd ? before : after
+				this[type].endDate = isStartEarlierEnd ? after : before
+			},
+			/**
+			 * 姣旇緝鏃堕棿澶у皬
+			 */
+			dateCompare(startDate, endDate) {
+				// 璁$畻鎴鏃堕棿
+				startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+				// 璁$畻璇︾粏椤圭殑鎴鏃堕棿
+				endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+				return startDate <= endDate
+			},
+
+			/**
+			 * 姣旇緝鏃堕棿宸�
+			 */
+			diffDate(startDate, endDate) {
+				// 璁$畻鎴鏃堕棿
+				startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+				// 璁$畻璇︾粏椤圭殑鎴鏃堕棿
+				endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+				const diff = (endDate - startDate) / (24 * 60 * 60 * 1000)
+				return Math.abs(diff)
+			},
+
+			clear(needEmit = true) {
+				if (!this.isRange) {
+					this.displayValue = ''
+					this.inputDate = ''
+					this.pickerTime = ''
+					if (this.isPhone) {
+						this.$refs.mobile && this.$refs.mobile.clearCalender()
+					} else {
+						this.$refs.pcSingle && this.$refs.pcSingle.clearCalender()
+					}
+					if (needEmit) {
+						this.$emit('change', '')
+						this.$emit('input', '')
+						this.$emit('update:modelValue', '')
+					}
+				} else {
+					this.displayRangeValue.startDate = ''
+					this.displayRangeValue.endDate = ''
+					this.tempRange.startDate = ''
+					this.tempRange.startTime = ''
+					this.tempRange.endDate = ''
+					this.tempRange.endTime = ''
+					if (this.isPhone) {
+						this.$refs.mobile && this.$refs.mobile.clearCalender()
+					} else {
+						this.$refs.left && this.$refs.left.clearCalender()
+						this.$refs.right && this.$refs.right.clearCalender()
+						this.$refs.right && this.$refs.right.changeMonth('next')
+					}
+					if (needEmit) {
+						this.$emit('change', [])
+						this.$emit('input', [])
+						this.$emit('update:modelValue', [])
+					}
+				}
+			},
+
+			calendarClick(e) {
+				this.$emit('calendarClick', e)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-primary: #007aff !default;
+
+	.uni-date {
+		width: 100%;
+		flex: 1;
+	}
+
+	.uni-date-x {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		border-radius: 4px;
+		// background-color: #fff;
+		color: #666;
+		font-size: 14px;
+		flex: 1;
+
+		.icon-calendar {
+			padding-left: 3px;
+		}
+
+		.range-separator {
+			height: 35px;
+			/* #ifndef MP */
+			padding: 0 2px;
+			/* #endif */
+			line-height: 35px;
+		}
+	}
+
+	.uni-date-x--border {
+		box-sizing: border-box;
+		border-radius: 4px;
+		// border: 1px solid #e5e5e5;
+	}
+
+	.uni-date-editor--x {
+		display: flex;
+		align-items: center;
+		position: relative;
+	}
+
+	.uni-date-editor--x .uni-date__icon-clear {
+		padding-right: 3px;
+		display: flex;
+		align-items: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-date__x-input {
+		width: auto;
+		height: 35px;
+		/* #ifndef MP */
+		padding-left: 5px;
+		/* #endif */
+		position: relative;
+		flex: 1;
+		line-height: 35px;
+		font-size: 14px;
+		overflow: hidden;
+	}
+
+	.text-center {
+		text-align: center;
+	}
+
+	.uni-date__input {
+		height: 40px;
+		width: 100%;
+		line-height: 40px;
+		font-size: 14px;
+	}
+
+	.uni-date-range__input {
+		text-align: center;
+		max-width: 142px;
+	}
+
+	.uni-date-picker__container {
+		position: relative;
+	}
+
+	.uni-date-mask--pc {
+		position: fixed;
+		bottom: 0px;
+		top: 0px;
+		left: 0px;
+		right: 0px;
+		background-color: rgba(0, 0, 0, 0);
+		transition-duration: 0.3s;
+		z-index: 996;
+	}
+
+	.uni-date-single--x {
+		background-color: #fff;
+		position: absolute;
+		top: 0;
+		z-index: 999;
+		border: 1px solid #EBEEF5;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		border-radius: 4px;
+	}
+
+	.uni-date-range--x {
+		background-color: #fff;
+		position: absolute;
+		top: 0;
+		z-index: 999;
+		border: 1px solid #EBEEF5;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		border-radius: 4px;
+	}
+
+	.uni-date-editor--x__disabled {
+		opacity: 0.4;
+		cursor: default;
+	}
+
+	.uni-date-editor--logo {
+		width: 16px;
+		height: 16px;
+		vertical-align: middle;
+	}
+
+	/* 娣诲姞鏃堕棿 */
+	.popup-x-header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.popup-x-header--datetime {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+	}
+
+	.popup-x-body {
+		display: flex;
+	}
+
+	.popup-x-footer {
+		padding: 0 15px;
+		border-top-color: #F1F1F1;
+		border-top-style: solid;
+		border-top-width: 1px;
+		line-height: 40px;
+		text-align: right;
+		color: #666;
+	}
+
+	.popup-x-footer text:hover {
+		color: $uni-primary;
+		cursor: pointer;
+		opacity: 0.8;
+	}
+
+	.popup-x-footer .confirm-text {
+		margin-left: 20px;
+		color: $uni-primary;
+	}
+
+	.uni-date-changed {
+		text-align: center;
+		color: #333;
+		border-bottom-color: #F1F1F1;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-date-changed--time text {
+		height: 50px;
+		line-height: 50px;
+	}
+
+	.uni-date-changed .uni-date-changed--time {
+		flex: 1;
+	}
+
+	.uni-date-changed--time-date {
+		color: #333;
+		opacity: 0.6;
+	}
+
+	.mr-50 {
+		margin-right: 50px;
+	}
+
+	/* picker 寮瑰嚭灞傞�氱敤鐨勬寚绀哄皬涓夎, todo锛氭墿灞曡嚦涓婁笅宸﹀彸鏂瑰悜瀹氫綅 */
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border: 6px solid transparent;
+		border-top-width: 0;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-bottom-color: #fff;
+	}
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
new file mode 100644
index 0000000..01802fa
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
@@ -0,0 +1,421 @@
+class Calendar {
+	constructor({
+		selected,
+		startDate,
+		endDate,
+		range,
+	} = {}) {
+		// 褰撳墠鏃ユ湡
+		this.date = this.getDateObj(new Date()) // 褰撳墠鍒濆叆鏃ユ湡
+		// 鎵撶偣淇℃伅
+		this.selected = selected || [];
+		// 璧峰鏃堕棿
+		this.startDate = startDate
+		// 缁堟鏃堕棿
+		this.endDate = endDate
+		// 鏄惁鑼冨洿閫夋嫨
+		this.range = range
+		// 澶氶�夌姸鎬�
+		this.cleanMultipleStatus()
+		// 姣忓懆鏃ユ湡
+		this.weeks = {}
+		this.lastHover = false
+	}
+	/**
+	 * 璁剧疆鏃ユ湡
+	 * @param {Object} date
+	 */
+	setDate(date) {
+		const selectDate = this.getDateObj(date)
+		this.getWeeks(selectDate.fullDate)
+	}
+
+	/**
+	 * 娓呯悊澶氶�夌姸鎬�
+	 */
+	cleanMultipleStatus() {
+		this.multipleStatus = {
+			before: '',
+			after: '',
+			data: []
+		}
+	}
+
+	setStartDate(startDate) {
+		this.startDate = startDate
+	}
+
+	setEndDate(endDate) {
+		this.endDate = endDate
+	}
+
+	getPreMonthObj(date) {
+		date = fixIosDateFormat(date)
+		date = new Date(date)
+
+		const oldMonth = date.getMonth()
+		date.setMonth(oldMonth - 1)
+		const newMonth = date.getMonth()
+		if (oldMonth !== 0 && newMonth - oldMonth === 0) {
+			date.setMonth(newMonth - 1)
+		}
+		return this.getDateObj(date)
+	}
+	getNextMonthObj(date) {
+		date = fixIosDateFormat(date)
+		date = new Date(date)
+
+		const oldMonth = date.getMonth()
+		date.setMonth(oldMonth + 1)
+		const newMonth = date.getMonth()
+		if (newMonth - oldMonth > 1) {
+			date.setMonth(newMonth - 1)
+		}
+		return this.getDateObj(date)
+	}
+
+	/**
+	 * 鑾峰彇鎸囧畾鏍煎紡Date瀵硅薄
+	 */
+	getDateObj(date) {
+		date = fixIosDateFormat(date)
+		date = new Date(date)
+
+		return {
+			fullDate: getDate(date),
+			year: date.getFullYear(),
+			month: addZero(date.getMonth() + 1),
+			date: addZero(date.getDate()),
+			day: date.getDay()
+		}
+	}
+
+	/**
+	 * 鑾峰彇涓婁竴涓湀鏃ユ湡闆嗗悎
+	 */
+	getPreMonthDays(amount, dateObj) {
+		const result = []
+		for (let i = amount - 1; i >= 0; i--) {
+			const month = dateObj.month - 1
+			result.push({
+				date: new Date(dateObj.year, month, -i).getDate(),
+				month,
+				disable: true
+			})
+		}
+		return result
+	}
+	/**
+	 * 鑾峰彇鏈湀鏃ユ湡闆嗗悎
+	 */
+	getCurrentMonthDays(amount, dateObj) {
+		const result = []
+		const fullDate = this.date.fullDate
+		for (let i = 1; i <= amount; i++) {
+			const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}`
+			const isToday = fullDate === currentDate
+			// 鑾峰彇鎵撶偣淇℃伅
+			const info = this.selected && this.selected.find((item) => {
+				if (this.dateEqual(currentDate, item.date)) {
+					return item
+				}
+			})
+
+			// 鏃ユ湡绂佺敤
+			let disableBefore = true
+			let disableAfter = true
+			if (this.startDate) {
+				disableBefore = dateCompare(this.startDate, currentDate)
+			}
+
+			if (this.endDate) {
+				disableAfter = dateCompare(currentDate, this.endDate)
+			}
+
+			let multiples = this.multipleStatus.data
+			let multiplesStatus = -1
+			if (this.range && multiples) {
+				multiplesStatus = multiples.findIndex((item) => {
+					return this.dateEqual(item, currentDate)
+				})
+			}
+			const checked = multiplesStatus !== -1
+
+			result.push({
+				fullDate: currentDate,
+				year: dateObj.year,
+				date: i,
+				multiple: this.range ? checked : false,
+				beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after),
+				afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after),
+				month: dateObj.month,
+				disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(
+					currentDate, this.endDate)),
+				isToday,
+				userChecked: false,
+				extraInfo: info
+			})
+		}
+		return result
+	}
+	/**
+	 * 鑾峰彇涓嬩竴涓湀鏃ユ湡闆嗗悎
+	 */
+	_getNextMonthDays(amount, dateObj) {
+		const result = []
+		const month = dateObj.month + 1
+		for (let i = 1; i <= amount; i++) {
+			result.push({
+				date: i,
+				month,
+				disable: true
+			})
+		}
+		return result
+	}
+
+	/**
+	 * 鑾峰彇褰撳墠鏃ユ湡璇︽儏
+	 * @param {Object} date
+	 */
+	getInfo(date) {
+		if (!date) {
+			date = new Date()
+		}
+
+		return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate)
+	}
+
+	/**
+	 * 姣旇緝鏃堕棿鏄惁鐩哥瓑
+	 */
+	dateEqual(before, after) {
+		before = new Date(fixIosDateFormat(before))
+		after = new Date(fixIosDateFormat(after))
+		return before.valueOf() === after.valueOf()
+	}
+
+	/**
+	 *  姣旇緝鐪熷疄璧峰鏃ユ湡
+	 */
+
+	isLogicBefore(currentDate, before, after) {
+		let logicBefore = before
+		if (before && after) {
+			logicBefore = dateCompare(before, after) ? before : after
+		}
+		return this.dateEqual(logicBefore, currentDate)
+	}
+
+	isLogicAfter(currentDate, before, after) {
+		let logicAfter = after
+		if (before && after) {
+			logicAfter = dateCompare(before, after) ? after : before
+		}
+		return this.dateEqual(logicAfter, currentDate)
+	}
+
+	/**
+	 * 鑾峰彇鏃ユ湡鑼冨洿鍐呮墍鏈夋棩鏈�
+	 * @param {Object} begin
+	 * @param {Object} end
+	 */
+	geDateAll(begin, end) {
+		var arr = []
+		var ab = begin.split('-')
+		var ae = end.split('-')
+		var db = new Date()
+		db.setFullYear(ab[0], ab[1] - 1, ab[2])
+		var de = new Date()
+		de.setFullYear(ae[0], ae[1] - 1, ae[2])
+		var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+		var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+		for (var k = unixDb; k <= unixDe;) {
+			k = k + 24 * 60 * 60 * 1000
+			arr.push(this.getDateObj(new Date(parseInt(k))).fullDate)
+		}
+		return arr
+	}
+
+	/**
+	 *  鑾峰彇澶氶�夌姸鎬�
+	 */
+	setMultiple(fullDate) {
+		if (!this.range) return
+
+		let {
+			before,
+			after
+		} = this.multipleStatus
+		if (before && after) {
+			if (!this.lastHover) {
+				this.lastHover = true
+				return
+			}
+			this.multipleStatus.before = fullDate
+			this.multipleStatus.after = ''
+			this.multipleStatus.data = []
+			this.multipleStatus.fulldate = ''
+			this.lastHover = false
+		} else {
+			if (!before) {
+				this.multipleStatus.before = fullDate
+				this.multipleStatus.after = undefined;
+				this.lastHover = false
+			} else {
+				this.multipleStatus.after = fullDate
+				if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus
+						.after);
+				} else {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus
+						.before);
+				}
+				this.lastHover = true
+			}
+		}
+		this.getWeeks(fullDate)
+	}
+
+	/**
+	 *  榧犳爣 hover 鏇存柊澶氶�夌姸鎬�
+	 */
+	setHoverMultiple(fullDate) {
+		//鎶栭煶灏忕▼搴忕偣鍑讳細瑙﹀彂hover浜嬩欢锛岄渶瑕侀伩鍏嶄竴涓�
+		// #ifndef MP-TOUTIAO
+		if (!this.range || this.lastHover) return
+		const {
+			before
+		} = this.multipleStatus
+
+		if (!before) {
+			this.multipleStatus.before = fullDate
+		} else {
+			this.multipleStatus.after = fullDate
+			if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+				this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+			} else {
+				this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+			}
+		}
+		this.getWeeks(fullDate)
+		// #endif
+
+	}
+
+	/**
+	 * 鏇存柊榛樿鍊煎閫夌姸鎬�
+	 */
+	setDefaultMultiple(before, after) {
+		this.multipleStatus.before = before
+		this.multipleStatus.after = after
+		if (before && after) {
+			if (dateCompare(before, after)) {
+				this.multipleStatus.data = this.geDateAll(before, after);
+				this.getWeeks(after)
+			} else {
+				this.multipleStatus.data = this.geDateAll(after, before);
+				this.getWeeks(before)
+			}
+		}
+	}
+
+	/**
+	 * 鑾峰彇姣忓懆鏁版嵁
+	 * @param {Object} dateData
+	 */
+	getWeeks(dateData) {
+		const {
+			year,
+			month,
+		} = this.getDateObj(dateData)
+
+		const preMonthDayAmount = new Date(year, month - 1, 1).getDay()
+		const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData))
+
+		const currentMonthDayAmount = new Date(year, month, 0).getDate()
+		const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData))
+
+		const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount
+		const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData))
+
+		const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays]
+
+		const weeks = new Array(6)
+		for (let i = 0; i < calendarDays.length; i++) {
+			const index = Math.floor(i / 7)
+			if (!weeks[index]) {
+				weeks[index] = new Array(7)
+			}
+			weeks[index][i % 7] = calendarDays[i]
+		}
+
+		this.calendar = calendarDays
+		this.weeks = weeks
+	}
+}
+
+function getDateTime(date, hideSecond) {
+	return `${getDate(date)} ${getTime(date, hideSecond)}`
+}
+
+function getDate(date) {
+	date = fixIosDateFormat(date)
+	date = new Date(date)
+	const year = date.getFullYear()
+	const month = date.getMonth() + 1
+	const day = date.getDate()
+	return `${year}-${addZero(month)}-${addZero(day)}`
+}
+
+function getTime(date, hideSecond) {
+	date = fixIosDateFormat(date)
+	date = new Date(date)
+	const hour = date.getHours()
+	const minute = date.getMinutes()
+	const second = date.getSeconds()
+	return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}`
+}
+
+function addZero(num) {
+	if (num < 10) {
+		num = `0${num}`
+	}
+	return num
+}
+
+function getDefaultSecond(hideSecond) {
+	return hideSecond ? '00:00' : '00:00:00'
+}
+
+function dateCompare(startDate, endDate) {
+	startDate = new Date(fixIosDateFormat(startDate))
+	endDate = new Date(fixIosDateFormat(endDate))
+	return startDate <= endDate
+}
+
+function checkDate(date) {
+	const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g
+	return date.match(dateReg)
+}
+//ios浣庣増鏈�15鍙婁互涓嬶紝鏃犳硶鍖归厤 娌℃湁 鈥欑鈥� 鏃剁殑鎯呭喌锛屾墍浠ラ渶瑕佸湪鏈熬 绉� 鍔犱笂 闂彿
+const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9](:[0-5]?[0-9])?)?$/;
+
+function fixIosDateFormat(value) {
+	if (typeof value === 'string' && dateTimeReg.test(value)) {
+		value = value.replace(/-/g, '/')
+	}
+	return value
+}
+
+export {
+	Calendar,
+	getDateTime,
+	getDate,
+	getTime,
+	addZero,
+	getDefaultSecond,
+	dateCompare,
+	checkDate,
+	fixIosDateFormat
+}
diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json
new file mode 100644
index 0000000..4d1b05c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/package.json
@@ -0,0 +1,88 @@
+{
+  "id": "uni-datetime-picker",
+  "displayName": "uni-datetime-picker 鏃ユ湡閫夋嫨鍣�",
+  "version": "2.2.34",
+  "description": "uni-datetime-picker 鏃ユ湡鏃堕棿閫夋嫨鍣紝鏀寔鏃ュ巻锛屾敮鎸佽寖鍥撮�夋嫨",
+  "keywords": [
+    "uni-datetime-picker",
+    "uni-ui",
+    "uniui",
+    "鏃ユ湡鏃堕棿閫夋嫨鍣�",
+    "鏃ユ湡鏃堕棿"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "n"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md
new file mode 100644
index 0000000..162fbef
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/readme.md
@@ -0,0 +1,21 @@
+
+
+> `閲嶈閫氱煡锛氱粍浠跺崌绾ф洿鏂� 2.0.0 鍚庯紝鏀寔鏃ユ湡+鏃堕棿鑼冨洿閫夋嫨锛岀粍浠� ui 灏嗕娇鐢ㄦ棩鍘嗛�夋嫨鏃ユ湡锛寀i 鍙樺寲杈冨ぇ锛屽悓鏃舵敮鎸� PC 鍜� 绉诲姩绔�傛鐗堟湰涓嶅悜鍚庡吋瀹癸紝涓嶅啀鏀寔鍗曠嫭鐨勬椂闂撮�夋嫨锛坱ype=time锛夊強鐩稿叧鐨� hide-second 灞炴�э紙鏃堕棿閫夊彲浣跨敤鍐呯疆缁勪欢 picker锛夈�傝嫢浠嶉渶浣跨敤鏃х増鏈紝鍙湪鎻掍欢甯傚満涓嬭浇*闈瀠ni_modules鐗堟湰*锛屾棫鐗堟湰灏嗕笉鍐嶇淮鎶
+
+## DatetimePicker 鏃堕棿閫夋嫨鍣�
+
+> **缁勪欢鍚嶏細uni-datetime-picker**
+> 浠g爜鍧楋細 `uDatetimePicker`
+
+
+璇ョ粍浠剁殑浼樺娍鏄紝鏀寔**鏃堕棿鎴�**杈撳叆鍜岃緭鍑猴紙璧峰鏃堕棿銆佺粓姝㈡椂闂翠篃鏀寔鏃堕棿鎴筹級锛屽彲**鍚屾椂閫夋嫨**鏃ユ湡鍜屾椂闂淬��
+
+鑻ュ彧鏄渶瑕佸崟鐙�夋嫨鏃ユ湡鍜屾椂闂达紝涓嶉渶瑕佹椂闂存埑杈撳叆鍜岃緭鍑猴紝鍙娇鐢ㄥ師鐢熺殑 picker 缁勪欢銆�
+
+**_鐐瑰嚮 picker 榛樿鍊艰鍒欙細_**
+
+- 鑻ヨ缃垵濮嬪�� value, 浼氭樉绀哄湪 picker 鏄剧ず妗嗕腑
+- 鑻ユ棤鍒濆鍊� value锛屽垯鍒濆鍊� value 涓哄綋鍓嶆湰鍦版椂闂� Date.now()锛� 浣嗕笉浼氭樉绀哄湪 picker 鏄剧ず妗嗕腑
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
\ No newline at end of file
diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md
new file mode 100644
index 0000000..9bd4729
--- /dev/null
+++ b/uni_modules/uni-fab/changelog.md
@@ -0,0 +1,23 @@
+## 1.2.5锛�2023-03-29锛�
+- 鏂板 pattern.icon 灞炴�э紝鍙嚜瀹氫箟鍥炬爣
+## 1.2.4锛�2022-09-07锛�
+灏忕▼搴忕鐢变簬 style 浣跨敤浜嗗璞″鑷存姤閿欙紝[璇︽儏](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false)
+## 1.2.3锛�2022-09-05锛�
+- 淇 nvue 鐜涓嬶紝鍏锋湁 tabBar 鏃讹紝fab 缁勪欢涓嬮儴浣嶇疆鏃犳硶姝e父鑾峰彇 --window-bottom 鐨刡ug锛岃瑙侊細[https://ask.dcloud.net.cn/question/110638?notification_id=826310](https://ask.dcloud.net.cn/question/110638?notification_id=826310)
+## 1.2.2锛�2021-12-29锛�
+- 鏇存柊 缁勪欢渚濊禆
+## 1.2.1锛�2021-11-19锛�
+- 淇 闃村奖棰滆壊涓嶆纭殑bug
+## 1.2.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-fab](https://uniapp.dcloud.io/component/uniui/uni-fab)
+## 1.1.1锛�2021-11-09锛� 
+- 鏂板 鎻愪緵缁勪欢璁捐璧勬簮锛岀粍浠舵牱寮忚皟鏁�
+## 1.1.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.0.7锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.0.6锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
+- 浼樺寲 鎸夐挳鑳屾櫙鑹茶皟鏁�
+- 浼樺寲 鍏煎pc绔�
diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue
new file mode 100644
index 0000000..dfa65c1
--- /dev/null
+++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue
@@ -0,0 +1,491 @@
+<template>
+	<view class="uni-cursor-point">
+		<view v-if="popMenu && (leftBottom||rightBottom||leftTop||rightTop) && content.length > 0" :class="{
+        'uni-fab--leftBottom': leftBottom,
+        'uni-fab--rightBottom': rightBottom,
+        'uni-fab--leftTop': leftTop,
+        'uni-fab--rightTop': rightTop
+      }" class="uni-fab"
+				:style="nvueBottom"
+			>
+			<view :class="{
+          'uni-fab__content--left': horizontal === 'left',
+          'uni-fab__content--right': horizontal === 'right',
+          'uni-fab__content--flexDirection': direction === 'vertical',
+          'uni-fab__content--flexDirectionStart': flexDirectionStart,
+          'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
+		  'uni-fab__content--other-platform': !isAndroidNvue
+        }" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }"
+				class="uni-fab__content" elevation="5">
+				<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
+				<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }"
+					class="uni-fab__item" @click="_onItemClick(index, item)">
+					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image"
+						mode="aspectFit" />
+					<text class="uni-fab__item-text"
+						:style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
+				</view>
+				<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
+			</view>
+		</view>
+		<view :class="{
+		  'uni-fab__circle--leftBottom': leftBottom,
+		  'uni-fab__circle--rightBottom': rightBottom,
+		  'uni-fab__circle--leftTop': leftTop,
+		  'uni-fab__circle--rightTop': rightTop,
+		  'uni-fab__content--other-platform': !isAndroidNvue
+		}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor, 'bottom': nvueBottom }" @click="_onClick">
+			<uni-icons class="fab-circle-icon" :type="styles.icon" :color="styles.iconColor" size="32"
+				:class="{'uni-fab__plus--active': isShow && content.length > 0}"></uni-icons>
+			<!-- <view class="fab-circle-v"  :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
+			<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow  && content.length > 0}"></view> -->
+		</view>
+	</view>
+</template>
+
+<script>
+	let platform = 'other'
+	// #ifdef APP-NVUE
+	platform = uni.getSystemInfoSync().platform
+	// #endif
+
+	/**
+	 * Fab 鎮诞鎸夐挳
+	 * @description 鐐瑰嚮鍙睍寮�涓�涓浘褰㈡寜閽彍鍗�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=144
+	 * @property {Object} pattern 鍙�夋牱寮忛厤缃」
+	 * @property {Object} horizontal = [left | right] 姘村钩瀵归綈鏂瑰紡
+	 * 	@value left 宸﹀榻�
+	 * 	@value right 鍙冲榻�
+	 * @property {Object} vertical = [bottom | top] 鍨傜洿瀵归綈鏂瑰紡
+	 * 	@value bottom 涓嬪榻�
+	 * 	@value top 涓婂榻�
+	 * @property {Object} direction = [horizontal | vertical] 灞曞紑鑿滃崟鏄剧ず鏂瑰紡
+	 * 	@value horizontal 姘村钩鏄剧ず
+	 * 	@value vertical 鍨傜洿鏄剧ず
+	 * @property {Array} content 灞曞紑鑿滃崟鍐呭閰嶇疆椤�
+	 * @property {Boolean} popMenu 鏄惁浣跨敤寮瑰嚭鑿滃崟
+	 * @event {Function} trigger 灞曞紑鑿滃崟鐐瑰嚮浜嬩欢锛岃繑鍥炵偣鍑讳俊鎭�
+	 * @event {Function} fabClick 鎮诞鎸夐挳鐐瑰嚮浜嬩欢
+	 */
+	export default {
+		name: 'UniFab',
+		emits: ['fabClick', 'trigger'],
+		props: {
+			pattern: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			horizontal: {
+				type: String,
+				default: 'left'
+			},
+			vertical: {
+				type: String,
+				default: 'bottom'
+			},
+			direction: {
+				type: String,
+				default: 'horizontal'
+			},
+			content: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			show: {
+				type: Boolean,
+				default: false
+			},
+			popMenu: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				fabShow: false,
+				isShow: false,
+				isAndroidNvue: platform === 'android',
+				styles: {
+					color: '#3c3e49',
+					selectedColor: '#007AFF',
+					backgroundColor: '#fff',
+					buttonColor: '#007AFF',
+					iconColor: '#fff',
+					icon: 'plusempty'
+				}
+			}
+		},
+		computed: {
+			contentWidth(e) {
+				return (this.content.length + 1) * 55 + 15 + 'px'
+			},
+			contentWidthMin() {
+				return '55px'
+			},
+			// 鍔ㄦ�佽绠楀搴�
+			boxWidth() {
+				return this.getPosition(3, 'horizontal')
+			},
+			// 鍔ㄦ�佽绠楅珮搴�
+			boxHeight() {
+				return this.getPosition(3, 'vertical')
+			},
+			// 璁$畻宸︿笅浣嶇疆
+			leftBottom() {
+				return this.getPosition(0, 'left', 'bottom')
+			},
+			// 璁$畻鍙充笅浣嶇疆
+			rightBottom() {
+				return this.getPosition(0, 'right', 'bottom')
+			},
+			// 璁$畻宸︿笂浣嶇疆
+			leftTop() {
+				return this.getPosition(0, 'left', 'top')
+			},
+			rightTop() {
+				return this.getPosition(0, 'right', 'top')
+			},
+			flexDirectionStart() {
+				return this.getPosition(1, 'vertical', 'top')
+			},
+			flexDirectionEnd() {
+				return this.getPosition(1, 'vertical', 'bottom')
+			},
+			horizontalLeft() {
+				return this.getPosition(2, 'horizontal', 'left')
+			},
+			horizontalRight() {
+				return this.getPosition(2, 'horizontal', 'right')
+			},
+			// 璁$畻 nvue bottom
+			nvueBottom() {
+				const safeBottom = uni.getSystemInfoSync().windowBottom;
+				// #ifdef APP-NVUE
+				return 30 + safeBottom
+				// #endif
+				// #ifndef APP-NVUE
+				return 30
+				// #endif
+			}
+		},
+		watch: {
+			pattern: {
+				handler(val, oldVal) {
+					this.styles = Object.assign({}, this.styles, val)
+				},
+				deep: true
+			}
+		},
+		created() {
+			this.isShow = this.show
+			if (this.top === 0) {
+				this.fabShow = true
+			}
+			// 鍒濆鍖栨牱寮�
+			this.styles = Object.assign({}, this.styles, this.pattern)
+		},
+		methods: {
+			_onClick() {
+				this.$emit('fabClick')
+				if (!this.popMenu) {
+					return
+				}
+				this.isShow = !this.isShow
+			},
+			open() {
+				this.isShow = true
+			},
+			close() {
+				this.isShow = false
+			},
+			/**
+			 * 鎸夐挳鐐瑰嚮浜嬩欢
+			 */
+			_onItemClick(index, item) {
+				if (!this.isShow) {
+					return
+				}
+				this.$emit('trigger', {
+					index,
+					item
+				})
+			},
+			/**
+			 * 鑾峰彇 浣嶇疆淇℃伅
+			 */
+			getPosition(types, paramA, paramB) {
+				if (types === 0) {
+					return this.horizontal === paramA && this.vertical === paramB
+				} else if (types === 1) {
+					return this.direction === paramA && this.vertical === paramB
+				} else if (types === 2) {
+					return this.direction === paramA && this.horizontal === paramB
+				} else {
+					return this.isShow && this.direction === paramA ? this.contentWidth : this.contentWidthMin
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	$uni-shadow-base:0 1px 5px 2px rgba($color: #000000, $alpha: 0.3) !default;
+
+	.uni-fab {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		z-index: 10;
+		border-radius: 45px;
+		box-shadow: $uni-shadow-base;
+	}
+
+	.uni-cursor-point {
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-fab--active {
+		opacity: 1;
+	}
+
+	.uni-fab--leftBottom {
+		left: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		left: calc(15px + var(--window-left));
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+		// padding: 10px;
+	}
+
+	.uni-fab--leftTop {
+		left: 15px;
+		top: 30px;
+		/* #ifdef H5 */
+		left: calc(15px + var(--window-left));
+		top: calc(30px + var(--window-top));
+		/* #endif */
+		// padding: 10px;
+	}
+
+	.uni-fab--rightBottom {
+		right: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		right: calc(15px + var(--window-right));
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+		// padding: 10px;
+	}
+
+	.uni-fab--rightTop {
+		right: 15px;
+		top: 30px;
+		/* #ifdef H5 */
+		right: calc(15px + var(--window-right));
+		top: calc(30px + var(--window-top));
+		/* #endif */
+		// padding: 10px;
+	}
+
+	.uni-fab__circle {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		width: 55px;
+		height: 55px;
+		background-color: #3c3e49;
+		border-radius: 45px;
+		z-index: 11;
+		// box-shadow: $uni-shadow-base;
+	}
+
+	.uni-fab__circle--leftBottom {
+		left: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		left: calc(15px + var(--window-left));
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--leftTop {
+		left: 15px;
+		top: 30px;
+		/* #ifdef H5 */
+		left: calc(15px + var(--window-left));
+		top: calc(30px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightBottom {
+		right: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		right: calc(15px + var(--window-right));
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightTop {
+		right: 15px;
+		top: 30px;
+		/* #ifdef H5 */
+		right: calc(15px + var(--window-right));
+		top: calc(30px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--left {
+		left: 0;
+	}
+
+	.uni-fab__circle--right {
+		right: 0;
+	}
+
+	.uni-fab__circle--top {
+		top: 0;
+	}
+
+	.uni-fab__circle--bottom {
+		bottom: 0;
+	}
+
+	.uni-fab__plus {
+		font-weight: bold;
+	}
+
+	// .fab-circle-v {
+	// 	position: absolute;
+	// 	width: 2px;
+	// 	height: 24px;
+	// 	left: 0;
+	// 	top: 0;
+	// 	right: 0;
+	// 	bottom: 0;
+	// 	/* #ifndef APP-NVUE */
+	// 	margin: auto;
+	// 	/* #endif */
+	// 	background-color: white;
+	// 	transform: rotate(0deg);
+	// 	transition: transform 0.3s;
+	// }
+
+	// .fab-circle-h {
+	// 	position: absolute;
+	// 	width: 24px;
+	// 	height: 2px;
+	// 	left: 0;
+	// 	top: 0;
+	// 	right: 0;
+	// 	bottom: 0;
+	// 	/* #ifndef APP-NVUE */
+	// 	margin: auto;
+	// 	/* #endif */
+	// 	background-color: white;
+	// 	transform: rotate(0deg);
+	// 	transition: transform 0.3s;
+	// }
+
+	.fab-circle-icon {
+		transform: rotate(0deg);
+		transition: transform 0.3s;
+		font-weight: 200;
+	}
+
+	.uni-fab__plus--active {
+		transform: rotate(135deg);
+	}
+
+	.uni-fab__content {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		border-radius: 55px;
+		overflow: hidden;
+		transition-property: width, height;
+		transition-duration: 0.2s;
+		width: 55px;
+		border-color: #DDDDDD;
+		border-width: 1rpx;
+		border-style: solid;
+	}
+
+	.uni-fab__content--other-platform {
+		border-width: 0px;
+		box-shadow: $uni-shadow-base;
+	}
+
+	.uni-fab__content--left {
+		justify-content: flex-start;
+	}
+
+	.uni-fab__content--right {
+		justify-content: flex-end;
+	}
+
+	.uni-fab__content--flexDirection {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.uni-fab__content--flexDirectionStart {
+		flex-direction: column;
+		justify-content: flex-start;
+	}
+
+	.uni-fab__content--flexDirectionEnd {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.uni-fab__item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 55px;
+		height: 55px;
+		opacity: 0;
+		transition: opacity 0.2s;
+	}
+
+	.uni-fab__item--active {
+		opacity: 1;
+	}
+
+	.uni-fab__item-image {
+		width: 20px;
+		height: 20px;
+		margin-bottom: 4px;
+	}
+
+	.uni-fab__item-text {
+		color: #FFFFFF;
+		font-size: 12px;
+		line-height: 12px;
+		margin-top: 2px;
+	}
+
+	.uni-fab__item--first {
+		width: 55px;
+	}
+</style>
diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json
new file mode 100644
index 0000000..18c0810
--- /dev/null
+++ b/uni_modules/uni-fab/package.json
@@ -0,0 +1,84 @@
+{
+  "id": "uni-fab",
+  "displayName": "uni-fab 鎮诞鎸夐挳",
+  "version": "1.2.5",
+  "description": "鎮诞鎸夐挳 fab button 锛岀偣鍑诲彲灞曞紑涓�涓浘鏍囨寜閽彍鍗曘��",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "鎸夐挳",
+    "鎮诞鎸夐挳",
+    "fab"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss","uni-icons"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-fab/readme.md b/uni_modules/uni-fab/readme.md
new file mode 100644
index 0000000..9a444e8
--- /dev/null
+++ b/uni_modules/uni-fab/readme.md
@@ -0,0 +1,9 @@
+## Fab 鎮诞鎸夐挳
+> **缁勪欢鍚嶏細uni-fab**
+> 浠g爜鍧楋細 `uFab`
+
+
+鐐瑰嚮鍙睍寮�涓�涓浘褰㈡寜閽彍鍗�
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-fab)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
\ No newline at end of file
diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md
new file mode 100644
index 0000000..620ab02
--- /dev/null
+++ b/uni_modules/uni-icons/changelog.md
@@ -0,0 +1,40 @@
+## 2.0.9锛�2024-01-12锛�
+fix: 淇鍥炬爣澶у皬榛樿鍊奸敊璇殑闂
+## 2.0.8锛�2023-12-14锛�
+- 淇 椤圭洰鏈娇鐢� ts 鎯呭喌涓嬶紝鎵撳寘鎶ラ敊鐨刡ug
+## 2.0.7锛�2023-12-14锛�
+- 淇 size 灞炴�т负 string 鏃讹紝涓嶅姞鍗曚綅瀵艰嚧灏哄寮傚父鐨刡ug
+## 2.0.6锛�2023-12-11锛�
+- 浼樺寲 鍏煎鑰佺増鏈琲con绫诲瀷锛屽 top 锛宐ottom 绛�
+## 2.0.5锛�2023-12-11锛�
+- 浼樺寲 鍏煎鑰佺増鏈琲con绫诲瀷锛屽 top 锛宐ottom 绛�
+## 2.0.4锛�2023-12-06锛�
+- 浼樺寲 uni-app x 涓嬬ず渚嬮」鐩浘鏍囨帓搴�
+## 2.0.3锛�2023-12-06锛�
+- 淇 nvue涓嬪紩鍏ョ粍浠舵姤閿欑殑bug
+## 2.0.2锛�2023-12-05锛�
+-浼樺寲 size 灞炴�ф敮鎸佸崟浣�
+## 2.0.1锛�2023-12-05锛�
+- 鏂板 uni-app x 鏀寔瀹氫箟鍥炬爣
+## 1.3.5锛�2022-01-24锛�
+- 浼樺寲 size 灞炴�у彲浠ヤ紶鍏ヤ笉甯﹀崟浣嶇殑瀛楃涓叉暟鍊�
+## 1.3.4锛�2022-01-24锛�
+- 浼樺寲 size 鏀寔鍏朵粬鍗曚綅
+## 1.3.3锛�2022-01-17锛�
+- 淇 nvue 鏈変簺鍥炬爣涓嶆樉绀虹殑bug锛屽吋瀹硅�佺増鏈浘鏍�
+## 1.3.2锛�2021-12-01锛�
+- 浼樺寲 绀轰緥鍙鍒跺浘鏍囧悕绉�
+## 1.3.1锛�2021-11-23锛�
+- 浼樺寲 鍏煎鏃х粍浠� type 鍊�
+## 1.3.0锛�2021-11-19锛�
+- 鏂板 鏇村鍥炬爣
+- 浼樺寲 鑷畾涔夊浘鏍囦娇鐢ㄦ柟寮�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7锛�2021-11-08锛�
+## 1.2.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.1.5锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.1.4锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
new file mode 100644
index 0000000..398678e
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue
@@ -0,0 +1,91 @@
+<template>
+	<text class="uni-icons" :style="styleObj">
+		<slot>{{unicode}}</slot>
+	</text>
+</template>
+
+<script>
+	import { fontData, IconsDataItem } from './uniicons_file'
+
+	/**
+	 * Icons 鍥炬爣
+	 * @description 鐢ㄤ簬灞曠ず icon 鍥炬爣
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
+	 * @property {Number} size 鍥炬爣澶у皬
+	 * @property {String} type 鍥炬爣鍥炬锛屽弬鑰冪ず渚�
+	 * @property {String} color 鍥炬爣棰滆壊
+	 * @property {String} customPrefix 鑷畾涔夊浘鏍�
+	 * @event {Function} click 鐐瑰嚮 Icon 瑙﹀彂浜嬩欢
+	 */
+	export default {
+		name: "uni-icons",
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: Object,
+				default: 16
+			},
+			fontFamily: {
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {};
+		},
+		computed: {
+			unicode() : string {
+				let codes = fontData.find((item : IconsDataItem) : boolean => { return item.font_class == this.type })
+				if (codes !== null) {
+					return codes.unicode
+				}
+				return ''
+			},
+			iconSize() : string {
+				const size = this.size
+				if (typeof size == 'string') {
+					const reg = /^[0-9]*$/g
+					return reg.test(size as string) ? '' + size + 'px' : '' + size;
+					// return '' + this.size
+				}
+				return this.getFontSize(size as number)
+			},
+			styleObj() : UTSJSONObject {
+				if (this.fontFamily !== '') {
+					return { color: this.color, fontSize: this.iconSize, fontFamily: this.fontFamily }
+				}
+				return { color: this.color, fontSize: this.iconSize }
+			}
+		},
+		created() { },
+		methods: {
+			/**
+			 * 瀛椾綋澶у皬
+			 */
+			getFontSize(size : number) : string {
+				return size + 'px';
+			},
+		},
+	}
+</script>
+
+<style scoped>
+	@font-face {
+		font-family: UniIconsFontFamily;
+		src: url('./uniicons.ttf');
+	}
+
+	.uni-icons {
+		font-family: UniIconsFontFamily;
+		font-size: 18px;
+		font-style: normal;
+		color: #333;
+	}
+</style>
diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
new file mode 100644
index 0000000..7da5356
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
@@ -0,0 +1,110 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<text :style="styleObj" class="uni-icons" @click="_onClick">{{unicode}}</text>
+	<!-- #endif -->
+	<!-- #ifndef APP-NVUE -->
+	<text :style="styleObj" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick">
+		<slot></slot>
+	</text>
+	<!-- #endif -->
+</template>
+
+<script>
+	import { fontData } from './uniicons_file_vue.js';
+
+	const getVal = (val) => {
+		const reg = /^[0-9]*$/g
+		return (typeof val === 'number' || reg.test(val)) ? val + 'px' : val;
+	}
+
+	// #ifdef APP-NVUE
+	var domModule = weex.requireModule('dom');
+	import iconUrl from './uniicons.ttf'
+	domModule.addRule('fontFace', {
+		'fontFamily': "uniicons",
+		'src': "url('" + iconUrl + "')"
+	});
+	// #endif
+
+	/**
+	 * Icons 鍥炬爣
+	 * @description 鐢ㄤ簬灞曠ず icons 鍥炬爣
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
+	 * @property {Number} size 鍥炬爣澶у皬
+	 * @property {String} type 鍥炬爣鍥炬锛屽弬鑰冪ず渚�
+	 * @property {String} color 鍥炬爣棰滆壊
+	 * @property {String} customPrefix 鑷畾涔夊浘鏍�
+	 * @event {Function} click 鐐瑰嚮 Icon 瑙﹀彂浜嬩欢
+	 */
+	export default {
+		name: 'UniIcons',
+		emits: ['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: [Number, String],
+				default: 16
+			},
+			customPrefix: {
+				type: String,
+				default: ''
+			},
+			fontFamily: {
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				icons: fontData
+			}
+		},
+		computed: {
+			unicode() {
+				let code = this.icons.find(v => v.font_class === this.type)
+				if (code) {
+					return code.unicode
+				}
+				return ''
+			},
+			iconSize() {
+				return getVal(this.size)
+			},
+			styleObj() {
+				if (this.fontFamily !== '') {
+					return `color: ${this.color}; font-size: ${this.iconSize}; font-family: ${this.fontFamily};`
+				}
+				return `color: ${this.color}; font-size: ${this.iconSize};`
+			}
+		},
+		methods: {
+			_onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* #ifndef APP-NVUE */
+	@import './uniicons.css';
+
+	@font-face {
+		font-family: uniicons;
+		src: url('./uniicons.ttf');
+	}
+
+	/* #endif */
+	.uni-icons {
+		font-family: uniicons;
+		text-decoration: none;
+		text-align: center;
+	}
+</style>
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css
new file mode 100644
index 0000000..0a6b6fe
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css
@@ -0,0 +1,664 @@
+
+.uniui-cart-filled:before {
+  content: "\e6d0";
+}
+
+.uniui-gift-filled:before {
+  content: "\e6c4";
+}
+
+.uniui-color:before {
+  content: "\e6cf";
+}
+
+.uniui-wallet:before {
+  content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+  content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+  content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+  content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+  content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+  content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+  content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+  content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+  content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+  content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+  content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+  content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+  content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+  content: "\e6c3";
+}
+
+.uniui-fire-filled:before {
+  content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+  content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+  content: "\e6af";
+}
+
+.uniui-person-filled:before {
+  content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+  content: "\e698";
+}
+
+.uniui-arrowthinleft:before {
+  content: "\e6d2";
+}
+
+.uniui-arrowthinup:before {
+  content: "\e6d3";
+}
+
+.uniui-arrowthindown:before {
+  content: "\e6d4";
+}
+
+.uniui-back:before {
+  content: "\e6b9";
+}
+
+.uniui-forward:before {
+  content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+  content: "\e6bb";
+}
+
+.uniui-arrow-left:before {
+  content: "\e6bc";
+}
+
+.uniui-arrow-up:before {
+  content: "\e6bd";
+}
+
+.uniui-arrow-down:before {
+  content: "\e6be";
+}
+
+.uniui-arrowthinright:before {
+  content: "\e6d1";
+}
+
+.uniui-down:before {
+  content: "\e6b8";
+}
+
+.uniui-bottom:before {
+  content: "\e6b8";
+}
+
+.uniui-arrowright:before {
+  content: "\e6d5";
+}
+
+.uniui-right:before {
+  content: "\e6b5";
+}
+
+.uniui-up:before {
+  content: "\e6b6";
+}
+
+.uniui-top:before {
+  content: "\e6b6";
+}
+
+.uniui-left:before {
+  content: "\e6b7";
+}
+
+.uniui-arrowup:before {
+  content: "\e6d6";
+}
+
+.uniui-eye:before {
+  content: "\e651";
+}
+
+.uniui-eye-filled:before {
+  content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+  content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+  content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+  content: "\e649";
+}
+
+.uniui-reload:before {
+  content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+  content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+  content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+  content: "\e6ad";
+}
+
+.uniui-location:before {
+  content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+  content: "\e683";
+}
+
+.uniui-star:before {
+  content: "\e688";
+}
+
+.uniui-star-filled:before {
+  content: "\e68f";
+}
+
+.uniui-calendar:before {
+  content: "\e6a0";
+}
+
+.uniui-fire:before {
+  content: "\e6a1";
+}
+
+.uniui-medal:before {
+  content: "\e6a2";
+}
+
+.uniui-font:before {
+  content: "\e6a3";
+}
+
+.uniui-gift:before {
+  content: "\e6a4";
+}
+
+.uniui-link:before {
+  content: "\e6a5";
+}
+
+.uniui-notification:before {
+  content: "\e6a6";
+}
+
+.uniui-staff:before {
+  content: "\e6a7";
+}
+
+.uniui-vip:before {
+  content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+  content: "\e6a9";
+}
+
+.uniui-tune:before {
+  content: "\e6aa";
+}
+
+.uniui-auth:before {
+  content: "\e6ab";
+}
+
+.uniui-person:before {
+  content: "\e699";
+}
+
+.uniui-email-filled:before {
+  content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+  content: "\e69b";
+}
+
+.uniui-phone:before {
+  content: "\e69c";
+}
+
+.uniui-email:before {
+  content: "\e69e";
+}
+
+.uniui-personadd:before {
+  content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+  content: "\e692";
+}
+
+.uniui-contact:before {
+  content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+  content: "\e694";
+}
+
+.uniui-contact-filled:before {
+  content: "\e695";
+}
+
+.uniui-chatboxes:before {
+  content: "\e696";
+}
+
+.uniui-chatbubble:before {
+  content: "\e697";
+}
+
+.uniui-upload-filled:before {
+  content: "\e68e";
+}
+
+.uniui-upload:before {
+  content: "\e690";
+}
+
+.uniui-weixin:before {
+  content: "\e691";
+}
+
+.uniui-compose:before {
+  content: "\e67f";
+}
+
+.uniui-qq:before {
+  content: "\e680";
+}
+
+.uniui-download-filled:before {
+  content: "\e681";
+}
+
+.uniui-pyq:before {
+  content: "\e682";
+}
+
+.uniui-sound:before {
+  content: "\e684";
+}
+
+.uniui-trash-filled:before {
+  content: "\e685";
+}
+
+.uniui-sound-filled:before {
+  content: "\e686";
+}
+
+.uniui-trash:before {
+  content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+  content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+  content: "\e68a";
+}
+
+.uniui-weibo:before {
+  content: "\e68b";
+}
+
+.uniui-videocam:before {
+  content: "\e68c";
+}
+
+.uniui-download:before {
+  content: "\e68d";
+}
+
+.uniui-help:before {
+  content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+  content: "\e67a";
+}
+
+.uniui-plusempty:before {
+  content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+  content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+  content: "\e67d";
+}
+
+.uniui-micoff:before {
+  content: "\e67e";
+}
+
+.uniui-closeempty:before {
+  content: "\e66c";
+}
+
+.uniui-clear:before {
+  content: "\e66d";
+}
+
+.uniui-navigate:before {
+  content: "\e66e";
+}
+
+.uniui-minus:before {
+  content: "\e66f";
+}
+
+.uniui-image:before {
+  content: "\e670";
+}
+
+.uniui-mic:before {
+  content: "\e671";
+}
+
+.uniui-paperplane:before {
+  content: "\e672";
+}
+
+.uniui-close:before {
+  content: "\e673";
+}
+
+.uniui-help-filled:before {
+  content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+  content: "\e675";
+}
+
+.uniui-plus:before {
+  content: "\e676";
+}
+
+.uniui-mic-filled:before {
+  content: "\e677";
+}
+
+.uniui-image-filled:before {
+  content: "\e678";
+}
+
+.uniui-locked-filled:before {
+  content: "\e668";
+}
+
+.uniui-info:before {
+  content: "\e669";
+}
+
+.uniui-locked:before {
+  content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+  content: "\e658";
+}
+
+.uniui-chat-filled:before {
+  content: "\e659";
+}
+
+.uniui-camera:before {
+  content: "\e65a";
+}
+
+.uniui-circle:before {
+  content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+  content: "\e65c";
+}
+
+.uniui-chat:before {
+  content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+  content: "\e65e";
+}
+
+.uniui-flag:before {
+  content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+  content: "\e660";
+}
+
+.uniui-gear-filled:before {
+  content: "\e661";
+}
+
+.uniui-home:before {
+  content: "\e662";
+}
+
+.uniui-home-filled:before {
+  content: "\e663";
+}
+
+.uniui-gear:before {
+  content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+  content: "\e665";
+}
+
+.uniui-map-filled:before {
+  content: "\e666";
+}
+
+.uniui-map:before {
+  content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+  content: "\e656";
+}
+
+.uniui-refresh:before {
+  content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+  content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+  content: "\e646";
+}
+
+.uniui-cloud-download:before {
+  content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+  content: "\e648";
+}
+
+.uniui-redo:before {
+  content: "\e64a";
+}
+
+.uniui-images-filled:before {
+  content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+  content: "\e64c";
+}
+
+.uniui-more:before {
+  content: "\e64d";
+}
+
+.uniui-more-filled:before {
+  content: "\e64e";
+}
+
+.uniui-undo:before {
+  content: "\e64f";
+}
+
+.uniui-images:before {
+  content: "\e650";
+}
+
+.uniui-paperclip:before {
+  content: "\e652";
+}
+
+.uniui-settings:before {
+  content: "\e653";
+}
+
+.uniui-search:before {
+  content: "\e654";
+}
+
+.uniui-redo-filled:before {
+  content: "\e655";
+}
+
+.uniui-list:before {
+  content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+  content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+  content: "\e63c";
+}
+
+.uniui-hand-down:before {
+  content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+  content: "\e63e";
+}
+
+.uniui-hand-up:before {
+  content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+  content: "\e641";
+}
+
+.uniui-mail-open:before {
+  content: "\e643";
+}
+
+.uniui-heart:before {
+  content: "\e639";
+}
+
+.uniui-loop:before {
+  content: "\e633";
+}
+
+.uniui-pulldown:before {
+  content: "\e632";
+}
+
+.uniui-scan:before {
+  content: "\e62a";
+}
+
+.uniui-bars:before {
+  content: "\e627";
+}
+
+.uniui-checkbox:before {
+  content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+  content: "\e62c";
+}
+
+.uniui-shop:before {
+  content: "\e62f";
+}
+
+.uniui-headphones:before {
+  content: "\e630";
+}
+
+.uniui-cart:before {
+  content: "\e631";
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
new file mode 100644
index 0000000..14696d0
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
Binary files differ
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
new file mode 100644
index 0000000..98e93aa
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts
@@ -0,0 +1,664 @@
+
+export type IconsData = {
+	id : string
+	name : string
+	font_family : string
+	css_prefix_text : string
+	description : string
+	glyphs : Array<IconsDataItem>
+}
+
+export type IconsDataItem = {
+	font_class : string
+	unicode : string
+}
+
+
+export const fontData = [
+  {
+    "font_class": "arrow-down",
+    "unicode": "\ue6be"
+  },
+  {
+    "font_class": "arrow-left",
+    "unicode": "\ue6bc"
+  },
+  {
+    "font_class": "arrow-right",
+    "unicode": "\ue6bb"
+  },
+  {
+    "font_class": "arrow-up",
+    "unicode": "\ue6bd"
+  },
+  {
+    "font_class": "auth",
+    "unicode": "\ue6ab"
+  },
+  {
+    "font_class": "auth-filled",
+    "unicode": "\ue6cc"
+  },
+  {
+    "font_class": "back",
+    "unicode": "\ue6b9"
+  },
+  {
+    "font_class": "bars",
+    "unicode": "\ue627"
+  },
+  {
+    "font_class": "calendar",
+    "unicode": "\ue6a0"
+  },
+  {
+    "font_class": "calendar-filled",
+    "unicode": "\ue6c0"
+  },
+  {
+    "font_class": "camera",
+    "unicode": "\ue65a"
+  },
+  {
+    "font_class": "camera-filled",
+    "unicode": "\ue658"
+  },
+  {
+    "font_class": "cart",
+    "unicode": "\ue631"
+  },
+  {
+    "font_class": "cart-filled",
+    "unicode": "\ue6d0"
+  },
+  {
+    "font_class": "chat",
+    "unicode": "\ue65d"
+  },
+  {
+    "font_class": "chat-filled",
+    "unicode": "\ue659"
+  },
+  {
+    "font_class": "chatboxes",
+    "unicode": "\ue696"
+  },
+  {
+    "font_class": "chatboxes-filled",
+    "unicode": "\ue692"
+  },
+  {
+    "font_class": "chatbubble",
+    "unicode": "\ue697"
+  },
+  {
+    "font_class": "chatbubble-filled",
+    "unicode": "\ue694"
+  },
+  {
+    "font_class": "checkbox",
+    "unicode": "\ue62b"
+  },
+  {
+    "font_class": "checkbox-filled",
+    "unicode": "\ue62c"
+  },
+  {
+    "font_class": "checkmarkempty",
+    "unicode": "\ue65c"
+  },
+  {
+    "font_class": "circle",
+    "unicode": "\ue65b"
+  },
+  {
+    "font_class": "circle-filled",
+    "unicode": "\ue65e"
+  },
+  {
+    "font_class": "clear",
+    "unicode": "\ue66d"
+  },
+  {
+    "font_class": "close",
+    "unicode": "\ue673"
+  },
+  {
+    "font_class": "closeempty",
+    "unicode": "\ue66c"
+  },
+  {
+    "font_class": "cloud-download",
+    "unicode": "\ue647"
+  },
+  {
+    "font_class": "cloud-download-filled",
+    "unicode": "\ue646"
+  },
+  {
+    "font_class": "cloud-upload",
+    "unicode": "\ue645"
+  },
+  {
+    "font_class": "cloud-upload-filled",
+    "unicode": "\ue648"
+  },
+  {
+    "font_class": "color",
+    "unicode": "\ue6cf"
+  },
+  {
+    "font_class": "color-filled",
+    "unicode": "\ue6c9"
+  },
+  {
+    "font_class": "compose",
+    "unicode": "\ue67f"
+  },
+  {
+    "font_class": "contact",
+    "unicode": "\ue693"
+  },
+  {
+    "font_class": "contact-filled",
+    "unicode": "\ue695"
+  },
+  {
+    "font_class": "down",
+    "unicode": "\ue6b8"
+  },
+	{
+	  "font_class": "bottom",
+	  "unicode": "\ue6b8"
+	},
+  {
+    "font_class": "download",
+    "unicode": "\ue68d"
+  },
+  {
+    "font_class": "download-filled",
+    "unicode": "\ue681"
+  },
+  {
+    "font_class": "email",
+    "unicode": "\ue69e"
+  },
+  {
+    "font_class": "email-filled",
+    "unicode": "\ue69a"
+  },
+  {
+    "font_class": "eye",
+    "unicode": "\ue651"
+  },
+  {
+    "font_class": "eye-filled",
+    "unicode": "\ue66a"
+  },
+  {
+    "font_class": "eye-slash",
+    "unicode": "\ue6b3"
+  },
+  {
+    "font_class": "eye-slash-filled",
+    "unicode": "\ue6b4"
+  },
+  {
+    "font_class": "fire",
+    "unicode": "\ue6a1"
+  },
+  {
+    "font_class": "fire-filled",
+    "unicode": "\ue6c5"
+  },
+  {
+    "font_class": "flag",
+    "unicode": "\ue65f"
+  },
+  {
+    "font_class": "flag-filled",
+    "unicode": "\ue660"
+  },
+  {
+    "font_class": "folder-add",
+    "unicode": "\ue6a9"
+  },
+  {
+    "font_class": "folder-add-filled",
+    "unicode": "\ue6c8"
+  },
+  {
+    "font_class": "font",
+    "unicode": "\ue6a3"
+  },
+  {
+    "font_class": "forward",
+    "unicode": "\ue6ba"
+  },
+  {
+    "font_class": "gear",
+    "unicode": "\ue664"
+  },
+  {
+    "font_class": "gear-filled",
+    "unicode": "\ue661"
+  },
+  {
+    "font_class": "gift",
+    "unicode": "\ue6a4"
+  },
+  {
+    "font_class": "gift-filled",
+    "unicode": "\ue6c4"
+  },
+  {
+    "font_class": "hand-down",
+    "unicode": "\ue63d"
+  },
+  {
+    "font_class": "hand-down-filled",
+    "unicode": "\ue63c"
+  },
+  {
+    "font_class": "hand-up",
+    "unicode": "\ue63f"
+  },
+  {
+    "font_class": "hand-up-filled",
+    "unicode": "\ue63e"
+  },
+  {
+    "font_class": "headphones",
+    "unicode": "\ue630"
+  },
+  {
+    "font_class": "heart",
+    "unicode": "\ue639"
+  },
+  {
+    "font_class": "heart-filled",
+    "unicode": "\ue641"
+  },
+  {
+    "font_class": "help",
+    "unicode": "\ue679"
+  },
+  {
+    "font_class": "help-filled",
+    "unicode": "\ue674"
+  },
+  {
+    "font_class": "home",
+    "unicode": "\ue662"
+  },
+  {
+    "font_class": "home-filled",
+    "unicode": "\ue663"
+  },
+  {
+    "font_class": "image",
+    "unicode": "\ue670"
+  },
+  {
+    "font_class": "image-filled",
+    "unicode": "\ue678"
+  },
+  {
+    "font_class": "images",
+    "unicode": "\ue650"
+  },
+  {
+    "font_class": "images-filled",
+    "unicode": "\ue64b"
+  },
+  {
+    "font_class": "info",
+    "unicode": "\ue669"
+  },
+  {
+    "font_class": "info-filled",
+    "unicode": "\ue649"
+  },
+  {
+    "font_class": "left",
+    "unicode": "\ue6b7"
+  },
+  {
+    "font_class": "link",
+    "unicode": "\ue6a5"
+  },
+  {
+    "font_class": "list",
+    "unicode": "\ue644"
+  },
+  {
+    "font_class": "location",
+    "unicode": "\ue6ae"
+  },
+  {
+    "font_class": "location-filled",
+    "unicode": "\ue6af"
+  },
+  {
+    "font_class": "locked",
+    "unicode": "\ue66b"
+  },
+  {
+    "font_class": "locked-filled",
+    "unicode": "\ue668"
+  },
+  {
+    "font_class": "loop",
+    "unicode": "\ue633"
+  },
+  {
+    "font_class": "mail-open",
+    "unicode": "\ue643"
+  },
+  {
+    "font_class": "mail-open-filled",
+    "unicode": "\ue63a"
+  },
+  {
+    "font_class": "map",
+    "unicode": "\ue667"
+  },
+  {
+    "font_class": "map-filled",
+    "unicode": "\ue666"
+  },
+  {
+    "font_class": "map-pin",
+    "unicode": "\ue6ad"
+  },
+  {
+    "font_class": "map-pin-ellipse",
+    "unicode": "\ue6ac"
+  },
+  {
+    "font_class": "medal",
+    "unicode": "\ue6a2"
+  },
+  {
+    "font_class": "medal-filled",
+    "unicode": "\ue6c3"
+  },
+  {
+    "font_class": "mic",
+    "unicode": "\ue671"
+  },
+  {
+    "font_class": "mic-filled",
+    "unicode": "\ue677"
+  },
+  {
+    "font_class": "micoff",
+    "unicode": "\ue67e"
+  },
+  {
+    "font_class": "micoff-filled",
+    "unicode": "\ue6b0"
+  },
+  {
+    "font_class": "minus",
+    "unicode": "\ue66f"
+  },
+  {
+    "font_class": "minus-filled",
+    "unicode": "\ue67d"
+  },
+  {
+    "font_class": "more",
+    "unicode": "\ue64d"
+  },
+  {
+    "font_class": "more-filled",
+    "unicode": "\ue64e"
+  },
+  {
+    "font_class": "navigate",
+    "unicode": "\ue66e"
+  },
+  {
+    "font_class": "navigate-filled",
+    "unicode": "\ue67a"
+  },
+  {
+    "font_class": "notification",
+    "unicode": "\ue6a6"
+  },
+  {
+    "font_class": "notification-filled",
+    "unicode": "\ue6c1"
+  },
+  {
+    "font_class": "paperclip",
+    "unicode": "\ue652"
+  },
+  {
+    "font_class": "paperplane",
+    "unicode": "\ue672"
+  },
+  {
+    "font_class": "paperplane-filled",
+    "unicode": "\ue675"
+  },
+  {
+    "font_class": "person",
+    "unicode": "\ue699"
+  },
+  {
+    "font_class": "person-filled",
+    "unicode": "\ue69d"
+  },
+  {
+    "font_class": "personadd",
+    "unicode": "\ue69f"
+  },
+  {
+    "font_class": "personadd-filled",
+    "unicode": "\ue698"
+  },
+  {
+    "font_class": "personadd-filled-copy",
+    "unicode": "\ue6d1"
+  },
+  {
+    "font_class": "phone",
+    "unicode": "\ue69c"
+  },
+  {
+    "font_class": "phone-filled",
+    "unicode": "\ue69b"
+  },
+  {
+    "font_class": "plus",
+    "unicode": "\ue676"
+  },
+  {
+    "font_class": "plus-filled",
+    "unicode": "\ue6c7"
+  },
+  {
+    "font_class": "plusempty",
+    "unicode": "\ue67b"
+  },
+  {
+    "font_class": "pulldown",
+    "unicode": "\ue632"
+  },
+  {
+    "font_class": "pyq",
+    "unicode": "\ue682"
+  },
+  {
+    "font_class": "qq",
+    "unicode": "\ue680"
+  },
+  {
+    "font_class": "redo",
+    "unicode": "\ue64a"
+  },
+  {
+    "font_class": "redo-filled",
+    "unicode": "\ue655"
+  },
+  {
+    "font_class": "refresh",
+    "unicode": "\ue657"
+  },
+  {
+    "font_class": "refresh-filled",
+    "unicode": "\ue656"
+  },
+  {
+    "font_class": "refreshempty",
+    "unicode": "\ue6bf"
+  },
+  {
+    "font_class": "reload",
+    "unicode": "\ue6b2"
+  },
+  {
+    "font_class": "right",
+    "unicode": "\ue6b5"
+  },
+  {
+    "font_class": "scan",
+    "unicode": "\ue62a"
+  },
+  {
+    "font_class": "search",
+    "unicode": "\ue654"
+  },
+  {
+    "font_class": "settings",
+    "unicode": "\ue653"
+  },
+  {
+    "font_class": "settings-filled",
+    "unicode": "\ue6ce"
+  },
+  {
+    "font_class": "shop",
+    "unicode": "\ue62f"
+  },
+  {
+    "font_class": "shop-filled",
+    "unicode": "\ue6cd"
+  },
+  {
+    "font_class": "smallcircle",
+    "unicode": "\ue67c"
+  },
+  {
+    "font_class": "smallcircle-filled",
+    "unicode": "\ue665"
+  },
+  {
+    "font_class": "sound",
+    "unicode": "\ue684"
+  },
+  {
+    "font_class": "sound-filled",
+    "unicode": "\ue686"
+  },
+  {
+    "font_class": "spinner-cycle",
+    "unicode": "\ue68a"
+  },
+  {
+    "font_class": "staff",
+    "unicode": "\ue6a7"
+  },
+  {
+    "font_class": "staff-filled",
+    "unicode": "\ue6cb"
+  },
+  {
+    "font_class": "star",
+    "unicode": "\ue688"
+  },
+  {
+    "font_class": "star-filled",
+    "unicode": "\ue68f"
+  },
+  {
+    "font_class": "starhalf",
+    "unicode": "\ue683"
+  },
+  {
+    "font_class": "trash",
+    "unicode": "\ue687"
+  },
+  {
+    "font_class": "trash-filled",
+    "unicode": "\ue685"
+  },
+  {
+    "font_class": "tune",
+    "unicode": "\ue6aa"
+  },
+  {
+    "font_class": "tune-filled",
+    "unicode": "\ue6ca"
+  },
+  {
+    "font_class": "undo",
+    "unicode": "\ue64f"
+  },
+  {
+    "font_class": "undo-filled",
+    "unicode": "\ue64c"
+  },
+  {
+    "font_class": "up",
+    "unicode": "\ue6b6"
+  },
+	{
+	  "font_class": "top",
+	  "unicode": "\ue6b6"
+	},
+  {
+    "font_class": "upload",
+    "unicode": "\ue690"
+  },
+  {
+    "font_class": "upload-filled",
+    "unicode": "\ue68e"
+  },
+  {
+    "font_class": "videocam",
+    "unicode": "\ue68c"
+  },
+  {
+    "font_class": "videocam-filled",
+    "unicode": "\ue689"
+  },
+  {
+    "font_class": "vip",
+    "unicode": "\ue6a8"
+  },
+  {
+    "font_class": "vip-filled",
+    "unicode": "\ue6c6"
+  },
+  {
+    "font_class": "wallet",
+    "unicode": "\ue6b1"
+  },
+  {
+    "font_class": "wallet-filled",
+    "unicode": "\ue6c2"
+  },
+  {
+    "font_class": "weibo",
+    "unicode": "\ue68b"
+  },
+  {
+    "font_class": "weixin",
+    "unicode": "\ue691"
+  }
+] as IconsDataItem[]
+
+// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js
new file mode 100644
index 0000000..1cd11e1
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js
@@ -0,0 +1,649 @@
+
+export const fontData = [
+  {
+    "font_class": "arrow-down",
+    "unicode": "\ue6be"
+  },
+  {
+    "font_class": "arrow-left",
+    "unicode": "\ue6bc"
+  },
+  {
+    "font_class": "arrow-right",
+    "unicode": "\ue6bb"
+  },
+  {
+    "font_class": "arrow-up",
+    "unicode": "\ue6bd"
+  },
+  {
+    "font_class": "auth",
+    "unicode": "\ue6ab"
+  },
+  {
+    "font_class": "auth-filled",
+    "unicode": "\ue6cc"
+  },
+  {
+    "font_class": "back",
+    "unicode": "\ue6b9"
+  },
+  {
+    "font_class": "bars",
+    "unicode": "\ue627"
+  },
+  {
+    "font_class": "calendar",
+    "unicode": "\ue6a0"
+  },
+  {
+    "font_class": "calendar-filled",
+    "unicode": "\ue6c0"
+  },
+  {
+    "font_class": "camera",
+    "unicode": "\ue65a"
+  },
+  {
+    "font_class": "camera-filled",
+    "unicode": "\ue658"
+  },
+  {
+    "font_class": "cart",
+    "unicode": "\ue631"
+  },
+  {
+    "font_class": "cart-filled",
+    "unicode": "\ue6d0"
+  },
+  {
+    "font_class": "chat",
+    "unicode": "\ue65d"
+  },
+  {
+    "font_class": "chat-filled",
+    "unicode": "\ue659"
+  },
+  {
+    "font_class": "chatboxes",
+    "unicode": "\ue696"
+  },
+  {
+    "font_class": "chatboxes-filled",
+    "unicode": "\ue692"
+  },
+  {
+    "font_class": "chatbubble",
+    "unicode": "\ue697"
+  },
+  {
+    "font_class": "chatbubble-filled",
+    "unicode": "\ue694"
+  },
+  {
+    "font_class": "checkbox",
+    "unicode": "\ue62b"
+  },
+  {
+    "font_class": "checkbox-filled",
+    "unicode": "\ue62c"
+  },
+  {
+    "font_class": "checkmarkempty",
+    "unicode": "\ue65c"
+  },
+  {
+    "font_class": "circle",
+    "unicode": "\ue65b"
+  },
+  {
+    "font_class": "circle-filled",
+    "unicode": "\ue65e"
+  },
+  {
+    "font_class": "clear",
+    "unicode": "\ue66d"
+  },
+  {
+    "font_class": "close",
+    "unicode": "\ue673"
+  },
+  {
+    "font_class": "closeempty",
+    "unicode": "\ue66c"
+  },
+  {
+    "font_class": "cloud-download",
+    "unicode": "\ue647"
+  },
+  {
+    "font_class": "cloud-download-filled",
+    "unicode": "\ue646"
+  },
+  {
+    "font_class": "cloud-upload",
+    "unicode": "\ue645"
+  },
+  {
+    "font_class": "cloud-upload-filled",
+    "unicode": "\ue648"
+  },
+  {
+    "font_class": "color",
+    "unicode": "\ue6cf"
+  },
+  {
+    "font_class": "color-filled",
+    "unicode": "\ue6c9"
+  },
+  {
+    "font_class": "compose",
+    "unicode": "\ue67f"
+  },
+  {
+    "font_class": "contact",
+    "unicode": "\ue693"
+  },
+  {
+    "font_class": "contact-filled",
+    "unicode": "\ue695"
+  },
+  {
+    "font_class": "down",
+    "unicode": "\ue6b8"
+  },
+	{
+	  "font_class": "bottom",
+	  "unicode": "\ue6b8"
+	},
+  {
+    "font_class": "download",
+    "unicode": "\ue68d"
+  },
+  {
+    "font_class": "download-filled",
+    "unicode": "\ue681"
+  },
+  {
+    "font_class": "email",
+    "unicode": "\ue69e"
+  },
+  {
+    "font_class": "email-filled",
+    "unicode": "\ue69a"
+  },
+  {
+    "font_class": "eye",
+    "unicode": "\ue651"
+  },
+  {
+    "font_class": "eye-filled",
+    "unicode": "\ue66a"
+  },
+  {
+    "font_class": "eye-slash",
+    "unicode": "\ue6b3"
+  },
+  {
+    "font_class": "eye-slash-filled",
+    "unicode": "\ue6b4"
+  },
+  {
+    "font_class": "fire",
+    "unicode": "\ue6a1"
+  },
+  {
+    "font_class": "fire-filled",
+    "unicode": "\ue6c5"
+  },
+  {
+    "font_class": "flag",
+    "unicode": "\ue65f"
+  },
+  {
+    "font_class": "flag-filled",
+    "unicode": "\ue660"
+  },
+  {
+    "font_class": "folder-add",
+    "unicode": "\ue6a9"
+  },
+  {
+    "font_class": "folder-add-filled",
+    "unicode": "\ue6c8"
+  },
+  {
+    "font_class": "font",
+    "unicode": "\ue6a3"
+  },
+  {
+    "font_class": "forward",
+    "unicode": "\ue6ba"
+  },
+  {
+    "font_class": "gear",
+    "unicode": "\ue664"
+  },
+  {
+    "font_class": "gear-filled",
+    "unicode": "\ue661"
+  },
+  {
+    "font_class": "gift",
+    "unicode": "\ue6a4"
+  },
+  {
+    "font_class": "gift-filled",
+    "unicode": "\ue6c4"
+  },
+  {
+    "font_class": "hand-down",
+    "unicode": "\ue63d"
+  },
+  {
+    "font_class": "hand-down-filled",
+    "unicode": "\ue63c"
+  },
+  {
+    "font_class": "hand-up",
+    "unicode": "\ue63f"
+  },
+  {
+    "font_class": "hand-up-filled",
+    "unicode": "\ue63e"
+  },
+  {
+    "font_class": "headphones",
+    "unicode": "\ue630"
+  },
+  {
+    "font_class": "heart",
+    "unicode": "\ue639"
+  },
+  {
+    "font_class": "heart-filled",
+    "unicode": "\ue641"
+  },
+  {
+    "font_class": "help",
+    "unicode": "\ue679"
+  },
+  {
+    "font_class": "help-filled",
+    "unicode": "\ue674"
+  },
+  {
+    "font_class": "home",
+    "unicode": "\ue662"
+  },
+  {
+    "font_class": "home-filled",
+    "unicode": "\ue663"
+  },
+  {
+    "font_class": "image",
+    "unicode": "\ue670"
+  },
+  {
+    "font_class": "image-filled",
+    "unicode": "\ue678"
+  },
+  {
+    "font_class": "images",
+    "unicode": "\ue650"
+  },
+  {
+    "font_class": "images-filled",
+    "unicode": "\ue64b"
+  },
+  {
+    "font_class": "info",
+    "unicode": "\ue669"
+  },
+  {
+    "font_class": "info-filled",
+    "unicode": "\ue649"
+  },
+  {
+    "font_class": "left",
+    "unicode": "\ue6b7"
+  },
+  {
+    "font_class": "link",
+    "unicode": "\ue6a5"
+  },
+  {
+    "font_class": "list",
+    "unicode": "\ue644"
+  },
+  {
+    "font_class": "location",
+    "unicode": "\ue6ae"
+  },
+  {
+    "font_class": "location-filled",
+    "unicode": "\ue6af"
+  },
+  {
+    "font_class": "locked",
+    "unicode": "\ue66b"
+  },
+  {
+    "font_class": "locked-filled",
+    "unicode": "\ue668"
+  },
+  {
+    "font_class": "loop",
+    "unicode": "\ue633"
+  },
+  {
+    "font_class": "mail-open",
+    "unicode": "\ue643"
+  },
+  {
+    "font_class": "mail-open-filled",
+    "unicode": "\ue63a"
+  },
+  {
+    "font_class": "map",
+    "unicode": "\ue667"
+  },
+  {
+    "font_class": "map-filled",
+    "unicode": "\ue666"
+  },
+  {
+    "font_class": "map-pin",
+    "unicode": "\ue6ad"
+  },
+  {
+    "font_class": "map-pin-ellipse",
+    "unicode": "\ue6ac"
+  },
+  {
+    "font_class": "medal",
+    "unicode": "\ue6a2"
+  },
+  {
+    "font_class": "medal-filled",
+    "unicode": "\ue6c3"
+  },
+  {
+    "font_class": "mic",
+    "unicode": "\ue671"
+  },
+  {
+    "font_class": "mic-filled",
+    "unicode": "\ue677"
+  },
+  {
+    "font_class": "micoff",
+    "unicode": "\ue67e"
+  },
+  {
+    "font_class": "micoff-filled",
+    "unicode": "\ue6b0"
+  },
+  {
+    "font_class": "minus",
+    "unicode": "\ue66f"
+  },
+  {
+    "font_class": "minus-filled",
+    "unicode": "\ue67d"
+  },
+  {
+    "font_class": "more",
+    "unicode": "\ue64d"
+  },
+  {
+    "font_class": "more-filled",
+    "unicode": "\ue64e"
+  },
+  {
+    "font_class": "navigate",
+    "unicode": "\ue66e"
+  },
+  {
+    "font_class": "navigate-filled",
+    "unicode": "\ue67a"
+  },
+  {
+    "font_class": "notification",
+    "unicode": "\ue6a6"
+  },
+  {
+    "font_class": "notification-filled",
+    "unicode": "\ue6c1"
+  },
+  {
+    "font_class": "paperclip",
+    "unicode": "\ue652"
+  },
+  {
+    "font_class": "paperplane",
+    "unicode": "\ue672"
+  },
+  {
+    "font_class": "paperplane-filled",
+    "unicode": "\ue675"
+  },
+  {
+    "font_class": "person",
+    "unicode": "\ue699"
+  },
+  {
+    "font_class": "person-filled",
+    "unicode": "\ue69d"
+  },
+  {
+    "font_class": "personadd",
+    "unicode": "\ue69f"
+  },
+  {
+    "font_class": "personadd-filled",
+    "unicode": "\ue698"
+  },
+  {
+    "font_class": "personadd-filled-copy",
+    "unicode": "\ue6d1"
+  },
+  {
+    "font_class": "phone",
+    "unicode": "\ue69c"
+  },
+  {
+    "font_class": "phone-filled",
+    "unicode": "\ue69b"
+  },
+  {
+    "font_class": "plus",
+    "unicode": "\ue676"
+  },
+  {
+    "font_class": "plus-filled",
+    "unicode": "\ue6c7"
+  },
+  {
+    "font_class": "plusempty",
+    "unicode": "\ue67b"
+  },
+  {
+    "font_class": "pulldown",
+    "unicode": "\ue632"
+  },
+  {
+    "font_class": "pyq",
+    "unicode": "\ue682"
+  },
+  {
+    "font_class": "qq",
+    "unicode": "\ue680"
+  },
+  {
+    "font_class": "redo",
+    "unicode": "\ue64a"
+  },
+  {
+    "font_class": "redo-filled",
+    "unicode": "\ue655"
+  },
+  {
+    "font_class": "refresh",
+    "unicode": "\ue657"
+  },
+  {
+    "font_class": "refresh-filled",
+    "unicode": "\ue656"
+  },
+  {
+    "font_class": "refreshempty",
+    "unicode": "\ue6bf"
+  },
+  {
+    "font_class": "reload",
+    "unicode": "\ue6b2"
+  },
+  {
+    "font_class": "right",
+    "unicode": "\ue6b5"
+  },
+  {
+    "font_class": "scan",
+    "unicode": "\ue62a"
+  },
+  {
+    "font_class": "search",
+    "unicode": "\ue654"
+  },
+  {
+    "font_class": "settings",
+    "unicode": "\ue653"
+  },
+  {
+    "font_class": "settings-filled",
+    "unicode": "\ue6ce"
+  },
+  {
+    "font_class": "shop",
+    "unicode": "\ue62f"
+  },
+  {
+    "font_class": "shop-filled",
+    "unicode": "\ue6cd"
+  },
+  {
+    "font_class": "smallcircle",
+    "unicode": "\ue67c"
+  },
+  {
+    "font_class": "smallcircle-filled",
+    "unicode": "\ue665"
+  },
+  {
+    "font_class": "sound",
+    "unicode": "\ue684"
+  },
+  {
+    "font_class": "sound-filled",
+    "unicode": "\ue686"
+  },
+  {
+    "font_class": "spinner-cycle",
+    "unicode": "\ue68a"
+  },
+  {
+    "font_class": "staff",
+    "unicode": "\ue6a7"
+  },
+  {
+    "font_class": "staff-filled",
+    "unicode": "\ue6cb"
+  },
+  {
+    "font_class": "star",
+    "unicode": "\ue688"
+  },
+  {
+    "font_class": "star-filled",
+    "unicode": "\ue68f"
+  },
+  {
+    "font_class": "starhalf",
+    "unicode": "\ue683"
+  },
+  {
+    "font_class": "trash",
+    "unicode": "\ue687"
+  },
+  {
+    "font_class": "trash-filled",
+    "unicode": "\ue685"
+  },
+  {
+    "font_class": "tune",
+    "unicode": "\ue6aa"
+  },
+  {
+    "font_class": "tune-filled",
+    "unicode": "\ue6ca"
+  },
+  {
+    "font_class": "undo",
+    "unicode": "\ue64f"
+  },
+  {
+    "font_class": "undo-filled",
+    "unicode": "\ue64c"
+  },
+  {
+    "font_class": "up",
+    "unicode": "\ue6b6"
+  },
+	{
+	  "font_class": "top",
+	  "unicode": "\ue6b6"
+	},
+  {
+    "font_class": "upload",
+    "unicode": "\ue690"
+  },
+  {
+    "font_class": "upload-filled",
+    "unicode": "\ue68e"
+  },
+  {
+    "font_class": "videocam",
+    "unicode": "\ue68c"
+  },
+  {
+    "font_class": "videocam-filled",
+    "unicode": "\ue689"
+  },
+  {
+    "font_class": "vip",
+    "unicode": "\ue6a8"
+  },
+  {
+    "font_class": "vip-filled",
+    "unicode": "\ue6c6"
+  },
+  {
+    "font_class": "wallet",
+    "unicode": "\ue6b1"
+  },
+  {
+    "font_class": "wallet-filled",
+    "unicode": "\ue6c2"
+  },
+  {
+    "font_class": "weibo",
+    "unicode": "\ue68b"
+  },
+  {
+    "font_class": "weixin",
+    "unicode": "\ue691"
+  }
+]
+
+// export const fontData = JSON.parse<IconsDataItem>(fontDataJson)
diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json
new file mode 100644
index 0000000..397be83
--- /dev/null
+++ b/uni_modules/uni-icons/package.json
@@ -0,0 +1,88 @@
+{
+  "id": "uni-icons",
+  "displayName": "uni-icons 鍥炬爣",
+  "version": "2.0.9",
+  "description": "鍥炬爣缁勪欢锛岀敤浜庡睍绀虹Щ鍔ㄧ甯歌鐨勫浘鏍囷紝鍙嚜瀹氫箟棰滆壊銆佸ぇ灏忋��",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "icon",
+    "鍥炬爣"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.2.14"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y",
+          "app-uvue": "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",
+					"椋炰功": "y",
+					"浜笢": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "y",
+          "鑱旂洘": "y"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md
new file mode 100644
index 0000000..86234ba
--- /dev/null
+++ b/uni_modules/uni-icons/readme.md
@@ -0,0 +1,8 @@
+## Icons 鍥炬爣
+> **缁勪欢鍚嶏細uni-icons**
+> 浠g爜鍧楋細 `uIcons`
+
+鐢ㄤ簬灞曠ず icons 鍥炬爣 銆�
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
diff --git a/uni_modules/uni-list/changelog.md b/uni_modules/uni-list/changelog.md
new file mode 100644
index 0000000..8254a18
--- /dev/null
+++ b/uni_modules/uni-list/changelog.md
@@ -0,0 +1,46 @@
+## 1.2.14锛�2023-04-14锛�
+- 浼樺寲 uni-list-chat 鍏峰悕鎻掓Ы`header` 闈瀉pp绔涓�灞傚厓绱狅紝鏂逛究浣跨敤鏃堕�氳繃澶栧眰鍏冪礌瀹氫綅瀹炵幇鏍峰紡淇敼
+## 1.2.13锛�2023-03-03锛�
+- uni-list-chat 鏂板 鏀寔鍏峰悕鎻掓Ы`header`
+## 1.2.12锛�2023-02-01锛�
+- 鏂板 鍒楄〃鍥炬爣鏂板 customPrefix 灞炴�� 锛岀敤娉� [璇﹁](https://uniapp.dcloud.net.cn/component/uniui/uni-icons.html#icons-props)
+## 1.2.11锛�2023-01-31锛�
+- 淇 鏃犲弽棣堟晥鏋滃憟鐜扮殑bug
+## 1.2.9锛�2022-11-22锛�
+- 淇 uni-list-chat 鍦╲ue3涓嬭烦杞姤閿欑殑bug
+## 1.2.8锛�2022-11-21锛�
+- 淇 uni-list-chat avatar灞炴�� 鍊间负鏈湴璺緞鏃堕敊璇殑闂
+## 1.2.7锛�2022-11-21锛�
+- 淇 uni-list-chat avatar灞炴�� 鍦ㄨ吘璁簯鐗坲niCloud涓嬮敊璇殑闂
+## 1.2.6锛�2022-11-18锛�
+- 淇 uni-list-chat note灞炴�� 鏀寔锛氣�滆崏绋库�濆瓧鏍峰姛鑳� 鏂囨湰灏�1浣嶇殑闂
+## 1.2.5锛�2022-11-15锛�
+- 淇 uni-list-item 鐨� customStyle 灞炴�� padding鍊煎湪 H5绔� 鏃犳晥鐨刡ug
+## 1.2.4锛�2022-11-15锛�
+- 淇 uni-list-item 鐨� customStyle 灞炴�� padding鍊煎湪nvue锛坴ue2锛変笅鏃犳晥鐨刡ug
+## 1.2.3锛�2022-11-14锛�
+- uni-list-chat 鏂板 avatar 鏀寔 fileId
+## 1.2.2锛�2022-11-11锛�
+- uni-list 鏂板灞炴�� render-reverse 璇︽儏鍙傝�冿細[https://uniapp.dcloud.net.cn/component/list.html](https://uniapp.dcloud.net.cn/component/list.html)
+- uni-list-chat note灞炴�� 鏀寔锛氣�滆崏绋库�濆瓧鏍� 鍔犵孩鏄剧ず 璇︽儏鍙傝�僽ni-im锛歔https://ext.dcloud.net.cn/plugin?name=uni-im](https://ext.dcloud.net.cn/plugin?name=uni-im)
+- uni-list-item 鏂板灞炴�� customStyle 鏀寔璁剧疆padding銆乥ackgroundColor
+## 1.2.1锛�2022-03-30锛�
+- 鍒犻櫎鏃犵敤鏂囦欢
+## 1.2.0锛�2021-11-23锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-list](https://uniapp.dcloud.io/component/uniui/uni-list)
+## 1.1.3锛�2021-08-30锛�
+- 淇 鍦╲ue3涓璽o灞炴�у湪鍙戣搴旂敤鐨勬椂鍊欐姤閿欑殑bug
+## 1.1.2锛�2021-07-30锛�
+- 浼樺寲 vue3涓嬩簨浠惰鍛婄殑闂
+## 1.1.1锛�2021-07-21锛�
+- 淇 涓庡叾浠栫粍浠跺祵濂椾娇鐢ㄦ椂锛岀偣鍑诲け鏁堢殑Bug
+## 1.1.0锛�2021-07-13锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.0.17锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.0.16锛�2021-02-05锛�
+- 浼樺寲 缁勪欢寮曠敤鍏崇郴锛岄�氳繃uni_modules寮曠敤缁勪欢
+## 1.0.15锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
+- 淇 uni-list-chat 瑙掓爣鏄剧ず涓嶆甯哥殑闂
diff --git a/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue
new file mode 100644
index 0000000..b9349c2
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list-ad/uni-list-ad.vue
@@ -0,0 +1,107 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+		<view class="uni-list-ad">
+			<view v-if="borderShow" :class="{'uni-list--border':border,'uni-list-item--first':isFirstChild}"></view>
+			<ad style="width: 200px;height: 300px;border-width: 1px;border-color: red;border-style: solid;" adpid="1111111111"
+			 unit-id="" appid="" apid="" type="feed" @error="aderror" @close="closeAd"></ad>
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = uni.requireNativePlugin('dom');
+	// #endif
+	export default {
+		name: 'UniListAd',
+		props: {
+			title: {
+				type: String,
+				default: '',
+
+			}
+		},
+		// inject: ['list'],
+		data() {
+			return {
+				isFirstChild: false,
+				border: false,
+				borderShow: true,
+			}
+		},
+
+		mounted() {
+			this.list = this.getForm()
+			if (this.list) {
+				if (!this.list.firstChildAppend) {
+					this.list.firstChildAppend = true
+					this.isFirstChild = true
+				}
+				this.border = this.list.border
+			}
+		},
+		methods: {
+			/**
+			 * 鑾峰彇鐖跺厓绱犲疄渚�
+			 */
+			getForm(name = 'uniList') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			aderror(e) {
+				console.log("aderror: " + JSON.stringify(e.detail));
+			},
+			closeAd(e) {
+				this.borderShow = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	.uni-list-ad {
+		position: relative;
+		border: 1px red solid;
+	}
+
+	.uni-list--border {
+		position: relative;
+		padding-bottom: 1px;
+		/* #ifdef APP-PLUS */
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		/* #endif */
+		margin-left: $uni-spacing-row-lg;
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border:after {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(.5);
+		transform: scaleY(.5);
+		background-color: $uni-border-color;
+	}
+
+	.uni-list-item--first:after {
+		height: 0px;
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss
new file mode 100644
index 0000000..311f8d9
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.scss
@@ -0,0 +1,58 @@
+/**
+ * 杩欓噷鏄� uni-list 缁勪欢鍐呯疆鐨勫父鐢ㄦ牱寮忓彉閲�
+ * 濡傛灉闇�瑕佽鐩栨牱寮忥紝杩欓噷鎻愪緵浜嗗熀鏈殑缁勪欢鏍峰紡鍙橀噺锛屾偍鍙互灏濊瘯淇敼杩欓噷鐨勫彉閲忥紝鍘诲畬鎴愭牱寮忔浛鎹紝鑰屼笉鐢ㄥ幓淇敼婧愮爜
+ *
+ */
+
+// 鑳屾櫙鑹�
+$background-color : #fff;
+// 鍒嗗壊绾块鑹�
+$divide-line-color : #e5e5e5;
+
+// 榛樿澶村儚澶у皬锛屽闇�瑕佷慨鏀规鍊硷紝娉ㄦ剰鍚屾淇敼 js 涓殑鍊� const avatarWidth = xx 锛岀洰鍓嶅彧鏀寔鏂瑰舰澶村儚
+// nvue 椤甸潰涓嶆敮鎸佷慨鏀瑰ご鍍忓ぇ灏�
+$avatar-width : 45px ;
+
+// 澶村儚杈规
+$avatar-border-radius: 5px;
+$avatar-border-color: #eee;
+$avatar-border-width: 1px;
+
+// 鏍囬鏂囧瓧鏍峰紡
+$title-size : 16px;
+$title-color : #3b4144;
+$title-weight : normal;
+
+// 鎻忚堪鏂囧瓧鏍峰紡
+$note-size : 12px;
+$note-color : #999;
+$note-weight : normal;
+
+// 鍙充晶棰濆鍐呭榛樿鏍峰紡
+$right-text-size : 12px;
+$right-text-color : #999;
+$right-text-weight : normal;
+
+// 瑙掓爣鏍峰紡
+// nvue 椤甸潰涓嶆敮鎸佷慨鏀瑰渾鐐逛綅缃互鍙婂ぇ灏�
+// 瑙掓爣鍦ㄥ乏渚ф椂锛岃鏍囩殑浣嶇疆锛岄粯璁や负 0 锛岃礋鏁板乏/涓嬬Щ鍔紝姝f暟鍙�/涓婄Щ鍔�
+$badge-left: 0px;
+$badge-top: 0px;
+
+// 鏄剧ず鍦嗙偣鏃讹紝鍦嗙偣澶у皬
+$dot-width: 10px;
+$dot-height: 10px;
+
+// 鏄剧ず瑙掓爣鏃讹紝瑙掓爣澶у皬鍜屽瓧浣撳ぇ灏�
+$badge-size : 18px;
+$badge-font : 12px;
+// 鏄剧ず瑙掓爣鏃讹紝瑙掓爣鍓嶆櫙鑹�
+$badge-color : #fff;
+// 鏄剧ず瑙掓爣鏃讹紝瑙掓爣鑳屾櫙鑹�
+$badge-background-color : #ff5a5f;
+// 鏄剧ず瑙掓爣鏃讹紝瑙掓爣宸﹀彸闂磋窛
+$badge-space : 6px;
+
+// 鐘舵�佹牱寮�
+// 閫変腑棰滆壊
+$hover : #f5f5f5;
diff --git a/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue
new file mode 100644
index 0000000..d49fd7c
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list-chat/uni-list-chat.vue
@@ -0,0 +1,593 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+		<view :hover-class="!clickable && !link ? '' : 'uni-list-chat--hover'" class="uni-list-chat" @click.stop="onClick">
+			<view :class="{ 'uni-list--border': border, 'uni-list-chat--first': isFirstChild }"></view>
+			<view class="uni-list-chat__container">
+				<view class="uni-list-chat__header-warp">
+					<view v-if="avatarCircle || avatarList.length === 0" class="uni-list-chat__header" :class="{ 'header--circle': avatarCircle }">
+						<image class="uni-list-chat__header-image" :class="{ 'header--circle': avatarCircle }" :src="avatarUrl" mode="aspectFill"></image>
+					</view>
+					<!-- 澶村儚缁� -->
+					<view v-else class="uni-list-chat__header">
+						<view v-for="(item, index) in avatarList" :key="index" class="uni-list-chat__header-box" :class="computedAvatar"
+						 :style="{ width: imageWidth + 'px', height: imageWidth + 'px' }">
+							<image class="uni-list-chat__header-image" :style="{ width: imageWidth + 'px', height: imageWidth + 'px' }" :src="item.url"
+							 mode="aspectFill"></image>
+						</view>
+					</view>
+				</view>
+				<!-- #ifndef APP -->
+				<view class="slot-header">
+				<!-- #endif -->
+					<slot name="header"></slot>
+				<!-- #ifndef APP -->
+				</view>
+				<!-- #endif -->
+				<view v-if="badgeText && badgePositon === 'left'" class="uni-list-chat__badge uni-list-chat__badge-pos" :class="[isSingle]">
+					<text class="uni-list-chat__badge-text">{{ badgeText === 'dot' ? '' : badgeText }}</text>
+				</view>
+				<view class="uni-list-chat__content">
+					<view class="uni-list-chat__content-main">
+						<text class="uni-list-chat__content-title uni-ellipsis">{{ title }}</text>
+						<view style="flex-direction: row;">
+							<text class="draft" v-if="isDraft">[鑽夌]</text>
+							<text class="uni-list-chat__content-note uni-ellipsis">{{isDraft?note.slice(14):note}}</text>
+						</view>
+					</view>
+					<view class="uni-list-chat__content-extra">
+						<slot>
+							<text class="uni-list-chat__content-extra-text">{{ time }}</text>
+							<view v-if="badgeText && badgePositon === 'right'" class="uni-list-chat__badge" :class="[isSingle, badgePositon === 'right' ? 'uni-list-chat--right' : '']">
+								<text class="uni-list-chat__badge-text">{{ badgeText === 'dot' ? '' : badgeText }}</text>
+							</view>
+						</slot>
+					</view>
+				</view>
+			</view>
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+	// 澶村儚澶у皬
+	const avatarWidth = 45;
+
+	/**
+	 * ListChat 鑱婂ぉ鍒楄〃
+	 * @description 鑱婂ぉ鍒楄〃,鐢ㄤ簬鍒涘缓鑱婂ぉ绫诲垪琛�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+	 * @property {String} 	title 							鏍囬
+	 * @property {String} 	note 							鎻忚堪
+	 * @property {Boolean} 	clickable = [true|false] 		鏄惁寮�鍚偣鍑诲弽棣堬紝榛樿涓篺alse
+	 * @property {String} 	badgeText						鏁板瓧瑙掓爣鍐呭
+	 * @property {String}  	badgePositon = [left|right]		瑙掓爣浣嶇疆锛岄粯璁や负 right
+	 * @property {String} 	link = [false锝渘avigateTo|redirectTo|reLaunch|switchTab] 鏄惁灞曠ず鍙充晶绠ご骞跺紑鍚偣鍑诲弽棣堬紝榛樿涓篺alse
+	 *  @value false	 	涓嶅紑鍚�
+	 *  @value navigateTo 	鍚� uni.navigateTo()
+	 * 	@value redirectTo 	鍚� uni.redirectTo()
+	 * 	@value reLaunch   	鍚� uni.reLaunch()
+	 * 	@value switchTab  	鍚� uni.switchTab()
+	 * @property {String | PageURIString} 	to  			璺宠浆鐩爣椤甸潰
+	 * @property {String} 	time							鍙充晶鏃堕棿鏄剧ず
+	 * @property {Boolean} 	avatarCircle = [true|false]		鏄惁鏄剧ず鍦嗗舰澶村儚锛岄粯璁や负false
+	 * @property {String} 	avatar							澶村儚鍦板潃锛宎vatarCircle 涓嶅~鏃剁敓鏁�
+	 * @property {Array} 	avatarList 						澶村儚缁勶紝鏍煎紡涓� [{url:''}]
+	 * @event {Function} 	click 							鐐瑰嚮 uniListChat 瑙﹀彂浜嬩欢
+	 */
+	export default {
+		name: 'UniListChat',
+		emits:['click'],
+		props: {
+			title: {
+				type: String,
+				default: ''
+			},
+			note: {
+				type: String,
+				default: ''
+			},
+			clickable: {
+				type: Boolean,
+				default: false
+			},
+			link: {
+				type: [Boolean, String],
+				default: false
+			},
+			to: {
+				type: String,
+				default: ''
+			},
+			badgeText: {
+				type: [String, Number],
+				default: ''
+			},
+			badgePositon: {
+				type: String,
+				default: 'right'
+			},
+			time: {
+				type: String,
+				default: ''
+			},
+			avatarCircle: {
+				type: Boolean,
+				default: false
+			},
+			avatar: {
+				type: String,
+				default: ''
+			},
+			avatarList: {
+				type: Array,
+				default () {
+					return [];
+				}
+			}
+		},
+		// inject: ['list'],
+		computed: {
+			isDraft(){
+				return this.note.slice(0,14) == '[uni-im-draft]'
+			},
+			isSingle() {
+				if (this.badgeText === 'dot') {
+					return 'uni-badge--dot';
+				} else {
+					const badgeText = this.badgeText.toString();
+					if (badgeText.length > 1) {
+						return 'uni-badge--complex';
+					} else {
+						return 'uni-badge--single';
+					}
+				}
+			},
+			computedAvatar() {
+				if (this.avatarList.length > 4) {
+					this.imageWidth = avatarWidth * 0.31;
+					return 'avatarItem--3';
+				} else if (this.avatarList.length > 1) {
+					this.imageWidth = avatarWidth * 0.47;
+					return 'avatarItem--2';
+				} else {
+					this.imageWidth = avatarWidth;
+					return 'avatarItem--1';
+				}
+			}
+		},
+		watch: {
+			avatar:{
+				handler(avatar) {
+					if(avatar.substr(0,8) == 'cloud://'){
+						uniCloud.getTempFileURL({
+							fileList: [avatar]
+						}).then(res=>{
+							// console.log(res);
+							// 鍏煎uniCloud绉佹湁鍖栭儴缃�
+							let fileList = res.fileList || res.result.fileList
+							this.avatarUrl = fileList[0].tempFileURL
+						})
+					}else{
+						this.avatarUrl = avatar
+					}
+				},
+				immediate: true
+			}
+		},
+		data() {
+			return {
+				isFirstChild: false,
+				border: true,
+				// avatarList: 3,
+				imageWidth: 50,
+				avatarUrl:''
+			};
+		},
+		mounted() {
+			this.list = this.getForm()
+			if (this.list) {
+				if (!this.list.firstChildAppend) {
+					this.list.firstChildAppend = true;
+					this.isFirstChild = true;
+				}
+				this.border = this.list.border;
+			}
+		},
+		methods: {
+			/**
+			 * 鑾峰彇鐖跺厓绱犲疄渚�
+			 */
+			getForm(name = 'uniList') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			onClick() {
+				if (this.to !== '') {
+					this.openPage();
+					return;
+				}
+
+				if (this.clickable || this.link) {
+					this.$emit('click', {
+						data: {}
+					});
+				}
+			},
+			openPage() {
+				if (['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].indexOf(this.link) !== -1) {
+					this.pageApi(this.link);
+				} else {
+					this.pageApi('navigateTo');
+				}
+			},
+			pageApi(api) {
+				let callback = {
+					url: this.to,
+					success: res => {
+						this.$emit('click', {
+							data: res
+						});
+					},
+					fail: err => {
+						this.$emit('click', {
+							data: err
+						});
+					}
+				}
+				switch (api) {
+					case 'navigateTo':
+						uni.navigateTo(callback)
+						break
+					case 'redirectTo':
+						uni.redirectTo(callback)
+						break
+					case 'reLaunch':
+						uni.reLaunch(callback)
+						break
+					case 'switchTab':
+						uni.switchTab(callback)
+						break
+					default:
+					uni.navigateTo(callback)
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" >
+	$uni-font-size-lg:16px;
+	$uni-spacing-row-sm: 5px;
+	$uni-spacing-row-base: 10px;
+	$uni-spacing-row-lg: 15px;
+	$background-color: #fff;
+	$divide-line-color: #e5e5e5;
+	$avatar-width: 45px;
+	$avatar-border-radius: 5px;
+	$avatar-border-color: #eee;
+	$avatar-border-width: 1px;
+	$title-size: 16px;
+	$title-color: #3b4144;
+	$title-weight: normal;
+	$note-size: 12px;
+	$note-color: #999;
+	$note-weight: normal;
+	$right-text-size: 12px;
+	$right-text-color: #999;
+	$right-text-weight: normal;
+	$badge-left: 0px;
+	$badge-top: 0px;
+	$dot-width: 10px;
+	$dot-height: 10px;
+	$badge-size: 18px;
+	$badge-font: 12px;
+	$badge-color: #fff;
+	$badge-background-color: #ff5a5f;
+	$badge-space: 6px;
+	$hover: #f5f5f5;
+
+	.uni-list-chat {
+		font-size: $uni-font-size-lg;
+		position: relative;
+		flex-direction: column;
+		justify-content: space-between;
+		background-color: $background-color;
+	}
+
+	// .uni-list-chat--disabled {
+	// 	opacity: 0.3;
+	// }
+
+	.uni-list-chat--hover {
+		background-color: $hover;
+	}
+
+	.uni-list--border {
+		position: relative;
+		margin-left: $uni-spacing-row-lg;
+		/* #ifdef APP-PLUS */
+		border-top-color: $divide-line-color;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border:after {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: $divide-line-color;
+	}
+
+	.uni-list-item--first:after {
+		height: 0px;
+	}
+
+	/* #endif */
+
+	.uni-list-chat--first {
+		border-top-width: 0px;
+	}
+
+	.uni-ellipsis {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		/* #endif */
+	}
+
+	.uni-ellipsis-2 {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+		/* #endif */
+
+		/* #ifdef APP-NVUE */
+		lines: 2;
+		/* #endif */
+	}
+
+	.uni-list-chat__container {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+		padding: $uni-spacing-row-base $uni-spacing-row-lg;
+		position: relative;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__header-warp {
+		position: relative;
+	}
+
+	.uni-list-chat__header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		align-content: center;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		flex-wrap: wrap-reverse;
+		/* #ifdef APP-NVUE */
+		width: 50px;
+		height: 50px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		width: $avatar-width;
+		height: $avatar-width;
+		/* #endif */
+
+		border-radius: $avatar-border-radius;
+		border-color: $avatar-border-color;
+		border-width: $avatar-border-width;
+		border-style: solid;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__header-box {
+		/* #ifndef APP-PLUS */
+		box-sizing: border-box;
+		display: flex;
+		width: $avatar-width;
+		height: $avatar-width;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		width: 50px;
+		height: 50px;
+		/* #endif */
+		overflow: hidden;
+		border-radius: 2px;
+	}
+
+	.uni-list-chat__header-image {
+		margin: 1px;
+		/* #ifdef APP-NVUE */
+		width: 50px;
+		height: 50px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		width: $avatar-width;
+		height: $avatar-width;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list-chat__header-image {
+		display: block;
+		width: 100%;
+		height: 100%;
+	}
+
+	.avatarItem--1 {
+		width: 100%;
+		height: 100%;
+	}
+
+	.avatarItem--2 {
+		width: 47%;
+		height: 47%;
+	}
+
+	.avatarItem--3 {
+		width: 32%;
+		height: 32%;
+	}
+
+	/* #endif */
+	.header--circle {
+		border-radius: 50%;
+	}
+
+	.uni-list-chat__content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+		overflow: hidden;
+		padding: 2px 0;
+	}
+
+	.uni-list-chat__content-main {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: space-between;
+		padding-left: $uni-spacing-row-base;
+		flex: 1;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__content-title {
+		font-size: $title-size;
+		color: $title-color;
+		font-weight: $title-weight;
+		overflow: hidden;
+	}
+
+	.draft ,.uni-list-chat__content-note {
+		margin-top: 3px;
+		color: $note-color;
+		font-size: $note-size;
+		font-weight: $title-weight;
+		overflow: hidden;
+	}
+	.draft{
+		color: #eb3a41;
+		/* #ifndef APP-NVUE */
+		flex-shrink: 0;
+		/* #endif */
+		padding-right: 3px;
+	}
+
+	.uni-list-chat__content-extra {
+		/* #ifndef APP-NVUE */
+		flex-shrink: 0;
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: space-between;
+		align-items: flex-end;
+		margin-left: 5px;
+	}
+
+	.uni-list-chat__content-extra-text {
+		color: $right-text-color;
+		font-size: $right-text-size;
+		font-weight: $right-text-weight;
+		overflow: hidden;
+	}
+
+	.uni-list-chat__badge-pos {
+		position: absolute;
+		/* #ifdef APP-NVUE */
+		left: 55px;
+		top: 3px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		left: calc(#{$avatar-width} + 10px - #{$badge-space} + #{$badge-left});
+		top: calc(#{$uni-spacing-row-base}/ 2 + 1px + #{$badge-top});
+		/* #endif */
+	}
+
+	.uni-list-chat__badge {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		border-radius: 100px;
+		background-color: $badge-background-color;
+	}
+
+	.uni-list-chat__badge-text {
+		color: $badge-color;
+		font-size: $badge-font;
+	}
+
+	.uni-badge--single {
+		/* #ifndef APP-NVUE */
+		// left: calc(#{$avatar-width} + 7px + #{$badge-left});
+		/* #endif */
+		width: $badge-size;
+		height: $badge-size;
+	}
+
+	.uni-badge--complex {
+		/* #ifdef APP-NVUE */
+		left: 50px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		width: auto;
+		/* #endif */
+		height: $badge-size;
+		padding: 0 $badge-space;
+	}
+
+	.uni-badge--dot {
+		/* #ifdef APP-NVUE */
+		left: 60px;
+		top: 6px;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		left: calc(#{$avatar-width} + 15px - #{$dot-width}/ 2 + 1px + #{$badge-left});
+		/* #endif */
+		width: $dot-width;
+		height: $dot-height;
+		padding: 0;
+	}
+
+	.uni-list-chat--right {
+		/* #ifdef APP-NVUE */
+		left: 0;
+		/* #endif */
+	}
+</style>
diff --git a/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue
new file mode 100644
index 0000000..a274ac8
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list-item/uni-list-item.vue
@@ -0,0 +1,534 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell :keep-scroll-position="keepScrollPosition">
+		<!-- #endif -->
+		<view :class="{ 'uni-list-item--disabled': disabled }" :style="{'background-color':customStyle.backgroundColor}"
+			:hover-class="(!clickable && !link) || disabled || showSwitch ? '' : 'uni-list-item--hover'"
+			class="uni-list-item" @click="onClick">
+			<view v-if="!isFirstChild" class="border--left" :class="{ 'uni-list--border': border }"></view>
+			<view class="uni-list-item__container"
+				:class="{ 'container--right': showArrow || link, 'flex--direction': direction === 'column'}"
+				:style="{paddingTop:padding.top,paddingLeft:padding.left,paddingRight:padding.right,paddingBottom:padding.bottom}">
+				<slot name="header">
+					<view class="uni-list-item__header">
+						<view v-if="thumb" class="uni-list-item__icon">
+							<image :src="thumb" class="uni-list-item__icon-img" :class="['uni-list--' + thumbSize]" />
+						</view>
+						<view v-else-if="showExtraIcon" class="uni-list-item__icon">
+							<uni-icons :customPrefix="extraIcon.customPrefix" :color="extraIcon.color" :size="extraIcon.size" :type="extraIcon.type" />
+						</view>
+					</view>
+				</slot>
+				<slot name="body">
+					<view class="uni-list-item__content"
+						:class="{ 'uni-list-item__content--center': thumb || showExtraIcon || showBadge || showSwitch }">
+						<text v-if="title" class="uni-list-item__content-title"
+							:class="[ellipsis !== 0 && ellipsis <= 2 ? 'uni-ellipsis-' + ellipsis : '']">{{ title }}</text>
+						<text v-if="note" class="uni-list-item__content-note">{{ note }}</text>
+					</view>
+				</slot>
+				<slot name="footer">
+					<view v-if="rightText || showBadge || showSwitch" class="uni-list-item__extra"
+						:class="{ 'flex--justify': direction === 'column' }">
+						<text v-if="rightText" class="uni-list-item__extra-text">{{ rightText }}</text>
+						<uni-badge v-if="showBadge" :type="badgeType" :text="badgeText" :custom-style="badgeStyle" />
+						<switch v-if="showSwitch" :disabled="disabled" :checked="switchChecked"
+							@change="onSwitchChange" />
+					</view>
+				</slot>
+			</view>
+			<uni-icons v-if="showArrow || link" :size="16" class="uni-icon-wrapper" color="#bbb" type="arrowright" />
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+	/**
+	 * ListItem 鍒楄〃瀛愮粍浠�
+	 * @description 鍒楄〃瀛愮粍浠�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+	 * @property {String} 	title 							鏍囬
+	 * @property {String} 	note 							鎻忚堪
+	 * @property {String} 	thumb 							宸︿晶缂╃暐鍥撅紝鑻humb鏈夊�硷紝鍒欎笉浼氭樉绀烘墿灞曞浘鏍�
+	 * @property {String}  	thumbSize = [lg|base|sm]		鐣ョ缉鍥惧ぇ灏�
+	 * 	@value 	 lg			澶у浘
+	 * 	@value 	 base		涓�鑸�
+	 * 	@value 	 sm			灏忓浘
+	 * @property {String} 	badgeText						鏁板瓧瑙掓爣鍐呭
+	 * @property {String} 	badgeType 						鏁板瓧瑙掓爣绫诲瀷锛屽弬鑰僛uni-icons](https://ext.dcloud.net.cn/plugin?id=21)
+	 * @property {Object}   badgeStyle           鏁板瓧瑙掓爣鏍峰紡
+	 * @property {String} 	rightText 						鍙充晶鏂囧瓧鍐呭
+	 * @property {Boolean} 	disabled = [true|false]			鏄惁绂佺敤
+	 * @property {Boolean} 	clickable = [true|false] 		鏄惁寮�鍚偣鍑诲弽棣�
+	 * @property {String} 	link = [navigateTo|redirectTo|reLaunch|switchTab] 鏄惁灞曠ず鍙充晶绠ご骞跺紑鍚偣鍑诲弽棣�
+	 *  @value 	navigateTo 	鍚� uni.navigateTo()
+	 * 	@value redirectTo 	鍚� uni.redirectTo()
+	 * 	@value reLaunch   	鍚� uni.reLaunch()
+	 * 	@value switchTab  	鍚� uni.switchTab()
+	 * @property {String | PageURIString} 	to  			璺宠浆鐩爣椤甸潰
+	 * @property {Boolean} 	showBadge = [true|false] 		鏄惁鏄剧ず鏁板瓧瑙掓爣
+	 * @property {Boolean} 	showSwitch = [true|false] 		鏄惁鏄剧ずSwitch
+	 * @property {Boolean} 	switchChecked = [true|false] 	Switch鏄惁琚�変腑
+	 * @property {Boolean} 	showExtraIcon = [true|false] 	宸︿晶鏄惁鏄剧ず鎵╁睍鍥炬爣
+	 * @property {Object} 	extraIcon 						鎵╁睍鍥炬爣鍙傛暟锛屾牸寮忎负 {color: '#4cd964',size: '22',type: 'spinner'}
+	 * @property {String} 	direction = [row|column]		鎺掔増鏂瑰悜
+	 * @value row 			姘村钩鎺掑垪
+	 * @value column 		鍨傜洿鎺掑垪
+	 * @event {Function} 	click 							鐐瑰嚮 uniListItem 瑙﹀彂浜嬩欢
+	 * @event {Function} 	switchChange 					鐐瑰嚮鍒囨崲 Switch 鏃惰Е鍙�
+	 */
+	export default {
+		name: 'UniListItem',
+		emits: ['click', 'switchChange'],
+		props: {
+			direction: {
+				type: String,
+				default: 'row'
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			note: {
+				type: String,
+				default: ''
+			},
+			ellipsis: {
+				type: [Number, String],
+				default: 0
+			},
+			disabled: {
+				type: [Boolean, String],
+				default: false
+			},
+			clickable: {
+				type: Boolean,
+				default: false
+			},
+			showArrow: {
+				type: [Boolean, String],
+				default: false
+			},
+			link: {
+				type: [Boolean, String],
+				default: false
+			},
+			to: {
+				type: String,
+				default: ''
+			},
+			showBadge: {
+				type: [Boolean, String],
+				default: false
+			},
+			showSwitch: {
+				type: [Boolean, String],
+				default: false
+			},
+			switchChecked: {
+				type: [Boolean, String],
+				default: false
+			},
+			badgeText: {
+				type: String,
+				default: ''
+			},
+			badgeType: {
+				type: String,
+				default: 'success'
+			},
+			badgeStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			rightText: {
+				type: String,
+				default: ''
+			},
+			thumb: {
+				type: String,
+				default: ''
+			},
+			thumbSize: {
+				type: String,
+				default: 'base'
+			},
+			showExtraIcon: {
+				type: [Boolean, String],
+				default: false
+			},
+			extraIcon: {
+				type: Object,
+				default () {
+					return {
+						type: '',
+						color: '#000000',
+						size: 20,
+						customPrefix: ''
+					};
+				}
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			customStyle: {
+				type: Object,
+				default () {
+					return {
+						padding: '',
+						backgroundColor: '#FFFFFF'
+					}
+				}
+			},
+			keepScrollPosition: {
+				type: Boolean,
+				default: false
+			}
+		},
+		watch: {
+			'customStyle.padding': {
+				handler(padding) {
+					if(typeof padding == 'number'){
+						padding += ''
+					}
+					let paddingArr = padding.split(' ')
+					if (paddingArr.length === 1) {
+						const allPadding = paddingArr[0]
+						this.padding = {
+							"top": allPadding,
+							"right": allPadding,
+							"bottom": allPadding,
+							"left": allPadding
+						}
+					} else if (paddingArr.length === 2) {
+						const [verticalPadding, horizontalPadding] = paddingArr;
+						this.padding = {
+							"top": verticalPadding,
+							"right": horizontalPadding,
+							"bottom": verticalPadding,
+							"left": horizontalPadding
+						}
+					} else if (paddingArr.length === 4) {
+							const [topPadding, rightPadding, bottomPadding, leftPadding] = paddingArr;
+							this.padding = {
+								"top": topPadding,
+								"right": rightPadding,
+								"bottom": bottomPadding,
+								"left": leftPadding
+							}
+					}
+				},
+				immediate: true
+			}
+		},
+		// inject: ['list'],
+		data() {
+			return {
+				isFirstChild: false,
+				padding: {
+					top: "",
+					right: "",
+					bottom: "",
+					left: ""
+				}
+			};
+		},
+		mounted() {
+			this.list = this.getForm()
+			// 鍒ゆ柇鏄惁瀛樺湪 uni-list 缁勪欢
+			if (this.list) {
+				if (!this.list.firstChildAppend) {
+					this.list.firstChildAppend = true;
+					this.isFirstChild = true;
+				}
+			}
+		},
+		methods: {
+			/**
+			 * 鑾峰彇鐖跺厓绱犲疄渚�
+			 */
+			getForm(name = 'uniList') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			onClick() {
+				if (this.to !== '') {
+					this.openPage();
+					return;
+				}
+				if (this.clickable || this.link) {
+					this.$emit('click', {
+						data: {}
+					});
+				}
+			},
+			onSwitchChange(e) {
+				this.$emit('switchChange', e.detail);
+			},
+			openPage() {
+				if (['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].indexOf(this.link) !== -1) {
+					this.pageApi(this.link);
+				} else {
+					this.pageApi('navigateTo');
+				}
+			},
+			pageApi(api) {
+				let callback = {
+					url: this.to,
+					success: res => {
+						this.$emit('click', {
+							data: res
+						});
+					},
+					fail: err => {
+						this.$emit('click', {
+							data: err
+						});
+					}
+				}
+				switch (api) {
+					case 'navigateTo':
+						uni.navigateTo(callback)
+						break
+					case 'redirectTo':
+						uni.redirectTo(callback)
+						break
+					case 'reLaunch':
+						uni.reLaunch(callback)
+						break
+					case 'switchTab':
+						uni.switchTab(callback)
+						break
+					default:
+						uni.navigateTo(callback)
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	$uni-font-size-sm:12px;
+	$uni-font-size-base:14px;
+	$uni-font-size-lg:16px;
+	$uni-spacing-col-lg: 12px;
+	$uni-spacing-row-lg: 15px;
+	$uni-img-size-sm:20px;
+	$uni-img-size-base:26px;
+	$uni-img-size-lg:40px;
+	$uni-border-color:#e5e5e5;
+	$uni-bg-color-hover:#f1f1f1;
+	$uni-text-color-grey:#999;
+	$list-item-pd: $uni-spacing-col-lg $uni-spacing-row-lg;
+
+	.uni-list-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		font-size: $uni-font-size-lg;
+		position: relative;
+		justify-content: space-between;
+		align-items: center;
+		background-color: #fff;
+		flex-direction: row;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-list-item--disabled {
+		opacity: 0.3;
+	}
+
+	.uni-list-item--hover {
+		background-color: $uni-bg-color-hover !important;
+	}
+
+	.uni-list-item__container {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		padding: $list-item-pd;
+		padding-left: $uni-spacing-row-lg;
+		flex: 1;
+		overflow: hidden;
+		// align-items: center;
+	}
+
+	.container--right {
+		padding-right: 0;
+	}
+
+	// .border--left {
+	// 	margin-left: $uni-spacing-row-lg;
+	// }
+	.uni-list--border {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		/* #ifdef APP-NVUE */
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border:after {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: '';
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: $uni-border-color;
+	}
+
+	/* #endif */
+	.uni-list-item__content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		padding-right: 8px;
+		flex: 1;
+		color: #3b4144;
+		// overflow: hidden;
+		flex-direction: column;
+		justify-content: space-between;
+		overflow: hidden;
+	}
+
+	.uni-list-item__content--center {
+		justify-content: center;
+	}
+
+	.uni-list-item__content-title {
+		font-size: $uni-font-size-base;
+		color: #3b4144;
+		overflow: hidden;
+	}
+
+	.uni-list-item__content-note {
+		margin-top: 6rpx;
+		color: $uni-text-color-grey;
+		font-size: $uni-font-size-sm;
+		overflow: hidden;
+	}
+
+	.uni-list-item__extra {
+		// width: 25%;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: flex-end;
+		align-items: center;
+	}
+
+	.uni-list-item__header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-list-item__icon {
+		margin-right: 18rpx;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-list-item__icon-img {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		height: $uni-img-size-base;
+		width: $uni-img-size-base;
+		margin-right: 10px;
+	}
+
+	.uni-icon-wrapper {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		padding: 0 10px;
+	}
+
+	.flex--direction {
+		flex-direction: column;
+		/* #ifndef APP-NVUE */
+		align-items: initial;
+		/* #endif */
+	}
+
+	.flex--justify {
+		/* #ifndef APP-NVUE */
+		justify-content: initial;
+		/* #endif */
+	}
+
+	.uni-list--lg {
+		height: $uni-img-size-lg;
+		width: $uni-img-size-lg;
+	}
+
+	.uni-list--base {
+		height: $uni-img-size-base;
+		width: $uni-img-size-base;
+	}
+
+	.uni-list--sm {
+		height: $uni-img-size-sm;
+		width: $uni-img-size-sm;
+	}
+
+	.uni-list-item__extra-text {
+		color: $uni-text-color-grey;
+		font-size: $uni-font-size-sm;
+	}
+
+	.uni-ellipsis-1 {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		text-overflow: ellipsis;
+		/* #endif */
+	}
+
+	.uni-ellipsis-2 {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 2;
+		text-overflow: ellipsis;
+		/* #endif */
+	}
+</style>
\ No newline at end of file
diff --git a/uni_modules/uni-list/components/uni-list/uni-list.vue b/uni_modules/uni-list/components/uni-list/uni-list.vue
new file mode 100644
index 0000000..6ef5972
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list/uni-list.vue
@@ -0,0 +1,123 @@
+<template>
+	<!-- #ifndef APP-NVUE -->
+	<view class="uni-list uni-border-top-bottom">
+		<view v-if="border" class="uni-list--border-top"></view>
+		<slot />
+		<view v-if="border" class="uni-list--border-bottom"></view>
+	</view>
+	<!-- #endif -->
+	<!-- #ifdef APP-NVUE -->
+	<list :bounce="false" :scrollable="true" show-scrollbar :render-reverse="renderReverse" @scroll="scroll" class="uni-list" :class="{ 'uni-list--border': border }" :enableBackToTop="enableBackToTop"
+		loadmoreoffset="15">
+		<slot />
+	</list>
+	<!-- #endif -->
+</template>
+
+<script>
+	/**
+	 * List 鍒楄〃
+	 * @description 鍒楄〃缁勪欢
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+	 * @property {String} 	border = [true|false] 		鏍囬
+	 */
+	export default {
+		name: 'uniList',
+		'mp-weixin': {
+			options: {
+				multipleSlots: false
+			}
+		},
+		props: {
+			stackFromEnd:{
+				type: Boolean,
+				default:false
+			},
+			enableBackToTop: {
+				type: [Boolean, String],
+				default: false
+			},
+			scrollY: {
+				type: [Boolean, String],
+				default: false
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			renderReverse:{
+				type: Boolean,
+				default: false
+			}
+		},
+		// provide() {
+		// 	return {
+		// 		list: this
+		// 	};
+		// },
+		created() {
+			this.firstChildAppend = false;
+		},
+		methods: {
+			loadMore(e) {
+				this.$emit('scrolltolower');
+			},
+			scroll(e) {
+				this.$emit('scroll', e);
+			}
+		}
+	};
+</script>
+<style lang="scss">
+	$uni-bg-color:#ffffff;
+	$uni-border-color:#e5e5e5;
+
+	.uni-list {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		background-color: $uni-bg-color;
+		position: relative;
+		flex-direction: column;
+	}
+
+	.uni-list--border {
+		position: relative;
+		/* #ifdef APP-NVUE */
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		border-bottom-color: $uni-border-color;
+		border-bottom-style: solid;
+		border-bottom-width: 0.5px;
+		/* #endif */
+		z-index: -1;
+	}
+
+	/* #ifndef APP-NVUE */
+
+	.uni-list--border-top {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: $uni-border-color;
+		z-index: 1;
+	}
+
+	.uni-list--border-bottom {
+		position: absolute;
+		bottom: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: $uni-border-color;
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.vue b/uni_modules/uni-list/components/uni-list/uni-refresh.vue
new file mode 100644
index 0000000..3b4c5a2
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list/uni-refresh.vue
@@ -0,0 +1,65 @@
+<template>
+    <!-- #ifdef APP-NVUE -->
+    <refresh :display="display" @refresh="onrefresh" @pullingdown="onpullingdown">
+        <slot />
+    </refresh>
+    <!-- #endif -->
+    <!-- #ifndef APP-NVUE -->
+    <view ref="uni-refresh" class="uni-refresh" v-show="isShow">
+        <slot />
+    </view>
+    <!-- #endif -->
+</template>
+
+<script>
+    export default {
+        name: 'UniRefresh',
+        props: {
+            display: {
+                type: [String],
+                default: "hide"
+            }
+        },
+        data() {
+            return {
+                pulling: false
+            }
+        },
+        computed: {
+            isShow() {
+                if (this.display === "show" || this.pulling === true) {
+                    return true;
+                }
+                return false;
+            }
+        },
+        created() {},
+        methods: {
+            onchange(value) {
+                this.pulling = value;
+            },
+            onrefresh(e) {
+                this.$emit("refresh", e);
+            },
+            onpullingdown(e) {
+                // #ifdef APP-NVUE
+                this.$emit("pullingdown", e);
+                // #endif
+                // #ifndef APP-NVUE
+                var detail = {
+                    viewHeight: 90,
+                    pullingDistance: e.height
+                }
+                this.$emit("pullingdown", detail);
+                // #endif
+            }
+        }
+    }
+</script>
+
+<style>
+    .uni-refresh {
+        height: 0;
+        overflow: hidden;
+    }
+</style>
diff --git a/uni_modules/uni-list/components/uni-list/uni-refresh.wxs b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs
new file mode 100644
index 0000000..818a6b7
--- /dev/null
+++ b/uni_modules/uni-list/components/uni-list/uni-refresh.wxs
@@ -0,0 +1,87 @@
+var pullDown = {
+    threshold: 95,
+    maxHeight: 200,
+    callRefresh: 'onrefresh',
+    callPullingDown: 'onpullingdown',
+    refreshSelector: '.uni-refresh'
+};
+
+function ready(newValue, oldValue, ownerInstance, instance) {
+    var state = instance.getState()
+    state.canPullDown = newValue;
+    // console.log(newValue);
+}
+
+function touchStart(e, instance) {
+    var state = instance.getState();
+    state.refreshInstance = instance.selectComponent(pullDown.refreshSelector);
+    state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined);
+    if (!state.canPullDown) {
+        return
+    }
+
+    // console.log("touchStart");
+
+    state.height = 0;
+    state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY;
+    state.refreshInstance.setStyle({
+        'height': 0
+    });
+    state.refreshInstance.callMethod("onchange", true);
+}
+
+function touchMove(e, ownerInstance) {
+    var instance = e.instance;
+    var state = instance.getState();
+    if (!state.canPullDown) {
+        return
+    }
+
+    var oldHeight = state.height;
+    var endY = e.touches[0].pageY || e.changedTouches[0].pageY;
+    var height = endY - state.touchStartY;
+    if (height > pullDown.maxHeight) {
+        return;
+    }
+
+    var refreshInstance = state.refreshInstance;
+    refreshInstance.setStyle({
+        'height': height + 'px'
+    });
+
+    height = height < pullDown.maxHeight ? height : pullDown.maxHeight;
+    state.height = height;
+    refreshInstance.callMethod(pullDown.callPullingDown, {
+        height: height
+    });
+}
+
+function touchEnd(e, ownerInstance) {
+    var state = e.instance.getState();
+    if (!state.canPullDown) {
+        return
+    }
+
+    state.refreshInstance.callMethod("onchange", false);
+
+    var refreshInstance = state.refreshInstance;
+    if (state.height > pullDown.threshold) {
+        refreshInstance.callMethod(pullDown.callRefresh);
+        return;
+    }
+
+    refreshInstance.setStyle({
+        'height': 0
+    });
+}
+
+function propObserver(newValue, oldValue, instance) {
+    pullDown = newValue;
+}
+
+module.exports = {
+    touchmove: touchMove,
+    touchstart: touchStart,
+    touchend: touchEnd,
+    propObserver: propObserver
+}
diff --git a/uni_modules/uni-list/package.json b/uni_modules/uni-list/package.json
new file mode 100644
index 0000000..8350efc
--- /dev/null
+++ b/uni_modules/uni-list/package.json
@@ -0,0 +1,88 @@
+{
+  "id": "uni-list",
+  "displayName": "uni-list 鍒楄〃",
+  "version": "1.2.14",
+  "description": "List 缁勪欢 锛屽府鍔╀娇鐢ㄨ�呭揩閫熸瀯寤哄垪琛ㄣ��",
+  "keywords": [
+    "",
+    "uni-ui",
+    "uniui",
+    "鍒楄〃",
+    "",
+    "list"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+      "uni-badge",
+      "uni-icons"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-list/readme.md b/uni_modules/uni-list/readme.md
new file mode 100644
index 0000000..32c2865
--- /dev/null
+++ b/uni_modules/uni-list/readme.md
@@ -0,0 +1,346 @@
+## List 鍒楄〃
+> **缁勪欢鍚嶏細uni-list**
+> 浠g爜鍧楋細 `uList`銆乣uListItem`
+> 鍏宠仈缁勪欢锛歚uni-list-item`銆乣uni-badge`銆乣uni-icons`銆乣uni-list-chat`銆乣uni-list-ad`
+
+
+List 鍒楄〃缁勪欢锛屽寘鍚熀鏈垪琛ㄦ牱寮忋�佸彲鎵╁睍鎻掓Ы鏈哄埗銆侀暱鍒楄〃鎬ц兘浼樺寲銆佸绔吋瀹广��
+
+鍦╲ue椤甸潰閲岋紝瀹冮粯璁や娇鐢ㄩ〉闈㈢骇婊氬姩銆傚湪app-nvue椤甸潰閲岋紝瀹冮粯璁や娇鐢ㄥ師鐢焞ist缁勪欢婊氬姩銆傝繖鏍风殑闀垮垪琛紝鍦ㄦ粴鍔ㄥ嚭灞忓箷澶栧悗锛岀郴缁熶細鍥炴敹涓嶅彲瑙佸尯鍩熺殑娓叉煋鍐呭瓨璧勬簮锛屼笉浼氶�犳垚婊氬姩瓒婇暱鎵嬫満瓒婂崱鐨勯棶棰樸��
+
+uni-list缁勪欢鏄埗瀹瑰櫒锛岄噷闈㈢殑鏍稿績鏄痷ni-list-item瀛愮粍浠讹紝瀹冧唬琛ㄥ垪琛ㄤ腑鐨勪竴涓彲閲嶅琛岋紝瀛愮粍浠跺彲浠ユ棤闄愬惊鐜��
+
+uni-list-item鏈夊緢澶氶鏍硷紝uni-list-item缁勪欢閫氳繃鍐呯疆鐨勫睘鎬э紝婊¤冻涓�浜涘父鐢ㄧ殑鍦烘櫙銆傚綋鍐呯疆灞炴�т笉婊¤冻闇�姹傛椂锛屽彲浠ラ�氳繃鎵╁睍鎻掓Ы鏉ヨ嚜瀹氫箟鍒楄〃鍐呭銆�
+
+鍐呯疆灞炴�у彲浠ヨ鐩栫殑鍦烘櫙鍖呮嫭锛氬鑸垪琛ㄣ�佽缃垪琛ㄣ�佸皬鍥炬爣鍒楄〃銆侀�氫俊褰曞垪琛ㄣ�佽亰澶╄褰曞垪琛ㄣ��
+
+娑夊強寰堝澶у浘鎴栦赴瀵屽唴瀹圭殑鍒楄〃锛屾瘮濡傜被浠婃棩澶存潯鐨勬柊闂诲垪琛ㄣ�佺被娣樺疂鐨勭數鍟嗗垪琛紝闇�瑕侀�氳繃鎵╁睍鎻掓Ы瀹炵幇銆�
+
+涓嬫枃鍧囨湁鏍蜂緥缁欏嚭銆�
+
+uni-list涓嶅寘鍚笅鎷夊埛鏂板拰涓婃媺缈婚〉銆備笂鎷夌炕椤靛彟瑙佺粍浠讹細[uni-load-more](https://ext.dcloud.net.cn/plugin?id=29)
+
+
+### 瀹夎鏂瑰紡
+
+鏈粍浠剁鍚圼easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)瑙勮寖锛宍HBuilderX 2.5.5`璧凤紝鍙渶灏嗘湰缁勪欢瀵煎叆椤圭洰锛屽湪椤甸潰`template`涓嵆鍙洿鎺ヤ娇鐢紝鏃犻渶鍦ㄩ〉闈腑`import`鍜屾敞鍐宍components`銆�
+
+濡傞渶閫氳繃`npm`鏂瑰紡浣跨敤`uni-ui`缁勪欢锛屽彟瑙佹枃妗o細[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55)
+
+> **娉ㄦ剰浜嬮」**
+> 涓轰簡閬垮厤閿欒浣跨敤锛岀粰澶у甯︽潵涓嶅ソ鐨勫紑鍙戜綋楠岋紝璇峰湪浣跨敤缁勪欢鍓嶄粩缁嗛槄璇讳笅闈㈢殑娉ㄦ剰浜嬮」锛屽彲浠ュ府浣犻伩鍏嶄竴浜涢敊璇��
+> - 缁勪欢闇�瑕佷緷璧� `sass` 鎻掍欢 锛岃鑷鎵嬪姩瀹夎
+> - 缁勪欢鍐呴儴渚濊禆 `'uni-icons'` 銆乣uni-badge` 缁勪欢
+> - `uni-list` 鍜� `uni-list-item` 闇�瑕侀厤濂椾娇鐢紝鏆備笉鏀寔鍗曠嫭浣跨敤 `uni-list-item`
+> - 鍙湁寮�鍚偣鍑诲弽棣堝悗锛屼細鏈夌偣鍑婚�変腑鏁堟灉
+> - 浣跨敤鎻掓Ы鏃讹紝鍙互瀹屽叏鑷畾涔夊唴瀹�
+> - note 銆乺ightText 灞炴�ф殏鏃舵病鍋氶檺鍒讹紝涓嶆敮鎸佹枃瀛楁孩鍑洪殣钘忥紝浣跨敤鏃跺簲璇ユ帶鍒堕暱搴︽樉绀烘垨閫氳繃榛樿鎻掓Ы鑷鎵╁睍
+> - 鏀粯瀹濆皬绋嬪簭骞冲彴闇�瑕佸湪鏀粯瀹濆皬绋嬪簭寮�鍙戣�呭伐鍏烽噷寮�鍚� component2 缂栬瘧妯″紡锛屽紑鍚柟寮忥細 璇︽儏 --> 椤圭洰閰嶇疆 --> 鍚敤 component2 缂栬瘧
+> - 濡傛灉闇�瑕佷慨鏀� `switch`銆乣badge` 鏍峰紡锛岃浣跨敤鎻掓Ы鑷畾涔�
+> - 鍦� `HBuilderX` 浣庣増鏈腑锛屽彲鑳戒細鍑虹幇缁勪欢鏄剧ず `undefined` 鐨勯棶棰橈紝璇峰崌绾ф渶鏂扮殑 `HBuilderX` 鎴栬�� `cli`
+> - 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839
+ 
+
+### 鍩烘湰鐢ㄦ硶 
+
+- 璁剧疆 `title` 灞炴�э紝鍙互鏄剧ず鍒楄〃鏍囬
+- 璁剧疆 `disabled` 灞炴�э紝鍙互绂佺敤褰撳墠椤�
+
+```html
+<uni-list>
+	<uni-list-item  title="鍒楄〃鏂囧瓧" ></uni-list-item>
+	<uni-list-item :disabled="true" title="鍒楄〃绂佺敤鐘舵��" ></uni-list-item>
+</uni-list>
+			 
+```
+
+### 澶氳鍐呭鏄剧ず
+
+- 璁剧疆 `note` 灞炴�� 锛屽彲浠ュ湪绗簩琛屾樉绀烘弿杩版枃鏈俊鎭�
+
+```html
+<uni-list>
+	<uni-list-item title="鍒楄〃鏂囧瓧" note="鍒楄〃鎻忚堪淇℃伅"></uni-list-item>
+	<uni-list-item :disabled="true" title="鍒楄〃鏂囧瓧" note="鍒楄〃绂佺敤鐘舵��"></uni-list-item>
+</uni-list>
+
+```
+
+### 鍙充晶鏄剧ず瑙掓爣銆乻witch
+
+- 璁剧疆 `show-badge` 灞炴�� 锛屽彲浠ユ樉绀鸿鏍囧唴瀹�
+- 璁剧疆 `show-switch` 灞炴�э紝鍙互鏄剧ず switch 寮�鍏�
+
+```html
+<uni-list>
+	<uni-list-item  title="鍒楄〃鍙充晶鏄剧ず瑙掓爣" :show-badge="true" badge-text="12" ></uni-list-item>
+	<uni-list-item title="鍒楄〃鍙充晶鏄剧ず switch"  :show-switch="true"  @switchChange="switchChange" ></uni-list-item>
+</uni-list>
+
+```
+
+### 宸︿晶鏄剧ず鐣ョ缉鍥俱�佸浘鏍�  
+
+- 璁剧疆 `thumb` 灞炴�� 锛屽彲浠ュ湪鍒楄〃宸︿晶鏄剧ず鐣ョ缉鍥�
+- 璁剧疆 `show-extra-icon` 灞炴�э紝骞舵寚瀹� `extra-icon` 鍙互鍦ㄥ乏渚ф樉绀哄浘鏍�
+
+```html
+ <uni-list>
+ 	<uni-list-item title="鍒楄〃宸︿晶甯︾暐缂╁浘" note="鍒楄〃鎻忚堪淇℃伅" thumb="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png"
+ 	 thumb-size="lg" rightText="鍙充晶鏂囧瓧"></uni-list-item>
+ 	<uni-list-item :show-extra-icon="true" :extra-icon="extraIcon1" title="鍒楄〃宸︿晶甯︽墿灞曞浘鏍�" ></uni-list-item>
+</uni-list>
+```
+
+### 寮�鍚偣鍑诲弽棣堝拰鍙充晶绠ご
+- 璁剧疆 `clickable` 涓� `true` 锛屽垯琛ㄧず杩欐槸涓�涓彲鐐瑰嚮鐨勫垪琛紝浼氶粯璁ょ粰涓�涓偣鍑绘晥鏋滐紝骞跺彲浠ョ洃鍚� `click` 浜嬩欢
+- 璁剧疆 `link` 灞炴�э紝浼氳嚜鍔ㄥ紑鍚偣鍑诲弽棣堬紝骞剁粰鍒楄〃鍙充晶娣诲姞涓�涓澶�
+- 璁剧疆 `to` 灞炴�э紝鍙互璺宠浆椤甸潰锛宍link` 鐨勫�艰〃绀鸿烦杞柟寮忥紝濡傛灉涓嶆寚瀹氾紝榛樿涓� `navigateTo`
+
+```html
+
+<uni-list>
+	<uni-list-item title="寮�鍚偣鍑诲弽棣�" clickable  @click="onClick" ></uni-list-item>
+	<uni-list-item title="榛樿 navigateTo 鏂瑰紡璺宠浆椤甸潰" link to="/pages/vue/index/index" @click="onClick($event,1)" ></uni-list-item>
+	<uni-list-item title="reLaunch 鏂瑰紡璺宠浆椤甸潰" link="reLaunch" to="/pages/vue/index/index" @click="onClick($event,1)" ></uni-list-item>
+</uni-list>
+
+```
+
+
+### 鑱婂ぉ鍒楄〃绀轰緥
+- 璁剧疆 `clickable` 涓� `true` 锛屽垯琛ㄧず杩欐槸涓�涓彲鐐瑰嚮鐨勫垪琛紝浼氶粯璁ょ粰涓�涓偣鍑绘晥鏋滐紝骞跺彲浠ョ洃鍚� `click` 浜嬩欢
+- 璁剧疆 `link` 灞炴�э紝浼氳嚜鍔ㄥ紑鍚偣鍑诲弽棣堬紝`link` 鐨勫�艰〃绀鸿烦杞柟寮忥紝濡傛灉涓嶆寚瀹氾紝榛樿涓� `navigateTo`
+- 璁剧疆 `to` 灞炴�э紝鍙互璺宠浆椤甸潰
+- `time` 灞炴�э紝閫氬父浼氳缃垚鏃堕棿鏄剧ず锛屼絾鏄繖涓睘鎬т笉浠呬粎鍙互璁剧疆鏃堕棿锛屼綘鍙互浼犲叆浠讳綍鏂囨湰锛屾敞鎰忔枃鏈暱搴﹀彲鑳戒細褰卞搷鏄剧ず
+- `avatar` 鍜� `avatarList` 灞炴�у悓鏃跺彧浼氭湁涓�涓敓鏁堬紝鍚屾椂璁剧疆鐨勮瘽锛宍avatarList` 灞炴�х殑闀垮害澶т簬1 锛宍avatar` 灞炴�у皢澶辨晥
+- 鍙互閫氳繃榛樿鎻掓Ы鑷畾涔夊垪琛ㄥ彸渚у唴瀹�
+
+```html
+
+<uni-list>
+	<uni-list :border="true">
+		<!-- 鏄剧ず鍦嗗舰澶村儚 -->
+		<uni-list-chat :avatar-circle="true" title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="鎮ㄦ敹鍒颁竴鏉℃柊鐨勬秷鎭�" time="2020-02-02 20:20" ></uni-list-chat>
+		<!-- 鍙充晶甯﹁鏍� -->
+		<uni-list-chat title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="鎮ㄦ敹鍒颁竴鏉℃柊鐨勬秷鎭�" time="2020-02-02 20:20" badge-text="12" :badge-style="{backgroundColor:'#FF80AB'}"></uni-list-chat>
+		<!-- 澶村儚鏄剧ず鍦嗙偣 -->
+		<uni-list-chat title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="鎮ㄦ敹鍒颁竴鏉℃柊鐨勬秷鎭�" time="2020-02-02 20:20" badge-positon="left" badge-text="dot"></uni-list-chat>
+		<!-- 澶村儚鏄剧ず瑙掓爣 -->
+		<uni-list-chat title="uni-app" avatar="https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png" note="鎮ㄦ敹鍒颁竴鏉℃柊鐨勬秷鎭�" time="2020-02-02 20:20" badge-positon="left" badge-text="99"></uni-list-chat>
+		<!-- 鏄剧ず澶氬ご鍍� -->
+		<uni-list-chat title="uni-app" :avatar-list="avatarList" note="鎮ㄦ敹鍒颁竴鏉℃柊鐨勬秷鎭�" time="2020-02-02 20:20" badge-positon="left" badge-text="dot"></uni-list-chat>
+		<!-- 鑷畾涔夊彸渚у唴瀹� -->
+		<uni-list-chat title="uni-app" :avatar-list="avatarList" note="鎮ㄦ敹鍒颁竴鏉℃柊鐨勬秷鎭�" time="2020-02-02 20:20" badge-positon="left" badge-text="dot">
+			<view class="chat-custom-right">
+				<text class="chat-custom-text">鍒氬垰</text>
+				<!-- 闇�瑕佷娇鐢� uni-icons 璇疯嚜琛屽紩鍏� -->
+				<uni-icons type="star-filled" color="#999" size="18"></uni-icons>
+			</view>
+		</uni-list-chat>
+	</uni-list>
+</uni-list>
+
+```
+
+```javascript
+
+export default {
+	components: {},
+	data() {
+		return {
+			avatarList: [{
+				url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png'
+			}, {
+				url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png'
+			}, {
+				url: 'https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/460d46d0-4fcc-11eb-8ff1-d5dcf8779628.png'
+			}]
+		}
+	}
+}
+
+```
+
+
+```css
+
+.chat-custom-right {
+	flex: 1;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	justify-content: space-between;
+	align-items: flex-end;
+}
+
+.chat-custom-text {
+	font-size: 12px;
+	color: #999;
+}
+
+```
+
+## API
+
+### List Props
+
+灞炴�у悕			|绫诲瀷		|榛樿鍊�		|	璇存槑																									
+:-:				|:-:		|:-:		|	:-:	
+border			|Boolean	|true		|	鏄惁鏄剧ず杈规
+
+
+### ListItem Props
+
+灞炴�у悕			|绫诲瀷		|榛樿鍊�		|	璇存槑																					
+:-:				|:-:		|:-:		|	:-:	
+title			|String		|-			|	鏍囬
+note			|String		|-			|	鎻忚堪
+ellipsis		|Number		|0			|	title 鏄惁婧㈠嚭闅愯棌锛屽彲閫夊�硷紝0:榛樿;  1:鏄剧ず涓�琛�;	2:鏄剧ず涓よ;銆恘vue 鏆備笉鏀寔銆�
+thumb			|String		|-			|	宸︿晶缂╃暐鍥撅紝鑻humb鏈夊�硷紝鍒欎笉浼氭樉绀烘墿灞曞浘鏍�
+thumbSize		|String 	|medium 	|	鐣ョ缉鍥惧昂瀵革紝鍙�夊�硷紝lg:澶у浘;  medium:涓�鑸�;	sm:灏忓浘;
+showBadge		|Boolean	|false		|	鏄惁鏄剧ず鏁板瓧瑙掓爣	
+badgeText		|String		|-			|	鏁板瓧瑙掓爣鍐呭
+badgeType		|String		|-			|	鏁板瓧瑙掓爣绫诲瀷锛屽弬鑰僛uni-icons](https://ext.dcloud.net.cn/plugin?id=21)	
+badgeStyle  |Object   |-      | 鏁板瓧瑙掓爣鏍峰紡锛屼娇鐢╱ni-badge鐨刢ustom-style鍙傛暟
+rightText		|String		|-			|	鍙充晶鏂囧瓧鍐呭
+disabled		|Boolean	|false		|	鏄惁绂佺敤	
+showArrow 		|Boolean	|true		|	鏄惁鏄剧ず绠ご鍥炬爣			
+link			|String 	|navigateTo	|	鏂伴〉闈㈣烦杞柟寮忥紝鍙�夊�艰涓嬭〃
+to				|String		|-			|	鏂伴〉闈㈣烦杞湴鍧�锛屽濉啓姝ゅ睘鎬э紝click 浼氳繑鍥為〉闈㈡槸鍚﹁烦杞垚鍔�			
+clickable		|Boolean	|false		|	鏄惁寮�鍚偣鍑诲弽棣�
+showSwitch	    |Boolean	|false		|	鏄惁鏄剧ずSwitch																			
+switchChecked	|Boolean	|false		|	Switch鏄惁琚�変腑																			
+showExtraIcon   |Boolean	|false		|	宸︿晶鏄惁鏄剧ず鎵╁睍鍥炬爣																		
+extraIcon		|Object		|-			|	鎵╁睍鍥炬爣鍙傛暟锛屾牸寮忎负 ``{color: '#4cd964',size: '22',type: 'spinner'}``锛屽弬鑰� [uni-icons](https://ext.dcloud.net.cn/plugin?id=28)	
+direction		| String	|row		|	鎺掔増鏂瑰悜锛屽彲閫夊�硷紝row:姘村钩鎺掑垪;  column:鍨傜洿鎺掑垪; 3涓彃妲芥槸姘村钩鎺掕繕鏄瀭鐩存帓锛屼篃鍙楁灞炴�ф帶鍒�
+
+
+#### Link Options
+
+灞炴�у悕				|	璇存槑
+:-:					|	:-:
+navigateTo 	| 	鍚� uni.navigateTo()
+redirectTo 	|	鍚� uni.reLaunch()
+reLaunch		|	鍚� uni.reLaunch()
+switchTab  	|	鍚� uni.switchTab()
+
+### ListItem Events
+
+浜嬩欢绉板悕			|璇存槑									|杩斿洖鍙傛暟			
+:-:				|:-:									|:-:				
+click			|鐐瑰嚮 uniListItem 瑙﹀彂浜嬩欢锛岄渶寮�鍚偣鍑诲弽棣�	|-					
+switchChange	|鐐瑰嚮鍒囨崲 Switch 鏃惰Е鍙戯紝闇�鏄剧ず switch		|e={value:checked}	
+
+
+
+### ListItem Slots
+
+鍚嶇О	 	|	璇存槑					
+:-:		|	:-:						
+header	|	宸�/涓婂唴瀹规彃妲斤紝鍙畬鍏ㄨ嚜瀹氫箟榛樿鏄剧ず
+body	|	涓棿鍐呭鎻掓Ы锛屽彲瀹屽叏鑷畾涔変腑闂村唴瀹�				
+footer	|	鍙�/涓嬪唴瀹规彃妲斤紝鍙畬鍏ㄨ嚜瀹氫箟鍙充晶鍐呭		
+
+
+> **閫氳繃鎻掓Ы鎵╁睍**
+> 闇�瑕佹敞鎰忕殑鏄綋浣跨敤鎻掓Ы鏃讹紝鍐呯疆鏍峰紡灏嗕細澶辨晥锛屽彧淇濈暀鎺掔増鏍峰紡锛屾鏃剁殑鏍峰紡闇�瑕佸紑鍙戣�呰嚜宸卞疄鐜�
+> 濡傛灉	`uni-list-item` 缁勪欢鍐呯疆灞炴�ф牱寮忔棤娉曟弧瓒抽渶姹傦紝鍙互浣跨敤鎻掓Ы鏉ヨ嚜瀹氫箟uni-list-item閲岀殑鍐呭銆�
+> uni-list-item鎻愪緵浜�3涓彲鎵╁睍鐨勬彃妲斤細`header`銆乣body`銆乣footer`
+> - 褰� `direction` 灞炴�т负 `row` 鏃惰〃绀烘按骞虫帓鍒楋紝姝ゆ椂 `header` 琛ㄧず鍒楄〃鐨勫乏杈归儴鍒嗭紝`body` 琛ㄧず鍒楄〃鐨勪腑闂撮儴鍒嗭紝`footer` 琛ㄧず鍒楄〃鐨勫彸杈归儴鍒�
+> - 褰� `direction` 灞炴�т负 `column` 鏃惰〃绀哄瀭鐩存帓鍒楋紝姝ゆ椂 `header` 琛ㄧず鍒楄〃鐨勪笂杈归儴鍒嗭紝`body` 琛ㄧず鍒楄〃鐨勪腑闂撮儴鍒嗭紝`footer` 琛ㄧず鍒楄〃鐨勪笅杈归儴鍒�
+> 寮�鍙戣�呭彲浠ュ彧鐢�1涓彃妲斤紝涔熷彲浠�3涓竴璧蜂娇鐢ㄣ�傚湪鎻掓Ы涓彲鑷富缂栧啓view鏍囩锛屽疄鐜拌嚜宸辨墍闇�鐨勬晥鏋溿��
+
+	
+**绀轰緥**
+
+```html
+<uni-list>
+	<uni-list-item title="鑷畾涔夊彸渚ф彃妲�" note="鍒楄〃鎻忚堪淇℃伅" link>
+		<template slot="header">
+			<image class="slot-image" src="/static/logo.png" mode="widthFix"></image>
+		</template>
+	</uni-list-item>
+	<uni-list-item>
+		<!-- 鑷畾涔� header -->
+		<view slot="header" class="slot-box"><image class="slot-image" src="/static/logo.png" mode="widthFix"></image></view>
+		<!-- 鑷畾涔� body -->
+		<text slot="body" class="slot-box slot-text">鑷畾涔夋彃妲�</text>
+		<!-- 鑷畾涔� footer-->
+		<template slot="footer">
+			<image class="slot-image" src="/static/logo.png" mode="widthFix"></image>
+		</template>
+	</uni-list-item>
+</uni-list>
+```
+
+
+
+
+
+### ListItemChat Props
+
+灞炴�у悕			|绫诲瀷		|榛樿鍊�		|	璇存槑																		
+:-:				|:-:		|:-:		|	:-:	
+title 			|String		|-			|	鏍囬
+note 			|String		|-			|	鎻忚堪
+clickable		|Boolean	|false		|	鏄惁寮�鍚偣鍑诲弽棣�
+badgeText		|String		|-			|	鏁板瓧瑙掓爣鍐呭锛岃缃负 `dot` 灏嗘樉绀哄渾鐐�
+badgePositon 	|String		|right		|	瑙掓爣浣嶇疆
+link			|String 	|navigateTo	|	鏄惁灞曠ず鍙充晶绠ご骞跺紑鍚偣鍑诲弽棣堬紝鍙�夊�艰涓嬭〃
+clickable		|Boolean	|false		|	鏄惁寮�鍚偣鍑诲弽棣�
+to				|String		|-			|	璺宠浆椤甸潰鍦板潃锛屽濉啓姝ゅ睘鎬э紝click 浼氳繑鍥為〉闈㈡槸鍚﹁烦杞垚鍔�	
+time			|String 	|-			|	鍙充晶鏃堕棿鏄剧ず
+avatarCircle 	|Boolean 	|false		|	鏄惁鏄剧ず鍦嗗舰澶村儚
+avatar			|String 	|-			|	澶村儚鍦板潃锛宎vatarCircle 涓嶅~鏃剁敓鏁�
+avatarList 		|Array	 	|-			|	澶村儚缁勶紝鏍煎紡涓� [{url:''}]
+
+#### Link Options
+
+灞炴�у悕		|	璇存槑
+:-:			|	:-:
+navigateTo 	| 	鍚� uni.navigateTo()
+redirectTo 	|	鍚� uni.reLaunch()
+reLaunch	|	鍚� uni.reLaunch()
+switchTab  	|	鍚� uni.switchTab()
+
+### ListItemChat Slots
+
+鍚嶇О	 	|	璇存槑					
+:-		|	:-						
+default	|	鑷畾涔夊垪琛ㄥ彸渚у唴瀹癸紙鍖呮嫭鏃堕棿鍜岃鏍囨樉绀猴級
+
+### ListItemChat Events
+浜嬩欢绉板悕			|	璇存槑						|	杩斿洖鍙傛暟			
+:-:				|	:-:						|	:-:	
+@click			|	鐐瑰嚮 uniListChat 瑙﹀彂浜嬩欢	|	{data:{}}	锛屽鏈� to 灞炴�э紝浼氳繑鍥為〉闈㈣烦杞俊鎭�	
+
+
+
+
+
+
+## 鍩轰簬uni-list鎵╁睍鐨勯〉闈㈡ā鏉�
+
+閫氳繃鎵╁睍鎻掓Ы锛屽彲瀹炵幇澶氱甯歌鏍峰紡鐨勫垪琛�
+
+**鏂伴椈鍒楄〃绫�**
+
+1. 浜戠涓�浣撴贩鍚堝竷灞�锛歔https://ext.dcloud.net.cn/plugin?id=2546](https://ext.dcloud.net.cn/plugin?id=2546)
+2. 浜戠涓�浣撳瀭鐩村竷灞�锛屽ぇ鍥炬ā寮忥細[https://ext.dcloud.net.cn/plugin?id=2583](https://ext.dcloud.net.cn/plugin?id=2583)
+3. 浜戠涓�浣撳瀭鐩村竷灞�锛屽琛屽浘鏂囨贩鎺掞細[https://ext.dcloud.net.cn/plugin?id=2584](https://ext.dcloud.net.cn/plugin?id=2584)
+4. 浜戠涓�浣撳瀭鐩村竷灞�锛屽鍥炬ā寮忥細[https://ext.dcloud.net.cn/plugin?id=2585](https://ext.dcloud.net.cn/plugin?id=2585)
+5. 浜戠涓�浣撴按骞冲竷灞�锛屽乏鍥惧彸鏂囷細[https://ext.dcloud.net.cn/plugin?id=2586](https://ext.dcloud.net.cn/plugin?id=2586)
+6. 浜戠涓�浣撴按骞冲竷灞�锛屽乏鏂囧彸鍥撅細[https://ext.dcloud.net.cn/plugin?id=2587](https://ext.dcloud.net.cn/plugin?id=2587)
+7. 浜戠涓�浣撳瀭鐩村竷灞�锛屾棤鍥炬ā寮忥紝涓绘爣棰�+鍓爣棰橈細[https://ext.dcloud.net.cn/plugin?id=2588](https://ext.dcloud.net.cn/plugin?id=2588)
+
+**鍟嗗搧鍒楄〃绫�**
+
+1. 浜戠涓�浣撳垪琛�/瀹牸瑙嗗浘浜掑垏锛歔https://ext.dcloud.net.cn/plugin?id=2651](https://ext.dcloud.net.cn/plugin?id=2651)
+2. 浜戠涓�浣撳垪琛紙瀹牸妯″紡锛夛細[https://ext.dcloud.net.cn/plugin?id=2671](https://ext.dcloud.net.cn/plugin?id=2671)
+3. 浜戠涓�浣撳垪琛紙鍒楄〃妯″紡锛夛細[https://ext.dcloud.net.cn/plugin?id=2672](https://ext.dcloud.net.cn/plugin?id=2672)
+
+## 缁勪欢绀轰緥
+
+鐐瑰嚮鏌ョ湅锛歔https://hellouniapp.dcloud.net.cn/pages/extUI/list/list](https://hellouniapp.dcloud.net.cn/pages/extUI/list/list)
\ No newline at end of file
diff --git a/uni_modules/uni-load-more/changelog.md b/uni_modules/uni-load-more/changelog.md
new file mode 100644
index 0000000..8f03f1d
--- /dev/null
+++ b/uni_modules/uni-load-more/changelog.md
@@ -0,0 +1,19 @@
+## 1.3.3锛�2022-01-20锛�
+- 鏂板 showText灞炴�� 锛屾槸鍚︽樉绀烘枃鏈�
+## 1.3.2锛�2022-01-19锛�
+- 淇 nvue 骞冲彴涓嬩笉鏄剧ず鏂囨湰鐨刡ug
+## 1.3.1锛�2022-01-19锛�
+- 淇 寰俊灏忕▼搴忓钩鍙版牱寮忛�夋嫨鍣ㄦ姤璀﹀憡鐨勯棶棰�
+## 1.3.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more)
+## 1.2.1锛�2021-08-24锛�
+- 鏂板 鏀寔鍥介檯鍖�
+## 1.2.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.1.8锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.1.7锛�2021-03-30锛�
+- 淇 uni-load-more 鍦ㄩ椤典娇鐢ㄦ椂锛宧5 骞冲彴鎶� 'uni is not defined' 鐨� bug
+## 1.1.6锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json
new file mode 100644
index 0000000..a4f14a5
--- /dev/null
+++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json
@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "Pull up to show more",
+	"uni-load-more.contentrefresh": "loading...",
+	"uni-load-more.contentnomore": "No more data"
+}
diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json
new file mode 100644
index 0000000..f15d510
--- /dev/null
+++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json
@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "涓婃媺鏄剧ず鏇村",
+	"uni-load-more.contentrefresh": "姝e湪鍔犺浇...",
+	"uni-load-more.contentnomore": "娌℃湁鏇村鏁版嵁浜�"
+}
diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json
new file mode 100644
index 0000000..a255c6d
--- /dev/null
+++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json
@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "涓婃媺椤ず鏇村",
+	"uni-load-more.contentrefresh": "姝e湪鍔犺級...",
+	"uni-load-more.contentnomore": "娌掓湁鏇村鏁告摎浜�"
+}
diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue
new file mode 100644
index 0000000..e5eff4d
--- /dev/null
+++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue
@@ -0,0 +1,399 @@
+<template>
+	<view class="uni-load-more" @click="onClick">
+		<!-- #ifdef APP-NVUE -->
+		<loading-indicator v-if="!webviewHide && status === 'loading' && showIcon"
+			:style="{color: color,width:iconSize+'px',height:iconSize+'px'}" :animating="true"
+			class="uni-load-more__img uni-load-more__img--nvue"></loading-indicator>
+		<!-- #endif -->
+		<!-- #ifdef H5 -->
+		<svg width="24" height="24" viewBox="25 25 50 50"
+			v-if="!webviewHide && (iconType==='circle' || iconType==='auto' && platform === 'android') && status === 'loading' && showIcon"
+			:style="{width:iconSize+'px',height:iconSize+'px'}"
+			class="uni-load-more__img uni-load-more__img--android-H5">
+			<circle cx="50" cy="50" r="20" fill="none" :style="{color:color}" :stroke-width="3"></circle>
+		</svg>
+		<!-- #endif -->
+		<!-- #ifndef APP-NVUE || H5 -->
+		<view
+			v-if="!webviewHide && (iconType==='circle' || iconType==='auto' && platform === 'android') && status === 'loading' && showIcon"
+			:style="{width:iconSize+'px',height:iconSize+'px'}"
+			class="uni-load-more__img uni-load-more__img--android-MP">
+			<view class="uni-load-more__img-icon" :style="{borderTopColor:color,borderTopWidth:iconSize/12}"></view>
+			<view class="uni-load-more__img-icon" :style="{borderTopColor:color,borderTopWidth:iconSize/12}"></view>
+			<view class="uni-load-more__img-icon" :style="{borderTopColor:color,borderTopWidth:iconSize/12}"></view>
+		</view>
+		<!-- #endif -->
+		<!-- #ifndef APP-NVUE -->
+		<view v-else-if="!webviewHide && status === 'loading' && showIcon"
+			:style="{width:iconSize+'px',height:iconSize+'px'}" class="uni-load-more__img uni-load-more__img--ios-H5">
+			<image :src="imgBase64" mode="widthFix"></image>
+		</view>
+		<!-- #endif -->
+		<text v-if="showText" class="uni-load-more__text"
+			:style="{color: color}">{{ status === 'more' ? contentdownText : status === 'loading' ? contentrefreshText : contentnomoreText }}</text>
+	</view>
+</template>
+
+<script>
+	let platform
+	setTimeout(() => {
+		platform = uni.getSystemInfoSync().platform
+	}, 16)
+
+	import {
+		initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import messages from './i18n/index.js'
+	const {
+		t
+	} = initVueI18n(messages)
+
+	/**
+	 * LoadMore 鍔犺浇鏇村
+	 * @description 鐢ㄤ簬鍒楄〃涓紝鍋氭粴鍔ㄥ姞杞戒娇鐢紝灞曠ず loading 鐨勫悇绉嶇姸鎬�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=29
+	 * @property {String} status = [more|loading|noMore] loading 鐨勭姸鎬�
+	 * 	@value more loading鍓�
+	 * 	@value loading loading涓�
+	 * 	@value noMore 娌℃湁鏇村浜�
+	 * @property {Number} iconSize 鎸囧畾鍥炬爣澶у皬
+	 * @property {Boolean} iconSize = [true|false] 鏄惁鏄剧ず loading 鍥炬爣
+	 * @property {String} iconType = [snow|circle|auto] 鎸囧畾鍥炬爣鏍峰紡
+	 * 	@value snow ios闆姳鍔犺浇鏍峰紡
+	 * 	@value circle 瀹夊崜鍞ら啋鍔犺浇鏍峰紡
+	 * 	@value auto 鏍规嵁骞冲彴鑷姩閫夋嫨鍔犺浇鏍峰紡
+	 * @property {String} color 鍥炬爣鍜屾枃瀛楅鑹�
+	 * @property {Object} contentText 鍚勭姸鎬佹枃瀛楄鏄庯紝鍊间负锛歿contentdown: "涓婃媺鏄剧ず鏇村",contentrefresh: "姝e湪鍔犺浇...",contentnomore: "娌℃湁鏇村鏁版嵁浜�"}
+	 * @event {Function} clickLoadMore 鐐瑰嚮鍔犺浇鏇村鏃惰Е鍙�
+	 */
+	export default {
+		name: 'UniLoadMore',
+		emits: ['clickLoadMore'],
+		props: {
+			status: {
+				// 涓婃媺鐨勭姸鎬侊細more-loading鍓嶏紱loading-loading涓紱noMore-娌℃湁鏇村浜�
+				type: String,
+				default: 'more'
+			},
+			showIcon: {
+				type: Boolean,
+				default: true
+			},
+			iconType: {
+				type: String,
+				default: 'auto'
+			},
+			iconSize: {
+				type: Number,
+				default: 24
+			},
+			color: {
+				type: String,
+				default: '#777777'
+			},
+			contentText: {
+				type: Object,
+				default () {
+					return {
+						contentdown: '',
+						contentrefresh: '',
+						contentnomore: ''
+					}
+				}
+			},
+			showText: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				webviewHide: false,
+				platform: platform,
+				imgBase64: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzlBMzU3OTlEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzlBMzU3OUFEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOUEzNTc5N0Q5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOUEzNTc5OEQ5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pt+ALSwAAA6CSURBVHja1FsLkFZVHb98LM+F5bHL8khA1iSeiyQBCRM+YGqKUnnJTDLGI0BGZlKDIU2MMglUiDApEZvSsZnQtBRJtKwQNKQMFYeRDR10WOLd8ljYXdh+v8v5fR3Od+797t1dnOnO/Ofce77z+J//+b/P+ZqtXbs2sJ9MJhNUV1cHJ06cCJo3bx7EPc2aNcvpy7pWrVoF+/fvDyoqKoI2bdoE9fX1F7TjN8a+EXBn/fkfvw942Tf+wYMHg9mzZwfjxo0LDhw4EPa1x2MbFw/fOGfPng1qa2tzcCkILsLDydq2bRsunpOTMM7TD/W/tZDZhPdeKD+yGxHhdu3aBV27dg3OnDlzMVANMheLAO3btw8KCwuDmpoaX5OxbgUIMEq7K8IcPnw4KCsrC/r37x8cP378/4cAXAB3vqSkJMuiDhTkw+XcuXNhOWbMmKBly5YhUT8xArhyFvP0BfwRsAuwxJZJsm/nzp2DTp06he/OU+cZ64K6o0ePBkOHDg2GDx8e6gEbJ5Q/NHNuAJQ1hgBeHUDlR7nVTkY8rQAvAi4z34vR/mPs1FoRsaCgIJThI0eOBC1atEiFGGV+5MiRoS45efJkqFjJFXV1dQuA012m2WcwTw98fy6CqBdsaiIO4CScrGPHjvk4odhavPquRtFWXEC25VgkREKOCh/qDSq+vn37htzD/mZTOmOc5U7zKzBPEedygWshcDyWvs30igAbU+6oyMgJBCFhwQE0fccxN60Ay9iebbjoDh06hMowjQxT4fXq1SskArmHZpkArvixp/kWzHdMeArExSJEaiXIjjRjRJ4DaAGWpibLzXN3Fm1vA5teBgh3j1Rv3bp1YgKwPdmf2p9zcyNYYgPKMfY0T5f5nNYdw158nJ8QawW4CLKwiOBSEgO/hok2eBydR+3dYH+PLxA5J8Vv0KBBwenTp0P2JWAx6+yFEBfs8lMY+y0SWMBNI9E4ThKi58VKTg3FQZS1RQF1cz27eC0QHMu+3E0SkUowjhVt5VdaWhp07949ZHv2Qd1EjDXM2cla1M0nl3GxAs3J9yREzyTdFVKVFOaE9qRA8GM0WebRuo9JGZKA7Mv2SeS/Z8+eoQ9BArMfFrLGo6jvxbhHbJZnKX2Rzz1O7QhJJ9Cs2ZMaWIyq/zhdeqPNfIoHd58clIQD+JSXl4dKlyIAuBdVXZwFVWKspSSoxE++h8x4k3uCnEhE4I5KwRiFWGOU0QWKiCYLbdoRMRKAu2kQ9vkfLU6dOhX06NEjlH+yMRZSinnuyWnYosVcji8CEA/6Cg2JF+IIUBqnGKUTCNwtwBN4f89RiK1R96DEgO2o0NDmtEdvVFdVVYV+P3UAPUEs6GFwV3PHmXkD4vh74iDFJysVI/MlaQhwKeBNTLYX5VuA8T4/gZxA4MRGFxDB6R7OmYPfyykGRJbyie+XnGYnQIC/coH9+vULiYrxrkL9ZA9+0ykaHIfEpM7ge8TiJ2CsHYwyMfafAF1yCGBHYIbCVDjDjKt7BeB51D+LgQa6OkG7IDYEEtvQ7lnXLKLtLdLuJBpE4gPUXcW2+PkZwOex+4cGDhwYDBkyRL7/HFcEwUGPo/8uWRUpYnfxGHco8HkewLHLyYmAawAPuIFZxhOpDfJQ8gbUv41yORAptMWBNr6oqMhWird5+u+iHmBb2nhjDV7HWBNQTgK8y11l5NetWzc5ULscAtSj7nbNI0skhWeUZCc0W4nyH/jO4Vz0u1IeYhbk4AiwM6tjxIWByHsoZ9qcIBPJd/y+DwPfBESOmCa/QF3WiZHucLlEDpNxcNhmheEOPgdQNx6/VZFQzFZ5TN08AHXQt2Ii3EdyFuUsPtTcGPhW5iMiCNELvz+Gdn9huG4HUJaW/w3g0wxV0XaG7arG2WeKiUWYM4Y7GO5ezshTARbbWGw/DvXkpp/ivVvE0JVoMxN4rpGzJMhE5Pl+xlATsDIqikP9F9D2z3h9nOksEUFhK+qO4rcPkoalMQ/HqJLIyb3F3JdjrCcw1yZ8joyJLR5gCo54etlag7qIoeNh1N1BRYj3DTFJ0elotxPlVzkGuYAmL0VSJVGAJA41c4Z6A3BzTLfn0HYwYKEI6CUAMzZEWvLsIcQOo1AmmyyM72nHJCfYsogflGV6jEk9vyQZXSuq6w4c16NsGcGZbwOPr+H1RkOk2LEzjNepxQkihHSCQ4ynAYNRx2zMKV92CQMWqj8J0BRE8EShxRFN6YrfCRhC0x3r/Zm4IbQCcmJoV0kMamllccR6FjHqUC5F2R/wS2dcymOlfAKOS4KmzQb5cpNC2MC7JhVn5wjXoJ44rYhLh8n0eXOCorJxa7POjbSlCGVczr34/RsAmrcvo9s+wGp3tzVhntxiXiJ4nvEYb4FJkf0O8HocAePmLvCxnL0AORraVekJk6TYjDabRVXfRE2lCN1h6ZQRN1+InUbsCpKwoBZHh0dODN9JBCUffItXxEavTQkUtnfTVAplCWL3JISz29h4NjotnuSsQKJCk8dF+kJR6RARjrqFVmfPnj3ZbK8cIJ0msd6jgHPGtfVTQ8VLmlvh4mct9sobRmPic0DyDQQnx/NlfYUgyz59+oScsH379pAwXABD32nTpoUHIToESeI5mnbE/UqDdyLcafEBf2MCqgC7NwxIbMREJQ0g4D4sfJwnD+AmRrII05cfMWJE+L1169bQr+fip06dGp4oJ83lmYd5wj/EmMa4TaHivo4EeCguYZBnkB5g2aWA69OIEnUHOaGysjIYMGBAMGnSpODYsWPZwCpFmm4lNq+4gSLQA7jcX8DwtjEyRC8wjabnXEx9kfWnTJkSJkAo90xpJVV+FmcVNeYAF5zWngS4C4O91MBxmAv8blLEpbjI5sz9MTdAhcgkCT1RO8mZkAjfiYpTEvStAS53Uw1vAiUGgZ3GpuQEYvoiBqlIan7kSDHnTwJQFNiPu0+5VxCVYhcZIjNrdXUDdp+Eq5AZ3Gkg8QAyVZRZIk4Tl4QAbF9cXJxNYZMAtAokgs4BrNxEpCtteXg7DDTMDKYNSuQdKsnJBek7HxewvxaosWxLYXtw+cJp18217wql4aKCfBNoEu0O5VU+PhctJ0YeXD4C6JQpyrlpSLTojpGGGN5YwNziChdIZLk4lvLcFJ9jMX3QdiImY9bmGQU+TRUL5CHITTRlgF8D9ouD1MfmLoEPl5xokIumZ2cfgMpHt47IW9N64Hsh7wQYYjyIugWuF5fCqYncXRd5vPMWyizzvhi/32+nvG0dZc9vR6fZOu0md5e+uC408FvKSIOZwXlGvxPv95izA2Vtvg1xKFWARI+vMX66HUhpQQb643uW1bSjuTWyw2SBvDrBvjFic1eGGlz5esq3ko9uSIlBRqPuFcCv8F4WIcN12nVaBd0SaYwI6PDDImR11JkqgHcPmQssjxIn6bUshygDFJUTxPMpHk+jfjPgupgdnYV2R/g7xSjtpah8RJBewhwf0gGK6XI92u4wXFEU40afJ4DN4h5LcAd+40HI3JgJecuT0c062W0i2hQJUTcxan3/CMW1PF2K6bbA+Daz4xRs1D3Br1Cm0OihKCqizW78/nXAF/G5TXrEcVzaNMH6CyMswqsAHqDyDLEyou8lwOXnKF8DjI6KjV3KzMBiXkDH8ij/H214J5A596ekrZ3F0zXlWeL7+P5eUrNo3/QwC15uxthuzidy7DzKRwEDaAViiDgKbTbz7CJnzo0bN7pIfIiid8SuPwn25o3QCmpnyjlZkyxPP8EomCJzrGb7GJMx7tNsq4MT2xMUYaiErZOluTzKsnz3gwCeCZyVRZJfYplNEokEjwrPtxlxjeYAk+F1F74VAzPxQRNYYdtpOUvWs8J1sGhBJMNsb7igN8plJs1eSmLIhLKE4rvaCX27gOhLpLOsIzJ7qn/i+wZzcvSOZ23/du8TZjwV8zHIXoP4R3ifBxiFz1dcVpa3aPntPE+c6TmIWE9EtcMmAcPdWAhYhAXxcLOQi9L1WhD1Sc8p1d2oL7XGiRKp8F4A2i8K/nfI+y/gsTDJ/YC/8+AD5Uh04KHiGl+cIFPnBDDrPMjwRGkLXyxO4VGbfQWnDH2v0bVWE3C9QOXlepbgjEfIJQI6XDG3z5ahD9cw2pS78ipB85wyScNTvsVzlzzhL8/jRrnmVjfFJK/m3m4nj9vbgQTguT8XZTjsm672R5uJKEaQmBI/c58gyus8ZDagLpEVSJBIyHp4jn++xqPV71OgQgJYEWOtZ/haxRtKmWOBu8xdBLftWltsY84zE6WIEy/eIOWL+BaayMx+KHtL7EAkqdNDLiEXmEMUHniedtJqg9HmZtfvt26vNi0BdG3Ft3g8ZOf7PAu59TxtzivLNIekyi+wD1i8CuUiD9FXAa8C+/xS3JPmZnomyc7H+fb4/Se0bk41Fel621r4cgVxbq91V4jVqwB7HTe2M7jgB+QWHavZkDRPmZcASoZEmBx6i75bGjPcMdL4/VKGFAGWZkGzPG0XAbdL9A81G5LOmUnC9hHKJeO7dcUMjblSl12867ElFTtaGl20xvvLGPdVz/8TVuU7y0x1PG7vtNg24oz9Uo/Z412++VFWI7Fcog9tu9Lm6gvRmIPv9x1xmQAu6RDkXtbOtlGEmpgD5Nvnyc0dcv0EE6cfdi1HmhMf9wDF3k3gtRvEedhxjpgfqPb9PU9iEJHnyOUA7bQUXh6kq/D7l2iTjWv7XOD530BDr8jIrus+srXjt4MzumJMHuTsBa63YKE1+RR5lBjEikCCnWKWiHdzOgKO+nRIBAF88za/IFmJ3eMZov4CYxGBabcpGL8EYx+SeMXJeRwHNsV/h+vdxeuhEpN3ZyNY78Gm2fknJxVGhyjixPiQvVkNzT1elD9Py/aTAL64Hb9vcYmC9zfdXdT/C1LeGbg4rnBaAihDFJH12W5ulfNCNe/xTsP3bp8ikzJs5BF+5PNfAQYAPaseTdsEcaYAAAAASUVORK5CYII='
+			}
+		},
+		computed: {
+			iconSnowWidth() {
+				return (Math.floor(this.iconSize / 24) || 1) * 2
+			},
+			contentdownText() {
+				return this.contentText.contentdown || t("uni-load-more.contentdown")
+			},
+			contentrefreshText() {
+				return this.contentText.contentrefresh || t("uni-load-more.contentrefresh")
+			},
+			contentnomoreText() {
+				return this.contentText.contentnomore || t("uni-load-more.contentnomore")
+			}
+		},
+		mounted() {
+			// #ifdef APP-PLUS
+			var pages = getCurrentPages();
+			var page = pages[pages.length - 1];
+			var currentWebview = page.$getAppWebview();
+			currentWebview.addEventListener('hide', () => {
+				this.webviewHide = true
+			})
+			currentWebview.addEventListener('show', () => {
+				this.webviewHide = false
+			})
+			// #endif
+		},
+		methods: {
+			onClick() {
+				this.$emit('clickLoadMore', {
+					detail: {
+						status: this.status,
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	.uni-load-more {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		height: 40px;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.uni-load-more__text {
+		font-size: 14px;
+		margin-left: 8px;
+	}
+
+	.uni-load-more__img {
+		width: 24px;
+		height: 24px;
+		// margin-right: 8px;
+	}
+
+	.uni-load-more__img--nvue {
+		color: #666666;
+	}
+
+	.uni-load-more__img--android,
+	.uni-load-more__img--ios {
+		width: 24px;
+		height: 24px;
+		transform: rotate(0deg);
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-load-more__img--android {
+		animation: loading-ios 1s 0s linear infinite;
+	}
+
+	@keyframes loading-android {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	.uni-load-more__img--ios-H5 {
+		position: relative;
+		animation: loading-ios-H5 1s 0s step-end infinite;
+	}
+
+	.uni-load-more__img--ios-H5 image {
+		position: absolute;
+		width: 100%;
+		height: 100%;
+		left: 0;
+		top: 0;
+	}
+
+	@keyframes loading-ios-H5 {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		8% {
+			transform: rotate(30deg);
+		}
+
+		16% {
+			transform: rotate(60deg);
+		}
+
+		24% {
+			transform: rotate(90deg);
+		}
+
+		32% {
+			transform: rotate(120deg);
+		}
+
+		40% {
+			transform: rotate(150deg);
+		}
+
+		48% {
+			transform: rotate(180deg);
+		}
+
+		56% {
+			transform: rotate(210deg);
+		}
+
+		64% {
+			transform: rotate(240deg);
+		}
+
+		73% {
+			transform: rotate(270deg);
+		}
+
+		82% {
+			transform: rotate(300deg);
+		}
+
+		91% {
+			transform: rotate(330deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	/* #endif */
+
+	/* #ifdef H5 */
+	.uni-load-more__img--android-H5 {
+		animation: loading-android-H5-rotate 2s linear infinite;
+		transform-origin: center center;
+	}
+
+	.uni-load-more__img--android-H5 circle {
+		display: inline-block;
+		animation: loading-android-H5-dash 1.5s ease-in-out infinite;
+		stroke: currentColor;
+		stroke-linecap: round;
+	}
+
+	@keyframes loading-android-H5-rotate {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	@keyframes loading-android-H5-dash {
+		0% {
+			stroke-dasharray: 1, 200;
+			stroke-dashoffset: 0;
+		}
+
+		50% {
+			stroke-dasharray: 90, 150;
+			stroke-dashoffset: -40;
+		}
+
+		100% {
+			stroke-dasharray: 90, 150;
+			stroke-dashoffset: -120;
+		}
+	}
+
+	/* #endif */
+
+	/* #ifndef APP-NVUE || H5 */
+	.uni-load-more__img--android-MP {
+		position: relative;
+		width: 24px;
+		height: 24px;
+		transform: rotate(0deg);
+		animation: loading-ios 1s 0s ease infinite;
+	}
+
+	.uni-load-more__img--android-MP .uni-load-more__img-icon {
+		position: absolute;
+		box-sizing: border-box;
+		width: 100%;
+		height: 100%;
+		border-radius: 50%;
+		border: solid 2px transparent;
+		border-top: solid 2px #777777;
+		transform-origin: center;
+	}
+
+	.uni-load-more__img--android-MP .uni-load-more__img-icon:nth-child(1) {
+		animation: loading-android-MP-1 1s 0s linear infinite;
+	}
+
+	.uni-load-more__img--android-MP .uni-load-more__img-icon:nth-child(2) {
+		animation: loading-android-MP-2 1s 0s linear infinite;
+	}
+
+	.uni-load-more__img--android-MP .uni-load-more__img-icon:nth-child(3) {
+		animation: loading-android-MP-3 1s 0s linear infinite;
+	}
+
+	@keyframes loading-android {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	@keyframes loading-android-MP-1 {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		50% {
+			transform: rotate(90deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	@keyframes loading-android-MP-2 {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		50% {
+			transform: rotate(180deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	@keyframes loading-android-MP-3 {
+		0% {
+			transform: rotate(0deg);
+		}
+
+		50% {
+			transform: rotate(270deg);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/uni-load-more/package.json b/uni_modules/uni-load-more/package.json
new file mode 100644
index 0000000..2fa6f04
--- /dev/null
+++ b/uni_modules/uni-load-more/package.json
@@ -0,0 +1,86 @@
+{
+  "id": "uni-load-more",
+  "displayName": "uni-load-more 鍔犺浇鏇村",
+  "version": "1.3.3",
+  "description": "LoadMore 缁勪欢锛屽父鐢ㄥ湪鍒楄〃閲岄潰锛屽仛婊氬姩鍔犺浇浣跨敤銆�",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "鍔犺浇鏇村",
+    "load-more"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "鍓嶇缁勪欢",
+      "閫氱敤缁勪欢"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-load-more/readme.md b/uni_modules/uni-load-more/readme.md
new file mode 100644
index 0000000..54dc1fa
--- /dev/null
+++ b/uni_modules/uni-load-more/readme.md
@@ -0,0 +1,14 @@
+
+
+### LoadMore 鍔犺浇鏇村
+> **缁勪欢鍚嶏細uni-load-more**
+> 浠g爜鍧楋細 `uLoadMore`
+
+
+鐢ㄤ簬鍒楄〃涓紝鍋氭粴鍔ㄥ姞杞戒娇鐢紝灞曠ず loading 鐨勫悇绉嶇姸鎬併��
+
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-load-more)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
+
+
diff --git a/uni_modules/uni-notice-bar/changelog.md b/uni_modules/uni-notice-bar/changelog.md
new file mode 100644
index 0000000..ce50674
--- /dev/null
+++ b/uni_modules/uni-notice-bar/changelog.md
@@ -0,0 +1,20 @@
+## 1.2.2锛�2023-12-20锛�
+- 淇鍔ㄦ�佺粦瀹歵itle鏃讹紝婊氬姩閫熷害涓嶄竴鑷寸殑闂
+## 1.2.1锛�2022-09-05锛�
+- 鏂板 灞炴�� fontSize锛屽彲淇敼鏂囧瓧澶у皬銆�
+## 1.2.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-notice-bar](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)
+## 1.1.1锛�2021-11-09锛� 
+- 鏂板 鎻愪緵缁勪欢璁捐璧勬簮锛岀粍浠舵牱寮忚皟鏁�
+## 1.1.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.0.9锛�2021-05-12锛�
+- 鏂板 缁勪欢绀轰緥鍦板潃
+## 1.0.8锛�2021-04-21锛�
+- 浼樺寲 娣诲姞渚濊禆 uni-icons, 瀵煎叆鍚庤嚜鍔ㄤ笅杞戒緷璧�
+## 1.0.7锛�2021-02-05锛�
+- 浼樺寲 缁勪欢寮曠敤鍏崇郴锛岄�氳繃uni_modules寮曠敤缁勪欢
+
+## 1.0.6锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
diff --git a/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
new file mode 100644
index 0000000..47fb9b3
--- /dev/null
+++ b/uni_modules/uni-notice-bar/components/uni-notice-bar/uni-notice-bar.vue
@@ -0,0 +1,431 @@
+<template>
+	<view v-if="show" class="uni-noticebar" :style="{ backgroundColor }" @click="onClick">
+		<uni-icons v-if="showIcon === true || showIcon === 'true'" class="uni-noticebar-icon" type="sound"
+			:color="color" :size="fontSize * 1.5" />
+		<view ref="textBox" class="uni-noticebar__content-wrapper"
+			:class="{
+				'uni-noticebar__content-wrapper--scrollable': scrollable,
+				'uni-noticebar__content-wrapper--single': !scrollable && (single || moreText)
+			}"
+			:style="{ height: scrollable ? fontSize * 1.5 + 'px' : 'auto' }"
+		>
+			<view :id="elIdBox" class="uni-noticebar__content"
+				:class="{
+					'uni-noticebar__content--scrollable': scrollable,
+					'uni-noticebar__content--single': !scrollable && (single || moreText)
+				}"
+			>
+				<text :id="elId" ref="animationEle" class="uni-noticebar__content-text" 
+					:class="{
+						'uni-noticebar__content-text--scrollable': scrollable,
+						'uni-noticebar__content-text--single': !scrollable && (single || showGetMore)
+					}" 
+					:style="{
+						color: color,
+						fontSize: fontSize + 'px',
+						lineHeight: fontSize * 1.5 + 'px',
+						width: wrapWidth + 'px',
+						'animationDuration': animationDuration,
+						'-webkit-animationDuration': animationDuration,
+						animationPlayState: webviewHide ? 'paused' : animationPlayState,
+						'-webkit-animationPlayState': webviewHide ? 'paused' : animationPlayState,
+						animationDelay: animationDelay,
+						'-webkit-animationDelay': animationDelay
+					}"
+				>{{text}}</text>
+			</view>
+		</view>
+		<view v-if="isShowGetMore" class="uni-noticebar__more uni-cursor-point"
+			@click="clickMore">
+			<text v-if="moreText.length > 0" :style="{ color: moreColor, fontSize: fontSize + 'px' }">{{ moreText }}</text>
+			<uni-icons v-else type="right" :color="moreColor" :size="fontSize * 1.1" />
+		</view>
+		<view class="uni-noticebar-close uni-cursor-point" v-if="isShowClose">
+			<uni-icons type="closeempty" :color="color" :size="fontSize * 1.1" @click="close" />
+		</view>
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom');
+	const animation = weex.requireModule('animation');
+	// #endif
+
+	/**
+	 * NoticeBar 鑷畾涔夊鑸爮
+	 * @description 閫氬憡鏍忕粍浠�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=30
+	 * @property {Number} speed 鏂囧瓧婊氬姩鐨勯�熷害锛岄粯璁�100px/绉�
+	 * @property {String} text 鏄剧ず鏂囧瓧
+	 * @property {String} backgroundColor 鑳屾櫙棰滆壊
+	 * @property {String} color 鏂囧瓧棰滆壊
+	 * @property {String} moreColor 鏌ョ湅鏇村鏂囧瓧鐨勯鑹�
+	 * @property {String} moreText 璁剧疆鈥滄煡鐪嬫洿澶氣�濈殑鏂囨湰
+	 * @property {Boolean} single = [true|false] 鏄惁鍗曡
+	 * @property {Boolean} scrollable = [true|false] 鏄惁婊氬姩锛屼负true鏃讹紝NoticeBar涓哄崟琛�
+	 * @property {Boolean} showIcon = [true|false] 鏄惁鏄剧ず宸︿晶鍠囧彮鍥炬爣
+	 * @property {Boolean} showClose = [true|false] 鏄惁鏄剧ず宸︿晶鍏抽棴鎸夐挳
+	 * @property {Boolean} showGetMore = [true|false] 鏄惁鏄剧ず鍙充晶鏌ョ湅鏇村鍥炬爣锛屼负true鏃讹紝NoticeBar涓哄崟琛�
+	 * @event {Function} click 鐐瑰嚮 NoticeBar 瑙﹀彂浜嬩欢
+	 * @event {Function} close 鍏抽棴 NoticeBar 瑙﹀彂浜嬩欢
+	 * @event {Function} getmore 鐐瑰嚮鈥濇煡鐪嬫洿澶氣�滄椂瑙﹀彂浜嬩欢
+	 */
+
+	export default {
+		name: 'UniNoticeBar',
+		emits: ['click', 'getmore', 'close'],
+		props: {
+			text: {
+				type: String,
+				default: ''
+			},
+			moreText: {
+				type: String,
+				default: ''
+			},
+			backgroundColor: {
+				type: String,
+				default: '#FFF9EA'
+			},
+			speed: {
+				// 榛樿1s婊氬姩100px
+				type: Number,
+				default: 100
+			},
+			color: {
+				type: String,
+				default: '#FF9A43'
+			},
+			fontSize: {
+				type: Number,
+				default: 14
+			},
+			moreColor: {
+				type: String,
+				default: '#FF9A43'
+			},
+			single: {
+				// 鏄惁鍗曡
+				type: [Boolean, String],
+				default: false
+			},
+			scrollable: {
+				// 鏄惁婊氬姩锛屾坊鍔犲悗鎺у埗鍗曡鏁堟灉鍙栨秷
+				type: [Boolean, String],
+				default: false
+			},
+			showIcon: {
+				// 鏄惁鏄剧ず宸︿晶icon
+				type: [Boolean, String],
+				default: false
+			},
+			showGetMore: {
+				// 鏄惁鏄剧ず鍙充晶鏌ョ湅鏇村
+				type: [Boolean, String],
+				default: false
+			},
+			showClose: {
+				// 鏄惁鏄剧ず宸︿晶鍏抽棴鎸夐挳
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		data() {
+			const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+			const elIdBox = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+			return {
+				textWidth: 0,
+				boxWidth: 0,
+				wrapWidth: '',
+				webviewHide: false,
+				// #ifdef APP-NVUE
+				stopAnimation: false,
+				// #endif
+				elId: elId,
+				elIdBox: elIdBox,
+				show: true,
+				animationDuration: 'none',
+				animationPlayState: 'paused',
+				animationDelay: '0s'
+			}
+		},
+		watch:{
+			text:function(newValue,oldValue){
+				this.initSize();
+			}
+		},
+		computed: {
+			isShowGetMore() {
+				return this.showGetMore === true || this.showGetMore === 'true'
+			},
+			isShowClose() {
+				return (this.showClose === true || this.showClose === 'true') 
+					&& (this.showGetMore === false || this.showGetMore === 'false')
+			}
+		},
+		mounted() {
+			// #ifdef APP-PLUS
+			var pages = getCurrentPages();
+			var page = pages[pages.length - 1];
+			var currentWebview = page.$getAppWebview();
+			currentWebview.addEventListener('hide', () => {
+				this.webviewHide = true
+			})
+			currentWebview.addEventListener('show', () => {
+				this.webviewHide = false
+			})
+			// #endif
+			this.$nextTick(() => {
+				this.initSize()
+			})
+		},
+		// #ifdef APP-NVUE
+		beforeDestroy() {
+			this.stopAnimation = true
+		},
+		// #endif
+		methods: {
+			initSize() {
+				if (this.scrollable) {
+					// #ifndef APP-NVUE
+					let query = [],
+						boxWidth = 0,
+						textWidth = 0;
+					let textQuery = new Promise((resolve, reject) => {
+						uni.createSelectorQuery()
+							// #ifndef MP-ALIPAY
+							.in(this)
+							// #endif
+							.select(`#${this.elId}`)
+							.boundingClientRect()
+							.exec(ret => {
+								this.textWidth = ret[0].width
+								resolve()
+							})
+					})
+					let boxQuery = new Promise((resolve, reject) => {
+						uni.createSelectorQuery()
+							// #ifndef MP-ALIPAY
+							.in(this)
+							// #endif
+							.select(`#${this.elIdBox}`)
+							.boundingClientRect()
+							.exec(ret => {
+								this.boxWidth = ret[0].width
+								resolve()
+							})
+					})
+					query.push(textQuery)
+					query.push(boxQuery)
+					Promise.all(query).then(() => {
+						this.animationDuration = `${this.textWidth / this.speed}s`
+						this.animationDelay = `-${this.boxWidth / this.speed}s`
+						setTimeout(() => {
+							this.animationPlayState = 'running'
+						}, 1000)
+					})
+					// #endif
+					// #ifdef APP-NVUE
+					dom.getComponentRect(this.$refs['animationEle'], (res) => {
+						let winWidth = uni.getSystemInfoSync().windowWidth
+						this.textWidth = res.size.width
+						animation.transition(this.$refs['animationEle'], {
+							styles: {
+								transform: `translateX(-${winWidth}px)`
+							},
+							duration: 0,
+							timingFunction: 'linear',
+							delay: 0
+						}, () => {
+							if (!this.stopAnimation) {
+								animation.transition(this.$refs['animationEle'], {
+									styles: {
+										transform: `translateX(-${this.textWidth}px)`
+									},
+									timingFunction: 'linear',
+									duration: (this.textWidth - winWidth) / this.speed * 1000,
+									delay: 1000
+								}, () => {
+									if (!this.stopAnimation) {
+										this.loopAnimation()
+									}
+								});
+							}
+						});
+					})
+					// #endif
+				}
+				// #ifdef APP-NVUE
+				if (!this.scrollable && (this.single || this.moreText)) {
+					dom.getComponentRect(this.$refs['textBox'], (res) => {
+						this.wrapWidth = res.size.width
+					})
+				}
+				// #endif
+			},
+			loopAnimation() {
+				// #ifdef APP-NVUE
+				animation.transition(this.$refs['animationEle'], {
+					styles: {
+						transform: `translateX(0px)`
+					},
+					duration: 0
+				}, () => {
+					if (!this.stopAnimation) {
+						animation.transition(this.$refs['animationEle'], {
+							styles: {
+								transform: `translateX(-${this.textWidth}px)`
+							},
+							duration: this.textWidth / this.speed * 1000,
+							timingFunction: 'linear',
+							delay: 0
+						}, () => {
+							if (!this.stopAnimation) {
+								this.loopAnimation()
+							}
+						});
+					}
+				});
+				// #endif
+			},
+			clickMore() {
+				this.$emit('getmore')
+			},
+			close() {
+				this.show = false;
+				this.$emit('close')
+			},
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-noticebar {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		width: 100%;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		padding: 10px 12px;
+		margin-bottom: 10px;
+	}
+
+	.uni-cursor-point {
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-noticebar-close {
+		margin-left: 8px;
+		margin-right: 5px;
+	}
+
+	.uni-noticebar-icon {
+		margin-right: 5px;
+	}
+
+	.uni-noticebar__content-wrapper {
+		flex: 1;
+		flex-direction: column;
+		overflow: hidden;
+	}
+
+	.uni-noticebar__content-wrapper--single {
+		/* #ifndef APP-NVUE */
+		line-height: 18px;
+		/* #endif */
+	}
+
+	.uni-noticebar__content-wrapper--single,
+	.uni-noticebar__content-wrapper--scrollable {
+		flex-direction: row;
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-noticebar__content-wrapper--scrollable {
+		position: relative;
+	}
+
+	/* #endif */
+
+	.uni-noticebar__content--scrollable {
+		/* #ifdef APP-NVUE */
+		flex: 0;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		flex: 1;
+		display: block;
+		overflow: hidden;
+		/* #endif */
+	}
+
+	.uni-noticebar__content--single {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex: none;
+		width: 100%;
+		justify-content: center;
+		/* #endif */
+	}
+
+	.uni-noticebar__content-text {
+		font-size: 14px;
+		line-height: 18px;
+		/* #ifndef APP-NVUE */
+		word-break: break-all;
+		/* #endif */
+	}
+
+	.uni-noticebar__content-text--single {
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		display: block;
+		width: 100%;
+		white-space: nowrap;
+		/* #endif */
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.uni-noticebar__content-text--scrollable {
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		padding-left: 750rpx;
+		/* #endif */
+		/* #ifndef APP-NVUE */
+		position: absolute;
+		display: block;
+		height: 18px;
+		line-height: 18px;
+		white-space: nowrap;
+		padding-left: 100%;
+		animation: notice 10s 0s linear infinite both;
+		animation-play-state: paused;
+		/* #endif */
+	}
+
+	.uni-noticebar__more {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: nowrap;
+		align-items: center;
+		padding-left: 5px;
+	}
+
+	@keyframes notice {
+		100% {
+			transform: translate3d(-100%, 0, 0);
+		}
+	}
+</style>
diff --git a/uni_modules/uni-notice-bar/package.json b/uni_modules/uni-notice-bar/package.json
new file mode 100644
index 0000000..1e9762c
--- /dev/null
+++ b/uni_modules/uni-notice-bar/package.json
@@ -0,0 +1,87 @@
+{
+  "id": "uni-notice-bar",
+  "displayName": "uni-notice-bar 閫氬憡鏍�",
+  "version": "1.2.2",
+  "description": "NoticeBar 閫氬憡鏍忕粍浠讹紝甯哥敤浜庡睍绀哄叕鍛婁俊鎭紝鍙涓烘粴鍔ㄥ叕鍛�",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "閫氬憡鏍�",
+    "鍏憡",
+    "璺戦┈鐏�"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-notice-bar/readme.md b/uni_modules/uni-notice-bar/readme.md
new file mode 100644
index 0000000..fb2ede2
--- /dev/null
+++ b/uni_modules/uni-notice-bar/readme.md
@@ -0,0 +1,13 @@
+
+
+## NoticeBar 閫氬憡鏍�
+> **缁勪欢鍚嶏細uni-notice-bar**
+> 浠g爜鍧楋細 `uNoticeBar`
+
+
+閫氬憡鏍忕粍浠� 銆�
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-notice-bar)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
+
+
diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md
new file mode 100644
index 0000000..b863bb0
--- /dev/null
+++ b/uni_modules/uni-scss/changelog.md
@@ -0,0 +1,8 @@
+## 1.0.3锛�2022-01-21锛�
+- 浼樺寲 缁勪欢绀轰緥
+## 1.0.2锛�2021-11-22锛�
+- 淇 / 绗﹀彿鍦� vue 涓嶅悓鐗堟湰鍏煎闂寮曡捣鐨勬姤閿欓棶棰�
+## 1.0.1锛�2021-11-22锛�
+- 淇 vue3涓璼css璇硶鍏煎闂
+## 1.0.0锛�2021-11-18锛�
+- init
diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss
new file mode 100644
index 0000000..1744a5f
--- /dev/null
+++ b/uni_modules/uni-scss/index.scss
@@ -0,0 +1 @@
+@import './styles/index.scss';
diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json
new file mode 100644
index 0000000..7cc0ccb
--- /dev/null
+++ b/uni_modules/uni-scss/package.json
@@ -0,0 +1,82 @@
+{
+  "id": "uni-scss",
+  "displayName": "uni-scss 杈呭姪鏍峰紡",
+  "version": "1.0.3",
+  "description": "uni-sass鏄痷ni-ui鎻愪緵鐨勪竴濂楀叏灞�鏍峰紡 锛岄�氳繃涓�浜涚畝鍗曠殑绫诲悕鍜宻ass鍙橀噺锛屽疄鐜扮畝鍗曠殑椤甸潰甯冨眬鎿嶄綔锛屾瘮濡傞鑹层�佽竟璺濄�佸渾瑙掔瓑銆�",
+  "keywords": [
+    "uni-scss",
+    "uni-ui",
+    "杈呭姪鏍峰紡"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "category": [
+        "JS SDK",
+        "閫氱敤 SDK"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "n",
+          "鑱旂洘": "n"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md
new file mode 100644
index 0000000..b7d1c25
--- /dev/null
+++ b/uni_modules/uni-scss/readme.md
@@ -0,0 +1,4 @@
+`uni-sass` 鏄� `uni-ui`鎻愪緵鐨勪竴濂楀叏灞�鏍峰紡 锛岄�氳繃涓�浜涚畝鍗曠殑绫诲悕鍜宍sass`鍙橀噺锛屽疄鐜扮畝鍗曠殑椤甸潰甯冨眬鎿嶄綔锛屾瘮濡傞鑹层�佽竟璺濄�佸渾瑙掔瓑銆�
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-sass)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss
new file mode 100644
index 0000000..ffac4fe
--- /dev/null
+++ b/uni_modules/uni-scss/styles/index.scss
@@ -0,0 +1,7 @@
+@import './setting/_variables.scss';
+@import './setting/_border.scss';
+@import './setting/_color.scss';
+@import './setting/_space.scss';
+@import './setting/_radius.scss';
+@import './setting/_text.scss';
+@import './setting/_styles.scss';
diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss
new file mode 100644
index 0000000..12a11c3
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_border.scss
@@ -0,0 +1,3 @@
+.uni-border {
+	border: 1px $uni-border-1 solid;
+}
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss
new file mode 100644
index 0000000..1ededd9
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_color.scss
@@ -0,0 +1,66 @@
+
+// TODO 鏆傛椂涓嶉渶瑕� class 锛岄渶瑕佺敤鎴蜂娇鐢ㄥ彉閲忓疄鐜� 锛屽鏋滀娇鐢ㄧ被鍚嶅叾瀹炲苟涓嶆帹鑽�
+// @mixin get-styles($k,$c) {
+// 	@if $k == size or $k == weight{
+// 		font-#{$k}:#{$c}
+// 	}@else{
+// 		#{$k}:#{$c}
+// 	}
+// }
+$uni-ui-color:(
+	// 涓昏壊
+	primary: $uni-primary,
+	primary-disable: $uni-primary-disable,
+	primary-light: $uni-primary-light,
+	// 杈呭姪鑹�
+	success: $uni-success,
+	success-disable: $uni-success-disable,
+	success-light: $uni-success-light,
+	warning: $uni-warning,
+	warning-disable: $uni-warning-disable,
+	warning-light: $uni-warning-light,
+	error: $uni-error,
+	error-disable: $uni-error-disable,
+	error-light: $uni-error-light,
+	info: $uni-info,
+	info-disable: $uni-info-disable,
+	info-light: $uni-info-light,
+	// 涓�ц壊
+	main-color: $uni-main-color,
+	base-color: $uni-base-color,
+	secondary-color: $uni-secondary-color,
+	extra-color: $uni-extra-color,
+	// 鑳屾櫙鑹�
+	bg-color: $uni-bg-color,
+	// 杈规棰滆壊
+	border-1: $uni-border-1,
+	border-2: $uni-border-2,
+	border-3: $uni-border-3,
+	border-4: $uni-border-4,
+	// 榛戣壊
+	black:$uni-black,
+	// 鐧借壊
+	white:$uni-white,
+	// 閫忔槑
+	transparent:$uni-transparent
+) !default;
+@each $key, $child in $uni-ui-color {
+	.uni-#{"" + $key} {
+		color: $child;
+	}
+	.uni-#{"" + $key}-bg {
+		background-color: $child;
+	}
+}
+.uni-shadow-sm {
+	box-shadow: $uni-shadow-sm;
+}
+.uni-shadow-base {
+	box-shadow: $uni-shadow-base;
+}
+.uni-shadow-lg {
+	box-shadow: $uni-shadow-lg;
+}
+.uni-mask {
+	background-color:$uni-mask;
+}
diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss
new file mode 100644
index 0000000..9a0428b
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_radius.scss
@@ -0,0 +1,55 @@
+@mixin radius($r,$d:null ,$important: false){
+  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
+  // Key exists within the $uni-radius variable
+  @if (map-has-key($uni-radius, $r) and  $d){
+		@if $d == t {
+				border-top-left-radius:$radius-value;
+				border-top-right-radius:$radius-value;
+		}@else if $d == r {
+				border-top-right-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == b {
+				border-bottom-left-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == l {
+				border-top-left-radius:$radius-value;
+				border-bottom-left-radius:$radius-value;
+		}@else if $d == tl {
+				border-top-left-radius:$radius-value;
+		}@else if $d == tr {
+				border-top-right-radius:$radius-value;
+		}@else if $d == br {
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == bl {
+				border-bottom-left-radius:$radius-value;
+		}
+  }@else{
+		border-radius:$radius-value;
+  }
+}
+
+@each $key, $child in $uni-radius {
+	@if($key){
+		.uni-radius-#{"" + $key} {
+				@include radius($key)
+		}
+	}@else{
+		.uni-radius {
+				@include radius($key)
+		}
+	}
+}
+
+@each $direction in t, r, b, l,tl, tr, br, bl {
+	@each $key, $child in $uni-radius {
+		@if($key){
+			.uni-radius-#{"" + $direction}-#{"" + $key} {
+				@include radius($key,$direction,false)
+			}
+		}@else{
+			.uni-radius-#{$direction} {
+				@include radius($key,$direction,false)
+			}
+		}
+	}
+}
diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss
new file mode 100644
index 0000000..3c89528
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_space.scss
@@ -0,0 +1,56 @@
+
+@mixin fn($space,$direction,$size,$n) {
+	@if $n {
+		#{$space}-#{$direction}: #{$size*$uni-space-root}px
+	} @else {
+		 #{$space}-#{$direction}: #{-$size*$uni-space-root}px
+	}
+}
+@mixin get-styles($direction,$i,$space,$n){
+	@if $direction == t {
+		@include fn($space, top,$i,$n);
+	} 
+	@if $direction == r {
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == b {
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == l {
+	 @include fn($space, left,$i,$n);
+	} 
+	@if $direction == x {
+		@include fn($space, left,$i,$n);
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == y {
+		@include fn($space, top,$i,$n);
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == a {
+		@if $n {
+			#{$space}:#{$i*$uni-space-root}px;
+		} @else {
+			#{$space}:#{-$i*$uni-space-root}px;
+		}
+	} 
+}
+
+@each $orientation in m,p {
+	$space: margin;
+	@if $orientation == m {
+		$space: margin;
+	} @else {
+		$space: padding;
+	}
+	@for $i from 0 through 16 {
+		@each $direction in t, r, b, l, x, y, a {
+			.uni-#{$orientation}#{$direction}-#{$i} { 
+				@include  get-styles($direction,$i,$space,true);
+			} 
+			.uni-#{$orientation}#{$direction}-n#{$i} { 
+				@include  get-styles($direction,$i,$space,false);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss
new file mode 100644
index 0000000..689afec
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_styles.scss
@@ -0,0 +1,167 @@
+/* #ifndef APP-NVUE */
+
+$-color-white:#fff;
+$-color-black:#000;
+@mixin base-style($color) {
+	color: #fff;
+	background-color: $color;
+	border-color: mix($-color-black, $color, 8%);
+	&:not([hover-class]):active {
+		background: mix($-color-black, $color, 10%);
+		border-color: mix($-color-black, $color, 20%);
+		color: $-color-white;
+		outline: none;
+	}
+}
+@mixin is-color($color) {
+	@include base-style($color);
+	&[loading] {
+		@include base-style($color);
+		&::before {
+			margin-right:5px;
+		}
+	}
+	&[disabled] {
+	  &,
+		&[loading],
+	  &:not([hover-class]):active {
+	    color: $-color-white;
+			border-color: mix(darken($color,10%), $-color-white);
+	    background-color: mix($color, $-color-white);
+	  }
+	}
+
+}
+@mixin base-plain-style($color) {
+	color:$color;
+	background-color: mix($-color-white, $color, 90%);
+	border-color: mix($-color-white, $color, 70%);
+	&:not([hover-class]):active {
+	  background: mix($-color-white, $color, 80%);
+	  color: $color;
+	  outline: none;
+		border-color: mix($-color-white, $color, 50%);
+	}
+}
+@mixin is-plain($color){
+	&[plain] {
+		@include base-plain-style($color);
+		&[loading] {
+			@include base-plain-style($color);
+			&::before {
+				margin-right:5px;
+			}
+		}
+		&[disabled] {
+		  &,
+		  &:active {
+		    color: mix($-color-white, $color, 40%);
+		    background-color: mix($-color-white, $color, 90%);
+				border-color: mix($-color-white, $color, 80%);
+		  }
+		}
+	}
+}
+
+
+.uni-btn {
+	margin: 5px;
+	color: #393939;
+	border:1px solid #ccc;
+	font-size: 16px;
+	font-weight: 200;
+	background-color: #F9F9F9;
+	// TODO 鏆傛椂澶勭悊杈规闅愯棌涓�杈圭殑闂
+	overflow: visible;
+	&::after{
+		border: none;
+	}
+
+	&:not([type]),&[type=default] {
+		color: #999;
+		&[loading] {
+			background: none;
+			&::before {
+				margin-right:5px;
+			}
+		}
+
+
+
+		&[disabled]{
+			color: mix($-color-white, #999, 60%);
+		  &,
+			&[loading],
+		  &:active {
+				color: mix($-color-white, #999, 60%);
+		    background-color: mix($-color-white,$-color-black , 98%);
+				border-color: mix($-color-white,  #999, 85%);
+		  }
+		}
+
+		&[plain] {
+			color: #999;
+			background: none;
+			border-color: $uni-border-1;
+			&:not([hover-class]):active {
+				background: none;
+			  color: mix($-color-white, $-color-black, 80%);
+				border-color: mix($-color-white, $-color-black, 90%);
+			  outline: none;
+			}
+			&[disabled]{
+			  &,
+				&[loading],
+			  &:active {
+			    background: none;
+					color: mix($-color-white, #999, 60%);
+					border-color: mix($-color-white,  #999, 85%);
+			  }
+			}
+		}
+	}
+
+	&:not([hover-class]):active {
+	  color: mix($-color-white, $-color-black, 50%);
+	}
+
+	&[size=mini] {
+		font-size: 16px;
+		font-weight: 200;
+		border-radius: 8px;
+	}
+
+
+
+	&.uni-btn-small {
+		font-size: 14px;
+	}
+	&.uni-btn-mini {
+		font-size: 12px;
+	}
+
+	&.uni-btn-radius {
+		border-radius: 999px;
+	}
+	&[type=primary] {
+		@include is-color($uni-primary);
+		@include is-plain($uni-primary)
+	}
+	&[type=success] {
+		@include is-color($uni-success);
+		@include is-plain($uni-success)
+	}
+	&[type=error] {
+		@include is-color($uni-error);
+		@include is-plain($uni-error)
+	}
+	&[type=warning] {
+		@include is-color($uni-warning);
+		@include is-plain($uni-warning)
+	}
+	&[type=info] {
+		@include is-color($uni-info);
+		@include is-plain($uni-info)
+	}
+}
+/* #endif */
diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss
new file mode 100644
index 0000000..a34d08f
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_text.scss
@@ -0,0 +1,24 @@
+@mixin get-styles($k,$c) {
+	@if $k == size or $k == weight{
+		font-#{$k}:#{$c}
+	}@else{
+		#{$k}:#{$c}
+	}
+}
+
+@each $key, $child in $uni-headings {
+	/* #ifndef APP-NVUE */
+	.uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	.container .uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+}
diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss
new file mode 100644
index 0000000..557d3d7
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_variables.scss
@@ -0,0 +1,146 @@
+// @use "sass:math";
+@import  '../tools/functions.scss';
+// 闂磋窛鍩虹鍊嶆暟
+$uni-space-root: 2 !default;
+// 杈规鍗婂緞榛樿鍊�
+$uni-radius-root:5px !default;
+$uni-radius: () !default;
+// 杈规鍗婂緞鏂偣
+$uni-radius: map-deep-merge(
+  (
+    0: 0,
+		// TODO 褰撳墠鐗堟湰鏆傛椂涓嶆敮鎸� sm 灞炴��
+    // 'sm': math.div($uni-radius-root, 2),
+    null: $uni-radius-root,
+    'lg': $uni-radius-root * 2,
+    'xl': $uni-radius-root * 6,
+    'pill': 9999px,
+    'circle': 50%
+  ),
+  $uni-radius
+);
+// 瀛椾綋瀹舵棌
+$body-font-family: 'Roboto', sans-serif !default;
+// 鏂囨湰
+$heading-font-family: $body-font-family !default;
+$uni-headings: () !default;
+$letterSpacing: -0.01562em;
+$uni-headings: map-deep-merge(
+  (
+    'h1': (
+      size: 32px,
+			weight: 300,
+			line-height: 50px,
+			// letter-spacing:-0.01562em
+    ),
+    'h2': (
+      size: 28px,
+      weight: 300,
+      line-height: 40px,
+      // letter-spacing: -0.00833em
+    ),
+    'h3': (
+      size: 24px,
+      weight: 400,
+      line-height: 32px,
+      // letter-spacing: normal
+    ),
+    'h4': (
+      size: 20px,
+      weight: 400,
+      line-height: 30px,
+      // letter-spacing: 0.00735em
+    ),
+    'h5': (
+      size: 16px,
+      weight: 400,
+      line-height: 24px,
+      // letter-spacing: normal
+    ),
+    'h6': (
+      size: 14px,
+      weight: 500,
+      line-height: 18px,
+      // letter-spacing: 0.0125em
+    ),
+    'subtitle': (
+      size: 12px,
+      weight: 400,
+      line-height: 20px,
+      // letter-spacing: 0.00937em
+    ),
+    'body': (
+      font-size: 14px,
+			font-weight: 400,
+			line-height: 22px,
+			// letter-spacing: 0.03125em
+    ),
+    'caption': (
+      'size': 12px,
+      'weight': 400,
+      'line-height': 20px,
+      // 'letter-spacing': 0.03333em,
+      // 'text-transform': false
+    )
+  ),
+  $uni-headings
+);
+
+
+
+// 涓昏壊
+$uni-primary: #2979ff !default;
+$uni-primary-disable:lighten($uni-primary,20%) !default;
+$uni-primary-light: lighten($uni-primary,25%) !default;
+
+// 杈呭姪鑹�
+// 闄や簡涓昏壊澶栫殑鍦烘櫙鑹诧紝闇�瑕佸湪涓嶅悓鐨勫満鏅腑浣跨敤锛堜緥濡傚嵄闄╄壊琛ㄧず鍗遍櫓鐨勬搷浣滐級銆�
+$uni-success: #18bc37 !default;
+$uni-success-disable:lighten($uni-success,20%) !default;
+$uni-success-light: lighten($uni-success,25%) !default;
+
+$uni-warning: #f3a73f !default;
+$uni-warning-disable:lighten($uni-warning,20%) !default;
+$uni-warning-light: lighten($uni-warning,25%) !default;
+
+$uni-error: #e43d33 !default;
+$uni-error-disable:lighten($uni-error,20%) !default;
+$uni-error-light: lighten($uni-error,25%) !default;
+
+$uni-info: #8f939c !default;
+$uni-info-disable:lighten($uni-info,20%) !default;
+$uni-info-light: lighten($uni-info,25%) !default;
+
+// 涓�ц壊
+// 涓�ц壊鐢ㄤ簬鏂囨湰銆佽儗鏅拰杈规棰滆壊銆傞�氳繃杩愮敤涓嶅悓鐨勪腑鎬ц壊锛屾潵琛ㄧ幇灞傛缁撴瀯銆�
+$uni-main-color: #3a3a3a !default; 			// 涓昏鏂囧瓧
+$uni-base-color: #6a6a6a !default;			// 甯歌鏂囧瓧
+$uni-secondary-color: #909399 !default;	// 娆¤鏂囧瓧
+$uni-extra-color: #c7c7c7 !default;			// 杈呭姪璇存槑
+
+// 杈规棰滆壊
+$uni-border-1: #F0F0F0 !default;
+$uni-border-2: #EDEDED !default;
+$uni-border-3: #DCDCDC !default;
+$uni-border-4: #B9B9B9 !default;
+
+// 甯歌鑹�
+$uni-black: #000000 !default;
+$uni-white: #ffffff !default;
+$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
+
+// 鑳屾櫙鑹�
+$uni-bg-color: #f7f7f7 !default;
+
+/* 姘村钩闂磋窛 */
+$uni-spacing-sm: 8px !default;
+$uni-spacing-base: 15px !default;
+$uni-spacing-lg: 30px !default;
+
+// 闃村奖
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
+
+// 钂欑増
+$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;
diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss
new file mode 100644
index 0000000..ac6f63e
--- /dev/null
+++ b/uni_modules/uni-scss/styles/tools/functions.scss
@@ -0,0 +1,19 @@
+// 鍚堝苟 map
+@function map-deep-merge($parent-map, $child-map){
+	$result: $parent-map;
+	@each $key, $child in $child-map {
+		$parent-has-key: map-has-key($result, $key);
+		$parent-value: map-get($result, $key);
+		$parent-type: type-of($parent-value);
+		$child-type: type-of($child);
+		$parent-is-map: $parent-type == map;
+		$child-is-map: $child-type == map;
+			
+		@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
+			$result: map-merge($result, ( $key: $child ));
+		}@else {
+			$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
+		}
+	}
+	@return $result;
+};
diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss
new file mode 100644
index 0000000..80ee62f
--- /dev/null
+++ b/uni_modules/uni-scss/theme.scss
@@ -0,0 +1,31 @@
+// 闂磋窛鍩虹鍊嶆暟
+$uni-space-root: 2;
+// 杈规鍗婂緞榛樿鍊�
+$uni-radius-root:5px;
+// 涓昏壊
+$uni-primary: #2979ff;
+// 杈呭姪鑹�
+$uni-success: #4cd964;
+// 璀﹀憡鑹�
+$uni-warning: #f0ad4e;
+// 閿欒鑹�
+$uni-error: #dd524d;
+// 鎻忚堪鑹�
+$uni-info: #909399;
+// 涓�ц壊
+$uni-main-color: #303133;
+$uni-base-color: #606266;
+$uni-secondary-color: #909399;
+$uni-extra-color: #C0C4CC;
+// 鑳屾櫙鑹�
+$uni-bg-color: #f5f5f5;
+// 杈规棰滆壊
+$uni-border-1: #DCDFE6;
+$uni-border-2: #E4E7ED;
+$uni-border-3: #EBEEF5;
+$uni-border-4: #F2F6FC;
+
+// 甯歌鑹�
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss
new file mode 100644
index 0000000..1c062d4
--- /dev/null
+++ b/uni_modules/uni-scss/variables.scss
@@ -0,0 +1,62 @@
+@import './styles/setting/_variables.scss';
+// 闂磋窛鍩虹鍊嶆暟
+$uni-space-root: 2;
+// 杈规鍗婂緞榛樿鍊�
+$uni-radius-root:5px;
+
+// 涓昏壊
+$uni-primary: #2979ff;
+$uni-primary-disable:mix(#fff,$uni-primary,50%);
+$uni-primary-light: mix(#fff,$uni-primary,80%);
+
+// 杈呭姪鑹�
+// 闄や簡涓昏壊澶栫殑鍦烘櫙鑹诧紝闇�瑕佸湪涓嶅悓鐨勫満鏅腑浣跨敤锛堜緥濡傚嵄闄╄壊琛ㄧず鍗遍櫓鐨勬搷浣滐級銆�
+$uni-success: #18bc37;
+$uni-success-disable:mix(#fff,$uni-success,50%);
+$uni-success-light: mix(#fff,$uni-success,80%);
+
+$uni-warning: #f3a73f;
+$uni-warning-disable:mix(#fff,$uni-warning,50%);
+$uni-warning-light: mix(#fff,$uni-warning,80%);
+
+$uni-error: #e43d33;
+$uni-error-disable:mix(#fff,$uni-error,50%);
+$uni-error-light: mix(#fff,$uni-error,80%);
+
+$uni-info: #8f939c;
+$uni-info-disable:mix(#fff,$uni-info,50%);
+$uni-info-light: mix(#fff,$uni-info,80%);
+
+// 涓�ц壊
+// 涓�ц壊鐢ㄤ簬鏂囨湰銆佽儗鏅拰杈规棰滆壊銆傞�氳繃杩愮敤涓嶅悓鐨勪腑鎬ц壊锛屾潵琛ㄧ幇灞傛缁撴瀯銆�
+$uni-main-color: #3a3a3a; 			// 涓昏鏂囧瓧
+$uni-base-color: #6a6a6a;			// 甯歌鏂囧瓧
+$uni-secondary-color: #909399;	// 娆¤鏂囧瓧
+$uni-extra-color: #c7c7c7;			// 杈呭姪璇存槑
+
+// 杈规棰滆壊
+$uni-border-1: #F0F0F0;
+$uni-border-2: #EDEDED;
+$uni-border-3: #DCDCDC;
+$uni-border-4: #B9B9B9;
+
+// 甯歌鑹�
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
+
+// 鑳屾櫙鑹�
+$uni-bg-color: #f7f7f7;
+
+/* 姘村钩闂磋窛 */
+$uni-spacing-sm: 8px;
+$uni-spacing-base: 15px;
+$uni-spacing-lg: 30px;
+
+// 闃村奖
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
+
+// 钂欑増
+$uni-mask: rgba($color: #000000, $alpha: 0.4);
diff --git a/uni_modules/uni-section/changelog.md b/uni_modules/uni-section/changelog.md
new file mode 100644
index 0000000..738f2b3
--- /dev/null
+++ b/uni_modules/uni-section/changelog.md
@@ -0,0 +1,2 @@
+## 0.0.1锛�2022-07-22锛�
+- 鍒濆鍖�
diff --git a/uni_modules/uni-section/components/uni-section/uni-section.vue b/uni_modules/uni-section/components/uni-section/uni-section.vue
new file mode 100644
index 0000000..9a52e0b
--- /dev/null
+++ b/uni_modules/uni-section/components/uni-section/uni-section.vue
@@ -0,0 +1,167 @@
+<template>
+	<view class="uni-section">
+		<view class="uni-section-header" @click="onClick">
+				<view class="uni-section-header__decoration" v-if="type" :class="type" />
+        <slot v-else name="decoration"></slot>
+
+        <view class="uni-section-header__content">
+          <text :style="{'font-size':titleFontSize,'color':titleColor}" class="uni-section__content-title" :class="{'distraction':!subTitle}">{{ title }}</text>
+          <text v-if="subTitle" :style="{'font-size':subTitleFontSize,'color':subTitleColor}" class="uni-section-header__content-sub">{{ subTitle }}</text>
+        </view>
+
+        <view class="uni-section-header__slot-right">
+          <slot name="right"></slot>
+        </view>
+		</view>
+
+		<view class="uni-section-content" :style="{padding: _padding}">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+
+	/**
+	 * Section 鏍囬鏍�
+	 * @description 鏍囬鏍�
+	 * @property {String} type = [line|circle|square] 鏍囬瑁呴グ绫诲瀷
+	 * 	@value line 绔栫嚎
+	 * 	@value circle 鍦嗗舰
+	 * 	@value square 姝f柟褰�
+	 * @property {String} title 涓绘爣棰�
+	 * @property {String} titleFontSize 涓绘爣棰樺瓧浣撳ぇ灏�
+	 * @property {String} titleColor 涓绘爣棰樺瓧浣撻鑹�
+	 * @property {String} subTitle 鍓爣棰�
+	 * @property {String} subTitleFontSize 鍓爣棰樺瓧浣撳ぇ灏�
+	 * @property {String} subTitleColor 鍓爣棰樺瓧浣撻鑹�
+	 * @property {String} padding 榛樿鎻掓Ы padding
+	 */
+
+	export default {
+		name: 'UniSection',
+    emits:['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			title: {
+				type: String,
+				required: true,
+				default: ''
+			},
+      titleFontSize: {
+        type: String,
+        default: '14px'
+      },
+			titleColor:{
+				type: String,
+				default: '#333'
+			},
+			subTitle: {
+				type: String,
+				default: ''
+			},
+      subTitleFontSize: {
+        type: String,
+        default: '12px'
+      },
+      subTitleColor: {
+        type: String,
+        default: '#999'
+      },
+			padding: {
+				type: [Boolean, String],
+				default: false
+			}
+		},
+    computed:{
+      _padding(){
+        if(typeof this.padding === 'string'){
+          return this.padding
+        }
+
+        return this.padding?'10px':''
+      }
+    },
+		watch: {
+			title(newVal) {
+				if (uni.report && newVal !== '') {
+					uni.report('title', newVal)
+				}
+			}
+		},
+    methods: {
+			onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+<style lang="scss" >
+	$uni-primary: #2979ff !default;
+
+	.uni-section {
+		background-color: #fff;
+    .uni-section-header {
+      position: relative;
+      /* #ifndef APP-NVUE */
+      display: flex;
+      /* #endif */
+      flex-direction: row;
+      align-items: center;
+      padding: 12px 10px;
+      font-weight: normal;
+
+      &__decoration{
+        margin-right: 6px;
+        background-color: $uni-primary;
+        &.line {
+          width: 4px;
+          height: 12px;
+          border-radius: 10px;
+        }
+
+        &.circle {
+          width: 8px;
+          height: 8px;
+          border-top-right-radius: 50px;
+          border-top-left-radius: 50px;
+          border-bottom-left-radius: 50px;
+          border-bottom-right-radius: 50px;
+        }
+
+        &.square {
+          width: 8px;
+          height: 8px;
+        }
+      }
+
+      &__content {
+        /* #ifndef APP-NVUE */
+        display: flex;
+        /* #endif */
+        flex-direction: column;
+        flex: 1;
+        color: #333;
+
+        .distraction {
+          flex-direction: row;
+          align-items: center;
+        }
+        &-sub {
+          margin-top: 2px;
+        }
+      }
+
+      &__slot-right{
+        font-size: 14px;
+      }
+    }
+
+    .uni-section-content{
+      font-size: 14px;
+    }
+	}
+</style>
diff --git a/uni_modules/uni-section/package.json b/uni_modules/uni-section/package.json
new file mode 100644
index 0000000..0a31fb5
--- /dev/null
+++ b/uni_modules/uni-section/package.json
@@ -0,0 +1,87 @@
+{
+  "id": "uni-section",
+  "displayName": "uni-section 鏍囬鏍�",
+  "version": "0.0.1",
+  "description": "鏍囬鏍忕粍浠�",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "鏍囬鏍�"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "鍓嶇缁勪欢",
+      "閫氱敤缁勪欢"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [
+      "uni-scss"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-section/readme.md b/uni_modules/uni-section/readme.md
new file mode 100644
index 0000000..d47faab
--- /dev/null
+++ b/uni_modules/uni-section/readme.md
@@ -0,0 +1,8 @@
+## Section 鏍囬鏍�
+> **缁勪欢鍚嶏細uni-section**
+> 浠g爜鍧楋細 `uSection`
+
+uni-section 缁勪欢涓昏鐢ㄤ簬鏂囩珷銆佸垪琛ㄨ鎯呯瓑鏍囬灞曠ず
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-section)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839
diff --git a/uni_modules/uni-segmented-control/changelog.md b/uni_modules/uni-segmented-control/changelog.md
new file mode 100644
index 0000000..02d0c8a
--- /dev/null
+++ b/uni_modules/uni-segmented-control/changelog.md
@@ -0,0 +1,15 @@
+## 1.2.3锛�2024-04-02锛�
+- 淇 淇鍦ㄥ井淇″皬绋嬪簭涓媔nactiveColor澶辨晥bug
+## 1.2.2锛�2024-03-28锛�
+- 淇 鍦╲ue2涓�:style鍔ㄦ�佺粦瀹氬鑷寸紪璇戝け璐ョ殑bug
+## 1.2.1锛�2024-03-20锛�
+- 鏂板 inActiveColor灞炴�э紝鍙緵閰嶇疆鏈縺娲绘椂鐨勯鑹�
+## 1.2.0锛�2021-11-19锛�
+- 浼樺寲 缁勪欢UI锛屽苟鎻愪緵璁捐璧勬簮锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- 鏂囨。杩佺Щ锛岃瑙�:[https://uniapp.dcloud.io/component/uniui/uni-segmented-control](https://uniapp.dcloud.io/component/uniui/uni-segmented-control)
+## 1.1.0锛�2021-07-30锛�
+- 缁勪欢鍏煎 vue3锛屽浣曞垱寤簐ue3椤圭洰锛岃瑙� [uni-app 椤圭洰鏀寔 vue3 浠嬬粛](https://ask.dcloud.net.cn/article/37834)
+## 1.0.5锛�2021-05-12锛�
+- 鏂板 椤圭洰绀轰緥鍦板潃
+## 1.0.4锛�2021-02-05锛�
+- 璋冩暣涓簎ni_modules鐩綍瑙勮寖
diff --git a/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue
new file mode 100644
index 0000000..a69366a
--- /dev/null
+++ b/uni_modules/uni-segmented-control/components/uni-segmented-control/uni-segmented-control.vue
@@ -0,0 +1,146 @@
+<template>
+	<view :class="[styleType === 'text'?'segmented-control--text' : 'segmented-control--button' ]"
+		:style="{ borderColor: styleType === 'text' ? '' : activeColor }" class="segmented-control">
+		<view v-for="(item, index) in values" :class="[styleType === 'text' ? '' : 'segmented-control__item--button',
+					index === 0 && styleType === 'button' ? 'segmented-control__item--button--first' : '',
+					index === values.length - 1 && styleType === 'button' ? 'segmented-control__item--button--last':'']" :key="index"
+			:style="{backgroundColor: index === currentIndex && styleType === 'button' ? activeColor : styleType === 'button' ?inActiveColor:'transparent', borderColor: index === currentIndex && styleType === 'text' || styleType === 'button' ? activeColor : inActiveColor}"
+			class="segmented-control__item" @click="_onClick(index)">
+			<view>
+				<text
+					:style="{color:index === currentIndex? styleType === 'text'? activeColor: '#fff': styleType === 'text'? '#000': activeColor}"
+					class="segmented-control__text"
+					:class="styleType === 'text' && index === currentIndex ? 'segmented-control__item--text': ''">{{ item }}</text>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * SegmentedControl 鍒嗘鍣�
+	 * @description 鐢ㄤ綔涓嶅悓瑙嗗浘鐨勬樉绀�
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=54
+	 * @property {Number} current 褰撳墠閫変腑鐨則ab绱㈠紩鍊硷紝浠�0璁℃暟
+	 * @property {String} styleType = [button|text] 鍒嗘鍣ㄦ牱寮忕被鍨�
+	 * 	@value button 鎸夐挳绫诲瀷
+	 * 	@value text 鏂囧瓧绫诲瀷
+	 * @property {String} activeColor 閫変腑鐨勬爣绛捐儗鏅壊涓庤竟妗嗛鑹�
+	 * @property {String} inActiveColor 鏈�変腑鐨勬爣绛捐儗鏅壊涓庤竟妗嗛鑹�
+	 * @property {Array} values 閫夐」鏁扮粍
+	 * @event {Function} clickItem 缁勪欢瑙﹀彂鐐瑰嚮浜嬩欢鏃惰Е鍙戯紝e={currentIndex}
+	 */
+
+	export default {
+		name: 'UniSegmentedControl',
+		emits: ['clickItem'],
+		props: {
+			current: {
+				type: Number,
+				default: 0
+			},
+			values: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			activeColor: {
+				type: String,
+				default: '#2979FF'
+			},
+			inActiveColor: {
+				type: String,
+				default: 'transparent'
+			},
+			styleType: {
+				type: String,
+				default: 'button'
+			}
+		},
+		data() {
+			return {
+				currentIndex: 0
+			}
+		},
+		watch: {
+			current(val) {
+				if (val !== this.currentIndex) {
+					this.currentIndex = val
+				}
+			}
+		},
+		computed: {},
+		created() {
+			this.currentIndex = this.current
+		},
+		methods: {
+			_onClick(index) {
+				if (this.currentIndex !== index) {
+					this.currentIndex = index
+					this.$emit('clickItem', {
+						currentIndex: index
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.segmented-control {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		height: 36px;
+		overflow: hidden;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.segmented-control__item {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		box-sizing: border-box;
+		/* #endif */
+		position: relative;
+		flex: 1;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.segmented-control__item--button {
+		border-style: solid;
+		border-top-width: 1px;
+		border-bottom-width: 1px;
+		border-right-width: 1px;
+		border-left-width: 0;
+	}
+
+	.segmented-control__item--button--first {
+		border-left-width: 1px;
+		border-top-left-radius: 5px;
+		border-bottom-left-radius: 5px;
+	}
+
+	.segmented-control__item--button--last {
+		border-top-right-radius: 5px;
+		border-bottom-right-radius: 5px;
+	}
+
+	.segmented-control__item--text {
+		border-bottom-style: solid;
+		border-bottom-width: 2px;
+		padding: 6px 0;
+	}
+
+	.segmented-control__text {
+		font-size: 14px;
+		line-height: 20px;
+		text-align: center;
+	}
+</style>
diff --git a/uni_modules/uni-segmented-control/package.json b/uni_modules/uni-segmented-control/package.json
new file mode 100644
index 0000000..49f9eff
--- /dev/null
+++ b/uni_modules/uni-segmented-control/package.json
@@ -0,0 +1,85 @@
+{
+  "id": "uni-segmented-control",
+  "displayName": "uni-segmented-control 鍒嗘鍣�",
+  "version": "1.2.3",
+  "description": "鍒嗘鍣ㄧ敱鑷冲皯 2 涓垎娈垫帶浠剁粍鎴愶紝鐢ㄤ綔涓嶅悓瑙嗗浘鐨勬樉绀�",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "鍒嗘鍣�",
+    "segement",
+    "椤堕儴閫夋嫨"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "鏃�",
+      "data": "鏃�",
+      "permissions": "鏃�"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "寰俊娴忚鍣�(Android)": "y",
+          "QQ娴忚鍣�(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "灏忕▼搴�": {
+          "寰俊": "y",
+          "闃块噷": "y",
+          "鐧惧害": "y",
+          "瀛楄妭璺冲姩": "y",
+          "QQ": "y"
+        },
+        "蹇簲鐢�": {
+          "鍗庝负": "u",
+          "鑱旂洘": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-segmented-control/readme.md b/uni_modules/uni-segmented-control/readme.md
new file mode 100644
index 0000000..3527b03
--- /dev/null
+++ b/uni_modules/uni-segmented-control/readme.md
@@ -0,0 +1,13 @@
+
+
+## SegmentedControl 鍒嗘鍣�
+> **缁勪欢鍚嶏細uni-segmented-control**
+> 浠g爜鍧楋細 `uSegmentedControl`
+
+
+鐢ㄤ綔涓嶅悓瑙嗗浘鐨勬樉绀�
+
+### [鏌ョ湅鏂囨。](https://uniapp.dcloud.io/component/uniui/uni-segmented-control)
+#### 濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箄ni-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 uni-ui 浜ゆ祦缇わ細871950839 
+
+
diff --git a/uni_modules/wu-button/changelog.md b/uni_modules/wu-button/changelog.md
new file mode 100644
index 0000000..0581c78
--- /dev/null
+++ b/uni_modules/wu-button/changelog.md
@@ -0,0 +1,6 @@
+## 1.0.2锛�2024-05-08锛�
+鏇存柊鍩熷悕
+## 1.0.1锛�2023-09-11锛�
+鑷畾涔夌粍浠跺0鏄�
+## 1.0.0锛�2023-08-03锛�
+鎸夐挳缁勪欢鍐呴儴瀹炵幇浠ni-app鐨刡utton缁勪欢涓哄熀纭�锛岃繘琛屼簩娆″皝瑁咃紝鐏垫椿閰嶇疆锛屽姛鑳介綈鍏紝鍏煎鍏ㄧ銆�
diff --git a/uni_modules/wu-button/components/wu-button/nvue.scss b/uni_modules/wu-button/components/wu-button/nvue.scss
new file mode 100644
index 0000000..74cbc7f
--- /dev/null
+++ b/uni_modules/wu-button/components/wu-button/nvue.scss
@@ -0,0 +1,46 @@
+$wu-button-active-opacity:0.75 !default;
+$wu-button-loading-text-margin-left:4px !default;
+$wu-button-text-color: #FFFFFF !default;
+$wu-button-text-plain-error-color:$wu-error !default;
+$wu-button-text-plain-warning-color:$wu-warning !default;
+$wu-button-text-plain-success-color:$wu-success !default;
+$wu-button-text-plain-info-color:$wu-info !default;
+$wu-button-text-plain-primary-color:$wu-primary !default;
+.wu-button {
+	&--active {
+		opacity: $wu-button-active-opacity;
+	}
+	
+	&--active--plain {
+		background-color: rgb(217, 217, 217);
+	}
+	
+	&__loading-text {
+		margin-left:$wu-button-loading-text-margin-left;
+	}
+	
+	&__text,
+	&__loading-text {
+		color:$wu-button-text-color;
+	}
+	
+	&__text--plain--error {
+		color:$wu-button-text-plain-error-color;
+	}
+	
+	&__text--plain--warning {
+		color:$wu-button-text-plain-warning-color;
+	}
+	
+	&__text--plain--success{
+		color:$wu-button-text-plain-success-color;
+	}
+	
+	&__text--plain--info {
+		color:$wu-button-text-plain-info-color;
+	}
+	
+	&__text--plain--primary {
+		color:$wu-button-text-plain-primary-color;
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-button/components/wu-button/props.js b/uni_modules/wu-button/components/wu-button/props.js
new file mode 100644
index 0000000..2694422
--- /dev/null
+++ b/uni_modules/wu-button/components/wu-button/props.js
@@ -0,0 +1,158 @@
+export default {
+	props: {
+		// 鏄惁缁嗚竟妗�
+		hairline: {
+			type: Boolean,
+			default: true
+		},
+		// 鎸夐挳鐨勯缃牱寮忥紝info锛宲rimary锛宔rror锛寃arning锛宻uccess
+		type: {
+			type: String,
+			default: 'info'
+		},
+		// 鎸夐挳灏哄锛宭arge锛宯ormal锛宻mall锛宮ini
+		size: {
+			type: String,
+			default: 'normal'
+		},
+		// 鎸夐挳褰㈢姸锛宑ircle锛堜袱杈逛负鍗婂渾锛夛紝square锛堝甫鍦嗚锛�
+		shape: {
+			type: String,
+			default: 'square'
+		},
+		// 鎸夐挳鏄惁闀傜┖
+		plain: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁绂佹鐘舵��
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鍔犺浇涓�
+		loading: {
+			type: Boolean,
+			default: false
+		},
+		// 鍔犺浇涓彁绀烘枃瀛�
+		loadingText: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鍔犺浇鐘舵�佸浘鏍囩被鍨�
+		loadingMode: {
+			type: String,
+			default: 'spinner'
+		},
+		// 鍔犺浇鍥炬爣澶у皬
+		loadingSize: {
+			type: [String, Number],
+			default: 14
+		},
+		// 寮�鏀捐兘鍔涳紝鍏蜂綋璇风湅uniapp绋冲畾鍏充簬button缁勪欢閮ㄥ垎璇存槑
+		// https://uniapp.dcloud.io/component/button
+		openType: {
+			type: String,
+			default: ''
+		},
+		// 鐢ㄤ簬 <form> 缁勪欢锛岀偣鍑诲垎鍒細瑙﹀彂 <form> 缁勪欢鐨� submit/reset 浜嬩欢
+		// 鍙栧�间负submit锛堟彁浜よ〃鍗曪級锛宺eset锛堥噸缃〃鍗曪級
+		formType: {
+			type: String,
+			default: ''
+		},
+		// 鎵撳紑 APP 鏃讹紝鍚� APP 浼犻�掔殑鍙傛暟锛宱pen-type=launchApp鏃舵湁鏁�
+		// 鍙井淇″皬绋嬪簭銆丵Q灏忕▼搴忔湁鏁�
+		appParameter: {
+			type: String,
+			default: ''
+		},
+		// 鎸囧畾鏄惁闃绘鏈妭鐐圭殑绁栧厛鑺傜偣鍑虹幇鐐瑰嚮鎬侊紝寰俊灏忕▼搴忔湁鏁�
+		hoverStopPropagation: {
+			type: Boolean,
+			default: true
+		},
+		// 鎸囧畾杩斿洖鐢ㄦ埛淇℃伅鐨勮瑷�锛寊h_CN 绠�浣撲腑鏂囷紝zh_TW 绻佷綋涓枃锛宔n 鑻辨枃銆傚彧寰俊灏忕▼搴忔湁鏁�
+		lang: {
+			type: String,
+			default: 'en'
+		},
+		// 浼氳瘽鏉ユ簮锛宱pen-type="contact"鏃舵湁鏁堛�傚彧寰俊灏忕▼搴忔湁鏁�
+		sessionFrom: {
+			type: String,
+			default: ''
+		},
+		// 浼氳瘽鍐呮秷鎭崱鐗囨爣棰橈紝open-type="contact"鏃舵湁鏁�
+		// 榛樿褰撳墠鏍囬锛屽彧寰俊灏忕▼搴忔湁鏁�
+		sendMessageTitle: {
+			type: String,
+			default: ''
+		},
+		// 浼氳瘽鍐呮秷鎭崱鐗囩偣鍑昏烦杞皬绋嬪簭璺緞锛宱pen-type="contact"鏃舵湁鏁�
+		// 榛樿褰撳墠鍒嗕韩璺緞锛屽彧寰俊灏忕▼搴忔湁鏁�
+		sendMessagePath: {
+			type: String,
+			default: ''
+		},
+		// 浼氳瘽鍐呮秷鎭崱鐗囧浘鐗囷紝open-type="contact"鏃舵湁鏁�
+		// 榛樿褰撳墠椤甸潰鎴浘锛屽彧寰俊灏忕▼搴忔湁鏁�
+		sendMessageImg: {
+			type: String,
+			default: ''
+		},
+		// 鏄惁鏄剧ず浼氳瘽鍐呮秷鎭崱鐗囷紝璁剧疆姝ゅ弬鏁颁负 true锛岀敤鎴疯繘鍏ュ鏈嶄細璇濅細鍦ㄥ彸涓嬭鏄剧ず"鍙兘瑕佸彂閫佺殑灏忕▼搴�"鎻愮ず锛�
+		// 鐢ㄦ埛鐐瑰嚮鍚庡彲浠ュ揩閫熷彂閫佸皬绋嬪簭娑堟伅锛宱pen-type="contact"鏃舵湁鏁�
+		showMessageCard: {
+			type: Boolean,
+			default: true
+		},
+		// 棰濆浼犲弬鍙傛暟锛岀敤浜庡皬绋嬪簭鐨刣ata-xxx灞炴�э紝閫氳繃target.dataset.name鑾峰彇
+		dataName: {
+			type: String,
+			default: ''
+		},
+		// 鑺傛祦锛屼竴瀹氭椂闂村唴鍙兘瑙﹀彂涓�娆�
+		throttleTime: {
+			type: [String, Number],
+			default: 0
+		},
+		// 鎸変綇鍚庡涔呭嚭鐜扮偣鍑绘�侊紝鍗曚綅姣
+		hoverStartTime: {
+			type: [String, Number],
+			default: 0
+		},
+		// 鎵嬫寚鏉惧紑鍚庣偣鍑绘�佷繚鐣欐椂闂达紝鍗曚綅姣
+		hoverStayTime: {
+			type: [String, Number],
+			default: 200
+		},
+		// 鎸夐挳鏂囧瓧锛屼箣鎵�浠ラ�氳繃props浼犲叆锛屾槸鍥犱负slot浼犲叆鐨勮瘽
+		// nvue涓棤娉曟帶鍒舵枃瀛楃殑鏍峰紡
+		text: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鎸夐挳鍥炬爣
+		icon: {
+			type: String,
+			default: ''
+		},
+		// 鎸夐挳鍥炬爣棰滆壊
+		iconColor: {
+			type: String,
+			default: '#000000'
+		},
+		// 鎸夐挳棰滆壊锛屾敮鎸佷紶鍏inear-gradient娓愬彉鑹�
+		color: {
+			type: String,
+			default: ''
+		},
+		// 鑷畾涔夋寜閽枃鏈牱寮�
+		customTextStyle: {
+			type: [Object,String],
+			default: ()=>{}
+		},
+		...uni.$w?.props?.button
+	}
+}
diff --git a/uni_modules/wu-button/components/wu-button/vue.scss b/uni_modules/wu-button/components/wu-button/vue.scss
new file mode 100644
index 0000000..15dee79
--- /dev/null
+++ b/uni_modules/wu-button/components/wu-button/vue.scss
@@ -0,0 +1,82 @@
+@import '@/uni_modules/wu-ui-tools/libs/css/color.scss';
+// nvue涓媓over-class鏃犳晥
+$wu-button-before-top:50% !default;
+$wu-button-before-left:50% !default;
+$wu-button-before-width:100% !default;
+$wu-button-before-height:100% !default;
+$wu-button-before-transform:translate(-50%, -50%) !default;
+$wu-button-before-opacity:0 !default;
+$wu-button-before-background-color:#000 !default;
+$wu-button-before-border-color:#000 !default;
+$wu-button-active-before-opacity:.15 !default;
+$wu-button-icon-margin-left:4px !default;
+$wu-button-plain-wu-button-info-color:$wu-info;
+$wu-button-plain-wu-button-success-color:$wu-success;
+$wu-button-plain-wu-button-error-color:$wu-error;
+$wu-button-plain-wu-button-warning-color:$wu-error;
+
+.wu-button-wrapper {
+	position: relative;
+	width: 100%;
+	
+	&--dis {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 9;
+	}
+}
+
+.wu-button {
+	width: 100%;
+	&__text {
+		white-space: nowrap;
+		line-height: 1;
+	}
+	
+	&:before {
+		position: absolute;
+		top:$wu-button-before-top;
+		left:$wu-button-before-left;
+		width:$wu-button-before-width;
+		height:$wu-button-before-height;
+		border: inherit;
+		border-radius: inherit;
+		transform:$wu-button-before-transform;
+		opacity:$wu-button-before-opacity;
+		content: " ";
+		background-color:$wu-button-before-background-color;
+		border-color:$wu-button-before-border-color;
+	}
+	
+	&--active {
+		&:before {
+			opacity: .15
+		}
+	}
+	
+	&__icon+&__text:not(:empty),
+	&__loading-text {
+		margin-left:$wu-button-icon-margin-left;
+	}
+	
+	&--plain {
+		&.wu-button--primary {
+			color: $wu-primary;
+		}
+		&.wu-button--info {
+			color:$wu-button-plain-wu-button-info-color;
+		}
+		&.wu-button--success {
+			color:$wu-button-plain-wu-button-success-color;
+		}
+		&.wu-button--error {
+			color:$wu-button-plain-wu-button-error-color;
+		}
+		&.wu-button--warning {
+			color:$wu-button-plain-wu-button-warning-color;
+		}
+	}
+}
diff --git a/uni_modules/wu-button/components/wu-button/wu-button.vue b/uni_modules/wu-button/components/wu-button/wu-button.vue
new file mode 100644
index 0000000..a343564
--- /dev/null
+++ b/uni_modules/wu-button/components/wu-button/wu-button.vue
@@ -0,0 +1,458 @@
+<template>
+	<view class="wu-button-wrapper">
+		<!-- #ifndef APP-NVUE -->
+		<!-- #ifdef MP -->
+		<!-- 涓轰簡瑙e喅寰俊灏忕▼搴忓姩鎬佽缃甴over-class鐐瑰嚮鎬佷笉娑堝け鐨凚UG -->
+		<view class="wu-button-wrapper--dis" v-if="disabled || loading"></view>
+		<button :hover-start-time="Number(hoverStartTime)" :hover-stay-time="Number(hoverStayTime)"
+			:form-type="formType" :open-type="openType" :app-parameter="appParameter"
+			:hover-stop-propagation="hoverStopPropagation" :send-message-title="sendMessageTitle"
+			:send-message-path="sendMessagePath" :lang="lang" :data-name="dataName" :session-from="sessionFrom"
+			:send-message-img="sendMessageImg" :show-message-card="showMessageCard" @getphonenumber="onGetPhoneNumber"
+			@getuserinfo="onGetUserInfo" @error="onError" @opensetting="onOpenSetting" @launchapp="onLaunchApp"
+			@contact="onContact" @chooseavatar="onChooseavatar" @addgroupapp="onAddgroupapp"
+			@chooseaddress="onChooseaddress" @subscribe="onSubscribe" @login="onLogin" @im="onIm"
+			hover-class="wu-button--active" class="wu-button wu-reset-button"
+			:style="[baseColor, $w.addStyle(customStyle)]" @tap="clickHandler" :class="bemClass">
+		<!-- #endif -->
+		<!-- #ifndef MP -->
+		<button :hover-start-time="Number(hoverStartTime)" :hover-stay-time="Number(hoverStayTime)"
+			:form-type="formType" :open-type="openType" :app-parameter="appParameter"
+			:hover-stop-propagation="hoverStopPropagation" :send-message-title="sendMessageTitle"
+			:send-message-path="sendMessagePath" :lang="lang" :data-name="dataName" :session-from="sessionFrom"
+			:send-message-img="sendMessageImg" :show-message-card="showMessageCard"
+			:hover-class="!disabled && !loading ? 'wu-button--active' : ''" class="wu-button wu-reset-button"
+			:style="[baseColor, $w.addStyle(customStyle)]" @tap="clickHandler" :class="bemClass">
+		<!-- #endif -->
+			<template v-if="loading">
+				<wu-loading-icon :mode="loadingMode" :size="loadingSize * 1.15"
+					:color="loadingColor"></wu-loading-icon>
+				<text class="wu-button__loading-text" :style="[
+						{ fontSize: textSize + 'px' },
+						$w.addStyle(customTextStyle)
+					]">{{ loadingText || text }}</text>
+			</template>
+			<template v-else>
+				<wu-icon v-if="icon" :name="icon" :color="iconColorCom" :size="textSize * 1.35"
+					:customStyle="{ marginRight: '2px' }"></wu-icon>
+				<slot>
+					<text class="wu-button__text" :style="[
+						{ fontSize: textSize + 'px' },
+						$w.addStyle(customTextStyle)
+					]">{{ text }}</text>
+				</slot>
+			</template>
+		</button>
+		<!-- #endif -->
+		<!-- #ifdef APP-NVUE -->
+		<view :hover-start-time="Number(hoverStartTime)" :hover-stay-time="Number(hoverStayTime)" class="wu-button"
+			:hover-class="
+			!disabled && !loading && !color && (plain || type === 'info')
+			? 'wu-button--active--plain'
+			: !disabled && !loading && !plain
+			? 'wu-button--active'
+			: ''" 
+			@tap="clickHandler" :class="bemClass" :style="[baseColor, $w.addStyle(customStyle)]">
+			<template v-if="loading">
+				<wu-loading-icon :mode="loadingMode" :size="loadingSize * 1.15"
+					:color="loadingColor"></wu-loading-icon>
+				<text class="wu-button__loading-text" :style="[nvueTextStyle,$w.addStyle(customTextStyle)]"
+					:class="[plain && `wu-button__text--plain--${type}`]">{{ loadingText || text }}</text>
+			</template>
+			<template v-else>
+				<wu-icon v-if="icon" :name="icon" :color="iconColorCom" :size="textSize * 1.35"></wu-icon>
+				<text class="wu-button__text" 
+				:style="[
+					{
+					  marginLeft: icon ? '2px' : 0,
+					},
+					nvueTextStyle,
+					$w.addStyle(customTextStyle)
+				]" 
+				:class="[plain && `wu-button__text--plain--${type}`]">{{ text }}</text>
+			</template>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import throttle from '@/uni_modules/wu-ui-tools/libs/function/throttle.js';
+	import mpMixin from '@/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/wu-ui-tools/libs/mixin/mixin.js'
+	import button from '@/uni_modules/wu-ui-tools/libs/mixin/button.js'
+	import openType from '@/uni_modules/wu-ui-tools/libs/mixin/openType.js'
+	import props from "./props.js";
+	/**
+	 * button 鎸夐挳
+	 * @description Button 鎸夐挳
+	 * @tutorial https://wuui.cn/zh-CN/components/button.html
+	 * @property {Boolean}			hairline				鏄惁鏄剧ず鎸夐挳鐨勭粏杈规 (榛樿 true )
+	 * @property {String}			type					鎸夐挳鐨勯缃牱寮忥紝info锛宲rimary锛宔rror锛寃arning锛宻uccess (榛樿 'info' )
+	 *  @value info 榛樿鎸夐挳
+	 *  @value primary 涓婚鎸夐挳
+	 *  @value error 鍗遍櫓鎸夐挳
+	 *  @value warning  璀﹀憡鎸夐挳
+	 *  @value success 鎴愬姛鎸夐挳
+	 * @property {String}			size					鎸夐挳灏哄锛宭arge锛宯ormal锛宮ini 锛堥粯璁� normal锛�
+	 *  @value large 瓒呭ぇ灏哄
+	 *  @value normal 鏅�氬昂瀵�
+	 *  @value mini 杩蜂綘灏哄
+	 * @property {String}			shape					鎸夐挳褰㈢姸锛宑ircle锛堜袱杈逛负鍗婂渾锛夛紝square锛堝甫鏈変竴瀹氱殑鍦嗚锛� 锛堥粯璁� 'square' 锛�
+	 * @value circle 涓よ竟涓哄崐鍦�
+	 * @value square 甯︽湁涓�瀹氱殑鍦嗚
+	 * @property {Boolean}			plain					鎸夐挳鏄惁闀傜┖锛岃儗鏅壊閫忔槑 锛堥粯璁� false锛�
+	 * @property {Boolean}			disabled				鏄惁绂佺敤 锛堥粯璁� false锛�
+	 * @property {Boolean}			loading					鎸夐挳鍚嶇О鍓嶆槸鍚﹀甫 loading 鍥炬爣(App-nvue 骞冲彴锛屽湪 ios 涓婁负闆姳锛孉ndroid涓婁负鍦嗗湀) 锛堥粯璁� false锛�
+	 * @property {String | Number}	loadingText				鍔犺浇涓彁绀烘枃瀛�
+	 * @property {String}			loadingMode				鍔犺浇鐘舵�佸浘鏍囩被鍨� 锛堥粯璁� 'spinner' 锛�
+	 * @property {String | Number}	loadingSize				鍔犺浇鍥炬爣澶у皬 锛堥粯璁� 15 锛�
+	 * @property {String}			openType				寮�鏀捐兘鍔涳紝鍏蜂綋璇风湅uniapp绋冲畾鍏充簬button缁勪欢閮ㄥ垎璇存槑
+	 * @property {String}			formType				鐢ㄤ簬 <form> 缁勪欢锛岀偣鍑诲垎鍒細瑙﹀彂 <form> 缁勪欢鐨� submit/reset 浜嬩欢
+	 * @property {String}			appParameter			鎵撳紑 APP 鏃讹紝鍚� APP 浼犻�掔殑鍙傛暟锛宱pen-type=launchApp鏃舵湁鏁� 锛堟敞锛氬彧寰俊灏忕▼搴忋�丵Q灏忕▼搴忔湁鏁堬級
+	 * @property {Boolean}			hoverStopPropagation	鎸囧畾鏄惁闃绘鏈妭鐐圭殑绁栧厛鑺傜偣鍑虹幇鐐瑰嚮鎬侊紝寰俊灏忕▼搴忔湁鏁堬紙榛樿 true 锛�
+	 * @property {String}			lang					鎸囧畾杩斿洖鐢ㄦ埛淇℃伅鐨勮瑷�锛寊h_CN 绠�浣撲腑鏂囷紝zh_TW 绻佷綋涓枃锛宔n 鑻辨枃锛堥粯璁� en 锛�
+	 * @property {String}			sessionFrom				浼氳瘽鏉ユ簮锛宱penType="contact"鏃舵湁鏁�
+	 * @property {String}			sendMessageTitle		浼氳瘽鍐呮秷鎭崱鐗囨爣棰橈紝openType="contact"鏃舵湁鏁�
+	 * @property {String}			sendMessagePath			浼氳瘽鍐呮秷鎭崱鐗囩偣鍑昏烦杞皬绋嬪簭璺緞锛宱penType="contact"鏃舵湁鏁�
+	 * @property {String}			sendMessageImg			浼氳瘽鍐呮秷鎭崱鐗囧浘鐗囷紝openType="contact"鏃舵湁鏁�
+	 * @property {Boolean}			showMessageCard			鏄惁鏄剧ず浼氳瘽鍐呮秷鎭崱鐗囷紝璁剧疆姝ゅ弬鏁颁负 true锛岀敤鎴疯繘鍏ュ鏈嶄細璇濅細鍦ㄥ彸涓嬭鏄剧ず"鍙兘瑕佸彂閫佺殑灏忕▼搴�"鎻愮ず锛岀敤鎴风偣鍑诲悗鍙互蹇�熷彂閫佸皬绋嬪簭娑堟伅锛宱penType="contact"鏃舵湁鏁堬紙榛樿false锛�
+	 * @property {String}			dataName				棰濆浼犲弬鍙傛暟锛岀敤浜庡皬绋嬪簭鐨刣ata-xxx灞炴�э紝閫氳繃target.dataset.name鑾峰彇
+	 * @property {String | Number}	throttleTime			鑺傛祦锛屼竴瀹氭椂闂村唴鍙兘瑙﹀彂涓�娆� 锛堥粯璁� 0 )
+	 * @property {String | Number}	hoverStartTime			鎸変綇鍚庡涔呭嚭鐜扮偣鍑绘�侊紝鍗曚綅姣 锛堥粯璁� 0 )
+	 * @property {String | Number}	hoverStayTime			鎵嬫寚鏉惧紑鍚庣偣鍑绘�佷繚鐣欐椂闂达紝鍗曚綅姣 锛堥粯璁� 200 )
+	 * @property {String | Number}	text					鎸夐挳鏂囧瓧锛屼箣鎵�浠ラ�氳繃props浼犲叆锛屾槸鍥犱负slot浼犲叆鐨勮瘽锛堟敞锛歯vue涓棤娉曟帶鍒舵枃瀛楃殑鏍峰紡锛�
+	 * @property {String}			icon					鎸夐挳鍥炬爣
+	 * @property {String}			iconColor				鎸夐挳鍥炬爣棰滆壊
+	 * @property {String}			color					鎸夐挳棰滆壊锛屾敮鎸佷紶鍏inear-gradient娓愬彉鑹�
+	 * @property {Object}			customStyle				瀹氫箟闇�瑕佺敤鍒扮殑澶栭儴鏍峰紡
+	 * @event {Function}	click			闈炵姝㈠苟涓旈潪鍔犺浇涓紝鎵嶈兘鐐瑰嚮
+	 * @event {Function}	getphonenumber	open-type="getPhoneNumber"鏃舵湁鏁�
+	 * @event {Function}	getuserinfo		鐢ㄦ埛鐐瑰嚮璇ユ寜閽椂锛屼細杩斿洖鑾峰彇鍒扮殑鐢ㄦ埛淇℃伅锛屼粠杩斿洖鍙傛暟鐨刣etail涓幏鍙栧埌鐨勫�煎悓uni.getUserInfo
+	 * @event {Function}	error			褰撲娇鐢ㄥ紑鏀捐兘鍔涙椂锛屽彂鐢熼敊璇殑鍥炶皟
+	 * @event {Function}	opensetting		鍦ㄦ墦寮�鎺堟潈璁剧疆椤靛苟鍏抽棴鍚庡洖璋�
+	 * @event {Function}	launchapp		鎵撳紑 APP 鎴愬姛鐨勫洖璋�
+	 * @example <wu-button>鍗冮噾鏁e敖杩樺鏉�</wu-button>
+	 */
+	export default {
+		name: "wu-button",
+		// #ifdef MP
+		mixins: [mpMixin, mixin, button, openType, props],
+		// #endif
+		// #ifndef MP
+		mixins: [mpMixin, mixin, props],
+		// #endif
+		emits: ['click'],
+		data() {
+			return {};
+		},
+		computed: {
+			// 鐢熸垚bem椋庢牸鐨勭被鍚�
+			bemClass() {
+				// this.bem涓轰竴涓猚omputed鍙橀噺锛屽湪mixin涓�
+				if (!this.color) {
+					return this.bem("button",
+						["type", "shape", "size"],
+						["disabled", "plain", "hairline"]);
+				} else {
+					// 鐢变簬nvue鐨勫師鍥狅紝鍦ㄦ湁color鍙傛暟鏃讹紝涓嶉渶瑕佷紶鍏ype锛屽惁鍒欎細鐢熸垚type鐩稿叧鐨勭被鍨嬶紝褰卞搷鏈�缁堢殑鏍峰紡
+					return this.bem("button",
+						["shape", "size"],
+						["disabled", "plain", "hairline"]);
+				}
+			},
+			loadingColor() {
+				if (this.plain) {
+					// 濡傛灉鏈夎缃甤olor鍊硷紝鍒欑敤color鍊硷紝鍚﹀垯浣跨敤type涓婚棰滆壊
+					return this.color ? this.color : '#3c9cff';
+				}
+				if (this.type === "info") {
+					return "#c9c9c9";
+				}
+				return "rgb(200, 200, 200)";
+			},
+			iconColorCom() {
+				// 濡傛灉鏄晜绌虹姸鎬侊紝璁剧疆浜哻olor灏辩敤color鍊硷紝鍚﹀垯浣跨敤涓婚棰滆壊锛�
+				// wu-icon鐨刢olor鑳芥帴鍙椾竴涓富棰橀鑹茬殑鍊�
+				if (this.iconColor) return this.iconColor;
+				if (this.plain) {
+					return this.color ? this.color : this.type;
+				} else {
+					return this.type === "info" ? "#000000" : "#ffffff";
+				}
+			},
+			baseColor() {
+				let style = {};
+				if (this.color) {
+					// 閽堝鑷畾涔変簡color棰滆壊鐨勬儏鍐碉紝闀傜┖鐘舵�佷笅锛屽氨鏄敤鑷畾涔夌殑棰滆壊
+					style.color = this.plain ? this.color : "white";
+					if (!this.plain) {
+						// 闈為晜绌猴紝鑳屾櫙鑹蹭娇鐢ㄨ嚜瀹氫箟鐨勯鑹�
+						style["background-color"] = this.color;
+					}
+					if (this.color.indexOf("gradient") !== -1) {
+						// 濡傛灉鑷畾涔夌殑棰滆壊涓烘笎鍙樿壊锛屼笉鏄剧ず杈规锛屼互鍙婇�氳繃backgroundImage璁剧疆娓愬彉鑹�
+						// weex鏂囨。璇存槑鍙互鍐檅orderWidth鐨勫舰寮忥紝涓轰粈涔堣繖閲岄渶瑕佸垎寮�鍐欙紵
+						// 鍥犱负weex鏄樋閲屽反宸翠负浜嗛儴闂ㄤ笟缁╄�冩牳鑰屽仛鐨勪綘鎳傜殑涓滆タ锛屾墍浠ラ渶瑕佽繖涔堝啓鎵嶆湁鏁�
+						if (!this.plain) {
+							style.borderTopWidth = "0";
+							style.borderRightWidth = "0";
+							style.borderBottomWidth = "0";
+							style.borderLeftWidth = "0";
+							style.backgroundImage = this.color;
+						} else {
+							style.border = '1px solid #000';
+							style.color = '#000'
+						}
+					} else {
+						// 闈炴笎鍙樿壊锛屽垯璁剧疆杈规鐩稿叧鐨勫睘鎬�
+						style.borderColor = this.color;
+						style.borderWidth = "1px";
+						style.borderStyle = "solid";
+					}
+				}
+				return style;
+			},
+			// nvue鐗堟湰鎸夐挳鐨勫瓧浣撲笉浼氱户鎵跨埗缁勪欢鐨勯鑹诧紝闇�瑕佸姣忎竴涓猼ext缁勪欢杩涜鍗曠嫭鐨勮缃�
+			nvueTextStyle() {
+				let style = {};
+				// 閽堝鑷畾涔変簡color棰滆壊鐨勬儏鍐碉紝闀傜┖鐘舵�佷笅锛屽氨鏄敤鑷畾涔夌殑棰滆壊
+				if (this.type === "info") {
+					style.color = "#323233";
+				}
+				if (this.color) {
+					style.color = this.plain ? this.color : "white";
+				}
+				style.fontSize = this.textSize + "px";
+				return style;
+			},
+			// 瀛椾綋澶у皬
+			textSize() {
+				let fontSize = 14,
+					{
+						size
+					} = this;
+				if (size === "large") fontSize = 16;
+				if (size === "normal") fontSize = 14;
+				if (size === "small") fontSize = 12;
+				if (size === "mini") fontSize = 10;
+				return fontSize;
+			},
+		},
+		methods: {
+			clickHandler() {
+				// 闈炵姝㈠苟涓旈潪鍔犺浇涓紝鎵嶈兘鐐瑰嚮
+				if (!this.disabled && !this.loading) {
+					// 杩涜鑺傛祦鎺у埗锛屾瘡this.throttle姣鍐咃紝鍙湪寮�濮嬪鎵ц
+					throttle(() => {
+						this.$emit("click");
+					}, this.throttleTime);
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	$show-reset-button: 1;
+	@import '@/uni_modules/wu-ui-tools/libs/css/variable.scss';
+	@import '@/uni_modules/wu-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/wu-ui-tools/libs/css/color.scss';
+
+	/* #ifndef APP-NVUE */
+	@import "./vue.scss";
+	/* #endif */
+
+	/* #ifdef APP-NVUE */
+	// @import "./nvue.scss";
+	/* #endif */
+
+	$wu-button-wu-button-height: 40px !default;
+	$wu-button-text-font-size: 15px !default;
+	$wu-button-loading-text-font-size: 15px !default;
+	$wu-button-loading-text-margin-left: 4px !default;
+	$wu-button-large-width: 100% !default;
+	$wu-button-large-height: 50px !default;
+	$wu-button-normal-padding: 0 12px !default;
+	$wu-button-large-padding: 0 15px !default;
+	$wu-button-normal-font-size: 14px !default;
+	$wu-button-small-min-width: 60px !default;
+	$wu-button-small-height: 30px !default;
+	$wu-button-small-padding: 0px 8px !default;
+	$wu-button-mini-padding: 0px 8px !default;
+	$wu-button-small-font-size: 12px !default;
+	$wu-button-mini-height: 22px !default;
+	$wu-button-mini-font-size: 10px !default;
+	$wu-button-mini-min-width: 50px !default;
+	$wu-button-disabled-opacity: 0.5 !default;
+	$wu-button-info-color: #323233 !default;
+	$wu-button-info-background-color: #fff !default;
+	$wu-button-info-border-color: #ebedf0 !default;
+	$wu-button-info-border-width: 1px !default;
+	$wu-button-info-border-style: solid !default;
+	$wu-button-success-color: #fff !default;
+	$wu-button-success-background-color: $wu-success !default;
+	$wu-button-success-border-color: $wu-button-success-background-color !default;
+	$wu-button-success-border-width: 1px !default;
+	$wu-button-success-border-style: solid !default;
+	$wu-button-primary-color: #fff !default;
+	$wu-button-primary-background-color: $wu-primary !default;
+	$wu-button-primary-border-color: $wu-button-primary-background-color !default;
+	$wu-button-primary-border-width: 1px !default;
+	$wu-button-primary-border-style: solid !default;
+	$wu-button-error-color: #fff !default;
+	$wu-button-error-background-color: $wu-error !default;
+	$wu-button-error-border-color: $wu-button-error-background-color !default;
+	$wu-button-error-border-width: 1px !default;
+	$wu-button-error-border-style: solid !default;
+	$wu-button-warning-color: #fff !default;
+	$wu-button-warning-background-color: $wu-warning !default;
+	$wu-button-warning-border-color: $wu-button-warning-background-color !default;
+	$wu-button-warning-border-width: 1px !default;
+	$wu-button-warning-border-style: solid !default;
+	$wu-button-block-width: 100% !default;
+	$wu-button-circle-border-top-right-radius: 100px !default;
+	$wu-button-circle-border-top-left-radius: 100px !default;
+	$wu-button-circle-border-bottom-left-radius: 100px !default;
+	$wu-button-circle-border-bottom-right-radius: 100px !default;
+	$wu-button-square-border-top-right-radius: 3px !default;
+	$wu-button-square-border-top-left-radius: 3px !default;
+	$wu-button-square-border-bottom-left-radius: 3px !default;
+	$wu-button-square-border-bottom-right-radius: 3px !default;
+	$wu-button-icon-min-width: 1em !default;
+	$wu-button-plain-background-color: #fff !default;
+	$wu-button-hairline-border-width: 0.5px !default;
+
+	.wu-button {
+		height: $wu-button-wu-button-height;
+		position: relative;
+		align-items: center;
+		justify-content: center;
+		@include flex;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		flex-direction: row;
+		margin-left: auto;
+		margin-right: auto;
+
+		&__text {
+			font-size: $wu-button-text-font-size;
+		}
+
+		&__loading-text {
+			font-size: $wu-button-loading-text-font-size;
+			margin-left: $wu-button-loading-text-margin-left;
+		}
+
+		&--large {
+			/* #ifndef APP-NVUE */
+			width: $wu-button-large-width;
+			/* #endif */
+			height: $wu-button-large-height;
+			padding: $wu-button-large-padding;
+		}
+
+		&--normal {
+			padding: $wu-button-normal-padding;
+			font-size: $wu-button-normal-font-size;
+		}
+
+		&--small {
+			/* #ifndef APP-NVUE */
+			min-width: $wu-button-small-min-width;
+			/* #endif */
+			height: $wu-button-small-height;
+			padding: $wu-button-small-padding;
+			font-size: $wu-button-small-font-size;
+		}
+
+		&--mini {
+			height: $wu-button-mini-height;
+			font-size: $wu-button-mini-font-size;
+			/* #ifndef APP-NVUE */
+			min-width: $wu-button-mini-min-width;
+			/* #endif */
+			padding: $wu-button-mini-padding;
+		}
+
+		&--disabled {
+			opacity: $wu-button-disabled-opacity;
+		}
+
+		&--info {
+			color: $wu-button-info-color;
+			background-color: $wu-button-info-background-color;
+			border-color: $wu-button-info-border-color;
+			border-width: $wu-button-info-border-width;
+			border-style: $wu-button-info-border-style;
+		}
+
+		&--success {
+			color: $wu-button-success-color;
+			background-color: $wu-button-success-background-color;
+			border-color: $wu-button-success-border-color;
+			border-width: $wu-button-success-border-width;
+			border-style: $wu-button-success-border-style;
+		}
+
+		&--primary {
+			color: $wu-button-primary-color;
+			background-color: $wu-button-primary-background-color;
+			border-color: $wu-button-primary-border-color;
+			border-width: $wu-button-primary-border-width;
+			border-style: $wu-button-primary-border-style;
+		}
+
+		&--error {
+			color: $wu-button-error-color;
+			background-color: $wu-button-error-background-color;
+			border-color: $wu-button-error-border-color;
+			border-width: $wu-button-error-border-width;
+			border-style: $wu-button-error-border-style;
+		}
+
+		&--warning {
+			color: $wu-button-warning-color;
+			background-color: $wu-button-warning-background-color;
+			border-color: $wu-button-warning-border-color;
+			border-width: $wu-button-warning-border-width;
+			border-style: $wu-button-warning-border-style;
+		}
+
+		&--block {
+			@include flex;
+			width: $wu-button-block-width;
+		}
+
+		&--circle {
+			border-top-right-radius: $wu-button-circle-border-top-right-radius;
+			border-top-left-radius: $wu-button-circle-border-top-left-radius;
+			border-bottom-left-radius: $wu-button-circle-border-bottom-left-radius;
+			border-bottom-right-radius: $wu-button-circle-border-bottom-right-radius;
+		}
+
+		&--square {
+			border-bottom-left-radius: $wu-button-square-border-top-right-radius;
+			border-bottom-right-radius: $wu-button-square-border-top-left-radius;
+			border-top-left-radius: $wu-button-square-border-bottom-left-radius;
+			border-top-right-radius: $wu-button-square-border-bottom-right-radius;
+		}
+
+		&__icon {
+			/* #ifndef APP-NVUE */
+			min-width: $wu-button-icon-min-width;
+			line-height: inherit !important;
+			vertical-align: top;
+			/* #endif */
+		}
+
+		&--plain {
+			background-color: $wu-button-plain-background-color;
+		}
+
+		&--hairline {
+			border-width: $wu-button-hairline-border-width !important;
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/uni_modules/wu-button/package.json b/uni_modules/wu-button/package.json
new file mode 100644
index 0000000..a160914
--- /dev/null
+++ b/uni_modules/wu-button/package.json
@@ -0,0 +1,90 @@
+{
+	"id": "wu-button",
+	"displayName": "wu-button 鎸夐挳 鍏ㄩ潰鍏煎vue3+2銆乤pp銆乭5銆佸皬绋嬪簭绛夊绔�",
+	"version": "1.0.2",
+	"description": "鎸夐挳缁勪欢鍐呴儴瀹炵幇浠ni-app鐨刡utton缁勪欢涓哄熀纭�锛岃繘琛屼簩娆″皝瑁咃紝鐏垫椿閰嶇疆锛屽姛鑳介綈鍏紝鍏煎鍏ㄧ銆�",
+	"keywords": [
+        "wu-button",
+        "button",
+        "鎸夐挳",
+        "wuui",
+        "wu-ui"
+    ],
+	"repository": "",
+	"engines": {
+		"HBuilderX": "^3.4.15"
+	},
+	"dcloudext": {
+		"type": "component-vue",
+		"sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "鏃�",
+			"data": "鎻掍欢涓嶉噰闆嗕换浣曟暟鎹�",
+			"permissions": "鏃�"
+		},
+		"npmurl": ""
+	},
+	"uni_modules": {
+		"dependencies": [
+			"wu-icon",
+			"wu-loading-icon",
+			"wu-ui-tools"
+		],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+                "aliyun": "y",
+                "alipay": "n"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"寰俊娴忚鍣�(Android)": "y",
+					"QQ娴忚鍣�(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"灏忕▼搴�": {
+					"寰俊": "y",
+					"闃块噷": "y",
+					"鐧惧害": "y",
+					"瀛楄妭璺冲姩": "y",
+					"QQ": "y",
+					"閽夐拤": "y",
+					"蹇墜": "y",
+					"椋炰功": "y",
+					"浜笢": "y"
+				},
+				"蹇簲鐢�": {
+					"鍗庝负": "y",
+					"鑱旂洘": "y"
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-button/readme.md b/uni_modules/wu-button/readme.md
new file mode 100644
index 0000000..8b1926e
--- /dev/null
+++ b/uni_modules/wu-button/readme.md
@@ -0,0 +1,16 @@
+## wu-button 鎸夐挳
+
+> **缁勪欢鍚嶏細wu-button**
+
+璇ョ粍浠跺唴閮ㄥ疄鐜颁互 `uni-app` 鐨� `button` 缁勪欢涓哄熀纭�锛岃繘琛屼簩娆″皝瑁咃紝鐏垫椿閰嶇疆锛屽姛鑳介綈鍏紝鍏煎鍏ㄧ銆傜伒娲婚厤缃紝鍐呯疆鐘舵�佽缃紝寮�绠卞嵆鐢ㄣ��
+
+## [鏌ョ湅鏂囨。](https://wuui.cn/zh-CN/components/button.html)
+
+## [鏇村缁勪欢, 璇锋煡鐪� `wu-ui` 缁勪欢搴揮(https://ext.dcloud.net.cn/plugin?name=wu--ui)
+(璇峰嬁涓嬭浇鎻掍欢zip)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=wu--ui">
+	<img src="https://wuui.cn/intr.png">
+</a>
+
+**濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箇u-ui鏈変竴浜涘ソ鐨勫缓璁��<br>娆㈣繋鍔犲叆 [wu-ui 浜ゆ祦缇(https://wuui.cn/zh-CN/components/qqFeedBack.html)**
\ No newline at end of file
diff --git a/uni_modules/wu-icon/changelog.md b/uni_modules/wu-icon/changelog.md
new file mode 100644
index 0000000..8b940ba
--- /dev/null
+++ b/uni_modules/wu-icon/changelog.md
@@ -0,0 +1,10 @@
+## 1.0.4锛�2024-05-08锛�
+鏇存柊鍩熷悕
+## 1.0.3锛�2023-08-08锛�
+淇閾炬帴寮曞叆閿欒
+## 1.0.2锛�2023-08-07锛�
+淇寮曞叆閿欒
+## 1.0.1锛�2023-08-07锛�
+鏀寔鑷畾涔�(鍖呮嫭nvue)鏂囧瓧涓庡浘鐗囧浘鏍�
+## 1.0.0锛�2023-08-03锛�
+鍩轰簬瀛椾綋鐨勫浘鏍囬泦锛屽寘鍚簡澶у鏁板父瑙佸満鏅殑鍥炬爣锛屾敮鎸佽嚜瀹氫箟锛屾敮鎸佽嚜瀹氫箟鍥剧墖鍥炬爣绛夈�傚彲鑷畾涔夐鑹层�佸ぇ灏忋��
diff --git a/uni_modules/wu-icon/components/wu-icon/icons.js b/uni_modules/wu-icon/components/wu-icon/icons.js
new file mode 100644
index 0000000..1eb5e4f
--- /dev/null
+++ b/uni_modules/wu-icon/components/wu-icon/icons.js
@@ -0,0 +1,159 @@
+export default {
+	'wuicon-level': 'e68f',
+    'wuicon-download': 'e670',
+    'wuicon-search': 'e632',
+    'wuicon-reload': 'e627',
+    'wuicon-scan': 'e631',
+    'wuicon-calendar': 'e65c',
+    'wuicon-bag': 'e647',
+    'wuicon-checkbox-mark': 'e659',
+    'wuicon-attach': 'e640',
+	'wuicon-wifi-off': 'e6cc',
+    
+	'wuicon-woman': 'e626',
+    'wuicon-man': 'e675',
+    'wuicon-chat': 'e656',
+	'wuicon-chat-fill': 'e63f',
+    'wuicon-red-packet': 'e6c3',
+	'wuicon-folder': 'e694',
+    'wuicon-order': 'e695',
+    'wuicon-arrow-up-fill': 'e636',
+	'wuicon-arrow-down-fill': 'e638',
+	'wuicon-backspace': 'e64d',
+    'wuicon-photo': 'e60d',
+	'wuicon-photo-fill': 'e6b4',
+    'wuicon-lock': 'e69d',
+	'wuicon-lock-fill': 'e6a6',
+	'wuicon-lock-open': 'e68d',
+	'wuicon-lock-opened-fill': 'e6a1',
+    'wuicon-home': 'e67b',
+	'wuicon-home-fill': 'e68e',
+    'wuicon-star': 'e618',
+	'wuicon-star-fill': 'e61e',
+    'wuicon-share': 'e629',
+	'wuicon-share-fill': 'e6bb',
+	'wuicon-share-square': 'e6c4',
+    'wuicon-volume': 'e605',
+	'wuicon-volume-fill': 'e624',
+	'wuicon-volume-off': 'e6bd',
+	'wuicon-volume-off-fill': 'e6c8',
+    'wuicon-trash': 'e623',
+	'wuicon-trash-fill': 'e6ce',
+    'wuicon-shopping-cart': 'e6cb',
+	'wuicon-shopping-cart-fill': 'e630',
+    'wuicon-question-circle': 'e622',
+	'wuicon-question-circle-fill': 'e6bc',
+    'wuicon-plus': 'e625',
+    'wuicon-plus-circle': 'e603',
+	'wuicon-plus-circle-fill': 'e611',
+    'wuicon-tags': 'e621',
+	'wuicon-tags-fill': 'e613',
+    'wuicon-pause': 'e61c',
+	'wuicon-pause-circle': 'e696',
+	'wuicon-pause-circle-fill': 'e60c',
+    'wuicon-play-circle': 'e6af',
+	'wuicon-play-circle-fill': 'e62a',
+    'wuicon-map': 'e665',
+	'wuicon-map-fill': 'e6a8',
+    'wuicon-phone': 'e6ba',
+	'wuicon-phone-fill': 'e6ac',
+    'wuicon-list': 'e690',
+	'wuicon-list-dot': 'e6a9',
+    'wuicon-info-circle': 'e69f',
+	'wuicon-info-circle-fill': 'e6a7',
+    'wuicon-minus': 'e614',
+    'wuicon-minus-circle': 'e6a5',
+    'wuicon-mic': 'e66d',
+	'wuicon-mic-off': 'e691',
+    'wuicon-grid': 'e68c',
+	'wuicon-grid-fill': 'e698',
+    'wuicon-eye': 'e664',
+	'wuicon-eye-fill': 'e697',
+	'wuicon-eye-off': 'e69c',
+	'wuicon-eye-off-outline': 'e688',
+    'wuicon-file-text': 'e687',
+	'wuicon-file-text-fill': 'e67f',
+    'wuicon-edit-pen': 'e65d',
+	'wuicon-edit-pen-fill': 'e679',
+    'wuicon-email': 'e673',
+	'wuicon-email-fill': 'e683',
+    'wuicon-checkmark': 'e64a',
+	'wuicon-checkmark-circle': 'e643',
+	'wuicon-checkmark-circle-fill': 'e668',
+    'wuicon-clock': 'e66c',
+	'wuicon-clock-fill': 'e64b',
+    'wuicon-close': 'e65a',
+    'wuicon-close-circle': 'e64e',
+	'wuicon-close-circle-fill': 'e666',
+    'wuicon-car': 'e64f',
+	'wuicon-car-fill': 'e648',
+    'wuicon-bell': 'e651',
+	'wuicon-bell-fill': 'e604',
+    'wuicon-play-left': 'e6bf',
+	'wuicon-play-right': 'e6b3',
+    'wuicon-play-left-fill': 'e6ae',
+	'wuicon-play-right-fill': 'e6ad',
+    'wuicon-skip-back-left': 'e6c5',
+	'wuicon-skip-forward-right': 'e61f',
+    'wuicon-setting': 'e602',
+	'wuicon-setting-fill': 'e6d0',
+    'wuicon-more-dot-fill': 'e66f',
+    'wuicon-more-circle': 'e69e',
+	'wuicon-more-circle-fill': 'e684',
+    'wuicon-arrow-upward': 'e641',
+	'wuicon-arrow-downward': 'e634',
+	'wuicon-arrow-leftward': 'e63b',
+	'wuicon-arrow-rightward': 'e644',
+	'wuicon-arrow-up': 'e633',
+	'wuicon-arrow-down': 'e63e',
+	'wuicon-arrow-left': 'e646',
+	'wuicon-arrow-right': 'e63c',
+    'wuicon-thumb-up': 'e612',
+	'wuicon-thumb-up-fill': 'e62c',
+	'wuicon-thumb-down': 'e60a',
+	'wuicon-thumb-down-fill': 'e628',
+    'wuicon-coupon': 'e65f',
+	'wuicon-coupon-fill': 'e64c',
+    'wuicon-kefu-ermai': 'e660',
+	'wuicon-server-fill': 'e610',
+    'wuicon-server-man': 'e601',
+    'wuicon-warning': 'e6c1',
+	'wuicon-warning-fill': 'e6c7',
+    'wuicon-camera': 'e642',
+	'wuicon-camera-fill': 'e650',
+    'wuicon-pushpin': 'e6d1',
+	'wuicon-pushpin-fill': 'e6b6',
+    'wuicon-heart': 'e6a2',
+	'wuicon-heart-fill': 'e68b',
+    'wuicon-account': 'e63a',
+	'wuicon-account-fill': 'e653',
+    'wuicon-integral': 'e693',
+	'wuicon-integral-fill': 'e6b1',
+	'wuicon-gift': 'e680',
+    'wuicon-gift-fill': 'e6b0',
+    
+
+    'wuicon-empty-data': 'e671',
+	'wuicon-empty-address': 'e68a',
+    'wuicon-empty-favor': 'e662',
+    'wuicon-empty-car': 'e656',
+	'wuicon-empty-order': 'e66b',
+	'wuicon-empty-list': 'e671',
+	'wuicon-empty-search': 'e677',
+	'wuicon-empty-permission': 'e67c',
+	'wuicon-empty-news': 'e67d',
+	'wuicon-empty-history': 'e684',
+	'wuicon-empty-coupon': 'e69b',
+	'wuicon-empty-page': 'e60e',
+
+    'wuicon-apple-fill': 'e635',
+    'wuicon-zhifubao-circle-fill': 'e617',
+	'wuicon-weixin-circle-fill': 'e6cd',
+	'wuicon-weixin-fill': 'e620',
+	'wuicon-qq-fill': 'e608',
+	'wuicon-qq-circle-fill': 'e6b9',
+	'wuicon-moments': 'e6a0',
+	'wuicon-moments-circel-fill': 'e6c2',
+    'wuicon-twitter': 'e607',
+	'wuicon-twitter-circle-fill': 'e6cf',
+}
\ No newline at end of file
diff --git a/uni_modules/wu-icon/components/wu-icon/props.js b/uni_modules/wu-icon/components/wu-icon/props.js
new file mode 100644
index 0000000..d35f2c4
--- /dev/null
+++ b/uni_modules/wu-icon/components/wu-icon/props.js
@@ -0,0 +1,90 @@
+export default {
+	props: {
+		// 鍥炬爣绫诲悕
+		name: {
+			type: String,
+			default: ''
+		},
+		// 鍥炬爣棰滆壊锛屽彲鎺ュ彈涓婚鑹�
+		color: {
+			type: String,
+			default: '#606266'
+		},
+		// 瀛椾綋澶у皬锛屽崟浣峱x
+		size: {
+			type: [String, Number],
+			default: '16px'
+		},
+		// 鏄惁鏄剧ず绮椾綋
+		bold: {
+			type: Boolean,
+			default: false
+		},
+		// 鐐瑰嚮鍥炬爣鐨勬椂鍊欎紶閫掍簨浠跺嚭鍘荤殑index锛堢敤浜庡尯鍒嗙偣鍑讳簡鍝竴涓級
+		index: {
+			type: [String, Number],
+			default: null
+		},
+		// 瑙︽懜鍥炬爣鏃剁殑绫诲悕
+		hoverClass: {
+			type: String,
+			default: ''
+		},
+		// 鑷畾涔夋墿灞曞墠缂�锛屾柟渚跨敤鎴锋墿灞曡嚜宸辩殑鍥炬爣搴�
+		customPrefix: {
+			type: String,
+			default: 'wuicon'
+		},
+		// 鍥炬爣鍙宠竟鎴栬�呬笅闈㈢殑鏂囧瓧
+		label: {
+			type: [String, Number],
+			default: ''
+		},
+		// label鐨勪綅缃紝鍙兘鍙宠竟鎴栬�呬笅杈�
+		labelPos: {
+			type: String,
+			default: 'right'
+		},
+		// label鐨勫ぇ灏�
+		labelSize: {
+			type: [String, Number],
+			default: '15px'
+		},
+		// label鐨勯鑹�
+		labelColor: {
+			type: String,
+			default: '#606266'
+		},
+		// label涓庡浘鏍囩殑璺濈
+		space: {
+			type: [String, Number],
+			default: '3px'
+		},
+		// 鍥剧墖鐨刴ode
+		imgMode: {
+			type: String,
+			default: ''
+		},
+		// 鐢ㄤ簬鏄剧ず鍥剧墖灏忓浘鏍囨椂锛屽浘鐗囩殑瀹藉害
+		width: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鐢ㄤ簬鏄剧ず鍥剧墖灏忓浘鏍囨椂锛屽浘鐗囩殑楂樺害
+		height: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鐢ㄤ簬瑙e喅鏌愪簺鎯呭喌涓嬶紝璁╁浘鏍囧瀭鐩村眳涓殑鐢ㄩ��
+		top: {
+			type: [String, Number],
+			default: 0
+		},
+		// 鏄惁闃绘浜嬩欢浼犳挱
+		stop: {
+			type: Boolean,
+			default: false
+		},
+		...uni.$w?.props?.icon
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-icon/components/wu-icon/wu-icon.vue b/uni_modules/wu-icon/components/wu-icon/wu-icon.vue
new file mode 100644
index 0000000..dea833f
--- /dev/null
+++ b/uni_modules/wu-icon/components/wu-icon/wu-icon.vue
@@ -0,0 +1,225 @@
+<template>
+	<view class="wu-icon" @tap="clickHandler" :class="['wu-icon--' + labelPos]">
+		<!-- 杩欓噷杩涜绌哄瓧绗︿覆鍒ゆ柇锛屽鏋滀粎浠呮槸v-if="label"锛屽彲鑳戒細鍑虹幇浼犻��0鐨勬椂鍊欙紝缁撴灉涔熸棤娉曟樉绀� -->
+		<text v-if="label !== '' && (labelPos == 'left' || labelPos == 'top')" class="wu-icon__label" :style="labelStyle">{{ label }}</text>
+		<image class="wu-icon__img" v-if="isImg" :src="name" :mode="imgMode"
+			:style="[imgStyle, $w.addStyle(customStyle)]"></image>
+		<text v-else class="wu-icon__icon" :class="uClasses" :style="[iconStyle, $w.addStyle(customStyle)]"
+			:hover-class="hoverClass">{{icon}}</text>
+		<!-- 杩欓噷杩涜绌哄瓧绗︿覆鍒ゆ柇锛屽鏋滀粎浠呮槸v-if="label"锛屽彲鑳戒細鍑虹幇浼犻��0鐨勬椂鍊欙紝缁撴灉涔熸棤娉曟樉绀� -->
+		<text v-if="label !== '' && (labelPos == 'right' || labelPos == 'bottom')" class="wu-icon__label" :style="labelStyle">{{ label }}</text>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/wu-ui-tools/libs/mixin/mixin.js'
+	// #ifdef APP-NVUE
+	// nvue閫氳繃weex鐨刣om妯″潡寮曞叆瀛椾綋锛岀浉鍏虫枃妗e湴鍧�濡備笅锛�
+	// https://weex.apache.org/zh/docs/modules/dom.html#addrule
+	import iconUrl from './wuicons.ttf';
+	const domModule = weex.requireModule('dom');
+	domModule.addRule('fontFace', {
+		'fontFamily': "wuicon-iconfont",
+		'src': "url('" + iconUrl + "')"
+	})
+	// #endif
+	// 寮曞叆鍥炬爣鍚嶇О锛屽凡缁忓搴旂殑unicode
+	import icons from './icons';
+	import props from './props.js';
+	/**
+	 * icon 鍥炬爣
+	 * @description 鍩轰簬瀛椾綋鐨勫浘鏍囬泦锛屽寘鍚簡澶у鏁板父瑙佸満鏅殑鍥炬爣銆�
+	 * @tutorial https://wuui.cn/zh-CN/components/icon.html
+	 * @property {String}			name			鍥炬爣鍚嶇О锛岃嫢甯︽湁 `/` 鎴栭伒寰� `base64` 鍥剧墖鏍煎紡锛屼細琚涓烘槸鍥剧墖鍥炬爣锛屽垯鏂囧瓧鍥炬爣鐩稿叧灞炴�т細澶辨晥銆�
+	 * @property {String}			color			鍥炬爣棰滆壊,鍙帴鍙椾富棰樿壊 锛堥粯璁� color: #606266 锛�
+	 * @property {String | Number}	size			鍥炬爣瀛椾綋澶у皬锛屽崟浣峱x/rpx 锛堥粯璁� '16px' 锛�
+	 * @property {Boolean}			bold			鏄惁鏄剧ず绮椾綋 锛堥粯璁� false 锛�
+	 * @property {String | Number}	index			鐐瑰嚮鍥炬爣鐨勬椂鍊欎紶閫掍簨浠跺嚭鍘荤殑index锛堢敤浜庡尯鍒嗙偣鍑讳簡鍝竴涓級
+	 * @property {String}			hoverClass		鍥炬爣鎸変笅鍘荤殑鏍峰紡绫伙紝鐢ㄦ硶鍚寀ni鐨剉iew缁勪欢鐨刪overClass鍙傛暟锛岃鎯呰瀹樼綉
+	 * @property {String}			customPrefix	鑷畾涔夋墿灞曞墠缂�锛屾柟渚跨敤鎴锋墿灞曡嚜宸辩殑鍥炬爣搴� 锛堥粯璁� 'wuicon' 锛�
+	 * @property {String | Number}	label			鍥炬爣鍙充晶鐨刲abel鏂囧瓧
+	 * @property {String}			labelPos		label鐩稿浜庡浘鏍囩殑浣嶇疆锛堥粯璁� 'right' 锛�
+	 * @value top 涓婃柟
+	 * @value bottom 涓嬫柟
+	 * @value left 宸︿晶
+	 * @value right 鍙充晶
+	 * @property {String | Number}	labelSize		label瀛椾綋澶у皬锛屽崟浣峱x 锛堥粯璁� '15px' 锛�
+	 * @property {String}			labelColor		鍥炬爣鍙充晶鐨刲abel鏂囧瓧棰滆壊 锛� 榛樿 color['wu-content-color'] 锛�
+	 * @property {String | Number}	space			label涓庡浘鏍囩殑璺濈锛屽崟浣峱x 锛堥粯璁� '3px' 锛�
+	 * @property {String}			imgMode			image缁勪欢鐨刴ode锛岃瑙侊細[image](https://uniapp.dcloud.net.cn/component/image.html#image)
+	 * @property {String | Number}	width			鏄剧ず鍥剧墖灏忓浘鏍囨椂鐨勫搴�
+	 * @property {String | Number}	height			鏄剧ず鍥剧墖灏忓浘鏍囨椂鐨勯珮搴�
+	 * @property {String | Number}	top				鍥炬爣鍦ㄥ瀭鐩存柟鍚戜笂鐨勫畾浣� 鐢ㄤ簬瑙e喅鏌愪簺鎯呭喌涓嬶紝璁╁浘鏍囧瀭鐩村眳涓殑鐢ㄩ��  锛堥粯璁� 0 锛�
+	 * @property {Boolean}			stop			鏄惁闃绘浜嬩欢浼犳挱 锛堥粯璁� false 锛�
+	 * @property {Object}			customStyle		icon鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @event {Function} click 鐐瑰嚮鍥炬爣鏃惰Е鍙�
+	 * @event {Function} touchstart 浜嬩欢瑙︽懜鏃惰Е鍙�
+	 * @example <wu-icon name="photo" color="#2979ff" size="28"></wu-icon>
+	 */
+	export default {
+		name: 'wu-icon',
+		emits: ['click'],
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				colorType: [
+					'primary',
+					'success',
+					'info',
+					'error',
+					'warning'
+				]
+			}
+		},
+		computed: {
+			uClasses() {
+				let classes = []
+				classes.push(this.customPrefix)
+				classes.push(this.customPrefix + '-' + this.name)
+				// 涓婚鑹诧紝閫氳繃绫婚厤缃�
+				if (this.color && this.colorType.includes(this.color)) classes.push('wu-icon__icon--' + this.color)
+				// 闃块噷锛屽ご鏉★紝鐧惧害灏忕▼搴忛�氳繃鏁扮粍缁戝畾绫诲悕鏃讹紝鏃犳硶鐩存帴浣跨敤[a, b, c]鐨勫舰寮忥紝鍚﹀垯鏃犳硶璇嗗埆
+				// 鏁呴渶灏嗗叾鎷嗘垚涓�涓瓧绗︿覆鐨勫舰寮忥紝閫氳繃绌烘牸闅斿紑鍚勪釜绫诲悕
+				//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
+				classes = classes.join(' ')
+				//#endif
+				return classes
+			},
+			iconStyle() {
+				let style = {}
+				style = {
+					fontSize: this.$w.addUnit(this.size),
+					lineHeight: this.$w.addUnit(this.size),
+					fontWeight: this.bold ? 'bold' : 'normal',
+					// 鏌愪簺鐗规畩鎯呭喌闇�瑕佽缃竴涓埌椤堕儴鐨勮窛绂伙紝鎵嶈兘鏇村ソ鐨勫瀭鐩村眳涓�
+					top: this.$w.addUnit(this.top)
+				}
+				// 闈炰富棰樿壊鍊兼椂锛屾墠褰撲綔棰滆壊鍊�
+				if (this.color && !this.colorType.includes(this.color)) style.color = this.color
+				return style
+			},
+			// 鍒ゆ柇浼犲叆鐨刵ame灞炴�э紝鏄惁鍥剧墖璺緞锛屽彧瑕佸甫鏈�"/"鍧囪涓烘槸鍥剧墖褰㈠紡
+			isImg() {
+				const isBase64 = this.name.indexOf('data:') > -1 && this.name.indexOf('base64') > -1;
+				return this.name.indexOf('/') !== -1 || isBase64;
+			},
+			imgStyle() {
+				let style = {}
+				// 濡傛灉璁剧疆width鍜宧eight灞炴�э紝鍒欎紭鍏堜娇鐢紝鍚﹀垯浣跨敤size灞炴��
+				style.width = this.width ? this.$w.addUnit(this.width) : this.$w.addUnit(this.size)
+				style.height = this.height ? this.$w.addUnit(this.height) : this.$w.addUnit(this.size)
+				return style
+			},
+			// 閫氳繃鍥炬爣鍚嶏紝鏌ユ壘瀵瑰簲鐨勫浘鏍�
+			icon() {
+				// 濡傛灉鍐呯疆鐨勫浘鏍囦腑鎵句笉鍒板搴旂殑鍥炬爣锛屽氨鐩存帴杩斿洖name鍊硷紝鍥犱负鐢ㄦ埛鍙兘浼犲叆鐨勬槸unicode浠g爜
+				const code = icons['wuicon-' + this.name];
+				if (['wuicon'].indexOf(this.customPrefix) > -1) {
+					return code ? unescape(`%u${code}`) : this.name;
+				} else {
+					// #ifndef APP-NVUE
+					return ''
+					// #endif
+					// #ifdef APP-NVUE
+					return unescape(`%u${this.name}`)
+					// #endif
+				}
+			},
+			// label鏍峰紡
+			labelStyle() {
+				let style = {
+					color: this.labelColor,
+					fontSize: this.$w.addUnit(this.labelSize),
+					marginLeft: this.labelPos == 'right' ? this.$w.addUnit(this.space) : 0,
+					marginTop: this.labelPos == 'bottom' ? this.$w.addUnit(this.space) : 0,
+					marginRight: this.labelPos == 'left' ? this.$w.addUnit(this.space) : 0,
+					marginBottom: this.labelPos == 'top' ? this.$w.addUnit(this.space) : 0
+				};
+				return style
+			}
+		},
+		methods: {
+			clickHandler(e) {
+				this.$emit('click', this.index)
+				// 鏄惁闃绘浜嬩欢鍐掓场
+				this.stop && this.preventEvent(e)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '@/uni_modules/wu-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/wu-ui-tools/libs/css/color.scss';
+	// 鍙橀噺瀹氫箟
+	$wu-icon-primary: $wu-primary !default;
+	$wu-icon-success: $wu-success !default;
+	$wu-icon-info: $wu-info !default;
+	$wu-icon-warning: $wu-warning !default;
+	$wu-icon-error: $wu-error !default;
+	$wu-icon-label-line-height: 1 !default;
+
+	/* #ifndef APP-NVUE */
+	// 闈瀗vue涓嬪姞杞藉瓧浣�
+	@font-face {
+		font-family: 'wuicon-iconfont';
+		src: url('./wuicons.ttf') format('truetype');
+	}
+
+	/* #endif */
+	.wu-icon {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+
+		&--left, &--right {
+			flex-direction: row;
+		}
+		
+		&--top, &--bottom {
+			flex-direction: column;
+		}
+
+		&__icon {
+			font-family: wuicon-iconfont;
+			position: relative;
+			@include flex;
+			align-items: center;
+
+			&--primary {
+				color: $wu-icon-primary;
+			}
+
+			&--success {
+				color: $wu-icon-success;
+			}
+
+			&--error {
+				color: $wu-icon-error;
+			}
+
+			&--warning {
+				color: $wu-icon-warning;
+			}
+
+			&--info {
+				color: $wu-icon-info;
+			}
+		}
+
+		&__img {
+			/* #ifndef APP-NVUE */
+			height: auto;
+			will-change: transform;
+			/* #endif */
+		}
+
+		&__label {
+			/* #ifndef APP-NVUE */
+			line-height: $wu-icon-label-line-height;
+			/* #endif */
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/uni_modules/wu-icon/components/wu-icon/wuicons.ttf b/uni_modules/wu-icon/components/wu-icon/wuicons.ttf
new file mode 100644
index 0000000..9aedef8
--- /dev/null
+++ b/uni_modules/wu-icon/components/wu-icon/wuicons.ttf
Binary files differ
diff --git a/uni_modules/wu-icon/package.json b/uni_modules/wu-icon/package.json
new file mode 100644
index 0000000..641288c
--- /dev/null
+++ b/uni_modules/wu-icon/package.json
@@ -0,0 +1,87 @@
+{
+	"id": "wu-icon",
+	"displayName": "wu-icon 鍥炬爣  鍏ㄩ潰鍏煎灏忕▼搴忋�乶vue銆乿ue2銆乿ue3绛夊绔�",
+	"version": "1.0.4",
+	"description": "鍩轰簬瀛椾綋鐨勫浘鏍囬泦锛屽寘鍚簡澶у鏁板父瑙佸満鏅殑鍥炬爣锛屾敮鎸佽嚜瀹氫箟锛屾敮鎸佽嚜瀹氫箟鍥剧墖鍥炬爣绛夈�傚彲鑷畾涔夐鑹层�佸ぇ灏忋��",
+	"keywords": [
+        "wu-ui",
+        "鍥炬爣",
+        "wu-icon",
+        "鏂囧瓧鍥炬爣"
+    ],
+	"repository": "",
+	"engines": {
+		"HBuilderX": "^3.4.15"
+	},
+	"dcloudext": {
+		"type": "component-vue",
+		"sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "鏃�",
+			"data": "鎻掍欢涓嶉噰闆嗕换浣曟暟鎹�",
+			"permissions": "鏃�"
+		},
+		"npmurl": ""
+	},
+	"uni_modules": {
+		"dependencies": [
+			"wu-ui-tools"
+		],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+                "aliyun": "y",
+                "alipay": "n"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"寰俊娴忚鍣�(Android)": "y",
+					"QQ娴忚鍣�(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"灏忕▼搴�": {
+					"寰俊": "y",
+					"闃块噷": "y",
+					"鐧惧害": "y",
+					"瀛楄妭璺冲姩": "y",
+					"QQ": "y",
+					"閽夐拤": "u",
+					"蹇墜": "u",
+					"椋炰功": "u",
+					"浜笢": "u"
+				},
+				"蹇簲鐢�": {
+					"鍗庝负": "u",
+					"鑱旂洘": "u"
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-icon/readme.md b/uni_modules/wu-icon/readme.md
new file mode 100644
index 0000000..6ab6263
--- /dev/null
+++ b/uni_modules/wu-icon/readme.md
@@ -0,0 +1,10 @@
+## wu-icon 鍥炬爣搴�
+
+> **缁勪欢鍚嶏細wu-icon**
+
+鍩轰簬瀛椾綋鐨勫浘鏍囬泦锛屽寘鍚簡澶у鏁板父瑙佸満鏅殑鍥炬爣锛屾敮鎸佽嚜瀹氫箟(鍖呮嫭nvue)鏂囧瓧涓庡浘鐗囧浘鏍囩瓑銆�
+
+## <a href="https://wuui.cn/zh-CN/components/icon" target="_blank">鏌ョ湅鏂囨。</a>
+
+## [鏇村鎻掍欢锛岃鍏虫敞wu-ui缁勪欢搴揮(https://ext.dcloud.net.cn/plugin?name=wuui) <small>锛堣涓嶈 涓嬭浇鎻掍欢ZIP锛�</small>
+**濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箇u-ui鏈変竴浜涘ソ鐨勫缓璁��<br>娆㈣繋鍔犲叆 [wu-ui 浜ゆ祦缇(https://wuui.cn/zh-CN/components/qqFeedBack.html)**
\ No newline at end of file
diff --git a/uni_modules/wu-loading-icon/changelog.md b/uni_modules/wu-loading-icon/changelog.md
new file mode 100644
index 0000000..d3a7703
--- /dev/null
+++ b/uni_modules/wu-loading-icon/changelog.md
@@ -0,0 +1,12 @@
+## 1.0.5锛�2024-05-08锛�
+鏇存柊鍩熷悕
+## 1.0.4锛�2023-08-21锛�
+鏇存柊缁勪欢璇存槑
+## 1.0.3锛�2023-08-15锛�
+淇鎻掍欢api閿欒
+## 1.0.2锛�2023-08-08锛�
+澧炲姞璇存槑
+## 1.0.1锛�2023-08-04锛�
+wu-loading-icon 鍔犺浇鍔ㄧ敾  鍏ㄩ潰鍏煎灏忕▼搴忋�乶vue銆乿ue2銆乿ue3绛夊绔�
+## 1.0.0锛�2023-08-01锛�
+wu-loading-icon 鍔犺浇鍔ㄧ敾  鍏ㄩ潰鍏煎灏忕▼搴忋�乶vue銆乿ue2銆乿ue3绛夊绔�
diff --git a/uni_modules/wu-loading-icon/components/wu-loading-icon/props.js b/uni_modules/wu-loading-icon/components/wu-loading-icon/props.js
new file mode 100644
index 0000000..5a3e6f4
--- /dev/null
+++ b/uni_modules/wu-loading-icon/components/wu-loading-icon/props.js
@@ -0,0 +1,60 @@
+export default {
+	props: {
+		// 鏄惁鏄剧ず缁勪欢
+		show: {
+			type: Boolean,
+			default: true
+		},
+		// 棰滆壊
+		color: {
+			type: String,
+			default: '#909193'
+		},
+		// 鎻愮ず鏂囧瓧棰滆壊
+		textColor: {
+			type: String,
+			default: '#909193'
+		},
+		// 鏂囧瓧鍜屽浘鏍囨槸鍚﹀瀭鐩存帓鍒�
+		vertical: {
+			type: Boolean,
+			default: false
+		},
+		// 妯″紡閫夋嫨锛宑ircle-鍦嗗舰锛宻pinner-鑺辨湹褰紝semicircle-鍗婂渾褰�
+		mode: {
+			type: String,
+			default: 'spinner'
+		},
+		// 鍥炬爣澶у皬锛屽崟浣嶉粯璁x
+		size: {
+			type: [String, Number],
+			default: 24
+		},
+		// 鏂囧瓧澶у皬
+		textSize: {
+			type: [String, Number],
+			default: 15
+		},
+		// 鏂囧瓧鍐呭
+		text: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鍔ㄧ敾妯″紡 https://www.runoob.com/cssref/css3-pr-animation-timing-function.html
+		timingFunction: {
+			type: String,
+			default: 'linear'
+		},
+		// 鍔ㄧ敾鎵ц鍛ㄦ湡鏃堕棿
+		duration: {
+			type: [String, Number],
+			default: 1200
+		},
+		// mode=circle鏃剁殑鏆楄竟棰滆壊
+		inactiveColor: {
+			type: String,
+			default: ''
+		},
+		...uni.$w?.props?.loadingIcon
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-loading-icon/components/wu-loading-icon/wu-loading-icon.vue b/uni_modules/wu-loading-icon/components/wu-loading-icon/wu-loading-icon.vue
new file mode 100644
index 0000000..3c096df
--- /dev/null
+++ b/uni_modules/wu-loading-icon/components/wu-loading-icon/wu-loading-icon.vue
@@ -0,0 +1,345 @@
+<template>
+	<view
+		class="wu-loading-icon"
+		:style="[$w.addStyle(customStyle)]"
+		:class="[vertical && 'wu-loading-icon--vertical']"
+		v-if="show"
+	>
+		<view
+			v-if="!webviewHide"
+			class="wu-loading-icon__spinner"
+			:class="[`wu-loading-icon__spinner--${mode}`]"
+			ref="ani"
+			:style="{
+				color: color,
+				width: $w.addUnit(size),
+				height: $w.addUnit(size),
+				borderTopColor: color,
+				borderBottomColor: otherBorderColor,
+				borderLeftColor: otherBorderColor,
+				borderRightColor: otherBorderColor,
+				'animation-duration': `${duration}ms`,
+				'animation-timing-function': mode === 'semicircle' || mode === 'circle' ? timingFunction : ''
+			}"
+		>
+			<block v-if="mode === 'spinner'">
+				<!-- #ifndef APP-NVUE -->
+				<view
+					v-for="(item, index) in array12"
+					:key="index"
+					class="wu-loading-icon__dot"
+				>
+				</view>
+				<!-- #endif -->
+				<!-- #ifdef APP-NVUE -->
+				<!-- 姝ょ粍浠跺唴閮ㄥ浘鏍囬儴鍒嗘棤娉曡缃楂橈紝鍗充娇閫氳繃width鍜宧eight閰嶇疆浜嗕篃鏃犳晥 -->
+				<loading-indicator
+					v-if="!webviewHide"
+					class="wu-loading-indicator"
+					:animating="true"
+					:style="{
+						color: color,
+						width: $w.addUnit(size),
+						height: $w.addUnit(size)
+					}"
+				/>
+				<!-- #endif -->
+			</block>
+		</view>
+		<text
+			v-if="text"
+			class="wu-loading-icon__text"
+			:style="{
+				fontSize: $w.addUnit(textSize),
+				color: textColor,
+			}"
+		>{{text}}</text>
+	</view>
+</template>
+
+<script>
+	import mpMixin from '@/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js'
+	import mixin from '@/uni_modules/wu-ui-tools/libs/mixin/mixin.js'
+	import props from './props.js';
+	// #ifdef APP-NVUE
+	const animation = weex.requireModule('animation');
+	// #endif
+	/**
+	 * loading 鍔犺浇鍔ㄧ敾
+	 * @description 璀︽缁勪欢涓轰竴涓皬鍔ㄧ敾锛岀洰鍓嶇敤鍦╳uui鐨刲oadmore鍔犺浇鏇村鍜宻witch寮�鍏崇瓑缁勪欢鐨勬鍦ㄥ姞杞界姸鎬佸満鏅��
+	 * @tutorial https://wuui.cn/zh-CN/components/loadgin-icon.html
+	 * @property {Boolean}			show			鏄惁鏄剧ず缁勪欢  (榛樿 true)
+	 * @property {String}			color			鍔ㄧ敾娲诲姩鍖哄煙鐨勯鑹诧紝鍙 mode = flower 妯″紡鏈夋晥锛堥粯璁�#909193锛�
+	 * @property {String}			textColor		鎻愮ず鏂囨湰鐨勯鑹诧紙榛樿#909193锛�
+	 * @property {Boolean}			vertical		鏂囧瓧鍜屽浘鏍囨槸鍚﹀瀭鐩存帓鍒� (榛樿 false )
+	 * @property {String}			mode			妯″紡閫夋嫨锛岃瀹樼綉璇存槑锛堥粯璁� 'circle' 锛�
+	 * @property {String | Number}	size			鍔犺浇鍥炬爣鐨勫ぇ灏忥紝鍗曚綅px 锛堥粯璁� 24 锛�
+	 * @property {String | Number}	textSize		鏂囧瓧澶у皬锛堥粯璁� 15 锛�
+	 * @property {String | Number}	text			鏂囧瓧鍐呭 
+	 * @property {String}			timingFunction	鍔ㄧ敾妯″紡 锛堥粯璁� 'ease-in-out' 锛�
+	 * @property {String | Number}	duration		鍔ㄧ敾鎵ц鍛ㄦ湡鏃堕棿锛堥粯璁� 1200锛�
+	 * @property {String}			inactiveColor	mode=circle鏃剁殑鏆楄竟棰滆壊 
+	 * @property {Object}			customStyle		瀹氫箟闇�瑕佺敤鍒扮殑澶栭儴鏍峰紡
+	 * @example <wu-loading mode="circle"></wu-loading>
+	 */
+	export default {
+		name: 'wu-loading-icon',
+		mixins: [mpMixin, mixin, props],
+		data() {
+			return {
+				// Array.form鍙互閫氳繃涓�涓吉鏁扮粍瀵硅薄鍒涘缓鎸囧畾闀垮害鐨勬暟缁�
+				// https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/from
+				array12: Array.from({
+					length: 12
+				}),
+				// 杩欓噷闇�瑕佽缃粯璁ゅ�间负360锛屽惁鍒欏湪瀹夊崜nvue涓婏紝浼氬欢杩熶竴涓猟uration鍛ㄦ湡鍚庢墠鎵ц
+				// 鍦╥OS nvue涓婏紝鍒欎細涓�寮�濮嬮粯璁ゆ墽琛屼袱涓懆鏈熺殑鍔ㄧ敾
+				aniAngel: 360, // 鍔ㄧ敾鏃嬭浆瑙掑害
+				webviewHide: false, // 鐩戝惉webview鐨勭姸鎬侊紝濡傛灉闅愯棌浜嗛〉闈紝鍒欏仠姝㈠姩鐢伙紝浠ュ厤鎬ц兘娑堣��
+				loading: false, // 鏄惁杩愯涓紝閽堝nvue浣跨敤
+			}
+		},
+		computed: {
+			// 褰撲负circle绫诲瀷鏃讹紝缁欏叾鍙﹀涓夎竟璁剧疆涓�涓洿杞讳竴浜涚殑棰滆壊
+			// 涔嬫墍浠ラ渶瑕佽繖涔堝仛鐨勫師鍥犳槸锛屾瘮濡傜埗缁勪欢浼犱簡color涓虹孩鑹诧紝閭d箞闇�瑕佸彟澶栫殑涓変釜杈逛负娴呯孩鑹�
+			// 鑰屼笉鑳芥槸鍥哄畾鐨勬煇涓�涓叾浠栭鑹�(鍥犱负杩欎釜鍥哄畾鐨勯鑹插彲鑳芥祬钃濓紝瀵艰嚧鏁堟灉娌℃湁閭d箞缁嗚吇鑹ソ)
+			otherBorderColor() {
+				const lightColor = this.$w.Color.gradient(this.color, '#ffffff', 100)[80]
+				if (this.mode === 'circle') {
+					return this.inactiveColor ? this.inactiveColor : lightColor
+				} else {
+					return 'transparent'
+				}
+			}
+		},
+		watch: {
+			show(n) {
+				// nvue涓紝show涓簍rue锛屼笖涓洪潪loading鐘舵�侊紝灏遍噸鏂版墽琛屽姩鐢绘ā鍧�
+				// #ifdef APP-NVUE
+				if (n && !this.loading) {
+					setTimeout(() => {
+						this.startAnimate()
+					}, 30)
+				}
+				// #endif
+			}
+		},
+		mounted() {
+			this.init()
+		},
+		methods: {
+			init() {
+				setTimeout(() => {
+					// #ifdef APP-NVUE
+					this.show && this.nvueAnimate()
+					// #endif
+					// #ifdef APP-PLUS 
+					this.show && this.addEventListenerToWebview()
+					// #endif
+				}, 20)
+			},
+			// 鐩戝惉webview鐨勬樉绀轰笌闅愯棌
+			addEventListenerToWebview() {
+				// webview鐨勫爢鏍�
+				const pages = getCurrentPages()
+				// 褰撳墠椤甸潰
+				const page = pages[pages.length - 1]
+				// 褰撳墠椤甸潰鐨剋ebview瀹炰緥
+				const currentWebview = page.$getAppWebview()
+				// 鐩戝惉webview鐨勬樉绀轰笌闅愯棌锛屼粠鑰屽仠姝㈡垨鑰呭紑濮嬪姩鐢�(涓轰簡鎬ц兘)
+				currentWebview.addEventListener('hide', () => {
+					this.webviewHide = true
+				})
+				currentWebview.addEventListener('show', () => {
+					this.webviewHide = false
+				})
+			},
+			// #ifdef APP-NVUE
+			nvueAnimate() {
+				// nvue涓嬶紝闈瀞pinner绫诲瀷鏃舵墠闇�瑕佹棆杞紝鍥犱负nvue鐨剆pinner绫诲瀷锛屼娇鐢ㄤ簡weex鐨�
+				// loading-indicator缁勪欢锛岃嚜甯︽棆杞姛鑳�
+				this.mode !== 'spinner' && this.startAnimate()
+			},
+			// 鎵цnvue鐨刟nimate妯″潡鍔ㄧ敾
+			startAnimate() {
+				this.loading = true
+				const ani = this.$refs.ani
+				if (!ani) return
+				animation.transition(ani, {
+					// 杩涜瑙掑害鏃嬭浆
+					styles: {
+						transform: `rotate(${this.aniAngel}deg)`,
+						transformOrigin: 'center center'
+					},
+					duration: this.duration,
+					timingFunction: this.timingFunction,
+					// delay: 10
+				}, () => {
+					// 姣忔澧炲姞360deg锛屼负浜嗚鍏堕噸鏂版棆杞竴鍛�
+					this.aniAngel += 360
+					// 鍔ㄧ敾缁撴潫鍚庯紝缁х画寰幆鎵ц鍔ㄧ敾锛岄渶瑕佸悓鏃跺垽鏂瓀ebviewHide鍙橀噺
+					// nvue瀹夊崜锛岄〉闈㈤殣钘忓悗渚濈劧浼氱户缁墽琛宻tartAnimate鏂规硶
+					this.show && !this.webviewHide ? this.startAnimate() : this.loading = false
+				})
+			}
+			// #endif
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import '@/uni_modules/wu-ui-tools/libs/css/components.scss';
+	@import '@/uni_modules/wu-ui-tools/libs/css/color.scss';
+	$wu-loading-icon-color: #c8c9cc !default;
+	$wu-loading-icon-text-margin-left:4px !default;
+	$wu-loading-icon-text-color:$wu-content-color !default;
+	$wu-loading-icon-text-font-size:14px !default;
+	$wu-loading-icon-text-line-height:20px !default;
+	$wu-loading-width:30px !default;
+	$wu-loading-height:30px !default;
+	$wu-loading-max-width:100% !default;
+	$wu-loading-max-height:100% !default;
+	$wu-loading-semicircle-border-width: 2px !default;
+	$wu-loading-semicircle-border-color:transparent !default;
+	$wu-loading-semicircle-border-top-right-radius: 100px !default;
+	$wu-loading-semicircle-border-top-left-radius: 100px !default;
+	$wu-loading-semicircle-border-bottom-left-radius: 100px !default;
+	$wu-loading-semicircle-border-bottom-right-radiu: 100px !default;
+	$wu-loading-semicircle-border-style: solid !default;
+	$wu-loading-circle-border-top-right-radius: 100px !default;
+	$wu-loading-circle-border-top-left-radius: 100px !default;
+	$wu-loading-circle-border-bottom-left-radius: 100px !default;
+	$wu-loading-circle-border-bottom-right-radiu: 100px !default;
+	$wu-loading-circle-border-width:2px !default;
+	$wu-loading-circle-border-top-color:#e5e5e5 !default;
+	$wu-loading-circle-border-right-color:$wu-loading-circle-border-top-color !default;
+	$wu-loading-circle-border-bottom-color:$wu-loading-circle-border-top-color !default;
+	$wu-loading-circle-border-left-color:$wu-loading-circle-border-top-color !default;
+	$wu-loading-circle-border-style:solid !default;
+	$wu-loading-icon-host-font-size:0px !default;
+	$wu-loading-icon-host-line-height:1 !default;
+	$wu-loading-icon-vertical-margin:6px 0 0 !default;
+	$wu-loading-icon-dot-top:0 !default;
+	$wu-loading-icon-dot-left:0 !default;
+	$wu-loading-icon-dot-width:100% !default;
+	$wu-loading-icon-dot-height:100% !default;
+	$wu-loading-icon-dot-before-width:2px !default;
+	$wu-loading-icon-dot-before-height:25% !default;
+	$wu-loading-icon-dot-before-margin:0 auto !default;
+	$wu-loading-icon-dot-before-background-color:currentColor !default;
+	$wu-loading-icon-dot-before-border-radius:40% !default;
+
+	.wu-loading-icon {
+		/* #ifndef APP-NVUE */
+		// display: inline-flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		color: $wu-loading-icon-color;
+
+		&__text {
+			margin-left: $wu-loading-icon-text-margin-left;
+			color: $wu-loading-icon-text-color;
+			font-size: $wu-loading-icon-text-font-size;
+			line-height: $wu-loading-icon-text-line-height;
+		}
+
+		&__spinner {
+			width: $wu-loading-width;
+			height: $wu-loading-height;
+			position: relative;
+			/* #ifndef APP-NVUE */
+			box-sizing: border-box;
+			max-width: $wu-loading-max-width;
+			max-height: $wu-loading-max-height;
+			animation: wu-rotate 1s linear infinite;
+			/* #endif */
+		}
+
+		&__spinner--semicircle {
+			border-width: $wu-loading-semicircle-border-width;
+			border-color: $wu-loading-semicircle-border-color;
+			border-top-right-radius: $wu-loading-semicircle-border-top-right-radius;
+			border-top-left-radius: $wu-loading-semicircle-border-top-left-radius;
+			border-bottom-left-radius: $wu-loading-semicircle-border-bottom-left-radius;
+			border-bottom-right-radius: $wu-loading-semicircle-border-bottom-right-radiu;
+			border-style: $wu-loading-semicircle-border-style;
+		}
+
+		&__spinner--circle {
+			border-top-right-radius: $wu-loading-circle-border-top-right-radius;
+			border-top-left-radius: $wu-loading-circle-border-top-left-radius;
+			border-bottom-left-radius: $wu-loading-circle-border-bottom-left-radius;
+			border-bottom-right-radius: $wu-loading-circle-border-bottom-right-radiu;
+			border-width: $wu-loading-circle-border-width;
+			border-top-color: $wu-loading-circle-border-top-color;
+			border-right-color: $wu-loading-circle-border-right-color;
+			border-bottom-color: $wu-loading-circle-border-bottom-color;
+			border-left-color: $wu-loading-circle-border-left-color;
+			border-style: $wu-loading-circle-border-style;
+		}
+
+		&--vertical {
+			flex-direction: column
+		}
+	}
+
+	/* #ifndef APP-NVUE */
+	:host {
+		font-size: $wu-loading-icon-host-font-size;
+		line-height: $wu-loading-icon-host-line-height;
+	}
+
+	.wu-loading-icon {
+		&__spinner--spinner {
+			animation-timing-function: steps(12)
+		}
+
+		&__text:empty {
+			display: none
+		}
+
+		&--vertical &__text {
+			margin: $wu-loading-icon-vertical-margin;
+			color: $wu-content-color;
+		}
+
+		&__dot {
+			position: absolute;
+			top: $wu-loading-icon-dot-top;
+			left: $wu-loading-icon-dot-left;
+			width: $wu-loading-icon-dot-width;
+			height: $wu-loading-icon-dot-height;
+
+			&:before {
+				display: block;
+				width: $wu-loading-icon-dot-before-width;
+				height: $wu-loading-icon-dot-before-height;
+				margin: $wu-loading-icon-dot-before-margin;
+				background-color: $wu-loading-icon-dot-before-background-color;
+				border-radius: $wu-loading-icon-dot-before-border-radius;
+				content: " "
+			}
+		}
+	}
+
+	@for $i from 1 through 12 {
+		.wu-loading-icon__dot:nth-of-type(#{$i}) {
+			transform: rotate($i * 30deg);
+			opacity: 1 - 0.0625 * ($i - 1);
+		}
+	}
+
+	@keyframes wu-rotate {
+		0% {
+			transform: rotate(0deg)
+		}
+
+		to {
+			transform: rotate(1turn)
+		}
+	}
+
+	/* #endif */
+</style>
diff --git a/uni_modules/wu-loading-icon/package.json b/uni_modules/wu-loading-icon/package.json
new file mode 100644
index 0000000..4316e61
--- /dev/null
+++ b/uni_modules/wu-loading-icon/package.json
@@ -0,0 +1,88 @@
+{
+  "id": "wu-loading-icon",
+  "displayName": "wu-loading-icon 鍔犺浇鍔ㄧ敾  鍏ㄩ潰鍏煎灏忕▼搴忋�乶vue銆乿ue2銆乿ue3绛夊绔�",
+  "version": "1.0.5",
+  "description": "wu-loading-icon 姝ょ粍浠朵负涓�涓皬鍔ㄧ敾锛岀洰鍓嶇敤鍦╳u-ui鐨刲oadMore鍔犺浇鏇村绛夌粍浠剁殑姝e湪鍔犺浇鐘舵�佸満鏅��",
+  "keywords": [
+    "wu-loading-icon",
+    "wuui",
+    "wu-ui",
+    "loading",
+    "鍔犺浇鍔ㄧ敾"
+],
+  "repository": "",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "type": "component-vue",
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+    	"ads": "鏃�",
+    	"data": "鎻掍欢涓嶉噰闆嗕换浣曟暟鎹�",
+    	"permissions": "鏃�"
+    },
+    "npmurl": ""
+  },
+  "uni_modules": {
+    "dependencies": [
+			"wu-ui-tools"
+		],
+    "encrypt": [],
+    "platforms": {
+			"cloud": {
+				"tcb": "y",
+                "aliyun": "y",
+                "alipay": "n"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "y"
+				},
+				"H5-mobile": {
+					"Safari": "y",
+					"Android Browser": "y",
+					"寰俊娴忚鍣�(Android)": "y",
+					"QQ娴忚鍣�(Android)": "y"
+				},
+				"H5-pc": {
+					"Chrome": "y",
+					"IE": "y",
+					"Edge": "y",
+					"Firefox": "y",
+					"Safari": "y"
+				},
+				"灏忕▼搴�": {
+					"寰俊": "y",
+					"闃块噷": "y",
+					"鐧惧害": "y",
+					"瀛楄妭璺冲姩": "y",
+					"QQ": "y",
+					"閽夐拤": "u",
+					"蹇墜": "u",
+					"椋炰功": "u",
+					"浜笢": "u"
+				},
+				"蹇簲鐢�": {
+					"鍗庝负": "u",
+					"鑱旂洘": "u"
+				}
+			}
+		}
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/wu-loading-icon/readme.md b/uni_modules/wu-loading-icon/readme.md
new file mode 100644
index 0000000..9b4a8e6
--- /dev/null
+++ b/uni_modules/wu-loading-icon/readme.md
@@ -0,0 +1,16 @@
+## LoadingIcon 鍔犺浇鍔ㄧ敾
+
+> **缁勪欢鍚嶏細wu-loading-icon**
+
+姝ょ粍浠朵负涓�涓皬鍔ㄧ敾锛岀洰鍓嶇敤鍦╳u-ui鐨刲oadMore鍔犺浇鏇村绛夌粍浠剁殑姝e湪鍔犺浇鐘舵�佸満鏅��
+
+### <a href="https://wuui.cn/zh-CN/components/loadingIcon" target="_blank">鏌ョ湅鏂囨。</a>
+
+## [鏇村缁勪欢, 璇锋煡鐪� `wu-ui` 缁勪欢搴揮(https://ext.dcloud.net.cn/plugin?name=wu--ui)
+(璇峰嬁涓嬭浇鎻掍欢zip)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=wu--ui">
+	<img src="https://wuui.cn/intr.png">
+</a>
+
+**濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箇u-ui鏈変竴浜涘ソ鐨勫缓璁��<br>娆㈣繋鍔犲叆 [wu-ui 浜ゆ祦缇(https://wuui.cn/zh-CN/components/qqFeedBack.html)**
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/changelog.md b/uni_modules/wu-ui-tools/changelog.md
new file mode 100644
index 0000000..6960de4
--- /dev/null
+++ b/uni_modules/wu-ui-tools/changelog.md
@@ -0,0 +1,22 @@
+## 1.1.0锛�2023-09-13锛�
+鏇存柊鐗堟湰
+## 1.0.9锛�2023-09-08锛�
+淇Color鏂规硶寮曞叆璺緞閿欒
+## 1.0.8锛�2023-09-05锛�
+Color涓嶅湪浣跨敤npm鍖咃紝鏀逛负鏈湴鏂规硶
+## 1.0.7锛�2023-09-03锛�
+淇寮曞叆閿欒
+## 1.0.6锛�2023-09-03锛�
+鍙戝竷1.0.6鐗堟湰
+## 1.0.5锛�2023-08-30锛�
+淇api閮ㄥ垎鏈鍏�
+## 1.0.4锛�2023-08-21锛�
+淇Color API寮曞叆閿欒
+## 1.0.3锛�2023-08-18锛�
+鏂板棰滆壊API锛屾敮鎸佷换鎰忛鑹叉牸寮忚浆鎹紝棰滆壊浜害璋冭妭銆侀鑹查ケ鍜屽害璋冭妭銆佷寒搴﹁幏鍙栥�侀鑹叉槸鍚︽繁/浜瓑
+## 1.0.2锛�2023-08-16锛�
+mixin浜や簰鑺傜偣淇℃伅鏍硅竟璺濊缃�
+## 1.0.1锛�2023-08-16锛�
+mixin鏇存柊鑺傜偣浜や簰淇℃伅鏌ヨ
+## 1.0.0锛�2023-08-01锛�
+wu-ui-tools 宸ュ叿搴�  鍏ㄩ潰鍏煎灏忕▼搴忋�乶vue銆乿ue2銆乿ue3绛夊绔�
diff --git a/uni_modules/wu-ui-tools/components/wu-ui-tools/wu-ui-tools.vue b/uni_modules/wu-ui-tools/components/wu-ui-tools/wu-ui-tools.vue
new file mode 100644
index 0000000..baf45e9
--- /dev/null
+++ b/uni_modules/wu-ui-tools/components/wu-ui-tools/wu-ui-tools.vue
@@ -0,0 +1,6 @@
+<template>
+</template>
+<script>
+</script>
+<style>
+</style>
diff --git a/uni_modules/wu-ui-tools/index.js b/uni_modules/wu-ui-tools/index.js
new file mode 100644
index 0000000..00cef45
--- /dev/null
+++ b/uni_modules/wu-ui-tools/index.js
@@ -0,0 +1,73 @@
+// 鍏ㄥ眬鎸傝浇寮曞叆http鐩稿叧璇锋眰鎷︽埅鎻掍欢
+import Request from './libs/luch-request'
+
+// 寮曞叆鍏ㄥ眬mixin
+import mixin from './libs/mixin/mixin.js'
+// 灏忕▼搴忕壒鏈夌殑mixin
+import mpMixin from './libs/mixin/mpMixin.js'
+// #ifdef MP
+import mpShare from './libs/mixin/mpShare.js'
+// #endif
+
+// 璺敱灏佽
+import route from './libs/util/route.js'
+// 鍏叡宸ュ叿鍑芥暟
+import * as index from './libs/function/index.js'
+// 闃叉姈鏂规硶
+import debounce from './libs/function/debounce.js'
+// 鑺傛祦鏂规硶
+import throttle from './libs/function/throttle.js'
+// 瑙勫垯妫�楠�
+import * as test from './libs/function/test.js'
+
+// 閰嶇疆淇℃伅
+import config from './libs/config/config.js'
+// 骞冲彴
+import platform from './libs/function/platform'
+
+import Color from './libs/function/color/index.js'
+
+const $w = {
+	...index,
+	route,
+	config,
+	test,
+	throttle,
+	date: index.timeFormat, // 鍙﹀悕date
+	Color,
+	http: new Request(),
+	debounce,
+	throttle,
+	platform,
+	mixin,
+	mpMixin
+}
+uni.$w = $w;
+const install = (Vue,options={}) => {
+		// #ifndef APP-NVUE
+		Vue.mixin(mixin);
+		// #ifdef MP
+		if(options.mpShare){
+			Vue.mixin(mpShare);
+		}
+		// #endif
+		// #endif
+		// #ifdef VUE2
+		// 鏃堕棿鏍煎紡鍖栵紝鍚屾椂涓や釜鍚嶇О锛宒ate鍜宼imeFormat
+		Vue.filter('timeFormat', (timestamp, format) => uni.$w.timeFormat(timestamp, format));
+		Vue.filter('date', (timestamp, format) => uni.$w.timeFormat(timestamp, format));
+		// 灏嗗涔呬互鍓嶇殑鏂规硶锛屾敞鍏ュ埌鍏ㄥ眬杩囨护鍣�
+		Vue.filter('timeFrom', (timestamp, format) => uni.$w.timeFrom(timestamp, format));
+		// 鍚屾椂鎸傝浇鍒皍ni鍜孷ue.prototype涓�
+		// #ifndef APP-NVUE
+		// 鍙湁vue锛屾寕杞藉埌Vue.prototype鎵嶆湁鎰忎箟锛屽洜涓簄vue涓叏灞�Vue.prototype鍜孷ue.mixin鏄棤鏁堢殑
+		Vue.prototype.$w = $w;
+		// #endif
+		// #endif
+		// #ifdef VUE3
+		Vue.config.globalProperties.$w = $w;
+		// #endif
+}
+export default {
+	install
+}
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/index.scss b/uni_modules/wu-ui-tools/index.scss
new file mode 100644
index 0000000..8d05b8d
--- /dev/null
+++ b/uni_modules/wu-ui-tools/index.scss
@@ -0,0 +1,7 @@
+// 寮曞叆鍏叡鍩虹绫�
+@import "./libs/css/common.scss";
+
+// 闈瀗vue鐨勬牱寮�
+/* #ifndef APP-NVUE */
+@import "./libs/css/vue.scss";
+/* #endif */
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/config/config.js b/uni_modules/wu-ui-tools/libs/config/config.js
new file mode 100644
index 0000000..02ab3cf
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/config/config.js
@@ -0,0 +1,34 @@
+// 姝ょ増鏈彂甯冧簬2023-09-13
+const version = '1.0.9'
+
+// 寮�鍙戠幆澧冩墠鎻愮ず锛岀敓浜х幆澧冧笉浼氭彁绀�
+if (process.env.NODE_ENV === 'development') {
+	console.log(`\n %c wuui V${version} https://wuui.geeks.ink/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;');
+}
+
+export default {
+    v: version,
+    version,
+    // 涓婚鍚嶇О
+    type: [
+        'primary',
+        'success',
+        'info',
+        'error',
+        'warning'
+    ],
+    // 棰滆壊閮ㄥ垎锛屾湰鏉ュ彲浠ラ�氳繃scss鐨�:export瀵煎嚭渚沯s浣跨敤锛屼絾鏄浣昻vue涓嶆敮鎸�
+    color: {
+        'wu-primary': '#2979ff',
+        'wu-warning': '#ff9900',
+        'wu-success': '#19be6b',
+        'wu-error': '#fa3534',
+        'wu-info': '#909399',
+        'wu-main-color': '#303133',
+        'wu-content-color': '#606266',
+        'wu-tips-color': '#909399',
+        'wu-light-color': '#c0c4cc'
+    },
+	// 榛樿鍗曚綅锛屽彲浠ラ�氳繃閰嶇疆涓簉px锛岄偅涔堝湪鐢ㄤ簬浼犲叆缁勪欢澶у皬鍙傛暟涓烘暟鍊兼椂锛屽氨榛樿涓簉px
+	unit: 'px'
+}
diff --git a/uni_modules/wu-ui-tools/libs/css/color.scss b/uni_modules/wu-ui-tools/libs/css/color.scss
new file mode 100644
index 0000000..6f98927
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/css/color.scss
@@ -0,0 +1,32 @@
+$wu-main-color: #303133 !default;
+$wu-content-color: #606266 !default;
+$wu-tips-color: #909193 !default;
+$wu-light-color: #c0c4cc !default;
+$wu-border-color: #dadbde !default;
+$wu-bg-color: #f3f4f6 !default;
+$wu-disabled-color: #c8c9cc !default;
+
+$wu-primary: #3c9cff !default;
+$wu-primary-dark: #398ade !default;
+$wu-primary-disabled: #9acafc !default;
+$wu-primary-light: #ecf5ff !default;
+
+$wu-warning: #f9ae3d !default;
+$wu-warning-dark: #f1a532 !default;
+$wu-warning-disabled: #f9d39b !default;
+$wu-warning-light: #fdf6ec !default;
+
+$wu-success: #5ac725 !default;
+$wu-success-dark: #53c21d !default;
+$wu-success-disabled: #a9e08f !default;
+$wu-success-light: #f5fff0;
+
+$wu-error: #f56c6c !default;
+$wu-error-dark: #e45656 !default;
+$wu-error-disabled: #f7b2b2 !default;
+$wu-error-light: #fef0f0 !default;
+
+$wu-info: #909399 !default;
+$wu-info-dark: #767a82 !default;
+$wu-info-disabled: #c4c6c9 !default;
+$wu-info-light: #f4f4f5 !default;
diff --git a/uni_modules/wu-ui-tools/libs/css/common.scss b/uni_modules/wu-ui-tools/libs/css/common.scss
new file mode 100644
index 0000000..0234f0f
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/css/common.scss
@@ -0,0 +1,100 @@
+// 瓒呭嚭琛屾暟锛岃嚜鍔ㄦ樉绀鸿灏剧渷鐣ュ彿锛屾渶澶�5琛�
+// 鏉ヨ嚜wuui鐨勬俯棣ㄦ彁绀猴細褰撴偍鍦ㄦ帶鍒跺彴鐪嬪埌姝ゆ姤閿欙紝璇存槑闇�瑕佸湪App.vue鐨剆tyle鏍囩鍔犱笂銆恖ang="scss"銆�
+@for $i from 1 through 5 {
+	.wu-line-#{$i} {
+		/* #ifdef APP-NVUE */
+		// nvue涓嬶紝鍙互鐩存帴浣跨敤lines灞炴�э紝杩欐槸weex鐗规湁鏍峰紡
+		lines: $i;
+		text-overflow: ellipsis;
+		overflow: hidden;
+		flex: 1;
+		/* #endif */
+
+		/* #ifndef APP-NVUE */
+		// vue涓嬶紝鍗曡鍜屽琛屾樉绀虹渷鐣ュ彿闇�瑕佸崟鐙鐞�
+		@if $i == '1' {
+			overflow: hidden;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+		} @else {
+			display: -webkit-box!important;
+			overflow: hidden;
+			text-overflow: ellipsis;
+			word-break: break-all;
+			-webkit-line-clamp: $i;
+			-webkit-box-orient: vertical!important;
+		}
+		/* #endif */
+	}
+}
+$wu-bordercolor: #dadbde;
+@if variable-exists(wu-border-color) {
+	$wu-bordercolor: $wu-border-color;
+}
+
+// 姝ゅ鍔犱笂!important骞堕潪闅忔剰涔辩敤锛岃�屾槸鍥犱负鐩墠*.nvue椤甸潰缂栬瘧鍒癏5鏃讹紝
+// App.vue鐨勬牱寮忎細琚玼ni-app鐨剉iew鍏冪礌鐨勮嚜甯order灞炴�ц鐩栵紝瀵艰嚧鏃犳晥
+// 缁间笂锛岃繖鏄痷ni-app鐨勭己闄峰鑷存垜浠负浜嗗绔吋瀹癸紝鑰屽繀椤昏鍔犱笂!important
+// 绉诲姩绔吋瀹规�ц緝濂斤紝鐩存帴浣跨敤0.5px鍘诲疄鐜扮粏杈规锛屼笉浣跨敤浼厓绱犲舰寮忓疄鐜�
+.wu-border {
+	border-width: 0.5px!important;
+	border-color: $wu-bordercolor!important;
+    border-style: solid;
+}
+
+.wu-border-top {
+	border-top-width: 0.5px!important;
+	border-color: $wu-bordercolor!important;
+    border-top-style: solid;
+}
+
+.wu-border-left {
+	border-left-width: 0.5px!important;
+	border-color: $wu-bordercolor!important;
+    border-left-style: solid;
+}
+
+.wu-border-right {
+	border-right-width: 0.5px!important;
+	border-color: $wu-bordercolor!important;
+    border-right-style: solid;
+}
+
+.wu-border-bottom {
+	border-bottom-width: 0.5px!important;
+	border-color: $wu-bordercolor!important;
+    border-bottom-style: solid;
+}
+
+.wu-border-top-bottom {
+	border-top-width: 0.5px!important;
+	border-bottom-width: 0.5px!important;
+	border-color: $wu-bordercolor!important;
+    border-top-style: solid;
+    border-bottom-style: solid;
+}
+
+// 鍘婚櫎button鐨勬墍鏈夐粯璁ゆ牱寮忥紝璁╁叾琛ㄧ幇璺熸櫘閫氱殑view銆乼ext鍏冪礌涓�鏍�
+.wu-reset-button {
+	padding: 0;
+	background-color: transparent;
+	/* #ifndef APP-PLUS */
+	font-size: inherit;
+	line-height: inherit;
+	color: inherit;
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	border-width: 0;
+	/* #endif */
+}
+
+/* #ifndef APP-NVUE */
+.wu-reset-button::after {
+   border: none;
+}
+/* #endif */
+
+.wu-hover-class {
+	opacity: 0.7;
+}
+
diff --git a/uni_modules/wu-ui-tools/libs/css/components.scss b/uni_modules/wu-ui-tools/libs/css/components.scss
new file mode 100644
index 0000000..d56ae50
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/css/components.scss
@@ -0,0 +1,23 @@
+@mixin flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: $direction;
+}
+
+/* #ifndef APP-NVUE */
+// 鐢变簬wuui鏄熀浜巒vue鐜杩涜寮�鍙戠殑锛屾鐜涓櫘閫氬厓绱犻粯璁や负flex-direction: column;
+// 鎵�浠ュ湪闈瀗vue涓紝闇�瑕佸鍏冪礌杩涜閲嶇疆涓篺lex-direction: column; 鍚﹀垯鍙兘浼氳〃鐜板紓甯�
+$wuui-nvue-style: true !default;
+@if $wuui-nvue-style == true {
+	view, scroll-view, swiper-item {
+		display: flex;
+		flex-direction: column;
+		flex-shrink: 0;
+		flex-grow: 0;
+		flex-basis: auto;
+		align-items: stretch;
+		align-content: flex-start;
+	}
+}
+/* #endif */
diff --git a/uni_modules/wu-ui-tools/libs/css/variable.scss b/uni_modules/wu-ui-tools/libs/css/variable.scss
new file mode 100644
index 0000000..35cbdfe
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/css/variable.scss
@@ -0,0 +1,111 @@
+// 瓒呭嚭琛屾暟锛岃嚜鍔ㄦ樉绀鸿灏剧渷鐣ュ彿锛屾渶澶�5琛�
+// 鏉ヨ嚜uvui鐨勬俯棣ㄦ彁绀猴細褰撴偍鍦ㄦ帶鍒跺彴鐪嬪埌姝ゆ姤閿欙紝璇存槑闇�瑕佸湪App.vue鐨剆tyle鏍囩鍔犱笂銆恖ang="scss"銆�
+@if variable-exists(show-lines) {
+	@for $i from 1 through 5 {
+		.wu-line-#{$i} {
+			/* #ifdef APP-NVUE */
+			// nvue涓嬶紝鍙互鐩存帴浣跨敤lines灞炴�э紝杩欐槸weex鐗规湁鏍峰紡
+			lines: $i;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			flex: 1;
+			/* #endif */
+
+			/* #ifndef APP-NVUE */
+			// vue涓嬶紝鍗曡鍜屽琛屾樉绀虹渷鐣ュ彿闇�瑕佸崟鐙鐞�
+			@if $i == '1' {
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			} @else {
+				display: -webkit-box!important;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				word-break: break-all;
+				-webkit-line-clamp: $i;
+				-webkit-box-orient: vertical!important;
+			}
+			/* #endif */
+		}
+	}
+}
+@if variable-exists(show-border) {
+	$wu-bordercolor: #dadbde;
+	@if variable-exists(wu-border-color) {
+		$wu-bordercolor: $wu-border-color;
+	}
+	// 姝ゅ鍔犱笂!important骞堕潪闅忔剰涔辩敤锛岃�屾槸鍥犱负鐩墠*.nvue椤甸潰缂栬瘧鍒癏5鏃讹紝
+	// App.vue鐨勬牱寮忎細琚玼ni-app鐨剉iew鍏冪礌鐨勮嚜甯order灞炴�ц鐩栵紝瀵艰嚧鏃犳晥
+	// 缁间笂锛岃繖鏄痷ni-app鐨勭己闄峰鑷存垜浠负浜嗗绔吋瀹癸紝鑰屽繀椤昏鍔犱笂!important
+	// 绉诲姩绔吋瀹规�ц緝濂斤紝鐩存帴浣跨敤0.5px鍘诲疄鐜扮粏杈规锛屼笉浣跨敤浼厓绱犲舰寮忓疄鐜�
+	@if variable-exists(show-border-surround) {
+		.wu-border {
+			border-width: 0.5px!important;
+			border-color: $wu-bordercolor!important;
+			border-style: solid;
+		}
+	}
+	@if variable-exists(show-border-top) {
+		.wu-border-top {
+			border-top-width: 0.5px!important;
+			border-color: $wu-bordercolor!important;
+			border-top-style: solid;
+		}
+	}
+	@if variable-exists(show-border-left) {
+		.wu-border-left {
+			border-left-width: 0.5px!important;
+			border-color: $wu-bordercolor!important;
+			border-left-style: solid;
+		}
+	}
+	@if variable-exists(show-border-right) {
+		.wu-border-right {
+			border-right-width: 0.5px!important;
+			border-color: $wu-bordercolor!important;
+			border-right-style: solid;
+		}
+	}
+	@if variable-exists(show-border-bottom) {
+		.wu-border-bottom {
+			border-bottom-width: 0.5px!important;
+			border-color: $wu-bordercolor!important;
+				border-bottom-style: solid;
+		}
+	}
+	@if variable-exists(show-border-top-bottom) {
+		.wu-border-top-bottom {
+			border-top-width: 0.5px!important;
+			border-bottom-width: 0.5px!important;
+			border-color: $wu-bordercolor!important;
+			border-top-style: solid;
+			border-bottom-style: solid;
+		}
+	}
+}
+@if variable-exists(show-reset-button) {
+	// 鍘婚櫎button鐨勬墍鏈夐粯璁ゆ牱寮忥紝璁╁叾琛ㄧ幇璺熸櫘閫氱殑view銆乼ext鍏冪礌涓�鏍�
+	.wu-reset-button {
+		padding: 0;
+		background-color: transparent;
+		/* #ifndef APP-PLUS */
+		font-size: inherit;
+		line-height: inherit;
+		color: inherit;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		border-width: 0;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.wu-reset-button::after {
+		 border: none;
+	}
+	/* #endif */
+}
+@if variable-exists(show-hover) {
+	.wu-hover-class {
+		opacity: 0.7;
+	}
+}
diff --git a/uni_modules/wu-ui-tools/libs/css/vue.scss b/uni_modules/wu-ui-tools/libs/css/vue.scss
new file mode 100644
index 0000000..a5b02c9
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/css/vue.scss
@@ -0,0 +1,40 @@
+// 鍘嗛亶鐢熸垚4涓柟鍚戠殑搴曢儴瀹夊叏鍖�
+@each $d in top, right, bottom, left {
+	.wu-safe-area-inset-#{$d} {
+		padding-#{$d}: 0;
+		padding-#{$d}: constant(safe-area-inset-#{$d});  
+		padding-#{$d}: env(safe-area-inset-#{$d});  
+	}
+}
+
+//鎻愬崌H5绔痷ni.toast()鐨勫眰绾э紝閬垮厤琚玾uui鐨刴odal绛夐伄鐩�
+/* #ifdef H5 */
+uni-toast {
+    z-index: 10090;
+}
+uni-toast .uni-toast {
+   z-index: 10090;
+}
+/* #endif */
+
+// 闅愯棌scroll-view鐨勬粴鍔ㄦ潯
+::-webkit-scrollbar {
+    display: none;  
+    width: 0 !important;  
+    height: 0 !important;  
+    -webkit-appearance: none;  
+    background: transparent;  
+}
+
+$wuui-nvue-style: true !default;
+@if $wuui-nvue-style == false {
+	view, scroll-view, swiper-item {
+		display: flex;
+		flex-direction: column;
+		flex-shrink: 0;
+		flex-grow: 0;
+		flex-basis: auto;
+		align-items: stretch;
+		align-content: flex-start;
+	}
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/CHANGELOG.md b/uni_modules/wu-ui-tools/libs/function/color/color-convert/CHANGELOG.md
new file mode 100644
index 0000000..0a7bce4
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/CHANGELOG.md
@@ -0,0 +1,54 @@
+# 1.0.0 - 2016-01-07
+
+- Removed: unused speed test
+- Added: Automatic routing between previously unsupported conversions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `xxx2xxx()` and `xxx2xxxRaw()` functions
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Removed: `convert()` class
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: all functions to lookup dictionary
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Changed: `ansi` to `ansi256`
+([#27](https://github.com/Qix-/color-convert/pull/27))
+- Fixed: argument grouping for functions requiring only one argument
+([#27](https://github.com/Qix-/color-convert/pull/27))
+
+# 0.6.0 - 2015-07-23
+
+- Added: methods to handle
+[ANSI](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) 16/256 colors:
+  - rgb2ansi16
+  - rgb2ansi
+  - hsl2ansi16
+  - hsl2ansi
+  - hsv2ansi16
+  - hsv2ansi
+  - hwb2ansi16
+  - hwb2ansi
+  - cmyk2ansi16
+  - cmyk2ansi
+  - keyword2ansi16
+  - keyword2ansi
+  - ansi162rgb
+  - ansi162hsl
+  - ansi162hsv
+  - ansi162hwb
+  - ansi162cmyk
+  - ansi162keyword
+  - ansi2rgb
+  - ansi2hsl
+  - ansi2hsv
+  - ansi2hwb
+  - ansi2cmyk
+  - ansi2keyword
+([#18](https://github.com/harthur/color-convert/pull/18))
+
+# 0.5.3 - 2015-06-02
+
+- Fixed: hsl2hsv does not return `NaN` anymore when using `[0,0,0]`
+([#15](https://github.com/harthur/color-convert/issues/15))
+
+---
+
+Check out commit logs for older releases
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/LICENSE b/uni_modules/wu-ui-tools/libs/function/color/color-convert/LICENSE
new file mode 100644
index 0000000..5b4c386
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011-2016 Heather Arthur <fayearthur@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/README.md b/uni_modules/wu-ui-tools/libs/function/color/color-convert/README.md
new file mode 100644
index 0000000..d4b08fc
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/README.md
@@ -0,0 +1,68 @@
+# color-convert
+
+[![Build Status](https://travis-ci.org/Qix-/color-convert.svg?branch=master)](https://travis-ci.org/Qix-/color-convert)
+
+Color-convert is a color conversion library for JavaScript and node.
+It converts all ways between `rgb`, `hsl`, `hsv`, `hwb`, `cmyk`, `ansi`, `ansi16`, `hex` strings, and CSS `keyword`s (will round to closest):
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hsl(140, 200, 100);             // [96, 48, 59]
+convert.keyword.rgb('blue');                // [0, 0, 255]
+
+var rgbChannels = convert.rgb.channels;     // 3
+var cmykChannels = convert.cmyk.channels;   // 4
+var ansiChannels = convert.ansi16.channels; // 1
+```
+
+# Install
+
+```console
+$ npm install color-convert
+```
+
+# API
+
+Simply get the property of the _from_ and _to_ conversion that you're looking for.
+
+All functions have a rounded and unrounded variant. By default, return values are rounded. To get the unrounded (raw) results, simply tack on `.raw` to the function.
+
+All 'from' functions have a hidden property called `.channels` that indicates the number of channels the function expects (not including alpha).
+
+```js
+var convert = require('color-convert');
+
+// Hex to LAB
+convert.hex.lab('DEADBF');         // [ 76, 21, -2 ]
+convert.hex.lab.raw('DEADBF');     // [ 75.56213190997677, 20.653827952644754, -2.290532499330533 ]
+
+// RGB to CMYK
+convert.rgb.cmyk(167, 255, 4);     // [ 35, 0, 98, 0 ]
+convert.rgb.cmyk.raw(167, 255, 4); // [ 34.509803921568626, 0, 98.43137254901961, 0 ]
+```
+
+### Arrays
+All functions that accept multiple arguments also support passing an array.
+
+Note that this does **not** apply to functions that convert from a color that only requires one value (e.g. `keyword`, `ansi256`, `hex`, etc.)
+
+```js
+var convert = require('color-convert');
+
+convert.rgb.hex(123, 45, 67);      // '7B2D43'
+convert.rgb.hex([123, 45, 67]);    // '7B2D43'
+```
+
+## Routing
+
+Conversions that don't have an _explicitly_ defined conversion (in [conversions.js](conversions.js)), but can be converted by means of sub-conversions (e.g. XYZ -> **RGB** -> CMYK), are automatically routed together. This allows just about any color model supported by `color-convert` to be converted to any other model, so long as a sub-conversion path exists. This is also true for conversions requiring more than one step in between (e.g. LCH -> **LAB** -> **XYZ** -> **RGB** -> Hex).
+
+Keep in mind that extensive conversions _may_ result in a loss of precision, and exist only to be complete. For a list of "direct" (single-step) conversions, see [conversions.js](conversions.js).
+
+# Contribute
+
+If there is a new model you would like to support, or want to add a direct conversion between two existing models, please send us a pull request.
+
+# License
+Copyright &copy; 2011-2016, Heather Arthur and Josh Junon. Licensed under the [MIT License](LICENSE).
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/conversions.js b/uni_modules/wu-ui-tools/libs/function/color/color-convert/conversions.js
new file mode 100644
index 0000000..04b49dd
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/conversions.js
@@ -0,0 +1,839 @@
+/* MIT license */
+/* eslint-disable no-mixed-operators */
+import cssKeywords from '../color-name';
+
+// NOTE: conversions should only return primitive values (i.e. arrays, or
+//       values that give correct `typeof` results).
+//       do not use box values types (i.e. Number(), String(), etc.)
+
+const reverseKeywords = {};
+for (const key of Object.keys(cssKeywords)) {
+	reverseKeywords[cssKeywords[key]] = key;
+}
+
+const convert = {
+	rgb: {channels: 3, labels: 'rgb'},
+	hsl: {channels: 3, labels: 'hsl'},
+	hsv: {channels: 3, labels: 'hsv'},
+	hwb: {channels: 3, labels: 'hwb'},
+	cmyk: {channels: 4, labels: 'cmyk'},
+	xyz: {channels: 3, labels: 'xyz'},
+	lab: {channels: 3, labels: 'lab'},
+	lch: {channels: 3, labels: 'lch'},
+	hex: {channels: 1, labels: ['hex']},
+	keyword: {channels: 1, labels: ['keyword']},
+	ansi16: {channels: 1, labels: ['ansi16']},
+	ansi256: {channels: 1, labels: ['ansi256']},
+	hcg: {channels: 3, labels: ['h', 'c', 'g']},
+	apple: {channels: 3, labels: ['r16', 'g16', 'b16']},
+	gray: {channels: 1, labels: ['gray']}
+};
+
+export default convert;
+
+// Hide .channels and .labels properties
+for (const model of Object.keys(convert)) {
+	if (!('channels' in convert[model])) {
+		throw new Error('missing channels property: ' + model);
+	}
+
+	if (!('labels' in convert[model])) {
+		throw new Error('missing channel labels property: ' + model);
+	}
+
+	if (convert[model].labels.length !== convert[model].channels) {
+		throw new Error('channel and label counts mismatch: ' + model);
+	}
+
+	const {channels, labels} = convert[model];
+	delete convert[model].channels;
+	delete convert[model].labels;
+	Object.defineProperty(convert[model], 'channels', {value: channels});
+	Object.defineProperty(convert[model], 'labels', {value: labels});
+}
+
+convert.rgb.hsl = function (rgb) {
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+	const min = Math.min(r, g, b);
+	const max = Math.max(r, g, b);
+	const delta = max - min;
+	let h;
+	let s;
+
+	if (max === min) {
+		h = 0;
+	} else if (r === max) {
+		h = (g - b) / delta;
+	} else if (g === max) {
+		h = 2 + (b - r) / delta;
+	} else if (b === max) {
+		h = 4 + (r - g) / delta;
+	}
+
+	h = Math.min(h * 60, 360);
+
+	if (h < 0) {
+		h += 360;
+	}
+
+	const l = (min + max) / 2;
+
+	if (max === min) {
+		s = 0;
+	} else if (l <= 0.5) {
+		s = delta / (max + min);
+	} else {
+		s = delta / (2 - max - min);
+	}
+
+	return [h, s * 100, l * 100];
+};
+
+convert.rgb.hsv = function (rgb) {
+	let rdif;
+	let gdif;
+	let bdif;
+	let h;
+	let s;
+
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+	const v = Math.max(r, g, b);
+	const diff = v - Math.min(r, g, b);
+	const diffc = function (c) {
+		return (v - c) / 6 / diff + 1 / 2;
+	};
+
+	if (diff === 0) {
+		h = 0;
+		s = 0;
+	} else {
+		s = diff / v;
+		rdif = diffc(r);
+		gdif = diffc(g);
+		bdif = diffc(b);
+
+		if (r === v) {
+			h = bdif - gdif;
+		} else if (g === v) {
+			h = (1 / 3) + rdif - bdif;
+		} else if (b === v) {
+			h = (2 / 3) + gdif - rdif;
+		}
+
+		if (h < 0) {
+			h += 1;
+		} else if (h > 1) {
+			h -= 1;
+		}
+	}
+
+	return [
+		h * 360,
+		s * 100,
+		v * 100
+	];
+};
+
+convert.rgb.hwb = function (rgb) {
+	const r = rgb[0];
+	const g = rgb[1];
+	let b = rgb[2];
+	const h = convert.rgb.hsl(rgb)[0];
+	const w = 1 / 255 * Math.min(r, Math.min(g, b));
+
+	b = 1 - 1 / 255 * Math.max(r, Math.max(g, b));
+
+	return [h, w * 100, b * 100];
+};
+
+convert.rgb.cmyk = function (rgb) {
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+
+	const k = Math.min(1 - r, 1 - g, 1 - b);
+	const c = (1 - r - k) / (1 - k) || 0;
+	const m = (1 - g - k) / (1 - k) || 0;
+	const y = (1 - b - k) / (1 - k) || 0;
+
+	return [c * 100, m * 100, y * 100, k * 100];
+};
+
+function comparativeDistance(x, y) {
+	/*
+		See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance
+	*/
+	return (
+		((x[0] - y[0]) ** 2) +
+		((x[1] - y[1]) ** 2) +
+		((x[2] - y[2]) ** 2)
+	);
+}
+
+convert.rgb.keyword = function (rgb) {
+	const reversed = reverseKeywords[rgb];
+	if (reversed) {
+		return reversed;
+	}
+
+	let currentClosestDistance = Infinity;
+	let currentClosestKeyword;
+
+	for (const keyword of Object.keys(cssKeywords)) {
+		const value = cssKeywords[keyword];
+
+		// Compute comparative distance
+		const distance = comparativeDistance(rgb, value);
+
+		// Check if its less, if so set as closest
+		if (distance < currentClosestDistance) {
+			currentClosestDistance = distance;
+			currentClosestKeyword = keyword;
+		}
+	}
+
+	return currentClosestKeyword;
+};
+
+convert.keyword.rgb = function (keyword) {
+	return cssKeywords[keyword];
+};
+
+convert.rgb.xyz = function (rgb) {
+	let r = rgb[0] / 255;
+	let g = rgb[1] / 255;
+	let b = rgb[2] / 255;
+
+	// Assume sRGB
+	r = r > 0.04045 ? (((r + 0.055) / 1.055) ** 2.4) : (r / 12.92);
+	g = g > 0.04045 ? (((g + 0.055) / 1.055) ** 2.4) : (g / 12.92);
+	b = b > 0.04045 ? (((b + 0.055) / 1.055) ** 2.4) : (b / 12.92);
+
+	const x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);
+	const y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);
+	const z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);
+
+	return [x * 100, y * 100, z * 100];
+};
+
+convert.rgb.lab = function (rgb) {
+	const xyz = convert.rgb.xyz(rgb);
+	let x = xyz[0];
+	let y = xyz[1];
+	let z = xyz[2];
+
+	x /= 95.047;
+	y /= 100;
+	z /= 108.883;
+
+	x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
+	y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
+	z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
+
+	const l = (116 * y) - 16;
+	const a = 500 * (x - y);
+	const b = 200 * (y - z);
+
+	return [l, a, b];
+};
+
+convert.hsl.rgb = function (hsl) {
+	const h = hsl[0] / 360;
+	const s = hsl[1] / 100;
+	const l = hsl[2] / 100;
+	let t2;
+	let t3;
+	let val;
+
+	if (s === 0) {
+		val = l * 255;
+		return [val, val, val];
+	}
+
+	if (l < 0.5) {
+		t2 = l * (1 + s);
+	} else {
+		t2 = l + s - l * s;
+	}
+
+	const t1 = 2 * l - t2;
+
+	const rgb = [0, 0, 0];
+	for (let i = 0; i < 3; i++) {
+		t3 = h + 1 / 3 * -(i - 1);
+		if (t3 < 0) {
+			t3++;
+		}
+
+		if (t3 > 1) {
+			t3--;
+		}
+
+		if (6 * t3 < 1) {
+			val = t1 + (t2 - t1) * 6 * t3;
+		} else if (2 * t3 < 1) {
+			val = t2;
+		} else if (3 * t3 < 2) {
+			val = t1 + (t2 - t1) * (2 / 3 - t3) * 6;
+		} else {
+			val = t1;
+		}
+
+		rgb[i] = val * 255;
+	}
+
+	return rgb;
+};
+
+convert.hsl.hsv = function (hsl) {
+	const h = hsl[0];
+	let s = hsl[1] / 100;
+	let l = hsl[2] / 100;
+	let smin = s;
+	const lmin = Math.max(l, 0.01);
+
+	l *= 2;
+	s *= (l <= 1) ? l : 2 - l;
+	smin *= lmin <= 1 ? lmin : 2 - lmin;
+	const v = (l + s) / 2;
+	const sv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);
+
+	return [h, sv * 100, v * 100];
+};
+
+convert.hsv.rgb = function (hsv) {
+	const h = hsv[0] / 60;
+	const s = hsv[1] / 100;
+	let v = hsv[2] / 100;
+	const hi = Math.floor(h) % 6;
+
+	const f = h - Math.floor(h);
+	const p = 255 * v * (1 - s);
+	const q = 255 * v * (1 - (s * f));
+	const t = 255 * v * (1 - (s * (1 - f)));
+	v *= 255;
+
+	switch (hi) {
+		case 0:
+			return [v, t, p];
+		case 1:
+			return [q, v, p];
+		case 2:
+			return [p, v, t];
+		case 3:
+			return [p, q, v];
+		case 4:
+			return [t, p, v];
+		case 5:
+			return [v, p, q];
+	}
+};
+
+convert.hsv.hsl = function (hsv) {
+	const h = hsv[0];
+	const s = hsv[1] / 100;
+	const v = hsv[2] / 100;
+	const vmin = Math.max(v, 0.01);
+	let sl;
+	let l;
+
+	l = (2 - s) * v;
+	const lmin = (2 - s) * vmin;
+	sl = s * vmin;
+	sl /= (lmin <= 1) ? lmin : 2 - lmin;
+	sl = sl || 0;
+	l /= 2;
+
+	return [h, sl * 100, l * 100];
+};
+
+// http://dev.w3.org/csswg/css-color/#hwb-to-rgb
+convert.hwb.rgb = function (hwb) {
+	const h = hwb[0] / 360;
+	let wh = hwb[1] / 100;
+	let bl = hwb[2] / 100;
+	const ratio = wh + bl;
+	let f;
+
+	// Wh + bl cant be > 1
+	if (ratio > 1) {
+		wh /= ratio;
+		bl /= ratio;
+	}
+
+	const i = Math.floor(6 * h);
+	const v = 1 - bl;
+	f = 6 * h - i;
+
+	if ((i & 0x01) !== 0) {
+		f = 1 - f;
+	}
+
+	const n = wh + f * (v - wh); // Linear interpolation
+
+	let r;
+	let g;
+	let b;
+	/* eslint-disable max-statements-per-line,no-multi-spaces */
+	switch (i) {
+		default:
+		case 6:
+		case 0: r = v;  g = n;  b = wh; break;
+		case 1: r = n;  g = v;  b = wh; break;
+		case 2: r = wh; g = v;  b = n; break;
+		case 3: r = wh; g = n;  b = v; break;
+		case 4: r = n;  g = wh; b = v; break;
+		case 5: r = v;  g = wh; b = n; break;
+	}
+	/* eslint-enable max-statements-per-line,no-multi-spaces */
+
+	return [r * 255, g * 255, b * 255];
+};
+
+convert.cmyk.rgb = function (cmyk) {
+	const c = cmyk[0] / 100;
+	const m = cmyk[1] / 100;
+	const y = cmyk[2] / 100;
+	const k = cmyk[3] / 100;
+
+	const r = 1 - Math.min(1, c * (1 - k) + k);
+	const g = 1 - Math.min(1, m * (1 - k) + k);
+	const b = 1 - Math.min(1, y * (1 - k) + k);
+
+	return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.rgb = function (xyz) {
+	const x = xyz[0] / 100;
+	const y = xyz[1] / 100;
+	const z = xyz[2] / 100;
+	let r;
+	let g;
+	let b;
+
+	r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);
+	g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);
+	b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);
+
+	// Assume sRGB
+	r = r > 0.0031308
+		? ((1.055 * (r ** (1.0 / 2.4))) - 0.055)
+		: r * 12.92;
+
+	g = g > 0.0031308
+		? ((1.055 * (g ** (1.0 / 2.4))) - 0.055)
+		: g * 12.92;
+
+	b = b > 0.0031308
+		? ((1.055 * (b ** (1.0 / 2.4))) - 0.055)
+		: b * 12.92;
+
+	r = Math.min(Math.max(0, r), 1);
+	g = Math.min(Math.max(0, g), 1);
+	b = Math.min(Math.max(0, b), 1);
+
+	return [r * 255, g * 255, b * 255];
+};
+
+convert.xyz.lab = function (xyz) {
+	let x = xyz[0];
+	let y = xyz[1];
+	let z = xyz[2];
+
+	x /= 95.047;
+	y /= 100;
+	z /= 108.883;
+
+	x = x > 0.008856 ? (x ** (1 / 3)) : (7.787 * x) + (16 / 116);
+	y = y > 0.008856 ? (y ** (1 / 3)) : (7.787 * y) + (16 / 116);
+	z = z > 0.008856 ? (z ** (1 / 3)) : (7.787 * z) + (16 / 116);
+
+	const l = (116 * y) - 16;
+	const a = 500 * (x - y);
+	const b = 200 * (y - z);
+
+	return [l, a, b];
+};
+
+convert.lab.xyz = function (lab) {
+	const l = lab[0];
+	const a = lab[1];
+	const b = lab[2];
+	let x;
+	let y;
+	let z;
+
+	y = (l + 16) / 116;
+	x = a / 500 + y;
+	z = y - b / 200;
+
+	const y2 = y ** 3;
+	const x2 = x ** 3;
+	const z2 = z ** 3;
+	y = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;
+	x = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;
+	z = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;
+
+	x *= 95.047;
+	y *= 100;
+	z *= 108.883;
+
+	return [x, y, z];
+};
+
+convert.lab.lch = function (lab) {
+	const l = lab[0];
+	const a = lab[1];
+	const b = lab[2];
+	let h;
+
+	const hr = Math.atan2(b, a);
+	h = hr * 360 / 2 / Math.PI;
+
+	if (h < 0) {
+		h += 360;
+	}
+
+	const c = Math.sqrt(a * a + b * b);
+
+	return [l, c, h];
+};
+
+convert.lch.lab = function (lch) {
+	const l = lch[0];
+	const c = lch[1];
+	const h = lch[2];
+
+	const hr = h / 360 * 2 * Math.PI;
+	const a = c * Math.cos(hr);
+	const b = c * Math.sin(hr);
+
+	return [l, a, b];
+};
+
+convert.rgb.ansi16 = function (args, saturation = null) {
+	const [r, g, b] = args;
+	let value = saturation === null ? convert.rgb.hsv(args)[2] : saturation; // Hsv -> ansi16 optimization
+
+	value = Math.round(value / 50);
+
+	if (value === 0) {
+		return 30;
+	}
+
+	let ansi = 30
+		+ ((Math.round(b / 255) << 2)
+		| (Math.round(g / 255) << 1)
+		| Math.round(r / 255));
+
+	if (value === 2) {
+		ansi += 60;
+	}
+
+	return ansi;
+};
+
+convert.hsv.ansi16 = function (args) {
+	// Optimization here; we already know the value and don't need to get
+	// it converted for us.
+	return convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);
+};
+
+convert.rgb.ansi256 = function (args) {
+	const r = args[0];
+	const g = args[1];
+	const b = args[2];
+
+	// We use the extended greyscale palette here, with the exception of
+	// black and white. normal palette only has 4 greyscale shades.
+	if (r === g && g === b) {
+		if (r < 8) {
+			return 16;
+		}
+
+		if (r > 248) {
+			return 231;
+		}
+
+		return Math.round(((r - 8) / 247) * 24) + 232;
+	}
+
+	const ansi = 16
+		+ (36 * Math.round(r / 255 * 5))
+		+ (6 * Math.round(g / 255 * 5))
+		+ Math.round(b / 255 * 5);
+
+	return ansi;
+};
+
+convert.ansi16.rgb = function (args) {
+	let color = args % 10;
+
+	// Handle greyscale
+	if (color === 0 || color === 7) {
+		if (args > 50) {
+			color += 3.5;
+		}
+
+		color = color / 10.5 * 255;
+
+		return [color, color, color];
+	}
+
+	const mult = (~~(args > 50) + 1) * 0.5;
+	const r = ((color & 1) * mult) * 255;
+	const g = (((color >> 1) & 1) * mult) * 255;
+	const b = (((color >> 2) & 1) * mult) * 255;
+
+	return [r, g, b];
+};
+
+convert.ansi256.rgb = function (args) {
+	// Handle greyscale
+	if (args >= 232) {
+		const c = (args - 232) * 10 + 8;
+		return [c, c, c];
+	}
+
+	args -= 16;
+
+	let rem;
+	const r = Math.floor(args / 36) / 5 * 255;
+	const g = Math.floor((rem = args % 36) / 6) / 5 * 255;
+	const b = (rem % 6) / 5 * 255;
+
+	return [r, g, b];
+};
+
+convert.rgb.hex = function (args) {
+	const integer = ((Math.round(args[0]) & 0xFF) << 16)
+		+ ((Math.round(args[1]) & 0xFF) << 8)
+		+ (Math.round(args[2]) & 0xFF);
+
+	const string = integer.toString(16).toUpperCase();
+	return '000000'.substring(string.length) + string;
+};
+
+convert.hex.rgb = function (args) {
+	const match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);
+	if (!match) {
+		return [0, 0, 0];
+	}
+
+	let colorString = match[0];
+
+	if (match[0].length === 3) {
+		colorString = colorString.split('').map(char => {
+			return char + char;
+		}).join('');
+	}
+
+	const integer = parseInt(colorString, 16);
+	const r = (integer >> 16) & 0xFF;
+	const g = (integer >> 8) & 0xFF;
+	const b = integer & 0xFF;
+
+	return [r, g, b];
+};
+
+convert.rgb.hcg = function (rgb) {
+	const r = rgb[0] / 255;
+	const g = rgb[1] / 255;
+	const b = rgb[2] / 255;
+	const max = Math.max(Math.max(r, g), b);
+	const min = Math.min(Math.min(r, g), b);
+	const chroma = (max - min);
+	let grayscale;
+	let hue;
+
+	if (chroma < 1) {
+		grayscale = min / (1 - chroma);
+	} else {
+		grayscale = 0;
+	}
+
+	if (chroma <= 0) {
+		hue = 0;
+	} else
+	if (max === r) {
+		hue = ((g - b) / chroma) % 6;
+	} else
+	if (max === g) {
+		hue = 2 + (b - r) / chroma;
+	} else {
+		hue = 4 + (r - g) / chroma;
+	}
+
+	hue /= 6;
+	hue %= 1;
+
+	return [hue * 360, chroma * 100, grayscale * 100];
+};
+
+convert.hsl.hcg = function (hsl) {
+	const s = hsl[1] / 100;
+	const l = hsl[2] / 100;
+
+	const c = l < 0.5 ? (2.0 * s * l) : (2.0 * s * (1.0 - l));
+
+	let f = 0;
+	if (c < 1.0) {
+		f = (l - 0.5 * c) / (1.0 - c);
+	}
+
+	return [hsl[0], c * 100, f * 100];
+};
+
+convert.hsv.hcg = function (hsv) {
+	const s = hsv[1] / 100;
+	const v = hsv[2] / 100;
+
+	const c = s * v;
+	let f = 0;
+
+	if (c < 1.0) {
+		f = (v - c) / (1 - c);
+	}
+
+	return [hsv[0], c * 100, f * 100];
+};
+
+convert.hcg.rgb = function (hcg) {
+	const h = hcg[0] / 360;
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+
+	if (c === 0.0) {
+		return [g * 255, g * 255, g * 255];
+	}
+
+	const pure = [0, 0, 0];
+	const hi = (h % 1) * 6;
+	const v = hi % 1;
+	const w = 1 - v;
+	let mg = 0;
+
+	/* eslint-disable max-statements-per-line */
+	switch (Math.floor(hi)) {
+		case 0:
+			pure[0] = 1; pure[1] = v; pure[2] = 0; break;
+		case 1:
+			pure[0] = w; pure[1] = 1; pure[2] = 0; break;
+		case 2:
+			pure[0] = 0; pure[1] = 1; pure[2] = v; break;
+		case 3:
+			pure[0] = 0; pure[1] = w; pure[2] = 1; break;
+		case 4:
+			pure[0] = v; pure[1] = 0; pure[2] = 1; break;
+		default:
+			pure[0] = 1; pure[1] = 0; pure[2] = w;
+	}
+	/* eslint-enable max-statements-per-line */
+
+	mg = (1.0 - c) * g;
+
+	return [
+		(c * pure[0] + mg) * 255,
+		(c * pure[1] + mg) * 255,
+		(c * pure[2] + mg) * 255
+	];
+};
+
+convert.hcg.hsv = function (hcg) {
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+
+	const v = c + g * (1.0 - c);
+	let f = 0;
+
+	if (v > 0.0) {
+		f = c / v;
+	}
+
+	return [hcg[0], f * 100, v * 100];
+};
+
+convert.hcg.hsl = function (hcg) {
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+
+	const l = g * (1.0 - c) + 0.5 * c;
+	let s = 0;
+
+	if (l > 0.0 && l < 0.5) {
+		s = c / (2 * l);
+	} else
+	if (l >= 0.5 && l < 1.0) {
+		s = c / (2 * (1 - l));
+	}
+
+	return [hcg[0], s * 100, l * 100];
+};
+
+convert.hcg.hwb = function (hcg) {
+	const c = hcg[1] / 100;
+	const g = hcg[2] / 100;
+	const v = c + g * (1.0 - c);
+	return [hcg[0], (v - c) * 100, (1 - v) * 100];
+};
+
+convert.hwb.hcg = function (hwb) {
+	const w = hwb[1] / 100;
+	const b = hwb[2] / 100;
+	const v = 1 - b;
+	const c = v - w;
+	let g = 0;
+
+	if (c < 1) {
+		g = (v - c) / (1 - c);
+	}
+
+	return [hwb[0], c * 100, g * 100];
+};
+
+convert.apple.rgb = function (apple) {
+	return [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];
+};
+
+convert.rgb.apple = function (rgb) {
+	return [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];
+};
+
+convert.gray.rgb = function (args) {
+	return [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];
+};
+
+convert.gray.hsl = function (args) {
+	return [0, 0, args[0]];
+};
+
+convert.gray.hsv = convert.gray.hsl;
+
+convert.gray.hwb = function (gray) {
+	return [0, 100, gray[0]];
+};
+
+convert.gray.cmyk = function (gray) {
+	return [0, 0, 0, gray[0]];
+};
+
+convert.gray.lab = function (gray) {
+	return [gray[0], 0, 0];
+};
+
+convert.gray.hex = function (gray) {
+	const val = Math.round(gray[0] / 100 * 255) & 0xFF;
+	const integer = (val << 16) + (val << 8) + val;
+
+	const string = integer.toString(16).toUpperCase();
+	return '000000'.substring(string.length) + string;
+};
+
+convert.rgb.gray = function (rgb) {
+	const val = (rgb[0] + rgb[1] + rgb[2]) / 3;
+	return [val / 255 * 100];
+};
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/index.js b/uni_modules/wu-ui-tools/libs/function/color/color-convert/index.js
new file mode 100644
index 0000000..85b580c
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/index.js
@@ -0,0 +1,81 @@
+import route from './route'
+import conversions from './conversions'
+
+const convert = {};
+
+const models = Object.keys(conversions);
+
+function wrapRaw(fn) {
+	const wrappedFn = function (...args) {
+		const arg0 = args[0];
+		if (arg0 === undefined || arg0 === null) {
+			return arg0;
+		}
+
+		if (arg0.length > 1) {
+			args = arg0;
+		}
+
+		return fn(args);
+	};
+
+	// Preserve .conversion property if there is one
+	if ('conversion' in fn) {
+		wrappedFn.conversion = fn.conversion;
+	}
+
+	return wrappedFn;
+}
+
+function wrapRounded(fn) {
+	const wrappedFn = function (...args) {
+		const arg0 = args[0];
+
+		if (arg0 === undefined || arg0 === null) {
+			return arg0;
+		}
+
+		if (arg0.length > 1) {
+			args = arg0;
+		}
+
+		const result = fn(args);
+
+		// We're assuming the result is an array here.
+		// see notice in conversions.js; don't use box types
+		// in conversion functions.
+		if (typeof result === 'object') {
+			for (let len = result.length, i = 0; i < len; i++) {
+				result[i] = Math.round(result[i]);
+			}
+		}
+
+		return result;
+	};
+
+	// Preserve .conversion property if there is one
+	if ('conversion' in fn) {
+		wrappedFn.conversion = fn.conversion;
+	}
+
+	return wrappedFn;
+}
+
+models.forEach(fromModel => {
+	convert[fromModel] = {};
+
+	Object.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});
+	Object.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});
+
+	const routes = route(fromModel);
+	const routeModels = Object.keys(routes);
+
+	routeModels.forEach(toModel => {
+		const fn = routes[toModel];
+
+		convert[fromModel][toModel] = wrapRounded(fn);
+		convert[fromModel][toModel].raw = wrapRaw(fn);
+	});
+});
+
+export default convert;
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/package.json b/uni_modules/wu-ui-tools/libs/function/color/color-convert/package.json
new file mode 100644
index 0000000..6e48000
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/package.json
@@ -0,0 +1,48 @@
+{
+  "name": "color-convert",
+  "description": "Plain color conversion functions",
+  "version": "2.0.1",
+  "author": "Heather Arthur <fayearthur@gmail.com>",
+  "license": "MIT",
+  "repository": "Qix-/color-convert",
+  "scripts": {
+    "pretest": "xo",
+    "test": "node test/basic.js"
+  },
+  "engines": {
+    "node": ">=7.0.0"
+  },
+  "keywords": [
+    "color",
+    "colour",
+    "convert",
+    "converter",
+    "conversion",
+    "rgb",
+    "hsl",
+    "hsv",
+    "hwb",
+    "cmyk",
+    "ansi",
+    "ansi16"
+  ],
+  "files": [
+    "index.js",
+    "conversions.js",
+    "route.js"
+  ],
+  "xo": {
+    "rules": {
+      "default-case": 0,
+      "no-inline-comments": 0,
+      "operator-linebreak": 0
+    }
+  },
+  "devDependencies": {
+    "chalk": "^2.4.2",
+    "xo": "^0.24.0"
+  },
+  "dependencies": {
+    "color-name": "~1.1.4"
+  }
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-convert/route.js b/uni_modules/wu-ui-tools/libs/function/color/color-convert/route.js
new file mode 100644
index 0000000..e210bfe
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-convert/route.js
@@ -0,0 +1,97 @@
+import conversions from './conversions'
+
+/*
+	This function routes a model to all other models.
+
+	all functions that are routed have a property `.conversion` attached
+	to the returned synthetic function. This property is an array
+	of strings, each with the steps in between the 'from' and 'to'
+	color models (inclusive).
+
+	conversions that are not possible simply are not included.
+*/
+
+function buildGraph() {
+	const graph = {};
+	// https://jsperf.com/object-keys-vs-for-in-with-closure/3
+	const models = Object.keys(conversions);
+
+	for (let len = models.length, i = 0; i < len; i++) {
+		graph[models[i]] = {
+			// http://jsperf.com/1-vs-infinity
+			// micro-opt, but this is simple.
+			distance: -1,
+			parent: null
+		};
+	}
+
+	return graph;
+}
+
+// https://en.wikipedia.org/wiki/Breadth-first_search
+function deriveBFS(fromModel) {
+	const graph = buildGraph();
+	const queue = [fromModel]; // Unshift -> queue -> pop
+
+	graph[fromModel].distance = 0;
+
+	while (queue.length) {
+		const current = queue.pop();
+		const adjacents = Object.keys(conversions[current]);
+
+		for (let len = adjacents.length, i = 0; i < len; i++) {
+			const adjacent = adjacents[i];
+			const node = graph[adjacent];
+
+			if (node.distance === -1) {
+				node.distance = graph[current].distance + 1;
+				node.parent = current;
+				queue.unshift(adjacent);
+			}
+		}
+	}
+
+	return graph;
+}
+
+function link(from, to) {
+	return function (args) {
+		return to(from(args));
+	};
+}
+
+function wrapConversion(toModel, graph) {
+	const path = [graph[toModel].parent, toModel];
+	let fn = conversions[graph[toModel].parent][toModel];
+
+	let cur = graph[toModel].parent;
+	while (graph[cur].parent) {
+		path.unshift(graph[cur].parent);
+		fn = link(conversions[graph[cur].parent][cur], fn);
+		cur = graph[cur].parent;
+	}
+
+	fn.conversion = path;
+	return fn;
+}
+
+export default function (fromModel) {
+	const graph = deriveBFS(fromModel);
+	const conversion = {};
+
+	const models = Object.keys(graph);
+	for (let len = models.length, i = 0; i < len; i++) {
+		const toModel = models[i];
+		const node = graph[toModel];
+
+		if (node.parent === null) {
+			// No possible conversion, or this node is the source model.
+			continue;
+		}
+
+		conversion[toModel] = wrapConversion(toModel, graph);
+	}
+
+	return conversion;
+};
+
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-name/LICENSE b/uni_modules/wu-ui-tools/libs/function/color/color-name/LICENSE
new file mode 100644
index 0000000..4d9802a
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-name/LICENSE
@@ -0,0 +1,8 @@
+The MIT License (MIT)
+Copyright (c) 2015 Dmitry Ivanov
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-name/README.md b/uni_modules/wu-ui-tools/libs/function/color/color-name/README.md
new file mode 100644
index 0000000..3611a6b
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-name/README.md
@@ -0,0 +1,11 @@
+A JSON with color names and its values. Based on http://dev.w3.org/csswg/css-color/#named-colors.
+
+[![NPM](https://nodei.co/npm/color-name.png?mini=true)](https://nodei.co/npm/color-name/)
+
+
+```js
+var colors = require('color-name');
+colors.red //[255,0,0]
+```
+
+<a href="LICENSE"><img src="https://upload.wikimedia.org/wikipedia/commons/0/0c/MIT_logo.svg" width="120"/></a>
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-name/index.js b/uni_modules/wu-ui-tools/libs/function/color/color-name/index.js
new file mode 100644
index 0000000..7d4ac40
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-name/index.js
@@ -0,0 +1,152 @@
+'use strict'
+
+export default {
+	"aliceblue": [240, 248, 255],
+	"antiquewhite": [250, 235, 215],
+	"aqua": [0, 255, 255],
+	"aquamarine": [127, 255, 212],
+	"azure": [240, 255, 255],
+	"beige": [245, 245, 220],
+	"bisque": [255, 228, 196],
+	"black": [0, 0, 0],
+	"blanchedalmond": [255, 235, 205],
+	"blue": [0, 0, 255],
+	"blueviolet": [138, 43, 226],
+	"brown": [165, 42, 42],
+	"burlywood": [222, 184, 135],
+	"cadetblue": [95, 158, 160],
+	"chartreuse": [127, 255, 0],
+	"chocolate": [210, 105, 30],
+	"coral": [255, 127, 80],
+	"cornflowerblue": [100, 149, 237],
+	"cornsilk": [255, 248, 220],
+	"crimson": [220, 20, 60],
+	"cyan": [0, 255, 255],
+	"darkblue": [0, 0, 139],
+	"darkcyan": [0, 139, 139],
+	"darkgoldenrod": [184, 134, 11],
+	"darkgray": [169, 169, 169],
+	"darkgreen": [0, 100, 0],
+	"darkgrey": [169, 169, 169],
+	"darkkhaki": [189, 183, 107],
+	"darkmagenta": [139, 0, 139],
+	"darkolivegreen": [85, 107, 47],
+	"darkorange": [255, 140, 0],
+	"darkorchid": [153, 50, 204],
+	"darkred": [139, 0, 0],
+	"darksalmon": [233, 150, 122],
+	"darkseagreen": [143, 188, 143],
+	"darkslateblue": [72, 61, 139],
+	"darkslategray": [47, 79, 79],
+	"darkslategrey": [47, 79, 79],
+	"darkturquoise": [0, 206, 209],
+	"darkviolet": [148, 0, 211],
+	"deeppink": [255, 20, 147],
+	"deepskyblue": [0, 191, 255],
+	"dimgray": [105, 105, 105],
+	"dimgrey": [105, 105, 105],
+	"dodgerblue": [30, 144, 255],
+	"firebrick": [178, 34, 34],
+	"floralwhite": [255, 250, 240],
+	"forestgreen": [34, 139, 34],
+	"fuchsia": [255, 0, 255],
+	"gainsboro": [220, 220, 220],
+	"ghostwhite": [248, 248, 255],
+	"gold": [255, 215, 0],
+	"goldenrod": [218, 165, 32],
+	"gray": [128, 128, 128],
+	"green": [0, 128, 0],
+	"greenyellow": [173, 255, 47],
+	"grey": [128, 128, 128],
+	"honeydew": [240, 255, 240],
+	"hotpink": [255, 105, 180],
+	"indianred": [205, 92, 92],
+	"indigo": [75, 0, 130],
+	"ivory": [255, 255, 240],
+	"khaki": [240, 230, 140],
+	"lavender": [230, 230, 250],
+	"lavenderblush": [255, 240, 245],
+	"lawngreen": [124, 252, 0],
+	"lemonchiffon": [255, 250, 205],
+	"lightblue": [173, 216, 230],
+	"lightcoral": [240, 128, 128],
+	"lightcyan": [224, 255, 255],
+	"lightgoldenrodyellow": [250, 250, 210],
+	"lightgray": [211, 211, 211],
+	"lightgreen": [144, 238, 144],
+	"lightgrey": [211, 211, 211],
+	"lightpink": [255, 182, 193],
+	"lightsalmon": [255, 160, 122],
+	"lightseagreen": [32, 178, 170],
+	"lightskyblue": [135, 206, 250],
+	"lightslategray": [119, 136, 153],
+	"lightslategrey": [119, 136, 153],
+	"lightsteelblue": [176, 196, 222],
+	"lightyellow": [255, 255, 224],
+	"lime": [0, 255, 0],
+	"limegreen": [50, 205, 50],
+	"linen": [250, 240, 230],
+	"magenta": [255, 0, 255],
+	"maroon": [128, 0, 0],
+	"mediumaquamarine": [102, 205, 170],
+	"mediumblue": [0, 0, 205],
+	"mediumorchid": [186, 85, 211],
+	"mediumpurple": [147, 112, 219],
+	"mediumseagreen": [60, 179, 113],
+	"mediumslateblue": [123, 104, 238],
+	"mediumspringgreen": [0, 250, 154],
+	"mediumturquoise": [72, 209, 204],
+	"mediumvioletred": [199, 21, 133],
+	"midnightblue": [25, 25, 112],
+	"mintcream": [245, 255, 250],
+	"mistyrose": [255, 228, 225],
+	"moccasin": [255, 228, 181],
+	"navajowhite": [255, 222, 173],
+	"navy": [0, 0, 128],
+	"oldlace": [253, 245, 230],
+	"olive": [128, 128, 0],
+	"olivedrab": [107, 142, 35],
+	"orange": [255, 165, 0],
+	"orangered": [255, 69, 0],
+	"orchid": [218, 112, 214],
+	"palegoldenrod": [238, 232, 170],
+	"palegreen": [152, 251, 152],
+	"paleturquoise": [175, 238, 238],
+	"palevioletred": [219, 112, 147],
+	"papayawhip": [255, 239, 213],
+	"peachpuff": [255, 218, 185],
+	"peru": [205, 133, 63],
+	"pink": [255, 192, 203],
+	"plum": [221, 160, 221],
+	"powderblue": [176, 224, 230],
+	"purple": [128, 0, 128],
+	"rebeccapurple": [102, 51, 153],
+	"red": [255, 0, 0],
+	"rosybrown": [188, 143, 143],
+	"royalblue": [65, 105, 225],
+	"saddlebrown": [139, 69, 19],
+	"salmon": [250, 128, 114],
+	"sandybrown": [244, 164, 96],
+	"seagreen": [46, 139, 87],
+	"seashell": [255, 245, 238],
+	"sienna": [160, 82, 45],
+	"silver": [192, 192, 192],
+	"skyblue": [135, 206, 235],
+	"slateblue": [106, 90, 205],
+	"slategray": [112, 128, 144],
+	"slategrey": [112, 128, 144],
+	"snow": [255, 250, 250],
+	"springgreen": [0, 255, 127],
+	"steelblue": [70, 130, 180],
+	"tan": [210, 180, 140],
+	"teal": [0, 128, 128],
+	"thistle": [216, 191, 216],
+	"tomato": [255, 99, 71],
+	"turquoise": [64, 224, 208],
+	"violet": [238, 130, 238],
+	"wheat": [245, 222, 179],
+	"white": [255, 255, 255],
+	"whitesmoke": [245, 245, 245],
+	"yellow": [255, 255, 0],
+	"yellowgreen": [154, 205, 50]
+};
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-name/package.json b/uni_modules/wu-ui-tools/libs/function/color/color-name/package.json
new file mode 100644
index 0000000..7acc902
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-name/package.json
@@ -0,0 +1,28 @@
+{
+  "name": "color-name",
+  "version": "1.1.4",
+  "description": "A list of color names and its values",
+  "main": "index.js",
+  "files": [
+    "index.js"
+  ],
+  "scripts": {
+    "test": "node test.js"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git@github.com:colorjs/color-name.git"
+  },
+  "keywords": [
+    "color-name",
+    "color",
+    "color-keyword",
+    "keyword"
+  ],
+  "author": "DY <dfcreative@gmail.com>",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/colorjs/color-name/issues"
+  },
+  "homepage": "https://github.com/colorjs/color-name"
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-string/LICENSE b/uni_modules/wu-ui-tools/libs/function/color/color-string/LICENSE
new file mode 100644
index 0000000..a8b08d4
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-string/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2011 Heather Arthur <fayearthur@gmail.com>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-string/README.md b/uni_modules/wu-ui-tools/libs/function/color/color-string/README.md
new file mode 100644
index 0000000..e58670c
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-string/README.md
@@ -0,0 +1,62 @@
+# color-string
+
+> library for parsing and generating CSS color strings.
+
+## Install
+
+With [npm](http://npmjs.org/):
+
+```console
+$ npm install color-string
+```
+
+## Usage
+
+### Parsing
+
+```js
+colorString.get('#FFF')                          // {model: 'rgb', value: [255, 255, 255, 1]}
+colorString.get('#FFFA')                         // {model: 'rgb', value: [255, 255, 255, 0.67]}
+colorString.get('#FFFFFFAA')                     // {model: 'rgb', value: [255, 255, 255, 0.67]}
+colorString.get('hsl(360, 100%, 50%)')           // {model: 'hsl', value: [0, 100, 50, 1]}
+colorString.get('hsl(360 100% 50%)')             // {model: 'hsl', value: [0, 100, 50, 1]}
+colorString.get('hwb(60, 3%, 60%)')              // {model: 'hwb', value: [60, 3, 60, 1]}
+
+colorString.get.rgb('#FFF')                      // [255, 255, 255, 1]
+colorString.get.rgb('blue')                      // [0, 0, 255, 1]
+colorString.get.rgb('rgba(200, 60, 60, 0.3)')    // [200, 60, 60, 0.3]
+colorString.get.rgb('rgba(200 60 60 / 0.3)')     // [200, 60, 60, 0.3]
+colorString.get.rgb('rgba(200 60 60 / 30%)')     // [200, 60, 60, 0.3]
+colorString.get.rgb('rgb(200, 200, 200)')        // [200, 200, 200, 1]
+colorString.get.rgb('rgb(200 200 200)')          // [200, 200, 200, 1]
+
+colorString.get.hsl('hsl(360, 100%, 50%)')       // [0, 100, 50, 1]
+colorString.get.hsl('hsl(360 100% 50%)')         // [0, 100, 50, 1]
+colorString.get.hsl('hsla(360, 60%, 50%, 0.4)')  // [0, 60, 50, 0.4]
+colorString.get.hsl('hsl(360 60% 50% / 0.4)')    // [0, 60, 50, 0.4]
+
+colorString.get.hwb('hwb(60, 3%, 60%)')          // [60, 3, 60, 1]
+colorString.get.hwb('hwb(60, 3%, 60%, 0.6)')     // [60, 3, 60, 0.6]
+
+colorString.get.rgb('invalid color string')      // null
+```
+
+### Generation
+
+```js
+colorString.to.hex([255, 255, 255])     // "#FFFFFF"
+colorString.to.hex([0, 0, 255, 0.4])    // "#0000FF66"
+colorString.to.hex([0, 0, 255], 0.4)    // "#0000FF66"
+colorString.to.rgb([255, 255, 255])     // "rgb(255, 255, 255)"
+colorString.to.rgb([0, 0, 255, 0.4])    // "rgba(0, 0, 255, 0.4)"
+colorString.to.rgb([0, 0, 255], 0.4)    // "rgba(0, 0, 255, 0.4)"
+colorString.to.rgb.percent([0, 0, 255]) // "rgb(0%, 0%, 100%)"
+colorString.to.keyword([255, 255, 0])   // "yellow"
+colorString.to.hsl([360, 100, 100])     // "hsl(360, 100%, 100%)"
+colorString.to.hwb([50, 3, 15])         // "hwb(50, 3%, 15%)"
+
+// all functions also support swizzling
+colorString.to.rgb(0, [0, 255], 0.4)    // "rgba(0, 0, 255, 0.4)"
+colorString.to.rgb([0, 0], [255], 0.4)  // "rgba(0, 0, 255, 0.4)"
+colorString.to.rgb([0], 0, [255, 0.4])  // "rgba(0, 0, 255, 0.4)"
+```
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-string/index.js b/uni_modules/wu-ui-tools/libs/function/color/color-string/index.js
new file mode 100644
index 0000000..713d14c
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-string/index.js
@@ -0,0 +1,244 @@
+/* MIT license */
+import colorNames from '../color-name'
+import swizzle from '../simple-swizzle'
+var hasOwnProperty = Object.hasOwnProperty;
+
+var reverseNames = Object.create(null);
+
+// create a list of reverse color names
+for (var name in colorNames) {
+	if (hasOwnProperty.call(colorNames, name)) {
+		reverseNames[colorNames[name]] = name;
+	}
+}
+
+var cs = {
+	to: {},
+	get: {}
+};
+
+cs.get = function (string) {
+	var prefix = string.substring(0, 3).toLowerCase();
+	var val;
+	var model;
+	switch (prefix) {
+		case 'hsl':
+			val = cs.get.hsl(string);
+			model = 'hsl';
+			break;
+		case 'hwb':
+			val = cs.get.hwb(string);
+			model = 'hwb';
+			break;
+		default:
+			val = cs.get.rgb(string);
+			model = 'rgb';
+			break;
+	}
+
+	if (!val) {
+		return null;
+	}
+
+	return {model: model, value: val};
+};
+
+cs.get.rgb = function (string) {
+	if (!string) {
+		return null;
+	}
+
+	var abbr = /^#([a-f0-9]{3,4})$/i;
+	var hex = /^#([a-f0-9]{6})([a-f0-9]{2})?$/i;
+	var rgba = /^rgba?\(\s*([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)(?=[\s,])\s*(?:,\s*)?([+-]?\d+)\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
+	var per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*,?\s*([+-]?[\d\.]+)\%\s*(?:[,|\/]\s*([+-]?[\d\.]+)(%?)\s*)?\)$/;
+	var keyword = /^(\w+)$/;
+
+	var rgb = [0, 0, 0, 1];
+	var match;
+	var i;
+	var hexAlpha;
+
+	if (match = string.match(hex)) {
+		hexAlpha = match[2];
+		match = match[1];
+
+		for (i = 0; i < 3; i++) {
+			// https://jsperf.com/slice-vs-substr-vs-substring-methods-long-string/19
+			var i2 = i * 2;
+			rgb[i] = parseInt(match.slice(i2, i2 + 2), 16);
+		}
+
+		if (hexAlpha) {
+			rgb[3] = parseInt(hexAlpha, 16) / 255;
+		}
+	} else if (match = string.match(abbr)) {
+		match = match[1];
+		hexAlpha = match[3];
+
+		for (i = 0; i < 3; i++) {
+			rgb[i] = parseInt(match[i] + match[i], 16);
+		}
+
+		if (hexAlpha) {
+			rgb[3] = parseInt(hexAlpha + hexAlpha, 16) / 255;
+		}
+	} else if (match = string.match(rgba)) {
+		for (i = 0; i < 3; i++) {
+			rgb[i] = parseInt(match[i + 1], 0);
+		}
+
+		if (match[4]) {
+			if (match[5]) {
+				rgb[3] = parseFloat(match[4]) * 0.01;
+			} else {
+				rgb[3] = parseFloat(match[4]);
+			}
+		}
+	} else if (match = string.match(per)) {
+		for (i = 0; i < 3; i++) {
+			rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);
+		}
+
+		if (match[4]) {
+			if (match[5]) {
+				rgb[3] = parseFloat(match[4]) * 0.01;
+			} else {
+				rgb[3] = parseFloat(match[4]);
+			}
+		}
+	} else if (match = string.match(keyword)) {
+		if (match[1] === 'transparent') {
+			return [0, 0, 0, 0];
+		}
+
+		if (!hasOwnProperty.call(colorNames, match[1])) {
+			return null;
+		}
+
+		rgb = colorNames[match[1]];
+		rgb[3] = 1;
+
+		return rgb;
+	} else {
+		return null;
+	}
+
+	for (i = 0; i < 3; i++) {
+		rgb[i] = clamp(rgb[i], 0, 255);
+	}
+	rgb[3] = clamp(rgb[3], 0, 1);
+
+	return rgb;
+};
+
+cs.get.hsl = function (string) {
+	if (!string) {
+		return null;
+	}
+
+	var hsl = /^hsla?\(\s*([+-]?(?:\d{0,3}\.)?\d+)(?:deg)?\s*,?\s*([+-]?[\d\.]+)%\s*,?\s*([+-]?[\d\.]+)%\s*(?:[,|\/]\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
+	var match = string.match(hsl);
+
+	if (match) {
+		var alpha = parseFloat(match[4]);
+		var h = ((parseFloat(match[1]) % 360) + 360) % 360;
+		var s = clamp(parseFloat(match[2]), 0, 100);
+		var l = clamp(parseFloat(match[3]), 0, 100);
+		var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
+
+		return [h, s, l, a];
+	}
+
+	return null;
+};
+
+cs.get.hwb = function (string) {
+	if (!string) {
+		return null;
+	}
+
+	var hwb = /^hwb\(\s*([+-]?\d{0,3}(?:\.\d+)?)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:[eE][+-]?\d+)?)\s*)?\)$/;
+	var match = string.match(hwb);
+
+	if (match) {
+		var alpha = parseFloat(match[4]);
+		var h = ((parseFloat(match[1]) % 360) + 360) % 360;
+		var w = clamp(parseFloat(match[2]), 0, 100);
+		var b = clamp(parseFloat(match[3]), 0, 100);
+		var a = clamp(isNaN(alpha) ? 1 : alpha, 0, 1);
+		return [h, w, b, a];
+	}
+
+	return null;
+};
+
+cs.to.hex = function () {
+	var rgba = swizzle(arguments);
+
+	return (
+		'#' +
+		hexDouble(rgba[0]) +
+		hexDouble(rgba[1]) +
+		hexDouble(rgba[2]) +
+		(rgba[3] < 1
+			? (hexDouble(Math.round(rgba[3] * 255)))
+			: '')
+	);
+};
+
+cs.to.rgb = function () {
+	var rgba = swizzle(arguments);
+
+	return rgba.length < 4 || rgba[3] === 1
+		? 'rgb(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ')'
+		: 'rgba(' + Math.round(rgba[0]) + ', ' + Math.round(rgba[1]) + ', ' + Math.round(rgba[2]) + ', ' + rgba[3] + ')';
+};
+
+cs.to.rgb.percent = function () {
+	var rgba = swizzle(arguments);
+
+	var r = Math.round(rgba[0] / 255 * 100);
+	var g = Math.round(rgba[1] / 255 * 100);
+	var b = Math.round(rgba[2] / 255 * 100);
+
+	return rgba.length < 4 || rgba[3] === 1
+		? 'rgb(' + r + '%, ' + g + '%, ' + b + '%)'
+		: 'rgba(' + r + '%, ' + g + '%, ' + b + '%, ' + rgba[3] + ')';
+};
+
+cs.to.hsl = function () {
+	var hsla = swizzle(arguments);
+	return hsla.length < 4 || hsla[3] === 1
+		? 'hsl(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%)'
+		: 'hsla(' + hsla[0] + ', ' + hsla[1] + '%, ' + hsla[2] + '%, ' + hsla[3] + ')';
+};
+
+// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax
+// (hwb have alpha optional & 1 is default value)
+cs.to.hwb = function () {
+	var hwba = swizzle(arguments);
+
+	var a = '';
+	if (hwba.length >= 4 && hwba[3] !== 1) {
+		a = ', ' + hwba[3];
+	}
+
+	return 'hwb(' + hwba[0] + ', ' + hwba[1] + '%, ' + hwba[2] + '%' + a + ')';
+};
+
+cs.to.keyword = function (rgb) {
+	return reverseNames[rgb.slice(0, 3)];
+};
+
+// helpers
+function clamp(num, min, max) {
+	return Math.min(Math.max(min, num), max);
+}
+
+function hexDouble(num) {
+	var str = Math.round(num).toString(16).toUpperCase();
+	return (str.length < 2) ? '0' + str : str;
+}
+
+export default cs;
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color-string/package.json b/uni_modules/wu-ui-tools/libs/function/color/color-string/package.json
new file mode 100644
index 0000000..f34ee98
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color-string/package.json
@@ -0,0 +1,39 @@
+{
+  "name": "color-string",
+  "description": "Parser and generator for CSS color strings",
+  "version": "1.9.1",
+  "author": "Heather Arthur <fayearthur@gmail.com>",
+  "contributors": [
+    "Maxime Thirouin",
+    "Dyma Ywanov <dfcreative@gmail.com>",
+    "Josh Junon"
+  ],
+  "repository": "Qix-/color-string",
+  "scripts": {
+    "pretest": "xo",
+    "test": "node test/basic.js"
+  },
+  "license": "MIT",
+  "files": [
+    "index.js"
+  ],
+  "xo": {
+    "rules": {
+      "no-cond-assign": 0,
+      "operator-linebreak": 0
+    }
+  },
+  "dependencies": {
+    "color-name": "^1.0.0",
+    "simple-swizzle": "^0.2.2"
+  },
+  "devDependencies": {
+    "xo": "^0.12.1"
+  },
+  "keywords": [
+    "color",
+    "colour",
+    "rgb",
+    "css"
+  ]
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/color/color.js b/uni_modules/wu-ui-tools/libs/function/color/color.js
new file mode 100644
index 0000000..2da7a2b
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/color.js
@@ -0,0 +1,496 @@
+import colorString from './color-string'
+import convert from './color-convert'
+
+const skippedModels = [
+	// To be honest, I don't really feel like keyword belongs in color convert, but eh.
+	'keyword',
+
+	// Gray conflicts with some method names, and has its own method defined.
+	'gray',
+
+	// Shouldn't really be in color-convert either...
+	'hex',
+];
+
+const hashedModelKeys = {};
+for (const model of Object.keys(convert)) {
+	hashedModelKeys[[...convert[model].labels].sort().join('')] = model;
+}
+
+const limiters = {};
+
+function Color(object, model) {
+	if (!(this instanceof Color)) {
+		return new Color(object, model);
+	}
+
+	if (model && model in skippedModels) {
+		model = null;
+	}
+
+	if (model && !(model in convert)) {
+		throw new Error('Unknown model: ' + model);
+	}
+
+	let i;
+	let channels;
+
+	if (object == null) { // eslint-disable-line no-eq-null,eqeqeq
+		this.model = 'rgb';
+		this.color = [0, 0, 0];
+		this.valpha = 1;
+	} else if (object instanceof Color) {
+		this.model = object.model;
+		this.color = [...object.color];
+		this.valpha = object.valpha;
+	} else if (typeof object === 'string') {
+		const result = colorString.get(object);
+		if (result === null) {
+			throw new Error('Unable to parse color from string: ' + object);
+		}
+
+		this.model = result.model;
+		channels = convert[this.model].channels;
+		this.color = result.value.slice(0, channels);
+		this.valpha = typeof result.value[channels] === 'number' ? result.value[channels] : 1;
+	} else if (object.length > 0) {
+		this.model = model || 'rgb';
+		channels = convert[this.model].channels;
+		const newArray = Array.prototype.slice.call(object, 0, channels);
+		this.color = zeroArray(newArray, channels);
+		this.valpha = typeof object[channels] === 'number' ? object[channels] : 1;
+	} else if (typeof object === 'number') {
+		// This is always RGB - can be converted later on.
+		this.model = 'rgb';
+		this.color = [
+			(object >> 16) & 0xFF,
+			(object >> 8) & 0xFF,
+			object & 0xFF,
+		];
+		this.valpha = 1;
+	} else {
+		this.valpha = 1;
+
+		const keys = Object.keys(object);
+		if ('alpha' in object) {
+			keys.splice(keys.indexOf('alpha'), 1);
+			this.valpha = typeof object.alpha === 'number' ? object.alpha : 0;
+		}
+
+		const hashedKeys = keys.sort().join('');
+		if (!(hashedKeys in hashedModelKeys)) {
+			throw new Error('Unable to parse color from object: ' + JSON.stringify(object));
+		}
+
+		this.model = hashedModelKeys[hashedKeys];
+
+		const {labels} = convert[this.model];
+		const color = [];
+		for (i = 0; i < labels.length; i++) {
+			color.push(object[labels[i]]);
+		}
+
+		this.color = zeroArray(color);
+	}
+
+	// Perform limitations (clamping, etc.)
+	if (limiters[this.model]) {
+		channels = convert[this.model].channels;
+		for (i = 0; i < channels; i++) {
+			const limit = limiters[this.model][i];
+			if (limit) {
+				this.color[i] = limit(this.color[i]);
+			}
+		}
+	}
+
+	this.valpha = Math.max(0, Math.min(1, this.valpha));
+
+	if (Object.freeze) {
+		Object.freeze(this);
+	}
+}
+
+Color.prototype = {
+	toString() {
+		return this.string();
+	},
+
+	toJSON() {
+		return this[this.model]();
+	},
+
+	string(places) {
+		let self = this.model in colorString.to ? this : this.rgb();
+		self = self.round(typeof places === 'number' ? places : 1);
+		const args = self.valpha === 1 ? self.color : [...self.color, this.valpha];
+		return colorString.to[self.model](args);
+	},
+
+	percentString(places) {
+		const self = this.rgb().round(typeof places === 'number' ? places : 1);
+		const args = self.valpha === 1 ? self.color : [...self.color, this.valpha];
+		return colorString.to.rgb.percent(args);
+	},
+
+	array() {
+		return this.valpha === 1 ? [...this.color] : [...this.color, this.valpha];
+	},
+
+	object() {
+		const result = {};
+		const {channels} = convert[this.model];
+		const {labels} = convert[this.model];
+
+		for (let i = 0; i < channels; i++) {
+			result[labels[i]] = this.color[i];
+		}
+
+		if (this.valpha !== 1) {
+			result.alpha = this.valpha;
+		}
+
+		return result;
+	},
+
+	unitArray() {
+		const rgb = this.rgb().color;
+		rgb[0] /= 255;
+		rgb[1] /= 255;
+		rgb[2] /= 255;
+
+		if (this.valpha !== 1) {
+			rgb.push(this.valpha);
+		}
+
+		return rgb;
+	},
+
+	unitObject() {
+		const rgb = this.rgb().object();
+		rgb.r /= 255;
+		rgb.g /= 255;
+		rgb.b /= 255;
+
+		if (this.valpha !== 1) {
+			rgb.alpha = this.valpha;
+		}
+
+		return rgb;
+	},
+
+	round(places) {
+		places = Math.max(places || 0, 0);
+		return new Color([...this.color.map(roundToPlace(places)), this.valpha], this.model);
+	},
+
+	alpha(value) {
+		if (value !== undefined) {
+			return new Color([...this.color, Math.max(0, Math.min(1, value))], this.model);
+		}
+
+		return this.valpha;
+	},
+
+	// Rgb
+	red: getset('rgb', 0, maxfn(255)),
+	green: getset('rgb', 1, maxfn(255)),
+	blue: getset('rgb', 2, maxfn(255)),
+
+	hue: getset(['hsl', 'hsv', 'hsl', 'hwb', 'hcg'], 0, value => ((value % 360) + 360) % 360),
+
+	saturationl: getset('hsl', 1, maxfn(100)),
+	lightness: getset('hsl', 2, maxfn(100)),
+
+	saturationv: getset('hsv', 1, maxfn(100)),
+	value: getset('hsv', 2, maxfn(100)),
+
+	chroma: getset('hcg', 1, maxfn(100)),
+	gray: getset('hcg', 2, maxfn(100)),
+
+	white: getset('hwb', 1, maxfn(100)),
+	wblack: getset('hwb', 2, maxfn(100)),
+
+	cyan: getset('cmyk', 0, maxfn(100)),
+	magenta: getset('cmyk', 1, maxfn(100)),
+	yellow: getset('cmyk', 2, maxfn(100)),
+	black: getset('cmyk', 3, maxfn(100)),
+
+	x: getset('xyz', 0, maxfn(95.047)),
+	y: getset('xyz', 1, maxfn(100)),
+	z: getset('xyz', 2, maxfn(108.833)),
+
+	l: getset('lab', 0, maxfn(100)),
+	a: getset('lab', 1),
+	b: getset('lab', 2),
+
+	keyword(value) {
+		if (value !== undefined) {
+			return new Color(value);
+		}
+
+		return convert[this.model].keyword(this.color);
+	},
+
+	hex(value) {
+		if (value !== undefined) {
+			return new Color(value);
+		}
+
+		return colorString.to.hex(this.rgb().round().color);
+	},
+
+	hexa(value) {
+		if (value !== undefined) {
+			return new Color(value);
+		}
+
+		const rgbArray = this.rgb().round().color;
+
+		let alphaHex = Math.round(this.valpha * 255).toString(16).toUpperCase();
+		if (alphaHex.length === 1) {
+			alphaHex = '0' + alphaHex;
+		}
+
+		return colorString.to.hex(rgbArray) + alphaHex;
+	},
+
+	rgbNumber() {
+		const rgb = this.rgb().color;
+		return ((rgb[0] & 0xFF) << 16) | ((rgb[1] & 0xFF) << 8) | (rgb[2] & 0xFF);
+	},
+
+	luminosity() {
+		// http://www.w3.org/TR/WCAG20/#relativeluminancedef
+		const rgb = this.rgb().color;
+
+		const lum = [];
+		for (const [i, element] of rgb.entries()) {
+			const chan = element / 255;
+			lum[i] = (chan <= 0.04045) ? chan / 12.92 : ((chan + 0.055) / 1.055) ** 2.4;
+		}
+
+		return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];
+	},
+
+	contrast(color2) {
+		// http://www.w3.org/TR/WCAG20/#contrast-ratiodef
+		const lum1 = this.luminosity();
+		const lum2 = color2.luminosity();
+
+		if (lum1 > lum2) {
+			return (lum1 + 0.05) / (lum2 + 0.05);
+		}
+
+		return (lum2 + 0.05) / (lum1 + 0.05);
+	},
+
+	level(color2) {
+		// https://www.w3.org/TR/WCAG/#contrast-enhanced
+		const contrastRatio = this.contrast(color2);
+		if (contrastRatio >= 7) {
+			return 'AAA';
+		}
+
+		return (contrastRatio >= 4.5) ? 'AA' : '';
+	},
+
+	isDark() {
+		// YIQ equation from http://24ways.org/2010/calculating-color-contrast
+		const rgb = this.rgb().color;
+		const yiq = (rgb[0] * 2126 + rgb[1] * 7152 + rgb[2] * 722) / 10000;
+		return yiq < 128;
+	},
+
+	isLight() {
+		return !this.isDark();
+	},
+
+	negate() {
+		const rgb = this.rgb();
+		for (let i = 0; i < 3; i++) {
+			rgb.color[i] = 255 - rgb.color[i];
+		}
+
+		return rgb;
+	},
+
+	lighten(ratio) {
+		const hsl = this.hsl();
+		hsl.color[2] += hsl.color[2] * ratio;
+		return hsl;
+	},
+
+	darken(ratio) {
+		const hsl = this.hsl();
+		hsl.color[2] -= hsl.color[2] * ratio;
+		return hsl;
+	},
+
+	saturate(ratio) {
+		const hsl = this.hsl();
+		hsl.color[1] += hsl.color[1] * ratio;
+		return hsl;
+	},
+
+	desaturate(ratio) {
+		const hsl = this.hsl();
+		hsl.color[1] -= hsl.color[1] * ratio;
+		return hsl;
+	},
+
+	whiten(ratio) {
+		const hwb = this.hwb();
+		hwb.color[1] += hwb.color[1] * ratio;
+		return hwb;
+	},
+
+	blacken(ratio) {
+		const hwb = this.hwb();
+		hwb.color[2] += hwb.color[2] * ratio;
+		return hwb;
+	},
+
+	grayscale() {
+		// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale
+		const rgb = this.rgb().color;
+		const value = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;
+		return Color.rgb(value, value, value);
+	},
+
+	fade(ratio) {
+		return this.alpha(this.valpha - (this.valpha * ratio));
+	},
+
+	opaquer(ratio) {
+		return this.alpha(this.valpha + (this.valpha * ratio));
+	},
+
+	rotate(degrees) {
+		const hsl = this.hsl();
+		let hue = hsl.color[0];
+		hue = (hue + degrees) % 360;
+		hue = hue < 0 ? 360 + hue : hue;
+		hsl.color[0] = hue;
+		return hsl;
+	},
+
+	mix(mixinColor, weight) {
+		// Ported from sass implementation in C
+		// https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209
+		if (!mixinColor || !mixinColor.rgb) {
+			throw new Error('Argument to "mix" was not a Color instance, but rather an instance of ' + typeof mixinColor);
+		}
+
+		const color1 = mixinColor.rgb();
+		const color2 = this.rgb();
+		const p = weight === undefined ? 0.5 : weight;
+
+		const w = 2 * p - 1;
+		const a = color1.alpha() - color2.alpha();
+
+		const w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2;
+		const w2 = 1 - w1;
+
+		return Color.rgb(
+			w1 * color1.red() + w2 * color2.red(),
+			w1 * color1.green() + w2 * color2.green(),
+			w1 * color1.blue() + w2 * color2.blue(),
+			color1.alpha() * p + color2.alpha() * (1 - p));
+	},
+};
+
+// Model conversion methods and static constructors
+for (const model of Object.keys(convert)) {
+	if (skippedModels.includes(model)) {
+		continue;
+	}
+
+	const {channels} = convert[model];
+
+	// Conversion methods
+	Color.prototype[model] = function (...args) {
+		if (this.model === model) {
+			return new Color(this);
+		}
+
+		if (args.length > 0) {
+			return new Color(args, model);
+		}
+
+		return new Color([...assertArray(convert[this.model][model].raw(this.color)), this.valpha], model);
+	};
+
+	// 'static' construction methods
+	Color[model] = function (...args) {
+		let color = args[0];
+		if (typeof color === 'number') {
+			color = zeroArray(args, channels);
+		}
+
+		return new Color(color, model);
+	};
+}
+
+function roundTo(number, places) {
+	return Number(number.toFixed(places));
+}
+
+function roundToPlace(places) {
+	return function (number) {
+		return roundTo(number, places);
+	};
+}
+
+function getset(model, channel, modifier) {
+	model = Array.isArray(model) ? model : [model];
+
+	for (const m of model) {
+		(limiters[m] || (limiters[m] = []))[channel] = modifier;
+	}
+
+	model = model[0];
+
+	return function (value) {
+		let result;
+
+		if (value !== undefined) {
+			if (modifier) {
+				value = modifier(value);
+			}
+
+			result = this[model]();
+			result.color[channel] = value;
+			return result;
+		}
+
+		result = this[model]().color[channel];
+		if (modifier) {
+			result = modifier(result);
+		}
+
+		return result;
+	};
+}
+
+function maxfn(max) {
+	return function (v) {
+		return Math.max(0, Math.min(max, v));
+	};
+}
+
+function assertArray(value) {
+	return Array.isArray(value) ? value : [value];
+}
+
+function zeroArray(array, length) {
+	for (let i = 0; i < length; i++) {
+		if (typeof array[i] !== 'number') {
+			array[i] = 0;
+		}
+	}
+
+	return array;
+}
+
+export default Color;
diff --git a/uni_modules/wu-ui-tools/libs/function/color/index.js b/uni_modules/wu-ui-tools/libs/function/color/index.js
new file mode 100644
index 0000000..fe6a1e4
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/index.js
@@ -0,0 +1,158 @@
+import Color from './color';
+
+/**
+ * 杞崲棰滆壊鏍煎紡銆�
+ * @param {Object} params - 鍙傛暟瀵硅薄銆�
+ * @param {string} color - 杈撳叆鐨勯鑹诧紝榛樿涓� '#fff'銆�
+ * @param {string} format - 闇�瑕佽浆鎹㈢殑鏍煎紡锛堟敮鎸� 'rgb', 'hex', 'hsl', 'hsv', 'hwb'锛夈��
+ * @param {string} type - 杞崲鍚庣殑绫诲瀷锛堟敮鎸� 'string', 'object', 'array', 'round'锛夈��
+ * @returns {string|Object|Array} 杞崲鍚庣殑棰滆壊琛ㄧず銆�
+ */
+function convertFormat(color = '#fff', format = 'rgb', type = 'string') {
+	let colorObj = Color(color);
+	// 濡傛灉鏍煎紡瀛樺湪
+	if (colorObj[format]) {
+		// hex 鏃犳硶鐩存帴杞崲涓� 闄tring绫诲瀷澶栫殑浠讳綍绫诲瀷
+		// 鎵�浠ヨ浆涓簉gb 鍚� 鑾峰彇鍏朵粬绫诲瀷
+		if(format == 'hex' && type != 'string') format = 'rgb';
+		// 绫诲瀷鍚嶇О
+		let typeName = '';
+		switch (type) {
+			case 'string':
+				typeName = 'toString';
+				break;
+			case 'object':
+				typeName = 'object';
+				break;
+			case 'array':
+				typeName = 'array';
+				break;
+			case 'round':
+				typeName = 'round';
+				break;
+			default:
+				throw Error('Unsupported target type:' + type)
+		}
+		return colorObj[format]()[typeName]();
+	} else {
+		throw Error('Unsupported target format: ' + format);
+	}
+}
+
+/**
+ * 璁$畻涓や釜棰滆壊涔嬮棿鐨勬笎鍙樺�笺��
+ * @param {string} startColor - 寮�濮嬬殑棰滆壊锛岄粯璁や负榛戣壊銆�
+ * @param {string} endColor - 缁撴潫鐨勯鑹诧紝榛樿涓虹櫧鑹层��
+ * @param {number} step - 娓愬彉鐨勬鏁帮紝榛樿涓�10銆�
+ * @returns {Array<string>} 涓や釜棰滆壊涔嬮棿鐨勬笎鍙橀鑹叉暟缁勩��
+ */
+function gradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {
+	const startRGB = convertFormat(startColor, 'rgb', 'array') // 杞崲涓簉gb鏁扮粍妯″紡
+	const startR = startRGB[0]
+	const startG = startRGB[1]
+	const startB = startRGB[2]
+
+	const endRGB = convertFormat(endColor, 'rgb', 'array')
+	const endR = endRGB[0]
+	const endG = endRGB[1]
+	const endB = endRGB[2]
+
+	const sR = (endR - startR) / step // 鎬诲樊鍊�
+	const sG = (endG - startG) / step
+	const sB = (endB - startB) / step
+	const colorArr = []
+	for (let i = 0; i < step; i++) {
+		// 璁$畻姣忎竴姝ョ殑hex鍊�
+		let hex = convertFormat(`rgb(${Math.round((sR * i + startR))},${Math.round((sG * i + startG))},${Math.round((sB
+			* i + startB))})`, 'hex')
+		// 纭繚绗竴涓鑹插�间负startColor鐨勫��
+		if (i === 0) hex = convertFormat(startColor, 'hex')
+		// 纭繚鏈�鍚庝竴涓鑹插�间负endColor鐨勫��
+		if (i === step - 1) hex = convertFormat(endColor, 'hex')
+		colorArr.push(hex)
+	}
+	return colorArr
+}
+
+
+
+export default {
+	/**
+	 * 鏍煎紡杞崲銆�
+	 */
+	convertFormat,
+
+	/**
+	 * 璁$畻涓や釜棰滆壊涔嬮棿鐨勬笎鍙樺�笺��
+	 */
+	gradient,
+
+	/**
+	 * 澧炲姞棰滆壊鐨勪寒搴︺��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @param {number} value - 澧炲姞鐨勪寒搴﹀�硷紙0-1锛夈��
+	 * @returns {string} 璋冩暣鍚庣殑棰滆壊銆�
+	 */
+	lighten: (color, value, format = 'rgb', type = 'string') => convertFormat(Color(color).lighten(value), format, type),
+
+	/**
+	 * 鍑忓皯棰滆壊鐨勪寒搴︺��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @param {number} value - 鍑忓皯鐨勪寒搴﹀�硷紙0-1锛夈��
+	 * @returns {string} 璋冩暣鍚庣殑棰滆壊銆�
+	 */
+	darken: (color, value, format = 'rgb', type = 'string') => convertFormat(Color(color).darken(value), format, type),
+
+	/**
+	 * 澧炲姞棰滆壊鐨勯ケ鍜屽害銆�
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @param {number} value - 澧炲姞鐨勯ケ鍜屽害鍊硷紙0-1锛夈��
+	 * @returns {string} 璋冩暣鍚庣殑棰滆壊銆�
+	 */
+	saturate: (color, value, format = 'rgb', type = 'string') => convertFormat(Color(color).saturate(value), format, type),
+
+	/**
+	 * 鍑忓皯棰滆壊鐨勯ケ鍜屽害銆�
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @param {number} value - 鍑忓皯鐨勯ケ鍜屽害鍊硷紙0-1锛夈��
+	 * @returns {string} 璋冩暣鍚庣殑棰滆壊銆�
+	 */
+	desaturate: (color, value, format = 'rgb', type = 'string') => convertFormat(Color(color).desaturate(value), format, type),
+
+	/**
+	 * 鏃嬭浆棰滆壊鐨勮壊鐩搞��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @param {number} degrees - 鏃嬭浆鐨勫害鏁般��
+	 * @returns {string} 璋冩暣鍚庣殑棰滆壊銆�
+	 */
+	rotate: (color, degrees, format = 'rgb', type = 'string') => convertFormat(Color(color).rotate(degrees), format, type),
+
+	/**
+	 * 璋冩暣棰滆壊鐨勯�忔槑搴︺��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @param {number} value - 閫忔槑搴﹀�硷紙0-1锛屽叾涓� 1 鏄笉閫忔槑锛夈��
+	 * @returns {string} 璋冩暣鍚庣殑棰滆壊銆�
+	 */
+	adjustAlpha: (color, value, format = 'rgb', type = 'string') => convertFormat(Color(color).alpha(value), format, type),
+
+	/**
+	 * 鑾峰彇棰滆壊鐨勪寒搴︺��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @returns {number} 棰滆壊鐨勪寒搴﹀�硷紙0-1锛夈��
+	 */
+	luminosity: (color, format) => Color(color).luminosity(),
+
+	/**
+	 * 鍒ゆ柇棰滆壊鏄惁涓烘殫鑹层��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @returns {boolean} 濡傛灉鏄殫鑹插垯杩斿洖 true锛屽惁鍒欒繑鍥� false銆�
+	 */
+	isDark: (color, format) => Color(color).isDark(),
+
+	/**
+	 * 鍒ゆ柇棰滆壊鏄惁涓轰寒鑹层��
+	 * @param {string} color - 杈撳叆鐨勯鑹层��
+	 * @returns {boolean} 濡傛灉鏄寒鑹插垯杩斿洖 true锛屽惁鍒欒繑鍥� false銆�
+	 */
+	isLight: (color, format) => Color(color).isLight()
+};
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/LICENSE b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/LICENSE
new file mode 100644
index 0000000..0a5f461
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 JD Ballard
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/README.md b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/README.md
new file mode 100644
index 0000000..7d36072
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/README.md
@@ -0,0 +1,16 @@
+# node-is-arrayish [![Travis-CI.org Build Status](https://img.shields.io/travis/Qix-/node-is-arrayish.svg?style=flat-square)](https://travis-ci.org/Qix-/node-is-arrayish) [![Coveralls.io Coverage Rating](https://img.shields.io/coveralls/Qix-/node-is-arrayish.svg?style=flat-square)](https://coveralls.io/r/Qix-/node-is-arrayish)
+> Determines if an object can be used like an Array
+
+## Example
+```javascript
+var isArrayish = require('is-arrayish');
+
+isArrayish([]); // true
+isArrayish({__proto__: []}); // true
+isArrayish({}); // false
+isArrayish({length:10}); // false
+```
+
+## License
+Licensed under the [MIT License](http://opensource.org/licenses/MIT).
+You can find a copy of it in [LICENSE](LICENSE).
diff --git a/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/index.js b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/index.js
new file mode 100644
index 0000000..18d3bbe
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/index.js
@@ -0,0 +1,9 @@
+export default function isArrayish(obj) {
+	if (!obj || typeof obj === 'string') {
+		return false;
+	}
+
+	return obj instanceof Array || Array.isArray(obj) ||
+		(obj.length >= 0 && (obj.splice instanceof Function ||
+			(Object.getOwnPropertyDescriptor(obj, (obj.length - 1)) && obj.constructor.name !== 'String')));
+};
diff --git a/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/package.json b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/package.json
new file mode 100644
index 0000000..8a54e33
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "is-arrayish",
+  "description": "Determines if an object can be used as an array",
+  "version": "0.3.2",
+  "author": "Qix (http://github.com/qix-)",
+  "keywords": [
+    "is",
+    "array",
+    "duck",
+    "type",
+    "arrayish",
+    "similar",
+    "proto",
+    "prototype",
+    "type"
+  ],
+  "license": "MIT",
+  "scripts": {
+    "test": "mocha --require coffeescript/register ./test/**/*.coffee",
+    "lint": "zeit-eslint --ext .jsx,.js .",
+    "lint-staged": "git diff --diff-filter=ACMRT --cached --name-only '*.js' '*.jsx' | xargs zeit-eslint"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/qix-/node-is-arrayish.git"
+  },
+  "devDependencies": {
+    "@zeit/eslint-config-node": "^0.3.0",
+    "@zeit/git-hooks": "^0.1.4",
+    "coffeescript": "^2.3.1",
+    "coveralls": "^3.0.1",
+    "eslint": "^4.19.1",
+    "istanbul": "^0.4.5",
+    "mocha": "^5.2.0",
+    "should": "^13.2.1"
+  },
+  "eslintConfig": {
+    "extends": [
+      "@zeit/eslint-config-node"
+    ]
+  },
+  "git": {
+    "pre-commit": "lint-staged"
+  }
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/yarn-error.log b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/yarn-error.log
new file mode 100644
index 0000000..d3dcf37
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/is-arrayish/yarn-error.log
@@ -0,0 +1,1443 @@
+Arguments: 
+  /Users/junon/n/bin/node /Users/junon/.yarn/bin/yarn.js test
+
+PATH: 
+  /Users/junon/.yarn/bin:/Users/junon/.config/yarn/global/node_modules/.bin:/Users/junon/perl5/bin:/Users/junon/google-cloud-sdk/bin:/usr/local/sbin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/junon/bin:/Users/junon/.local/bin:/src/.go/bin:/src/llvm/llvm/build/bin:/Users/junon/Library/Android/sdk/platform-tools:/Users/junon/n/bin:/usr/local/texlive/2017/bin/x86_64-darwin/
+
+Yarn version: 
+  1.5.1
+
+Node version: 
+  9.6.1
+
+Platform: 
+  darwin x64
+
+npm manifest: 
+  {
+    "name": "is-arrayish",
+    "description": "Determines if an object can be used as an array",
+    "version": "0.3.1",
+    "author": "Qix (http://github.com/qix-)",
+    "keywords": [
+      "is",
+      "array",
+      "duck",
+      "type",
+      "arrayish",
+      "similar",
+      "proto",
+      "prototype",
+      "type"
+    ],
+    "license": "MIT",
+    "scripts": {
+      "test": "mocha --require coffeescript/register",
+      "lint": "zeit-eslint --ext .jsx,.js .",
+      "lint-staged": "git diff --diff-filter=ACMRT --cached --name-only '*.js' '*.jsx' | xargs zeit-eslint"
+    },
+    "repository": {
+      "type": "git",
+      "url": "https://github.com/qix-/node-is-arrayish.git"
+    },
+    "devDependencies": {
+      "@zeit/eslint-config-node": "^0.3.0",
+      "@zeit/git-hooks": "^0.1.4",
+      "coffeescript": "^2.3.1",
+      "coveralls": "^3.0.1",
+      "eslint": "^4.19.1",
+      "istanbul": "^0.4.5",
+      "mocha": "^5.2.0",
+      "should": "^13.2.1"
+    },
+    "eslintConfig": {
+      "extends": [
+        "@zeit/eslint-config-node"
+      ]
+    },
+    "git": {
+      "pre-commit": "lint-staged"
+    }
+  }
+
+yarn manifest: 
+  No manifest
+
+Lockfile: 
+  # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+  # yarn lockfile v1
+  
+  
+  "@zeit/eslint-config-base@0.3.0":
+    version "0.3.0"
+    resolved "https://registry.yarnpkg.com/@zeit/eslint-config-base/-/eslint-config-base-0.3.0.tgz#32a58c3e52eca4025604758cb4591f3d28e22fb4"
+    dependencies:
+      arg "^1.0.0"
+      chalk "^2.3.0"
+  
+  "@zeit/eslint-config-node@^0.3.0":
+    version "0.3.0"
+    resolved "https://registry.yarnpkg.com/@zeit/eslint-config-node/-/eslint-config-node-0.3.0.tgz#6e328328f366f66c2a0549a69131bbcd9735f098"
+    dependencies:
+      "@zeit/eslint-config-base" "0.3.0"
+  
+  "@zeit/git-hooks@^0.1.4":
+    version "0.1.4"
+    resolved "https://registry.yarnpkg.com/@zeit/git-hooks/-/git-hooks-0.1.4.tgz#70583db5dd69726a62c7963520e67f2c3a33cc5f"
+  
+  abbrev@1:
+    version "1.1.1"
+    resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+  
+  abbrev@1.0.x:
+    version "1.0.9"
+    resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+  
+  acorn-jsx@^3.0.0:
+    version "3.0.1"
+    resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+    dependencies:
+      acorn "^3.0.4"
+  
+  acorn@^3.0.4:
+    version "3.3.0"
+    resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+  
+  acorn@^5.5.0:
+    version "5.7.1"
+    resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+  
+  ajv-keywords@^2.1.0:
+    version "2.1.1"
+    resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+  
+  ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0:
+    version "5.5.2"
+    resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+    dependencies:
+      co "^4.6.0"
+      fast-deep-equal "^1.0.0"
+      fast-json-stable-stringify "^2.0.0"
+      json-schema-traverse "^0.3.0"
+  
+  align-text@^0.1.1, align-text@^0.1.3:
+    version "0.1.4"
+    resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+    dependencies:
+      kind-of "^3.0.2"
+      longest "^1.0.1"
+      repeat-string "^1.5.2"
+  
+  amdefine@>=0.0.4:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+  
+  ansi-escapes@^3.0.0:
+    version "3.1.0"
+    resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+  
+  ansi-regex@^2.0.0:
+    version "2.1.1"
+    resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  
+  ansi-regex@^3.0.0:
+    version "3.0.0"
+    resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+  
+  ansi-styles@^2.2.1:
+    version "2.2.1"
+    resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  
+  ansi-styles@^3.2.1:
+    version "3.2.1"
+    resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+    dependencies:
+      color-convert "^1.9.0"
+  
+  arg@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/arg/-/arg-1.0.1.tgz#892a26d841bd5a64880bbc8f73dd64a705910ca3"
+  
+  argparse@^1.0.7:
+    version "1.0.10"
+    resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+    dependencies:
+      sprintf-js "~1.0.2"
+  
+  array-union@^1.0.1:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+    dependencies:
+      array-uniq "^1.0.1"
+  
+  array-uniq@^1.0.1:
+    version "1.0.3"
+    resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  
+  arrify@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+  
+  asn1@~0.2.3:
+    version "0.2.3"
+    resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86"
+  
+  assert-plus@1.0.0, assert-plus@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+  
+  async@1.x, async@^1.4.0:
+    version "1.5.2"
+    resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+  
+  asynckit@^0.4.0:
+    version "0.4.0"
+    resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  
+  aws-sign2@~0.7.0:
+    version "0.7.0"
+    resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+  
+  aws4@^1.6.0:
+    version "1.7.0"
+    resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289"
+  
+  babel-code-frame@^6.22.0:
+    version "6.26.0"
+    resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+    dependencies:
+      chalk "^1.1.3"
+      esutils "^2.0.2"
+      js-tokens "^3.0.2"
+  
+  balanced-match@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+  
+  bcrypt-pbkdf@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d"
+    dependencies:
+      tweetnacl "^0.14.3"
+  
+  brace-expansion@^1.1.7:
+    version "1.1.11"
+    resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+    dependencies:
+      balanced-match "^1.0.0"
+      concat-map "0.0.1"
+  
+  browser-stdout@1.3.1:
+    version "1.3.1"
+    resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+  
+  buffer-from@^1.0.0:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+  
+  caller-path@^0.1.0:
+    version "0.1.0"
+    resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+    dependencies:
+      callsites "^0.2.0"
+  
+  callsites@^0.2.0:
+    version "0.2.0"
+    resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+  
+  camelcase@^1.0.2:
+    version "1.2.1"
+    resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+  
+  caseless@~0.12.0:
+    version "0.12.0"
+    resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+  
+  center-align@^0.1.1:
+    version "0.1.3"
+    resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+    dependencies:
+      align-text "^0.1.3"
+      lazy-cache "^1.0.3"
+  
+  chalk@^1.1.3:
+    version "1.1.3"
+    resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+    dependencies:
+      ansi-styles "^2.2.1"
+      escape-string-regexp "^1.0.2"
+      has-ansi "^2.0.0"
+      strip-ansi "^3.0.0"
+      supports-color "^2.0.0"
+  
+  chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0:
+    version "2.4.1"
+    resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+    dependencies:
+      ansi-styles "^3.2.1"
+      escape-string-regexp "^1.0.5"
+      supports-color "^5.3.0"
+  
+  chardet@^0.4.0:
+    version "0.4.2"
+    resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+  
+  circular-json@^0.3.1:
+    version "0.3.3"
+    resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+  
+  cli-cursor@^2.1.0:
+    version "2.1.0"
+    resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+    dependencies:
+      restore-cursor "^2.0.0"
+  
+  cli-width@^2.0.0:
+    version "2.2.0"
+    resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+  
+  cliui@^2.1.0:
+    version "2.1.0"
+    resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+    dependencies:
+      center-align "^0.1.1"
+      right-align "^0.1.1"
+      wordwrap "0.0.2"
+  
+  co@^4.6.0:
+    version "4.6.0"
+    resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+  
+  coffeescript@^2.3.1:
+    version "2.3.1"
+    resolved "https://registry.yarnpkg.com/coffeescript/-/coffeescript-2.3.1.tgz#a25f69c251d25805c9842e57fc94bfc453ef6aed"
+  
+  color-convert@^1.9.0:
+    version "1.9.2"
+    resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+    dependencies:
+      color-name "1.1.1"
+  
+  color-name@1.1.1:
+    version "1.1.1"
+    resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+  
+  combined-stream@1.0.6, combined-stream@~1.0.5:
+    version "1.0.6"
+    resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+    dependencies:
+      delayed-stream "~1.0.0"
+  
+  commander@2.15.1:
+    version "2.15.1"
+    resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+  
+  concat-map@0.0.1:
+    version "0.0.1"
+    resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  
+  concat-stream@^1.6.0:
+    version "1.6.2"
+    resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+    dependencies:
+      buffer-from "^1.0.0"
+      inherits "^2.0.3"
+      readable-stream "^2.2.2"
+      typedarray "^0.0.6"
+  
+  core-util-is@1.0.2, core-util-is@~1.0.0:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+  
+  coveralls@^3.0.1:
+    version "3.0.1"
+    resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.1.tgz#12e15914eaa29204e56869a5ece7b9e1492d2ae2"
+    dependencies:
+      js-yaml "^3.6.1"
+      lcov-parse "^0.0.10"
+      log-driver "^1.2.5"
+      minimist "^1.2.0"
+      request "^2.79.0"
+  
+  cross-spawn@^5.1.0:
+    version "5.1.0"
+    resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+    dependencies:
+      lru-cache "^4.0.1"
+      shebang-command "^1.2.0"
+      which "^1.2.9"
+  
+  dashdash@^1.12.0:
+    version "1.14.1"
+    resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+    dependencies:
+      assert-plus "^1.0.0"
+  
+  debug@3.1.0, debug@^3.1.0:
+    version "3.1.0"
+    resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+    dependencies:
+      ms "2.0.0"
+  
+  decamelize@^1.0.0:
+    version "1.2.0"
+    resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+  
+  deep-is@~0.1.3:
+    version "0.1.3"
+    resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+  
+  del@^2.0.2:
+    version "2.2.2"
+    resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+    dependencies:
+      globby "^5.0.0"
+      is-path-cwd "^1.0.0"
+      is-path-in-cwd "^1.0.0"
+      object-assign "^4.0.1"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+      rimraf "^2.2.8"
+  
+  delayed-stream@~1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  
+  diff@3.5.0:
+    version "3.5.0"
+    resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+  
+  doctrine@^2.1.0:
+    version "2.1.0"
+    resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+    dependencies:
+      esutils "^2.0.2"
+  
+  ecc-jsbn@~0.1.1:
+    version "0.1.1"
+    resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505"
+    dependencies:
+      jsbn "~0.1.0"
+  
+  escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+    version "1.0.5"
+    resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  
+  escodegen@1.8.x:
+    version "1.8.1"
+    resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
+    dependencies:
+      esprima "^2.7.1"
+      estraverse "^1.9.1"
+      esutils "^2.0.2"
+      optionator "^0.8.1"
+    optionalDependencies:
+      source-map "~0.2.0"
+  
+  eslint-scope@^3.7.1:
+    version "3.7.1"
+    resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+    dependencies:
+      esrecurse "^4.1.0"
+      estraverse "^4.1.1"
+  
+  eslint-visitor-keys@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d"
+  
+  eslint@^4.19.1:
+    version "4.19.1"
+    resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300"
+    dependencies:
+      ajv "^5.3.0"
+      babel-code-frame "^6.22.0"
+      chalk "^2.1.0"
+      concat-stream "^1.6.0"
+      cross-spawn "^5.1.0"
+      debug "^3.1.0"
+      doctrine "^2.1.0"
+      eslint-scope "^3.7.1"
+      eslint-visitor-keys "^1.0.0"
+      espree "^3.5.4"
+      esquery "^1.0.0"
+      esutils "^2.0.2"
+      file-entry-cache "^2.0.0"
+      functional-red-black-tree "^1.0.1"
+      glob "^7.1.2"
+      globals "^11.0.1"
+      ignore "^3.3.3"
+      imurmurhash "^0.1.4"
+      inquirer "^3.0.6"
+      is-resolvable "^1.0.0"
+      js-yaml "^3.9.1"
+      json-stable-stringify-without-jsonify "^1.0.1"
+      levn "^0.3.0"
+      lodash "^4.17.4"
+      minimatch "^3.0.2"
+      mkdirp "^0.5.1"
+      natural-compare "^1.4.0"
+      optionator "^0.8.2"
+      path-is-inside "^1.0.2"
+      pluralize "^7.0.0"
+      progress "^2.0.0"
+      regexpp "^1.0.1"
+      require-uncached "^1.0.3"
+      semver "^5.3.0"
+      strip-ansi "^4.0.0"
+      strip-json-comments "~2.0.1"
+      table "4.0.2"
+      text-table "~0.2.0"
+  
+  espree@^3.5.4:
+    version "3.5.4"
+    resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+    dependencies:
+      acorn "^5.5.0"
+      acorn-jsx "^3.0.0"
+  
+  esprima@2.7.x, esprima@^2.7.1:
+    version "2.7.3"
+    resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+  
+  esprima@^4.0.0:
+    version "4.0.0"
+    resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804"
+  
+  esquery@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+    dependencies:
+      estraverse "^4.0.0"
+  
+  esrecurse@^4.1.0:
+    version "4.2.1"
+    resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+    dependencies:
+      estraverse "^4.1.0"
+  
+  estraverse@^1.9.1:
+    version "1.9.3"
+    resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
+  
+  estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1:
+    version "4.2.0"
+    resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+  
+  esutils@^2.0.2:
+    version "2.0.2"
+    resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+  
+  extend@~3.0.1:
+    version "3.0.1"
+    resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444"
+  
+  external-editor@^2.0.4:
+    version "2.2.0"
+    resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+    dependencies:
+      chardet "^0.4.0"
+      iconv-lite "^0.4.17"
+      tmp "^0.0.33"
+  
+  extsprintf@1.3.0:
+    version "1.3.0"
+    resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+  
+  extsprintf@^1.2.0:
+    version "1.4.0"
+    resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+  
+  fast-deep-equal@^1.0.0:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+  
+  fast-json-stable-stringify@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+  
+  fast-levenshtein@~2.0.4:
+    version "2.0.6"
+    resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+  
+  figures@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+    dependencies:
+      escape-string-regexp "^1.0.5"
+  
+  file-entry-cache@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+    dependencies:
+      flat-cache "^1.2.1"
+      object-assign "^4.0.1"
+  
+  flat-cache@^1.2.1:
+    version "1.3.0"
+    resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+    dependencies:
+      circular-json "^0.3.1"
+      del "^2.0.2"
+      graceful-fs "^4.1.2"
+      write "^0.2.1"
+  
+  forever-agent@~0.6.1:
+    version "0.6.1"
+    resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+  
+  form-data@~2.3.1:
+    version "2.3.2"
+    resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+    dependencies:
+      asynckit "^0.4.0"
+      combined-stream "1.0.6"
+      mime-types "^2.1.12"
+  
+  fs.realpath@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  
+  functional-red-black-tree@^1.0.1:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+  
+  getpass@^0.1.1:
+    version "0.1.7"
+    resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+    dependencies:
+      assert-plus "^1.0.0"
+  
+  glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2:
+    version "7.1.2"
+    resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+    dependencies:
+      fs.realpath "^1.0.0"
+      inflight "^1.0.4"
+      inherits "2"
+      minimatch "^3.0.4"
+      once "^1.3.0"
+      path-is-absolute "^1.0.0"
+  
+  glob@^5.0.15:
+    version "5.0.15"
+    resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
+    dependencies:
+      inflight "^1.0.4"
+      inherits "2"
+      minimatch "2 || 3"
+      once "^1.3.0"
+      path-is-absolute "^1.0.0"
+  
+  globals@^11.0.1:
+    version "11.5.0"
+    resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642"
+  
+  globby@^5.0.0:
+    version "5.0.0"
+    resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+    dependencies:
+      array-union "^1.0.1"
+      arrify "^1.0.0"
+      glob "^7.0.3"
+      object-assign "^4.0.1"
+      pify "^2.0.0"
+      pinkie-promise "^2.0.0"
+  
+  graceful-fs@^4.1.2:
+    version "4.1.11"
+    resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+  
+  growl@1.10.5:
+    version "1.10.5"
+    resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+  
+  handlebars@^4.0.1:
+    version "4.0.11"
+    resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc"
+    dependencies:
+      async "^1.4.0"
+      optimist "^0.6.1"
+      source-map "^0.4.4"
+    optionalDependencies:
+      uglify-js "^2.6"
+  
+  har-schema@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+  
+  har-validator@~5.0.3:
+    version "5.0.3"
+    resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd"
+    dependencies:
+      ajv "^5.1.0"
+      har-schema "^2.0.0"
+  
+  has-ansi@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+    dependencies:
+      ansi-regex "^2.0.0"
+  
+  has-flag@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+  
+  has-flag@^3.0.0:
+    version "3.0.0"
+    resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  
+  he@1.1.1:
+    version "1.1.1"
+    resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+  
+  http-signature@~1.2.0:
+    version "1.2.0"
+    resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+    dependencies:
+      assert-plus "^1.0.0"
+      jsprim "^1.2.2"
+      sshpk "^1.7.0"
+  
+  iconv-lite@^0.4.17:
+    version "0.4.23"
+    resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+    dependencies:
+      safer-buffer ">= 2.1.2 < 3"
+  
+  ignore@^3.3.3:
+    version "3.3.8"
+    resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b"
+  
+  imurmurhash@^0.1.4:
+    version "0.1.4"
+    resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  
+  inflight@^1.0.4:
+    version "1.0.6"
+    resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+    dependencies:
+      once "^1.3.0"
+      wrappy "1"
+  
+  inherits@2, inherits@^2.0.3, inherits@~2.0.3:
+    version "2.0.3"
+    resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  
+  inquirer@^3.0.6:
+    version "3.3.0"
+    resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+    dependencies:
+      ansi-escapes "^3.0.0"
+      chalk "^2.0.0"
+      cli-cursor "^2.1.0"
+      cli-width "^2.0.0"
+      external-editor "^2.0.4"
+      figures "^2.0.0"
+      lodash "^4.3.0"
+      mute-stream "0.0.7"
+      run-async "^2.2.0"
+      rx-lite "^4.0.8"
+      rx-lite-aggregates "^4.0.8"
+      string-width "^2.1.0"
+      strip-ansi "^4.0.0"
+      through "^2.3.6"
+  
+  is-buffer@^1.1.5:
+    version "1.1.6"
+    resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+  
+  is-fullwidth-code-point@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+  
+  is-path-cwd@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+  
+  is-path-in-cwd@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
+    dependencies:
+      is-path-inside "^1.0.0"
+  
+  is-path-inside@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+    dependencies:
+      path-is-inside "^1.0.1"
+  
+  is-promise@^2.1.0:
+    version "2.1.0"
+    resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+  
+  is-resolvable@^1.0.0:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+  
+  is-typedarray@~1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+  
+  isarray@~1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  
+  isexe@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  
+  isstream@~0.1.2:
+    version "0.1.2"
+    resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+  
+  istanbul@^0.4.5:
+    version "0.4.5"
+    resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
+    dependencies:
+      abbrev "1.0.x"
+      async "1.x"
+      escodegen "1.8.x"
+      esprima "2.7.x"
+      glob "^5.0.15"
+      handlebars "^4.0.1"
+      js-yaml "3.x"
+      mkdirp "0.5.x"
+      nopt "3.x"
+      once "1.x"
+      resolve "1.1.x"
+      supports-color "^3.1.0"
+      which "^1.1.1"
+      wordwrap "^1.0.0"
+  
+  js-tokens@^3.0.2:
+    version "3.0.2"
+    resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+  
+  js-yaml@3.x, js-yaml@^3.6.1, js-yaml@^3.9.1:
+    version "3.12.0"
+    resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+    dependencies:
+      argparse "^1.0.7"
+      esprima "^4.0.0"
+  
+  jsbn@~0.1.0:
+    version "0.1.1"
+    resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+  
+  json-schema-traverse@^0.3.0:
+    version "0.3.1"
+    resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+  
+  json-schema@0.2.3:
+    version "0.2.3"
+    resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+  
+  json-stable-stringify-without-jsonify@^1.0.1:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+  
+  json-stringify-safe@~5.0.1:
+    version "5.0.1"
+    resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  
+  jsprim@^1.2.2:
+    version "1.4.1"
+    resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+    dependencies:
+      assert-plus "1.0.0"
+      extsprintf "1.3.0"
+      json-schema "0.2.3"
+      verror "1.10.0"
+  
+  kind-of@^3.0.2:
+    version "3.2.2"
+    resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+    dependencies:
+      is-buffer "^1.1.5"
+  
+  lazy-cache@^1.0.3:
+    version "1.0.4"
+    resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+  
+  lcov-parse@^0.0.10:
+    version "0.0.10"
+    resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3"
+  
+  levn@^0.3.0, levn@~0.3.0:
+    version "0.3.0"
+    resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+    dependencies:
+      prelude-ls "~1.1.2"
+      type-check "~0.3.2"
+  
+  lodash@^4.17.4, lodash@^4.3.0:
+    version "4.17.10"
+    resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+  
+  log-driver@^1.2.5:
+    version "1.2.7"
+    resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
+  
+  longest@^1.0.1:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+  
+  lru-cache@^4.0.1:
+    version "4.1.3"
+    resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+    dependencies:
+      pseudomap "^1.0.2"
+      yallist "^2.1.2"
+  
+  mime-db@~1.33.0:
+    version "1.33.0"
+    resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db"
+  
+  mime-types@^2.1.12, mime-types@~2.1.17:
+    version "2.1.18"
+    resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8"
+    dependencies:
+      mime-db "~1.33.0"
+  
+  mimic-fn@^1.0.0:
+    version "1.2.0"
+    resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+  
+  "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4:
+    version "3.0.4"
+    resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+    dependencies:
+      brace-expansion "^1.1.7"
+  
+  minimist@0.0.8:
+    version "0.0.8"
+    resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+  
+  minimist@^1.2.0:
+    version "1.2.0"
+    resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+  
+  minimist@~0.0.1:
+    version "0.0.10"
+    resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+  
+  mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.1:
+    version "0.5.1"
+    resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+    dependencies:
+      minimist "0.0.8"
+  
+  mocha@^5.2.0:
+    version "5.2.0"
+    resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
+    dependencies:
+      browser-stdout "1.3.1"
+      commander "2.15.1"
+      debug "3.1.0"
+      diff "3.5.0"
+      escape-string-regexp "1.0.5"
+      glob "7.1.2"
+      growl "1.10.5"
+      he "1.1.1"
+      minimatch "3.0.4"
+      mkdirp "0.5.1"
+      supports-color "5.4.0"
+  
+  ms@2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  
+  mute-stream@0.0.7:
+    version "0.0.7"
+    resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+  
+  natural-compare@^1.4.0:
+    version "1.4.0"
+    resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  
+  nopt@3.x:
+    version "3.0.6"
+    resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+    dependencies:
+      abbrev "1"
+  
+  oauth-sign@~0.8.2:
+    version "0.8.2"
+    resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
+  
+  object-assign@^4.0.1:
+    version "4.1.1"
+    resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  
+  once@1.x, once@^1.3.0:
+    version "1.4.0"
+    resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+    dependencies:
+      wrappy "1"
+  
+  onetime@^2.0.0:
+    version "2.0.1"
+    resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+    dependencies:
+      mimic-fn "^1.0.0"
+  
+  optimist@^0.6.1:
+    version "0.6.1"
+    resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+    dependencies:
+      minimist "~0.0.1"
+      wordwrap "~0.0.2"
+  
+  optionator@^0.8.1, optionator@^0.8.2:
+    version "0.8.2"
+    resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+    dependencies:
+      deep-is "~0.1.3"
+      fast-levenshtein "~2.0.4"
+      levn "~0.3.0"
+      prelude-ls "~1.1.2"
+      type-check "~0.3.2"
+      wordwrap "~1.0.0"
+  
+  os-tmpdir@~1.0.2:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+  
+  path-is-absolute@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  
+  path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+  
+  performance-now@^2.1.0:
+    version "2.1.0"
+    resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+  
+  pify@^2.0.0:
+    version "2.3.0"
+    resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  
+  pinkie-promise@^2.0.0:
+    version "2.0.1"
+    resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+    dependencies:
+      pinkie "^2.0.0"
+  
+  pinkie@^2.0.0:
+    version "2.0.4"
+    resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+  
+  pluralize@^7.0.0:
+    version "7.0.0"
+    resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+  
+  prelude-ls@~1.1.2:
+    version "1.1.2"
+    resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+  
+  process-nextick-args@~2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+  
+  progress@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+  
+  pseudomap@^1.0.2:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+  
+  punycode@^1.4.1:
+    version "1.4.1"
+    resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+  
+  qs@~6.5.1:
+    version "6.5.2"
+    resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+  
+  readable-stream@^2.2.2:
+    version "2.3.6"
+    resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+    dependencies:
+      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"
+  
+  regexpp@^1.0.1:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab"
+  
+  repeat-string@^1.5.2:
+    version "1.6.1"
+    resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+  
+  request@^2.79.0:
+    version "2.87.0"
+    resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e"
+    dependencies:
+      aws-sign2 "~0.7.0"
+      aws4 "^1.6.0"
+      caseless "~0.12.0"
+      combined-stream "~1.0.5"
+      extend "~3.0.1"
+      forever-agent "~0.6.1"
+      form-data "~2.3.1"
+      har-validator "~5.0.3"
+      http-signature "~1.2.0"
+      is-typedarray "~1.0.0"
+      isstream "~0.1.2"
+      json-stringify-safe "~5.0.1"
+      mime-types "~2.1.17"
+      oauth-sign "~0.8.2"
+      performance-now "^2.1.0"
+      qs "~6.5.1"
+      safe-buffer "^5.1.1"
+      tough-cookie "~2.3.3"
+      tunnel-agent "^0.6.0"
+      uuid "^3.1.0"
+  
+  require-uncached@^1.0.3:
+    version "1.0.3"
+    resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+    dependencies:
+      caller-path "^0.1.0"
+      resolve-from "^1.0.0"
+  
+  resolve-from@^1.0.0:
+    version "1.0.1"
+    resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+  
+  resolve@1.1.x:
+    version "1.1.7"
+    resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+  
+  restore-cursor@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+    dependencies:
+      onetime "^2.0.0"
+      signal-exit "^3.0.2"
+  
+  right-align@^0.1.1:
+    version "0.1.3"
+    resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+    dependencies:
+      align-text "^0.1.1"
+  
+  rimraf@^2.2.8:
+    version "2.6.2"
+    resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+    dependencies:
+      glob "^7.0.5"
+  
+  run-async@^2.2.0:
+    version "2.3.0"
+    resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+    dependencies:
+      is-promise "^2.1.0"
+  
+  rx-lite-aggregates@^4.0.8:
+    version "4.0.8"
+    resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+    dependencies:
+      rx-lite "*"
+  
+  rx-lite@*, rx-lite@^4.0.8:
+    version "4.0.8"
+    resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+  
+  safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+    version "5.1.2"
+    resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  
+  "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2:
+    version "2.1.2"
+    resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+  
+  semver@^5.3.0:
+    version "5.5.0"
+    resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+  
+  shebang-command@^1.2.0:
+    version "1.2.0"
+    resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+    dependencies:
+      shebang-regex "^1.0.0"
+  
+  shebang-regex@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+  
+  should-equal@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-2.0.0.tgz#6072cf83047360867e68e98b09d71143d04ee0c3"
+    dependencies:
+      should-type "^1.4.0"
+  
+  should-format@^3.0.3:
+    version "3.0.3"
+    resolved "https://registry.yarnpkg.com/should-format/-/should-format-3.0.3.tgz#9bfc8f74fa39205c53d38c34d717303e277124f1"
+    dependencies:
+      should-type "^1.3.0"
+      should-type-adaptors "^1.0.1"
+  
+  should-type-adaptors@^1.0.1:
+    version "1.1.0"
+    resolved "https://registry.yarnpkg.com/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz#401e7f33b5533033944d5cd8bf2b65027792e27a"
+    dependencies:
+      should-type "^1.3.0"
+      should-util "^1.0.0"
+  
+  should-type@^1.3.0, should-type@^1.4.0:
+    version "1.4.0"
+    resolved "https://registry.yarnpkg.com/should-type/-/should-type-1.4.0.tgz#0756d8ce846dfd09843a6947719dfa0d4cff5cf3"
+  
+  should-util@^1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/should-util/-/should-util-1.0.0.tgz#c98cda374aa6b190df8ba87c9889c2b4db620063"
+  
+  should@^13.2.1:
+    version "13.2.1"
+    resolved "https://registry.yarnpkg.com/should/-/should-13.2.1.tgz#84e6ebfbb145c79e0ae42307b25b3f62dcaf574e"
+    dependencies:
+      should-equal "^2.0.0"
+      should-format "^3.0.3"
+      should-type "^1.4.0"
+      should-type-adaptors "^1.0.1"
+      should-util "^1.0.0"
+  
+  signal-exit@^3.0.2:
+    version "3.0.2"
+    resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+  
+  slice-ansi@1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+    dependencies:
+      is-fullwidth-code-point "^2.0.0"
+  
+  source-map@^0.4.4:
+    version "0.4.4"
+    resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
+    dependencies:
+      amdefine ">=0.0.4"
+  
+  source-map@~0.2.0:
+    version "0.2.0"
+    resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
+    dependencies:
+      amdefine ">=0.0.4"
+  
+  source-map@~0.5.1:
+    version "0.5.7"
+    resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  
+  sprintf-js@~1.0.2:
+    version "1.0.3"
+    resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  
+  sshpk@^1.7.0:
+    version "1.14.2"
+    resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+    dependencies:
+      asn1 "~0.2.3"
+      assert-plus "^1.0.0"
+      dashdash "^1.12.0"
+      getpass "^0.1.1"
+      safer-buffer "^2.0.2"
+    optionalDependencies:
+      bcrypt-pbkdf "^1.0.0"
+      ecc-jsbn "~0.1.1"
+      jsbn "~0.1.0"
+      tweetnacl "~0.14.0"
+  
+  string-width@^2.1.0, string-width@^2.1.1:
+    version "2.1.1"
+    resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+    dependencies:
+      is-fullwidth-code-point "^2.0.0"
+      strip-ansi "^4.0.0"
+  
+  string_decoder@~1.1.1:
+    version "1.1.1"
+    resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+    dependencies:
+      safe-buffer "~5.1.0"
+  
+  strip-ansi@^3.0.0:
+    version "3.0.1"
+    resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+    dependencies:
+      ansi-regex "^2.0.0"
+  
+  strip-ansi@^4.0.0:
+    version "4.0.0"
+    resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+    dependencies:
+      ansi-regex "^3.0.0"
+  
+  strip-json-comments@~2.0.1:
+    version "2.0.1"
+    resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+  
+  supports-color@5.4.0, supports-color@^5.3.0:
+    version "5.4.0"
+    resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+    dependencies:
+      has-flag "^3.0.0"
+  
+  supports-color@^2.0.0:
+    version "2.0.0"
+    resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  
+  supports-color@^3.1.0:
+    version "3.2.3"
+    resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+    dependencies:
+      has-flag "^1.0.0"
+  
+  table@4.0.2:
+    version "4.0.2"
+    resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36"
+    dependencies:
+      ajv "^5.2.3"
+      ajv-keywords "^2.1.0"
+      chalk "^2.1.0"
+      lodash "^4.17.4"
+      slice-ansi "1.0.0"
+      string-width "^2.1.1"
+  
+  text-table@~0.2.0:
+    version "0.2.0"
+    resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  
+  through@^2.3.6:
+    version "2.3.8"
+    resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  
+  tmp@^0.0.33:
+    version "0.0.33"
+    resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+    dependencies:
+      os-tmpdir "~1.0.2"
+  
+  tough-cookie@~2.3.3:
+    version "2.3.4"
+    resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655"
+    dependencies:
+      punycode "^1.4.1"
+  
+  tunnel-agent@^0.6.0:
+    version "0.6.0"
+    resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+    dependencies:
+      safe-buffer "^5.0.1"
+  
+  tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+    version "0.14.5"
+    resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+  
+  type-check@~0.3.2:
+    version "0.3.2"
+    resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+    dependencies:
+      prelude-ls "~1.1.2"
+  
+  typedarray@^0.0.6:
+    version "0.0.6"
+    resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+  
+  uglify-js@^2.6:
+    version "2.8.29"
+    resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+    dependencies:
+      source-map "~0.5.1"
+      yargs "~3.10.0"
+    optionalDependencies:
+      uglify-to-browserify "~1.0.0"
+  
+  uglify-to-browserify@~1.0.0:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+  
+  util-deprecate@~1.0.1:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  
+  uuid@^3.1.0:
+    version "3.2.1"
+    resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+  
+  verror@1.10.0:
+    version "1.10.0"
+    resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+    dependencies:
+      assert-plus "^1.0.0"
+      core-util-is "1.0.2"
+      extsprintf "^1.2.0"
+  
+  which@^1.1.1, which@^1.2.9:
+    version "1.3.1"
+    resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+    dependencies:
+      isexe "^2.0.0"
+  
+  window-size@0.1.0:
+    version "0.1.0"
+    resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+  
+  wordwrap@0.0.2:
+    version "0.0.2"
+    resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+  
+  wordwrap@^1.0.0, wordwrap@~1.0.0:
+    version "1.0.0"
+    resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+  
+  wordwrap@~0.0.2:
+    version "0.0.3"
+    resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+  
+  wrappy@1:
+    version "1.0.2"
+    resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  
+  write@^0.2.1:
+    version "0.2.1"
+    resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+    dependencies:
+      mkdirp "^0.5.1"
+  
+  yallist@^2.1.2:
+    version "2.1.2"
+    resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+  
+  yargs@~3.10.0:
+    version "3.10.0"
+    resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+    dependencies:
+      camelcase "^1.0.2"
+      cliui "^2.1.0"
+      decamelize "^1.0.0"
+      window-size "0.1.0"
+
+Trace: 
+  Error: Command failed.
+  Exit code: 1
+  Command: sh
+  Arguments: -c mocha --require coffeescript/register
+  Directory: /src/qix-/node-is-arrayish
+  Output:
+  
+      at ProcessTermError.MessageError (/Users/junon/.yarn/lib/cli.js:186:110)
+      at new ProcessTermError (/Users/junon/.yarn/lib/cli.js:226:113)
+      at ChildProcess.<anonymous> (/Users/junon/.yarn/lib/cli.js:30281:17)
+      at ChildProcess.emit (events.js:127:13)
+      at maybeClose (internal/child_process.js:933:16)
+      at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5)
diff --git a/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/LICENSE b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/LICENSE
new file mode 100644
index 0000000..1b77e5b
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Josh Junon
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/README.md b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/README.md
new file mode 100644
index 0000000..7624577
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/README.md
@@ -0,0 +1,39 @@
+# simple-swizzle [![Travis-CI.org Build Status](https://img.shields.io/travis/Qix-/node-simple-swizzle.svg?style=flat-square)](https://travis-ci.org/Qix-/node-simple-swizzle) [![Coveralls.io Coverage Rating](https://img.shields.io/coveralls/Qix-/node-simple-swizzle.svg?style=flat-square)](https://coveralls.io/r/Qix-/node-simple-swizzle)
+
+> [Swizzle](https://en.wikipedia.org/wiki/Swizzling_(computer_graphics)) your function arguments; pass in mixed arrays/values and get a clean array
+
+## Usage
+
+```js
+var swizzle = require('simple-swizzle');
+
+function myFunc() {
+	var args = swizzle(arguments);
+	// ...
+	return args;
+}
+
+myFunc(1, [2, 3], 4); // [1, 2, 3, 4]
+myFunc(1, 2, 3, 4);   // [1, 2, 3, 4]
+myFunc([1, 2, 3, 4]); // [1, 2, 3, 4]
+```
+
+Functions can also be wrapped to automatically swizzle arguments and be passed
+the resulting array.
+
+```js
+var swizzle = require('simple-swizzle');
+
+var swizzledFn = swizzle.wrap(function (args) {
+	// ...
+	return args;
+});
+
+swizzledFn(1, [2, 3], 4); // [1, 2, 3, 4]
+swizzledFn(1, 2, 3, 4);   // [1, 2, 3, 4]
+swizzledFn([1, 2, 3, 4]); // [1, 2, 3, 4]
+```
+
+## License
+Licensed under the [MIT License](http://opensource.org/licenses/MIT).
+You can find a copy of it in [LICENSE](LICENSE).
diff --git a/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/index.js b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/index.js
new file mode 100644
index 0000000..366b9ec
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/index.js
@@ -0,0 +1,29 @@
+'use strict';
+
+import isArrayish from '../is-arrayish';
+
+var concat = Array.prototype.concat;
+var slice = Array.prototype.slice;
+
+export default function swizzle(args) {
+	var results = [];
+
+	for (var i = 0, len = args.length; i < len; i++) {
+		var arg = args[i];
+
+		if (isArrayish(arg)) {
+			// http://jsperf.com/javascript-array-concat-vs-push/98
+			results = concat.call(results, slice.call(arg));
+		} else {
+			results.push(arg);
+		}
+	}
+
+	return results;
+};
+
+swizzle.wrap = function (fn) {
+	return function () {
+		return fn(swizzle(arguments));
+	};
+};
diff --git a/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/package.json b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/package.json
new file mode 100644
index 0000000..795ae4c
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/color/simple-swizzle/package.json
@@ -0,0 +1,36 @@
+{
+  "name": "simple-swizzle",
+  "description": "Simply swizzle your arguments",
+  "version": "0.2.2",
+  "author": "Qix (http://github.com/qix-)",
+  "keywords": [
+    "argument",
+    "arguments",
+    "swizzle",
+    "swizzling",
+    "parameter",
+    "parameters",
+    "mixed",
+    "array"
+  ],
+  "license": "MIT",
+  "scripts": {
+    "pretest": "xo",
+    "test": "mocha --compilers coffee:coffee-script/register"
+  },
+  "files": [
+    "index.js"
+  ],
+  "repository": "qix-/node-simple-swizzle",
+  "devDependencies": {
+    "coffee-script": "^1.9.3",
+    "coveralls": "^2.11.2",
+    "istanbul": "^0.3.17",
+    "mocha": "^2.2.5",
+    "should": "^7.0.1",
+    "xo": "^0.7.1"
+  },
+  "dependencies": {
+    "is-arrayish": "^0.3.1"
+  }
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/debounce.js b/uni_modules/wu-ui-tools/libs/function/debounce.js
new file mode 100644
index 0000000..ad3996b
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/debounce.js
@@ -0,0 +1,29 @@
+let timeout = null
+
+/**
+ * 闃叉姈鍘熺悊锛氫竴瀹氭椂闂村唴锛屽彧鏈夋渶鍚庝竴娆℃搷浣滐紝鍐嶈繃wait姣鍚庢墠鎵ц鍑芥暟
+ *
+ * @param {Function} func 瑕佹墽琛岀殑鍥炶皟鍑芥暟
+ * @param {Number} wait 寤舵椂鐨勬椂闂�
+ * @param {Boolean} immediate 鏄惁绔嬪嵆鎵ц
+ * @return null
+ */
+function debounce(func, wait = 500, immediate = false) {
+    // 娓呴櫎瀹氭椂鍣�
+    if (timeout !== null) clearTimeout(timeout)
+    // 绔嬪嵆鎵ц锛屾绫绘儏鍐典竴鑸敤涓嶅埌
+    if (immediate) {
+        const callNow = !timeout
+        timeout = setTimeout(() => {
+            timeout = null
+        }, wait)
+        if (callNow) typeof func === 'function' && func()
+    } else {
+        // 璁剧疆瀹氭椂鍣紝褰撴渶鍚庝竴娆℃搷浣滃悗锛宼imeout涓嶄細鍐嶈娓呴櫎锛屾墍浠ュ湪寤舵椂wait姣鍚庢墽琛宖unc鍥炶皟鏂规硶
+        timeout = setTimeout(() => {
+            typeof func === 'function' && func()
+        }, wait)
+    }
+}
+
+export default debounce
diff --git a/uni_modules/wu-ui-tools/libs/function/digit.js b/uni_modules/wu-ui-tools/libs/function/digit.js
new file mode 100644
index 0000000..c8260a0
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/digit.js
@@ -0,0 +1,167 @@
+let _boundaryCheckingState = true; // 鏄惁杩涜瓒婄晫妫�鏌ョ殑鍏ㄥ眬寮�鍏�
+
+/**
+ * 鎶婇敊璇殑鏁版嵁杞
+ * @private
+ * @example strip(0.09999999999999998)=0.1
+ */
+function strip(num, precision = 15) {
+  return +parseFloat(Number(num).toPrecision(precision));
+}
+
+/**
+ * Return digits length of a number
+ * @private
+ * @param {*number} num Input number
+ */
+function digitLength(num) {
+  // Get digit length of e
+  const eSplit = num.toString().split(/[eE]/);
+  const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0);
+  return len > 0 ? len : 0;
+}
+
+/**
+ * 鎶婂皬鏁拌浆鎴愭暣鏁�,濡傛灉鏄皬鏁板垯鏀惧ぇ鎴愭暣鏁�
+ * @private
+ * @param {*number} num 杈撳叆鏁�
+ */
+function float2Fixed(num) {
+  if (num.toString().indexOf('e') === -1) {
+    return Number(num.toString().replace('.', ''));
+  }
+  const dLen = digitLength(num);
+  return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num);
+}
+
+/**
+ * 妫�娴嬫暟瀛楁槸鍚﹁秺鐣岋紝濡傛灉瓒婄晫缁欏嚭鎻愮ず
+ * @private
+ * @param {*number} num 杈撳叆鏁�
+ */
+function checkBoundary(num) {
+  if (_boundaryCheckingState) {
+    if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) {
+      console.warn(`${num} 瓒呭嚭浜嗙簿搴﹂檺鍒讹紝缁撴灉鍙兘涓嶆纭甡);
+    }
+  }
+}
+
+/**
+ * 鎶婇�掑綊鎿嶄綔鎵佸钩杩唬鍖�
+ * @param {number[]} arr 瑕佹搷浣滅殑鏁板瓧鏁扮粍
+ * @param {function} operation 杩唬鎿嶄綔
+ * @private
+ */
+function iteratorOperation(arr, operation) {
+  const [num1, num2, ...others] = arr;
+  let res = operation(num1, num2);
+
+  others.forEach((num) => {
+    res = operation(res, num);
+  });
+
+  return res;
+}
+
+/**
+ * 楂樼簿搴︿箻娉�
+ * @export
+ */
+export function times(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, times);
+  }
+
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  const baseNum = digitLength(num1) + digitLength(num2);
+  const leftValue = num1Changed * num2Changed;
+
+  checkBoundary(leftValue);
+
+  return leftValue / Math.pow(10, baseNum);
+}
+
+/**
+ * 楂樼簿搴﹀姞娉�
+ * @export
+ */
+export function plus(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, plus);
+  }
+
+  const [num1, num2] = nums;
+  // 鍙栨渶澶х殑灏忔暟浣�
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  // 鎶婂皬鏁伴兘杞负鏁存暟鐒跺悗鍐嶈绠�
+  return (times(num1, baseNum) + times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 楂樼簿搴﹀噺娉�
+ * @export
+ */
+export function minus(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, minus);
+  }
+
+  const [num1, num2] = nums;
+  const baseNum = Math.pow(10, Math.max(digitLength(num1), digitLength(num2)));
+  return (times(num1, baseNum) - times(num2, baseNum)) / baseNum;
+}
+
+/**
+ * 楂樼簿搴﹂櫎娉�
+ * @export
+ */
+export function divide(...nums) {
+  if (nums.length > 2) {
+    return iteratorOperation(nums, divide);
+  }
+
+  const [num1, num2] = nums;
+  const num1Changed = float2Fixed(num1);
+  const num2Changed = float2Fixed(num2);
+  checkBoundary(num1Changed);
+  checkBoundary(num2Changed);
+  // 閲嶈锛岃繖閲屽繀椤荤敤strip杩涜淇
+  return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1))));
+}
+
+/**
+ * 鍥涜垗浜斿叆
+ * @export
+ */
+export function round(num, ratio) {
+  const base = Math.pow(10, ratio);
+  let result = divide(Math.round(Math.abs(times(num, base))), base);
+  if (num < 0 && result !== 0) {
+    result = times(result, -1);
+  }
+  // 浣嶆暟涓嶈冻鍒欒ˉ0
+  return result;
+}
+
+/**
+ * 鏄惁杩涜杈圭晫妫�鏌ワ紝榛樿寮�鍚�
+ * @param flag 鏍囪寮�鍏筹紝true 涓哄紑鍚紝false 涓哄叧闂紝榛樿涓� true
+ * @export
+ */
+export function enableBoundaryChecking(flag = true) {
+  _boundaryCheckingState = flag;
+}
+
+
+export default {
+  times,
+  plus,
+  minus,
+  divide,
+  round,
+  enableBoundaryChecking,
+};
+
diff --git a/uni_modules/wu-ui-tools/libs/function/index.js b/uni_modules/wu-ui-tools/libs/function/index.js
new file mode 100644
index 0000000..d9bad2d
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/index.js
@@ -0,0 +1,738 @@
+import { number, empty } from './test.js'
+import { round } from './digit.js'
+// 棰滆壊鎿嶄綔鏂规硶
+import Color from './color'
+
+/**
+ * @description 濡傛灉value灏忎簬min锛屽彇min锛涘鏋渧alue澶т簬max锛屽彇max
+ * @param {number} min
+ * @param {number} max
+ * @param {number} value
+ */
+function range(min = 0, max = 0, value = 0) {
+	return Math.max(min, Math.min(max, Number(value)))
+}
+
+/**
+ * @description 鐢ㄤ簬鑾峰彇鐢ㄦ埛浼犻�掑�肩殑px鍊�  濡傛灉鐢ㄦ埛浼犻�掍簡"xxpx"鎴栬��"xxrpx"锛屽彇鍑哄叾鏁板�奸儴鍒嗭紝濡傛灉鏄�"xxxrpx"杩橀渶瑕佺敤杩噓ni.upx2px杩涜杞崲
+ * @param {number|string} value 鐢ㄦ埛浼犻�掑�肩殑px鍊�
+ * @param {boolean} unit
+ * @returns {number|string}
+ */
+function getPx(value, unit = false) {
+	if (number(value)) {
+		return unit ? `${value}px` : Number(value)
+	}
+	// 濡傛灉甯︽湁rpx锛屽厛鍙栧嚭鍏舵暟鍊奸儴鍒嗭紝鍐嶈浆涓簆x鍊�
+	if (/(rpx|upx)$/.test(value)) {
+		return unit ? `${uni.upx2px(parseInt(value))}px` : Number(uni.upx2px(parseInt(value)))
+	}
+	return unit ? `${parseInt(value)}px` : parseInt(value)
+}
+
+/**
+ * @description 杩涜寤舵椂锛屼互杈惧埌鍙互绠�鍐欎唬鐮佺殑鐩殑 姣斿: await uni.$w.sleep(20)灏嗕細闃诲20ms
+ * @param {number} value 鍫靛鏃堕棿 鍗曚綅ms 姣
+ * @returns {Promise} 杩斿洖promise
+ */
+function sleep(value = 30) {
+	return new Promise((resolve) => {
+		setTimeout(() => {
+			resolve()
+		}, value)
+	})
+}
+/**
+ * @description 杩愯鏈熷垽鏂钩鍙�
+ * @returns {string} 杩斿洖鎵�鍦ㄥ钩鍙�(灏忓啓)
+ * @link 杩愯鏈熷垽鏂钩鍙� https://uniapp.dcloud.io/frame?id=鍒ゆ柇骞冲彴
+ */
+function os() {
+	return uni.getSystemInfoSync().platform.toLowerCase()
+}
+/**
+ * @description 鑾峰彇绯荤粺淇℃伅鍚屾鎺ュ彛
+ * @link 鑾峰彇绯荤粺淇℃伅鍚屾鎺ュ彛 https://uniapp.dcloud.io/api/system/info?id=getsysteminfosync
+ */
+function sys() {
+	return uni.getSystemInfoSync()
+}
+
+/**
+ * @description 鍙栦竴涓尯闂存暟
+ * @param {Number} min 鏈�灏忓��
+ * @param {Number} max 鏈�澶у��
+ */
+function random(min, max) {
+	if (min >= 0 && max > 0 && max >= min) {
+		const gab = max - min + 1
+		return Math.floor(Math.random() * gab + min)
+	}
+	return 0
+}
+
+/**
+ * @param {Number} len uuid鐨勯暱搴�
+ * @param {Boolean} firstU 灏嗚繑鍥炵殑棣栧瓧姣嶇疆涓�"u"
+ * @param {Nubmer} radix 鐢熸垚uuid鐨勫熀鏁�(鎰忓懗鐫�杩斿洖鐨勫瓧绗︿覆閮芥槸杩欎釜鍩烘暟),2-浜岃繘鍒�,8-鍏繘鍒�,10-鍗佽繘鍒�,16-鍗佸叚杩涘埗
+ */
+function guid(len = 32, firstU = true, radix = null) {
+	const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
+	const uuid = []
+	radix = radix || chars.length
+
+	if (len) {
+		// 濡傛灉鎸囧畾uuid闀垮害,鍙槸鍙栭殢鏈虹殑瀛楃,0|x涓轰綅杩愮畻,鑳藉幓鎺墄鐨勫皬鏁颁綅,杩斿洖鏁存暟浣�
+		for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix]
+	} else {
+		let r
+		// rfc4122鏍囧噯瑕佹眰杩斿洖鐨剈uid涓�,鏌愪簺浣嶄负鍥哄畾鐨勫瓧绗�
+		uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'
+		uuid[14] = '4'
+
+		for (let i = 0; i < 36; i++) {
+			if (!uuid[i]) {
+				r = 0 | Math.random() * 16
+				uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]
+			}
+		}
+	}
+	// 绉婚櫎绗竴涓瓧绗�,骞剁敤u鏇夸唬,鍥犱负绗竴涓瓧绗︿负鏁板�兼椂,璇uuid涓嶈兘鐢ㄤ綔id鎴栬�卌lass
+	if (firstU) {
+		uuid.shift()
+		return `u${uuid.join('')}`
+	}
+	return uuid.join('')
+}
+
+/**
+* @description 鑾峰彇鐖剁粍浠剁殑鍙傛暟锛屽洜涓烘敮浠樺疂灏忕▼搴忎笉鏀寔provide/inject鐨勫啓娉�
+   this.$parent鍦ㄩ潪H5涓紝鍙互鍑嗙‘鑾峰彇鍒扮埗缁勪欢锛屼絾鏄湪H5涓紝闇�瑕佸娆his.$parent.$parent.xxx
+   杩欓噷榛樿鍊肩瓑浜巙ndefined鏈夊畠鐨勫惈涔夛紝鍥犱负鏈�椤跺眰鍏冪礌(缁勪欢)鐨�$parent灏辨槸undefined锛屾剰鍛崇潃涓嶄紶name
+   鍊�(榛樿涓簎ndefined)锛屽氨鏄煡鎵炬渶椤跺眰鐨�$parent
+*  @param {string|undefined} name 鐖剁粍浠剁殑鍙傛暟鍚�
+*/
+function $parent(name = undefined) {
+	let parent = this.$parent
+	// 閫氳繃while鍘嗛亶锛岃繖閲屼富瑕佹槸涓轰簡H5闇�瑕佸灞傝В鏋愮殑闂
+	while (parent) {
+		// 鐖剁粍浠�
+		if (parent.$options && parent.$options.name !== name) {
+			// 濡傛灉缁勪欢鐨刵ame涓嶇浉绛夛紝缁х画涓婁竴绾у鎵�
+			parent = parent.$parent
+		} else {
+			return parent
+		}
+	}
+	return false
+}
+
+/**
+ * @description 鏍峰紡杞崲
+ * 瀵硅薄杞瓧绗︿覆锛屾垨鑰呭瓧绗︿覆杞璞�
+ * @param {object | string} customStyle 闇�瑕佽浆鎹㈢殑鐩爣
+ * @param {String} target 杞崲鐨勭洰鐨勶紝object-杞负瀵硅薄锛宻tring-杞负瀛楃涓�
+ * @returns {object|string}
+ */
+function addStyle(customStyle, target = 'object') {
+	// 瀛楃涓茶浆瀛楃涓诧紝瀵硅薄杞璞℃儏褰紝鐩存帴杩斿洖
+	if (empty(customStyle) || typeof(customStyle) === 'object' && target === 'object' || target === 'string' &&
+		typeof(customStyle) === 'string') {
+		return customStyle
+	}
+	// 瀛楃涓茶浆瀵硅薄
+	if (target === 'object') {
+		// 鍘婚櫎瀛楃涓叉牱寮忎腑鐨勪袱绔┖鏍�(涓棿鐨勭┖鏍间笉鑳藉幓鎺夛紝姣斿padding: 20px 0濡傛灉鍘绘帀浜嗗氨閿欎簡)锛岀┖鏍兼槸鏃犵敤鐨�
+		customStyle = trim(customStyle)
+		// 鏍规嵁";"灏嗗瓧绗︿覆杞负鏁扮粍褰㈠紡
+		const styleArray = customStyle.split(';')
+		const style = {}
+		// 鍘嗛亶鏁扮粍锛屾嫾鎺ユ垚瀵硅薄
+		for (let i = 0; i < styleArray.length; i++) {
+			// 'font-size:20px;color:red;'锛屽姝ゆ渶鍚庡瓧绗︿覆鏈�";"鐨勮瘽锛屼細瀵艰嚧styleArray鏈�鍚庝竴涓厓绱犱负绌哄瓧绗︿覆锛岃繖閲岄渶瑕佽繃婊�
+			if (styleArray[i]) {
+				const item = styleArray[i].split(':')
+				style[trim(item[0])] = trim(item[1])
+			}
+		}
+		return style
+	}
+	// 杩欓噷涓哄璞¤浆瀛楃涓插舰寮�
+	let string = ''
+	for (const i in customStyle) {
+		// 椹煎嘲杞负涓垝绾跨殑褰㈠紡锛屽惁鍒檆ss鍐呰仈鏍峰紡锛屾棤娉曡瘑鍒┘宄版牱寮忓睘鎬у悕
+		const key = i.replace(/([A-Z])/g, '-$1').toLowerCase()
+		string += `${key}:${customStyle[i]};`
+	}
+	// 鍘婚櫎涓ょ绌烘牸
+	return trim(string)
+}
+
+/**
+ * @description 娣诲姞鍗曚綅锛屽鏋滄湁rpx锛寀px锛�%锛宲x绛夊崟浣嶇粨灏炬垨鑰呭�间负auto锛岀洿鎺ヨ繑鍥烇紝鍚﹀垯鍔犱笂px鍗曚綅缁撳熬
+ * @param {string|number} value 闇�瑕佹坊鍔犲崟浣嶇殑鍊�
+ * @param {string} unit 娣诲姞鐨勫崟浣嶅悕 姣斿px
+ */
+function addUnit(value = 'auto', unit = uni?.$w?.config?.unit ? uni?.$w?.config?.unit : 'px') {
+	value = String(value)
+	// 鐢╳uui鍐呯疆楠岃瘉瑙勫垯涓殑number鍒ゆ柇鏄惁涓烘暟鍊�
+	return number(value) ? `${value}${unit}` : value
+}
+
+/**
+ * @description 娣卞害鍏嬮殕
+ * @param {object} obj 闇�瑕佹繁搴﹀厠闅嗙殑瀵硅薄
+ * @param cache 缂撳瓨
+ * @returns {*} 鍏嬮殕鍚庣殑瀵硅薄鎴栬�呭師鍊硷紙涓嶆槸瀵硅薄锛�
+ */
+function deepClone(obj, cache = new WeakMap()) {
+	if (obj === null || typeof obj !== 'object') return obj;
+	if (cache.has(obj)) return cache.get(obj);
+	let clone;
+	if (obj instanceof Date) {
+		clone = new Date(obj.getTime());
+	} else if (obj instanceof RegExp) {
+		clone = new RegExp(obj);
+	} else if (obj instanceof Map) {
+		clone = new Map(Array.from(obj, ([key, value]) => [key, deepClone(value, cache)]));
+	} else if (obj instanceof Set) {
+		clone = new Set(Array.from(obj, value => deepClone(value, cache)));
+	} else if (Array.isArray(obj)) {
+		clone = obj.map(value => deepClone(value, cache));
+	} else if (Object.prototype.toString.call(obj) === '[object Object]') {
+		clone = Object.create(Object.getPrototypeOf(obj));
+		cache.set(obj, clone);
+		for (const [key, value] of Object.entries(obj)) {
+			clone[key] = deepClone(value, cache);
+		}
+	} else {
+		clone = Object.assign({}, obj);
+	}
+	cache.set(obj, clone);
+	return clone;
+}
+
+/**
+ * @description JS瀵硅薄娣卞害鍚堝苟
+ * @param {object} target 闇�瑕佹嫹璐濈殑瀵硅薄
+ * @param {object} source 鎷疯礉鐨勬潵婧愬璞�
+ * @returns {object|boolean} 娣卞害鍚堝苟鍚庣殑瀵硅薄鎴栬�協alse锛堝叆鍙傛湁涓嶆槸瀵硅薄锛�
+ */
+function deepMerge(target = {}, source = {}) {
+	target = deepClone(target)
+	if (typeof target !== 'object' || target === null || typeof source !== 'object' || source === null) return target;
+	const merged = Array.isArray(target) ? target.slice() : Object.assign({}, target);
+	for (const prop in source) {
+		if (!source.hasOwnProperty(prop)) continue;
+		const sourceValue = source[prop];
+		const targetValue = merged[prop];
+		if (sourceValue instanceof Date) {
+			merged[prop] = new Date(sourceValue);
+		} else if (sourceValue instanceof RegExp) {
+			merged[prop] = new RegExp(sourceValue);
+		} else if (sourceValue instanceof Map) {
+			merged[prop] = new Map(sourceValue);
+		} else if (sourceValue instanceof Set) {
+			merged[prop] = new Set(sourceValue);
+		} else if (typeof sourceValue === 'object' && sourceValue !== null) {
+			merged[prop] = deepMerge(targetValue, sourceValue);
+		} else {
+			merged[prop] = sourceValue;
+		}
+	}
+	return merged;
+}
+
+/**
+ * @description error鎻愮ず
+ * @param {*} err 閿欒鍐呭
+ */
+function error(err) {
+	// 寮�鍙戠幆澧冩墠鎻愮ず锛岀敓浜х幆澧冧笉浼氭彁绀�
+	if (process.env.NODE_ENV === 'development') {
+		console.error(`wuui鎻愮ず锛�${err}`)
+	}
+}
+
+/**
+ * @description 鎵撲贡鏁扮粍
+ * @param {array} array 闇�瑕佹墦涔辩殑鏁扮粍
+ * @returns {array} 鎵撲贡鍚庣殑鏁扮粍
+ */
+function randomArray(array = []) {
+	// 鍘熺悊鏄痵ort鎺掑簭,Math.random()浜х敓0<= x < 1涔嬮棿鐨勬暟,浼氬鑷磝-0.05澶т簬鎴栬�呭皬浜�0
+	return array.sort(() => Math.random() - 0.5)
+}
+
+// padStart 鐨� polyfill锛屽洜涓烘煇浜涙満鍨嬫垨鎯呭喌锛岃繕鏃犳硶鏀寔es7鐨刾adStart锛屾瘮濡傜數鑴戠増鐨勫井淇″皬绋嬪簭
+// 鎵�浠ヨ繖閲屽仛涓�涓吋瀹筽olyfill鐨勫吋瀹瑰鐞�
+if (!String.prototype.padStart) {
+	// 涓轰簡鏂逛究琛ㄧず杩欓噷 fillString 鐢ㄤ簡ES6 鐨勯粯璁ゅ弬鏁帮紝涓嶅奖鍝嶇悊瑙�
+	String.prototype.padStart = function(maxLength, fillString = ' ') {
+		if (Object.prototype.toString.call(fillString) !== '[object String]') {
+			throw new TypeError(
+				'fillString must be String'
+			)
+		}
+		const str = this
+		// 杩斿洖 String(str) 杩欓噷鏄负浜嗕娇杩斿洖鐨勫�兼槸瀛楃涓插瓧闈㈤噺锛屽湪鎺у埗鍙颁腑鏇寸鍚堢洿瑙�
+		if (str.length >= maxLength) return String(str)
+
+		const fillLength = maxLength - str.length
+		let times = Math.ceil(fillLength / fillString.length)
+		while (times >>= 1) {
+			fillString += fillString
+			if (times === 1) {
+				fillString += fillString
+			}
+		}
+		return fillString.slice(0, fillLength) + str
+	}
+}
+
+/**
+ * @description 鏍煎紡鍖栨椂闂�
+ * @param {String|Number} dateTime 闇�瑕佹牸寮忓寲鐨勬椂闂存埑
+ * @param {String} fmt 鏍煎紡鍖栬鍒� yyyy:mm:dd|yyyy:mm|yyyy骞磎m鏈坉d鏃yyyy骞磎m鏈坉d鏃� hh鏃禡M鍒嗙瓑,鍙嚜瀹氫箟缁勫悎 榛樿yyyy-mm-dd
+ * @returns {string} 杩斿洖鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+ */
+function timeFormat(dateTime = null, formatStr = 'yyyy-mm-dd') {
+	let date
+	// 鑻ヤ紶鍏ユ椂闂翠负鍋囧�硷紝鍒欏彇褰撳墠鏃堕棿
+	if (!dateTime) {
+		date = new Date()
+	}
+	// 鑻ヤ负unix绉掓椂闂存埑锛屽垯杞负姣鏃堕棿鎴筹紙閫昏緫鏈夌偣濂囨�紝浣嗕笉鏁㈡敼锛屼互淇濊瘉鍘嗗彶鍏煎锛�
+	else if (/^\d{10}$/.test(dateTime?.toString().trim())) {
+		date = new Date(dateTime * 1000)
+	}
+	// 鑻ョ敤鎴蜂紶鍏ュ瓧绗︿覆鏍煎紡鏃堕棿鎴筹紝new Date鏃犳硶瑙f瀽锛岄渶鍋氬吋瀹�
+	else if (typeof dateTime === 'string' && /^\d+$/.test(dateTime.trim())) {
+		date = new Date(Number(dateTime))
+	}
+	// 澶勭悊骞冲彴鎬у樊寮傦紝鍦⊿afari/Webkit涓紝new Date浠呮敮鎸�/浣滀负鍒嗗壊绗︾殑瀛楃涓叉椂闂�
+	// 澶勭悊 '2022-07-10 01:02:03'锛岃烦杩� '2022-07-10T01:02:03'
+	else if (typeof dateTime === 'string' && dateTime.includes('-') && !dateTime.includes('T')) {
+		date = new Date(dateTime.replace(/-/g, '/'))
+	}
+	// 鍏朵粬閮借涓虹鍚� RFC 2822 瑙勮寖
+	else {
+		date = new Date(dateTime)
+	}
+
+	const timeSource = {
+		'y': date.getFullYear().toString(), // 骞�
+		'm': (date.getMonth() + 1).toString().padStart(2, '0'), // 鏈�
+		'd': date.getDate().toString().padStart(2, '0'), // 鏃�
+		'h': date.getHours().toString().padStart(2, '0'), // 鏃�
+		'M': date.getMinutes().toString().padStart(2, '0'), // 鍒�
+		's': date.getSeconds().toString().padStart(2, '0') // 绉�
+		// 鏈夊叾浠栨牸寮忓寲瀛楃闇�姹傚彲浠ョ户缁坊鍔狅紝蹇呴』杞寲鎴愬瓧绗︿覆
+	}
+
+	for (const key in timeSource) {
+		const [ret] = new RegExp(`${key}+`).exec(formatStr) || []
+		if (ret) {
+			// 骞村彲鑳藉彧闇�灞曠ず涓や綅
+			const beginIndex = key === 'y' && ret.length === 2 ? 2 : 0
+			formatStr = formatStr.replace(ret, timeSource[key].slice(beginIndex))
+		}
+	}
+
+	return formatStr
+}
+
+/**
+ * @description 鏃堕棿鎴宠浆涓哄涔呬箣鍓�
+ * @param {String|Number} timestamp 鏃堕棿鎴�
+ * @param {String|Boolean} format
+ * 鏍煎紡鍖栬鍒欏鏋滀负鏃堕棿鏍煎紡瀛楃涓诧紝瓒呭嚭涓�瀹氭椂闂磋寖鍥达紝杩斿洖鍥哄畾鐨勬椂闂存牸寮忥紱
+ * 濡傛灉涓哄竷灏斿�糵alse锛屾棤璁轰粈涔堟椂闂达紝閮借繑鍥炲涔呬互鍓嶇殑鏍煎紡
+ * @returns {string} 杞寲鍚庣殑鍐呭
+ */
+function timeFrom(timestamp = null, format = 'yyyy-mm-dd') {
+	if (timestamp == null) timestamp = Number(new Date())
+	timestamp = parseInt(timestamp)
+	// 鍒ゆ柇鐢ㄦ埛杈撳叆鐨勬椂闂存埑鏄杩樻槸姣,涓�鑸墠绔痡s鑾峰彇鐨勬椂闂存埑鏄绉�(13浣�),鍚庣浼犺繃鏉ョ殑涓虹(10浣�)
+	if (timestamp.toString().length == 10) timestamp *= 1000
+	let timer = (new Date()).getTime() - timestamp
+	timer = parseInt(timer / 1000)
+	// 濡傛灉灏忎簬5鍒嗛挓,鍒欒繑鍥�"鍒氬垰",鍏朵粬浠ユ绫绘帹
+	let tips = ''
+	switch (true) {
+		case timer < 300:
+			tips = '鍒氬垰'
+			break
+		case timer >= 300 && timer < 3600:
+			tips = `${parseInt(timer / 60)}鍒嗛挓鍓峘
+			break
+		case timer >= 3600 && timer < 86400:
+			tips = `${parseInt(timer / 3600)}灏忔椂鍓峘
+			break
+		case timer >= 86400 && timer < 2592000:
+			tips = `${parseInt(timer / 86400)}澶╁墠`
+			break
+		default:
+			// 濡傛灉format涓篺alse锛屽垯鏃犺浠�涔堟椂闂存埑锛岄兘鏄剧ずxx涔嬪墠
+			if (format === false) {
+				if (timer >= 2592000 && timer < 365 * 86400) {
+					tips = `${parseInt(timer / (86400 * 30))}涓湀鍓峘
+				} else {
+					tips = `${parseInt(timer / (86400 * 365))}骞村墠`
+				}
+			} else {
+				tips = timeFormat(timestamp, format)
+			}
+	}
+	return tips
+}
+
+/**
+ * @description 鍘婚櫎绌烘牸
+ * @param String str 闇�瑕佸幓闄ょ┖鏍肩殑瀛楃涓�
+ * @param String pos both(宸﹀彸)|left|right|all 榛樿both
+ */
+function trim(str, pos = 'both') {
+	str = String(str)
+	if (pos == 'both') {
+		return str.replace(/^\s+|\s+$/g, '')
+	}
+	if (pos == 'left') {
+		return str.replace(/^\s*/, '')
+	}
+	if (pos == 'right') {
+		return str.replace(/(\s*$)/g, '')
+	}
+	if (pos == 'all') {
+		return str.replace(/\s+/g, '')
+	}
+	return str
+}
+
+/**
+ * @description 瀵硅薄杞瑄rl鍙傛暟
+ * @param {object} data,瀵硅薄
+ * @param {Boolean} isPrefix,鏄惁鑷姩鍔犱笂"?"
+ * @param {string} arrayFormat 瑙勫垯 indices|brackets|repeat|comma
+ */
+function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {
+	const prefix = isPrefix ? '?' : ''
+	const _result = []
+	if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets'
+	for (const key in data) {
+		const value = data[key]
+		// 鍘绘帀涓虹┖鐨勫弬鏁�
+		if (['', undefined, null].indexOf(value) >= 0) {
+			continue
+		}
+		// 濡傛灉鍊间负鏁扮粍锛屽彟琛屽鐞�
+		if (value.constructor === Array) {
+			// e.g. {ids: [1, 2, 3]}
+			switch (arrayFormat) {
+				case 'indices':
+					// 缁撴灉: ids[0]=1&ids[1]=2&ids[2]=3
+					for (let i = 0; i < value.length; i++) {
+						_result.push(`${key}[${i}]=${value[i]}`)
+					}
+					break
+				case 'brackets':
+					// 缁撴灉: ids[]=1&ids[]=2&ids[]=3
+					value.forEach((_value) => {
+						_result.push(`${key}[]=${_value}`)
+					})
+					break
+				case 'repeat':
+					// 缁撴灉: ids=1&ids=2&ids=3
+					value.forEach((_value) => {
+						_result.push(`${key}=${_value}`)
+					})
+					break
+				case 'comma':
+					// 缁撴灉: ids=1,2,3
+					let commaStr = ''
+					value.forEach((_value) => {
+						commaStr += (commaStr ? ',' : '') + _value
+					})
+					_result.push(`${key}=${commaStr}`)
+					break
+				default:
+					value.forEach((_value) => {
+						_result.push(`${key}[]=${_value}`)
+					})
+			}
+		} else {
+			_result.push(`${key}=${value}`)
+		}
+	}
+	return _result.length ? prefix + _result.join('&') : ''
+}
+
+/**
+ * 鏄剧ず娑堟伅鎻愮ず妗�
+ * @param {String} title 鎻愮ず鐨勫唴瀹癸紝闀垮害涓� icon 鍙栧�兼湁鍏炽��
+ * @param {Number} duration 鎻愮ず鐨勫欢杩熸椂闂达紝鍗曚綅姣锛岄粯璁わ細2000
+ */
+function toast(title, duration = 2000) {
+	uni.showToast({
+		title: String(title),
+		icon: 'none',
+		duration
+	})
+}
+
+/**
+ * @description 鏍规嵁涓婚type鍊�,鑾峰彇瀵瑰簲鐨勫浘鏍�
+ * @param {String} type 涓婚鍚嶇О,primary|info|error|warning|success
+ * @param {boolean} fill 鏄惁浣跨敤fill濉厖瀹炰綋鐨勫浘鏍�
+ */
+function type2icon(type = 'success', fill = false) {
+	// 濡傛灉闈為缃��,榛樿涓簊uccess
+	if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success'
+	let iconName = ''
+	// 鐩墠(2019-12-12),info鍜宲rimary浣跨敤鍚屼竴涓浘鏍�
+	switch (type) {
+		case 'primary':
+			iconName = 'info-circle'
+			break
+		case 'info':
+			iconName = 'info-circle'
+			break
+		case 'error':
+			iconName = 'close-circle'
+			break
+		case 'warning':
+			iconName = 'error-circle'
+			break
+		case 'success':
+			iconName = 'checkmark-circle'
+			break
+		default:
+			iconName = 'checkmark-circle'
+	}
+	// 鏄惁鏄疄浣撶被鍨�,鍔犱笂-fill,鍦╥con缁勪欢搴撲腑,瀹炰綋鐨勭被鍚嶆槸鍚庨潰鍔�-fill鐨�
+	if (fill) iconName += '-fill'
+	return iconName
+}
+
+/**
+ * @description 鏁板瓧鏍煎紡鍖�
+ * @param {number|string} number 瑕佹牸寮忓寲鐨勬暟瀛�
+ * @param {number} decimals 淇濈暀鍑犱綅灏忔暟
+ * @param {string} decimalPoint 灏忔暟鐐圭鍙�
+ * @param {string} thousandsSeparator 鍗冨垎浣嶇鍙�
+ * @returns {string} 鏍煎紡鍖栧悗鐨勬暟瀛�
+ */
+function priceFormat(number, decimals = 0, decimalPoint = '.', thousandsSeparator = ',') {
+	number = (`${number}`).replace(/[^0-9+-Ee.]/g, '')
+	const n = !isFinite(+number) ? 0 : +number
+	const prec = !isFinite(+decimals) ? 0 : Math.abs(decimals)
+	const sep = (typeof thousandsSeparator === 'undefined') ? ',' : thousandsSeparator
+	const dec = (typeof decimalPoint === 'undefined') ? '.' : decimalPoint
+	let s = ''
+
+	s = (prec ? round(n, prec) + '' : `${Math.round(n)}`).split('.')
+	const re = /(-?\d+)(\d{3})/
+	while (re.test(s[0])) {
+		s[0] = s[0].replace(re, `$1${sep}$2`)
+	}
+
+	if ((s[1] || '').length < prec) {
+		s[1] = s[1] || ''
+		s[1] += new Array(prec - s[1].length + 1).join('0')
+	}
+	return s.join(dec)
+}
+
+/**
+ * @description 鑾峰彇duration鍊�
+ * 濡傛灉甯︽湁ms鎴栬�卻鐩存帴杩斿洖锛屽鏋滃ぇ浜庝竴瀹氬�硷紝璁や负鏄痬s鍗曚綅锛屽皬浜庝竴瀹氬�硷紝璁や负鏄痵鍗曚綅
+ * 姣斿浠�30浣嶉槇鍊硷紝閭d箞300澶т簬30锛屽彲浠ョ悊瑙d负鐢ㄦ埛鎯宠鐨勬槸300ms锛岃�屼笉鏄兂鑺�300s鍘绘墽琛屼竴涓姩鐢�
+ * @param {String|number} value 姣斿: "1s"|"100ms"|1|100
+ * @param {boolean} unit  鎻愮ず: 濡傛灉鏄痜alse 榛樿杩斿洖number
+ * @return {string|number}
+ */
+function getDuration(value, unit = true) {
+	const valueNum = parseInt(value)
+	if (unit) {
+		if (/s$/.test(value)) return value
+		return value > 30 ? `${value}ms` : `${value}s`
+	}
+	if (/ms$/.test(value)) return valueNum
+	if (/s$/.test(value)) return valueNum > 30 ? valueNum : valueNum * 1000
+	return valueNum
+}
+
+/**
+ * @description 鏃ユ湡鐨勬湀鎴栨棩琛ラ浂鎿嶄綔
+ * @param {String} value 闇�瑕佽ˉ闆剁殑鍊�
+ */
+function padZero(value) {
+	return `00${value}`.slice(-2)
+}
+
+/**
+ * @description 鍦╳u-form鐨勫瓙缁勪欢鍐呭鍙戠敓鍙樺寲锛屾垨鑰呭け鍘荤劍鐐规椂锛屽皾璇曢�氱煡wu-form鎵ц鏍¢獙鏂规硶
+ * @param {*} instance
+ * @param {*} event
+ */
+function formValidate(instance, event) {
+	const formItem = $parent.call(instance, 'wu-form-item')
+	const form = $parent.call(instance, 'wu-form')
+	// 濡傛灉鍙戠敓鍙樺寲鐨刬nput鎴栬�卼extarea绛夛紝鍏剁埗缁勪欢涓湁wu-form-item鎴栬�厀u-form绛夛紝灏辨墽琛宖orm鐨剉alidate鏂规硶
+	// 鍚屾椂灏唂orm-item鐨刾ros浼犻�掔粰form锛岃鍏惰繘琛岀簿纭璞¢獙璇�
+	if (formItem && form) {
+		form.validateField(formItem.prop, () => {}, event)
+	}
+}
+
+/**
+ * @description 鑾峰彇鏌愪釜瀵硅薄涓嬬殑灞炴�э紝鐢ㄤ簬閫氳繃绫讳技'a.b.c'鐨勫舰寮忓幓鑾峰彇涓�涓璞$殑鐨勫睘鎬х殑褰㈠紡
+ * @param {object} obj 瀵硅薄
+ * @param {string} key 闇�瑕佽幏鍙栫殑灞炴�у瓧娈�
+ * @returns {*}
+ */
+function getProperty(obj, key) {
+	if (!obj) {
+		return
+	}
+	if (typeof key !== 'string' || key === '') {
+		return ''
+	}
+	if (key.indexOf('.') !== -1) {
+		const keys = key.split('.')
+		let firstObj = obj[keys[0]] || {}
+
+		for (let i = 1; i < keys.length; i++) {
+			if (firstObj) {
+				firstObj = firstObj[keys[i]]
+			}
+		}
+		return firstObj
+	}
+	return obj[key]
+}
+
+/**
+ * @description 璁剧疆瀵硅薄鐨勫睘鎬у�硷紝濡傛灉'a.b.c'鐨勫舰寮忚繘琛岃缃�
+ * @param {object} obj 瀵硅薄
+ * @param {string} key 闇�瑕佽缃殑灞炴��
+ * @param {string} value 璁剧疆鐨勫��
+ */
+function setProperty(obj, key, value) {
+	if (!obj) {
+		return
+	}
+	// 閫掑綊璧嬪��
+	const inFn = function(_obj, keys, v) {
+		// 鏈�鍚庝竴涓睘鎬ey
+		if (keys.length === 1) {
+			_obj[keys[0]] = v
+			return
+		}
+		// 0~length-1涓猭ey
+		while (keys.length > 1) {
+			const k = keys[0]
+			if (!_obj[k] || (typeof _obj[k] !== 'object')) {
+				_obj[k] = {}
+			}
+			const key = keys.shift()
+			// 鑷皟鐢ㄥ垽鏂槸鍚﹀瓨鍦ㄥ睘鎬э紝涓嶅瓨鍦ㄥ垯鑷姩鍒涘缓瀵硅薄
+			inFn(_obj[k], keys, v)
+		}
+	}
+
+	if (typeof key !== 'string' || key === '') {
+
+	} else if (key.indexOf('.') !== -1) { // 鏀寔澶氬眰绾ц祴鍊兼搷浣�
+		const keys = key.split('.')
+		inFn(obj, keys, value)
+	} else {
+		obj[key] = value
+	}
+}
+
+/**
+ * @description 鑾峰彇褰撳墠椤甸潰璺緞
+ */
+function page() {
+	const pages = getCurrentPages();
+	const route = pages[pages.length - 1]?.route;
+	// 鏌愪簺鐗规畩鎯呭喌涓�(姣斿椤甸潰杩涜redirectTo鏃剁殑涓�浜涙椂鏈�)锛宲ages鍙兘涓虹┖鏁扮粍
+	return `/${route ? route : ''}`
+}
+
+/**
+ * @description 鑾峰彇褰撳墠璺敱鏍堝疄渚嬫暟缁�
+ */
+function pages() {
+	const pages = getCurrentPages()
+	return pages
+}
+
+/**
+ * 鑾峰彇椤甸潰鍘嗗彶鏍堟寚瀹氬眰瀹炰緥
+ * @param back {number} [0] - 0鎴栬�呰礋鏁帮紝琛ㄧず鑾峰彇鍘嗗彶鏍堢殑鍝竴灞傦紝0琛ㄧず鑾峰彇褰撳墠椤甸潰瀹炰緥锛�-1 琛ㄧず鑾峰彇涓婁竴涓〉闈㈠疄渚嬨�傞粯璁�0銆�
+ */
+function getHistoryPage(back = 0) {
+	const pages = getCurrentPages()
+	const len = pages.length
+	return pages[len - 1 + back]
+}
+
+
+
+/**
+ * @description 淇敼wuui鍐呯疆灞炴�у��
+ * @param {object} props 淇敼鍐呯疆props灞炴��
+ * @param {object} config 淇敼鍐呯疆config灞炴��
+ * @param {object} color 淇敼鍐呯疆color灞炴��
+ * @param {object} zIndex 淇敼鍐呯疆zIndex灞炴��
+ */
+function setConfig({
+	props = {},
+	config = {},
+	color = {},
+	zIndex = {}
+}) {
+	const {
+		deepMerge,
+	} = uni.$w
+	uni.$w.config = deepMerge(uni.$w.config, config)
+	uni.$w.props = deepMerge(uni.$w.props, props)
+	uni.$w.color = deepMerge(uni.$w.color, color)
+	uni.$w.zIndex = deepMerge(uni.$w.zIndex, zIndex)
+}
+
+export {
+	range,
+	getPx,
+	sleep,
+	os,
+	sys,
+	random,
+	guid,
+	$parent,
+	addStyle,
+	addUnit,
+	deepClone,
+	deepMerge,
+	error,
+	randomArray,
+	timeFormat,
+	timeFrom,
+	trim,
+	queryParams,
+	toast,
+	type2icon,
+	priceFormat,
+	getDuration,
+	padZero,
+	formValidate,
+	getProperty,
+	setProperty,
+	page,
+	pages,
+	getHistoryPage,
+	setConfig,
+	Color
+}
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/function/platform.js b/uni_modules/wu-ui-tools/libs/function/platform.js
new file mode 100644
index 0000000..d6b926e
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/platform.js
@@ -0,0 +1,75 @@
+/**
+ * 娉ㄦ剰锛�
+ * 姝ら儴鍒嗗唴瀹癸紝鍦╲ue-cli妯″紡涓嬶紝闇�瑕佸湪vue.config.js鍔犲叆濡備笅鍐呭鎵嶆湁鏁堬細
+ * module.exports = {
+ *     transpileDependencies: ['uview-v2']
+ * }
+ */
+
+let platform = 'none'
+
+// #ifdef VUE3
+platform = 'vue3'
+// #endif
+
+// #ifdef VUE2
+platform = 'vue2'
+// #endif
+
+// #ifdef APP-PLUS
+platform = 'plus'
+// #endif
+
+// #ifdef APP-NVUE
+platform = 'nvue'
+// #endif
+
+// #ifdef H5
+platform = 'h5'
+// #endif
+
+// #ifdef MP-WEIXIN
+platform = 'weixin'
+// #endif
+
+// #ifdef MP-ALIPAY
+platform = 'alipay'
+// #endif
+
+// #ifdef MP-BAIDU
+platform = 'baidu'
+// #endif
+
+// #ifdef MP-TOUTIAO
+platform = 'toutiao'
+// #endif
+
+// #ifdef MP-QQ
+platform = 'qq'
+// #endif
+
+// #ifdef MP-KUAISHOU
+platform = 'kuaishou'
+// #endif
+
+// #ifdef MP-360
+platform = '360'
+// #endif
+
+// #ifdef MP
+platform = 'mp'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW
+platform = 'quickapp-webview'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-HUAWEI
+platform = 'quickapp-webview-huawei'
+// #endif
+
+// #ifdef QUICKAPP-WEBVIEW-UNION
+platform = 'quckapp-webview-union'
+// #endif
+
+export default platform
diff --git a/uni_modules/wu-ui-tools/libs/function/test.js b/uni_modules/wu-ui-tools/libs/function/test.js
new file mode 100644
index 0000000..7c8b747
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/test.js
@@ -0,0 +1,287 @@
+/**
+ * 楠岃瘉鐢靛瓙閭鏍煎紡
+ */
+function email(value) {
+    return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value)
+}
+
+/**
+ * 楠岃瘉鎵嬫満鏍煎紡
+ */
+function mobile(value) {
+    return /^1([3589]\d|4[5-9]|6[1-2,4-7]|7[0-8])\d{8}$/.test(value)
+}
+
+/**
+ * 楠岃瘉URL鏍煎紡
+ */
+function url(value) {
+    return /^((https|http|ftp|rtsp|mms):\/\/)(([0-9a-zA-Z_!~*'().&=+$%-]+: )?[0-9a-zA-Z_!~*'().&=+$%-]+@)?(([0-9]{1,3}.){3}[0-9]{1,3}|([0-9a-zA-Z_!~*'()-]+.)*([0-9a-zA-Z][0-9a-zA-Z-]{0,61})?[0-9a-zA-Z].[a-zA-Z]{2,6})(:[0-9]{1,4})?((\/?)|(\/[0-9a-zA-Z_!~*'().;?:@&=+$,%#-]+)+\/?)$/
+        .test(value)
+}
+
+/**
+ * 楠岃瘉鏃ユ湡鏍煎紡
+ */
+function date(value) {
+    if (!value) return false
+    // 鍒ゆ柇鏄惁鏁板�兼垨鑰呭瓧绗︿覆鏁板��(鎰忓懗鐫�涓烘椂闂存埑)锛岃浆涓烘暟鍊硷紝鍚﹀垯new Date鏃犳硶璇嗗埆瀛楃涓叉椂闂存埑
+    if (number(value)) value = +value
+    return !/Invalid|NaN/.test(new Date(value).toString())
+}
+
+/**
+ * 楠岃瘉ISO绫诲瀷鐨勬棩鏈熸牸寮�
+ */
+function dateISO(value) {
+    return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
+}
+
+/**
+ * 楠岃瘉鍗佽繘鍒舵暟瀛�
+ */
+function number(value) {
+    return /^[\+-]?(\d+\.?\d*|\.\d+|\d\.\d+e\+\d+)$/.test(value)
+}
+
+/**
+ * 楠岃瘉瀛楃涓�
+ */
+function string(value) {
+    return typeof value === 'string'
+}
+
+/**
+ * 楠岃瘉鏁存暟
+ */
+function digits(value) {
+    return /^\d+$/.test(value)
+}
+
+/**
+ * 楠岃瘉韬唤璇佸彿鐮�
+ */
+function idCard(value) {
+    return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+        value
+    )
+}
+
+/**
+ * 鏄惁杞︾墝鍙�
+ */
+function carNo(value) {
+    // 鏂拌兘婧愯溅鐗�
+    const xreg = /^[浜触娌笣鍐�璞簯杈介粦婀樼殩椴佹柊鑻忔禉璧i剛妗傜敇鏅嬭挋闄曞悏闂借吹绮ら潚钘忓窛瀹佺惣浣块A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/
+    // 鏃ц溅鐗�
+    const creg = /^[浜触娌笣鍐�璞簯杈介粦婀樼殩椴佹柊鑻忔禉璧i剛妗傜敇鏅嬭挋闄曞悏闂借吹绮ら潚钘忓窛瀹佺惣浣块A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9鎸傚璀︽腐婢砞{1}$/
+    if (value.length === 7) {
+        return creg.test(value)
+    } if (value.length === 8) {
+        return xreg.test(value)
+    }
+    return false
+}
+
+/**
+ * 閲戦,鍙厑璁�2浣嶅皬鏁�
+ */
+function amount(value) {
+    // 閲戦锛屽彧鍏佽淇濈暀涓や綅灏忔暟
+    return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value)
+}
+
+/**
+ * 涓枃
+ */
+function chinese(value) {
+    const reg = /^[\u4e00-\u9fa5]+$/gi
+    return reg.test(value)
+}
+
+/**
+ * 鍙兘杈撳叆瀛楁瘝
+ */
+function letter(value) {
+    return /^[a-zA-Z]*$/.test(value)
+}
+
+/**
+ * 鍙兘鏄瓧姣嶆垨鑰呮暟瀛�
+ */
+function enOrNum(value) {
+    // 鑻辨枃鎴栬�呮暟瀛�
+    const reg = /^[0-9a-zA-Z]*$/g
+    return reg.test(value)
+}
+
+/**
+ * 楠岃瘉鏄惁鍖呭惈鏌愪釜鍊�
+ */
+function contains(value, param) {
+    return value.indexOf(param) >= 0
+}
+
+/**
+ * 楠岃瘉涓�涓�艰寖鍥碵min, max]
+ */
+function range(value, param) {
+    return value >= param[0] && value <= param[1]
+}
+
+/**
+ * 楠岃瘉涓�涓暱搴﹁寖鍥碵min, max]
+ */
+function rangeLength(value, param) {
+    return value.length >= param[0] && value.length <= param[1]
+}
+
+/**
+ * 鏄惁鍥哄畾鐢佃瘽
+ */
+function landline(value) {
+    const reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/
+    return reg.test(value)
+}
+
+/**
+ * 鍒ゆ柇鏄惁涓虹┖
+ */
+function empty(value) {
+    switch (typeof value) {
+    case 'undefined':
+        return true
+    case 'string':
+        if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true
+        break
+    case 'boolean':
+        if (!value) return true
+        break
+    case 'number':
+        if (value === 0 || isNaN(value)) return true
+        break
+    case 'object':
+        if (value === null || value.length === 0) return true
+        for (const i in value) {
+            return false
+        }
+        return true
+    }
+    return false
+}
+
+/**
+ * 鏄惁json瀛楃涓�
+ */
+function jsonString(value) {
+    if (typeof value === 'string') {
+        try {
+            const obj = JSON.parse(value)
+            if (typeof obj === 'object' && obj) {
+                return true
+            }
+            return false
+        } catch (e) {
+            return false
+        }
+    }
+    return false
+}
+
+/**
+ * 鏄惁鏁扮粍
+ */
+function array(value) {
+    if (typeof Array.isArray === 'function') {
+        return Array.isArray(value)
+    }
+    return Object.prototype.toString.call(value) === '[object Array]'
+}
+
+/**
+ * 鏄惁瀵硅薄
+ */
+function object(value) {
+    return Object.prototype.toString.call(value) === '[object Object]'
+}
+
+/**
+ * 鏄惁鐭俊楠岃瘉鐮�
+ */
+function code(value, len = 6) {
+    return new RegExp(`^\\d{${len}}$`).test(value)
+}
+
+/**
+ * 鏄惁鍑芥暟鏂规硶
+ * @param {Object} value
+ */
+function func(value) {
+    return typeof value === 'function'
+}
+
+/**
+ * 鏄惁promise瀵硅薄
+ * @param {Object} value
+ */
+function promise(value) {
+    return object(value) && func(value.then) && func(value.catch)
+}
+
+/** 鏄惁鍥剧墖鏍煎紡
+ * @param {Object} value
+ */
+function image(value) {
+    const newValue = value.split('?')[0]
+    const IMAGE_REGEXP = /\.(jpeg|jpg|gif|png|svg|webp|jfif|bmp|dpg)/i
+    return IMAGE_REGEXP.test(newValue)
+}
+
+/**
+ * 鏄惁瑙嗛鏍煎紡
+ * @param {Object} value
+ */
+function video(value) {
+    const VIDEO_REGEXP = /\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i
+    return VIDEO_REGEXP.test(value)
+}
+
+/**
+ * 鏄惁涓烘鍒欏璞�
+ * @param {Object}
+ * @return {Boolean}
+ */
+function regExp(o) {
+    return o && Object.prototype.toString.call(o) === '[object RegExp]'
+}
+
+export {
+    email,
+    mobile,
+    url,
+    date,
+    dateISO,
+    number,
+    digits,
+    idCard,
+    carNo,
+    amount,
+    chinese,
+    letter,
+    enOrNum,
+    contains,
+    range,
+    rangeLength,
+    empty,
+    jsonString,
+    landline,
+    object,
+    array,
+    code,
+    func,
+    promise,
+    video,
+    image,
+    regExp,
+    string
+}
diff --git a/uni_modules/wu-ui-tools/libs/function/throttle.js b/uni_modules/wu-ui-tools/libs/function/throttle.js
new file mode 100644
index 0000000..2f33611
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/function/throttle.js
@@ -0,0 +1,30 @@
+let timer; let
+    flag
+/**
+ * 鑺傛祦鍘熺悊锛氬湪涓�瀹氭椂闂村唴锛屽彧鑳借Е鍙戜竴娆�
+ *
+ * @param {Function} func 瑕佹墽琛岀殑鍥炶皟鍑芥暟
+ * @param {Number} wait 寤舵椂鐨勬椂闂�
+ * @param {Boolean} immediate 鏄惁绔嬪嵆鎵ц
+ * @return null
+ */
+function throttle(func, wait = 500, immediate = true) {
+    if (immediate) {
+        if (!flag) {
+            flag = true
+            // 濡傛灉鏄珛鍗虫墽琛岋紝鍒欏湪wait姣鍐呭紑濮嬫椂鎵ц
+            typeof func === 'function' && func()
+            timer = setTimeout(() => {
+                flag = false
+            }, wait)
+        }
+    } else if (!flag) {
+        flag = true
+        // 濡傛灉鏄潪绔嬪嵆鎵ц锛屽垯鍦╳ait姣鍐呯殑缁撴潫澶勬墽琛�
+        timer = setTimeout(() => {
+            flag = false
+            typeof func === 'function' && func()
+        }, wait)
+    }
+}
+export default throttle
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/adapters/index.js b/uni_modules/wu-ui-tools/libs/luch-request/adapters/index.js
new file mode 100644
index 0000000..e03cf5f
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/adapters/index.js
@@ -0,0 +1,97 @@
+import buildURL from '../helpers/buildURL'
+import buildFullPath from '../core/buildFullPath'
+import settle from '../core/settle'
+import { isUndefined } from '../utils'
+
+/**
+ * 杩斿洖鍙�夊�煎瓨鍦ㄧ殑閰嶇疆
+ * @param {Array} keys - 鍙�夊�兼暟缁�
+ * @param {Object} config2 - 閰嶇疆
+ * @return {{}} - 瀛樺湪鐨勯厤缃」
+ */
+const mergeKeys = (keys, config2) => {
+    const config = {}
+    keys.forEach((prop) => {
+        if (!isUndefined(config2[prop])) {
+            config[prop] = config2[prop]
+        }
+    })
+    return config
+}
+export default (config) => new Promise((resolve, reject) => {
+    const fullPath = buildURL(buildFullPath(config.baseURL, config.url), config.params)
+    const _config = {
+        url: fullPath,
+        header: config.header,
+        complete: (response) => {
+            config.fullPath = fullPath
+            response.config = config
+            try {
+                // 瀵瑰彲鑳藉瓧绗︿覆涓嶆槸json 鐨勬儏鍐靛閿�
+                if (typeof response.data === 'string') {
+                    response.data = JSON.parse(response.data)
+                }
+                // eslint-disable-next-line no-empty
+            } catch (e) {
+            }
+            settle(resolve, reject, response)
+        }
+    }
+    let requestTask
+    if (config.method === 'UPLOAD') {
+        delete _config.header['content-type']
+        delete _config.header['Content-Type']
+        const otherConfig = {
+        // #ifdef MP-ALIPAY
+            fileType: config.fileType,
+            // #endif
+            filePath: config.filePath,
+            name: config.name
+        }
+        const optionalKeys = [
+        // #ifdef APP-PLUS || H5
+            'files',
+            // #endif
+            // #ifdef H5
+            'file',
+            // #endif
+            // #ifdef H5 || APP-PLUS
+            'timeout',
+            // #endif
+            'formData'
+        ]
+        requestTask = uni.uploadFile({ ..._config, ...otherConfig, ...mergeKeys(optionalKeys, config) })
+    } else if (config.method === 'DOWNLOAD') {
+        // #ifdef H5 || APP-PLUS
+        if (!isUndefined(config.timeout)) {
+            _config.timeout = config.timeout
+        }
+        // #endif
+        requestTask = uni.downloadFile(_config)
+    } else {
+        const optionalKeys = [
+            'data',
+            'method',
+            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+            'timeout',
+            // #endif
+            'dataType',
+            // #ifndef MP-ALIPAY
+            'responseType',
+            // #endif
+            // #ifdef APP-PLUS
+            'sslVerify',
+            // #endif
+            // #ifdef H5
+            'withCredentials',
+            // #endif
+            // #ifdef APP-PLUS
+            'firstIpv4'
+        // #endif
+        ]
+        requestTask = uni.request({ ..._config, ...mergeKeys(optionalKeys, config) })
+    }
+    if (config.getTask) {
+        config.getTask(requestTask, config)
+    }
+})
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/InterceptorManager.js b/uni_modules/wu-ui-tools/libs/luch-request/core/InterceptorManager.js
new file mode 100644
index 0000000..3e8728d
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/InterceptorManager.js
@@ -0,0 +1,50 @@
+'use strict'
+
+function InterceptorManager() {
+    this.handlers = []
+}
+
+/**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+InterceptorManager.prototype.use = function use(fulfilled, rejected) {
+    this.handlers.push({
+        fulfilled,
+        rejected
+    })
+    return this.handlers.length - 1
+}
+
+/**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ */
+InterceptorManager.prototype.eject = function eject(id) {
+    if (this.handlers[id]) {
+        this.handlers[id] = null
+    }
+}
+
+/**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ */
+InterceptorManager.prototype.forEach = function forEach(fn) {
+    this.handlers.forEach((h) => {
+        if (h !== null) {
+            fn(h)
+        }
+    })
+}
+
+export default InterceptorManager
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/Request.js b/uni_modules/wu-ui-tools/libs/luch-request/core/Request.js
new file mode 100644
index 0000000..cc48566
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/Request.js
@@ -0,0 +1,198 @@
+/**
+ * @Class Request
+ * @description luch-request http璇锋眰鎻掍欢
+ * @version 3.0.7
+ * @Author lu-ch
+ * @Date 2021-09-04
+ * @Email webwork.s@qq.com
+ * 鏂囨。: https://www.quanzhan.co/luch-request/
+ * github: https://github.com/lei-mu/luch-request
+ * DCloud: http://ext.dcloud.net.cn/plugin?id=392
+ * HBuilderX: beat-3.0.4 alpha-3.0.4
+ */
+
+import dispatchRequest from './dispatchRequest'
+import InterceptorManager from './InterceptorManager'
+import mergeConfig from './mergeConfig'
+import defaults from './defaults'
+import { isPlainObject } from '../utils'
+import clone from '../utils/clone'
+
+export default class Request {
+    /**
+   * @param {Object} arg - 鍏ㄥ眬閰嶇疆
+   * @param {String} arg.baseURL - 鍏ㄥ眬鏍硅矾寰�
+   * @param {Object} arg.header - 鍏ㄥ眬header
+   * @param {String} arg.method = [GET|POST|PUT|DELETE|CONNECT|HEAD|OPTIONS|TRACE] - 鍏ㄥ眬榛樿璇锋眰鏂瑰紡
+   * @param {String} arg.dataType = [json] - 鍏ㄥ眬榛樿鐨刣ataType
+   * @param {String} arg.responseType = [text|arraybuffer] - 鍏ㄥ眬榛樿鐨剅esponseType銆傛敮浠樺疂灏忕▼搴忎笉鏀寔
+   * @param {Object} arg.custom - 鍏ㄥ眬榛樿鐨勮嚜瀹氫箟鍙傛暟
+   * @param {Number} arg.timeout - 鍏ㄥ眬榛樿鐨勮秴鏃舵椂闂达紝鍗曚綅 ms銆傞粯璁�60000銆侶5(HBuilderX 2.9.9+)銆丄PP(HBuilderX 2.9.9+)銆佸井淇″皬绋嬪簭锛�2.10.0锛夈�佹敮浠樺疂灏忕▼搴�
+   * @param {Boolean} arg.sslVerify - 鍏ㄥ眬榛樿鐨勬槸鍚﹂獙璇� ssl 璇佷功銆傞粯璁rue.浠匒pp瀹夊崜绔敮鎸侊紙HBuilderX 2.3.3+锛�
+   * @param {Boolean} arg.withCredentials - 鍏ㄥ眬榛樿鐨勮法鍩熻姹傛椂鏄惁鎼哄甫鍑瘉锛坈ookies锛夈�傞粯璁alse銆備粎H5鏀寔锛圚BuilderX 2.6.15+锛�
+   * @param {Boolean} arg.firstIpv4 - 鍏―NS瑙f瀽鏃朵紭鍏堜娇鐢╥pv4銆傞粯璁alse銆備粎 App-Android 鏀寔 (HBuilderX 2.8.0+)
+   * @param {Function(statusCode):Boolean} arg.validateStatus - 鍏ㄥ眬榛樿鐨勮嚜瀹氫箟楠岃瘉鍣ㄣ�傞粯璁tatusCode >= 200 && statusCode < 300
+   */
+    constructor(arg = {}) {
+        if (!isPlainObject(arg)) {
+            arg = {}
+            console.warn('璁剧疆鍏ㄥ眬鍙傛暟蹇呴』鎺ユ敹涓�涓狾bject')
+        }
+        this.config = clone({ ...defaults, ...arg })
+        this.interceptors = {
+            request: new InterceptorManager(),
+            response: new InterceptorManager()
+        }
+    }
+
+    /**
+   * @Function
+   * @param {Request~setConfigCallback} f - 璁剧疆鍏ㄥ眬榛樿閰嶇疆
+   */
+    setConfig(f) {
+        this.config = f(this.config)
+    }
+
+    middleware(config) {
+        config = mergeConfig(this.config, config)
+        const chain = [dispatchRequest, undefined]
+        let promise = Promise.resolve(config)
+
+        this.interceptors.request.forEach((interceptor) => {
+            chain.unshift(interceptor.fulfilled, interceptor.rejected)
+        })
+
+        this.interceptors.response.forEach((interceptor) => {
+            chain.push(interceptor.fulfilled, interceptor.rejected)
+        })
+
+        while (chain.length) {
+            promise = promise.then(chain.shift(), chain.shift())
+        }
+
+        return promise
+    }
+
+    /**
+   * @Function
+   * @param {Object} config - 璇锋眰閰嶇疆椤�
+   * @prop {String} options.url - 璇锋眰璺緞
+   * @prop {Object} options.data - 璇锋眰鍙傛暟
+   * @prop {Object} [options.responseType = config.responseType] [text|arraybuffer] - 鍝嶅簲鐨勬暟鎹被鍨�
+   * @prop {Object} [options.dataType = config.dataType] - 濡傛灉璁句负 json锛屼細灏濊瘯瀵硅繑鍥炵殑鏁版嵁鍋氫竴娆� JSON.parse
+   * @prop {Object} [options.header = config.header] - 璇锋眰header
+   * @prop {Object} [options.method = config.method] - 璇锋眰鏂规硶
+   * @returns {Promise<unknown>}
+   */
+    request(config = {}) {
+        return this.middleware(config)
+    }
+
+    get(url, options = {}) {
+        return this.middleware({
+            url,
+            method: 'GET',
+            ...options
+        })
+    }
+
+    post(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'POST',
+            ...options
+        })
+    }
+
+    // #ifndef MP-ALIPAY
+    put(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'PUT',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+    delete(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'DELETE',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef H5 || MP-WEIXIN
+    connect(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'CONNECT',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef  H5 || MP-WEIXIN || MP-BAIDU
+    head(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'HEAD',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-BAIDU
+    options(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'OPTIONS',
+            ...options
+        })
+    }
+
+    // #endif
+
+    // #ifdef H5 || MP-WEIXIN
+    trace(url, data, options = {}) {
+        return this.middleware({
+            url,
+            data,
+            method: 'TRACE',
+            ...options
+        })
+    }
+
+    // #endif
+
+    upload(url, config = {}) {
+        config.url = url
+        config.method = 'UPLOAD'
+        return this.middleware(config)
+    }
+
+    download(url, config = {}) {
+        config.url = url
+        config.method = 'DOWNLOAD'
+        return this.middleware(config)
+    }
+}
+
+/**
+ * setConfig鍥炶皟
+ * @return {Object} - 杩斿洖鎿嶄綔鍚庣殑config
+ * @callback Request~setConfigCallback
+ * @param {Object} config - 鍏ㄥ眬榛樿config
+ */
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/buildFullPath.js b/uni_modules/wu-ui-tools/libs/luch-request/core/buildFullPath.js
new file mode 100644
index 0000000..5eb8a17
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/buildFullPath.js
@@ -0,0 +1,20 @@
+'use strict'
+
+import isAbsoluteURL from '../helpers/isAbsoluteURL'
+import combineURLs from '../helpers/combineURLs'
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ * @returns {string} The combined full path
+ */
+export default function buildFullPath(baseURL, requestedURL) {
+    if (baseURL && !isAbsoluteURL(requestedURL)) {
+        return combineURLs(baseURL, requestedURL)
+    }
+    return requestedURL
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/defaults.js b/uni_modules/wu-ui-tools/libs/luch-request/core/defaults.js
new file mode 100644
index 0000000..be375a9
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/defaults.js
@@ -0,0 +1,29 @@
+/**
+ * 榛樿鐨勫叏灞�閰嶇疆
+ */
+
+export default {
+    baseURL: '',
+    header: {},
+    method: 'GET',
+    dataType: 'json',
+    // #ifndef MP-ALIPAY
+    responseType: 'text',
+    // #endif
+    custom: {},
+    // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+    timeout: 60000,
+    // #endif
+    // #ifdef APP-PLUS
+    sslVerify: true,
+    // #endif
+    // #ifdef H5
+    withCredentials: false,
+    // #endif
+    // #ifdef APP-PLUS
+    firstIpv4: false,
+    // #endif
+    validateStatus: function validateStatus(status) {
+        return status >= 200 && status < 300
+    }
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/dispatchRequest.js b/uni_modules/wu-ui-tools/libs/luch-request/core/dispatchRequest.js
new file mode 100644
index 0000000..724545c
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/dispatchRequest.js
@@ -0,0 +1,3 @@
+import adapter from '../adapters/index'
+
+export default (config) => adapter(config)
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/mergeConfig.js b/uni_modules/wu-ui-tools/libs/luch-request/core/mergeConfig.js
new file mode 100644
index 0000000..08f8b9b
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/mergeConfig.js
@@ -0,0 +1,103 @@
+import { deepMerge, isUndefined } from '../utils'
+
+/**
+ * 鍚堝苟灞�閮ㄩ厤缃紭鍏堢殑閰嶇疆锛屽鏋滃眬閮ㄦ湁璇ラ厤缃」鍒欑敤灞�閮紝濡傛灉鍏ㄥ眬鏈夎閰嶇疆椤瑰垯鐢ㄥ叏灞�
+ * @param {Array} keys - 閰嶇疆椤�
+ * @param {Object} globalsConfig - 褰撳墠鐨勫叏灞�閰嶇疆
+ * @param {Object} config2 - 灞�閮ㄩ厤缃�
+ * @return {{}}
+ */
+const mergeKeys = (keys, globalsConfig, config2) => {
+    const config = {}
+    keys.forEach((prop) => {
+        if (!isUndefined(config2[prop])) {
+            config[prop] = config2[prop]
+        } else if (!isUndefined(globalsConfig[prop])) {
+            config[prop] = globalsConfig[prop]
+        }
+    })
+    return config
+}
+/**
+ *
+ * @param globalsConfig - 褰撳墠瀹炰緥鐨勫叏灞�閰嶇疆
+ * @param config2 - 褰撳墠鐨勫眬閮ㄩ厤缃�
+ * @return - 鍚堝苟鍚庣殑閰嶇疆
+ */
+export default (globalsConfig, config2 = {}) => {
+    const method = config2.method || globalsConfig.method || 'GET'
+    let config = {
+        baseURL: globalsConfig.baseURL || '',
+        method,
+        url: config2.url || '',
+        params: config2.params || {},
+        custom: { ...(globalsConfig.custom || {}), ...(config2.custom || {}) },
+        header: deepMerge(globalsConfig.header || {}, config2.header || {})
+    }
+    const defaultToConfig2Keys = ['getTask', 'validateStatus']
+    config = { ...config, ...mergeKeys(defaultToConfig2Keys, globalsConfig, config2) }
+
+    // eslint-disable-next-line no-empty
+    if (method === 'DOWNLOAD') {
+    // #ifdef H5 || APP-PLUS
+        if (!isUndefined(config2.timeout)) {
+            config.timeout = config2.timeout
+        } else if (!isUndefined(globalsConfig.timeout)) {
+            config.timeout = globalsConfig.timeout
+        }
+    // #endif
+    } else if (method === 'UPLOAD') {
+        delete config.header['content-type']
+        delete config.header['Content-Type']
+        const uploadKeys = [
+            // #ifdef APP-PLUS || H5
+            'files',
+            // #endif
+            // #ifdef MP-ALIPAY
+            'fileType',
+            // #endif
+            // #ifdef H5
+            'file',
+            // #endif
+            'filePath',
+            'name',
+            // #ifdef H5 || APP-PLUS
+            'timeout',
+            // #endif
+            'formData'
+        ]
+        uploadKeys.forEach((prop) => {
+            if (!isUndefined(config2[prop])) {
+                config[prop] = config2[prop]
+            }
+        })
+        // #ifdef H5 || APP-PLUS
+        if (isUndefined(config.timeout) && !isUndefined(globalsConfig.timeout)) {
+            config.timeout = globalsConfig.timeout
+        }
+    // #endif
+    } else {
+        const defaultsKeys = [
+            'data',
+            // #ifdef H5 || APP-PLUS || MP-ALIPAY || MP-WEIXIN
+            'timeout',
+            // #endif
+            'dataType',
+            // #ifndef MP-ALIPAY
+            'responseType',
+            // #endif
+            // #ifdef APP-PLUS
+            'sslVerify',
+            // #endif
+            // #ifdef H5
+            'withCredentials',
+            // #endif
+            // #ifdef APP-PLUS
+            'firstIpv4'
+            // #endif
+        ]
+        config = { ...config, ...mergeKeys(defaultsKeys, globalsConfig, config2) }
+    }
+
+    return config
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/core/settle.js b/uni_modules/wu-ui-tools/libs/luch-request/core/settle.js
new file mode 100644
index 0000000..8d3638f
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/core/settle.js
@@ -0,0 +1,16 @@
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ */
+export default function settle(resolve, reject, response) {
+    const { validateStatus } = response.config
+    const status = response.statusCode
+    if (status && (!validateStatus || validateStatus(status))) {
+        resolve(response)
+    } else {
+        reject(response)
+    }
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/helpers/buildURL.js b/uni_modules/wu-ui-tools/libs/luch-request/helpers/buildURL.js
new file mode 100644
index 0000000..472ad6a
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/helpers/buildURL.js
@@ -0,0 +1,69 @@
+'use strict'
+
+import * as utils from '../utils'
+
+function encode(val) {
+    return encodeURIComponent(val)
+        .replace(/%40/gi, '@')
+        .replace(/%3A/gi, ':')
+        .replace(/%24/g, '$')
+        .replace(/%2C/gi, ',')
+        .replace(/%20/g, '+')
+        .replace(/%5B/gi, '[')
+        .replace(/%5D/gi, ']')
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @returns {string} The formatted url
+ */
+export default function buildURL(url, params) {
+    /* eslint no-param-reassign:0 */
+    if (!params) {
+        return url
+    }
+
+    let serializedParams
+    if (utils.isURLSearchParams(params)) {
+        serializedParams = params.toString()
+    } else {
+        const parts = []
+
+        utils.forEach(params, (val, key) => {
+            if (val === null || typeof val === 'undefined') {
+                return
+            }
+
+            if (utils.isArray(val)) {
+                key = `${key}[]`
+            } else {
+                val = [val]
+            }
+
+            utils.forEach(val, (v) => {
+                if (utils.isDate(v)) {
+                    v = v.toISOString()
+                } else if (utils.isObject(v)) {
+                    v = JSON.stringify(v)
+                }
+                parts.push(`${encode(key)}=${encode(v)}`)
+            })
+        })
+
+        serializedParams = parts.join('&')
+    }
+
+    if (serializedParams) {
+        const hashmarkIndex = url.indexOf('#')
+        if (hashmarkIndex !== -1) {
+            url = url.slice(0, hashmarkIndex)
+        }
+
+        url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams
+    }
+
+    return url
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/helpers/combineURLs.js b/uni_modules/wu-ui-tools/libs/luch-request/helpers/combineURLs.js
new file mode 100644
index 0000000..ac7c124
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/helpers/combineURLs.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ * @returns {string} The combined URL
+ */
+export default function combineURLs(baseURL, relativeURL) {
+    return relativeURL
+        ? `${baseURL.replace(/\/+$/, '')}/${relativeURL.replace(/^\/+/, '')}`
+        : baseURL
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js b/uni_modules/wu-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js
new file mode 100644
index 0000000..63c6647
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/helpers/isAbsoluteURL.js
@@ -0,0 +1,14 @@
+'use strict'
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+export default function isAbsoluteURL(url) {
+    // A URL is considered absolute if it begins with "<scheme>://" or "//" (protocol-relative URL).
+    // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+    // by any combination of letters, digits, plus, period, or hyphen.
+    return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/index.d.ts b/uni_modules/wu-ui-tools/libs/luch-request/index.d.ts
new file mode 100644
index 0000000..e939ce1
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/index.d.ts
@@ -0,0 +1,116 @@
+type AnyObject = Record<string | number | symbol, any>
+type HttpPromise<T> = Promise<HttpResponse<T>>;
+type Tasks = UniApp.RequestTask | UniApp.UploadTask | UniApp.DownloadTask
+export interface RequestTask {
+  abort: () => void;
+  offHeadersReceived: () => void;
+  onHeadersReceived: () => void;
+}
+export interface HttpRequestConfig<T = Tasks> {
+  /** 璇锋眰鍩哄湴鍧� */
+  baseURL?: string;
+  /** 璇锋眰鏈嶅姟鍣ㄦ帴鍙e湴鍧� */
+  url?: string;
+
+  /** 璇锋眰鏌ヨ鍙傛暟锛岃嚜鍔ㄦ嫾鎺ヤ负鏌ヨ瀛楃涓� */
+  params?: AnyObject;
+  /** 璇锋眰浣撳弬鏁� */
+  data?: AnyObject;
+
+  /** 鏂囦欢瀵瑰簲鐨� key */
+  name?: string;
+  /** HTTP 璇锋眰涓叾浠栭澶栫殑 form data */
+  formData?: AnyObject;
+  /** 瑕佷笂浼犳枃浠惰祫婧愮殑璺緞銆� */
+  filePath?: string;
+  /** 闇�瑕佷笂浼犵殑鏂囦欢鍒楄〃銆備娇鐢� files 鏃讹紝filePath 鍜� name 涓嶇敓鏁堬紝App銆丠5锛� 2.6.15+锛� */
+  files?: Array<{
+    name?: string;
+    file?: File;
+    uri: string;
+  }>;
+  /** 瑕佷笂浼犵殑鏂囦欢瀵硅薄锛屼粎H5锛�2.6.15+锛夋敮鎸� */
+  file?: File;
+
+  /** 璇锋眰澶翠俊鎭� */
+  header?: AnyObject;
+  /** 璇锋眰鏂瑰紡 */
+  method?: "GET" | "POST" | "PUT" | "DELETE" | "CONNECT" | "HEAD" | "OPTIONS" | "TRACE" | "UPLOAD" | "DOWNLOAD";
+  /** 濡傛灉璁句负 json锛屼細灏濊瘯瀵硅繑鍥炵殑鏁版嵁鍋氫竴娆� JSON.parse */
+  dataType?: string;
+  /** 璁剧疆鍝嶅簲鐨勬暟鎹被鍨嬶紝鏀粯瀹濆皬绋嬪簭涓嶆敮鎸� */
+  responseType?: "text" | "arraybuffer";
+  /** 鑷畾涔夊弬鏁� */
+  custom?: AnyObject;
+  /** 瓒呮椂鏃堕棿锛屼粎寰俊灏忕▼搴忥紙2.10.0锛夈�佹敮浠樺疂灏忕▼搴忔敮鎸� */
+  timeout?: number;
+  /** DNS瑙f瀽鏃朵紭鍏堜娇鐢╥pv4锛屼粎 App-Android 鏀寔 (HBuilderX 2.8.0+) */
+  firstIpv4?: boolean;
+  /** 楠岃瘉 ssl 璇佷功 浠�5+App瀹夊崜绔敮鎸侊紙HBuilderX 2.3.3+锛� */
+  sslVerify?: boolean;
+  /** 璺ㄥ煙璇锋眰鏃舵槸鍚︽惡甯﹀嚟璇侊紙cookies锛変粎H5鏀寔锛圚BuilderX 2.6.15+锛� */
+  withCredentials?: boolean;
+
+  /** 杩斿洖褰撳墠璇锋眰鐨則ask, options銆傝鍕垮湪姝ゅ淇敼options銆� */
+  getTask?: (task: T, options: HttpRequestConfig<T>) => void;
+  /**  鍏ㄥ眬鑷畾涔夐獙璇佸櫒 */
+  validateStatus?: (statusCode: number) => boolean | void;
+}
+export interface HttpResponse<T = any> {
+  config: HttpRequestConfig;
+  statusCode: number;
+  cookies: Array<string>;
+  data: T;
+  errMsg: string;
+  header: AnyObject;
+}
+export interface HttpUploadResponse<T = any> {
+  config: HttpRequestConfig;
+  statusCode: number;
+  data: T;
+  errMsg: string;
+}
+export interface HttpDownloadResponse extends HttpResponse {
+  tempFilePath: string;
+}
+export interface HttpError {
+  config: HttpRequestConfig;
+  statusCode?: number;
+  cookies?: Array<string>;
+  data?: any;
+  errMsg: string;
+  header?: AnyObject;
+}
+export interface HttpInterceptorManager<V, E = V> {
+  use(
+    onFulfilled?: (config: V) => Promise<V> | V,
+    onRejected?: (config: E) => Promise<E> | E
+  ): void;
+  eject(id: number): void;
+}
+export abstract class HttpRequestAbstract {
+  constructor(config?: HttpRequestConfig);
+  config: HttpRequestConfig;
+  interceptors: {
+    request: HttpInterceptorManager<HttpRequestConfig, HttpRequestConfig>;
+    response: HttpInterceptorManager<HttpResponse, HttpError>;
+  }
+  middleware<T = any>(config: HttpRequestConfig): HttpPromise<T>;
+  request<T = any>(config: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  get<T = any>(url: string, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  upload<T = any>(url: string, config?: HttpRequestConfig<UniApp.UploadTask>): HttpPromise<T>;
+  delete<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  head<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  post<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  put<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  connect<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  options<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+  trace<T = any>(url: string, data?: AnyObject, config?: HttpRequestConfig<UniApp.RequestTask>): HttpPromise<T>;
+
+  download(url: string, config?: HttpRequestConfig<UniApp.DownloadTask>): Promise<HttpDownloadResponse>;
+
+  setConfig(onSend: (config: HttpRequestConfig) => HttpRequestConfig): void;
+}
+
+declare class HttpRequest extends HttpRequestAbstract { }
+export default HttpRequest;
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/index.js b/uni_modules/wu-ui-tools/libs/luch-request/index.js
new file mode 100644
index 0000000..8fb2b44
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/index.js
@@ -0,0 +1,3 @@
+import Request from './core/Request'
+
+export default Request
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/utils.js b/uni_modules/wu-ui-tools/libs/luch-request/utils.js
new file mode 100644
index 0000000..847283d
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/utils.js
@@ -0,0 +1,131 @@
+'use strict'
+
+// utils is a library of generic helper functions non-specific to axios
+
+const { toString } = Object.prototype
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+export function isArray(val) {
+    return toString.call(val) === '[object Array]'
+}
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+export function isObject(val) {
+    return val !== null && typeof val === 'object'
+}
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+export function isDate(val) {
+    return toString.call(val) === '[object Date]'
+}
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {Object} val The value to test
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+export function isURLSearchParams(val) {
+    return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams
+}
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ */
+export function forEach(obj, fn) {
+    // Don't bother if no value provided
+    if (obj === null || typeof obj === 'undefined') {
+        return
+    }
+
+    // Force an array if not already something iterable
+    if (typeof obj !== 'object') {
+    /* eslint no-param-reassign:0 */
+        obj = [obj]
+    }
+
+    if (isArray(obj)) {
+    // Iterate over array values
+        for (let i = 0, l = obj.length; i < l; i++) {
+            fn.call(null, obj[i], i, obj)
+        }
+    } else {
+    // Iterate over object keys
+        for (const key in obj) {
+            if (Object.prototype.hasOwnProperty.call(obj, key)) {
+                fn.call(null, obj[key], key, obj)
+            }
+        }
+    }
+}
+
+/**
+ * 鏄惁涓篵oolean 鍊�
+ * @param val
+ * @returns {boolean}
+ */
+export function isBoolean(val) {
+    return typeof val === 'boolean'
+}
+
+/**
+ * 鏄惁涓虹湡姝g殑瀵硅薄{} new Object
+ * @param {any} obj - 妫�娴嬬殑瀵硅薄
+ * @returns {boolean}
+ */
+export function isPlainObject(obj) {
+    return Object.prototype.toString.call(obj) === '[object Object]'
+}
+
+/**
+ * Function equal to merge with the difference being that no reference
+ * to original objects is kept.
+ *
+ * @see merge
+ * @param {Object} obj1 Object to merge
+ * @returns {Object} Result of all merge properties
+ */
+export function deepMerge(/* obj1, obj2, obj3, ... */) {
+    const result = {}
+    function assignValue(val, key) {
+        if (typeof result[key] === 'object' && typeof val === 'object') {
+            result[key] = deepMerge(result[key], val)
+        } else if (typeof val === 'object') {
+            result[key] = deepMerge({}, val)
+        } else {
+            result[key] = val
+        }
+    }
+    for (let i = 0, l = arguments.length; i < l; i++) {
+        forEach(arguments[i], assignValue)
+    }
+    return result
+}
+
+export function isUndefined(val) {
+    return typeof val === 'undefined'
+}
diff --git a/uni_modules/wu-ui-tools/libs/luch-request/utils/clone.js b/uni_modules/wu-ui-tools/libs/luch-request/utils/clone.js
new file mode 100644
index 0000000..2fee704
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/luch-request/utils/clone.js
@@ -0,0 +1,264 @@
+/* eslint-disable */
+var clone = (function() {
+  'use strict';
+
+  function _instanceof(obj, type) {
+    return type != null && obj instanceof type;
+  }
+
+  var nativeMap;
+  try {
+    nativeMap = Map;
+  } catch(_) {
+    // maybe a reference error because no `Map`. Give it a dummy value that no
+    // value will ever be an instanceof.
+    nativeMap = function() {};
+  }
+
+  var nativeSet;
+  try {
+    nativeSet = Set;
+  } catch(_) {
+    nativeSet = function() {};
+  }
+
+  var nativePromise;
+  try {
+    nativePromise = Promise;
+  } catch(_) {
+    nativePromise = function() {};
+  }
+
+  /**
+   * Clones (copies) an Object using deep copying.
+   *
+   * This function supports circular references by default, but if you are certain
+   * there are no circular references in your object, you can save some CPU time
+   * by calling clone(obj, false).
+   *
+   * Caution: if `circular` is false and `parent` contains circular references,
+   * your program may enter an infinite loop and crash.
+   *
+   * @param `parent` - the object to be cloned
+   * @param `circular` - set to true if the object to be cloned may contain
+   *    circular references. (optional - true by default)
+   * @param `depth` - set to a number if the object is only to be cloned to
+   *    a particular depth. (optional - defaults to Infinity)
+   * @param `prototype` - sets the prototype to be used when cloning an object.
+   *    (optional - defaults to parent prototype).
+   * @param `includeNonEnumerable` - set to true if the non-enumerable properties
+   *    should be cloned as well. Non-enumerable properties on the prototype
+   *    chain will be ignored. (optional - false by default)
+   */
+  function clone(parent, circular, depth, prototype, includeNonEnumerable) {
+    if (typeof circular === 'object') {
+      depth = circular.depth;
+      prototype = circular.prototype;
+      includeNonEnumerable = circular.includeNonEnumerable;
+      circular = circular.circular;
+    }
+    // maintain two arrays for circular references, where corresponding parents
+    // and children have the same index
+    var allParents = [];
+    var allChildren = [];
+
+    var useBuffer = typeof Buffer != 'undefined';
+
+    if (typeof circular == 'undefined')
+      circular = true;
+
+    if (typeof depth == 'undefined')
+      depth = Infinity;
+
+    // recurse this function so we don't reset allParents and allChildren
+    function _clone(parent, depth) {
+      // cloning null always returns null
+      if (parent === null)
+        return null;
+
+      if (depth === 0)
+        return parent;
+
+      var child;
+      var proto;
+      if (typeof parent != 'object') {
+        return parent;
+      }
+
+      if (_instanceof(parent, nativeMap)) {
+        child = new nativeMap();
+      } else if (_instanceof(parent, nativeSet)) {
+        child = new nativeSet();
+      } else if (_instanceof(parent, nativePromise)) {
+        child = new nativePromise(function (resolve, reject) {
+          parent.then(function(value) {
+            resolve(_clone(value, depth - 1));
+          }, function(err) {
+            reject(_clone(err, depth - 1));
+          });
+        });
+      } else if (clone.__isArray(parent)) {
+        child = [];
+      } else if (clone.__isRegExp(parent)) {
+        child = new RegExp(parent.source, __getRegExpFlags(parent));
+        if (parent.lastIndex) child.lastIndex = parent.lastIndex;
+      } else if (clone.__isDate(parent)) {
+        child = new Date(parent.getTime());
+      } else if (useBuffer && Buffer.isBuffer(parent)) {
+        if (Buffer.from) {
+          // Node.js >= 5.10.0
+          child = Buffer.from(parent);
+        } else {
+          // Older Node.js versions
+          child = new Buffer(parent.length);
+          parent.copy(child);
+        }
+        return child;
+      } else if (_instanceof(parent, Error)) {
+        child = Object.create(parent);
+      } else {
+        if (typeof prototype == 'undefined') {
+          proto = Object.getPrototypeOf(parent);
+          child = Object.create(proto);
+        }
+        else {
+          child = Object.create(prototype);
+          proto = prototype;
+        }
+      }
+
+      if (circular) {
+        var index = allParents.indexOf(parent);
+
+        if (index != -1) {
+          return allChildren[index];
+        }
+        allParents.push(parent);
+        allChildren.push(child);
+      }
+
+      if (_instanceof(parent, nativeMap)) {
+        parent.forEach(function(value, key) {
+          var keyChild = _clone(key, depth - 1);
+          var valueChild = _clone(value, depth - 1);
+          child.set(keyChild, valueChild);
+        });
+      }
+      if (_instanceof(parent, nativeSet)) {
+        parent.forEach(function(value) {
+          var entryChild = _clone(value, depth - 1);
+          child.add(entryChild);
+        });
+      }
+
+      for (var i in parent) {
+        var attrs = Object.getOwnPropertyDescriptor(parent, i);
+        if (attrs) {
+          child[i] = _clone(parent[i], depth - 1);
+        }
+
+        try {
+          var objProperty = Object.getOwnPropertyDescriptor(parent, i);
+          if (objProperty.set === 'undefined') {
+            // no setter defined. Skip cloning this property
+            continue;
+          }
+          child[i] = _clone(parent[i], depth - 1);
+        } catch(e){
+          if (e instanceof TypeError) {
+            // when in strict mode, TypeError will be thrown if child[i] property only has a getter
+            // we can't do anything about this, other than inform the user that this property cannot be set.
+            continue
+          } else if (e instanceof ReferenceError) {
+            //this may happen in non strict mode
+            continue
+          }
+        }
+
+      }
+
+      if (Object.getOwnPropertySymbols) {
+        var symbols = Object.getOwnPropertySymbols(parent);
+        for (var i = 0; i < symbols.length; i++) {
+          // Don't need to worry about cloning a symbol because it is a primitive,
+          // like a number or string.
+          var symbol = symbols[i];
+          var descriptor = Object.getOwnPropertyDescriptor(parent, symbol);
+          if (descriptor && !descriptor.enumerable && !includeNonEnumerable) {
+            continue;
+          }
+          child[symbol] = _clone(parent[symbol], depth - 1);
+          Object.defineProperty(child, symbol, descriptor);
+        }
+      }
+
+      if (includeNonEnumerable) {
+        var allPropertyNames = Object.getOwnPropertyNames(parent);
+        for (var i = 0; i < allPropertyNames.length; i++) {
+          var propertyName = allPropertyNames[i];
+          var descriptor = Object.getOwnPropertyDescriptor(parent, propertyName);
+          if (descriptor && descriptor.enumerable) {
+            continue;
+          }
+          child[propertyName] = _clone(parent[propertyName], depth - 1);
+          Object.defineProperty(child, propertyName, descriptor);
+        }
+      }
+
+      return child;
+    }
+
+    return _clone(parent, depth);
+  }
+
+  /**
+   * Simple flat clone using prototype, accepts only objects, usefull for property
+   * override on FLAT configuration object (no nested props).
+   *
+   * USE WITH CAUTION! This may not behave as you wish if you do not know how this
+   * works.
+   */
+  clone.clonePrototype = function clonePrototype(parent) {
+    if (parent === null)
+      return null;
+
+    var c = function () {};
+    c.prototype = parent;
+    return new c();
+  };
+
+// private utility functions
+
+  function __objToStr(o) {
+    return Object.prototype.toString.call(o);
+  }
+  clone.__objToStr = __objToStr;
+
+  function __isDate(o) {
+    return typeof o === 'object' && __objToStr(o) === '[object Date]';
+  }
+  clone.__isDate = __isDate;
+
+  function __isArray(o) {
+    return typeof o === 'object' && __objToStr(o) === '[object Array]';
+  }
+  clone.__isArray = __isArray;
+
+  function __isRegExp(o) {
+    return typeof o === 'object' && __objToStr(o) === '[object RegExp]';
+  }
+  clone.__isRegExp = __isRegExp;
+
+  function __getRegExpFlags(re) {
+    var flags = '';
+    if (re.global) flags += 'g';
+    if (re.ignoreCase) flags += 'i';
+    if (re.multiline) flags += 'm';
+    return flags;
+  }
+  clone.__getRegExpFlags = __getRegExpFlags;
+
+  return clone;
+})();
+
+export default clone
diff --git a/uni_modules/wu-ui-tools/libs/mixin/button.js b/uni_modules/wu-ui-tools/libs/mixin/button.js
new file mode 100644
index 0000000..0c019c2
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/mixin/button.js
@@ -0,0 +1,13 @@
+export default {
+    props: {
+        lang: String,
+        sessionFrom: String,
+        sendMessageTitle: String,
+        sendMessagePath: String,
+        sendMessageImg: String,
+        showMessageCard: Boolean,
+        appParameter: String,
+        formType: String,
+        openType: String
+    }
+}
diff --git a/uni_modules/wu-ui-tools/libs/mixin/mixin.js b/uni_modules/wu-ui-tools/libs/mixin/mixin.js
new file mode 100644
index 0000000..217f534
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/mixin/mixin.js
@@ -0,0 +1,188 @@
+import * as index from '../function/index.js';
+import * as test from '../function/test.js';
+
+export default {
+	// 瀹氫箟姣忎釜缁勪欢閮藉彲鑳介渶瑕佺敤鍒扮殑澶栭儴鏍峰紡浠ュ強绫诲悕
+	props: {
+		// 姣忎釜缁勪欢閮芥湁鐨勭埗缁勪欢浼犻�掔殑鏍峰紡锛屽彲浠ヤ负瀛楃涓叉垨鑰呭璞″舰寮�
+		customStyle: {
+			type: [Object, String],
+			default: () => ({})
+		},
+		customClass: {
+			type: String,
+			default: ''
+		},
+		// 璺宠浆鐨勯〉闈㈣矾寰�
+		url: {
+			type: String,
+			default: ''
+		},
+		// 椤甸潰璺宠浆鐨勭被鍨�
+		linkType: {
+			type: String,
+			default: 'navigateTo'
+		}
+	},
+	data() {
+		return {}
+	},
+	onLoad() {
+		// getRect鎸傝浇鍒�$w涓婏紝鍥犱负杩欐柟娉曢渶瑕佷娇鐢╥n(this)锛屾墍浠ユ棤娉曟妸瀹冪嫭绔嬫垚涓�涓崟鐙殑鏂囦欢瀵煎嚭
+		this.$w.getRect = this.$wuGetRect;
+	},
+	created() {
+		// 缁勪欢褰撲腑锛屽彧鏈塩reated澹版槑鍛ㄦ湡锛屼负浜嗚兘鍦ㄧ粍浠朵娇鐢紝鏁呬篃鍦╟reated涓皢鏂规硶鎸傝浇鍒�$w
+		this.$w.getRect = this.$wuGetRect;
+	},
+	computed: {
+		$w() {
+			return {
+				...index,
+				test
+			}
+		},
+		/**
+		 * 鐢熸垚bem瑙勫垯绫诲悕
+		 * 鐢变簬寰俊灏忕▼搴忥紝H5锛宯vue涔嬮棿缁戝畾class鐨勫樊寮傦紝鏃犳硶閫氳繃:class="[bem()]"鐨勫舰寮忚繘琛屽悓鐢�
+		 * 鏁呴噰鐢ㄥ涓嬫姌涓仛娉曪紝鏈�鍚庤繑鍥炵殑鏄暟缁勶紙涓�鑸钩鍙帮級鎴栧瓧绗︿覆锛堟敮浠樺疂鍜屽瓧鑺傝烦鍔ㄥ钩鍙帮級锛岀被浼糩'a', 'b', 'c']鎴�'a b c'鐨勫舰寮�
+		 * @param {String} name 缁勪欢鍚嶇О
+		 * @param {Array} fixed 涓�鐩翠細瀛樺湪鐨勭被鍚�
+		 * @param {Array} change 浼氭牴鎹彉閲忓�间负true鎴栬�協alse鑰屽嚭鐜版垨鑰呴殣钘忕殑绫诲悕
+		 * @returns {Array|string}
+		 */
+		bem() {
+			return function(name, fixed, change) {
+				// 绫诲悕鍓嶇紑
+				const prefix = `wu-${name}--`
+				const classes = {}
+				if (fixed) {
+					fixed.map((item) => {
+						// 杩欓噷鐨勭被鍚嶏紝浼氫竴鐩村瓨鍦�
+						classes[prefix + this[item]] = true
+					})
+				}
+				if (change) {
+					change.map((item) => {
+						// 杩欓噷鐨勭被鍚嶏紝浼氭牴鎹畉his[item]鐨勫�间负true鎴栬�協alse锛岃�岃繘琛屾坊鍔犳垨鑰呯Щ闄ゆ煇涓�涓被
+						this[item] ? (classes[prefix + item] = this[item]) : (delete classes[prefix + item])
+					})
+				}
+				return Object.keys(classes)
+					// 鏀粯瀹濓紝澶存潯灏忕▼搴忔棤娉曞姩鎬佺粦瀹氫竴涓暟缁勭被鍚嶏紝鍚﹀垯瑙f瀽鍑烘潵鐨勭粨鏋滀細甯︽湁","锛岃�屽鑷村け鏁�
+					// #ifdef MP-ALIPAY || MP-TOUTIAO || MP-LARK || MP-BAIDU
+					.join(' ')
+				// #endif
+			}
+		}
+	},
+	methods: {
+		// 璺宠浆鏌愪竴涓〉闈�
+		openPage(urlKey = 'url') {
+			const url = this[urlKey]
+			if (url) {
+				// 鎵ц绫讳技uni.navigateTo鐨勬柟娉�
+				uni[this.linkType]({
+					url
+				})
+			}
+		},
+		// 鏌ヨ鑺傜偣淇℃伅
+		// 鐩墠姝ゆ柟娉曞湪鏀粯瀹濆皬绋嬪簭涓棤娉曡幏鍙栫粍浠惰窡鎺ョ偣鐨勫昂瀵革紝涓烘敮浠樺疂鐨刡ug(2020-07-21)
+		// 瑙e喅鍔炴硶涓哄湪缁勪欢鏍归儴鍐嶅涓�涓病鏈変换浣曚綔鐢ㄧ殑view鍏冪礌
+		$wuGetRect(selector, all) {
+			return new Promise((resolve) => {
+				uni.createSelectorQuery()
+					.in(this)[all ? 'selectAll' : 'select'](selector)
+					.boundingClientRect((rect) => {
+						if (all && Array.isArray(rect) && rect.length) {
+							resolve(rect)
+						}
+						if (!all && rect) {
+							resolve(rect)
+						}
+					})
+					.exec()
+			})
+		},
+		// 鏌ヨ鑺傜偣甯冨眬鏄惁鐩镐氦
+		IntersectionObserver(_this, nodeName, callback) {
+			this.$nextTick(() => {
+				// #ifndef APP-NVUE || H5
+				let intersectionObserver = uni.createIntersectionObserver(_this)
+				intersectionObserver.relativeToViewport({
+					bottom: Number(this.lazyLoadRootMargin)
+				}).observe(nodeName, res => {
+					callback(res, ()=>intersectionObserver.disconnect());
+				})
+				// #endif
+				// #ifdef H5
+				if (!window.__wu_observedComponents) window.__wu_observedComponents = new Map(); // 鐢ㄤ簬瀛樺偍鍏冪礌鍙婂叾瀵瑰簲鐨勫洖璋冨嚱鏁�
+				if (!window.__wu_IntersectionObserver) {
+					window.__wu_IntersectionObserver = new IntersectionObserver((entries) => {
+						entries.forEach(entry => {
+							const callback = window.__wu_observedComponents.get(entry.target);
+							if (callback) {
+								callback(entry, ()=>{
+									window.__wu_IntersectionObserver.unobserve(entry.target);
+									window.__wu_observedComponents.delete(entry.target);
+								});
+							}
+						});
+					}, {
+						root: null,
+						rootMargin: Number(this.lazyLoadRootMargin) + 'px',
+						threshold: 0
+					});
+				}
+				window.__wu_observedComponents.set(_this.$el, callback);
+				window.__wu_IntersectionObserver.observe(_this.$el)
+				// #endif
+			})
+		},
+		getParentData(parentName = '') {
+			// 閬垮厤鍦╟reated涓幓瀹氫箟parent鍙橀噺
+			if (!this.parent) this.parent = {}
+			// 杩欓噷鐨勬湰璐ㄥ師鐞嗘槸锛岄�氳繃鑾峰彇鐖剁粍浠跺疄渚�(涔熷嵆绫讳技wu-radio鐨勭埗缁勪欢wu-radio-group鐨則his)
+			// 灏嗙埗缁勪欢this涓搴旂殑鍙傛暟锛岃祴鍊肩粰鏈粍浠�(wu-radio鐨則his)鐨刾arentData瀵硅薄涓搴旂殑灞炴��
+			// 涔嬫墍浠ラ渶瑕佽繖涔堝仛锛屾槸鍥犱负鎵�鏈夌涓紝澶存潯灏忕▼搴忎笉鏀寔閫氳繃this.parent.xxx鍘荤洃鍚埗缁勪欢鍙傛暟鐨勫彉鍖�
+			// 姝ゅ骞朵笉浼氳嚜鍔ㄦ洿鏂板瓙缁勪欢鐨勬暟鎹紝鑰屾槸渚濊禆鐖剁粍浠秝u-radio-group鍘荤洃鍚琩ata鐨勫彉鍖栵紝鎵嬪姩璋冪敤鏇存柊瀛愮粍浠剁殑鏂规硶鍘婚噸鏂拌幏鍙�
+			this.parent = this.$w.$parent.call(this, parentName)
+			if (this.parent.children) {
+				// 濡傛灉鐖剁粍浠剁殑children涓嶅瓨鍦ㄦ湰缁勪欢鐨勫疄渚嬶紝鎵嶅皢鏈疄渚嬫坊鍔犲埌鐖剁粍浠剁殑children涓�
+				this.parent.children.indexOf(this) === -1 && this.parent.children.push(this)
+			}
+			if (this.parent && this.parentData) {
+				// 鍘嗛亶parentData涓殑灞炴�э紝灏唒arent涓殑鍚屽悕灞炴�ц祴鍊肩粰parentData
+				Object.keys(this.parentData).map((key) => {
+					this.parentData[key] = this.parent[key]
+				})
+			}
+		},
+		// 闃绘浜嬩欢鍐掓场
+		preventEvent(e) {
+			e && typeof(e.stopPropagation) === 'function' && e.stopPropagation()
+		},
+		// 绌烘搷浣�
+		noop(e) {
+			this.preventEvent(e)
+		}
+	},
+	onReachBottom() {
+		uni.$emit('wuOnReachBottom')
+	},
+	beforeDestroy() {
+		// 鍒ゆ柇褰撳墠椤甸潰鏄惁瀛樺湪parent鍜宑hldren锛屼竴鑸湪checkbox鍜宑heckbox-group鐖跺瓙鑱斿姩鐨勫満鏅細鏈夋鎯呭喌
+		// 缁勪欢閿�姣佹椂锛岀Щ闄ゅ瓙缁勪欢鍦ㄧ埗缁勪欢children鏁扮粍涓殑瀹炰緥锛岄噴鏀捐祫婧愶紝閬垮厤鏁版嵁娣蜂贡
+		if (this.parent && test.array(this.parent.children)) {
+			// 缁勪欢閿�姣佹椂锛岀Щ闄ょ埗缁勪欢涓殑children鏁扮粍涓搴旂殑瀹炰緥
+			const childrenList = this.parent.children
+			childrenList.map((child, index) => {
+				// 濡傛灉鐩哥瓑锛屽垯绉婚櫎
+				if (child === this) {
+					childrenList.splice(index, 1)
+				}
+			})
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js b/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js
new file mode 100644
index 0000000..90b6903
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/mixin/mpMixin.js
@@ -0,0 +1,8 @@
+export default {
+    // #ifdef MP-WEIXIN
+    // 灏嗚嚜瀹氫箟鑺傜偣璁剧疆鎴愯櫄鎷熺殑锛堝幓鎺夎嚜瀹氫箟缁勪欢鍖呰9灞傦級锛屾洿鍔犳帴杩慥ue缁勪欢鐨勮〃鐜帮紝鑳芥洿濂界殑浣跨敤flex灞炴��
+    options: {
+        virtualHost: true
+    }
+    // #endif
+}
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/mixin/mpShare.js b/uni_modules/wu-ui-tools/libs/mixin/mpShare.js
new file mode 100644
index 0000000..0c5e959
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/mixin/mpShare.js
@@ -0,0 +1,13 @@
+export default {
+	onLoad() {
+	    // 璁剧疆榛樿鐨勮浆鍙戝弬鏁�
+	    uni.$wu.mpShare = {
+	        title: '', // 榛樿涓哄皬绋嬪簭鍚嶇О
+	        path: '', // 榛樿涓哄綋鍓嶉〉闈㈣矾寰�
+	        imageUrl: '' // 榛樿涓哄綋鍓嶉〉闈㈢殑鎴浘
+	    }
+	},
+	onShareAppMessage() {
+	    return uni.$wu.mpShare
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/libs/mixin/openType.js b/uni_modules/wu-ui-tools/libs/mixin/openType.js
new file mode 100644
index 0000000..e6ffe3d
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/mixin/openType.js
@@ -0,0 +1,44 @@
+export default {
+    props: {
+        openType: String
+    },
+		emits: ['getphonenumber','getuserinfo','error','opensetting','launchapp','contact','chooseavatar','addgroupapp','chooseaddress','subscribe','login','im'],
+    methods: {
+        onGetPhoneNumber(event) {
+            this.$emit('getphonenumber', event.detail)
+        },
+        onGetUserInfo(event) {
+            this.$emit('getuserinfo', event.detail)
+        },
+        onError(event) {
+            this.$emit('error', event.detail)
+        },
+        onOpenSetting(event) {
+            this.$emit('opensetting', event.detail)
+        },
+        onLaunchApp(event) {
+            this.$emit('launchapp', event.detail)
+        },
+        onContact(event) {
+            this.$emit('contact', event.detail)
+        },
+        onChooseavatar(event) {
+            this.$emit('chooseavatar', event.detail)
+        },
+        onAddgroupapp(event) {
+            this.$emit('addgroupapp', event.detail)
+        },
+        onChooseaddress(event) {
+            this.$emit('chooseaddress', event.detail)
+        },
+        onSubscribe(event) {
+            this.$emit('subscribe', event.detail)
+        },
+        onLogin(event) {
+            this.$emit('login', event.detail)
+        },
+        onIm(event) {
+            this.$emit('im', event.detail)
+        }
+    }
+}
diff --git a/uni_modules/wu-ui-tools/libs/mixin/touch.js b/uni_modules/wu-ui-tools/libs/mixin/touch.js
new file mode 100644
index 0000000..0ecbd88
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/mixin/touch.js
@@ -0,0 +1,59 @@
+const MIN_DISTANCE = 10
+
+function getDirection(x, y) {
+    if (x > y && x > MIN_DISTANCE) {
+        return 'horizontal'
+    }
+    if (y > x && y > MIN_DISTANCE) {
+        return 'vertical'
+    }
+    return ''
+}
+
+export default {
+    methods: {
+        getTouchPoint(e) {
+            if (!e) {
+                return {
+                    x: 0,
+                    y: 0
+                }
+            } if (e.touches && e.touches[0]) {
+                return {
+                    x: e.touches[0].pageX,
+                    y: e.touches[0].pageY
+                }
+            } if (e.changedTouches && e.changedTouches[0]) {
+                return {
+                    x: e.changedTouches[0].pageX,
+                    y: e.changedTouches[0].pageY
+                }
+            }
+            return {
+                x: e.clientX || 0,
+                y: e.clientY || 0
+            }
+        },
+        resetTouchStatus() {
+            this.direction = ''
+            this.deltaX = 0
+            this.deltaY = 0
+            this.offsetX = 0
+            this.offsetY = 0
+        },
+        touchStart(event) {
+            this.resetTouchStatus()
+            const touch = this.getTouchPoint(event)
+            this.startX = touch.x
+            this.startY = touch.y
+        },
+        touchMove(event) {
+            const touch = this.getTouchPoint(event)
+            this.deltaX = touch.x - this.startX
+            this.deltaY = touch.y - this.startY
+            this.offsetX = Math.abs(this.deltaX)
+            this.offsetY = Math.abs(this.deltaY)
+            this.direction =				this.direction || getDirection(this.offsetX, this.offsetY)
+        }
+    }
+}
diff --git a/uni_modules/wu-ui-tools/libs/util/async-validator.js b/uni_modules/wu-ui-tools/libs/util/async-validator.js
new file mode 100644
index 0000000..9e114df
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/util/async-validator.js
@@ -0,0 +1,1343 @@
+function _extends() {
+    _extends = Object.assign || function (target) {
+        for (let i = 1; i < arguments.length; i++) {
+            const source = arguments[i]
+
+            for (const key in source) {
+                if (Object.prototype.hasOwnProperty.call(source, key)) {
+                    target[key] = source[key]
+                }
+            }
+        }
+
+        return target
+    }
+
+    return _extends.apply(this, arguments)
+}
+
+/* eslint no-console:0 */
+const formatRegExp = /%[sdj%]/g
+let warning = function warning() {} // don't print warning message when in production env or node runtime
+
+if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window
+	!== 'undefined' && typeof document !== 'undefined') {
+    warning = function warning(type, errors) {
+        if (typeof console !== 'undefined' && console.warn) {
+            if (errors.every((e) => typeof e === 'string')) {
+                console.warn(type, errors)
+            }
+        }
+    }
+}
+
+function convertFieldsError(errors) {
+    if (!errors || !errors.length) return null
+    const fields = {}
+    errors.forEach((error) => {
+        const { field } = error
+        fields[field] = fields[field] || []
+        fields[field].push(error)
+    })
+    return fields
+}
+
+function format() {
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+        args[_key] = arguments[_key]
+    }
+
+    let i = 1
+    const f = args[0]
+    const len = args.length
+
+    if (typeof f === 'function') {
+        return f.apply(null, args.slice(1))
+    }
+
+    if (typeof f === 'string') {
+        let str = String(f).replace(formatRegExp, (x) => {
+            if (x === '%%') {
+                return '%'
+            }
+
+            if (i >= len) {
+                return x
+            }
+
+            switch (x) {
+            case '%s':
+                return String(args[i++])
+
+            case '%d':
+                return Number(args[i++])
+
+            case '%j':
+                try {
+                    return JSON.stringify(args[i++])
+                } catch (_) {
+                    return '[Circular]'
+                }
+
+                break
+
+            default:
+                return x
+            }
+        })
+
+        for (let arg = args[i]; i < len; arg = args[++i]) {
+            str += ` ${arg}`
+        }
+
+        return str
+    }
+
+    return f
+}
+
+function isNativeStringType(type) {
+    return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern'
+}
+
+function isEmptyValue(value, type) {
+    if (value === undefined || value === null) {
+        return true
+    }
+
+    if (type === 'array' && Array.isArray(value) && !value.length) {
+        return true
+    }
+
+    if (isNativeStringType(type) && typeof value === 'string' && !value) {
+        return true
+    }
+
+    return false
+}
+
+function asyncParallelArray(arr, func, callback) {
+    const results = []
+    let total = 0
+    const arrLength = arr.length
+
+    function count(errors) {
+        results.push.apply(results, errors)
+        total++
+
+        if (total === arrLength) {
+            callback(results)
+        }
+    }
+
+    arr.forEach((a) => {
+        func(a, count)
+    })
+}
+
+function asyncSerialArray(arr, func, callback) {
+    let index = 0
+    const arrLength = arr.length
+
+    function next(errors) {
+        if (errors && errors.length) {
+            callback(errors)
+            return
+        }
+
+        const original = index
+        index += 1
+
+        if (original < arrLength) {
+            func(arr[original], next)
+        } else {
+            callback([])
+        }
+    }
+
+    next([])
+}
+
+function flattenObjArr(objArr) {
+    const ret = []
+    Object.keys(objArr).forEach((k) => {
+        ret.push.apply(ret, objArr[k])
+    })
+    return ret
+}
+
+function asyncMap(objArr, option, func, callback) {
+    if (option.first) {
+        const _pending = new Promise((resolve, reject) => {
+            const next = function next(errors) {
+                callback(errors)
+                return errors.length ? reject({
+                    errors,
+                    fields: convertFieldsError(errors)
+                }) : resolve()
+            }
+
+            const flattenArr = flattenObjArr(objArr)
+            asyncSerialArray(flattenArr, func, next)
+        })
+
+        _pending.catch((e) => e)
+
+        return _pending
+    }
+
+    let firstFields = option.firstFields || []
+
+    if (firstFields === true) {
+        firstFields = Object.keys(objArr)
+    }
+
+    const objArrKeys = Object.keys(objArr)
+    const objArrLength = objArrKeys.length
+    let total = 0
+    const results = []
+    const pending = new Promise((resolve, reject) => {
+        const next = function next(errors) {
+            results.push.apply(results, errors)
+            total++
+
+            if (total === objArrLength) {
+                callback(results)
+                return results.length ? reject({
+                    errors: results,
+                    fields: convertFieldsError(results)
+                }) : resolve()
+            }
+        }
+
+        if (!objArrKeys.length) {
+            callback(results)
+            resolve()
+        }
+
+        objArrKeys.forEach((key) => {
+            const arr = objArr[key]
+
+            if (firstFields.indexOf(key) !== -1) {
+                asyncSerialArray(arr, func, next)
+            } else {
+                asyncParallelArray(arr, func, next)
+            }
+        })
+    })
+    pending.catch((e) => e)
+    return pending
+}
+
+function complementError(rule) {
+    return function (oe) {
+        if (oe && oe.message) {
+            oe.field = oe.field || rule.fullField
+            return oe
+        }
+
+        return {
+            message: typeof oe === 'function' ? oe() : oe,
+            field: oe.field || rule.fullField
+        }
+    }
+}
+
+function deepMerge(target, source) {
+    if (source) {
+        for (const s in source) {
+            if (source.hasOwnProperty(s)) {
+                const value = source[s]
+
+                if (typeof value === 'object' && typeof target[s] === 'object') {
+                    target[s] = { ...target[s], ...value }
+                } else {
+                    target[s] = value
+                }
+            }
+        }
+    }
+
+    return target
+}
+
+/**
+ *  Rule for validating required fields.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function required(rule, value, source, errors, options, type) {
+    if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {
+        errors.push(format(options.messages.required, rule.fullField))
+    }
+}
+
+/**
+ *  Rule for validating whitespace.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function whitespace(rule, value, source, errors, options) {
+    if (/^\s+$/.test(value) || value === '') {
+        errors.push(format(options.messages.whitespace, rule.fullField))
+    }
+}
+
+/* eslint max-len:0 */
+
+const pattern = {
+    // http://emailregex.com/
+    email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
+    url: new RegExp(
+        '^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$',
+        'i'
+    ),
+    hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
+}
+var types = {
+    integer: function integer(value) {
+        return /^(-)?\d+$/.test(value);
+    },
+    float: function float(value) {
+        return /^(-)?\d+(\.\d+)?$/.test(value);
+    },
+    array: function array(value) {
+        return Array.isArray(value)
+    },
+    regexp: function regexp(value) {
+        if (value instanceof RegExp) {
+            return true
+        }
+
+        try {
+            return !!new RegExp(value)
+        } catch (e) {
+            return false
+        }
+    },
+    date: function date(value) {
+        return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear
+			=== 'function'
+    },
+    number: function number(value) {
+        if (isNaN(value)) {
+            return false
+        }
+
+        // 淇敼婧愮爜锛屽皢瀛楃涓叉暟鍊煎厛杞负鏁板��
+        return typeof +value === 'number'
+    },
+    object: function object(value) {
+        return typeof value === 'object' && !types.array(value)
+    },
+    method: function method(value) {
+        return typeof value === 'function'
+    },
+    email: function email(value) {
+        return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255
+    },
+    url: function url(value) {
+        return typeof value === 'string' && !!value.match(pattern.url)
+    },
+    hex: function hex(value) {
+        return typeof value === 'string' && !!value.match(pattern.hex)
+    }
+}
+/**
+ *  Rule for validating the type of a value.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function type(rule, value, source, errors, options) {
+    if (rule.required && value === undefined) {
+        required(rule, value, source, errors, options)
+        return
+    }
+
+    const custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex']
+    const ruleType = rule.type
+
+    if (custom.indexOf(ruleType) > -1) {
+        if (!types[ruleType](value)) {
+            errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type))
+        } // straight typeof check
+    } else if (ruleType && typeof value !== rule.type) {
+        errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type))
+    }
+}
+
+/**
+ *  Rule for validating minimum and maximum allowed values.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function range(rule, value, source, errors, options) {
+    const len = typeof rule.len === 'number'
+    const min = typeof rule.min === 'number'
+    const max = typeof rule.max === 'number' // 姝e垯鍖归厤鐮佺偣鑼冨洿浠嶶+010000涓�鐩村埌U+10FFFF鐨勬枃瀛楋紙琛ュ厖骞抽潰Supplementary Plane锛�
+
+    const spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g
+    let val = value
+    let key = null
+    const num = typeof value === 'number'
+    const str = typeof value === 'string'
+    const arr = Array.isArray(value)
+
+    if (num) {
+        key = 'number'
+    } else if (str) {
+        key = 'string'
+    } else if (arr) {
+        key = 'array'
+    } // if the value is not of a supported type for range validation
+    // the validation rule rule should use the
+    // type property to also test for a particular type
+
+    if (!key) {
+        return false
+    }
+
+    if (arr) {
+        val = value.length
+    }
+
+    if (str) {
+        // 澶勭悊鐮佺偣澶т簬U+010000鐨勬枃瀛條ength灞炴�т笉鍑嗙‘鐨刡ug锛屽"馉馉馉".lenght !== 3
+        val = value.replace(spRegexp, '_').length
+    }
+
+    if (len) {
+        if (val !== rule.len) {
+            errors.push(format(options.messages[key].len, rule.fullField, rule.len))
+        }
+    } else if (min && !max && val < rule.min) {
+        errors.push(format(options.messages[key].min, rule.fullField, rule.min))
+    } else if (max && !min && val > rule.max) {
+        errors.push(format(options.messages[key].max, rule.fullField, rule.max))
+    } else if (min && max && (val < rule.min || val > rule.max)) {
+        errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max))
+    }
+}
+
+const ENUM = 'enum'
+/**
+ *  Rule for validating a value exists in an enumerable list.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function enumerable(rule, value, source, errors, options) {
+    rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : []
+
+    if (rule[ENUM].indexOf(value) === -1) {
+        errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')))
+    }
+}
+
+/**
+ *  Rule for validating a regular expression pattern.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function pattern$1(rule, value, source, errors, options) {
+    if (rule.pattern) {
+        if (rule.pattern instanceof RegExp) {
+            // if a RegExp instance is passed, reset `lastIndex` in case its `global`
+            // flag is accidentally set to `true`, which in a validation scenario
+            // is not necessary and the result might be misleading
+            rule.pattern.lastIndex = 0
+
+            if (!rule.pattern.test(value)) {
+                errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern))
+            }
+        } else if (typeof rule.pattern === 'string') {
+            const _pattern = new RegExp(rule.pattern)
+
+            if (!_pattern.test(value)) {
+                errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern))
+            }
+        }
+    }
+}
+
+const rules = {
+    required,
+    whitespace,
+    type,
+    range,
+    enum: enumerable,
+    pattern: pattern$1
+}
+
+/**
+ *  Performs validation for string types.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function string(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, 'string') && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options, 'string')
+
+        if (!isEmptyValue(value, 'string')) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+            rules.pattern(rule, value, source, errors, options)
+
+            if (rule.whitespace === true) {
+                rules.whitespace(rule, value, source, errors, options)
+            }
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a function.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function method(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a number.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function number(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (value === '') {
+            value = undefined
+        }
+
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a boolean.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function _boolean(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates the regular expression type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function regexp(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (!isEmptyValue(value)) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a number is an integer.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function integer(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a number is a floating point number.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function floatFn(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates an array.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function array(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, 'array') && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options, 'array')
+
+        if (!isEmptyValue(value, 'array')) {
+            rules.type(rule, value, source, errors, options)
+            rules.range(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates an object.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function object(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+const ENUM$1 = 'enum'
+/**
+ *  Validates an enumerable list.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function enumerable$1(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (value !== undefined) {
+            rules[ENUM$1](rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Validates a regular expression pattern.
+ *
+ *  Performs validation when a rule only contains
+ *  a pattern property but is not declared as a string type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function pattern$2(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, 'string') && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (!isEmptyValue(value, 'string')) {
+            rules.pattern(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+function date(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+
+        if (!isEmptyValue(value)) {
+            let dateObject
+
+            if (typeof value === 'number') {
+                dateObject = new Date(value)
+            } else {
+                dateObject = value
+            }
+
+            rules.type(rule, dateObject, source, errors, options)
+
+            if (dateObject) {
+                rules.range(rule, dateObject.getTime(), source, errors, options)
+            }
+        }
+    }
+
+    callback(errors)
+}
+
+function required$1(rule, value, callback, source, options) {
+    const errors = []
+    const type = Array.isArray(value) ? 'array' : typeof value
+    rules.required(rule, value, source, errors, options, type)
+    callback(errors)
+}
+
+function type$1(rule, value, callback, source, options) {
+    const ruleType = rule.type
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value, ruleType) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options, ruleType)
+
+        if (!isEmptyValue(value, ruleType)) {
+            rules.type(rule, value, source, errors, options)
+        }
+    }
+
+    callback(errors)
+}
+
+/**
+ *  Performs validation for any type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function any(rule, value, callback, source, options) {
+    const errors = []
+    const validate = rule.required || !rule.required && source.hasOwnProperty(rule.field)
+
+    if (validate) {
+        if (isEmptyValue(value) && !rule.required) {
+            return callback()
+        }
+
+        rules.required(rule, value, source, errors, options)
+    }
+
+    callback(errors)
+}
+
+const validators = {
+    string,
+    method,
+    number,
+    boolean: _boolean,
+    regexp,
+    integer,
+    float: floatFn,
+    array,
+    object,
+    enum: enumerable$1,
+    pattern: pattern$2,
+    date,
+    url: type$1,
+    hex: type$1,
+    email: type$1,
+    required: required$1,
+    any
+}
+
+function newMessages() {
+    return {
+        default: 'Validation error on field %s',
+        required: '%s is required',
+        enum: '%s must be one of %s',
+        whitespace: '%s cannot be empty',
+        date: {
+            format: '%s date %s is invalid for format %s',
+            parse: '%s date could not be parsed, %s is invalid ',
+            invalid: '%s date %s is invalid'
+        },
+        types: {
+            string: '%s is not a %s',
+            method: '%s is not a %s (function)',
+            array: '%s is not an %s',
+            object: '%s is not an %s',
+            number: '%s is not a %s',
+            date: '%s is not a %s',
+            boolean: '%s is not a %s',
+            integer: '%s is not an %s',
+            float: '%s is not a %s',
+            regexp: '%s is not a valid %s',
+            email: '%s is not a valid %s',
+            url: '%s is not a valid %s',
+            hex: '%s is not a valid %s'
+        },
+        string: {
+            len: '%s must be exactly %s characters',
+            min: '%s must be at least %s characters',
+            max: '%s cannot be longer than %s characters',
+            range: '%s must be between %s and %s characters'
+        },
+        number: {
+            len: '%s must equal %s',
+            min: '%s cannot be less than %s',
+            max: '%s cannot be greater than %s',
+            range: '%s must be between %s and %s'
+        },
+        array: {
+            len: '%s must be exactly %s in length',
+            min: '%s cannot be less than %s in length',
+            max: '%s cannot be greater than %s in length',
+            range: '%s must be between %s and %s in length'
+        },
+        pattern: {
+            mismatch: '%s value %s does not match pattern %s'
+        },
+        clone: function clone() {
+            const cloned = JSON.parse(JSON.stringify(this))
+            cloned.clone = this.clone
+            return cloned
+        }
+    }
+}
+const messages = newMessages()
+
+/**
+ *  Encapsulates a validation schema.
+ *
+ *  @param descriptor An object declaring validation rules
+ *  for this schema.
+ */
+
+function Schema(descriptor) {
+    this.rules = null
+    this._messages = messages
+    this.define(descriptor)
+}
+
+Schema.prototype = {
+    messages: function messages(_messages) {
+        if (_messages) {
+            this._messages = deepMerge(newMessages(), _messages)
+        }
+
+        return this._messages
+    },
+    define: function define(rules) {
+        if (!rules) {
+            throw new Error('Cannot configure a schema with no rules')
+        }
+
+        if (typeof rules !== 'object' || Array.isArray(rules)) {
+            throw new Error('Rules must be an object')
+        }
+
+        this.rules = {}
+        let z
+        let item
+
+        for (z in rules) {
+            if (rules.hasOwnProperty(z)) {
+                item = rules[z]
+                this.rules[z] = Array.isArray(item) ? item : [item]
+            }
+        }
+    },
+    validate: function validate(source_, o, oc) {
+        const _this = this
+
+        if (o === void 0) {
+            o = {}
+        }
+
+        if (oc === void 0) {
+            oc = function oc() {}
+        }
+
+        let source = source_
+        let options = o
+        let callback = oc
+
+        if (typeof options === 'function') {
+            callback = options
+            options = {}
+        }
+
+        if (!this.rules || Object.keys(this.rules).length === 0) {
+            if (callback) {
+                callback()
+            }
+
+            return Promise.resolve()
+        }
+
+        function complete(results) {
+            let i
+            let errors = []
+            let fields = {}
+
+            function add(e) {
+                if (Array.isArray(e)) {
+                    let _errors
+
+                    errors = (_errors = errors).concat.apply(_errors, e)
+                } else {
+                    errors.push(e)
+                }
+            }
+
+            for (i = 0; i < results.length; i++) {
+                add(results[i])
+            }
+
+            if (!errors.length) {
+                errors = null
+                fields = null
+            } else {
+                fields = convertFieldsError(errors)
+            }
+
+            callback(errors, fields)
+        }
+
+        if (options.messages) {
+            let messages$1 = this.messages()
+
+            if (messages$1 === messages) {
+                messages$1 = newMessages()
+            }
+
+            deepMerge(messages$1, options.messages)
+            options.messages = messages$1
+        } else {
+            options.messages = this.messages()
+        }
+
+        let arr
+        let value
+        const series = {}
+        const keys = options.keys || Object.keys(this.rules)
+        keys.forEach((z) => {
+            arr = _this.rules[z]
+            value = source[z]
+            arr.forEach((r) => {
+                let rule = r
+
+                if (typeof rule.transform === 'function') {
+                    if (source === source_) {
+                        source = { ...source }
+                    }
+
+                    value = source[z] = rule.transform(value)
+                }
+
+                if (typeof rule === 'function') {
+                    rule = {
+                        validator: rule
+                    }
+                } else {
+                    rule = { ...rule }
+                }
+
+                rule.validator = _this.getValidationMethod(rule)
+                rule.field = z
+                rule.fullField = rule.fullField || z
+                rule.type = _this.getType(rule)
+
+                if (!rule.validator) {
+                    return
+                }
+
+                series[z] = series[z] || []
+                series[z].push({
+                    rule,
+                    value,
+                    source,
+                    field: z
+                })
+            })
+        })
+        const errorFields = {}
+        return asyncMap(series, options, (data, doIt) => {
+            const { rule } = data
+            let deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField
+				=== 'object')
+            deep = deep && (rule.required || !rule.required && data.value)
+            rule.field = data.field
+
+            function addFullfield(key, schema) {
+                return { ...schema, fullField: `${rule.fullField}.${key}` }
+            }
+
+            function cb(e) {
+                if (e === void 0) {
+                    e = []
+                }
+
+                let errors = e
+
+                if (!Array.isArray(errors)) {
+                    errors = [errors]
+                }
+
+                if (!options.suppressWarning && errors.length) {
+                    Schema.warning('async-validator:', errors)
+                }
+
+                if (errors.length && rule.message) {
+                    errors = [].concat(rule.message)
+                }
+
+                errors = errors.map(complementError(rule))
+
+                if (options.first && errors.length) {
+                    errorFields[rule.field] = 1
+                    return doIt(errors)
+                }
+
+                if (!deep) {
+                    doIt(errors)
+                } else {
+                    // if rule is required but the target object
+                    // does not exist fail at the rule level and don't
+                    // go deeper
+                    if (rule.required && !data.value) {
+                        if (rule.message) {
+                            errors = [].concat(rule.message).map(complementError(rule))
+                        } else if (options.error) {
+                            errors = [options.error(rule, format(options.messages.required, rule.field))]
+                        } else {
+                            errors = []
+                        }
+
+                        return doIt(errors)
+                    }
+
+                    let fieldsSchema = {}
+
+                    if (rule.defaultField) {
+                        for (const k in data.value) {
+                            if (data.value.hasOwnProperty(k)) {
+                                fieldsSchema[k] = rule.defaultField
+                            }
+                        }
+                    }
+
+                    fieldsSchema = { ...fieldsSchema, ...data.rule.fields }
+
+                    for (const f in fieldsSchema) {
+                        if (fieldsSchema.hasOwnProperty(f)) {
+                            const fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]]
+                            fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f))
+                        }
+                    }
+
+                    const schema = new Schema(fieldsSchema)
+                    schema.messages(options.messages)
+
+                    if (data.rule.options) {
+                        data.rule.options.messages = options.messages
+                        data.rule.options.error = options.error
+                    }
+
+                    schema.validate(data.value, data.rule.options || options, (errs) => {
+                        const finalErrors = []
+
+                        if (errors && errors.length) {
+                            finalErrors.push.apply(finalErrors, errors)
+                        }
+
+                        if (errs && errs.length) {
+                            finalErrors.push.apply(finalErrors, errs)
+                        }
+
+                        doIt(finalErrors.length ? finalErrors : null)
+                    })
+                }
+            }
+
+            let res
+
+            if (rule.asyncValidator) {
+                res = rule.asyncValidator(rule, data.value, cb, data.source, options)
+            } else if (rule.validator) {
+                res = rule.validator(rule, data.value, cb, data.source, options)
+
+                if (res === true) {
+                    cb()
+                } else if (res === false) {
+                    cb(rule.message || `${rule.field} fails`)
+                } else if (res instanceof Array) {
+                    cb(res)
+                } else if (res instanceof Error) {
+                    cb(res.message)
+                }
+            }
+
+            if (res && res.then) {
+                res.then(() => cb(), (e) => cb(e))
+            }
+        }, (results) => {
+            complete(results)
+        })
+    },
+    getType: function getType(rule) {
+        if (rule.type === undefined && rule.pattern instanceof RegExp) {
+            rule.type = 'pattern'
+        }
+
+        if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {
+            throw new Error(format('Unknown rule type %s', rule.type))
+        }
+
+        return rule.type || 'string'
+    },
+    getValidationMethod: function getValidationMethod(rule) {
+        if (typeof rule.validator === 'function') {
+            return rule.validator
+        }
+
+        const keys = Object.keys(rule)
+        const messageIndex = keys.indexOf('message')
+
+        if (messageIndex !== -1) {
+            keys.splice(messageIndex, 1)
+        }
+
+        if (keys.length === 1 && keys[0] === 'required') {
+            return validators.required
+        }
+
+        return validators[this.getType(rule)] || false
+    }
+}
+
+Schema.register = function register(type, validator) {
+    if (typeof validator !== 'function') {
+        throw new Error('Cannot register a validator by type, validator is not a function')
+    }
+
+    validators[type] = validator
+}
+
+Schema.warning = warning
+Schema.messages = messages
+
+export default Schema
+// # sourceMappingURL=index.js.map
diff --git a/uni_modules/wu-ui-tools/libs/util/dayjs.js b/uni_modules/wu-ui-tools/libs/util/dayjs.js
new file mode 100644
index 0000000..e360959
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/util/dayjs.js
@@ -0,0 +1,218 @@
+var __getOwnPropNames = Object.getOwnPropertyNames;
+var __commonJS = (cb, mod) => function __require() {
+  return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
+};
+
+// C:/Users/LP/Downloads/wuui-plus_3.1.27_example/node_modules/dayjs/dayjs.min.js
+var require_dayjs_min = __commonJS({
+  "C:/Users/LP/Downloads/wuui-plus_3.1.27_example/node_modules/dayjs/dayjs.min.js"(exports, module) {
+    !function(t, e) {
+      "object" == typeof exports && "undefined" != typeof module ? module.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs = e();
+    }(exports, function() {
+      "use strict";
+      var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", f = "month", h = "quarter", c = "year", d = "date", l = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t2) {
+        var e2 = ["th", "st", "nd", "rd"], n2 = t2 % 100;
+        return "[" + t2 + (e2[(n2 - 20) % 10] || e2[n2] || e2[0]) + "]";
+      } }, m = function(t2, e2, n2) {
+        var r2 = String(t2);
+        return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2;
+      }, v = { s: m, z: function(t2) {
+        var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60;
+        return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0");
+      }, m: function t2(e2, n2) {
+        if (e2.date() < n2.date())
+          return -t2(n2, e2);
+        var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, f), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), f);
+        return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0);
+      }, a: function(t2) {
+        return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2);
+      }, p: function(t2) {
+        return { M: f, y: c, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: h }[t2] || String(t2 || "").toLowerCase().replace(/s$/, "");
+      }, u: function(t2) {
+        return void 0 === t2;
+      } }, g = "en", D = {};
+      D[g] = M;
+      var p = function(t2) {
+        return t2 instanceof _;
+      }, S = function t2(e2, n2, r2) {
+        var i2;
+        if (!e2)
+          return g;
+        if ("string" == typeof e2) {
+          var s2 = e2.toLowerCase();
+          D[s2] && (i2 = s2), n2 && (D[s2] = n2, i2 = s2);
+          var u2 = e2.split("-");
+          if (!i2 && u2.length > 1)
+            return t2(u2[0]);
+        } else {
+          var a2 = e2.name;
+          D[a2] = e2, i2 = a2;
+        }
+        return !r2 && i2 && (g = i2), i2 || !r2 && g;
+      }, w = function(t2, e2) {
+        if (p(t2))
+          return t2.clone();
+        var n2 = "object" == typeof e2 ? e2 : {};
+        return n2.date = t2, n2.args = arguments, new _(n2);
+      }, O = v;
+      O.l = S, O.i = p, O.w = function(t2, e2) {
+        return w(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset });
+      };
+      var _ = function() {
+        function M2(t2) {
+          this.$L = S(t2.locale, null, true), this.parse(t2);
+        }
+        var m2 = M2.prototype;
+        return m2.parse = function(t2) {
+          this.$d = function(t3) {
+            var e2 = t3.date, n2 = t3.utc;
+            if (null === e2)
+              return new Date(NaN);
+            if (O.u(e2))
+              return new Date();
+            if (e2 instanceof Date)
+              return new Date(e2);
+            if ("string" == typeof e2 && !/Z$/i.test(e2)) {
+              var r2 = e2.match($);
+              if (r2) {
+                var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3);
+                return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2);
+              }
+            }
+            return new Date(e2);
+          }(t2), this.$x = t2.x || {}, this.init();
+        }, m2.init = function() {
+          var t2 = this.$d;
+          this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds();
+        }, m2.$utils = function() {
+          return O;
+        }, m2.isValid = function() {
+          return !(this.$d.toString() === l);
+        }, m2.isSame = function(t2, e2) {
+          var n2 = w(t2);
+          return this.startOf(e2) <= n2 && n2 <= this.endOf(e2);
+        }, m2.isAfter = function(t2, e2) {
+          return w(t2) < this.startOf(e2);
+        }, m2.isBefore = function(t2, e2) {
+          return this.endOf(e2) < w(t2);
+        }, m2.$g = function(t2, e2, n2) {
+          return O.u(t2) ? this[e2] : this.set(n2, t2);
+        }, m2.unix = function() {
+          return Math.floor(this.valueOf() / 1e3);
+        }, m2.valueOf = function() {
+          return this.$d.getTime();
+        }, m2.startOf = function(t2, e2) {
+          var n2 = this, r2 = !!O.u(e2) || e2, h2 = O.p(t2), l2 = function(t3, e3) {
+            var i2 = O.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2);
+            return r2 ? i2 : i2.endOf(a);
+          }, $2 = function(t3, e3) {
+            return O.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2);
+          }, y2 = this.$W, M3 = this.$M, m3 = this.$D, v2 = "set" + (this.$u ? "UTC" : "");
+          switch (h2) {
+            case c:
+              return r2 ? l2(1, 0) : l2(31, 11);
+            case f:
+              return r2 ? l2(1, M3) : l2(0, M3 + 1);
+            case o:
+              var g2 = this.$locale().weekStart || 0, D2 = (y2 < g2 ? y2 + 7 : y2) - g2;
+              return l2(r2 ? m3 - D2 : m3 + (6 - D2), M3);
+            case a:
+            case d:
+              return $2(v2 + "Hours", 0);
+            case u:
+              return $2(v2 + "Minutes", 1);
+            case s:
+              return $2(v2 + "Seconds", 2);
+            case i:
+              return $2(v2 + "Milliseconds", 3);
+            default:
+              return this.clone();
+          }
+        }, m2.endOf = function(t2) {
+          return this.startOf(t2, false);
+        }, m2.$set = function(t2, e2) {
+          var n2, o2 = O.p(t2), h2 = "set" + (this.$u ? "UTC" : ""), l2 = (n2 = {}, n2[a] = h2 + "Date", n2[d] = h2 + "Date", n2[f] = h2 + "Month", n2[c] = h2 + "FullYear", n2[u] = h2 + "Hours", n2[s] = h2 + "Minutes", n2[i] = h2 + "Seconds", n2[r] = h2 + "Milliseconds", n2)[o2], $2 = o2 === a ? this.$D + (e2 - this.$W) : e2;
+          if (o2 === f || o2 === c) {
+            var y2 = this.clone().set(d, 1);
+            y2.$d[l2]($2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d;
+          } else
+            l2 && this.$d[l2]($2);
+          return this.init(), this;
+        }, m2.set = function(t2, e2) {
+          return this.clone().$set(t2, e2);
+        }, m2.get = function(t2) {
+          return this[O.p(t2)]();
+        }, m2.add = function(r2, h2) {
+          var d2, l2 = this;
+          r2 = Number(r2);
+          var $2 = O.p(h2), y2 = function(t2) {
+            var e2 = w(l2);
+            return O.w(e2.date(e2.date() + Math.round(t2 * r2)), l2);
+          };
+          if ($2 === f)
+            return this.set(f, this.$M + r2);
+          if ($2 === c)
+            return this.set(c, this.$y + r2);
+          if ($2 === a)
+            return y2(1);
+          if ($2 === o)
+            return y2(7);
+          var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[$2] || 1, m3 = this.$d.getTime() + r2 * M3;
+          return O.w(m3, this);
+        }, m2.subtract = function(t2, e2) {
+          return this.add(-1 * t2, e2);
+        }, m2.format = function(t2) {
+          var e2 = this, n2 = this.$locale();
+          if (!this.isValid())
+            return n2.invalidDate || l;
+          var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = O.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, f2 = n2.months, h2 = function(t3, n3, i3, s3) {
+            return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].slice(0, s3);
+          }, c2 = function(t3) {
+            return O.s(s2 % 12 || 12, t3, "0");
+          }, d2 = n2.meridiem || function(t3, e3, n3) {
+            var r3 = t3 < 12 ? "AM" : "PM";
+            return n3 ? r3.toLowerCase() : r3;
+          }, $2 = { YY: String(this.$y).slice(-2), YYYY: this.$y, M: a2 + 1, MM: O.s(a2 + 1, 2, "0"), MMM: h2(n2.monthsShort, a2, f2, 3), MMMM: h2(f2, a2), D: this.$D, DD: O.s(this.$D, 2, "0"), d: String(this.$W), dd: h2(n2.weekdaysMin, this.$W, o2, 2), ddd: h2(n2.weekdaysShort, this.$W, o2, 3), dddd: o2[this.$W], H: String(s2), HH: O.s(s2, 2, "0"), h: c2(1), hh: c2(2), a: d2(s2, u2, true), A: d2(s2, u2, false), m: String(u2), mm: O.s(u2, 2, "0"), s: String(this.$s), ss: O.s(this.$s, 2, "0"), SSS: O.s(this.$ms, 3, "0"), Z: i2 };
+          return r2.replace(y, function(t3, e3) {
+            return e3 || $2[t3] || i2.replace(":", "");
+          });
+        }, m2.utcOffset = function() {
+          return 15 * -Math.round(this.$d.getTimezoneOffset() / 15);
+        }, m2.diff = function(r2, d2, l2) {
+          var $2, y2 = O.p(d2), M3 = w(r2), m3 = (M3.utcOffset() - this.utcOffset()) * e, v2 = this - M3, g2 = O.m(this, M3);
+          return g2 = ($2 = {}, $2[c] = g2 / 12, $2[f] = g2, $2[h] = g2 / 3, $2[o] = (v2 - m3) / 6048e5, $2[a] = (v2 - m3) / 864e5, $2[u] = v2 / n, $2[s] = v2 / e, $2[i] = v2 / t, $2)[y2] || v2, l2 ? g2 : O.a(g2);
+        }, m2.daysInMonth = function() {
+          return this.endOf(f).$D;
+        }, m2.$locale = function() {
+          return D[this.$L];
+        }, m2.locale = function(t2, e2) {
+          if (!t2)
+            return this.$L;
+          var n2 = this.clone(), r2 = S(t2, e2, true);
+          return r2 && (n2.$L = r2), n2;
+        }, m2.clone = function() {
+          return O.w(this.$d, this);
+        }, m2.toDate = function() {
+          return new Date(this.valueOf());
+        }, m2.toJSON = function() {
+          return this.isValid() ? this.toISOString() : null;
+        }, m2.toISOString = function() {
+          return this.$d.toISOString();
+        }, m2.toString = function() {
+          return this.$d.toUTCString();
+        }, M2;
+      }(), T = _.prototype;
+      return w.prototype = T, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", f], ["$y", c], ["$D", d]].forEach(function(t2) {
+        T[t2[1]] = function(e2) {
+          return this.$g(e2, t2[0], t2[1]);
+        };
+      }), w.extend = function(t2, e2) {
+        return t2.$i || (t2(e2, _, w), t2.$i = true), w;
+      }, w.locale = S, w.isDayjs = p, w.unix = function(t2) {
+        return w(1e3 * t2);
+      }, w.en = D[g], w.Ls = D, w.p = {}, w;
+    });
+  }
+});
+export default require_dayjs_min();
+//# sourceMappingURL=dayjs.js.map
diff --git a/uni_modules/wu-ui-tools/libs/util/route.js b/uni_modules/wu-ui-tools/libs/util/route.js
new file mode 100644
index 0000000..b362b0e
--- /dev/null
+++ b/uni_modules/wu-ui-tools/libs/util/route.js
@@ -0,0 +1,124 @@
+/**
+ * 璺敱璺宠浆鏂规硶锛岃鏂规硶鐩稿浜庣洿鎺ヤ娇鐢╱ni.xxx鐨勫ソ澶勬槸浣跨敤鏇村姞绠�鍗曞揩鎹�
+ * 骞朵笖甯︽湁璺敱鎷︽埅鍔熻兘
+ */
+import { queryParams, deepMerge,page } from '@/uni_modules/wu-ui-tools/libs/function/index.js'
+class Router {
+	constructor() {
+		// 鍘熷灞炴�у畾涔�
+		this.config = {
+			type: 'navigateTo',
+			url: '',
+			delta: 1, // navigateBack椤甸潰鍚庨��鏃�,鍥為��鐨勫眰鏁�
+			params: {}, // 浼犻�掔殑鍙傛暟
+			animationType: 'pop-in', // 绐楀彛鍔ㄧ敾,鍙湪APP鏈夋晥
+			animationDuration: 300, // 绐楀彛鍔ㄧ敾鎸佺画鏃堕棿,鍗曚綅姣,鍙湪APP鏈夋晥
+			intercept: false // 鏄惁闇�瑕佹嫤鎴�
+		}
+		// 鍥犱负route鏂规硶鏄渶瑕佸澶栬祴鍊肩粰鍙﹀鐨勫璞′娇鐢紝鍚屾椂route鍐呴儴鏈変娇鐢╰his锛屼細瀵艰嚧route澶卞幓涓婁笅鏂�
+		// 杩欓噷鍦ㄦ瀯閫犲嚱鏁颁腑杩涜this缁戝畾
+		this.route = this.route.bind(this)
+	}
+
+	// 鍒ゆ柇url鍓嶉潰鏄惁鏈�"/"锛屽鏋滄病鏈夊垯鍔犱笂锛屽惁鍒欐棤娉曡烦杞�
+	addRootPath(url) {
+		return url[0] === '/' ? url : `/${url}`
+	}
+
+	// 鏁村悎璺敱鍙傛暟
+	mixinParam(url, params) {
+		url = url && this.addRootPath(url)
+
+		// 浣跨敤姝e垯鍖归厤锛屼富瑕佷緷鎹槸鍒ゆ柇鏄惁鏈�"/","?","="绛夛紝濡傗��/page/index/index?name=mary"
+		// 濡傛灉鏈塽rl涓湁get鍙傛暟锛岃浆鎹㈠悗鏃犻渶甯︿笂"?"
+		let query = ''
+		if (/.*\/.*\?.*=.*/.test(url)) {
+			// object瀵硅薄杞负get绫诲瀷鐨勫弬鏁�
+			query = queryParams(params, false)
+			// 鍥犱负宸叉湁get鍙傛暟,鎵�浠ュ悗闈㈡嫾鎺ョ殑鍙傛暟闇�瑕佸甫涓�"&"闅斿紑
+			return url += `&${query}`
+		}
+		// 鐩存帴鎷兼帴鍙傛暟锛屽洜涓烘澶剈rl涓病鏈夊悗闈㈢殑query鍙傛暟锛屼篃灏辨病鏈�"?/&"涔嬬被鐨勭鍙�
+		query = queryParams(params)
+		return url += query
+	}
+
+	// 瀵瑰鐨勬柟娉曞悕绉�
+	async route(options = {}, params = {}) {
+		// 鍚堝苟鐢ㄦ埛鐨勯厤缃拰鍐呴儴鐨勯粯璁ら厤缃�
+		let mergeConfig = {}
+
+		if (typeof options === 'string') {
+			// 濡傛灉options涓哄瓧绗︿覆锛屽垯涓簉oute(url, params)鐨勫舰寮�
+			mergeConfig.url = this.mixinParam(options, params)
+			mergeConfig.type = 'navigateTo'
+		} else {
+			mergeConfig = deepMerge(this.config, options)
+			// 鍚﹀垯姝e父浣跨敤mergeConfig涓殑url鍜宲arams杩涜鎷兼帴
+			mergeConfig.url = this.mixinParam(options.url, options.params)
+		}
+
+		// 濡傛灉鏈璺宠浆鐨勮矾寰勫拰鏈〉闈㈣矾寰勪竴鑷达紝涓嶆墽琛岃烦杞紝闃叉鐢ㄦ埛蹇�熺偣鍑昏烦杞寜閽紝閫犳垚澶氭璺宠浆鍚屼竴涓〉闈㈢殑闂
+		if (mergeConfig.url === page()) return
+
+		if (params.intercept) {
+			this.config.intercept = params.intercept
+		}
+		// params鍙傛暟涔熷甫缁欐嫤鎴櫒
+		mergeConfig.params = params
+		// 鍚堝苟鍐呭閮ㄥ弬鏁�
+		mergeConfig = deepMerge(this.config, mergeConfig)
+		// 鍒ゆ柇鐢ㄦ埛鏄惁瀹氫箟浜嗘嫤鎴櫒
+		if (typeof routeIntercept === 'function') {
+			// 瀹氫竴涓猵romise锛屾牴鎹敤鎴锋墽琛宺esolve(true)鎴栬�卹esolve(false)鏉ュ喅瀹氭槸鍚﹁繘琛岃矾鐢辫烦杞�
+			const isNext = await new Promise((resolve, reject) => {
+				routeIntercept(mergeConfig, resolve)
+			})
+			// 濡傛灉isNext涓簍rue锛屽垯鎵ц璺敱璺宠浆
+			isNext && this.openPage(mergeConfig)
+		} else {
+			this.openPage(mergeConfig)
+		}
+	}
+
+	// 鎵ц璺敱璺宠浆
+	openPage(config) {
+		// 瑙f瀯鍙傛暟
+		const {
+			url,
+			type,
+			delta,
+			animationType,
+			animationDuration
+		} = config
+		if (config.type == 'navigateTo' || config.type == 'to') {
+			uni.navigateTo({
+				url,
+				animationType,
+				animationDuration
+			})
+		}
+		if (config.type == 'redirectTo' || config.type == 'redirect') {
+			uni.redirectTo({
+				url
+			})
+		}
+		if (config.type == 'switchTab' || config.type == 'tab') {
+			uni.switchTab({
+				url
+			})
+		}
+		if (config.type == 'reLaunch' || config.type == 'launch') {
+			uni.reLaunch({
+				url
+			})
+		}
+		if (config.type == 'navigateBack' || config.type == 'back') {
+			uni.navigateBack({
+				delta
+			})
+		}
+	}
+}
+
+export default (new Router()).route
diff --git a/uni_modules/wu-ui-tools/package.json b/uni_modules/wu-ui-tools/package.json
new file mode 100644
index 0000000..82b906b
--- /dev/null
+++ b/uni_modules/wu-ui-tools/package.json
@@ -0,0 +1,86 @@
+{
+	"id": "wu-ui-tools",
+	"displayName": "wu-ui-tools 宸ュ叿搴�  鍏ㄩ潰鍏煎灏忕▼搴忋�乶vue銆乿ue2銆乿ue3",
+	"version": "1.1.0",
+	"description": "wu-ui-tools锛岄泦鎴愬伐鍏峰簱锛屽己澶х殑Http璇锋眰灏佽锛屾竻鏅扮殑鏂囨。璇存槑锛屽紑绠卞嵆鐢ㄣ�傛柟渚夸娇鐢紝鍙互鍏ㄥ眬浣跨敤",
+	"keywords": [
+        "wu-ui-tools",
+        "wu-ui",
+        "宸ュ叿搴�",
+        "澶氱鍏ㄥ吋瀹�"
+    ],
+	"dependencies": {
+		"color": "^4.2.3"
+	},
+	"repository": "",
+    "engines": {
+	},
+	"dcloudext": {
+		"type": "component-vue",
+		"sale": {
+			"regular": {
+				"price": "0.00"
+			},
+			"sourcecode": {
+				"price": "0.00"
+			}
+		},
+		"contact": {
+			"qq": ""
+		},
+		"declaration": {
+			"ads": "鏃�",
+			"data": "鎻掍欢涓嶉噰闆嗕换浣曟暟鎹�",
+			"permissions": "鏃�"
+		},
+		"npmurl": ""
+	},
+	"uni_modules": {
+		"dependencies": [],
+		"encrypt": [],
+		"platforms": {
+			"cloud": {
+				"tcb": "y",
+				"aliyun": "y"
+			},
+			"client": {
+				"Vue": {
+					"vue2": "y",
+					"vue3": "y"
+				},
+				"App": {
+					"app-vue": "y",
+					"app-nvue": "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",
+					"椋炰功": "y",
+					"浜笢": "y"
+				},
+				"蹇簲鐢�": {
+					"鍗庝负": "y",
+					"鑱旂洘": "y"
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/wu-ui-tools/readme.md b/uni_modules/wu-ui-tools/readme.md
new file mode 100644
index 0000000..7b6518c
--- /dev/null
+++ b/uni_modules/wu-ui-tools/readme.md
@@ -0,0 +1,18 @@
+## wu-ui-tools 宸ュ叿闆�
+
+> **缁勪欢鍚嶏細wu-ui-tools**
+
+wu-ui 宸ュ叿闆嗘垚锛屽寘鎷綉缁淗ttp璇锋眰銆佷究鎹峰伐鍏枫�佽妭娴侀槻鎶栥�佸璞℃搷浣溿�佹椂闂存牸寮忓寲銆佽矾鐢辫烦杞�佸叏灞�鍞竴鏍囪瘑绗︺�佽鍒欐牎楠岀瓑绛夈��
+
+闇�瑕佸湪鑷繁鐨勯」鐩腑浣跨敤璇峰弬鑰僛鎵╁睍閰嶇疆](https://wu.geeks.ink/zh-CN/components/extendedConfiguration.html)銆�
+
+## <a href="https://wu.geeks.ink/js/intro.html" target="_blank">鏌ョ湅鏂囨。</a>
+
+## [瀹屾暣绀轰緥椤圭洰涓嬭浇 | 鍏虫敞鏇村缁勪欢](https://ext.dcloud.net.cn/plugin?name=wu--ui)
+(璇峰嬁涓嬭浇鎻掍欢zip)
+
+<a href="https://ext.dcloud.net.cn/plugin?name=wu--ui">
+	<img src="https://wu.geeks.ink/intr.png">
+</a>
+
+**濡備娇鐢ㄨ繃绋嬩腑鏈変换浣曢棶棰橈紝鎴栬�呮偍瀵箇u-ui鏈変竴浜涘ソ鐨勫缓璁紝娆㈣繋鍔犲叆 [wu-ui 浜ゆ祦缇(https://wu.geeks.ink/zh-CN/components/qqFeedBack.html)**
diff --git a/uni_modules/wu-ui-tools/theme.scss b/uni_modules/wu-ui-tools/theme.scss
new file mode 100644
index 0000000..3d292c1
--- /dev/null
+++ b/uni_modules/wu-ui-tools/theme.scss
@@ -0,0 +1,43 @@
+// 姝ゆ枃浠朵负wuUI鐨勪富棰樺彉閲忥紝杩欎簺鍙橀噺鐩墠鍙兘閫氳繃uni.scss寮曞叆鎵嶆湁鏁堬紝鍙﹀鐢变簬
+// uni.scss涓紩鍏ョ殑鏍峰紡浼氬悓鏃舵贩鍏ュ埌鍏ㄥ眬鏍峰紡鏂囦欢鍜屽崟鐙瘡涓�涓〉闈㈢殑鏍峰紡涓紝閫犳垚寰俊绋嬪簭鍖呭お澶э紝
+// 鏁卽ni.scss鍙缓璁斁scss鍙橀噺鍚嶇浉鍏虫牱寮忥紝鍏朵粬鐨勬牱寮忓彲浠ラ�氳繃main.js鎴栬�匒pp.vue寮曞叆
+
+$wu-main-color: #303133;
+$wu-content-color: #606266;
+$wu-tips-color: #909193;
+$wu-light-color: #c0c4cc;
+$wu-border-color: #dadbde;
+$wu-bg-color: #f3f4f6;
+$wu-disabled-color: #c8c9cc;
+
+$wu-primary: #3c9cff;
+$wu-primary-dark: #398ade;
+$wu-primary-disabled: #9acafc;
+$wu-primary-light: #ecf5ff;
+
+$wu-warning: #f9ae3d;
+$wu-warning-dark: #f1a532;
+$wu-warning-disabled: #f9d39b;
+$wu-warning-light: #fdf6ec;
+
+$wu-success: #5ac725;
+$wu-success-dark: #53c21d;
+$wu-success-disabled: #a9e08f;
+$wu-success-light: #f5fff0;
+
+$wu-error: #f56c6c;
+$wu-error-dark: #e45656;
+$wu-error-disabled: #f7b2b2;
+$wu-error-light: #fef0f0;
+
+$wu-info: #909399;
+$wu-info-dark: #767a82;
+$wu-info-disabled: #c4c6c9;
+$wu-info-light: #f4f4f5;
+
+@mixin flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: $direction;
+}
\ No newline at end of file
diff --git a/unpackage/debug/android_debug.apk b/unpackage/debug/android_debug.apk
new file mode 100644
index 0000000..180655b
--- /dev/null
+++ b/unpackage/debug/android_debug.apk
Binary files differ
diff --git a/util/ble/encoding-indexes.js b/util/ble/encoding-indexes.js
new file mode 100644
index 0000000..4f170c3
--- /dev/null
+++ b/util/ble/encoding-indexes.js
@@ -0,0 +1,47 @@
+(function(global) {
+  'use strict';
+
+  if (typeof module !== "undefined" && module.exports) {
+    module.exports = global;
+  }
+
+  global["encoding-indexes"] =
+{
+  "big5":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,17392,19506,17923,17830,17784,160359,19831,17843,162993,19682,163013,15253,18230,18244,19527,19520,148159,144919,160594,159371,159954,19543,172881,18255,17882,19589,162924,19719,19108,18081,158499,29221,154196,137827,146950,147297,26189,22267,null,32149,22813,166841,15860,38708,162799,23515,138590,23204,13861,171696,23249,23479,23804,26478,34195,170309,29793,29853,14453,138579,145054,155681,16108,153822,15093,31484,40855,147809,166157,143850,133770,143966,17162,33924,40854,37935,18736,34323,22678,38730,37400,31184,31282,26208,27177,34973,29772,31685,26498,31276,21071,36934,13542,29636,155065,29894,40903,22451,18735,21580,16689,145038,22552,31346,162661,35727,18094,159368,16769,155033,31662,140476,40904,140481,140489,140492,40905,34052,144827,16564,40906,17633,175615,25281,28782,40907,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,12736,12737,12738,12739,12740,131340,12741,131281,131277,12742,12743,131275,139240,12744,131274,12745,12746,12747,12748,131342,12749,12750,256,193,461,192,274,201,282,200,332,211,465,210,null,7870,null,7872,202,257,225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,null,7871,null,7873,234,609,9178,9179,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,172969,135493,null,25866,null,null,20029,28381,40270,37343,null,null,161589,25745,20250,20264,20392,20822,20852,20892,20964,21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,36710,36711,36718,29713,31996,32205,26950,31433,21031,null,null,null,null,37260,30904,37214,32956,null,36107,33014,133607,null,null,32927,40647,19661,40393,40460,19518,171510,159758,40458,172339,13761,null,28314,33342,29977,null,18705,39532,39567,40857,31111,164972,138698,132560,142054,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,163204,21797,null,134210,134421,151851,21904,142534,14828,131905,36422,150968,169189,16467,164030,30586,142392,14900,18389,164189,158194,151018,25821,134524,135092,134357,135412,25741,36478,134806,134155,135012,142505,164438,148691,null,134470,170573,164073,18420,151207,142530,39602,14951,169460,16365,13574,152263,169940,161992,142660,40302,38933,null,17369,155813,25780,21731,142668,142282,135287,14843,135279,157402,157462,162208,25834,151634,134211,36456,139681,166732,132913,null,18443,131497,16378,22643,142733,null,148936,132348,155799,134988,134550,21881,16571,17338,null,19124,141926,135325,33194,39157,134556,25465,14846,141173,36288,22177,25724,15939,null,173569,134665,142031,142537,null,135368,145858,14738,14854,164507,13688,155209,139463,22098,134961,142514,169760,13500,27709,151099,null,null,161140,142987,139784,173659,167117,134778,134196,157724,32659,135375,141315,141625,13819,152035,134796,135053,134826,16275,134960,134471,135503,134732,null,134827,134057,134472,135360,135485,16377,140950,25650,135085,144372,161337,142286,134526,134527,142417,142421,14872,134808,135367,134958,173618,158544,167122,167321,167114,38314,21708,33476,21945,null,171715,39974,39606,161630,142830,28992,33133,33004,23580,157042,33076,14231,21343,164029,37302,134906,134671,134775,134907,13789,151019,13833,134358,22191,141237,135369,134672,134776,135288,135496,164359,136277,134777,151120,142756,23124,135197,135198,135413,135414,22428,134673,161428,164557,135093,134779,151934,14083,135094,135552,152280,172733,149978,137274,147831,164476,22681,21096,13850,153405,31666,23400,18432,19244,40743,18919,39967,39821,154484,143677,22011,13810,22153,20008,22786,138177,194680,38737,131206,20059,20155,13630,23587,24401,24516,14586,25164,25909,27514,27701,27706,28780,29227,20012,29357,149737,32594,31035,31993,32595,156266,13505,null,156491,32770,32896,157202,158033,21341,34916,35265,161970,35744,36125,38021,38264,38271,38376,167439,38886,39029,39118,39134,39267,170000,40060,40479,40644,27503,63751,20023,131207,38429,25143,38050,null,20539,28158,171123,40870,15817,34959,147790,28791,23797,19232,152013,13657,154928,24866,166450,36775,37366,29073,26393,29626,144001,172295,15499,137600,19216,30948,29698,20910,165647,16393,27235,172730,16931,34319,133743,31274,170311,166634,38741,28749,21284,139390,37876,30425,166371,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,22736,138678,24210,24217,24514,141074,25995,144377,26905,27203,146531,27903,null,29184,148741,29580,16091,150035,23317,29881,35715,154788,153237,31379,31724,31939,32364,33528,34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,167353,136255,16497,17058,23066,null,null,null,39016,26475,17014,22333,null,34262,149883,33471,160013,19585,159092,23931,158485,159678,40877,40878,23446,40879,26343,32347,28247,31178,15752,17603,143958,141206,17306,17718,null,23765,146202,35577,23672,15634,144721,23928,40882,29015,17752,147692,138787,19575,14712,13386,131492,158785,35532,20404,131641,22975,33132,38998,170234,24379,134047,null,139713,166253,16642,18107,168057,16135,40883,172469,16632,14294,18167,158790,16764,165554,160767,17773,14548,152730,17761,17691,19849,19579,19830,17898,16328,150287,13921,17630,17597,16877,23870,23880,23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,25368,14840,22193,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,28201,28294,166336,28347,28386,28378,40831,28392,28393,28452,28468,15686,147265,28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,28809,131877,17345,13809,134872,147159,22462,159443,28990,153568,13902,27042,166889,23412,31305,153825,169177,31333,31357,154028,31419,31408,31426,31427,29137,156813,16842,31450,31453,31466,16879,21682,154625,31499,31573,31529,152334,154878,31650,31599,33692,154548,158847,31696,33825,31634,31672,154912,15789,154725,33938,31738,31750,31797,154817,31812,31875,149634,31910,26237,148856,31945,31943,31974,31860,31987,31989,31950,32359,17693,159300,32093,159446,29837,32137,32171,28981,32179,32210,147543,155689,32228,15635,32245,137209,32229,164717,32285,155937,155994,32366,32402,17195,37996,32295,32576,32577,32583,31030,156368,39393,32663,156497,32675,136801,131176,17756,145254,17667,164666,32762,156809,32773,32776,32797,32808,32815,172167,158915,32827,32828,32865,141076,18825,157222,146915,157416,26405,32935,166472,33031,33050,22704,141046,27775,156824,151480,25831,136330,33304,137310,27219,150117,150165,17530,33321,133901,158290,146814,20473,136445,34018,33634,158474,149927,144688,137075,146936,33450,26907,194964,16859,34123,33488,33562,134678,137140,14017,143741,144730,33403,33506,33560,147083,159139,158469,158615,144846,15807,33565,21996,33669,17675,159141,33708,33729,33747,13438,159444,27223,34138,13462,159298,143087,33880,154596,33905,15827,17636,27303,33866,146613,31064,33960,158614,159351,159299,34014,33807,33681,17568,33939,34020,154769,16960,154816,17731,34100,23282,159385,17703,34163,17686,26559,34326,165413,165435,34241,159880,34306,136578,159949,194994,17770,34344,13896,137378,21495,160666,34430,34673,172280,34798,142375,34737,34778,34831,22113,34412,26710,17935,34885,34886,161248,146873,161252,34910,34972,18011,34996,34997,25537,35013,30583,161551,35207,35210,35238,35241,35239,35260,166437,35303,162084,162493,35484,30611,37374,35472,162393,31465,162618,147343,18195,162616,29052,35596,35615,152624,152933,35647,35660,35661,35497,150138,35728,35739,35503,136927,17941,34895,35995,163156,163215,195028,14117,163155,36054,163224,163261,36114,36099,137488,36059,28764,36113,150729,16080,36215,36265,163842,135188,149898,15228,164284,160012,31463,36525,36534,36547,37588,36633,36653,164709,164882,36773,37635,172703,133712,36787,18730,166366,165181,146875,24312,143970,36857,172052,165564,165121,140069,14720,159447,36919,165180,162494,36961,165228,165387,37032,165651,37060,165606,37038,37117,37223,15088,37289,37316,31916,166195,138889,37390,27807,37441,37474,153017,37561,166598,146587,166668,153051,134449,37676,37739,166625,166891,28815,23235,166626,166629,18789,37444,166892,166969,166911,37747,37979,36540,38277,38310,37926,38304,28662,17081,140922,165592,135804,146990,18911,27676,38523,38550,16748,38563,159445,25050,38582,30965,166624,38589,21452,18849,158904,131700,156688,168111,168165,150225,137493,144138,38705,34370,38710,18959,17725,17797,150249,28789,23361,38683,38748,168405,38743,23370,168427,38751,37925,20688,143543,143548,38793,38815,38833,38846,38848,38866,38880,152684,38894,29724,169011,38911,38901,168989,162170,19153,38964,38963,38987,39014,15118,160117,15697,132656,147804,153350,39114,39095,39112,39111,19199,159015,136915,21936,39137,39142,39148,37752,39225,150057,19314,170071,170245,39413,39436,39483,39440,39512,153381,14020,168113,170965,39648,39650,170757,39668,19470,39700,39725,165376,20532,39732,158120,14531,143485,39760,39744,171326,23109,137315,39822,148043,39938,39935,39948,171624,40404,171959,172434,172459,172257,172323,172511,40318,40323,172340,40462,26760,40388,139611,172435,172576,137531,172595,40249,172217,172724,40592,40597,40606,40610,19764,40618,40623,148324,40641,15200,14821,15645,20274,14270,166955,40706,40712,19350,37924,159138,40727,40726,40761,22175,22154,40773,39352,168075,38898,33919,40802,40809,31452,40846,29206,19390,149877,149947,29047,150008,148296,150097,29598,166874,137466,31135,166270,167478,37737,37875,166468,37612,37761,37835,166252,148665,29207,16107,30578,31299,28880,148595,148472,29054,137199,28835,137406,144793,16071,137349,152623,137208,14114,136955,137273,14049,137076,137425,155467,14115,136896,22363,150053,136190,135848,136134,136374,34051,145062,34051,33877,149908,160101,146993,152924,147195,159826,17652,145134,170397,159526,26617,14131,15381,15847,22636,137506,26640,16471,145215,147681,147595,147727,158753,21707,22174,157361,22162,135135,134056,134669,37830,166675,37788,20216,20779,14361,148534,20156,132197,131967,20299,20362,153169,23144,131499,132043,14745,131850,132116,13365,20265,131776,167603,131701,35546,131596,20120,20685,20749,20386,20227,150030,147082,20290,20526,20588,20609,20428,20453,20568,20732,20825,20827,20829,20830,28278,144789,147001,147135,28018,137348,147081,20904,20931,132576,17629,132259,132242,132241,36218,166556,132878,21081,21156,133235,21217,37742,18042,29068,148364,134176,149932,135396,27089,134685,29817,16094,29849,29716,29782,29592,19342,150204,147597,21456,13700,29199,147657,21940,131909,21709,134086,22301,37469,38644,37734,22493,22413,22399,13886,22731,23193,166470,136954,137071,136976,23084,22968,37519,23166,23247,23058,153926,137715,137313,148117,14069,27909,29763,23073,155267,23169,166871,132115,37856,29836,135939,28933,18802,37896,166395,37821,14240,23582,23710,24158,24136,137622,137596,146158,24269,23375,137475,137476,14081,137376,14045,136958,14035,33066,166471,138682,144498,166312,24332,24334,137511,137131,23147,137019,23364,34324,161277,34912,24702,141408,140843,24539,16056,140719,140734,168072,159603,25024,131134,131142,140827,24985,24984,24693,142491,142599,149204,168269,25713,149093,142186,14889,142114,144464,170218,142968,25399,173147,25782,25393,25553,149987,142695,25252,142497,25659,25963,26994,15348,143502,144045,149897,144043,21773,144096,137433,169023,26318,144009,143795,15072,16784,152964,166690,152975,136956,152923,152613,30958,143619,137258,143924,13412,143887,143746,148169,26254,159012,26219,19347,26160,161904,138731,26211,144082,144097,26142,153714,14545,145466,145340,15257,145314,144382,29904,15254,26511,149034,26806,26654,15300,27326,14435,145365,148615,27187,27218,27337,27397,137490,25873,26776,27212,15319,27258,27479,147392,146586,37792,37618,166890,166603,37513,163870,166364,37991,28069,28427,149996,28007,147327,15759,28164,147516,23101,28170,22599,27940,30786,28987,148250,148086,28913,29264,29319,29332,149391,149285,20857,150180,132587,29818,147192,144991,150090,149783,155617,16134,16049,150239,166947,147253,24743,16115,29900,29756,37767,29751,17567,159210,17745,30083,16227,150745,150790,16216,30037,30323,173510,15129,29800,166604,149931,149902,15099,15821,150094,16127,149957,149747,37370,22322,37698,166627,137316,20703,152097,152039,30584,143922,30478,30479,30587,149143,145281,14942,149744,29752,29851,16063,150202,150215,16584,150166,156078,37639,152961,30750,30861,30856,30930,29648,31065,161601,153315,16654,31131,33942,31141,27181,147194,31290,31220,16750,136934,16690,37429,31217,134476,149900,131737,146874,137070,13719,21867,13680,13994,131540,134157,31458,23129,141045,154287,154268,23053,131675,30960,23082,154566,31486,16889,31837,31853,16913,154547,155324,155302,31949,150009,137136,31886,31868,31918,27314,32220,32263,32211,32590,156257,155996,162632,32151,155266,17002,158581,133398,26582,131150,144847,22468,156690,156664,149858,32733,31527,133164,154345,154947,31500,155150,39398,34373,39523,27164,144447,14818,150007,157101,39455,157088,33920,160039,158929,17642,33079,17410,32966,33033,33090,157620,39107,158274,33378,33381,158289,33875,159143,34320,160283,23174,16767,137280,23339,137377,23268,137432,34464,195004,146831,34861,160802,23042,34926,20293,34951,35007,35046,35173,35149,153219,35156,161669,161668,166901,166873,166812,166393,16045,33955,18165,18127,14322,35389,35356,169032,24397,37419,148100,26068,28969,28868,137285,40301,35999,36073,163292,22938,30659,23024,17262,14036,36394,36519,150537,36656,36682,17140,27736,28603,140065,18587,28537,28299,137178,39913,14005,149807,37051,37015,21873,18694,37307,37892,166475,16482,166652,37927,166941,166971,34021,35371,38297,38311,38295,38294,167220,29765,16066,149759,150082,148458,16103,143909,38543,167655,167526,167525,16076,149997,150136,147438,29714,29803,16124,38721,168112,26695,18973,168083,153567,38749,37736,166281,166950,166703,156606,37562,23313,35689,18748,29689,147995,38811,38769,39224,134950,24001,166853,150194,38943,169178,37622,169431,37349,17600,166736,150119,166756,39132,166469,16128,37418,18725,33812,39227,39245,162566,15869,39323,19311,39338,39516,166757,153800,27279,39457,23294,39471,170225,19344,170312,39356,19389,19351,37757,22642,135938,22562,149944,136424,30788,141087,146872,26821,15741,37976,14631,24912,141185,141675,24839,40015,40019,40059,39989,39952,39807,39887,171565,39839,172533,172286,40225,19630,147716,40472,19632,40204,172468,172269,172275,170287,40357,33981,159250,159711,158594,34300,17715,159140,159364,159216,33824,34286,159232,145367,155748,31202,144796,144960,18733,149982,15714,37851,37566,37704,131775,30905,37495,37965,20452,13376,36964,152925,30781,30804,30902,30795,137047,143817,149825,13978,20338,28634,28633,28702,28702,21524,147893,22459,22771,22410,40214,22487,28980,13487,147884,29163,158784,151447,23336,137141,166473,24844,23246,23051,17084,148616,14124,19323,166396,37819,37816,137430,134941,33906,158912,136211,148218,142374,148417,22932,146871,157505,32168,155995,155812,149945,149899,166394,37605,29666,16105,29876,166755,137375,16097,150195,27352,29683,29691,16086,150078,150164,137177,150118,132007,136228,149989,29768,149782,28837,149878,37508,29670,37727,132350,37681,166606,166422,37766,166887,153045,18741,166530,29035,149827,134399,22180,132634,134123,134328,21762,31172,137210,32254,136898,150096,137298,17710,37889,14090,166592,149933,22960,137407,137347,160900,23201,14050,146779,14000,37471,23161,166529,137314,37748,15565,133812,19094,14730,20724,15721,15692,136092,29045,17147,164376,28175,168164,17643,27991,163407,28775,27823,15574,147437,146989,28162,28428,15727,132085,30033,14012,13512,18048,16090,18545,22980,37486,18750,36673,166940,158656,22546,22472,14038,136274,28926,148322,150129,143331,135856,140221,26809,26983,136088,144613,162804,145119,166531,145366,144378,150687,27162,145069,158903,33854,17631,17614,159014,159057,158850,159710,28439,160009,33597,137018,33773,158848,159827,137179,22921,23170,137139,23137,23153,137477,147964,14125,23023,137020,14023,29070,37776,26266,148133,23150,23083,148115,27179,147193,161590,148571,148170,28957,148057,166369,20400,159016,23746,148686,163405,148413,27148,148054,135940,28838,28979,148457,15781,27871,194597,150095,32357,23019,23855,15859,24412,150109,137183,32164,33830,21637,146170,144128,131604,22398,133333,132633,16357,139166,172726,28675,168283,23920,29583,31955,166489,168992,20424,32743,29389,29456,162548,29496,29497,153334,29505,29512,16041,162584,36972,29173,149746,29665,33270,16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,16348,30330,151388,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,30801,30822,33864,152885,31027,26627,31026,16643,16649,31121,31129,36795,31238,36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,134351,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,33044,17409,15161,33110,33113,33114,17427,22586,33148,33156,17445,33171,17453,33189,22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,34990,35071,35108,35143,35217,162151,35369,35384,35476,35508,35921,36052,36082,36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,19565,39968,14191,138178,40265,39994,40702,22096,40339,40381,40384,40444,38134,36790,40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,131220,131767,132000,26906,38083,22956,132311,22592,38081,14265,132565,132629,132726,136890,22359,29043,133826,133837,134079,21610,194619,134091,21662,134139,134203,134227,134245,134268,24807,134285,22138,134325,134365,134381,134511,134578,134600,26965,39983,34725,134660,134670,134871,135056,134957,134771,23584,135100,24075,135260,135247,135286,26398,135291,135304,135318,13895,135359,135379,135471,135483,21348,33965,135907,136053,135990,35713,136567,136729,137155,137159,20088,28859,137261,137578,137773,137797,138282,138352,138412,138952,25283,138965,139029,29080,26709,139333,27113,14024,139900,140247,140282,141098,141425,141647,33533,141671,141715,142037,35237,142056,36768,142094,38840,142143,38983,39613,142412,null,142472,142519,154600,142600,142610,142775,142741,142914,143220,143308,143411,143462,144159,144350,24497,26184,26303,162425,144743,144883,29185,149946,30679,144922,145174,32391,131910,22709,26382,26904,146087,161367,155618,146961,147129,161278,139418,18640,19128,147737,166554,148206,148237,147515,148276,148374,150085,132554,20946,132625,22943,138920,15294,146687,148484,148694,22408,149108,14747,149295,165352,170441,14178,139715,35678,166734,39382,149522,149755,150037,29193,150208,134264,22885,151205,151430,132985,36570,151596,21135,22335,29041,152217,152601,147274,150183,21948,152646,152686,158546,37332,13427,152895,161330,152926,18200,152930,152934,153543,149823,153693,20582,13563,144332,24798,153859,18300,166216,154286,154505,154630,138640,22433,29009,28598,155906,162834,36950,156082,151450,35682,156674,156746,23899,158711,36662,156804,137500,35562,150006,156808,147439,156946,19392,157119,157365,141083,37989,153569,24981,23079,194765,20411,22201,148769,157436,20074,149812,38486,28047,158909,13848,35191,157593,157806,156689,157790,29151,157895,31554,168128,133649,157990,37124,158009,31301,40432,158202,39462,158253,13919,156777,131105,31107,158260,158555,23852,144665,33743,158621,18128,158884,30011,34917,159150,22710,14108,140685,159819,160205,15444,160384,160389,37505,139642,160395,37680,160486,149968,27705,38047,160848,134904,34855,35061,141606,164979,137137,28344,150058,137248,14756,14009,23568,31203,17727,26294,171181,170148,35139,161740,161880,22230,16607,136714,14753,145199,164072,136133,29101,33638,162269,168360,23143,19639,159919,166315,162301,162314,162571,163174,147834,31555,31102,163849,28597,172767,27139,164632,21410,159239,37823,26678,38749,164207,163875,158133,136173,143919,163912,23941,166960,163971,22293,38947,166217,23979,149896,26046,27093,21458,150181,147329,15377,26422,163984,164084,164142,139169,164175,164233,164271,164378,164614,164655,164746,13770,164968,165546,18682,25574,166230,30728,37461,166328,17394,166375,17375,166376,166726,166868,23032,166921,36619,167877,168172,31569,168208,168252,15863,168286,150218,36816,29327,22155,169191,169449,169392,169400,169778,170193,170313,170346,170435,170536,170766,171354,171419,32415,171768,171811,19620,38215,172691,29090,172799,19857,36882,173515,19868,134300,36798,21953,36794,140464,36793,150163,17673,32383,28502,27313,20202,13540,166700,161949,14138,36480,137205,163876,166764,166809,162366,157359,15851,161365,146615,153141,153942,20122,155265,156248,22207,134765,36366,23405,147080,150686,25566,25296,137206,137339,25904,22061,154698,21530,152337,15814,171416,19581,22050,22046,32585,155352,22901,146752,34672,19996,135146,134473,145082,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,33527,22053,33074,33816,32957,21994,31074,22083,21526,134813,13774,22021,22001,26353,164578,13869,30004,22000,21946,21655,21874,134209,134294,24272,151880,134774,142434,134818,40619,32090,21982,135285,25245,38765,21652,36045,29174,37238,25596,25529,25598,21865,142147,40050,143027,20890,13535,134567,20903,21581,21790,21779,30310,36397,157834,30129,32950,34820,34694,35015,33206,33820,135361,17644,29444,149254,23440,33547,157843,22139,141044,163119,147875,163187,159440,160438,37232,135641,37384,146684,173737,134828,134905,29286,138402,18254,151490,163833,135147,16634,40029,25887,142752,18675,149472,171388,135148,134666,24674,161187,135149,null,155720,135559,29091,32398,40272,19994,19972,13687,23309,27826,21351,13996,14812,21373,13989,149016,22682,150382,33325,21579,22442,154261,133497,null,14930,140389,29556,171692,19721,39917,146686,171824,19547,151465,169374,171998,33884,146870,160434,157619,145184,25390,32037,147191,146988,14890,36872,21196,15988,13946,17897,132238,30272,23280,134838,30842,163630,22695,16575,22140,39819,23924,30292,173108,40581,19681,30201,14331,24857,143578,148466,null,22109,135849,22439,149859,171526,21044,159918,13741,27722,40316,31830,39737,22494,137068,23635,25811,169168,156469,160100,34477,134440,159010,150242,134513,null,20990,139023,23950,38659,138705,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,39726,31810,31878,39957,31740,39689,40727,39963,149822,40794,21875,23491,20477,40600,20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,39232,38842,21292,24880,26924,21466,39946,40194,19515,38465,27008,20646,30022,137069,39386,21107,null,37209,38529,37212,null,37201,167575,25471,159011,27338,22033,37262,30074,25221,132092,29519,31856,154657,146685,null,149785,30422,39837,20010,134356,33726,34882,null,23626,27072,20717,22394,21023,24053,20174,27697,131570,20281,21660,21722,21146,36226,13822,24332,13811,null,27474,37244,40869,39831,38958,39092,39610,40616,40580,29050,31508,null,27642,34840,32632,null,22048,173642,36471,40787,null,36308,36431,40476,36353,25218,164733,36392,36469,31443,150135,31294,30936,27882,35431,30215,166490,40742,27854,34774,30147,172722,30803,194624,36108,29410,29553,35629,29442,29937,36075,150203,34351,24506,34976,17591,null,137275,159237,null,35454,140571,null,24829,30311,39639,40260,37742,39823,34805,null,34831,36087,29484,38689,39856,13782,29362,19463,31825,39242,155993,24921,19460,40598,24957,null,22367,24943,25254,25145,25294,14940,25058,21418,144373,25444,26626,13778,23895,166850,36826,167481,null,20697,138566,30982,21298,38456,134971,16485,null,30718,null,31938,155418,31962,31277,32870,32867,32077,29957,29938,35220,33306,26380,32866,160902,32859,29936,33027,30500,35209,157644,30035,159441,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,27058,36262,null,35241,29800,28089,34753,147473,29927,15835,29046,24740,24988,15569,29026,24695,null,32625,166701,29264,24809,19326,21024,15384,146631,155351,161366,152881,137540,135934,170243,159196,159917,23745,156077,166415,145015,131310,157766,151310,17762,23327,156492,40784,40614,156267,12288,65292,12289,12290,65294,8231,65307,65306,65311,65281,65072,8230,8229,65104,65105,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,65115,65116,65117,65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,8453,175,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,8801,65122,65123,65124,65125,65126,65374,8745,8746,8869,8736,8735,8895,13266,13265,8747,8750,8757,8756,9792,9794,8853,8857,8593,8595,8592,8594,8598,8599,8601,8600,8741,8739,65295,65340,8725,65128,65284,65509,12306,65504,65505,65285,65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,9582,9584,9583,9552,9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,729,713,714,711,715,9216,9217,9218,9219,9220,9221,9222,9223,9224,9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240,9241,9242,9243,9244,9245,9246,9247,9249,8364,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19968,20057,19969,19971,20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,24051,24062,24178,24318,24331,24339,25165,19985,19984,19981,20013,20016,20025,20043,23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,21488,21477,21485,21499,22235,22234,22806,22830,22833,22900,22902,23381,23427,23612,24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,23546,23574,23673,24030,24070,24182,24180,24335,24347,24537,24534,25102,25100,25101,25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,22256,22244,22251,22346,22353,22336,22349,22343,22350,22334,22352,22351,22331,22767,22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,32925,32920,32923,32922,32946,33391,33426,33419,33421,35211,35282,35328,35895,35910,35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,23448,23452,23449,23451,23578,23624,23621,23622,23735,23713,23736,23721,23723,23729,23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,27867,27850,27820,27887,27868,27862,27872,28821,28814,28818,28810,28825,29228,29229,29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,21670,21683,21703,21698,21693,21674,21697,21700,21704,21679,21675,21681,21691,21673,21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,27946,27969,27941,27916,27953,27934,27927,27963,27965,27966,27958,27931,27893,27961,27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,36557,36556,36848,36838,36834,36842,36837,36845,36843,36836,36840,37066,37070,37057,37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,24237,24231,24369,24466,24465,24464,24665,24675,24677,24656,24661,24685,24681,24687,24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,30697,30768,30759,30776,30749,30772,30775,30757,30765,30752,30751,30770,31061,31056,31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,37335,37340,37337,38275,38498,38499,38497,38491,38493,38500,38488,38494,38587,39138,39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,24713,24736,24744,24779,24756,24806,24765,24773,24763,24757,24796,24764,24792,24789,24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,29706,29699,29702,29694,29709,29920,29942,29943,29980,29986,30053,30054,30050,30064,30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,36894,36896,36879,36898,36886,36891,36884,37096,37101,37117,37207,37326,37365,37350,37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,25484,25551,25536,25577,25545,25542,25549,25554,25571,25552,25569,25558,25581,25582,25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,30831,31245,31240,31243,31237,31232,31384,31383,31382,31461,31459,31561,31574,31558,31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,37392,37383,37393,38292,38287,38283,38289,38291,38290,38286,38538,38542,38539,38525,38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,26262,26244,26264,26253,26371,27028,26989,26970,26999,26976,26964,26997,26928,27010,26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,33137,33136,33144,33125,33134,33139,33131,33145,33146,33126,33285,33351,33922,33911,33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,38929,38931,38922,38930,38924,39164,39156,39165,39166,39347,39345,39348,39649,40169,40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,28457,28478,28448,28460,28431,28418,28450,28415,28399,28422,28465,28472,28466,28451,28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,35468,35486,35491,35469,35489,35475,35492,35498,35493,35496,35480,35473,35482,35495,35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,24501,24950,24935,24942,24925,24917,24962,24956,24944,24939,24958,24999,24976,25003,24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,32158,32217,32242,32249,32629,32631,32687,32745,32806,33179,33180,33181,33184,33178,33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,39719,39749,39748,39799,39791,40198,40201,40195,40617,40638,40654,22696,40786,20754,20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,31707,31713,31721,31718,31957,31958,32266,32273,32264,32283,32291,32286,32285,32265,32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,20786,21237,22158,22144,22160,22149,22151,22159,22741,22739,22737,22734,23344,23338,23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,33213,33225,33214,33256,33289,33393,34218,34180,34174,34204,34193,34196,34223,34203,34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,29559,29557,29863,29887,29973,30294,30296,30290,30653,30655,30651,30652,30990,31150,31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,28693,28696,29190,29197,29272,29346,29560,29562,29885,29898,29923,30087,30086,30303,30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,31811,31821,31983,31984,36782,32381,32380,32386,32588,32768,33242,33382,34299,34297,34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,28753,28760,29568,29924,30090,30318,30316,31155,31840,31839,32894,32893,33247,35186,35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,40474,29224,39530,39729,40475,40478,31858,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,21304,21353,21430,22794,23424,24027,12083,24191,24308,24400,24417,25908,26080,30098,30326,36789,38582,168,710,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,65339,65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,131276,20058,131210,20994,17553,40880,20872,40881,161287,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65506,65508,65287,65282,12849,8470,8481,12443,12444,11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,11998,12003,null,null,null,643,592,603,596,629,339,248,331,650,618,20034,20060,20981,21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,23667,24068,24192,24194,24521,25097,25168,27669,27702,27715,27711,27707,29358,29360,29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,21559,21546,21588,21573,21529,21532,21541,21528,21565,21583,21569,21544,21540,21575,22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,32914,32924,33424,33423,33413,33422,33425,33427,33418,33411,33412,35960,36809,36799,37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,24445,24542,24549,24621,24614,24601,24626,24587,24628,24586,24599,24627,24602,24606,24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,30449,30448,30453,30712,30716,30713,30715,30714,30711,31042,31039,31173,31352,31355,31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,23464,23628,23760,23768,23756,23767,23755,23771,23774,23770,23753,23751,23754,23766,23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,27908,27929,27962,27930,27921,27904,27933,27970,27905,27928,27959,27907,27919,27968,27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,33505,33522,33525,33548,33531,33526,33520,33514,33508,33504,33530,33523,33517,34423,34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,24234,24236,24371,24368,24423,24669,24666,24679,24641,24738,24712,24704,24722,24705,24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,28869,28870,28871,28890,28878,28897,29250,29304,29303,29302,29440,29434,29428,29438,29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,33617,33573,33622,33599,33601,33574,33564,33570,33602,33614,33563,33578,33544,33596,33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,21802,21841,21858,21814,21813,21808,21842,21829,21772,21810,21861,21838,21817,21832,21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,25461,25500,25453,25518,25468,25508,25403,25503,25464,25477,25473,25489,25485,25456,25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,29707,29684,29704,30052,30051,30158,30162,30159,30155,30156,30161,30160,30351,30345,30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,33671,33710,33654,33690,34393,34390,34495,34487,34498,34497,34501,34490,34480,34504,34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,21926,21887,21909,21921,21902,22284,22569,22583,22553,22558,22567,22563,22568,22517,22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,25960,25957,25996,26013,26014,26030,26064,26066,26236,26220,26235,26240,26225,26233,26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,29475,29493,29452,29742,29740,29744,29739,29718,29722,29729,29741,29745,29732,29731,29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,33737,33801,33807,33758,33809,33798,33730,33779,33749,33786,33735,33745,33770,33811,33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,37398,38267,38285,38284,38288,38535,38526,38536,38537,38531,38528,38594,38600,38595,38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,25541,25585,25579,25616,25618,25609,25632,25636,25651,25667,25631,25621,25624,25657,25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,28994,29016,28995,29003,29040,29023,29008,29011,28996,29005,29018,29263,29325,29324,29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,33115,33122,33138,26401,33118,33142,33127,33135,33092,33121,33309,33353,33348,33344,33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,36608,36613,36615,36616,36610,36619,36946,36927,36932,36937,36925,37136,37133,37135,37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,23276,23262,23261,23257,23272,23263,23415,23520,23523,23651,23938,23936,23933,23942,23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,28441,28442,28455,28440,28475,28434,28397,28426,28470,28531,28409,28398,28461,28480,28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,32169,32161,32201,32627,32738,32739,32741,32734,32804,32861,32860,33161,33158,33155,33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,37540,37494,37531,37498,37536,37524,37546,37517,37542,37530,37547,37497,37527,37503,37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,24498,24971,24963,24953,25009,25008,24994,24969,24987,24979,25007,25005,24991,24978,25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,29534,29535,29536,29533,29531,29537,29530,29529,29538,29831,29833,29834,29830,29825,29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,34041,34072,34080,34096,34059,34073,34095,34402,34646,34659,34660,34679,34785,34675,34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,37581,37589,37577,37600,37598,37607,37585,37587,37557,37601,37574,37556,38268,38316,38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,25000,24982,25029,25012,25030,25025,25036,25018,25023,25016,24972,25815,25814,25808,25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,30621,30625,30620,30619,30626,30627,30613,30617,30615,30941,30953,30949,30954,30942,30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,35106,35113,35107,35119,35116,35103,35313,35552,35554,35570,35572,35573,35549,35604,35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,39806,39803,39810,39827,39826,39824,39802,39829,39805,39816,40229,40215,40224,40222,40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,30279,30372,30441,30645,30635,30642,30647,30646,30644,30641,30632,30704,30963,30973,30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,35127,35138,35245,35247,35246,35314,35315,35614,35608,35606,35601,35589,35595,35618,35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,40257,40295,40246,40238,40239,40241,40248,40240,40261,40258,40259,40254,40247,40256,40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,32339,32693,32691,32759,32760,32885,33233,33234,33232,33375,33374,34228,34246,34240,34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,38690,38693,38828,38830,38824,38827,38820,38826,38818,38821,38871,38873,38870,38872,38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,29974,30304,30665,30666,30660,30705,31005,31003,31009,31004,30999,31006,31152,31335,31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,38362,38363,38625,38697,38699,38700,38696,38694,38835,38839,38838,38877,38878,38879,39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,30669,30706,31013,31011,31015,31016,31012,31017,31154,31342,31340,31341,31479,31817,31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,40351,40345,40356,40349,40338,40344,40336,40347,40352,40340,40348,40362,40343,40353,40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,39254,39481,39485,39494,39492,39490,39489,39482,39487,39629,39701,39703,39704,39702,39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,39259,39502,39507,39508,39500,39503,39496,39498,39497,39506,39504,39632,39705,39723,39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,40691,40710,40732,40760,40759,40758,40771,40783,40817,40816,40814,40815,22227,22221,23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,40052,40051,40049,40053,40468,40467,40694,40714,40868,28776,28773,31991,34410,34878,34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,40058,40477,28777,28778,40612,40830,40777,40856,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,65517,132423,37595,132575,147397,34124,17077,29679,20917,13897,149826,166372,37700,137691,33518,146632,30780,26436,25311,149811,166314,131744,158643,135941,20395,140525,20488,159017,162436,144896,150193,140563,20521,131966,24484,131968,131911,28379,132127,20605,20737,13434,20750,39020,14147,33814,149924,132231,20832,144308,20842,134143,139516,131813,140592,132494,143923,137603,23426,34685,132531,146585,20914,20920,40244,20937,20943,20945,15580,20947,150182,20915,20962,21314,20973,33741,26942,145197,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,21216,34317,158483,21253,166622,21833,28377,147328,133460,147436,21299,21316,134114,27851,136998,26651,29653,24650,16042,14540,136936,29149,17570,21357,21364,165547,21374,21375,136598,136723,30694,21395,166555,21408,21419,21422,29607,153458,16217,29596,21441,21445,27721,20041,22526,21465,15019,134031,21472,147435,142755,21494,134263,21523,28793,21803,26199,27995,21613,158547,134516,21853,21647,21668,18342,136973,134877,15796,134477,166332,140952,21831,19693,21551,29719,21894,21929,22021,137431,147514,17746,148533,26291,135348,22071,26317,144010,26276,26285,22093,22095,30961,22257,38791,21502,22272,22255,22253,166758,13859,135759,22342,147877,27758,28811,22338,14001,158846,22502,136214,22531,136276,148323,22566,150517,22620,22698,13665,22752,22748,135740,22779,23551,22339,172368,148088,37843,13729,22815,26790,14019,28249,136766,23076,21843,136850,34053,22985,134478,158849,159018,137180,23001,137211,137138,159142,28017,137256,136917,23033,159301,23211,23139,14054,149929,23159,14088,23190,29797,23251,159649,140628,15749,137489,14130,136888,24195,21200,23414,25992,23420,162318,16388,18525,131588,23509,24928,137780,154060,132517,23539,23453,19728,23557,138052,23571,29646,23572,138405,158504,23625,18653,23685,23785,23791,23947,138745,138807,23824,23832,23878,138916,23738,24023,33532,14381,149761,139337,139635,33415,14390,15298,24110,27274,24181,24186,148668,134355,21414,20151,24272,21416,137073,24073,24308,164994,24313,24315,14496,24316,26686,37915,24333,131521,194708,15070,18606,135994,24378,157832,140240,24408,140401,24419,38845,159342,24434,37696,166454,24487,23990,15711,152144,139114,159992,140904,37334,131742,166441,24625,26245,137335,14691,15815,13881,22416,141236,31089,15936,24734,24740,24755,149890,149903,162387,29860,20705,23200,24932,33828,24898,194726,159442,24961,20980,132694,24967,23466,147383,141407,25043,166813,170333,25040,14642,141696,141505,24611,24924,25886,25483,131352,25285,137072,25301,142861,25452,149983,14871,25656,25592,136078,137212,25744,28554,142902,38932,147596,153373,25825,25829,38011,14950,25658,14935,25933,28438,150056,150051,25989,25965,25951,143486,26037,149824,19255,26065,16600,137257,26080,26083,24543,144384,26136,143863,143864,26180,143780,143781,26187,134773,26215,152038,26227,26228,138813,143921,165364,143816,152339,30661,141559,39332,26370,148380,150049,15147,27130,145346,26462,26471,26466,147917,168173,26583,17641,26658,28240,37436,26625,144358,159136,26717,144495,27105,27147,166623,26995,26819,144845,26881,26880,15666,14849,144956,15232,26540,26977,166474,17148,26934,27032,15265,132041,33635,20624,27129,144985,139562,27205,145155,27293,15347,26545,27336,168348,15373,27421,133411,24798,27445,27508,141261,28341,146139,132021,137560,14144,21537,146266,27617,147196,27612,27703,140427,149745,158545,27738,33318,27769,146876,17605,146877,147876,149772,149760,146633,14053,15595,134450,39811,143865,140433,32655,26679,159013,159137,159211,28054,27996,28284,28420,149887,147589,159346,34099,159604,20935,27804,28189,33838,166689,28207,146991,29779,147330,31180,28239,23185,143435,28664,14093,28573,146992,28410,136343,147517,17749,37872,28484,28508,15694,28532,168304,15675,28575,147780,28627,147601,147797,147513,147440,147380,147775,20959,147798,147799,147776,156125,28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,148087,28971,28997,23176,29002,29038,23708,148325,29007,37730,148161,28972,148570,150055,150050,29114,166888,28861,29198,37954,29205,22801,37955,29220,37697,153093,29230,29248,149876,26813,29269,29271,15957,143428,26637,28477,29314,29482,29483,149539,165931,18669,165892,29480,29486,29647,29610,134202,158254,29641,29769,147938,136935,150052,26147,14021,149943,149901,150011,29687,29717,26883,150054,29753,132547,16087,29788,141485,29792,167602,29767,29668,29814,33721,29804,14128,29812,37873,27180,29826,18771,150156,147807,150137,166799,23366,166915,137374,29896,137608,29966,29929,29982,167641,137803,23511,167596,37765,30029,30026,30055,30062,151426,16132,150803,30094,29789,30110,30132,30210,30252,30289,30287,30319,30326,156661,30352,33263,14328,157969,157966,30369,30373,30391,30412,159647,33890,151709,151933,138780,30494,30502,30528,25775,152096,30552,144044,30639,166244,166248,136897,30708,30729,136054,150034,26826,30895,30919,30931,38565,31022,153056,30935,31028,30897,161292,36792,34948,166699,155779,140828,31110,35072,26882,31104,153687,31133,162617,31036,31145,28202,160038,16040,31174,168205,31188],
+  "euc-kr":[44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,null,null,null,null,null,null,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,44115,44117,null,null,null,null,null,null,44118,44119,44121,44122,44123,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,null,null,null,null,null,null,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,44374,44375,null,null,null,null,null,null,44377,44378,44379,44380,44381,44382,44383,44384,44386,44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,null,null,null,null,null,null,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,44603,44604,null,null,null,null,null,null,44605,44606,44607,44610,44612,44615,44616,44617,44619,44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,null,null,null,null,null,null,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,null,null,null,null,null,null,44836,44837,44838,44839,44840,44841,44842,44843,44846,44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,null,null,null,null,null,null,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,45058,45059,null,null,null,null,null,null,45061,45062,45063,45064,45065,45066,45067,45069,45070,45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,null,null,null,null,null,null,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,null,null,null,null,null,null,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,null,null,null,null,null,null,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,45523,45525,null,null,null,null,null,null,45526,45527,45528,45529,45530,45531,45534,45536,45537,45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,null,null,null,null,null,null,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,45750,45751,null,null,null,null,null,null,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,null,null,null,null,null,null,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,45995,45997,null,null,null,null,null,null,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,null,null,null,null,null,null,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46209,46210,null,null,null,null,null,null,46211,46212,46213,46214,46215,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,null,null,null,null,null,null,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,46441,46442,null,null,null,null,null,null,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,null,null,null,null,null,null,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,46649,46650,null,null,null,null,null,null,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,null,null,null,null,null,null,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,46841,46842,null,null,null,null,null,null,46843,46844,46845,46846,46847,46850,46851,46852,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,null,null,null,null,null,null,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,null,null,null,null,null,null,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,null,null,null,null,null,null,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,47292,47293,null,null,null,null,null,null,47294,47295,47298,47300,47302,47303,47304,47305,47306,47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,null,null,null,null,null,null,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,null,null,null,null,null,null,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,null,null,null,null,null,null,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,47761,47762,null,null,null,null,null,null,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,null,null,null,null,null,null,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,47984,47985,null,null,null,null,null,null,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,null,null,null,null,null,null,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,48216,48217,null,null,null,null,null,null,48218,48219,48220,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,null,null,null,null,null,null,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,null,null,null,null,null,null,48442,48443,48444,48445,48446,48447,48449,48450,48451,48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,null,null,null,null,null,null,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,48658,48659,null,null,null,null,null,null,48661,48662,48663,48664,48665,48666,48667,48670,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,null,null,null,null,null,null,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,48884,48885,null,null,null,null,null,null,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,null,null,null,null,null,null,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,49079,49080,null,null,null,null,null,null,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,null,null,null,null,null,null,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,null,null,null,null,null,null,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,null,null,null,null,null,null,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,49530,49531,null,null,null,null,null,null,49532,49533,49534,49535,49536,49537,49538,49539,49540,49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,null,null,null,null,null,null,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,49764,49766,null,null,null,null,null,null,49767,49768,49769,49770,49771,49774,49775,49777,49778,49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,null,null,null,null,null,null,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,49996,49997,null,null,null,null,null,null,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,null,null,null,null,null,null,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,null,null,null,null,null,null,50203,50204,50205,50206,50207,50208,50209,50210,50211,50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,null,null,null,null,null,null,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,null,null,null,null,null,null,50400,50401,50402,50403,50404,50405,50406,50407,50408,50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,null,null,null,null,null,null,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,50662,50663,null,null,null,null,null,null,50664,50665,50666,50667,50671,50673,50674,50675,50677,50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,null,null,null,null,null,null,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,50929,50930,null,null,null,null,null,null,50931,50932,50933,50934,50935,50938,50939,50940,50942,50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,null,null,null,null,null,null,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,null,null,null,null,null,null,51195,51196,51197,51198,51199,51202,51203,51205,51206,51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,null,null,null,null,null,null,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,51427,51429,null,null,null,null,null,null,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,8835,8746,8745,8743,8744,65506,51472,51474,51475,51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,null,null,null,null,null,null,51501,51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,null,null,null,null,null,null,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,51560,51561,51562,51563,51565,51566,51567,8658,8660,8704,8707,180,65374,711,728,733,730,729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51569,51570,51571,51573,51574,51575,51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51594,51595,51597,51598,51599,null,null,null,null,null,null,51601,51602,51603,51604,51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,null,null,null,null,null,null,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,51668,51671,51672,51675,65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,51678,51679,51681,51683,51685,51686,51688,51689,51690,51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,51713,51714,51715,51716,null,null,null,null,null,null,51717,51718,51719,51722,51726,51727,51728,51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,null,null,null,null,null,null,51750,51751,51752,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,51818,null,null,null,null,null,null,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,51843,51845,51846,null,null,null,null,null,null,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,null,null,null,null,null,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,null,null,null,null,null,null,51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,null,null,null,null,null,null,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51977,51978,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,9542,9543,9544,9545,9546,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,51979,51980,51981,51982,51983,51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,52002,52003,52004,52005,52006,52007,52008,52009,null,null,null,null,null,null,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,null,null,null,null,null,null,52037,52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,52072,52073,52074,52075,52076,13205,13206,13207,8467,13208,13252,13219,13220,13221,13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,13267,13251,13257,13276,13254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,null,null,null,null,null,null,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52125,52126,52127,52128,52129,52130,52131,null,null,null,null,null,null,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,198,208,170,294,null,306,null,319,321,216,338,186,222,358,330,null,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,189,8531,8532,188,190,8539,8540,8541,8542,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,null,null,null,null,null,null,52192,52193,52194,52195,52197,52198,52200,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,null,null,null,null,null,null,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,230,273,240,295,305,307,312,320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,52261,52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,null,null,null,null,null,null,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,52338,null,null,null,null,null,null,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,52372,52373,52374,52375,52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,52398,52399,52400,52401,52402,52403,52406,52407,52409,null,null,null,null,null,null,52410,52411,52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,null,null,null,null,null,null,52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,52478,52479,52480,52482,52483,52484,52485,52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,52503,52506,52508,52510,52511,52512,null,null,null,null,null,null,52513,52514,52515,52517,52518,52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52538,52539,52540,52541,52542,null,null,null,null,null,null,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52573,52574,52575,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,52606,52607,52608,null,null,null,null,null,null,52609,52610,52611,52612,52613,52614,52615,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,52634,52635,52637,52638,52639,null,null,null,null,null,null,52640,52641,52642,52643,52646,52648,52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,null,null,null,null,null,null,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,52737,52738,null,null,null,null,null,null,52739,52741,52742,52743,52745,52746,52747,52749,52750,52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52780,52781,52782,52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,null,null,null,null,null,null,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,null,null,null,null,null,null,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,52879,52882,52883,52885,52886,52887,52889,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,52890,52891,52892,52893,52894,52895,52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,null,null,null,null,null,null,52923,52924,52925,52926,52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,null,null,null,null,null,null,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,52988,52989,52990,52991,44032,44033,44036,44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,52994,52995,52997,52998,52999,53001,53002,53003,53004,53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,53023,53025,53026,53027,null,null,null,null,null,null,53029,53030,53031,53032,53033,53034,53035,53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,null,null,null,null,null,null,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,53100,44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,44652,44656,44664,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,53133,null,null,null,null,null,null,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,53158,53159,53161,null,null,null,null,null,null,53162,53163,53164,53165,53166,53167,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,45134,45139,45140,45141,45143,45145,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,null,null,null,null,null,null,53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,null,null,null,null,null,null,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,45149,45180,45181,45184,45188,45196,45197,45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,45460,45464,45468,45480,45516,45520,45524,45532,45533,53294,53295,53296,53297,53298,53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,53318,53320,53322,53323,53324,53325,53326,53327,null,null,null,null,null,null,53329,53330,53331,53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,null,null,null,null,null,null,53361,53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,45535,45544,45545,45548,45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,53422,53423,53424,53425,53426,null,null,null,null,null,null,53427,53430,53432,53434,53435,53436,53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,53455,53458,53462,53463,53464,53465,53466,null,null,null,null,null,null,53467,53470,53471,53473,53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,45927,45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,46388,46392,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,null,null,null,null,null,null,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,53563,53564,53565,53566,null,null,null,null,null,null,53567,53570,53574,53575,53576,53577,53578,53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,46992,46993,46994,46998,46999,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,null,null,null,null,null,null,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,53671,null,null,null,null,null,null,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,47000,47001,47004,47008,47016,47017,47019,47020,47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,47439,47441,47448,47449,47452,47456,47464,47465,53712,53713,53714,53715,53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,null,null,null,null,null,null,53739,53740,53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,null,null,null,null,null,null,53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,47467,47469,47476,47477,47480,47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,53802,53803,53806,53807,53809,53810,53811,53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,53830,53831,53833,53834,53835,53836,null,null,null,null,null,null,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,53856,53857,53858,53859,53861,53862,53863,53864,null,null,null,null,null,null,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,53898,53899,53900,47872,47876,47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,48279,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,53930,53931,53933,null,null,null,null,null,null,53934,53935,53936,53938,53939,53940,53941,53942,53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,53965,53966,53967,53968,53969,null,null,null,null,null,null,53970,53971,53973,53974,53975,53977,53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,48731,48736,48737,48740,54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,null,null,null,null,null,null,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,54088,54089,null,null,null,null,null,null,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,48744,48746,48752,48753,48755,48756,48757,48763,48764,48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,49360,49368,49369,49371,49372,49373,49380,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,null,null,null,null,null,null,54152,54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,null,null,null,null,null,null,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,54223,54225,54226,54227,54228,54229,54230,49381,49384,49388,49396,49397,49399,49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,54231,54233,54234,54235,54236,54237,54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,54255,54257,54258,54259,54261,54262,54263,null,null,null,null,null,null,54264,54265,54266,54267,54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,null,null,null,null,null,null,54295,54296,54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,49711,49713,49714,49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,54328,54329,54330,54331,54332,54333,54334,54335,54337,54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,null,null,null,null,null,null,54356,54357,54358,54359,54360,54361,54362,54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,54379,54380,54382,54384,54385,54386,null,null,null,null,null,null,54387,54388,54389,54390,54391,54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,54429,50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,50634,50636,50638,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,null,null,null,null,null,null,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,54482,54483,54485,null,null,null,null,null,null,54486,54487,54488,54489,54490,54491,54493,54494,54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,50900,50908,50909,50912,50913,50920,54526,54527,54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,null,null,null,null,null,null,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,null,null,null,null,null,null,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,54618,54619,54621,54622,54623,54625,54626,54627,50921,50924,50928,50936,50937,50941,50948,50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,51165,51172,51176,51180,51200,51201,51204,51208,51210,54628,54630,54631,54634,54636,54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,54655,54656,54657,54658,54659,54662,54666,54667,null,null,null,null,null,null,54668,54669,54670,54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,null,null,null,null,null,null,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,51216,51217,51219,51221,51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,54730,54731,54733,54734,54735,54737,54739,54740,54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,54761,54762,54763,54765,54766,null,null,null,null,null,null,54767,54768,54769,54770,54771,54774,54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,54794,54795,54796,54797,54798,54799,54802,null,null,null,null,null,null,54806,54807,54808,54809,54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54842,54843,51669,51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,52281,52283,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,54880,54881,null,null,null,null,null,null,54882,54883,54884,54885,54886,54888,54890,54891,54892,54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,null,null,null,null,null,null,54913,54914,54916,54918,54919,54920,54921,54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,52776,52784,52785,52787,52789,54955,54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,null,null,null,null,null,null,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,55021,null,null,null,null,null,null,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55058,55059,55060,52824,52825,52828,52831,52832,52833,52840,52841,52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,53252,53265,53272,53293,53300,53301,53304,53308,55061,55062,55063,55066,55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,55086,55087,55088,55089,55090,55091,55094,55095,55097,null,null,null,null,null,null,55098,55099,55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,null,null,null,null,null,null,55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,55172,55173,55174,55175,55178,55179,53316,53317,53319,53321,53328,53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,55181,55182,55183,55185,55186,55187,55188,55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,53860,53888,53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,54273,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,54804,54805,54812,54816,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,54820,54829,54840,54841,54844,54848,54853,54856,54857,54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,55177,55180,55184,55192,55193,55195,55197,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20285,20339,20551,20729,21152,21487,21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21283,23724,30002,32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,25106,26690,26800,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,38799,20018,23521,25096,26524,29916,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31185,33747,35463,35506,36328,36942,37707,38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,39509,39851,19992,20037,20061,20167,20465,20855,21246,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21312,21475,21477,21646,22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,39740,63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,26071,26083,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,63778,30007,63779,63780,63781,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32013,63782,63783,34930,22218,23064,63784,63785,63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,63832,63833,23612,27877,21311,28346,22810,33590,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20025,20150,20294,21934,22296,22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26873,27330,28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,32645,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,24976,25088,25891,28451,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29001,29833,32244,32879,34030,36646,36899,37706,20925,21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,24278,26009,29134,30274,30637,32842,34044,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36988,39719,40845,22744,23105,23650,27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31435,31520,31890,25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,21563,21839,25991,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,39151,21187,25300,25765,28196,28497,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30332,36299,37297,37474,39662,39747,20515,20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,27861,29754,20731,21128,22721,25816,27287,29863,30294,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,30887,34327,38370,38713,63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23386,23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,32737,32933,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,40605,21066,63849,26388,63850,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20632,21034,23665,25955,27733,29642,29987,30109,31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,26646,26866,29312,29790,31598,32110,32214,32626,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32997,33298,34223,35199,35475,36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32854,32882,33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,24833,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,36848,37477,23815,23847,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,23913,29791,33181,34664,28629,25342,32722,35126,35186,19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,23460,23526,24713,23529,23563,24515,27777,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63858,28145,28683,29978,33455,35574,20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,27387,32588,40367,40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,29744,33398,33490,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,25942,26111,26212,26791,27738,28595,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28879,29100,29522,31613,34568,35492,39986,40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,25854,63934,26332,63935,27208,63936,29183,29796,63937,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31368,31407,32327,32350,32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36939,38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,28216,63947,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,33380,34191,34811,34915,35516,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,35696,37291,20108,20197,20234,63965,63966,22839,23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,63988,63989,31252,63990,33615,36035,20837,21316,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,63991,63992,63993,20173,21097,23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38556,20877,21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,28593,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,37580,37664,38662,38742,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38748,38914,40718,21046,21137,21884,22564,24093,24351,24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,28121,29742,31278,32066,32156,32305,33131,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36394,36405,37758,37912,20304,22352,24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21675,22320,22336,24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,20874,26613,31574,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,21119,21736,24980,25220,25307,26786,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,26898,26970,27189,28818,28966,30813,30977,30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,20805,24544,27798,34802,34909,34935,24756,33205,33795,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,36101,21462,21561,22068,23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,37944,21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,36774,37393,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,34920,35961,39111,39108,39491,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,21697,31263,26963,35575,35914,39080,39342,24444,25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,25239,26477,26689,27782,28207,32568,32923,33322,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,64008,64009,38917,20133,20565,21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24418,27842,28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,30069,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,26313,26783,28045,28102,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,29243,32948,37237,39501,20399,20505,21402,21518,21564,21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,29113,29114,29351,31143,31232,32690,35440,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+  "gb18030":[19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,20112,20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20494,20496,20497,20499,20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20744,20745,20746,20748,20749,20750,20751,20752,20753,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,21376,21377,21379,21383,21384,21386,21390,21391,21392,21393,21394,21395,21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,21791,21793,21797,21798,21800,21801,21803,21805,21810,21812,21813,21814,21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,22388,22389,22392,22393,22394,22397,22398,22399,22400,22401,22407,22408,22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,22663,22664,22666,22667,22668,22669,22670,22671,22672,22673,22676,22677,22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,22950,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,23213,23214,23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,23497,23498,23499,23501,23502,23503,23505,23508,23509,23510,23511,23512,23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,23807,23808,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,24048,24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,24348,24349,24350,24353,24354,24355,24356,24360,24363,24364,24366,24368,24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,24695,24702,24704,24705,24706,24709,24710,24711,24712,24714,24715,24718,24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,25268,25270,25271,25272,25274,25278,25280,25281,25283,25291,25295,25297,25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,25631,25634,25635,25636,25637,25639,25640,25641,25643,25646,25647,25648,25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,26183,26184,26185,26186,26189,26190,26192,26193,26200,26201,26203,26204,26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,26476,26478,26481,26484,26486,26488,26489,26490,26491,26493,26496,26498,26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,27070,27071,27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,27297,27298,27299,27300,27301,27302,27303,27304,27306,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,27525,27528,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,27865,27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,28202,28204,28206,28208,28209,28211,28213,28214,28215,28217,28219,28220,28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,28480,28481,28482,28483,28484,28485,28488,28489,28490,28492,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,28970,28971,28972,28973,28974,28978,28979,28980,28981,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,29402,29403,58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,58629,58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,58656,58657,58658,58659,58660,58661,12288,12289,12290,183,713,711,168,12291,12293,8212,65374,8214,8230,8216,8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,8251,8594,8592,8593,8595,12307,58662,58663,58664,58665,58666,58667,58668,58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,59238,59239,59240,59241,59242,59243,9352,9353,9354,9355,9356,9357,9358,9359,9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,8364,59245,12832,12833,12834,12835,12836,12837,12838,12839,12840,12841,59246,59247,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,59248,59249,58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,58821,58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,58848,58849,58850,58851,58852,12288,65281,65282,65283,65509,65285,65286,65287,65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,65372,65373,65507,58854,58855,58856,58857,58858,58859,58860,58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,58913,58914,58915,58916,58917,58918,58919,58920,58921,58922,58923,58924,58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,59041,59042,59043,59044,59045,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,59261,59262,59263,59264,59265,59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,59108,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,59133,59134,59135,59136,59137,59138,59139,59140,59141,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,59269,59270,59271,59272,59273,59274,59275,59276,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,59277,59278,59279,59280,59281,59282,59283,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,59284,59285,65083,65084,65079,65080,65073,59286,65075,65076,59287,59288,59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,59200,59201,59202,59203,59204,59205,59206,59207,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,59296,59297,59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,59311,59312,59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,714,715,729,8211,8213,8229,8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,9608,9609,9610,9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,8853,12306,12317,12318,59324,59325,59326,59327,59328,59329,59330,59331,59332,59333,59334,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,249,470,472,474,476,252,234,593,7743,324,328,505,609,59337,59338,59339,59340,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,59341,59342,59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,59356,59357,59358,59359,59360,59361,12321,12322,12323,12324,12325,12326,12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,13266,13269,65072,65506,65508,59362,8481,12849,59363,8208,59364,59365,59366,12540,12443,12444,12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,65120,65121,65122,65123,65124,65125,65126,65128,65129,65130,65131,12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,12295,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,59392,9472,9473,9474,9475,9476,9477,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,59405,59406,59407,29404,29405,29407,29410,29411,29412,29413,29414,29415,29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,57432,57433,57434,57435,57436,57437,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,29630,29631,29633,29635,29636,29637,29638,29639,29643,29644,29646,29650,29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,29685,29686,29687,57438,57439,57440,57441,57442,57443,57444,57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,57523,57524,57525,57526,57527,57528,57529,57530,57531,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,29807,29809,29810,29811,29812,29813,29816,29817,29818,57532,57533,57534,57535,57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,29819,29820,29821,29823,29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,29937,29938,57626,57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,57718,57719,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,30077,30078,30080,30081,30082,30084,30085,30087,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,57809,57810,57811,57812,57813,30088,30089,30090,30092,30093,30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,30205,30206,30210,30212,30214,30215,30216,30217,30219,30221,30222,30223,30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,30276,57814,57815,57816,57817,57818,57819,57820,57821,57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,57900,57901,57902,57903,57904,57905,57906,57907,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30400,30401,30403,21834,38463,22467,25384,21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,30404,30407,30409,30411,30412,30419,30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,30500,30501,30503,30506,30507,30508,30510,30512,30513,30514,30515,30516,30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,34180,38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,39292,28851,30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,30652,30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,30685,30686,30687,30688,30689,30692,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,20135,38416,39076,26124,29462,30694,30696,30698,30703,30704,30705,30706,30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,30804,30808,30809,30810,30811,30812,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,22330,23581,24120,38271,20607,32928,21378,25950,30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,27249,21416,36487,38148,38607,28353,38500,26970,30852,30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,30984,30985,30986,30987,30988,30784,20648,30679,25616,35302,22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,30989,30990,30991,30992,30993,30994,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,31065,31073,31075,31076,31078,31081,31082,31083,31084,31086,31088,31089,31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,24608,32829,25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,21472,31123,31124,31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,31196,31197,31198,31200,31201,31202,31205,31208,31210,31212,31214,31217,31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,31256,31257,31259,31260,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,23572,39285,27953,20108,31261,31263,31265,31266,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,36144,21457,32602,31567,20240,20047,38400,27861,29648,34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,36752,24133,27679,31526,20239,20440,26381,31395,31396,31399,31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,31466,31467,31468,31470,31472,31473,31474,31475,31476,31477,31478,31479,31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,31527,31529,31533,28014,28074,31119,34993,24343,29995,25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,31631,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,31675,31676,31677,31678,31679,31680,31682,31683,31684,22466,32831,26775,24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,31685,31688,31689,31690,31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,31762,31763,31764,31765,31767,31768,31769,31770,31771,31772,31773,31774,31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,31806,31810,39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,29392,31946,28246,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,31920,31924,31925,31926,31927,31928,31930,31931,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,22522,26426,30072,31293,31215,31637,31935,31936,31938,31939,31940,31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,32054,32908,39269,36857,28608,35749,40481,23020,32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,33616,27099,37492,36341,36145,35265,38190,31661,20214,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,20581,33328,21073,39279,28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,23613,21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,21531,23803,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,31397,33909,22862,39745,20608,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32412,32413,32414,32430,32436,32443,32444,32470,32484,32492,32505,32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,39304,24871,28291,22372,26118,25414,22256,25324,25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,21385,21169,30782,21382,21033,20616,20363,20432,32598,32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,32691,32692,32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,32732,32733,32734,32738,32739,30178,31435,31890,27813,38582,21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,32740,32743,32744,32746,32747,32748,32749,32751,32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,32853,32854,32855,32857,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,38534,22404,25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,28459,32894,32897,32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,33023,33024,33025,33027,33028,33029,33031,33032,33035,33036,33045,33047,33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,33083,33084,33085,33087,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,21517,21629,35884,25720,33088,33089,33090,33091,33092,33093,33095,33097,33101,33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,33188,33189,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,25721,34321,27169,33180,30952,25705,39764,25273,26411,33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,38221,28037,24744,26592,29406,20957,23425,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,33319,33321,33326,33330,33338,33340,33341,33343,33344,33345,33346,33347,33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,33382,33383,33385,25319,27870,29275,25197,38062,32445,33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,33528,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33577,33578,33582,33584,33586,33591,33595,33597,21860,33086,30130,30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,33598,33599,33601,33602,33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,33700,33701,33702,33703,33708,33709,33710,33711,33717,33723,33726,33727,33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,33772,33773,24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,23624,39537,28192,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,33903,33904,33906,33908,33911,33913,33915,33916,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,33134,40131,22622,36187,19977,21441,33917,33918,33919,33920,33921,33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,33998,33999,34002,34004,34005,34007,34008,34009,34010,34011,34012,34014,34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,34050,20254,25955,26705,21971,20007,25620,39578,25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,32958,24910,28183,22768,29983,29989,29298,21319,32499,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,34167,34168,34172,34173,34175,34176,34177,30465,30427,21097,32988,22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,34178,34179,34182,34184,34185,34186,34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,34252,34253,34254,34257,34258,34260,34262,34263,34264,34265,34266,34267,34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,24661,21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,22905,22612,34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,34405,34406,34407,34408,34409,34410,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,38081,24086,21381,21548,28867,34413,34415,34416,34418,34419,34420,34421,34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,34518,34519,34522,34524,34525,34528,34529,34530,34531,34533,34534,34535,34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,27712,24311,20572,20141,24237,25402,33351,36890,26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,26505,32593,24448,26106,26395,24536,22916,23041,34585,34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,34679,34680,34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,34720,34721,34722,34723,34724,24013,24494,21361,38886,36829,26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,34725,34726,34727,34729,34730,34734,34736,34737,34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34810,34811,34812,34813,34815,34816,34817,34818,34820,34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,31232,24687,24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,26195,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,34927,34929,34931,34932,34933,34934,34936,34937,34938,34939,34940,34944,34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,34983,34984,34985,34986,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,23459,24748,26059,29572,34988,34990,34991,34992,34994,34995,34996,34997,34998,35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,35079,35080,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,36873,30307,30505,32474,38772,34203,23398,31348,38634,34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,20859,26679,28478,36992,33136,22934,29814,35128,35129,35130,35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35196,35197,35198,35200,35202,35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,25671,23591,36965,31377,35875,23002,21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,21360,33521,27185,23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,35455,35456,28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,28195,26413,36711,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,20105,24596,25972,25327,27491,25919,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,24103,30151,37073,35777,33437,26525,25903,21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,22065,20027,33879,26609,21161,34496,36142,38136,31569,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,35761,35771,35783,35792,35818,35849,35870,20303,27880,31069,39547,25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,24038,20304,26590,20570,20316,22352,24231,59408,59409,59410,59411,59412,35896,35897,35898,35899,35900,35901,35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,35969,35971,35972,35974,35975,35976,35979,35981,35982,35983,35984,35985,35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,20109,19980,20800,19984,24319,21317,19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,20319,20311,20274,20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36256,36257,36258,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,37043,37046,37050,36309,36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,36415,36419,36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,36456,36458,36459,36462,36465,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,22456,22516,22511,22520,22500,22493,36467,36469,36471,36472,36473,36474,36475,36477,36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,22539,22541,22525,22509,22528,22558,22553,22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,33631,33600,33559,33632,33581,33594,33587,33638,33637,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,33640,33563,33641,33644,33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,36803,36806,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,34134,34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,25709,25750,36889,36892,36899,36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,36983,36984,36985,36986,36987,36988,36990,36993,36996,36997,36998,36999,37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,37053,37055,37056,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,21825,21845,21823,21840,21820,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,37148,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,37179,37180,37181,37182,37183,37184,37185,37186,37188,21815,21846,21877,21878,21879,21811,21808,21852,21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,22300,24079,24089,24084,24081,24113,24123,24124,37189,37191,37192,37201,37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,37298,37299,37302,37303,37304,37305,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,37348,37349,24119,24132,24148,24155,24158,24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,29435,29463,29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,24642,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,27825,27859,27887,27902,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,27961,27943,27916,27971,27976,27911,27908,27929,27918,27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,28557,28556,28536,28530,28540,28538,28625,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,28617,28583,28601,28598,28610,28641,28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37835,37836,37837,22935,22986,22955,22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,37838,37839,37840,37841,37842,37843,37844,37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,29744,29742,29740,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,38106,38118,38139,38172,38176,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,26818,26990,26876,26911,26912,26873,38183,38195,38205,38211,38216,38219,38229,38234,38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,26916,26864,26891,26881,26967,26851,26896,26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,36729,36730,36732,36734,36737,36738,36740,36743,36747,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,38467,38474,38478,38479,38481,38482,38483,38486,38487,38488,38489,38490,38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38535,38537,38538,36749,36750,36751,36760,36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,38540,38542,38545,38546,38547,38549,38550,38554,38555,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,38631,38635,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,25663,25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,33226,33211,38689,38690,38691,38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,38762,38763,38764,38765,38766,38767,38768,38769,38770,38773,38775,38776,38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,38811,38812,38813,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,31130,31143,31155,24529,24528,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,24636,24669,24666,24679,24641,24665,24675,24747,24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,30517,30520,30544,30545,30535,30531,30554,30568,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,30562,30565,30591,30605,30589,30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,38121,38123,38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,31252,39176,39177,39178,39179,39180,39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,39305,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,30245,30232,30229,30233,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,30235,30268,30242,30240,30272,30253,30256,30271,30261,30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,32850,32873,32881,35203,39032,39040,39043,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39049,39052,39053,39055,39060,39066,39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,39645,39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,39680,39681,39682,39684,39685,39686,34758,34696,34693,34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,39687,39689,39690,39691,39692,39693,39694,39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,37198,37199,37220,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,35988,26011,35286,35294,35290,35292,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,35301,35307,35311,35390,35622,38739,38633,38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,40123,40124,40125,40132,40133,40134,40135,40138,40139,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40061,40062,40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,40154,40155,40160,40161,40140,40141,40142,40143,40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,58001,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,58090,58091,58092,58093,58094,58095,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,58096,58097,58098,58099,58100,58101,58102,58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,58186,58187,58188,58189,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40576,40577,40579,40580,40581,40582,40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,40617,40618,58190,58191,58192,58193,58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,40744,40745,40746,40747,40749,40750,40752,40753,58284,58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,58376,58377,40754,40755,40756,40757,40758,40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,63985,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,58467,58468,58469,58470,58471,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,64036,64039,64040,64041,11905,59414,59415,59416,11908,13427,13383,11912,11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565],
+  "gb18030-ranges":[[0,128],[36,165],[38,169],[45,178],[50,184],[81,216],[89,226],[95,235],[96,238],[100,244],[103,248],[104,251],[105,253],[109,258],[126,276],[133,284],[148,300],[172,325],[175,329],[179,334],[208,364],[306,463],[307,465],[308,467],[309,469],[310,471],[311,473],[312,475],[313,477],[341,506],[428,594],[443,610],[544,712],[545,716],[558,730],[741,930],[742,938],[749,962],[750,970],[805,1026],[819,1104],[820,1106],[7922,8209],[7924,8215],[7925,8218],[7927,8222],[7934,8231],[7943,8241],[7944,8244],[7945,8246],[7950,8252],[8062,8365],[8148,8452],[8149,8454],[8152,8458],[8164,8471],[8174,8482],[8236,8556],[8240,8570],[8262,8596],[8264,8602],[8374,8713],[8380,8720],[8381,8722],[8384,8726],[8388,8731],[8390,8737],[8392,8740],[8393,8742],[8394,8748],[8396,8751],[8401,8760],[8406,8766],[8416,8777],[8419,8781],[8424,8787],[8437,8802],[8439,8808],[8445,8816],[8482,8854],[8485,8858],[8496,8870],[8521,8896],[8603,8979],[8936,9322],[8946,9372],[9046,9548],[9050,9588],[9063,9616],[9066,9622],[9076,9634],[9092,9652],[9100,9662],[9108,9672],[9111,9676],[9113,9680],[9131,9702],[9162,9735],[9164,9738],[9218,9793],[9219,9795],[11329,11906],[11331,11909],[11334,11913],[11336,11917],[11346,11928],[11361,11944],[11363,11947],[11366,11951],[11370,11956],[11372,11960],[11375,11964],[11389,11979],[11682,12284],[11686,12292],[11687,12312],[11692,12319],[11694,12330],[11714,12351],[11716,12436],[11723,12447],[11725,12535],[11730,12543],[11736,12586],[11982,12842],[11989,12850],[12102,12964],[12336,13200],[12348,13215],[12350,13218],[12384,13253],[12393,13263],[12395,13267],[12397,13270],[12510,13384],[12553,13428],[12851,13727],[12962,13839],[12973,13851],[13738,14617],[13823,14703],[13919,14801],[13933,14816],[14080,14964],[14298,15183],[14585,15471],[14698,15585],[15583,16471],[15847,16736],[16318,17208],[16434,17325],[16438,17330],[16481,17374],[16729,17623],[17102,17997],[17122,18018],[17315,18212],[17320,18218],[17402,18301],[17418,18318],[17859,18760],[17909,18811],[17911,18814],[17915,18820],[17916,18823],[17936,18844],[17939,18848],[17961,18872],[18664,19576],[18703,19620],[18814,19738],[18962,19887],[19043,40870],[33469,59244],[33470,59336],[33471,59367],[33484,59413],[33485,59417],[33490,59423],[33497,59431],[33501,59437],[33505,59443],[33513,59452],[33520,59460],[33536,59478],[33550,59493],[37845,63789],[37921,63866],[37948,63894],[38029,63976],[38038,63986],[38064,64016],[38065,64018],[38066,64021],[38069,64025],[38075,64034],[38076,64037],[38078,64042],[39108,65074],[39109,65093],[39113,65107],[39114,65112],[39115,65127],[39116,65132],[39265,65375],[39394,65510],[189000,65536]],
+  "jis0208":[12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,12295,12540,8213,8208,65295,65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,12305,65291,65293,177,215,247,65309,8800,65308,65310,8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,null,null,null,null,null,null,null,null,null,null,null,8712,8715,8838,8839,8834,8835,8746,8745,null,null,null,null,null,null,null,null,8743,8744,65506,8658,8660,8704,8707,null,null,null,null,null,null,null,null,null,null,null,8736,8869,8978,8706,8711,8801,8786,8810,8811,8730,8765,8733,8757,8747,8748,null,null,null,null,null,null,null,8491,8240,9839,9837,9834,8224,8225,182,null,null,null,null,9711,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,null,null,null,null,null,null,null,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,null,null,null,null,null,null,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,null,null,null,null,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,null,null,null,null,null,null,null,null,null,null,null,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,null,null,null,null,null,null,null,null,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,null,null,null,null,null,null,null,null,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,null,null,null,null,null,null,null,null,null,null,null,null,null,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,null,13129,13076,13090,13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,13213,13214,13198,13199,13252,13217,null,null,null,null,null,null,null,null,13179,12317,12319,8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,26880,28286,30871,33109,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,24332,19984,19989,20010,20017,20022,20028,20031,20034,20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,29081,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+  "jis0212":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,728,711,184,729,733,175,731,730,65374,900,901,null,null,null,null,null,null,null,null,161,166,191,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,186,170,169,174,8482,164,8470,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,902,904,905,906,938,null,908,null,910,939,null,911,null,null,null,null,940,941,942,943,970,912,972,962,973,971,944,974,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1038,1039,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1118,1119,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,198,272,null,294,null,306,null,321,319,null,330,216,338,null,358,222,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,230,273,240,295,305,307,312,322,320,329,331,248,339,223,359,254,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,201,200,203,202,282,278,274,280,null,284,286,290,288,292,205,204,207,206,463,304,298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,366,360,471,475,473,469,372,221,376,374,377,381,379,null,null,null,null,null,null,null,225,224,228,226,259,462,257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,285,287,null,289,293,237,236,239,238,464,null,299,303,297,309,311,314,318,316,324,328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,375,378,382,380,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,40855,40862,40865,40866,40867,40869,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+  "ibm866":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,9617,9618,9619,9474,9508,9569,9570,9558,9557,9571,9553,9559,9565,9564,9563,9488,9492,9524,9516,9500,9472,9532,9566,9567,9562,9556,9577,9574,9568,9552,9580,9575,9576,9572,9573,9561,9560,9554,9555,9579,9578,9496,9484,9608,9604,9612,9616,9600,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1025,1105,1028,1108,1031,1111,1038,1118,176,8729,183,8730,8470,164,9632,160],
+  "iso-8859-2":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,728,321,164,317,346,167,168,352,350,356,377,173,381,379,176,261,731,322,180,318,347,711,184,353,351,357,378,733,382,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],
+  "iso-8859-3":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,294,728,163,164,null,292,167,168,304,350,286,308,173,null,379,176,295,178,179,180,181,293,183,184,305,351,287,309,189,null,380,192,193,194,null,196,266,264,199,200,201,202,203,204,205,206,207,null,209,210,211,212,288,214,215,284,217,218,219,220,364,348,223,224,225,226,null,228,267,265,231,232,233,234,235,236,237,238,239,null,241,242,243,244,289,246,247,285,249,250,251,252,365,349,729],
+  "iso-8859-4":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,312,342,164,296,315,167,168,352,274,290,358,173,381,175,176,261,731,343,180,297,316,711,184,353,275,291,359,330,382,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,298,272,325,332,310,212,213,214,215,216,370,218,219,220,360,362,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,299,273,326,333,311,244,245,246,247,248,371,250,251,252,361,363,729],
+  "iso-8859-5":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,173,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,8470,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,167,1118,1119],
+  "iso-8859-6":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,null,null,164,null,null,null,null,null,null,null,1548,173,null,null,null,null,null,null,null,null,null,null,null,null,null,1563,null,null,null,1567,null,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,null,null,null,null,null,1600,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1611,1612,1613,1614,1615,1616,1617,1618,null,null,null,null,null,null,null,null,null,null,null,null,null],
+  "iso-8859-7":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8216,8217,163,8364,8367,166,167,168,169,890,171,172,173,null,8213,176,177,178,179,900,901,902,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],
+  "iso-8859-8":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,null,162,163,164,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,8215,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],
+  "iso-8859-10":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,274,290,298,296,310,167,315,272,352,358,381,173,362,330,176,261,275,291,299,297,311,183,316,273,353,359,382,8213,363,331,256,193,194,195,196,197,198,302,268,201,280,203,278,205,206,207,208,325,332,211,212,213,214,360,216,370,218,219,220,221,222,223,257,225,226,227,228,229,230,303,269,233,281,235,279,237,238,239,240,326,333,243,244,245,246,361,248,371,250,251,252,253,254,312],
+  "iso-8859-13":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,8221,162,163,164,8222,166,167,216,169,342,171,172,173,174,198,176,177,178,179,8220,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,8217],
+  "iso-8859-14":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,7682,7683,163,266,267,7690,167,7808,169,7810,7691,7922,173,174,376,7710,7711,288,289,7744,7745,182,7766,7809,7767,7811,7776,7923,7812,7813,7777,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,372,209,210,211,212,213,214,7786,216,217,218,219,220,221,374,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,373,241,242,243,244,245,246,7787,248,249,250,251,252,253,375,255],
+  "iso-8859-15":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,8364,165,352,167,353,169,170,171,172,173,174,175,176,177,178,179,381,181,182,183,382,185,186,187,338,339,376,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],
+  "iso-8859-16":[128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,260,261,321,8364,8222,352,167,353,169,536,171,377,173,378,379,176,177,268,322,381,8221,182,183,382,269,537,187,338,339,376,380,192,193,194,258,196,262,198,199,200,201,202,203,204,205,206,207,272,323,210,211,212,336,214,346,368,217,218,219,220,280,538,223,224,225,226,259,228,263,230,231,232,233,234,235,236,237,238,239,273,324,242,243,244,337,246,347,369,249,250,251,252,281,539,255],
+  "koi8-r":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,1025,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
+  "koi8-u":[9472,9474,9484,9488,9492,9496,9500,9508,9516,9524,9532,9600,9604,9608,9612,9616,9617,9618,9619,8992,9632,8729,8730,8776,8804,8805,160,8993,176,178,183,247,9552,9553,9554,1105,1108,9556,1110,1111,9559,9560,9561,9562,9563,1169,1118,9566,9567,9568,9569,1025,1028,9571,1030,1031,9574,9575,9576,9577,9578,1168,1038,169,1102,1072,1073,1094,1076,1077,1092,1075,1093,1080,1081,1082,1083,1084,1085,1086,1087,1103,1088,1089,1090,1091,1078,1074,1100,1099,1079,1096,1101,1097,1095,1098,1070,1040,1041,1062,1044,1045,1060,1043,1061,1048,1049,1050,1051,1052,1053,1054,1055,1071,1056,1057,1058,1059,1046,1042,1068,1067,1047,1064,1069,1065,1063,1066],
+  "macintosh":[196,197,199,201,209,214,220,225,224,226,228,227,229,231,233,232,234,235,237,236,238,239,241,243,242,244,246,245,250,249,251,252,8224,176,162,163,167,8226,182,223,174,169,8482,180,168,8800,198,216,8734,177,8804,8805,165,181,8706,8721,8719,960,8747,170,186,937,230,248,191,161,172,8730,402,8776,8710,171,187,8230,160,192,195,213,338,339,8211,8212,8220,8221,8216,8217,247,9674,255,376,8260,8364,8249,8250,64257,64258,8225,183,8218,8222,8240,194,202,193,203,200,205,206,207,204,211,212,63743,210,218,219,217,305,710,732,175,728,729,730,184,733,731,711],
+  "windows-874":[8364,129,130,131,132,8230,134,135,136,137,138,139,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,153,154,155,156,157,158,159,160,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,null,null,null,null,3647,3648,3649,3650,3651,3652,3653,3654,3655,3656,3657,3658,3659,3660,3661,3662,3663,3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,null,null,null,null],
+  "windows-1250":[8364,129,8218,131,8222,8230,8224,8225,136,8240,352,8249,346,356,381,377,144,8216,8217,8220,8221,8226,8211,8212,152,8482,353,8250,347,357,382,378,160,711,728,321,164,260,166,167,168,169,350,171,172,173,174,379,176,177,731,322,180,181,182,183,184,261,351,187,317,733,318,380,340,193,194,258,196,313,262,199,268,201,280,203,282,205,206,270,272,323,327,211,212,336,214,215,344,366,218,368,220,221,354,223,341,225,226,259,228,314,263,231,269,233,281,235,283,237,238,271,273,324,328,243,244,337,246,247,345,367,250,369,252,253,355,729],
+  "windows-1251":[1026,1027,8218,1107,8222,8230,8224,8225,8364,8240,1033,8249,1034,1036,1035,1039,1106,8216,8217,8220,8221,8226,8211,8212,152,8482,1113,8250,1114,1116,1115,1119,160,1038,1118,1032,164,1168,166,167,1025,169,1028,171,172,173,174,1031,176,177,1030,1110,1169,181,182,183,1105,8470,1108,187,1112,1029,1109,1111,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103],
+  "windows-1252":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,381,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,382,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255],
+  "windows-1253":[8364,129,8218,402,8222,8230,8224,8225,136,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,157,158,159,160,901,902,163,164,165,166,167,168,169,null,171,172,173,174,8213,176,177,178,179,900,181,182,183,904,905,906,187,908,189,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,null,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,null],
+  "windows-1254":[8364,129,8218,402,8222,8230,8224,8225,710,8240,352,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,353,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,286,209,210,211,212,213,214,215,216,217,218,219,220,304,350,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,287,241,242,243,244,245,246,247,248,249,250,251,252,305,351,255],
+  "windows-1255":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,140,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,156,157,158,159,160,161,162,163,8362,165,166,167,168,169,215,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,247,187,188,189,190,191,1456,1457,1458,1459,1460,1461,1462,1463,1464,1465,1466,1467,1468,1469,1470,1471,1472,1473,1474,1475,1520,1521,1522,1523,1524,null,null,null,null,null,null,null,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,null,null,8206,8207,null],
+  "windows-1256":[8364,1662,8218,402,8222,8230,8224,8225,710,8240,1657,8249,338,1670,1688,1672,1711,8216,8217,8220,8221,8226,8211,8212,1705,8482,1681,8250,339,8204,8205,1722,160,1548,162,163,164,165,166,167,168,169,1726,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,1563,187,188,189,190,1567,1729,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,215,1591,1592,1593,1594,1600,1601,1602,1603,224,1604,226,1605,1606,1607,1608,231,232,233,234,235,1609,1610,238,239,1611,1612,1613,1614,244,1615,1616,247,1617,249,1618,251,252,8206,8207,1746],
+  "windows-1257":[8364,129,8218,131,8222,8230,8224,8225,136,8240,138,8249,140,168,711,184,144,8216,8217,8220,8221,8226,8211,8212,152,8482,154,8250,156,175,731,159,160,null,162,163,164,null,166,167,216,169,342,171,172,173,174,198,176,177,178,179,180,181,182,183,248,185,343,187,188,189,190,230,260,302,256,262,196,197,280,274,268,201,377,278,290,310,298,315,352,323,325,211,332,213,214,215,370,321,346,362,220,379,381,223,261,303,257,263,228,229,281,275,269,233,378,279,291,311,299,316,353,324,326,243,333,245,246,247,371,322,347,363,252,380,382,729],
+  "windows-1258":[8364,129,8218,402,8222,8230,8224,8225,710,8240,138,8249,338,141,142,143,144,8216,8217,8220,8221,8226,8211,8212,732,8482,154,8250,339,157,158,376,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,258,196,197,198,199,200,201,202,203,768,205,206,207,272,209,777,211,212,416,214,215,216,217,218,219,220,431,771,223,224,225,226,259,228,229,230,231,232,233,234,235,769,237,238,239,273,241,803,243,244,417,246,247,248,249,250,251,252,432,8363,255],
+  "x-mac-cyrillic":[1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,8224,176,1168,163,167,8226,182,1030,174,169,8482,1026,1106,8800,1027,1107,8734,177,8804,8805,1110,181,1169,1032,1028,1108,1031,1111,1033,1113,1034,1114,1112,1029,172,8730,402,8776,8710,171,187,8230,160,1035,1115,1036,1116,1109,8211,8212,8220,8221,8216,8217,247,8222,1038,1118,1039,1119,8470,1025,1105,1103,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,8364]
+};
+
+// For strict environments where `this` inside the global scope
+// is `undefined`, take a pure object instead
+}(this || {}));
\ No newline at end of file
diff --git a/util/ble/encoding.js b/util/ble/encoding.js
new file mode 100644
index 0000000..df48cea
--- /dev/null
+++ b/util/ble/encoding.js
@@ -0,0 +1,3313 @@
+
+// This is free and unencumbered software released into the public domain.
+// See LICENSE.md for more information.
+
+/**
+ * @fileoverview Global |this| required for resolving indexes in node.
+ * @suppress {globalThis}
+ */
+(function(global) {
+  'use strict';
+
+  // If we're in node require encoding-indexes and attach it to the global.
+  if (typeof module !== "undefined" && module.exports &&
+    !global["encoding-indexes"]) {
+    global["encoding-indexes"] =
+      require("./encoding-indexes.js")["encoding-indexes"];
+  }
+
+  //
+  // Utilities
+  //
+
+  /**
+   * @param {number} a The number to test.
+   * @param {number} min The minimum value in the range, inclusive.
+   * @param {number} max The maximum value in the range, inclusive.
+   * @return {boolean} True if a >= min and a <= max.
+   */
+  function inRange(a, min, max) {
+    return min <= a && a <= max;
+  }
+
+  /**
+   * @param {!Array.<*>} array The array to check.
+   * @param {*} item The item to look for in the array.
+   * @return {boolean} True if the item appears in the array.
+   */
+  function includes(array, item) {
+    return array.indexOf(item) !== -1;
+  }
+
+  var floor = Math.floor;
+
+  /**
+   * @param {*} o
+   * @return {Object}
+   */
+  function ToDictionary(o) {
+    if (o === undefined) return {};
+    if (o === Object(o)) return o;
+    throw TypeError('Could not convert argument to dictionary');
+  }
+
+  /**
+   * @param {string} string Input string of UTF-16 code units.
+   * @return {!Array.<number>} Code points.
+   */
+  function stringToCodePoints(string) {
+    // https://heycam.github.io/webidl/#dfn-obtain-unicode
+
+    // 1. Let S be the DOMString value.
+    var s = String(string);
+
+    // 2. Let n be the length of S.
+    var n = s.length;
+
+    // 3. Initialize i to 0.
+    var i = 0;
+
+    // 4. Initialize U to be an empty sequence of Unicode characters.
+    var u = [];
+
+    // 5. While i < n:
+    while (i < n) {
+
+      // 1. Let c be the code unit in S at index i.
+      var c = s.charCodeAt(i);
+
+      // 2. Depending on the value of c:
+
+      // c < 0xD800 or c > 0xDFFF
+      if (c < 0xD800 || c > 0xDFFF) {
+        // Append to U the Unicode character with code point c.
+        u.push(c);
+      }
+
+      // 0xDC00 鈮� c 鈮� 0xDFFF
+      else if (0xDC00 <= c && c <= 0xDFFF) {
+        // Append to U a U+FFFD REPLACEMENT CHARACTER.
+        u.push(0xFFFD);
+      }
+
+      // 0xD800 鈮� c 鈮� 0xDBFF
+      else if (0xD800 <= c && c <= 0xDBFF) {
+        // 1. If i = n鈭�1, then append to U a U+FFFD REPLACEMENT
+        // CHARACTER.
+        if (i === n - 1) {
+          u.push(0xFFFD);
+        }
+        // 2. Otherwise, i < n鈭�1:
+        else {
+          // 1. Let d be the code unit in S at index i+1.
+          var d = s.charCodeAt(i + 1);
+
+          // 2. If 0xDC00 鈮� d 鈮� 0xDFFF, then:
+          if (0xDC00 <= d && d <= 0xDFFF) {
+            // 1. Let a be c & 0x3FF.
+            var a = c & 0x3FF;
+
+            // 2. Let b be d & 0x3FF.
+            var b = d & 0x3FF;
+
+            // 3. Append to U the Unicode character with code point
+            // 2^16+2^10*a+b.
+            u.push(0x10000 + (a << 10) + b);
+
+            // 4. Set i to i+1.
+            i += 1;
+          }
+
+          // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a
+          // U+FFFD REPLACEMENT CHARACTER.
+          else  {
+            u.push(0xFFFD);
+          }
+        }
+      }
+
+      // 3. Set i to i+1.
+      i += 1;
+    }
+
+    // 6. Return U.
+    return u;
+  }
+
+  /**
+   * @param {!Array.<number>} code_points Array of code points.
+   * @return {string} string String of UTF-16 code units.
+   */
+  function codePointsToString(code_points) {
+    var s = '';
+    for (var i = 0; i < code_points.length; ++i) {
+      var cp = code_points[i];
+      if (cp <= 0xFFFF) {
+        s += String.fromCharCode(cp);
+      } else {
+        cp -= 0x10000;
+        s += String.fromCharCode((cp >> 10) + 0xD800,
+                                 (cp & 0x3FF) + 0xDC00);
+      }
+    }
+    return s;
+  }
+
+
+  //
+  // Implementation of Encoding specification
+  // https://encoding.spec.whatwg.org/
+  //
+
+  //
+  // 4. Terminology
+  //
+
+  /**
+   * An ASCII byte is a byte in the range 0x00 to 0x7F, inclusive.
+   * @param {number} a The number to test.
+   * @return {boolean} True if a is in the range 0x00 to 0x7F, inclusive.
+   */
+  function isASCIIByte(a) {
+    return 0x00 <= a && a <= 0x7F;
+  }
+
+  /**
+   * An ASCII code point is a code point in the range U+0000 to
+   * U+007F, inclusive.
+   */
+  var isASCIICodePoint = isASCIIByte;
+
+
+  /**
+   * End-of-stream is a special token that signifies no more tokens
+   * are in the stream.
+   * @const
+   */ var end_of_stream = -1;
+
+  /**
+   * A stream represents an ordered sequence of tokens.
+   *
+   * @constructor
+   * @param {!(Array.<number>|Uint8Array)} tokens Array of tokens that provide
+   * the stream.
+   */
+  function Stream(tokens) {
+    /** @type {!Array.<number>} */
+    this.tokens = [].slice.call(tokens);
+    // Reversed as push/pop is more efficient than shift/unshift.
+    this.tokens.reverse();
+  }
+
+  Stream.prototype = {
+    /**
+     * @return {boolean} True if end-of-stream has been hit.
+     */
+    endOfStream: function() {
+      return !this.tokens.length;
+    },
+
+    /**
+     * When a token is read from a stream, the first token in the
+     * stream must be returned and subsequently removed, and
+     * end-of-stream must be returned otherwise.
+     *
+     * @return {number} Get the next token from the stream, or
+     * end_of_stream.
+     */
+     read: function() {
+      if (!this.tokens.length)
+        return end_of_stream;
+       return this.tokens.pop();
+     },
+
+    /**
+     * When one or more tokens are prepended to a stream, those tokens
+     * must be inserted, in given order, before the first token in the
+     * stream.
+     *
+     * @param {(number|!Array.<number>)} token The token(s) to prepend to the
+     * stream.
+     */
+    prepend: function(token) {
+      if (Array.isArray(token)) {
+        var tokens = /**@type {!Array.<number>}*/(token);
+        while (tokens.length)
+          this.tokens.push(tokens.pop());
+      } else {
+        this.tokens.push(token);
+      }
+    },
+
+    /**
+     * When one or more tokens are pushed to a stream, those tokens
+     * must be inserted, in given order, after the last token in the
+     * stream.
+     *
+     * @param {(number|!Array.<number>)} token The tokens(s) to push to the
+     * stream.
+     */
+    push: function(token) {
+      if (Array.isArray(token)) {
+        var tokens = /**@type {!Array.<number>}*/(token);
+        while (tokens.length)
+          this.tokens.unshift(tokens.shift());
+      } else {
+        this.tokens.unshift(token);
+      }
+    }
+  };
+
+  //
+  // 5. Encodings
+  //
+
+  // 5.1 Encoders and decoders
+
+  /** @const */
+  var finished = -1;
+
+  /**
+   * @param {boolean} fatal If true, decoding errors raise an exception.
+   * @param {number=} opt_code_point Override the standard fallback code point.
+   * @return {number} The code point to insert on a decoding error.
+   */
+  function decoderError(fatal, opt_code_point) {
+    if (fatal)
+      throw TypeError('Decoder error');
+    return opt_code_point || 0xFFFD;
+  }
+
+  /**
+   * @param {number} code_point The code point that could not be encoded.
+   * @return {number} Always throws, no value is actually returned.
+   */
+  function encoderError(code_point) {
+    throw TypeError('The code point ' + code_point + ' could not be encoded.');
+  }
+
+  /** @interface */
+  function Decoder() {}
+  Decoder.prototype = {
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point, or |finished|.
+     */
+    handler: function(stream, bite) {}
+  };
+
+  /** @interface */
+  function Encoder() {}
+  Encoder.prototype = {
+    /**
+     * @param {Stream} stream The stream of code points being encoded.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit, or |finished|.
+     */
+    handler: function(stream, code_point) {}
+  };
+
+  // 5.2 Names and labels
+
+  // TODO: Define @typedef for Encoding: {name:string,labels:Array.<string>}
+  // https://github.com/google/closure-compiler/issues/247
+
+  /**
+   * @param {string} label The encoding label.
+   * @return {?{name:string,labels:Array.<string>}}
+   */
+  function getEncoding(label) {
+    // 1. Remove any leading and trailing ASCII whitespace from label.
+    label = String(label).trim().toLowerCase();
+
+    // 2. If label is an ASCII case-insensitive match for any of the
+    // labels listed in the table below, return the corresponding
+    // encoding, and failure otherwise.
+    if (Object.prototype.hasOwnProperty.call(label_to_encoding, label)) {
+      return label_to_encoding[label];
+    }
+    return null;
+  }
+
+  /**
+   * Encodings table: https://encoding.spec.whatwg.org/encodings.json
+   * @const
+   * @type {!Array.<{
+   *          heading: string,
+   *          encodings: Array.<{name:string,labels:Array.<string>}>
+   *        }>}
+   */
+  var encodings = [
+    {
+      "encodings": [
+        {
+          "labels": [
+            "unicode-1-1-utf-8",
+            "utf-8",
+            "utf8"
+          ],
+          "name": "UTF-8"
+        }
+      ],
+      "heading": "The Encoding"
+    },
+    {
+      "encodings": [
+        {
+          "labels": [
+            "866",
+            "cp866",
+            "csibm866",
+            "ibm866"
+          ],
+          "name": "IBM866"
+        },
+        {
+          "labels": [
+            "csisolatin2",
+            "iso-8859-2",
+            "iso-ir-101",
+            "iso8859-2",
+            "iso88592",
+            "iso_8859-2",
+            "iso_8859-2:1987",
+            "l2",
+            "latin2"
+          ],
+          "name": "ISO-8859-2"
+        },
+        {
+          "labels": [
+            "csisolatin3",
+            "iso-8859-3",
+            "iso-ir-109",
+            "iso8859-3",
+            "iso88593",
+            "iso_8859-3",
+            "iso_8859-3:1988",
+            "l3",
+            "latin3"
+          ],
+          "name": "ISO-8859-3"
+        },
+        {
+          "labels": [
+            "csisolatin4",
+            "iso-8859-4",
+            "iso-ir-110",
+            "iso8859-4",
+            "iso88594",
+            "iso_8859-4",
+            "iso_8859-4:1988",
+            "l4",
+            "latin4"
+          ],
+          "name": "ISO-8859-4"
+        },
+        {
+          "labels": [
+            "csisolatincyrillic",
+            "cyrillic",
+            "iso-8859-5",
+            "iso-ir-144",
+            "iso8859-5",
+            "iso88595",
+            "iso_8859-5",
+            "iso_8859-5:1988"
+          ],
+          "name": "ISO-8859-5"
+        },
+        {
+          "labels": [
+            "arabic",
+            "asmo-708",
+            "csiso88596e",
+            "csiso88596i",
+            "csisolatinarabic",
+            "ecma-114",
+            "iso-8859-6",
+            "iso-8859-6-e",
+            "iso-8859-6-i",
+            "iso-ir-127",
+            "iso8859-6",
+            "iso88596",
+            "iso_8859-6",
+            "iso_8859-6:1987"
+          ],
+          "name": "ISO-8859-6"
+        },
+        {
+          "labels": [
+            "csisolatingreek",
+            "ecma-118",
+            "elot_928",
+            "greek",
+            "greek8",
+            "iso-8859-7",
+            "iso-ir-126",
+            "iso8859-7",
+            "iso88597",
+            "iso_8859-7",
+            "iso_8859-7:1987",
+            "sun_eu_greek"
+          ],
+          "name": "ISO-8859-7"
+        },
+        {
+          "labels": [
+            "csiso88598e",
+            "csisolatinhebrew",
+            "hebrew",
+            "iso-8859-8",
+            "iso-8859-8-e",
+            "iso-ir-138",
+            "iso8859-8",
+            "iso88598",
+            "iso_8859-8",
+            "iso_8859-8:1988",
+            "visual"
+          ],
+          "name": "ISO-8859-8"
+        },
+        {
+          "labels": [
+            "csiso88598i",
+            "iso-8859-8-i",
+            "logical"
+          ],
+          "name": "ISO-8859-8-I"
+        },
+        {
+          "labels": [
+            "csisolatin6",
+            "iso-8859-10",
+            "iso-ir-157",
+            "iso8859-10",
+            "iso885910",
+            "l6",
+            "latin6"
+          ],
+          "name": "ISO-8859-10"
+        },
+        {
+          "labels": [
+            "iso-8859-13",
+            "iso8859-13",
+            "iso885913"
+          ],
+          "name": "ISO-8859-13"
+        },
+        {
+          "labels": [
+            "iso-8859-14",
+            "iso8859-14",
+            "iso885914"
+          ],
+          "name": "ISO-8859-14"
+        },
+        {
+          "labels": [
+            "csisolatin9",
+            "iso-8859-15",
+            "iso8859-15",
+            "iso885915",
+            "iso_8859-15",
+            "l9"
+          ],
+          "name": "ISO-8859-15"
+        },
+        {
+          "labels": [
+            "iso-8859-16"
+          ],
+          "name": "ISO-8859-16"
+        },
+        {
+          "labels": [
+            "cskoi8r",
+            "koi",
+            "koi8",
+            "koi8-r",
+            "koi8_r"
+          ],
+          "name": "KOI8-R"
+        },
+        {
+          "labels": [
+            "koi8-ru",
+            "koi8-u"
+          ],
+          "name": "KOI8-U"
+        },
+        {
+          "labels": [
+            "csmacintosh",
+            "mac",
+            "macintosh",
+            "x-mac-roman"
+          ],
+          "name": "macintosh"
+        },
+        {
+          "labels": [
+            "dos-874",
+            "iso-8859-11",
+            "iso8859-11",
+            "iso885911",
+            "tis-620",
+            "windows-874"
+          ],
+          "name": "windows-874"
+        },
+        {
+          "labels": [
+            "cp1250",
+            "windows-1250",
+            "x-cp1250"
+          ],
+          "name": "windows-1250"
+        },
+        {
+          "labels": [
+            "cp1251",
+            "windows-1251",
+            "x-cp1251"
+          ],
+          "name": "windows-1251"
+        },
+        {
+          "labels": [
+            "ansi_x3.4-1968",
+            "ascii",
+            "cp1252",
+            "cp819",
+            "csisolatin1",
+            "ibm819",
+            "iso-8859-1",
+            "iso-ir-100",
+            "iso8859-1",
+            "iso88591",
+            "iso_8859-1",
+            "iso_8859-1:1987",
+            "l1",
+            "latin1",
+            "us-ascii",
+            "windows-1252",
+            "x-cp1252"
+          ],
+          "name": "windows-1252"
+        },
+        {
+          "labels": [
+            "cp1253",
+            "windows-1253",
+            "x-cp1253"
+          ],
+          "name": "windows-1253"
+        },
+        {
+          "labels": [
+            "cp1254",
+            "csisolatin5",
+            "iso-8859-9",
+            "iso-ir-148",
+            "iso8859-9",
+            "iso88599",
+            "iso_8859-9",
+            "iso_8859-9:1989",
+            "l5",
+            "latin5",
+            "windows-1254",
+            "x-cp1254"
+          ],
+          "name": "windows-1254"
+        },
+        {
+          "labels": [
+            "cp1255",
+            "windows-1255",
+            "x-cp1255"
+          ],
+          "name": "windows-1255"
+        },
+        {
+          "labels": [
+            "cp1256",
+            "windows-1256",
+            "x-cp1256"
+          ],
+          "name": "windows-1256"
+        },
+        {
+          "labels": [
+            "cp1257",
+            "windows-1257",
+            "x-cp1257"
+          ],
+          "name": "windows-1257"
+        },
+        {
+          "labels": [
+            "cp1258",
+            "windows-1258",
+            "x-cp1258"
+          ],
+          "name": "windows-1258"
+        },
+        {
+          "labels": [
+            "x-mac-cyrillic",
+            "x-mac-ukrainian"
+          ],
+          "name": "x-mac-cyrillic"
+        }
+      ],
+      "heading": "Legacy single-byte encodings"
+    },
+    {
+      "encodings": [
+        {
+          "labels": [
+            "chinese",
+            "csgb2312",
+            "csiso58gb231280",
+            "gb2312",
+            "gb_2312",
+            "gb_2312-80",
+            "gbk",
+            "iso-ir-58",
+            "x-gbk"
+          ],
+          "name": "GBK"
+        },
+        {
+          "labels": [
+            "gb18030"
+          ],
+          "name": "gb18030"
+        }
+      ],
+      "heading": "Legacy multi-byte Chinese (simplified) encodings"
+    },
+    {
+      "encodings": [
+        {
+          "labels": [
+            "big5",
+            "big5-hkscs",
+            "cn-big5",
+            "csbig5",
+            "x-x-big5"
+          ],
+          "name": "Big5"
+        }
+      ],
+      "heading": "Legacy multi-byte Chinese (traditional) encodings"
+    },
+    {
+      "encodings": [
+        {
+          "labels": [
+            "cseucpkdfmtjapanese",
+            "euc-jp",
+            "x-euc-jp"
+          ],
+          "name": "EUC-JP"
+        },
+        {
+          "labels": [
+            "csiso2022jp",
+            "iso-2022-jp"
+          ],
+          "name": "ISO-2022-JP"
+        },
+        {
+          "labels": [
+            "csshiftjis",
+            "ms932",
+            "ms_kanji",
+            "shift-jis",
+            "shift_jis",
+            "sjis",
+            "windows-31j",
+            "x-sjis"
+          ],
+          "name": "Shift_JIS"
+        }
+      ],
+      "heading": "Legacy multi-byte Japanese encodings"
+    },
+    {
+      "encodings": [
+        {
+          "labels": [
+            "cseuckr",
+            "csksc56011987",
+            "euc-kr",
+            "iso-ir-149",
+            "korean",
+            "ks_c_5601-1987",
+            "ks_c_5601-1989",
+            "ksc5601",
+            "ksc_5601",
+            "windows-949"
+          ],
+          "name": "EUC-KR"
+        }
+      ],
+      "heading": "Legacy multi-byte Korean encodings"
+    },
+    {
+      "encodings": [
+        {
+          "labels": [
+            "csiso2022kr",
+            "hz-gb-2312",
+            "iso-2022-cn",
+            "iso-2022-cn-ext",
+            "iso-2022-kr"
+          ],
+          "name": "replacement"
+        },
+        {
+          "labels": [
+            "utf-16be"
+          ],
+          "name": "UTF-16BE"
+        },
+        {
+          "labels": [
+            "utf-16",
+            "utf-16le"
+          ],
+          "name": "UTF-16LE"
+        },
+        {
+          "labels": [
+            "x-user-defined"
+          ],
+          "name": "x-user-defined"
+        }
+      ],
+      "heading": "Legacy miscellaneous encodings"
+    }
+  ];
+
+  // Label to encoding registry.
+  /** @type {Object.<string,{name:string,labels:Array.<string>}>} */
+  var label_to_encoding = {};
+  encodings.forEach(function(category) {
+    category.encodings.forEach(function(encoding) {
+      encoding.labels.forEach(function(label) {
+        label_to_encoding[label] = encoding;
+      });
+    });
+  });
+
+  // Registry of of encoder/decoder factories, by encoding name.
+  /** @type {Object.<string, function({fatal:boolean}): Encoder>} */
+  var encoders = {};
+  /** @type {Object.<string, function({fatal:boolean}): Decoder>} */
+  var decoders = {};
+
+  //
+  // 6. Indexes
+  //
+
+  /**
+   * @param {number} pointer The |pointer| to search for.
+   * @param {(!Array.<?number>|undefined)} index The |index| to search within.
+   * @return {?number} The code point corresponding to |pointer| in |index|,
+   *     or null if |code point| is not in |index|.
+   */
+  function indexCodePointFor(pointer, index) {
+    if (!index) return null;
+    return index[pointer] || null;
+  }
+
+  /**
+   * @param {number} code_point The |code point| to search for.
+   * @param {!Array.<?number>} index The |index| to search within.
+   * @return {?number} The first pointer corresponding to |code point| in
+   *     |index|, or null if |code point| is not in |index|.
+   */
+  function indexPointerFor(code_point, index) {
+    var pointer = index.indexOf(code_point);
+    return pointer === -1 ? null : pointer;
+  }
+
+  /**
+   * @param {string} name Name of the index.
+   * @return {(!Array.<number>|!Array.<Array.<number>>)}
+   *  */
+  function index(name) {
+    if (!('encoding-indexes' in global)) {
+      throw Error("Indexes missing." +
+                  " Did you forget to include encoding-indexes.js first?");
+    }
+    return global['encoding-indexes'][name];
+  }
+
+  /**
+   * @param {number} pointer The |pointer| to search for in the gb18030 index.
+   * @return {?number} The code point corresponding to |pointer| in |index|,
+   *     or null if |code point| is not in the gb18030 index.
+   */
+  function indexGB18030RangesCodePointFor(pointer) {
+    // 1. If pointer is greater than 39419 and less than 189000, or
+    // pointer is greater than 1237575, return null.
+    if ((pointer > 39419 && pointer < 189000) || (pointer > 1237575))
+      return null;
+
+    // 2. If pointer is 7457, return code point U+E7C7.
+    if (pointer === 7457) return 0xE7C7;
+
+    // 3. Let offset be the last pointer in index gb18030 ranges that
+    // is equal to or less than pointer and let code point offset be
+    // its corresponding code point.
+    var offset = 0;
+    var code_point_offset = 0;
+    var idx = index('gb18030-ranges');
+    var i;
+    for (i = 0; i < idx.length; ++i) {
+      /** @type {!Array.<number>} */
+      var entry = idx[i];
+      if (entry[0] <= pointer) {
+        offset = entry[0];
+        code_point_offset = entry[1];
+      } else {
+        break;
+      }
+    }
+
+    // 4. Return a code point whose value is code point offset +
+    // pointer 鈭� offset.
+    return code_point_offset + pointer - offset;
+  }
+
+  /**
+   * @param {number} code_point The |code point| to locate in the gb18030 index.
+   * @return {number} The first pointer corresponding to |code point| in the
+   *     gb18030 index.
+   */
+  function indexGB18030RangesPointerFor(code_point) {
+    // 1. If code point is U+E7C7, return pointer 7457.
+    if (code_point === 0xE7C7) return 7457;
+
+    // 2. Let offset be the last code point in index gb18030 ranges
+    // that is equal to or less than code point and let pointer offset
+    // be its corresponding pointer.
+    var offset = 0;
+    var pointer_offset = 0;
+    var idx = index('gb18030-ranges');
+    var i;
+    for (i = 0; i < idx.length; ++i) {
+      /** @type {!Array.<number>} */
+      var entry = idx[i];
+      if (entry[1] <= code_point) {
+        offset = entry[1];
+        pointer_offset = entry[0];
+      } else {
+        break;
+      }
+    }
+
+    // 3. Return a pointer whose value is pointer offset + code point
+    // 鈭� offset.
+    return pointer_offset + code_point - offset;
+  }
+
+  /**
+   * @param {number} code_point The |code_point| to search for in the Shift_JIS
+   *     index.
+   * @return {?number} The code point corresponding to |pointer| in |index|,
+   *     or null if |code point| is not in the Shift_JIS index.
+   */
+  function indexShiftJISPointerFor(code_point) {
+    // 1. Let index be index jis0208 excluding all entries whose
+    // pointer is in the range 8272 to 8835, inclusive.
+    shift_jis_index = shift_jis_index ||
+      index('jis0208').map(function(code_point, pointer) {
+        return inRange(pointer, 8272, 8835) ? null : code_point;
+      });
+    var index_ = shift_jis_index;
+
+    // 2. Return the index pointer for code point in index.
+    return index_.indexOf(code_point);
+  }
+  var shift_jis_index;
+
+  /**
+   * @param {number} code_point The |code_point| to search for in the big5
+   *     index.
+   * @return {?number} The code point corresponding to |pointer| in |index|,
+   *     or null if |code point| is not in the big5 index.
+   */
+  function indexBig5PointerFor(code_point) {
+    // 1. Let index be index Big5 excluding all entries whose pointer
+    big5_index_no_hkscs = big5_index_no_hkscs ||
+      index('big5').map(function(code_point, pointer) {
+        return (pointer < (0xA1 - 0x81) * 157) ? null : code_point;
+      });
+    var index_ = big5_index_no_hkscs;
+
+    // 2. If code point is U+2550, U+255E, U+2561, U+256A, U+5341, or
+    // U+5345, return the last pointer corresponding to code point in
+    // index.
+    if (code_point === 0x2550 || code_point === 0x255E ||
+        code_point === 0x2561 || code_point === 0x256A ||
+        code_point === 0x5341 || code_point === 0x5345) {
+      return index_.lastIndexOf(code_point);
+    }
+
+    // 3. Return the index pointer for code point in index.
+    return indexPointerFor(code_point, index_);
+  }
+  var big5_index_no_hkscs;
+
+  //
+  // 8. API
+  //
+
+  /** @const */ var DEFAULT_ENCODING = 'utf-8';
+
+  // 8.1 Interface TextDecoder
+
+  /**
+   * @constructor
+   * @param {string=} label The label of the encoding;
+   *     defaults to 'utf-8'.
+   * @param {Object=} options
+   */
+  function TextDecoder(label, options) {
+    // Web IDL conventions
+    if (!(this instanceof TextDecoder))
+      throw TypeError('Called as a function. Did you forget \'new\'?');
+    label = label !== undefined ? String(label) : DEFAULT_ENCODING;
+    options = ToDictionary(options);
+
+    // A TextDecoder object has an associated encoding, decoder,
+    // stream, ignore BOM flag (initially unset), BOM seen flag
+    // (initially unset), error mode (initially replacement), and do
+    // not flush flag (initially unset).
+
+    /** @private */
+    this._encoding = null;
+    /** @private @type {?Decoder} */
+    this._decoder = null;
+    /** @private @type {boolean} */
+    this._ignoreBOM = false;
+    /** @private @type {boolean} */
+    this._BOMseen = false;
+    /** @private @type {string} */
+    this._error_mode = 'replacement';
+    /** @private @type {boolean} */
+    this._do_not_flush = false;
+
+
+    // 1. Let encoding be the result of getting an encoding from
+    // label.
+    var encoding = getEncoding(label);
+
+    // 2. If encoding is failure or replacement, throw a RangeError.
+    if (encoding === null || encoding.name === 'replacement')
+      throw RangeError('Unknown encoding: ' + label);
+    if (!decoders[encoding.name]) {
+      throw Error('Decoder not present.' +
+                  ' Did you forget to include encoding-indexes.js first?');
+    }
+
+    // 3. Let dec be a new TextDecoder object.
+    var dec = this;
+
+    // 4. Set dec's encoding to encoding.
+    dec._encoding = encoding;
+
+    // 5. If options's fatal member is true, set dec's error mode to
+    // fatal.
+    if (Boolean(options['fatal']))
+      dec._error_mode = 'fatal';
+
+    // 6. If options's ignoreBOM member is true, set dec's ignore BOM
+    // flag.
+    if (Boolean(options['ignoreBOM']))
+      dec._ignoreBOM = true;
+
+    // For pre-ES5 runtimes:
+    if (!Object.defineProperty) {
+      this.encoding = dec._encoding.name.toLowerCase();
+      this.fatal = dec._error_mode === 'fatal';
+      this.ignoreBOM = dec._ignoreBOM;
+    }
+
+    // 7. Return dec.
+    return dec;
+  }
+
+  if (Object.defineProperty) {
+    // The encoding attribute's getter must return encoding's name.
+    Object.defineProperty(TextDecoder.prototype, 'encoding', {
+      /** @this {TextDecoder} */
+      get: function() { return this._encoding.name.toLowerCase(); }
+    });
+
+    // The fatal attribute's getter must return true if error mode
+    // is fatal, and false otherwise.
+    Object.defineProperty(TextDecoder.prototype, 'fatal', {
+      /** @this {TextDecoder} */
+      get: function() { return this._error_mode === 'fatal'; }
+    });
+
+    // The ignoreBOM attribute's getter must return true if ignore
+    // BOM flag is set, and false otherwise.
+    Object.defineProperty(TextDecoder.prototype, 'ignoreBOM', {
+      /** @this {TextDecoder} */
+      get: function() { return this._ignoreBOM; }
+    });
+  }
+
+  /**
+   * @param {BufferSource=} input The buffer of bytes to decode.
+   * @param {Object=} options
+   * @return {string} The decoded string.
+   */
+  TextDecoder.prototype.decode = function decode(input, options) {
+    var bytes;
+    if (typeof input === 'object' && input instanceof ArrayBuffer) {
+      bytes = new Uint8Array(input);
+    } else if (typeof input === 'object' && 'buffer' in input &&
+               input.buffer instanceof ArrayBuffer) {
+      bytes = new Uint8Array(input.buffer,
+                             input.byteOffset,
+                             input.byteLength);
+    } else {
+      bytes = new Uint8Array(0);
+    }
+
+    options = ToDictionary(options);
+
+    // 1. If the do not flush flag is unset, set decoder to a new
+    // encoding's decoder, set stream to a new stream, and unset the
+    // BOM seen flag.
+    if (!this._do_not_flush) {
+      this._decoder = decoders[this._encoding.name]({
+        fatal: this._error_mode === 'fatal'});
+      this._BOMseen = false;
+    }
+
+    // 2. If options's stream is true, set the do not flush flag, and
+    // unset the do not flush flag otherwise.
+    this._do_not_flush = Boolean(options['stream']);
+
+    // 3. If input is given, push a copy of input to stream.
+    // TODO: Align with spec algorithm - maintain stream on instance.
+    var input_stream = new Stream(bytes);
+
+    // 4. Let output be a new stream.
+    var output = [];
+
+    /** @type {?(number|!Array.<number>)} */
+    var result;
+
+    // 5. While true:
+    while (true) {
+      // 1. Let token be the result of reading from stream.
+      var token = input_stream.read();
+
+      // 2. If token is end-of-stream and the do not flush flag is
+      // set, return output, serialized.
+      // TODO: Align with spec algorithm.
+      if (token === end_of_stream)
+        break;
+
+      // 3. Otherwise, run these subsubsteps:
+
+      // 1. Let result be the result of processing token for decoder,
+      // stream, output, and error mode.
+      result = this._decoder.handler(input_stream, token);
+
+      // 2. If result is finished, return output, serialized.
+      if (result === finished)
+        break;
+
+      if (result !== null) {
+        if (Array.isArray(result))
+          output.push.apply(output, /**@type {!Array.<number>}*/(result));
+        else
+          output.push(result);
+      }
+
+      // 3. Otherwise, if result is error, throw a TypeError.
+      // (Thrown in handler)
+
+      // 4. Otherwise, do nothing.
+    }
+    // TODO: Align with spec algorithm.
+    if (!this._do_not_flush) {
+      do {
+        result = this._decoder.handler(input_stream, input_stream.read());
+        if (result === finished)
+          break;
+        if (result === null)
+          continue;
+        if (Array.isArray(result))
+          output.push.apply(output, /**@type {!Array.<number>}*/(result));
+        else
+          output.push(result);
+      } while (!input_stream.endOfStream());
+      this._decoder = null;
+    }
+
+    // A TextDecoder object also has an associated serialize stream
+    // algorithm...
+    /**
+     * @param {!Array.<number>} stream
+     * @return {string}
+     * @this {TextDecoder}
+     */
+    function serializeStream(stream) {
+      // 1. Let token be the result of reading from stream.
+      // (Done in-place on array, rather than as a stream)
+
+      // 2. If encoding is UTF-8, UTF-16BE, or UTF-16LE, and ignore
+      // BOM flag and BOM seen flag are unset, run these subsubsteps:
+      if (includes(['UTF-8', 'UTF-16LE', 'UTF-16BE'], this._encoding.name) &&
+          !this._ignoreBOM && !this._BOMseen) {
+        if (stream.length > 0 && stream[0] === 0xFEFF) {
+          // 1. If token is U+FEFF, set BOM seen flag.
+          this._BOMseen = true;
+          stream.shift();
+        } else if (stream.length > 0) {
+          // 2. Otherwise, if token is not end-of-stream, set BOM seen
+          // flag and append token to stream.
+          this._BOMseen = true;
+        } else {
+          // 3. Otherwise, if token is not end-of-stream, append token
+          // to output.
+          // (no-op)
+        }
+      }
+      // 4. Otherwise, return output.
+      return codePointsToString(stream);
+    }
+
+    return serializeStream.call(this, output);
+  };
+
+  // 8.2 Interface TextEncoder
+
+  /**
+   * @constructor
+   * @param {string=} label The label of the encoding. NONSTANDARD.
+   * @param {Object=} options NONSTANDARD.
+   */
+  function TextEncoder(label, options) {
+    // Web IDL conventions
+    if (!(this instanceof TextEncoder))
+      throw TypeError('Called as a function. Did you forget \'new\'?');
+    options = ToDictionary(options);
+
+    // A TextEncoder object has an associated encoding and encoder.
+
+    /** @private */
+    this._encoding = null;
+    /** @private @type {?Encoder} */
+    this._encoder = null;
+
+    // Non-standard
+    /** @private @type {boolean} */
+    this._do_not_flush = false;
+    /** @private @type {string} */
+    this._fatal = Boolean(options['fatal']) ? 'fatal' : 'replacement';
+
+    // 1. Let enc be a new TextEncoder object.
+    var enc = this;
+
+    // 2. Set enc's encoding to UTF-8's encoder.
+    if (Boolean(options['NONSTANDARD_allowLegacyEncoding'])) {
+      // NONSTANDARD behavior.
+      label = label !== undefined ? String(label) : DEFAULT_ENCODING;
+      var encoding = getEncoding(label);
+      if (encoding === null || encoding.name === 'replacement')
+        throw RangeError('Unknown encoding: ' + label);
+      if (!encoders[encoding.name]) {
+        throw Error('Encoder not present.' +
+                    ' Did you forget to include encoding-indexes.js first?');
+      }
+      enc._encoding = encoding;
+    } else {
+      // Standard behavior.
+      enc._encoding = getEncoding('utf-8');
+
+      if (label !== undefined && 'console' in global) {
+        console.warn('TextEncoder constructor called with encoding label, '
+                     + 'which is ignored.');
+      }
+    }
+
+    // For pre-ES5 runtimes:
+    if (!Object.defineProperty)
+      this.encoding = enc._encoding.name.toLowerCase();
+
+    // 3. Return enc.
+    return enc;
+  }
+
+  if (Object.defineProperty) {
+    // The encoding attribute's getter must return encoding's name.
+    Object.defineProperty(TextEncoder.prototype, 'encoding', {
+      /** @this {TextEncoder} */
+      get: function() { return this._encoding.name.toLowerCase(); }
+    });
+  }
+
+  /**
+   * @param {string=} opt_string The string to encode.
+   * @param {Object=} options
+   * @return {!Uint8Array} Encoded bytes, as a Uint8Array.
+   */
+  TextEncoder.prototype.encode = function encode(opt_string, options) {
+    opt_string = opt_string === undefined ? '' : String(opt_string);
+    options = ToDictionary(options);
+
+    // NOTE: This option is nonstandard. None of the encodings
+    // permitted for encoding (i.e. UTF-8, UTF-16) are stateful when
+    // the input is a USVString so streaming is not necessary.
+    if (!this._do_not_flush)
+      this._encoder = encoders[this._encoding.name]({
+        fatal: this._fatal === 'fatal'});
+    this._do_not_flush = Boolean(options['stream']);
+
+    // 1. Convert input to a stream.
+    var input = new Stream(stringToCodePoints(opt_string));
+
+    // 2. Let output be a new stream
+    var output = [];
+
+    /** @type {?(number|!Array.<number>)} */
+    var result;
+    // 3. While true, run these substeps:
+    while (true) {
+      // 1. Let token be the result of reading from input.
+      var token = input.read();
+      if (token === end_of_stream)
+        break;
+      // 2. Let result be the result of processing token for encoder,
+      // input, output.
+      result = this._encoder.handler(input, token);
+      if (result === finished)
+        break;
+      if (Array.isArray(result))
+        output.push.apply(output, /**@type {!Array.<number>}*/(result));
+      else
+        output.push(result);
+    }
+    // TODO: Align with spec algorithm.
+    if (!this._do_not_flush) {
+      while (true) {
+        result = this._encoder.handler(input, input.read());
+        if (result === finished)
+          break;
+        if (Array.isArray(result))
+          output.push.apply(output, /**@type {!Array.<number>}*/(result));
+        else
+          output.push(result);
+      }
+      this._encoder = null;
+    }
+    // 3. If result is finished, convert output into a byte sequence,
+    // and then return a Uint8Array object wrapping an ArrayBuffer
+    // containing output.
+    return new Uint8Array(output);
+  };
+
+
+  //
+  // 9. The encoding
+  //
+
+  // 9.1 utf-8
+
+  // 9.1.1 utf-8 decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function UTF8Decoder(options) {
+    var fatal = options.fatal;
+
+    // utf-8's decoder's has an associated utf-8 code point, utf-8
+    // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8
+    // lower boundary (initially 0x80), and a utf-8 upper boundary
+    // (initially 0xBF).
+    var /** @type {number} */ utf8_code_point = 0,
+        /** @type {number} */ utf8_bytes_seen = 0,
+        /** @type {number} */ utf8_bytes_needed = 0,
+        /** @type {number} */ utf8_lower_boundary = 0x80,
+        /** @type {number} */ utf8_upper_boundary = 0xBF;
+
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and utf-8 bytes needed is not 0,
+      // set utf-8 bytes needed to 0 and return error.
+      if (bite === end_of_stream && utf8_bytes_needed !== 0) {
+        utf8_bytes_needed = 0;
+        return decoderError(fatal);
+      }
+
+      // 2. If byte is end-of-stream, return finished.
+      if (bite === end_of_stream)
+        return finished;
+
+      // 3. If utf-8 bytes needed is 0, based on byte:
+      if (utf8_bytes_needed === 0) {
+
+        // 0x00 to 0x7F
+        if (inRange(bite, 0x00, 0x7F)) {
+          // Return a code point whose value is byte.
+          return bite;
+        }
+
+        // 0xC2 to 0xDF
+        else if (inRange(bite, 0xC2, 0xDF)) {
+          // 1. Set utf-8 bytes needed to 1.
+          utf8_bytes_needed = 1;
+
+          // 2. Set UTF-8 code point to byte & 0x1F.
+          utf8_code_point = bite & 0x1F;
+        }
+
+        // 0xE0 to 0xEF
+        else if (inRange(bite, 0xE0, 0xEF)) {
+          // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0.
+          if (bite === 0xE0)
+            utf8_lower_boundary = 0xA0;
+          // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F.
+          if (bite === 0xED)
+            utf8_upper_boundary = 0x9F;
+          // 3. Set utf-8 bytes needed to 2.
+          utf8_bytes_needed = 2;
+          // 4. Set UTF-8 code point to byte & 0xF.
+          utf8_code_point = bite & 0xF;
+        }
+
+        // 0xF0 to 0xF4
+        else if (inRange(bite, 0xF0, 0xF4)) {
+          // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90.
+          if (bite === 0xF0)
+            utf8_lower_boundary = 0x90;
+          // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F.
+          if (bite === 0xF4)
+            utf8_upper_boundary = 0x8F;
+          // 3. Set utf-8 bytes needed to 3.
+          utf8_bytes_needed = 3;
+          // 4. Set UTF-8 code point to byte & 0x7.
+          utf8_code_point = bite & 0x7;
+        }
+
+        // Otherwise
+        else {
+          // Return error.
+          return decoderError(fatal);
+        }
+
+        // Return continue.
+        return null;
+      }
+
+      // 4. If byte is not in the range utf-8 lower boundary to utf-8
+      // upper boundary, inclusive, run these substeps:
+      if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {
+
+        // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8
+        // bytes seen to 0, set utf-8 lower boundary to 0x80, and set
+        // utf-8 upper boundary to 0xBF.
+        utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;
+        utf8_lower_boundary = 0x80;
+        utf8_upper_boundary = 0xBF;
+
+        // 2. Prepend byte to stream.
+        stream.prepend(bite);
+
+        // 3. Return error.
+        return decoderError(fatal);
+      }
+
+      // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary
+      // to 0xBF.
+      utf8_lower_boundary = 0x80;
+      utf8_upper_boundary = 0xBF;
+
+      // 6. Set UTF-8 code point to (UTF-8 code point << 6) | (byte &
+      // 0x3F)
+      utf8_code_point = (utf8_code_point << 6) | (bite & 0x3F);
+
+      // 7. Increase utf-8 bytes seen by one.
+      utf8_bytes_seen += 1;
+
+      // 8. If utf-8 bytes seen is not equal to utf-8 bytes needed,
+      // continue.
+      if (utf8_bytes_seen !== utf8_bytes_needed)
+        return null;
+
+      // 9. Let code point be utf-8 code point.
+      var code_point = utf8_code_point;
+
+      // 10. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes
+      // seen to 0.
+      utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;
+
+      // 11. Return a code point whose value is code point.
+      return code_point;
+    };
+  }
+
+  // 9.1.2 utf-8 encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function UTF8Encoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. Set count and offset based on the range code point is in:
+      var count, offset;
+      // U+0080 to U+07FF, inclusive:
+      if (inRange(code_point, 0x0080, 0x07FF)) {
+        // 1 and 0xC0
+        count = 1;
+        offset = 0xC0;
+      }
+      // U+0800 to U+FFFF, inclusive:
+      else if (inRange(code_point, 0x0800, 0xFFFF)) {
+        // 2 and 0xE0
+        count = 2;
+        offset = 0xE0;
+      }
+      // U+10000 to U+10FFFF, inclusive:
+      else if (inRange(code_point, 0x10000, 0x10FFFF)) {
+        // 3 and 0xF0
+        count = 3;
+        offset = 0xF0;
+      }
+
+      // 4. Let bytes be a byte sequence whose first byte is (code
+      // point >> (6 脳 count)) + offset.
+      var bytes = [(code_point >> (6 * count)) + offset];
+
+      // 5. Run these substeps while count is greater than 0:
+      while (count > 0) {
+
+        // 1. Set temp to code point >> (6 脳 (count 鈭� 1)).
+        var temp = code_point >> (6 * (count - 1));
+
+        // 2. Append to bytes 0x80 | (temp & 0x3F).
+        bytes.push(0x80 | (temp & 0x3F));
+
+        // 3. Decrease count by one.
+        count -= 1;
+      }
+
+      // 6. Return bytes bytes, in order.
+      return bytes;
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['UTF-8'] = function(options) {
+    return new UTF8Encoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['UTF-8'] = function(options) {
+    return new UTF8Decoder(options);
+  };
+
+  //
+  // 10. Legacy single-byte encodings
+  //
+
+  // 10.1 single-byte decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {!Array.<number>} index The encoding index.
+   * @param {{fatal: boolean}} options
+   */
+  function SingleByteDecoder(index, options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream, return finished.
+      if (bite === end_of_stream)
+        return finished;
+
+      // 2. If byte is an ASCII byte, return a code point whose value
+      // is byte.
+      if (isASCIIByte(bite))
+        return bite;
+
+      // 3. Let code point be the index code point for byte 鈭� 0x80 in
+      // index single-byte.
+      var code_point = index[bite - 0x80];
+
+      // 4. If code point is null, return error.
+      if (code_point === null)
+        return decoderError(fatal);
+
+      // 5. Return a code point whose value is code point.
+      return code_point;
+    };
+  }
+
+  // 10.2 single-byte encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {!Array.<?number>} index The encoding index.
+   * @param {{fatal: boolean}} options
+   */
+  function SingleByteEncoder(index, options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. Let pointer be the index pointer for code point in index
+      // single-byte.
+      var pointer = indexPointerFor(code_point, index);
+
+      // 4. If pointer is null, return error with code point.
+      if (pointer === null)
+        encoderError(code_point);
+
+      // 5. Return a byte whose value is pointer + 0x80.
+      return pointer + 0x80;
+    };
+  }
+
+  (function() {
+    if (!('encoding-indexes' in global))
+      return;
+    encodings.forEach(function(category) {
+      if (category.heading !== 'Legacy single-byte encodings')
+        return;
+      category.encodings.forEach(function(encoding) {
+        var name = encoding.name;
+        var idx = index(name.toLowerCase());
+        /** @param {{fatal: boolean}} options */
+        decoders[name] = function(options) {
+          return new SingleByteDecoder(idx, options);
+        };
+        /** @param {{fatal: boolean}} options */
+        encoders[name] = function(options) {
+          return new SingleByteEncoder(idx, options);
+        };
+      });
+    });
+  }());
+
+  //
+  // 11. Legacy multi-byte Chinese (simplified) encodings
+  //
+
+  // 11.1 gbk
+
+  // 11.1.1 gbk decoder
+  // gbk's decoder is gb18030's decoder.
+  /** @param {{fatal: boolean}} options */
+  decoders['GBK'] = function(options) {
+    return new GB18030Decoder(options);
+  };
+
+  // 11.1.2 gbk encoder
+  // gbk's encoder is gb18030's encoder with its gbk flag set.
+  /** @param {{fatal: boolean}} options */
+  encoders['GBK'] = function(options) {
+    return new GB18030Encoder(options, true);
+  };
+
+  // 11.2 gb18030
+  // 11.2.1 gb18030 decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function GB18030Decoder(options) {
+    var fatal = options.fatal;
+    // gb18030's decoder has an associated gb18030 first, gb18030
+    // second, and gb18030 third (all initially 0x00).
+    var /** @type {number} */ gb18030_first = 0x00,
+        /** @type {number} */ gb18030_second = 0x00,
+        /** @type {number} */ gb18030_third = 0x00;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and gb18030 first, gb18030
+      // second, and gb18030 third are 0x00, return finished.
+      if (bite === end_of_stream && gb18030_first === 0x00 &&
+          gb18030_second === 0x00 && gb18030_third === 0x00) {
+        return finished;
+      }
+      // 2. If byte is end-of-stream, and gb18030 first, gb18030
+      // second, or gb18030 third is not 0x00, set gb18030 first,
+      // gb18030 second, and gb18030 third to 0x00, and return error.
+      if (bite === end_of_stream &&
+          (gb18030_first !== 0x00 || gb18030_second !== 0x00 ||
+           gb18030_third !== 0x00)) {
+        gb18030_first = 0x00;
+        gb18030_second = 0x00;
+        gb18030_third = 0x00;
+        decoderError(fatal);
+      }
+      var code_point;
+      // 3. If gb18030 third is not 0x00, run these substeps:
+      if (gb18030_third !== 0x00) {
+        // 1. Let code point be null.
+        code_point = null;
+        // 2. If byte is in the range 0x30 to 0x39, inclusive, set
+        // code point to the index gb18030 ranges code point for
+        // (((gb18030 first 鈭� 0x81) 脳 10 + gb18030 second 鈭� 0x30) 脳
+        // 126 + gb18030 third 鈭� 0x81) 脳 10 + byte 鈭� 0x30.
+        if (inRange(bite, 0x30, 0x39)) {
+          code_point = indexGB18030RangesCodePointFor(
+              (((gb18030_first - 0x81) * 10 + gb18030_second - 0x30) * 126 +
+               gb18030_third - 0x81) * 10 + bite - 0x30);
+        }
+
+        // 3. Let buffer be a byte sequence consisting of gb18030
+        // second, gb18030 third, and byte, in order.
+        var buffer = [gb18030_second, gb18030_third, bite];
+
+        // 4. Set gb18030 first, gb18030 second, and gb18030 third to
+        // 0x00.
+        gb18030_first = 0x00;
+        gb18030_second = 0x00;
+        gb18030_third = 0x00;
+
+        // 5. If code point is null, prepend buffer to stream and
+        // return error.
+        if (code_point === null) {
+          stream.prepend(buffer);
+          return decoderError(fatal);
+        }
+
+        // 6. Return a code point whose value is code point.
+        return code_point;
+      }
+
+      // 4. If gb18030 second is not 0x00, run these substeps:
+      if (gb18030_second !== 0x00) {
+
+        // 1. If byte is in the range 0x81 to 0xFE, inclusive, set
+        // gb18030 third to byte and return continue.
+        if (inRange(bite, 0x81, 0xFE)) {
+          gb18030_third = bite;
+          return null;
+        }
+
+        // 2. Prepend gb18030 second followed by byte to stream, set
+        // gb18030 first and gb18030 second to 0x00, and return error.
+        stream.prepend([gb18030_second, bite]);
+        gb18030_first = 0x00;
+        gb18030_second = 0x00;
+        return decoderError(fatal);
+      }
+
+      // 5. If gb18030 first is not 0x00, run these substeps:
+      if (gb18030_first !== 0x00) {
+
+        // 1. If byte is in the range 0x30 to 0x39, inclusive, set
+        // gb18030 second to byte and return continue.
+        if (inRange(bite, 0x30, 0x39)) {
+          gb18030_second = bite;
+          return null;
+        }
+
+        // 2. Let lead be gb18030 first, let pointer be null, and set
+        // gb18030 first to 0x00.
+        var lead = gb18030_first;
+        var pointer = null;
+        gb18030_first = 0x00;
+
+        // 3. Let offset be 0x40 if byte is less than 0x7F and 0x41
+        // otherwise.
+        var offset = bite < 0x7F ? 0x40 : 0x41;
+
+        // 4. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80
+        // to 0xFE, inclusive, set pointer to (lead 鈭� 0x81) 脳 190 +
+        // (byte 鈭� offset).
+        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFE))
+          pointer = (lead - 0x81) * 190 + (bite - offset);
+
+        // 5. Let code point be null if pointer is null and the index
+        // code point for pointer in index gb18030 otherwise.
+        code_point = pointer === null ? null :
+            indexCodePointFor(pointer, index('gb18030'));
+
+        // 6. If code point is null and byte is an ASCII byte, prepend
+        // byte to stream.
+        if (code_point === null && isASCIIByte(bite))
+          stream.prepend(bite);
+
+        // 7. If code point is null, return error.
+        if (code_point === null)
+          return decoderError(fatal);
+
+        // 8. Return a code point whose value is code point.
+        return code_point;
+      }
+
+      // 6. If byte is an ASCII byte, return a code point whose value
+      // is byte.
+      if (isASCIIByte(bite))
+        return bite;
+
+      // 7. If byte is 0x80, return code point U+20AC.
+      if (bite === 0x80)
+        return 0x20AC;
+
+      // 8. If byte is in the range 0x81 to 0xFE, inclusive, set
+      // gb18030 first to byte and return continue.
+      if (inRange(bite, 0x81, 0xFE)) {
+        gb18030_first = bite;
+        return null;
+      }
+
+      // 9. Return error.
+      return decoderError(fatal);
+    };
+  }
+
+  // 11.2.2 gb18030 encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   * @param {boolean=} gbk_flag
+   */
+  function GB18030Encoder(options, gbk_flag) {
+    var fatal = options.fatal;
+    // gb18030's decoder has an associated gbk flag (initially unset).
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. If code point is U+E5E5, return error with code point.
+      if (code_point === 0xE5E5)
+        return encoderError(code_point);
+
+      // 4. If the gbk flag is set and code point is U+20AC, return
+      // byte 0x80.
+      if (gbk_flag && code_point === 0x20AC)
+        return 0x80;
+
+      // 5. Let pointer be the index pointer for code point in index
+      // gb18030.
+      var pointer = indexPointerFor(code_point, index('gb18030'));
+
+      // 6. If pointer is not null, run these substeps:
+      if (pointer !== null) {
+
+        // 1. Let lead be floor(pointer / 190) + 0x81.
+        var lead = floor(pointer / 190) + 0x81;
+
+        // 2. Let trail be pointer % 190.
+        var trail = pointer % 190;
+
+        // 3. Let offset be 0x40 if trail is less than 0x3F and 0x41 otherwise.
+        var offset = trail < 0x3F ? 0x40 : 0x41;
+
+        // 4. Return two bytes whose values are lead and trail + offset.
+        return [lead, trail + offset];
+      }
+
+      // 7. If gbk flag is set, return error with code point.
+      if (gbk_flag)
+        return encoderError(code_point);
+
+      // 8. Set pointer to the index gb18030 ranges pointer for code
+      // point.
+      pointer = indexGB18030RangesPointerFor(code_point);
+
+      // 9. Let byte1 be floor(pointer / 10 / 126 / 10).
+      var byte1 = floor(pointer / 10 / 126 / 10);
+
+      // 10. Set pointer to pointer 鈭� byte1 脳 10 脳 126 脳 10.
+      pointer = pointer - byte1 * 10 * 126 * 10;
+
+      // 11. Let byte2 be floor(pointer / 10 / 126).
+      var byte2 = floor(pointer / 10 / 126);
+
+      // 12. Set pointer to pointer 鈭� byte2 脳 10 脳 126.
+      pointer = pointer - byte2 * 10 * 126;
+
+      // 13. Let byte3 be floor(pointer / 10).
+      var byte3 = floor(pointer / 10);
+
+      // 14. Let byte4 be pointer 鈭� byte3 脳 10.
+      var byte4 = pointer - byte3 * 10;
+
+      // 15. Return four bytes whose values are byte1 + 0x81, byte2 +
+      // 0x30, byte3 + 0x81, byte4 + 0x30.
+      return [byte1 + 0x81,
+              byte2 + 0x30,
+              byte3 + 0x81,
+              byte4 + 0x30];
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['gb18030'] = function(options) {
+    return new GB18030Encoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['gb18030'] = function(options) {
+    return new GB18030Decoder(options);
+  };
+
+
+  //
+  // 12. Legacy multi-byte Chinese (traditional) encodings
+  //
+
+  // 12.1 Big5
+
+  // 12.1.1 Big5 decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function Big5Decoder(options) {
+    var fatal = options.fatal;
+    // Big5's decoder has an associated Big5 lead (initially 0x00).
+    var /** @type {number} */ Big5_lead = 0x00;
+
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and Big5 lead is not 0x00, set
+      // Big5 lead to 0x00 and return error.
+      if (bite === end_of_stream && Big5_lead !== 0x00) {
+        Big5_lead = 0x00;
+        return decoderError(fatal);
+      }
+
+      // 2. If byte is end-of-stream and Big5 lead is 0x00, return
+      // finished.
+      if (bite === end_of_stream && Big5_lead === 0x00)
+        return finished;
+
+      // 3. If Big5 lead is not 0x00, let lead be Big5 lead, let
+      // pointer be null, set Big5 lead to 0x00, and then run these
+      // substeps:
+      if (Big5_lead !== 0x00) {
+        var lead = Big5_lead;
+        var pointer = null;
+        Big5_lead = 0x00;
+
+        // 1. Let offset be 0x40 if byte is less than 0x7F and 0x62
+        // otherwise.
+        var offset = bite < 0x7F ? 0x40 : 0x62;
+
+        // 2. If byte is in the range 0x40 to 0x7E, inclusive, or 0xA1
+        // to 0xFE, inclusive, set pointer to (lead 鈭� 0x81) 脳 157 +
+        // (byte 鈭� offset).
+        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0xA1, 0xFE))
+          pointer = (lead - 0x81) * 157 + (bite - offset);
+
+        // 3. If there is a row in the table below whose first column
+        // is pointer, return the two code points listed in its second
+        // column
+        // Pointer | Code points
+        // --------+--------------
+        // 1133    | U+00CA U+0304
+        // 1135    | U+00CA U+030C
+        // 1164    | U+00EA U+0304
+        // 1166    | U+00EA U+030C
+        switch (pointer) {
+          case 1133: return [0x00CA, 0x0304];
+          case 1135: return [0x00CA, 0x030C];
+          case 1164: return [0x00EA, 0x0304];
+          case 1166: return [0x00EA, 0x030C];
+        }
+
+        // 4. Let code point be null if pointer is null and the index
+        // code point for pointer in index Big5 otherwise.
+        var code_point = (pointer === null) ? null :
+            indexCodePointFor(pointer, index('big5'));
+
+        // 5. If code point is null and byte is an ASCII byte, prepend
+        // byte to stream.
+        if (code_point === null && isASCIIByte(bite))
+          stream.prepend(bite);
+
+        // 6. If code point is null, return error.
+        if (code_point === null)
+          return decoderError(fatal);
+
+        // 7. Return a code point whose value is code point.
+        return code_point;
+      }
+
+      // 4. If byte is an ASCII byte, return a code point whose value
+      // is byte.
+      if (isASCIIByte(bite))
+        return bite;
+
+      // 5. If byte is in the range 0x81 to 0xFE, inclusive, set Big5
+      // lead to byte and return continue.
+      if (inRange(bite, 0x81, 0xFE)) {
+        Big5_lead = bite;
+        return null;
+      }
+
+      // 6. Return error.
+      return decoderError(fatal);
+    };
+  }
+
+  // 12.1.2 Big5 encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function Big5Encoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. Let pointer be the index Big5 pointer for code point.
+      var pointer = indexBig5PointerFor(code_point);
+
+      // 4. If pointer is null, return error with code point.
+      if (pointer === null)
+        return encoderError(code_point);
+
+      // 5. Let lead be floor(pointer / 157) + 0x81.
+      var lead = floor(pointer / 157) + 0x81;
+
+      // 6. If lead is less than 0xA1, return error with code point.
+      if (lead < 0xA1)
+        return encoderError(code_point);
+
+      // 7. Let trail be pointer % 157.
+      var trail = pointer % 157;
+
+      // 8. Let offset be 0x40 if trail is less than 0x3F and 0x62
+      // otherwise.
+      var offset = trail < 0x3F ? 0x40 : 0x62;
+
+      // Return two bytes whose values are lead and trail + offset.
+      return [lead, trail + offset];
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['Big5'] = function(options) {
+    return new Big5Encoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['Big5'] = function(options) {
+    return new Big5Decoder(options);
+  };
+
+
+  //
+  // 13. Legacy multi-byte Japanese encodings
+  //
+
+  // 13.1 euc-jp
+
+  // 13.1.1 euc-jp decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function EUCJPDecoder(options) {
+    var fatal = options.fatal;
+
+    // euc-jp's decoder has an associated euc-jp jis0212 flag
+    // (initially unset) and euc-jp lead (initially 0x00).
+    var /** @type {boolean} */ eucjp_jis0212_flag = false,
+        /** @type {number} */ eucjp_lead = 0x00;
+
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and euc-jp lead is not 0x00, set
+      // euc-jp lead to 0x00, and return error.
+      if (bite === end_of_stream && eucjp_lead !== 0x00) {
+        eucjp_lead = 0x00;
+        return decoderError(fatal);
+      }
+
+      // 2. If byte is end-of-stream and euc-jp lead is 0x00, return
+      // finished.
+      if (bite === end_of_stream && eucjp_lead === 0x00)
+        return finished;
+
+      // 3. If euc-jp lead is 0x8E and byte is in the range 0xA1 to
+      // 0xDF, inclusive, set euc-jp lead to 0x00 and return a code
+      // point whose value is 0xFF61 鈭� 0xA1 + byte.
+      if (eucjp_lead === 0x8E && inRange(bite, 0xA1, 0xDF)) {
+        eucjp_lead = 0x00;
+        return 0xFF61 - 0xA1 + bite;
+      }
+
+      // 4. If euc-jp lead is 0x8F and byte is in the range 0xA1 to
+      // 0xFE, inclusive, set the euc-jp jis0212 flag, set euc-jp lead
+      // to byte, and return continue.
+      if (eucjp_lead === 0x8F && inRange(bite, 0xA1, 0xFE)) {
+        eucjp_jis0212_flag = true;
+        eucjp_lead = bite;
+        return null;
+      }
+
+      // 5. If euc-jp lead is not 0x00, let lead be euc-jp lead, set
+      // euc-jp lead to 0x00, and run these substeps:
+      if (eucjp_lead !== 0x00) {
+        var lead = eucjp_lead;
+        eucjp_lead = 0x00;
+
+        // 1. Let code point be null.
+        var code_point = null;
+
+        // 2. If lead and byte are both in the range 0xA1 to 0xFE,
+        // inclusive, set code point to the index code point for (lead
+        // 鈭� 0xA1) 脳 94 + byte 鈭� 0xA1 in index jis0208 if the euc-jp
+        // jis0212 flag is unset and in index jis0212 otherwise.
+        if (inRange(lead, 0xA1, 0xFE) && inRange(bite, 0xA1, 0xFE)) {
+          code_point = indexCodePointFor(
+            (lead - 0xA1) * 94 + (bite - 0xA1),
+            index(!eucjp_jis0212_flag ? 'jis0208' : 'jis0212'));
+        }
+
+        // 3. Unset the euc-jp jis0212 flag.
+        eucjp_jis0212_flag = false;
+
+        // 4. If byte is not in the range 0xA1 to 0xFE, inclusive,
+        // prepend byte to stream.
+        if (!inRange(bite, 0xA1, 0xFE))
+          stream.prepend(bite);
+
+        // 5. If code point is null, return error.
+        if (code_point === null)
+          return decoderError(fatal);
+
+        // 6. Return a code point whose value is code point.
+        return code_point;
+      }
+
+      // 6. If byte is an ASCII byte, return a code point whose value
+      // is byte.
+      if (isASCIIByte(bite))
+        return bite;
+
+      // 7. If byte is 0x8E, 0x8F, or in the range 0xA1 to 0xFE,
+      // inclusive, set euc-jp lead to byte and return continue.
+      if (bite === 0x8E || bite === 0x8F || inRange(bite, 0xA1, 0xFE)) {
+        eucjp_lead = bite;
+        return null;
+      }
+
+      // 8. Return error.
+      return decoderError(fatal);
+    };
+  }
+
+  // 13.1.2 euc-jp encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function EUCJPEncoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. If code point is U+00A5, return byte 0x5C.
+      if (code_point === 0x00A5)
+        return 0x5C;
+
+      // 4. If code point is U+203E, return byte 0x7E.
+      if (code_point === 0x203E)
+        return 0x7E;
+
+      // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,
+      // return two bytes whose values are 0x8E and code point 鈭�
+      // 0xFF61 + 0xA1.
+      if (inRange(code_point, 0xFF61, 0xFF9F))
+        return [0x8E, code_point - 0xFF61 + 0xA1];
+
+      // 6. If code point is U+2212, set it to U+FF0D.
+      if (code_point === 0x2212)
+        code_point = 0xFF0D;
+
+      // 7. Let pointer be the index pointer for code point in index
+      // jis0208.
+      var pointer = indexPointerFor(code_point, index('jis0208'));
+
+      // 8. If pointer is null, return error with code point.
+      if (pointer === null)
+        return encoderError(code_point);
+
+      // 9. Let lead be floor(pointer / 94) + 0xA1.
+      var lead = floor(pointer / 94) + 0xA1;
+
+      // 10. Let trail be pointer % 94 + 0xA1.
+      var trail = pointer % 94 + 0xA1;
+
+      // 11. Return two bytes whose values are lead and trail.
+      return [lead, trail];
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['EUC-JP'] = function(options) {
+    return new EUCJPEncoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['EUC-JP'] = function(options) {
+    return new EUCJPDecoder(options);
+  };
+
+  // 13.2 iso-2022-jp
+
+  // 13.2.1 iso-2022-jp decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function ISO2022JPDecoder(options) {
+    var fatal = options.fatal;
+    /** @enum */
+    var states = {
+      ASCII: 0,
+      Roman: 1,
+      Katakana: 2,
+      LeadByte: 3,
+      TrailByte: 4,
+      EscapeStart: 5,
+      Escape: 6
+    };
+    // iso-2022-jp's decoder has an associated iso-2022-jp decoder
+    // state (initially ASCII), iso-2022-jp decoder output state
+    // (initially ASCII), iso-2022-jp lead (initially 0x00), and
+    // iso-2022-jp output flag (initially unset).
+    var /** @type {number} */ iso2022jp_decoder_state = states.ASCII,
+        /** @type {number} */ iso2022jp_decoder_output_state = states.ASCII,
+        /** @type {number} */ iso2022jp_lead = 0x00,
+        /** @type {boolean} */ iso2022jp_output_flag = false;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // switching on iso-2022-jp decoder state:
+      switch (iso2022jp_decoder_state) {
+      default:
+      case states.ASCII:
+        // ASCII
+        // Based on byte:
+
+        // 0x1B
+        if (bite === 0x1B) {
+          // Set iso-2022-jp decoder state to escape start and return
+          // continue.
+          iso2022jp_decoder_state = states.EscapeStart;
+          return null;
+        }
+
+        // 0x00 to 0x7F, excluding 0x0E, 0x0F, and 0x1B
+        if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E
+            && bite !== 0x0F && bite !== 0x1B) {
+          // Unset the iso-2022-jp output flag and return a code point
+          // whose value is byte.
+          iso2022jp_output_flag = false;
+          return bite;
+        }
+
+        // end-of-stream
+        if (bite === end_of_stream) {
+          // Return finished.
+          return finished;
+        }
+
+        // Otherwise
+        // Unset the iso-2022-jp output flag and return error.
+        iso2022jp_output_flag = false;
+        return decoderError(fatal);
+
+      case states.Roman:
+        // Roman
+        // Based on byte:
+
+        // 0x1B
+        if (bite === 0x1B) {
+          // Set iso-2022-jp decoder state to escape start and return
+          // continue.
+          iso2022jp_decoder_state = states.EscapeStart;
+          return null;
+        }
+
+        // 0x5C
+        if (bite === 0x5C) {
+          // Unset the iso-2022-jp output flag and return code point
+          // U+00A5.
+          iso2022jp_output_flag = false;
+          return 0x00A5;
+        }
+
+        // 0x7E
+        if (bite === 0x7E) {
+          // Unset the iso-2022-jp output flag and return code point
+          // U+203E.
+          iso2022jp_output_flag = false;
+          return 0x203E;
+        }
+
+        // 0x00 to 0x7F, excluding 0x0E, 0x0F, 0x1B, 0x5C, and 0x7E
+        if (inRange(bite, 0x00, 0x7F) && bite !== 0x0E && bite !== 0x0F
+            && bite !== 0x1B && bite !== 0x5C && bite !== 0x7E) {
+          // Unset the iso-2022-jp output flag and return a code point
+          // whose value is byte.
+          iso2022jp_output_flag = false;
+          return bite;
+        }
+
+        // end-of-stream
+        if (bite === end_of_stream) {
+          // Return finished.
+          return finished;
+        }
+
+        // Otherwise
+        // Unset the iso-2022-jp output flag and return error.
+        iso2022jp_output_flag = false;
+        return decoderError(fatal);
+
+      case states.Katakana:
+        // Katakana
+        // Based on byte:
+
+        // 0x1B
+        if (bite === 0x1B) {
+          // Set iso-2022-jp decoder state to escape start and return
+          // continue.
+          iso2022jp_decoder_state = states.EscapeStart;
+          return null;
+        }
+
+        // 0x21 to 0x5F
+        if (inRange(bite, 0x21, 0x5F)) {
+          // Unset the iso-2022-jp output flag and return a code point
+          // whose value is 0xFF61 鈭� 0x21 + byte.
+          iso2022jp_output_flag = false;
+          return 0xFF61 - 0x21 + bite;
+        }
+
+        // end-of-stream
+        if (bite === end_of_stream) {
+          // Return finished.
+          return finished;
+        }
+
+        // Otherwise
+        // Unset the iso-2022-jp output flag and return error.
+        iso2022jp_output_flag = false;
+        return decoderError(fatal);
+
+      case states.LeadByte:
+        // Lead byte
+        // Based on byte:
+
+        // 0x1B
+        if (bite === 0x1B) {
+          // Set iso-2022-jp decoder state to escape start and return
+          // continue.
+          iso2022jp_decoder_state = states.EscapeStart;
+          return null;
+        }
+
+        // 0x21 to 0x7E
+        if (inRange(bite, 0x21, 0x7E)) {
+          // Unset the iso-2022-jp output flag, set iso-2022-jp lead
+          // to byte, iso-2022-jp decoder state to trail byte, and
+          // return continue.
+          iso2022jp_output_flag = false;
+          iso2022jp_lead = bite;
+          iso2022jp_decoder_state = states.TrailByte;
+          return null;
+        }
+
+        // end-of-stream
+        if (bite === end_of_stream) {
+          // Return finished.
+          return finished;
+        }
+
+        // Otherwise
+        // Unset the iso-2022-jp output flag and return error.
+        iso2022jp_output_flag = false;
+        return decoderError(fatal);
+
+      case states.TrailByte:
+        // Trail byte
+        // Based on byte:
+
+        // 0x1B
+        if (bite === 0x1B) {
+          // Set iso-2022-jp decoder state to escape start and return
+          // continue.
+          iso2022jp_decoder_state = states.EscapeStart;
+          return decoderError(fatal);
+        }
+
+        // 0x21 to 0x7E
+        if (inRange(bite, 0x21, 0x7E)) {
+          // 1. Set the iso-2022-jp decoder state to lead byte.
+          iso2022jp_decoder_state = states.LeadByte;
+
+          // 2. Let pointer be (iso-2022-jp lead 鈭� 0x21) 脳 94 + byte 鈭� 0x21.
+          var pointer = (iso2022jp_lead - 0x21) * 94 + bite - 0x21;
+
+          // 3. Let code point be the index code point for pointer in
+          // index jis0208.
+          var code_point = indexCodePointFor(pointer, index('jis0208'));
+
+          // 4. If code point is null, return error.
+          if (code_point === null)
+            return decoderError(fatal);
+
+          // 5. Return a code point whose value is code point.
+          return code_point;
+        }
+
+        // end-of-stream
+        if (bite === end_of_stream) {
+          // Set the iso-2022-jp decoder state to lead byte, prepend
+          // byte to stream, and return error.
+          iso2022jp_decoder_state = states.LeadByte;
+          stream.prepend(bite);
+          return decoderError(fatal);
+        }
+
+        // Otherwise
+        // Set iso-2022-jp decoder state to lead byte and return
+        // error.
+        iso2022jp_decoder_state = states.LeadByte;
+        return decoderError(fatal);
+
+      case states.EscapeStart:
+        // Escape start
+
+        // 1. If byte is either 0x24 or 0x28, set iso-2022-jp lead to
+        // byte, iso-2022-jp decoder state to escape, and return
+        // continue.
+        if (bite === 0x24 || bite === 0x28) {
+          iso2022jp_lead = bite;
+          iso2022jp_decoder_state = states.Escape;
+          return null;
+        }
+
+        // 2. Prepend byte to stream.
+        stream.prepend(bite);
+
+        // 3. Unset the iso-2022-jp output flag, set iso-2022-jp
+        // decoder state to iso-2022-jp decoder output state, and
+        // return error.
+        iso2022jp_output_flag = false;
+        iso2022jp_decoder_state = iso2022jp_decoder_output_state;
+        return decoderError(fatal);
+
+      case states.Escape:
+        // Escape
+
+        // 1. Let lead be iso-2022-jp lead and set iso-2022-jp lead to
+        // 0x00.
+        var lead = iso2022jp_lead;
+        iso2022jp_lead = 0x00;
+
+        // 2. Let state be null.
+        var state = null;
+
+        // 3. If lead is 0x28 and byte is 0x42, set state to ASCII.
+        if (lead === 0x28 && bite === 0x42)
+          state = states.ASCII;
+
+        // 4. If lead is 0x28 and byte is 0x4A, set state to Roman.
+        if (lead === 0x28 && bite === 0x4A)
+          state = states.Roman;
+
+        // 5. If lead is 0x28 and byte is 0x49, set state to Katakana.
+        if (lead === 0x28 && bite === 0x49)
+          state = states.Katakana;
+
+        // 6. If lead is 0x24 and byte is either 0x40 or 0x42, set
+        // state to lead byte.
+        if (lead === 0x24 && (bite === 0x40 || bite === 0x42))
+          state = states.LeadByte;
+
+        // 7. If state is non-null, run these substeps:
+        if (state !== null) {
+          // 1. Set iso-2022-jp decoder state and iso-2022-jp decoder
+          // output state to states.
+          iso2022jp_decoder_state = iso2022jp_decoder_state = state;
+
+          // 2. Let output flag be the iso-2022-jp output flag.
+          var output_flag = iso2022jp_output_flag;
+
+          // 3. Set the iso-2022-jp output flag.
+          iso2022jp_output_flag = true;
+
+          // 4. Return continue, if output flag is unset, and error
+          // otherwise.
+          return !output_flag ? null : decoderError(fatal);
+        }
+
+        // 8. Prepend lead and byte to stream.
+        stream.prepend([lead, bite]);
+
+        // 9. Unset the iso-2022-jp output flag, set iso-2022-jp
+        // decoder state to iso-2022-jp decoder output state and
+        // return error.
+        iso2022jp_output_flag = false;
+        iso2022jp_decoder_state = iso2022jp_decoder_output_state;
+        return decoderError(fatal);
+      }
+    };
+  }
+
+  // 13.2.2 iso-2022-jp encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function ISO2022JPEncoder(options) {
+    var fatal = options.fatal;
+    // iso-2022-jp's encoder has an associated iso-2022-jp encoder
+    // state which is one of ASCII, Roman, and jis0208 (initially
+    // ASCII).
+    /** @enum */
+    var states = {
+      ASCII: 0,
+      Roman: 1,
+      jis0208: 2
+    };
+    var /** @type {number} */ iso2022jp_state = states.ASCII;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream and iso-2022-jp encoder
+      // state is not ASCII, prepend code point to stream, set
+      // iso-2022-jp encoder state to ASCII, and return three bytes
+      // 0x1B 0x28 0x42.
+      if (code_point === end_of_stream &&
+          iso2022jp_state !== states.ASCII) {
+        stream.prepend(code_point);
+        iso2022jp_state = states.ASCII;
+        return [0x1B, 0x28, 0x42];
+      }
+
+      // 2. If code point is end-of-stream and iso-2022-jp encoder
+      // state is ASCII, return finished.
+      if (code_point === end_of_stream && iso2022jp_state === states.ASCII)
+        return finished;
+
+      // 3. If ISO-2022-JP encoder state is ASCII or Roman, and code
+      // point is U+000E, U+000F, or U+001B, return error with U+FFFD.
+      if ((iso2022jp_state === states.ASCII ||
+           iso2022jp_state === states.Roman) &&
+          (code_point === 0x000E || code_point === 0x000F ||
+           code_point === 0x001B)) {
+        return encoderError(0xFFFD);
+      }
+
+      // 4. If iso-2022-jp encoder state is ASCII and code point is an
+      // ASCII code point, return a byte whose value is code point.
+      if (iso2022jp_state === states.ASCII &&
+          isASCIICodePoint(code_point))
+        return code_point;
+
+      // 5. If iso-2022-jp encoder state is Roman and code point is an
+      // ASCII code point, excluding U+005C and U+007E, or is U+00A5
+      // or U+203E, run these substeps:
+      if (iso2022jp_state === states.Roman &&
+          ((isASCIICodePoint(code_point) &&
+           code_point !== 0x005C && code_point !== 0x007E) ||
+          (code_point == 0x00A5 || code_point == 0x203E))) {
+
+        // 1. If code point is an ASCII code point, return a byte
+        // whose value is code point.
+        if (isASCIICodePoint(code_point))
+          return code_point;
+
+        // 2. If code point is U+00A5, return byte 0x5C.
+        if (code_point === 0x00A5)
+          return 0x5C;
+
+        // 3. If code point is U+203E, return byte 0x7E.
+        if (code_point === 0x203E)
+          return 0x7E;
+      }
+
+      // 6. If code point is an ASCII code point, and iso-2022-jp
+      // encoder state is not ASCII, prepend code point to stream, set
+      // iso-2022-jp encoder state to ASCII, and return three bytes
+      // 0x1B 0x28 0x42.
+      if (isASCIICodePoint(code_point) &&
+          iso2022jp_state !== states.ASCII) {
+        stream.prepend(code_point);
+        iso2022jp_state = states.ASCII;
+        return [0x1B, 0x28, 0x42];
+      }
+
+      // 7. If code point is either U+00A5 or U+203E, and iso-2022-jp
+      // encoder state is not Roman, prepend code point to stream, set
+      // iso-2022-jp encoder state to Roman, and return three bytes
+      // 0x1B 0x28 0x4A.
+      if ((code_point === 0x00A5 || code_point === 0x203E) &&
+          iso2022jp_state !== states.Roman) {
+        stream.prepend(code_point);
+        iso2022jp_state = states.Roman;
+        return [0x1B, 0x28, 0x4A];
+      }
+
+      // 8. If code point is U+2212, set it to U+FF0D.
+      if (code_point === 0x2212)
+        code_point = 0xFF0D;
+
+      // 9. Let pointer be the index pointer for code point in index
+      // jis0208.
+      var pointer = indexPointerFor(code_point, index('jis0208'));
+
+      // 10. If pointer is null, return error with code point.
+      if (pointer === null)
+        return encoderError(code_point);
+
+      // 11. If iso-2022-jp encoder state is not jis0208, prepend code
+      // point to stream, set iso-2022-jp encoder state to jis0208,
+      // and return three bytes 0x1B 0x24 0x42.
+      if (iso2022jp_state !== states.jis0208) {
+        stream.prepend(code_point);
+        iso2022jp_state = states.jis0208;
+        return [0x1B, 0x24, 0x42];
+      }
+
+      // 12. Let lead be floor(pointer / 94) + 0x21.
+      var lead = floor(pointer / 94) + 0x21;
+
+      // 13. Let trail be pointer % 94 + 0x21.
+      var trail = pointer % 94 + 0x21;
+
+      // 14. Return two bytes whose values are lead and trail.
+      return [lead, trail];
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['ISO-2022-JP'] = function(options) {
+    return new ISO2022JPEncoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['ISO-2022-JP'] = function(options) {
+    return new ISO2022JPDecoder(options);
+  };
+
+  // 13.3 Shift_JIS
+
+  // 13.3.1 Shift_JIS decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function ShiftJISDecoder(options) {
+    var fatal = options.fatal;
+    // Shift_JIS's decoder has an associated Shift_JIS lead (initially
+    // 0x00).
+    var /** @type {number} */ Shift_JIS_lead = 0x00;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and Shift_JIS lead is not 0x00,
+      // set Shift_JIS lead to 0x00 and return error.
+      if (bite === end_of_stream && Shift_JIS_lead !== 0x00) {
+        Shift_JIS_lead = 0x00;
+        return decoderError(fatal);
+      }
+
+      // 2. If byte is end-of-stream and Shift_JIS lead is 0x00,
+      // return finished.
+      if (bite === end_of_stream && Shift_JIS_lead === 0x00)
+        return finished;
+
+      // 3. If Shift_JIS lead is not 0x00, let lead be Shift_JIS lead,
+      // let pointer be null, set Shift_JIS lead to 0x00, and then run
+      // these substeps:
+      if (Shift_JIS_lead !== 0x00) {
+        var lead = Shift_JIS_lead;
+        var pointer = null;
+        Shift_JIS_lead = 0x00;
+
+        // 1. Let offset be 0x40, if byte is less than 0x7F, and 0x41
+        // otherwise.
+        var offset = (bite < 0x7F) ? 0x40 : 0x41;
+
+        // 2. Let lead offset be 0x81, if lead is less than 0xA0, and
+        // 0xC1 otherwise.
+        var lead_offset = (lead < 0xA0) ? 0x81 : 0xC1;
+
+        // 3. If byte is in the range 0x40 to 0x7E, inclusive, or 0x80
+        // to 0xFC, inclusive, set pointer to (lead 鈭� lead offset) 脳
+        // 188 + byte 鈭� offset.
+        if (inRange(bite, 0x40, 0x7E) || inRange(bite, 0x80, 0xFC))
+          pointer = (lead - lead_offset) * 188 + bite - offset;
+
+        // 4. If pointer is in the range 8836 to 10715, inclusive,
+        // return a code point whose value is 0xE000 鈭� 8836 + pointer.
+        if (inRange(pointer, 8836, 10715))
+          return 0xE000 - 8836 + pointer;
+
+        // 5. Let code point be null, if pointer is null, and the
+        // index code point for pointer in index jis0208 otherwise.
+        var code_point = (pointer === null) ? null :
+              indexCodePointFor(pointer, index('jis0208'));
+
+        // 6. If code point is null and byte is an ASCII byte, prepend
+        // byte to stream.
+        if (code_point === null && isASCIIByte(bite))
+          stream.prepend(bite);
+
+        // 7. If code point is null, return error.
+        if (code_point === null)
+          return decoderError(fatal);
+
+        // 8. Return a code point whose value is code point.
+        return code_point;
+      }
+
+      // 4. If byte is an ASCII byte or 0x80, return a code point
+      // whose value is byte.
+      if (isASCIIByte(bite) || bite === 0x80)
+        return bite;
+
+      // 5. If byte is in the range 0xA1 to 0xDF, inclusive, return a
+      // code point whose value is 0xFF61 鈭� 0xA1 + byte.
+      if (inRange(bite, 0xA1, 0xDF))
+        return 0xFF61 - 0xA1 + bite;
+
+      // 6. If byte is in the range 0x81 to 0x9F, inclusive, or 0xE0
+      // to 0xFC, inclusive, set Shift_JIS lead to byte and return
+      // continue.
+      if (inRange(bite, 0x81, 0x9F) || inRange(bite, 0xE0, 0xFC)) {
+        Shift_JIS_lead = bite;
+        return null;
+      }
+
+      // 7. Return error.
+      return decoderError(fatal);
+    };
+  }
+
+  // 13.3.2 Shift_JIS encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function ShiftJISEncoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point or U+0080, return a
+      // byte whose value is code point.
+      if (isASCIICodePoint(code_point) || code_point === 0x0080)
+        return code_point;
+
+      // 3. If code point is U+00A5, return byte 0x5C.
+      if (code_point === 0x00A5)
+        return 0x5C;
+
+      // 4. If code point is U+203E, return byte 0x7E.
+      if (code_point === 0x203E)
+        return 0x7E;
+
+      // 5. If code point is in the range U+FF61 to U+FF9F, inclusive,
+      // return a byte whose value is code point 鈭� 0xFF61 + 0xA1.
+      if (inRange(code_point, 0xFF61, 0xFF9F))
+        return code_point - 0xFF61 + 0xA1;
+
+      // 6. If code point is U+2212, set it to U+FF0D.
+      if (code_point === 0x2212)
+        code_point = 0xFF0D;
+
+      // 7. Let pointer be the index Shift_JIS pointer for code point.
+      var pointer = indexShiftJISPointerFor(code_point);
+
+      // 8. If pointer is null, return error with code point.
+      if (pointer === null)
+        return encoderError(code_point);
+
+      // 9. Let lead be floor(pointer / 188).
+      var lead = floor(pointer / 188);
+
+      // 10. Let lead offset be 0x81, if lead is less than 0x1F, and
+      // 0xC1 otherwise.
+      var lead_offset = (lead < 0x1F) ? 0x81 : 0xC1;
+
+      // 11. Let trail be pointer % 188.
+      var trail = pointer % 188;
+
+      // 12. Let offset be 0x40, if trail is less than 0x3F, and 0x41
+      // otherwise.
+      var offset = (trail < 0x3F) ? 0x40 : 0x41;
+
+      // 13. Return two bytes whose values are lead + lead offset and
+      // trail + offset.
+      return [lead + lead_offset, trail + offset];
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['Shift_JIS'] = function(options) {
+    return new ShiftJISEncoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['Shift_JIS'] = function(options) {
+    return new ShiftJISDecoder(options);
+  };
+
+  //
+  // 14. Legacy multi-byte Korean encodings
+  //
+
+  // 14.1 euc-kr
+
+  // 14.1.1 euc-kr decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function EUCKRDecoder(options) {
+    var fatal = options.fatal;
+
+    // euc-kr's decoder has an associated euc-kr lead (initially 0x00).
+    var /** @type {number} */ euckr_lead = 0x00;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and euc-kr lead is not 0x00, set
+      // euc-kr lead to 0x00 and return error.
+      if (bite === end_of_stream && euckr_lead !== 0) {
+        euckr_lead = 0x00;
+        return decoderError(fatal);
+      }
+
+      // 2. If byte is end-of-stream and euc-kr lead is 0x00, return
+      // finished.
+      if (bite === end_of_stream && euckr_lead === 0)
+        return finished;
+
+      // 3. If euc-kr lead is not 0x00, let lead be euc-kr lead, let
+      // pointer be null, set euc-kr lead to 0x00, and then run these
+      // substeps:
+      if (euckr_lead !== 0x00) {
+        var lead = euckr_lead;
+        var pointer = null;
+        euckr_lead = 0x00;
+
+        // 1. If byte is in the range 0x41 to 0xFE, inclusive, set
+        // pointer to (lead 鈭� 0x81) 脳 190 + (byte 鈭� 0x41).
+        if (inRange(bite, 0x41, 0xFE))
+          pointer = (lead - 0x81) * 190 + (bite - 0x41);
+
+        // 2. Let code point be null, if pointer is null, and the
+        // index code point for pointer in index euc-kr otherwise.
+        var code_point = (pointer === null)
+              ? null : indexCodePointFor(pointer, index('euc-kr'));
+
+        // 3. If code point is null and byte is an ASCII byte, prepend
+        // byte to stream.
+        if (pointer === null && isASCIIByte(bite))
+          stream.prepend(bite);
+
+        // 4. If code point is null, return error.
+        if (code_point === null)
+          return decoderError(fatal);
+
+        // 5. Return a code point whose value is code point.
+        return code_point;
+      }
+
+      // 4. If byte is an ASCII byte, return a code point whose value
+      // is byte.
+      if (isASCIIByte(bite))
+        return bite;
+
+      // 5. If byte is in the range 0x81 to 0xFE, inclusive, set
+      // euc-kr lead to byte and return continue.
+      if (inRange(bite, 0x81, 0xFE)) {
+        euckr_lead = bite;
+        return null;
+      }
+
+      // 6. Return error.
+      return decoderError(fatal);
+    };
+  }
+
+  // 14.1.2 euc-kr encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function EUCKREncoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. Let pointer be the index pointer for code point in index
+      // euc-kr.
+      var pointer = indexPointerFor(code_point, index('euc-kr'));
+
+      // 4. If pointer is null, return error with code point.
+      if (pointer === null)
+        return encoderError(code_point);
+
+      // 5. Let lead be floor(pointer / 190) + 0x81.
+      var lead = floor(pointer / 190) + 0x81;
+
+      // 6. Let trail be pointer % 190 + 0x41.
+      var trail = (pointer % 190) + 0x41;
+
+      // 7. Return two bytes whose values are lead and trail.
+      return [lead, trail];
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['EUC-KR'] = function(options) {
+    return new EUCKREncoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['EUC-KR'] = function(options) {
+    return new EUCKRDecoder(options);
+  };
+
+
+  //
+  // 15. Legacy miscellaneous encodings
+  //
+
+  // 15.1 replacement
+
+  // Not needed - API throws RangeError
+
+  // 15.2 Common infrastructure for utf-16be and utf-16le
+
+  /**
+   * @param {number} code_unit
+   * @param {boolean} utf16be
+   * @return {!Array.<number>} bytes
+   */
+  function convertCodeUnitToBytes(code_unit, utf16be) {
+    // 1. Let byte1 be code unit >> 8.
+    var byte1 = code_unit >> 8;
+
+    // 2. Let byte2 be code unit & 0x00FF.
+    var byte2 = code_unit & 0x00FF;
+
+    // 3. Then return the bytes in order:
+        // utf-16be flag is set: byte1, then byte2.
+    if (utf16be)
+      return [byte1, byte2];
+    // utf-16be flag is unset: byte2, then byte1.
+    return [byte2, byte1];
+  }
+
+  // 15.2.1 shared utf-16 decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {boolean} utf16_be True if big-endian, false if little-endian.
+   * @param {{fatal: boolean}} options
+   */
+  function UTF16Decoder(utf16_be, options) {
+    var fatal = options.fatal;
+    var /** @type {?number} */ utf16_lead_byte = null,
+        /** @type {?number} */ utf16_lead_surrogate = null;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream and either utf-16 lead byte or
+      // utf-16 lead surrogate is not null, set utf-16 lead byte and
+      // utf-16 lead surrogate to null, and return error.
+      if (bite === end_of_stream && (utf16_lead_byte !== null ||
+                                utf16_lead_surrogate !== null)) {
+        return decoderError(fatal);
+      }
+
+      // 2. If byte is end-of-stream and utf-16 lead byte and utf-16
+      // lead surrogate are null, return finished.
+      if (bite === end_of_stream && utf16_lead_byte === null &&
+          utf16_lead_surrogate === null) {
+        return finished;
+      }
+
+      // 3. If utf-16 lead byte is null, set utf-16 lead byte to byte
+      // and return continue.
+      if (utf16_lead_byte === null) {
+        utf16_lead_byte = bite;
+        return null;
+      }
+
+      // 4. Let code unit be the result of:
+      var code_unit;
+      if (utf16_be) {
+        // utf-16be decoder flag is set
+        //   (utf-16 lead byte << 8) + byte.
+        code_unit = (utf16_lead_byte << 8) + bite;
+      } else {
+        // utf-16be decoder flag is unset
+        //   (byte << 8) + utf-16 lead byte.
+        code_unit = (bite << 8) + utf16_lead_byte;
+      }
+      // Then set utf-16 lead byte to null.
+      utf16_lead_byte = null;
+
+      // 5. If utf-16 lead surrogate is not null, let lead surrogate
+      // be utf-16 lead surrogate, set utf-16 lead surrogate to null,
+      // and then run these substeps:
+      if (utf16_lead_surrogate !== null) {
+        var lead_surrogate = utf16_lead_surrogate;
+        utf16_lead_surrogate = null;
+
+        // 1. If code unit is in the range U+DC00 to U+DFFF,
+        // inclusive, return a code point whose value is 0x10000 +
+        // ((lead surrogate 鈭� 0xD800) << 10) + (code unit 鈭� 0xDC00).
+        if (inRange(code_unit, 0xDC00, 0xDFFF)) {
+          return 0x10000 + (lead_surrogate - 0xD800) * 0x400 +
+              (code_unit - 0xDC00);
+        }
+
+        // 2. Prepend the sequence resulting of converting code unit
+        // to bytes using utf-16be decoder flag to stream and return
+        // error.
+        stream.prepend(convertCodeUnitToBytes(code_unit, utf16_be));
+        return decoderError(fatal);
+      }
+
+      // 6. If code unit is in the range U+D800 to U+DBFF, inclusive,
+      // set utf-16 lead surrogate to code unit and return continue.
+      if (inRange(code_unit, 0xD800, 0xDBFF)) {
+        utf16_lead_surrogate = code_unit;
+        return null;
+      }
+
+      // 7. If code unit is in the range U+DC00 to U+DFFF, inclusive,
+      // return error.
+      if (inRange(code_unit, 0xDC00, 0xDFFF))
+        return decoderError(fatal);
+
+      // 8. Return code point code unit.
+      return code_unit;
+    };
+  }
+
+  // 15.2.2 shared utf-16 encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {boolean} utf16_be True if big-endian, false if little-endian.
+   * @param {{fatal: boolean}} options
+   */
+  function UTF16Encoder(utf16_be, options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1. If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is in the range U+0000 to U+FFFF, inclusive,
+      // return the sequence resulting of converting code point to
+      // bytes using utf-16be encoder flag.
+      if (inRange(code_point, 0x0000, 0xFFFF))
+        return convertCodeUnitToBytes(code_point, utf16_be);
+
+      // 3. Let lead be ((code point 鈭� 0x10000) >> 10) + 0xD800,
+      // converted to bytes using utf-16be encoder flag.
+      var lead = convertCodeUnitToBytes(
+        ((code_point - 0x10000) >> 10) + 0xD800, utf16_be);
+
+      // 4. Let trail be ((code point 鈭� 0x10000) & 0x3FF) + 0xDC00,
+      // converted to bytes using utf-16be encoder flag.
+      var trail = convertCodeUnitToBytes(
+        ((code_point - 0x10000) & 0x3FF) + 0xDC00, utf16_be);
+
+      // 5. Return a byte sequence of lead followed by trail.
+      return lead.concat(trail);
+    };
+  }
+
+  // 15.3 utf-16be
+  // 15.3.1 utf-16be decoder
+  /** @param {{fatal: boolean}} options */
+  encoders['UTF-16BE'] = function(options) {
+    return new UTF16Encoder(true, options);
+  };
+  // 15.3.2 utf-16be encoder
+  /** @param {{fatal: boolean}} options */
+  decoders['UTF-16BE'] = function(options) {
+    return new UTF16Decoder(true, options);
+  };
+
+  // 15.4 utf-16le
+  // 15.4.1 utf-16le decoder
+  /** @param {{fatal: boolean}} options */
+  encoders['UTF-16LE'] = function(options) {
+    return new UTF16Encoder(false, options);
+  };
+  // 15.4.2 utf-16le encoder
+  /** @param {{fatal: boolean}} options */
+  decoders['UTF-16LE'] = function(options) {
+    return new UTF16Decoder(false, options);
+  };
+
+  // 15.5 x-user-defined
+
+  // 15.5.1 x-user-defined decoder
+  /**
+   * @constructor
+   * @implements {Decoder}
+   * @param {{fatal: boolean}} options
+   */
+  function XUserDefinedDecoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream The stream of bytes being decoded.
+     * @param {number} bite The next byte read from the stream.
+     * @return {?(number|!Array.<number>)} The next code point(s)
+     *     decoded, or null if not enough data exists in the input
+     *     stream to decode a complete code point.
+     */
+    this.handler = function(stream, bite) {
+      // 1. If byte is end-of-stream, return finished.
+      if (bite === end_of_stream)
+        return finished;
+
+      // 2. If byte is an ASCII byte, return a code point whose value
+      // is byte.
+      if (isASCIIByte(bite))
+        return bite;
+
+      // 3. Return a code point whose value is 0xF780 + byte 鈭� 0x80.
+      return 0xF780 + bite - 0x80;
+    };
+  }
+
+  // 15.5.2 x-user-defined encoder
+  /**
+   * @constructor
+   * @implements {Encoder}
+   * @param {{fatal: boolean}} options
+   */
+  function XUserDefinedEncoder(options) {
+    var fatal = options.fatal;
+    /**
+     * @param {Stream} stream Input stream.
+     * @param {number} code_point Next code point read from the stream.
+     * @return {(number|!Array.<number>)} Byte(s) to emit.
+     */
+    this.handler = function(stream, code_point) {
+      // 1.If code point is end-of-stream, return finished.
+      if (code_point === end_of_stream)
+        return finished;
+
+      // 2. If code point is an ASCII code point, return a byte whose
+      // value is code point.
+      if (isASCIICodePoint(code_point))
+        return code_point;
+
+      // 3. If code point is in the range U+F780 to U+F7FF, inclusive,
+      // return a byte whose value is code point 鈭� 0xF780 + 0x80.
+      if (inRange(code_point, 0xF780, 0xF7FF))
+        return code_point - 0xF780 + 0x80;
+
+      // 4. Return error with code point.
+      return encoderError(code_point);
+    };
+  }
+
+  /** @param {{fatal: boolean}} options */
+  encoders['x-user-defined'] = function(options) {
+    return new XUserDefinedEncoder(options);
+  };
+  /** @param {{fatal: boolean}} options */
+  decoders['x-user-defined'] = function(options) {
+    return new XUserDefinedDecoder(options);
+  };
+
+  if (!global['TextEncoder'])
+    global['TextEncoder'] = TextEncoder;
+  if (!global['TextDecoder'])
+    global['TextDecoder'] = TextDecoder;
+
+  if (typeof module !== "undefined" && module.exports) {
+    module.exports = {
+      TextEncoder: global['TextEncoder'],
+      TextDecoder: global['TextDecoder'],
+      EncodingIndexes: global["encoding-indexes"]
+    };
+  }
+
+// For strict environments where `this` inside the global scope
+// is `undefined`, take a pure object instead
+}(this || {}));
\ No newline at end of file
diff --git a/util/ble/esc.js b/util/ble/esc.js
new file mode 100644
index 0000000..ce26aaa
--- /dev/null
+++ b/util/ble/esc.js
@@ -0,0 +1,355 @@
+var encode = require("./encoding.js")
+var app = getApp();
+var jpPrinter = {銆�銆�銆�銆�
+  createNew: function() {銆�銆�銆�銆�銆�銆�
+    var jpPrinter = {};
+    var data = [];
+
+    var bar = ["UPC-A", "UPC-E", "EAN13", "EAN8", "CODE39", "ITF", "CODABAR", "CODE93", "CODE128"];
+
+    jpPrinter.name = "钃濈墮鎵撳嵃鏈�";
+
+    jpPrinter.init = function() { //鍒濆鍖栨墦鍗版満
+      data.push(27)
+      data.push(64)
+    };
+
+    jpPrinter.setText = function(content) { //璁剧疆鏂囨湰鍐呭
+      var code = new encode.TextEncoder(
+        'gb18030', {
+          NONSTANDARD_allowLegacyEncoding: true
+        }).encode(content)
+      for (var i = 0; i < code.length; ++i) {
+        data.push(code[i])
+      }
+    }
+
+    jpPrinter.setFontSize=function(n){//璁剧疆瀛椾綋澶у皬
+      data.push(29)
+      data.push(33)
+      data.push(n)
+    }
+
+    jpPrinter.bold = function (n) {//鍔犵矖
+      data.push(27)
+      data.push(69)
+      data.push(n)
+    }
+
+    
+    jpPrinter.setUnderline=function(n){//璁剧疆涓嬪垝绾�
+      data.push(27)
+      data.push(45)
+      data.push(n)
+    }
+
+    jpPrinter.setUnderline2 = function (n) {//璁剧疆涓嬪垝绾�
+      data.push(28)
+      data.push(45)
+      data.push(n)
+    }
+
+    // jpPrinter.setBarcodeWidth = function(width) { //璁剧疆鏉$爜瀹藉害
+    //   data.push(29)
+    //   data.push(119)
+    //   if (width > 6) {
+    //     width = 6;
+    //   }
+    //   if (width < 2) {
+    //     width = 1;
+    //   }
+    //   data.push(width)
+    // }
+
+    // jpPrinter.setBarcodeHeight = function(height) { //璁剧疆鏉$爜楂樺害
+    //   data.push(29)
+    //   data.push(104)
+    //   data.push(height)
+    // }
+
+    // jpPrinter.setBarcodeContent = function(t,content) {
+    //   var ty = 73;
+    //   data.push(29)
+    //   data.push(107)
+    //   switch (t) {
+    //     case bar[0]:
+    //       ty = 65;
+    //       break;
+    //     case bar[1]:
+    //       ty = 66;
+    //       break;
+    //     case bar[2]:
+    //       ty = 67;
+    //       break;
+    //     case bar[3]:
+    //       ty = 68;
+    //       break;
+    //     case bar[4]:
+    //       ty = 69;
+    //       break;
+    //     case bar[5]:
+    //       ty = 70;
+    //       break;
+    //     case bar[6]:
+    //       ty = 71;
+    //       break;
+    //     case bar[7]:
+    //       ty = 72;
+    //       break;
+    //     case bar[8]:
+    //       ty = 73;
+    //       break;
+    //   }
+    //   data.push(ty)
+    // }
+
+    jpPrinter.setSelectSizeOfModuleForQRCode = function(n) { //璁剧疆浜岀淮鐮佸ぇ灏�
+      data.push(29)
+      data.push(40)
+      data.push(107)
+      data.push(3)
+      data.push(0)
+      data.push(49)
+      data.push(67)
+      if (n > 15) {
+        n = 15
+      }
+      if (n < 1) {
+        n = 1
+      }
+      data.push(n)
+    }
+
+    jpPrinter.setSelectErrorCorrectionLevelForQRCode = function(n) { //璁剧疆绾犻敊绛夌骇
+      /*
+      n      鍔熻兘      绾犻敊鑳藉姏
+      48 閫夋嫨绾犻敊绛夌骇 L 7
+      49 閫夋嫨绾犻敊绛夌骇 M 15
+      50 閫夋嫨绾犻敊绛夌骇 Q 25
+      51 閫夋嫨绾犻敊绛夌骇 H 30
+      */
+      data.push(29)
+      data.push(40)
+      data.push(107)
+      data.push(3)
+      data.push(0)
+      data.push(49)
+      data.push(69)
+      data.push(n)
+    }
+
+    jpPrinter.setStoreQRCodeData = function(content) { //璁剧疆浜岀淮鐮佸唴瀹�
+      var code = new encode.TextEncoder(
+        'gb18030', {
+          NONSTANDARD_allowLegacyEncoding: true
+        }).encode(content)
+      data.push(29)
+      data.push(40)
+      data.push(107)
+      data.push(parseInt((code.length + 3) % 256))
+      data.push(parseInt((code.length + 3) / 256))
+      data.push(49)
+      data.push(80)
+      data.push(48)
+
+      for (var i = 0; i < code.length; ++i) {
+        data.push(code[i])
+      }
+    }
+
+    jpPrinter.setPrintQRCode = function() { //鎵撳嵃浜岀淮鐮�
+      data.push(29)
+      data.push(40)
+      data.push(107)
+      data.push(3)
+      data.push(0)
+      data.push(49)
+      data.push(81)
+      data.push(48)
+    }
+
+    jpPrinter.setHorTab = function() { //绉诲姩鎵撳嵃浣嶇疆鍒颁笅涓�涓按骞冲畾浣嶇偣鐨勪綅缃�
+      data.push(9)
+    }
+
+    jpPrinter.setAbsolutePrintPosition = function(where) { //璁剧疆缁濆鎵撳嵃浣嶇疆
+      data.push(27)
+      data.push(36)
+      data.push(parseInt(where % 256))
+      data.push(parseInt(where / 256))
+    }
+
+    jpPrinter.setRelativePrintPositon = function(where) { //璁剧疆鐩稿妯悜鎵撳嵃浣嶇疆
+      data.push(27)
+      data.push(92)
+      data.push(parseInt(where % 256))
+      data.push(parseInt(where / 256))
+    }
+
+    jpPrinter.setSelectJustification = function(which) { //瀵归綈鏂瑰紡
+      /*
+      0, 48 宸﹀榻�
+      1, 49 涓棿瀵归綈
+      2, 50 鍙冲榻�
+      */
+      data.push(27)
+      data.push(97)
+      data.push(which)
+    }
+
+    jpPrinter.space = function (n) { //璁剧疆妯悜璺虫牸浣嶇疆
+      data.push(27)
+      data.push(68)
+      data.push(n)
+    }
+
+
+    jpPrinter.setLeftMargin = function(n) { //璁剧疆宸﹁竟璺�
+      data.push(29)
+      data.push(76)
+      data.push(parseInt(n % 256))
+      data.push(parseInt(n / 256))
+    }
+
+    jpPrinter.textMarginRight = function (n) { //璁剧疆瀛楃鍙抽棿璺�
+      data.push(27)
+      data.push(32)
+      data.push(n)
+    }
+
+    jpPrinter.rowSpace = function (n) { //璁剧疆琛岄棿璺�
+      data.push(27)
+      data.push(51)
+      data.push(n)
+    }
+
+    jpPrinter.setPrintingAreaWidth = function(width) { //璁剧疆鎵撳嵃鍖哄煙瀹藉害
+      data.push(29)
+      data.push(87)
+      data.push(parseInt(width % 256))
+      data.push(parseInt(width / 256))
+    }
+
+    jpPrinter.setSound = function(n, t) { //璁剧疆铚傞福鍣�
+      data.push(27)
+      data.push(66)
+      if (n < 0) {
+        n = 1;
+      } else if (n > 9) {
+        n = 9;
+      }
+
+      if (t < 0) {
+        t = 1;
+      } else if (t > 9) {
+        t = 9;
+      }
+      data.push(n)
+      data.push(t)
+    }
+
+    jpPrinter.setBitmap = function(res) { //鍙傛暟锛岀敾甯冪殑鍙傛暟
+      console.log(res)
+      var width = parseInt((res.width + 7) / 8 * 8 / 8)
+      var height = res.height;
+      var time = 1;
+      var temp = res.data.length - width * 32;
+      var point_list = []
+      console.log(width + "--" + height)
+      data.push(29)
+      data.push(118)
+      data.push(48)
+      data.push(0)
+      data.push((parseInt((res.width + 7) / 8) * 8) / 8)
+      data.push(0)
+      data.push(parseInt(res.height % 256))
+      data.push(parseInt(res.height / 256))
+      console.log(res.data.length)
+      console.log("temp=" + temp)
+      for (var i = 0; i < height; ++i) {
+        for (var j = 0; j < width; ++j) {
+          for (var k = 0; k < 32; k += 4) {
+            var po = {}
+            if (res.data[temp] == 0 && res.data[temp + 1] == 0 && res.data[temp + 2] == 0 && res.data[temp + 3] == 0) {
+              po.point = 0;
+            } else {
+              po.point = 1;
+            }
+            point_list.push(po)
+            temp += 4
+          }
+        }
+        time++
+        temp = res.data.length - width * 32 * time
+      }
+      for (var i = 0; i < point_list.length; i += 8) {
+        var p = point_list[i].point * 128 + point_list[i + 1].point * 64 + point_list[i + 2].point * 32 + point_list[i + 3].point * 16 + point_list[i + 4].point * 8 + point_list[i + 5].point * 4 + point_list[i + 6].point * 2 + point_list[i + 7].point
+        data.push(p)
+      }
+    }
+
+    jpPrinter.setPrint = function() { //鎵撳嵃骞舵崲琛�
+      data.push(10)
+    }
+
+    jpPrinter.setPrintAndFeed = function(feed) { //鎵撳嵃骞惰蛋绾竑eed涓崟浣�
+      data.push(27)
+      data.push(74)
+      data.push(feed)
+    }
+
+    jpPrinter.setPrintAndFeedRow = function(row) { //鎵撳嵃骞惰蛋绾竢ow琛�
+      data.push(27)
+      data.push(100)
+      data.push(row)
+    }
+
+    jpPrinter.getData = function() { //鑾峰彇鎵撳嵃鏁版嵁
+      return data;
+    };
+
+    銆�銆�
+    return jpPrinter;銆�
+  },
+
+  Query: function() {
+    var queryStatus = {};
+    var buf;
+    var dateView;
+    queryStatus.getRealtimeStatusTransmission = function(n) { //鏌ヨ鎵撳嵃鏈哄疄鏃剁姸鎬�
+      /*
+      n = 1锛氫紶閫佹墦鍗版満鐘舵��
+      n = 2锛氫紶閫佽劚鏈虹姸鎬�
+      n = 3锛氫紶閫侀敊璇姸鎬�
+      n = 4锛氫紶閫佺焊浼犳劅鍣ㄧ姸鎬�
+      */
+      buf = new ArrayBuffer(3)
+      dateView = new DataView(buf)
+      dateView.setUint8(0, 16)
+      dateView.setUint8(1, 4)
+      dateView.setUint8(2, n)
+      queryStatus.query(buf)
+    }
+
+    queryStatus.query = function(buf) {
+      wx.writeBLECharacteristicValue({
+        deviceId: app.BLEInformation.deviceId,
+        serviceId: app.BLEInformation.writeServiceId,
+        characteristicId: app.BLEInformation.writeCharaterId,
+        value: buf,
+        success: function(res) {
+
+        },
+        complete: function(res) {
+          console.log(res)
+          buf = null
+          dateView = null;
+        }
+      })
+    }
+    return queryStatus;
+  }
+
+};
+
+module.exports.jpPrinter = jpPrinter;
\ No newline at end of file
diff --git a/util/ble/tsc.js b/util/ble/tsc.js
new file mode 100644
index 0000000..eea3e67
--- /dev/null
+++ b/util/ble/tsc.js
@@ -0,0 +1,237 @@
+var app = getApp();
+var encode = require("./encoding.js");
+var jpPrinter = {銆�銆�銆�銆�
+  createNew: function() {銆�銆�銆�銆�銆�銆�
+    var jpPrinter = {};
+    var data = "";
+    var command = []
+
+    jpPrinter.name = "钃濈墮鎵撳嵃鏈�";
+
+    jpPrinter.init = function() {};
+
+    jpPrinter.addCommand = function(content) { //灏嗘寚浠よ浆鎴愭暟缁勮璧�
+      var code = new encode.TextEncoder(
+        'gb18030', {
+          NONSTANDARD_allowLegacyEncoding: true
+        }).encode(content)
+      for (var i = 0; i < code.length; ++i) {
+        command.push(code[i])
+      }
+    }
+
+    jpPrinter.setSize = function(pageWidght, pageHeight) { //璁剧疆椤甸潰澶у皬
+      data = "SIZE " + pageWidght.toString() + " mm" + "," + pageHeight.toString() + " mm" + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setSpeed = function(printSpeed) { //璁剧疆鎵撳嵃鏈洪�熷害
+      data = "SPEED " + printSpeed.toString() + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setDensity = function(printDensity) { //璁剧疆鎵撳嵃鏈烘祿搴�
+      data = "DENSITY " + printDensity.toString() + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setGap = function(printGap) { //浼犳劅鍣�
+      data = "GAP " + printGap.toString() + " mm,0 mm\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setBline = function(printBline) { //榛戞爣绾�
+      data = "BLINE " + printBline.toString() + " mm,0 mm\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setCountry = function(country) { //閫夋嫨鍥介檯瀛楃闆�
+      /*
+      001:USA
+      002:French
+      003:Latin America
+      034:Spanish
+      039:Italian
+      044:United Kingdom
+      046:Swedish
+      047:Norwegian
+      049:German
+       */
+      data = "COUNTRY " + country + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setCodepage = function(codepage) { //閫夋嫨鍥介檯浠g爜椤�
+      /*
+      8-bit codepage 瀛楃闆嗕唬琛�
+      437:United States
+      850:Multilingual
+      852:Slavic
+      860:Portuguese
+      863:Canadian/French
+      865:Nordic
+      Windows code page
+      1250:Central Europe
+      1252:Latin I
+      1253:Greek
+      1254:Turkish
+      浠ヤ笅浠g爜椤典粎闄愪簬 12脳24 dot 鑻辨暟瀛椾綋
+      WestEurope:WestEurope
+      Greek:Greek
+      Hebrew:Hebrew
+      EastEurope:EastEurope
+      Iran:Iran
+      IranII:IranII
+      Latvian:Latvian
+      Arabic:Arabic
+      Vietnam:Vietnam
+      Uygur:Uygur
+      Thai:Thai
+      1252:Latin I
+      1257:WPC1257
+      1251:WPC1251
+      866:Cyrillic
+      858:PC858
+      747:PC747
+      864:PC864
+      1001:PC100
+      */
+      data = "CODEPAGE " + codepage + "\r\n";
+      jpPrinter.addCommand(data)
+    }
+
+    jpPrinter.setCls = function() { //娓呴櫎鎵撳嵃鏈虹紦瀛�
+      data = "CLS\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setFeed = function(feed) { //灏嗙焊鍚戝墠鎺ㄥ嚭n
+      data = "FEED " + feed + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setBackFeed = function(backup) { //灏嗙焊鍚戝悗鍥炴媺n
+      data = "BACKFEED " + backup + "\r\n";
+      jpPrinter.addCommand(data)
+    }
+
+    jpPrinter.setDirection = function(direction) { //璁剧疆鎵撳嵃鏂瑰悜锛屽弬鑰冪紪绋嬫墜鍐�  
+      data = "DIRECTION " + direction + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setReference = function(x, y) { //璁剧疆鍧愭爣鍘熺偣锛屼笌鎵撳嵃鏂瑰悜鏈夊叧
+      data = "REFERENCE " + x + "," + y + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setFromfeed = function() { //鏍规嵁Size杩涗竴寮犳爣绛剧焊
+      data = "FORMFEED\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setHome = function() { //鏍规嵁Size鎵惧埌涓嬩竴寮犳爣绛剧焊鐨勪綅缃�
+      data = "HOME\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setSound = function(level, interval) { //鎺у埗铚傞福鍣�
+      data = "SOUND " + level + "," + interval + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setLimitfeed = function(limit) { // 妫�娴嬪瀭鐩撮棿璺�
+      data = "LIMITFEED " + limit + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setBar = function(x, y, width, height) { //缁樺埗绾挎潯
+      data = "BAR " + x + "," + y + "," + width + "," + height + "\r\n"
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setBox = function(x_start, y_start, x_end, y_end, thickness) { //缁樺埗鏂规
+      data = "BOX " + x_start + "," + y_start + "," + x_end + "," + y_end + "," + thickness + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setErase = function(x_start, y_start, x_width, y_height) { //娓呴櫎鎸囧畾鍖哄煙鐨勬暟鎹�
+      data = "ERASE " + x_start + "," + y_start + "," + x_width + "," + y_height + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setReverse = function(x_start, y_start, x_width, y_height) { //灏嗘寚瀹氱殑鍖哄煙鍙嶇浉鎵撳嵃
+      data = "REVERSE " + x_start + "," + y_start + "," + x_width + "," + y_height + "\r\n";
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setText = function(x, y, font, x_, y_, str) { //鎵撳嵃鏂囧瓧
+      data = "TEXT " + x + "," + y + ",\"" + font + "\"," + 0 + "," + x_ + "," + y_ + "," + "\"" + str + "\"\r\n"
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setQR = function(x, y, level, width, mode, content) { //鎵撳嵃浜岀淮鐮�
+      data = "QRCODE " + x + "," + y + "," + level + "," + width + "," + mode + "," + 0 + ",\"" + content + "\"\r\n"
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setBarCode = function(x, y, codetype, height, readable, narrow, wide, content) { //鎵撳嵃鏉″舰鐮�
+      data = "BARCODE " + x + "," + y + ",\"" + codetype + "\"," + height + "," + readable + "," + 0 + "," + narrow + "," + wide + ",\"" + content + "\"\r\n"
+      jpPrinter.addCommand(data)
+    };
+
+    jpPrinter.setBitmap = function(x, y, mode, res) { //娣诲姞鍥剧墖锛宺es涓虹敾甯冨弬鏁�
+      console.log(res)
+      var width = parseInt((res.width + 7) / 8 * 8 / 8)
+      var height = res.height;
+      var time = 1;
+      var temp = res.data.length - width * 32;
+      var pointList = []
+      var inverted_Data = []
+      var correct_Data = []
+      console.log(width + "--" + height)
+      data = "BITMAP " + x + "," + y + "," + width + "," + height + "," + mode + ","
+      jpPrinter.addCommand(data)
+      for (var i = 0; i < height; ++i) {
+        console.log(temp)
+        for (var j = 0; j < width; ++j) {
+          for (var k = 0; k < 32; k += 4) {
+            if (res.data[temp] == 0 && res.data[temp + 1] == 0 && res.data[temp + 2] == 0 && res.data[temp + 3] == 0) {
+              pointList.push(1)
+            } else {
+              pointList.push(0)
+            }
+            temp += 4
+          }
+        }
+        time++
+        temp = res.data.length - width * 32 * time
+      }
+      for (var i = 0; i < pointList.length; i += 8) {
+        var p = pointList[i] * 128 + pointList[i + 1] * 64 + pointList[i + 2] * 32 + pointList[i + 3] * 16 + pointList[i + 4] * 8 + pointList[i + 5] * 4 + pointList[i + 6] * 2 + pointList[i + 7]
+        inverted_Data.push(p)
+        correct_Data.push(p)
+      }
+      for (var i = height; i > 0; i--) {
+        for (var j = 0; j < width; ++j) {
+          correct_Data[(height - i - 1) * width + j] = inverted_Data[i * width + j]
+        }
+      }
+      for (var i = 0; i < correct_Data.length; ++i) {
+        command.push(correct_Data[i])
+      }
+    }
+
+    jpPrinter.setPagePrint = function() { //鎵撳嵃椤甸潰
+      data = "PRINT 1,1\r\n"
+      jpPrinter.addCommand(data)
+    };
+    //鑾峰彇鎵撳嵃鏁版嵁
+    jpPrinter.getData = function() {
+      return command;
+    };銆�銆�
+    return jpPrinter;銆�
+  }
+};
+
+module.exports.jpPrinter = jpPrinter;
\ No newline at end of file
diff --git a/util/ble/util.js b/util/ble/util.js
new file mode 100644
index 0000000..dbadbb8
--- /dev/null
+++ b/util/ble/util.js
@@ -0,0 +1,19 @@
+const formatTime = date => {
+  const year = date.getFullYear()
+  const month = date.getMonth() + 1
+  const day = date.getDate()
+  const hour = date.getHours()
+  const minute = date.getMinutes()
+  const second = date.getSeconds()
+
+  return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+}
+
+const formatNumber = n => {
+  n = n.toString()
+  return n[1] ? n : '0' + n
+}
+
+module.exports = {
+  formatTime: formatTime
+}
diff --git a/utils/date.js b/utils/date.js
new file mode 100644
index 0000000..16ffed7
--- /dev/null
+++ b/utils/date.js
@@ -0,0 +1,86 @@
+export const calcDate = (date1, date2) => {
+  var date3 = date2 - date1
+
+  var days = Math.floor(date3 / (24 * 3600 * 1000))
+
+  var leave1 = date3 % (24 * 3600 * 1000) // 璁$畻澶╂暟鍚庡墿浣欑殑姣鏁�
+  var hours = Math.floor(leave1 / (3600 * 1000))
+
+  var leave2 = leave1 % (3600 * 1000) // 璁$畻灏忔椂鏁板悗鍓╀綑鐨勬绉掓暟
+  var minutes = Math.floor(leave2 / (60 * 1000))
+
+  var leave3 = leave2 % (60 * 1000) // 璁$畻鍒嗛挓鏁板悗鍓╀綑鐨勬绉掓暟
+  var seconds = Math.round(date3 / 1000)
+  return {
+    leave1,
+    leave2,
+    leave3,
+    days: days,
+    hours: hours,
+    minutes: minutes,
+    seconds: seconds
+  }
+}
+
+/**
+ * 鏃ユ湡鏍煎紡鍖�
+ */
+export function dateFormat(date, format = 'yyyy-MM-dd hh:mm:ss') {
+  if (date !== 'Invalid Date') {
+    var o = {
+      'M+': date.getMonth() + 1, // month
+      'd+': date.getDate(), // day
+      'h+': date.getHours(), // hour
+      'm+': date.getMinutes(), // minute
+      's+': date.getSeconds(), // second
+      'q+': Math.floor((date.getMonth() + 3) / 3), // quarter
+      S: date.getMilliseconds() // millisecond
+    }
+    if (/(y+)/.test(format)) {
+      format = format.replace(
+        RegExp.$1,
+        (date.getFullYear() + '').substr(4 - RegExp.$1.length)
+      )
+    }
+    for (var k in o) {
+      if (new RegExp('(' + k + ')').test(format)) {
+        format = format.replace(
+          RegExp.$1,
+          RegExp.$1.length === 1
+            ? o[k]
+            : ('00' + o[k]).substr(('' + o[k]).length)
+        )
+      }
+    }
+    return format
+  }
+  return ''
+}
+
+/**
+ * 鏃ユ湡鏍煎紡鍖栵紝杞勾鏈堟棩yyyy-MM-dd
+ */
+export function dateFormatYearMonthDate(date) {
+  const dateList = /\d{4}-\d{1,2}-\d{1,2}/g.exec(date)
+  if (dateList && dateList.length > 0) {
+    return dateList[0]
+  } else {
+    return date
+  }
+}
+
+/**
+ * 鑾峰彇骞存湀
+ */
+export function getYearAndMonth() {
+  const date = new Date()
+  let year = date.getFullYear()
+  let month = date.getMonth() + 1
+  if (month < 10) {
+    month = '0' + month
+  } else {
+    month = month + ''
+  }
+  year = (year + '').substring(2, 4)
+  return year + month
+}
diff --git a/utils/index.js b/utils/index.js
new file mode 100644
index 0000000..2c386eb
--- /dev/null
+++ b/utils/index.js
@@ -0,0 +1,30 @@
+import * as CryptoJS from "crypto-js";
+
+/**
+ *鍔犲瘑澶勭悊
+ */
+export const encryption = params => {
+    let { data, type, param, key } = params;
+    const result = JSON.parse(JSON.stringify(data));
+    if (type === "Base64") {
+        param.forEach(ele => {
+            result[ele] = btoa(result[ele]);
+        });
+    } else {
+        param.forEach(ele => {
+            var data = result[ele];
+            key = CryptoJS.enc.Latin1.parse(key);
+            var iv = key;
+            // 鍔犲瘑
+            var encrypted = CryptoJS.AES.encrypt(data, key, {
+                iv: iv,
+                mode: CryptoJS.mode.CBC,
+                padding: CryptoJS.pad.ZeroPadding
+            });
+            result[ele] = encrypted.toString();
+			
+        });
+		
+    }
+    return result;
+};
diff --git a/uview-ui/LICENSE b/uview-ui/LICENSE
new file mode 100644
index 0000000..8e39ead
--- /dev/null
+++ b/uview-ui/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 www.uviewui.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/uview-ui/README.md b/uview-ui/README.md
new file mode 100644
index 0000000..06d5676
--- /dev/null
+++ b/uview-ui/README.md
@@ -0,0 +1,106 @@
+<p align="center">
+    <img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
+</p>
+<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView</h3>
+<h3 align="center">澶氬钩鍙板揩閫熷紑鍙戠殑UI妗嗘灦</h3>
+
+
+## 璇存槑
+
+uView UI锛屾槸[uni-app](https://uniapp.dcloud.io/)鐢熸�佷紭绉�鐨刄I妗嗘灦锛屽叏闈㈢殑缁勪欢鍜屼究鎹风殑宸ュ叿浼氳鎮ㄤ俊鎵嬫媹鏉ワ紝濡傞奔寰楁按
+
+## 鐗规��
+
+- 鍏煎瀹夊崜锛宨OS锛屽井淇″皬绋嬪簭锛孒5锛孮Q灏忕▼搴忥紝鐧惧害灏忕▼搴忥紝鏀粯瀹濆皬绋嬪簭锛屽ご鏉″皬绋嬪簭
+- 60+绮鹃�夌粍浠讹紝鍔熻兘涓板瘜锛屽绔吋瀹癸紝璁╂偍蹇�熼泦鎴愶紝寮�绠卞嵆鐢�
+- 浼楀璐村績鐨凧S鍒╁櫒锛岃鎮ㄩ闀栧湪鎵嬶紝鍙箣鍗虫潵锛岀櫨姝ョ┛鏉�
+- 浼楀鐨勫父鐢ㄩ〉闈㈠拰甯冨眬锛岃鎮ㄤ笓娉ㄩ�昏緫锛屼簨鍗婂姛鍊�
+- 璇﹀敖鐨勬枃妗f敮鎸侊紝鐜颁唬鍖栫殑婕旂ず鏁堟灉
+- 鎸夐渶寮曞叆锛岀簿绠�鎵撳寘浣撶Н
+
+
+## 瀹夎
+
+```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 */
+<style lang="scss">
+@import "uview-ui/index.scss";
+</style>
+```
+
+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
+<template>
+	<u-button>鎸夐挳</u-button>
+</template>
+```
+
+璇烽�氳繃[蹇�熶笂鎵媇(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)
+
+## 棰勮
+
+鎮ㄥ彲浠ラ�氳繃**寰俊**鎵爜锛屾煡鐪嬫渶浣崇殑婕旂ず鏁堟灉銆�
+<br>
+<br>
+<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
+
+<!-- ## 鎹愯禒uView鐨勭爺鍙�
+
+uView鏂囨。鍜屾簮鐮佸叏閮ㄥ紑婧愬厤璐癸紝濡傛灉鎮ㄨ涓簎View甯埌浜嗘偍鐨勫紑鍙戝伐浣滐紝鎮ㄥ彲浠ユ崘璧爑View鐨勭爺鍙戝伐浣滐紝鎹愯禒鏃犻棬妲涳紝鍝�曟槸涓�鏉彲涔愪篃濂�(鐩镐俊杩欐瘮鎵撹祻涓绘挱鏇存湁鎰忎箟)銆�
+
+<img src="https://uviewui.com/common/wechat.png" width="220" >
+<img style="margin-left: 100px;" src="https://uviewui.com/common/alipay.png" width="220" >
+ -->
+## 鐗堟潈淇℃伅
+uView閬靛惊[MIT](https://en.wikipedia.org/wiki/MIT_License)寮�婧愬崗璁紝鎰忓懗鐫�鎮ㄦ棤闇�鏀粯浠讳綍璐圭敤锛屼篃鏃犻渶鎺堟潈锛屽嵆鍙皢uView搴旂敤鍒版偍鐨勪骇鍝佷腑銆�
diff --git a/uview-ui/components/u-action-sheet/u-action-sheet.vue b/uview-ui/components/u-action-sheet/u-action-sheet.vue
new file mode 100644
index 0000000..722b668
--- /dev/null
+++ b/uview-ui/components/u-action-sheet/u-action-sheet.vue
@@ -0,0 +1,190 @@
+<template>
+	<u-popup mode="bottom" :border-radius="borderRadius" :popup="false" v-model="value" :maskCloseAble="maskCloseAble"
+	    length="auto" :safeAreaInsetBottom="safeAreaInsetBottom" @close="popupClose" :z-index="uZIndex">
+		<view class="u-tips u-border-bottom" v-if="tips.text" :style="[tipsStyle]">
+			{{tips.text}}
+		</view>
+		<block v-for="(item, index) in list" :key="index">
+			<view 
+				@touchmove.stop.prevent 
+				@tap="itemClick(index)" 
+				:style="[itemStyle(index)]" 
+				class="u-action-sheet-item u-line-1" 
+				:class="[index < list.length - 1 ? 'u-border-bottom' : '']"
+				:hover-stay-time="150"
+			>
+				<text>{{item.text}}</text>
+				<text class="u-action-sheet-item__subtext u-line-1" v-if="item.subText">{{item.subText}}</text>
+			</view>
+		</block>
+		<view class="u-gab" v-if="cancelBtn">
+		</view>
+		<view @touchmove.stop.prevent class="u-actionsheet-cancel u-action-sheet-item" hover-class="u-hover-class"
+		    :hover-stay-time="150" v-if="cancelBtn" @tap="close">{{cancelText}}</view>
+	</u-popup>
+</template>
+
+<script>
+	/**
+	 * actionSheet 鎿嶄綔鑿滃崟
+	 * @description 鏈粍浠剁敤浜庝粠搴曢儴寮瑰嚭涓�涓搷浣滆彍鍗曪紝渚涚敤鎴烽�夋嫨骞惰繑鍥炵粨鏋溿�傛湰缁勪欢鍔熻兘绫讳技浜巙ni鐨剈ni.showActionSheetAPI锛岄厤缃洿鍔犵伒娲伙紝鎵�鏈夊钩鍙伴兘琛ㄧ幇涓�鑷淬��
+	 * @tutorial https://www.uviewui.com/components/actionSheet.html
+	 * @property {Array<Object>} list 鎸夐挳鐨勬枃瀛楁暟缁勶紝瑙佸畼鏂规枃妗gず渚�
+	 * @property {Object} tips 椤堕儴鐨勬彁绀烘枃瀛楋紝瑙佸畼鏂规枃妗gず渚�
+	 * @property {String} cancel-text 鍙栨秷鎸夐挳鐨勬彁绀烘枃瀛�
+	 * @property {Boolean} cancel-btn 鏄惁鏄剧ず搴曢儴鐨勫彇娑堟寜閽紙榛樿true锛�
+	 * @property {Number String} border-radius 寮瑰嚭閮ㄥ垎椤堕儴宸﹀彸鐨勫渾瑙掑�硷紝鍗曚綅rpx锛堥粯璁�0锛�
+	 * @property {Boolean} mask-close-able 鐐瑰嚮閬僵鏄惁鍙互鍏抽棴锛堥粯璁rue锛�
+	 * @property {Boolean} safe-area-inset-bottom 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛堥粯璁alse锛�
+	 * @property {Number String} z-index z-index鍊硷紙榛樿1075锛�
+	 * @property {String} cancel-text 鍙栨秷鎸夐挳鐨勬彁绀烘枃瀛�
+	 * @event {Function} click 鐐瑰嚮ActionSheet鍒楄〃椤规椂瑙﹀彂
+	 * @event {Function} close 鐐瑰嚮鍙栨秷鎸夐挳鏃惰Е鍙�
+	 * @example <u-action-sheet :list="list" @click="click" v-model="show"></u-action-sheet>
+	 */
+	export default {
+		name: "u-action-sheet",
+		props: {
+			// 鐐瑰嚮閬僵鏄惁鍙互鍏抽棴actionsheet
+			maskCloseAble: {
+				type: Boolean,
+				default: true
+			},
+			// 鎸夐挳鐨勬枃瀛楁暟缁勶紝鍙互鑷畾涔夐鑹插拰瀛椾綋澶у皬锛屽瓧浣撳崟浣嶄负rpx
+			list: {
+				type: Array,
+				default () {
+					// 濡備笅
+					// return [{
+					// 	text: '纭畾',
+					// 	color: '',
+					// 	fontSize: ''
+					// }]
+					return [];
+				}
+			},
+			// 椤堕儴鐨勬彁绀烘枃瀛�
+			tips: {
+				type: Object,
+				default () {
+					return {
+						text: '',
+						color: '',
+						fontSize: '26'
+					}
+				}
+			},
+			// 搴曢儴鐨勫彇娑堟寜閽�
+			cancelBtn: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛屽紑鍚殑璇濓紝浼氬湪iPhoneX鏈哄瀷搴曢儴娣诲姞涓�瀹氱殑鍐呰竟璺�
+			safeAreaInsetBottom: {
+				type: Boolean,
+				default: false
+			},
+			// 閫氳繃鍙屽悜缁戝畾鎺у埗缁勪欢鐨勫脊鍑轰笌鏀惰捣
+			value: {
+				type: Boolean,
+				default: false
+			},
+			// 寮瑰嚭鐨勯《閮ㄥ渾瑙掑��
+			borderRadius: {
+				type: [String, Number],
+				default: 0
+			},
+			// 寮瑰嚭鐨剒-index鍊�
+			zIndex: {
+				type: [String, Number],
+				default: 0
+			},
+			// 鍙栨秷鎸夐挳鐨勬枃瀛楁彁绀�
+			cancelText: {
+				type: String,
+				default: '鍙栨秷'
+			}
+		},
+		computed: {
+			// 椤堕儴鎻愮ず鐨勬牱寮�
+			tipsStyle() {
+				let style = {};
+				if (this.tips.color) style.color = this.tips.color;
+				if (this.tips.fontSize) style.fontSize = this.tips.fontSize + 'rpx';
+				return style;
+			},
+			// 鎿嶄綔椤圭洰鐨勬牱寮�
+			itemStyle() {
+				return (index) => {
+					let style = {};
+					if (this.list[index].color) style.color = this.list[index].color;
+					if (this.list[index].fontSize) style.fontSize = this.list[index].fontSize + 'rpx';
+					// 閫夐」琚鐢ㄧ殑鏍峰紡
+					if (this.list[index].disabled) style.color = '#c0c4cc';
+					return style;
+				}
+			},
+			uZIndex() {
+				// 濡傛灉鐢ㄦ埛鏈変紶閫抸-index鍊硷紝浼樺厛浣跨敤
+				return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+			}
+		},
+		methods: {
+			// 鐐瑰嚮鍙栨秷鎸夐挳
+			close() {
+				// 鍙戦�乮nput浜嬩欢锛屽苟涓嶄細浣滅敤浜庣埗缁勪欢锛岃�屾槸瑕佽缃粍浠跺唴閮ㄩ�氳繃props浼犻�掔殑value鍙傛暟
+				// 杩欐槸涓�涓獀ue鍙戦�佷簨浠剁殑鐗规畩鐢ㄦ硶
+				this.popupClose();
+				this.$emit('close');
+			},
+			// 寮圭獥鍏抽棴
+			popupClose() {
+				this.$emit('input', false);
+			},
+			// 鐐瑰嚮鏌愪竴涓猧tem
+			itemClick(index) {
+				// disabled鐨勯」绂佹鐐瑰嚮
+				if(this.list[index].disabled) return;
+				this.$emit('click', index);
+				this.$emit('input', false);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-tips {
+		font-size: 26rpx;
+		text-align: center;
+		padding: 34rpx 0;
+		line-height: 1;
+		color: $u-tips-color;
+	}
+
+	.u-action-sheet-item {
+		@include vue-flex;;
+		line-height: 1;
+		justify-content: center;
+		align-items: center;
+		font-size: 32rpx;
+		padding: 34rpx 0;
+		flex-direction: column;
+	}
+	
+	.u-action-sheet-item__subtext {
+		font-size: 24rpx;
+		color: $u-tips-color;
+		margin-top: 20rpx;
+	}
+
+	.u-gab {
+		height: 12rpx;
+		background-color: rgb(234, 234, 236);
+	}
+
+	.u-actionsheet-cancel {
+		color: $u-main-color;
+	}
+</style>
diff --git a/uview-ui/components/u-alert-tips/u-alert-tips.vue b/uview-ui/components/u-alert-tips/u-alert-tips.vue
new file mode 100644
index 0000000..e81fc37
--- /dev/null
+++ b/uview-ui/components/u-alert-tips/u-alert-tips.vue
@@ -0,0 +1,256 @@
+<template>
+	<view class="u-alert-tips" v-if="show" :class="[
+		!show ? 'u-close-alert-tips': '',
+		type ? 'u-alert-tips--bg--' + type + '-light' : '',
+		type ? 'u-alert-tips--border--' + type + '-disabled' : '',
+	]" :style="{
+		backgroundColor: bgColor,
+		borderColor: borderColor
+	}">
+		<view class="u-icon-wrap">
+			<u-icon v-if="showIcon" :name="uIcon" :size="description ? 40 : 32" class="u-icon" :color="uIconType" :custom-style="iconStyle"></u-icon>
+		</view>
+		<view class="u-alert-content" @tap.stop="click">
+			<view class="u-alert-title" :style="[uTitleStyle]">
+				{{title}}
+			</view>
+			<view v-if="description" class="u-alert-desc" :style="[descStyle]">
+				{{description}}
+			</view>
+		</view>
+		<view class="u-icon-wrap">
+			<u-icon @click="close" v-if="closeAble && !closeText" hoverClass="u-type-error-hover-color" name="close" color="#c0c4cc"
+			 :size="22" class="u-close-icon" :style="{
+				top: description ? '18rpx' : '24rpx'
+			}"></u-icon>
+		</view>
+		<text v-if="closeAble && closeText" class="u-close-text" :style="{
+			top: description ? '18rpx' : '24rpx'
+		}">{{closeText}}</text>
+	</view>
+</template>
+
+<script>
+	/**
+	 * alertTips 璀﹀憡鎻愮ず
+	 * @description 璀﹀憡鎻愮ず锛屽睍鐜伴渶瑕佸叧娉ㄧ殑淇℃伅
+	 * @tutorial https://uviewui.com/components/alertTips.html
+	 * @property {String} title 鏄剧ず鐨勬爣棰樻枃瀛�
+	 * @property {String} description 杈呭姪鎬ф枃瀛楋紝棰滆壊姣攖itle娴呬竴鐐癸紝瀛楀彿涔熷皬涓�鐐癸紝鍙��
+	 * @property {String} type 鍏抽棴鎸夐挳(榛樿涓哄弶鍙穒con鍥炬爣)
+	 * @property {String} icon 鍥炬爣鍚嶇О
+	 * @property {Object} icon-style 鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} title-style 鏍囬鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} desc-style 鎻忚堪鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {String} close-able 鐢ㄦ枃瀛楁浛浠e叧闂浘鏍囷紝close-able涓簍rue鏃舵湁鏁�
+	 * @property {Boolean} show-icon 鏄惁鏄剧ず宸﹁竟鐨勮緟鍔╁浘鏍�
+	 * @property {Boolean} show 鏄剧ず鎴栭殣钘忕粍浠�
+	 * @event {Function} click 鐐瑰嚮缁勪欢鏃惰Е鍙�
+	 * @event {Function} close 鐐瑰嚮鍏抽棴鎸夐挳鏃惰Е鍙�
+	 */
+	export default {
+		name: 'u-alert-tips',
+		props: {
+			// 鏄剧ず鏂囧瓧
+			title: {
+				type: String,
+				default: ''
+			},
+			// 涓婚锛宻uccess/warning/info/error
+			type: {
+				type: String,
+				default: 'warning'
+			},
+			// 杈呭姪鎬ф枃瀛�
+			description: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鍙叧闂�
+			closeAble: {
+				type: Boolean,
+				default: false
+			},
+			// 鍏抽棴鎸夐挳鑷畾涔夋枃鏈�
+			closeText: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず鍥炬爣
+			showIcon: {
+				type: Boolean,
+				default: false
+			},
+			// 鏂囧瓧棰滆壊锛屽鏋滃畾涔変簡color鍊硷紝icon浼氬け鏁�
+			color: {
+				type: String,
+				default: ''
+			},
+			// 鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: ''
+			},
+			// 杈规棰滆壊
+			borderColor: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず
+			show: {
+				type: Boolean,
+				default: true
+			},
+			// 宸﹁竟鏄剧ず鐨刬con
+			icon: {
+				type: String,
+				default: ''
+			},
+			// icon鐨勬牱寮�
+			iconStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			},
+			// 鏍囬鐨勬牱寮�
+			titleStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			},
+			// 鎻忚堪鏂囧瓧鐨勬牱寮�
+			descStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			},
+		},
+		data() {
+			return {
+			}
+		},
+		computed: {
+			uTitleStyle() {
+				let style = {};
+				// 濡傛灉鏈夋弿杩版枃瀛楃殑璇濓紝鏍囬杩涜鍔犵矖
+				style.fontWeight = this.description ? 500 : 'normal';
+				// 灏嗙敤鎴蜂紶鍏ユ牱寮忓璞″拰style鍚堝苟锛屼紶鍏ョ殑浼樺厛绾ф瘮style楂橈紝鍚屽睘鎬т細琚鐩�
+				return this.$u.deepMerge(style, this.titleStyle);
+			},
+			uIcon() {
+				// 濡傛灉鏈夎缃甶con鍚嶇О灏变娇鐢紝鍚﹀垯鏍规嵁type涓婚锛屾帹瀹氫竴涓粯璁ょ殑鍥炬爣
+				return this.icon ? this.icon : this.$u.type2icon(this.type);
+			},
+			uIconType() {
+				// 濡傛灉鏈夎缃浘鏍囩殑鏍峰紡锛屼紭鍏堜娇鐢紝娌℃湁鐨勮瘽锛屽垯鐢╰ype鐨勬牱寮�
+				return Object.keys(this.iconStyle).length ? '' : this.type;
+			}
+		},
+		methods: {
+			// 鐐瑰嚮鍐呭
+			click() {
+				this.$emit('click');
+			},
+			// 鐐瑰嚮鍏抽棴鎸夐挳
+			close() {
+				this.$emit('close');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-alert-tips {
+		@include vue-flex;
+		align-items: center;
+		padding: 16rpx 30rpx;
+		border-radius: 8rpx;
+		position: relative;
+		transition: all 0.3s linear;
+		border: 1px solid #fff;
+		
+		&--bg--primary-light {
+			background-color: $u-type-primary-light;
+		}
+		
+		&--bg--info-light {
+			background-color: $u-type-info-light;
+		}
+		
+		&--bg--success-light {
+			background-color: $u-type-success-light;
+		}
+		
+		&--bg--warning-light {
+			background-color: $u-type-warning-light;
+		}
+		
+		&--bg--error-light {
+			background-color: $u-type-error-light;
+		}
+		
+		&--border--primary-disabled {
+			border-color: $u-type-primary-disabled;
+		}
+		
+		&--border--success-disabled {
+			border-color: $u-type-success-disabled;
+		}
+		
+		&--border--error-disabled {
+			border-color: $u-type-error-disabled;
+		}
+		
+		&--border--warning-disabled {
+			border-color: $u-type-warning-disabled;
+		}
+		
+		&--border--info-disabled {
+			border-color: $u-type-info-disabled;
+		}
+	}
+
+	.u-close-alert-tips {
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.u-icon {
+		margin-right: 16rpx;
+	}
+
+	.u-alert-title {
+		font-size: 28rpx;
+		color: $u-main-color;
+	}
+
+	.u-alert-desc {
+		font-size: 26rpx;
+		text-align: left;
+		color: $u-content-color;
+	}
+
+	.u-close-icon {
+		position: absolute;
+		top: 20rpx;
+		right: 20rpx;
+	}
+
+	.u-close-hover {
+		color: red;
+	}
+	
+	.u-close-text {
+		font-size: 24rpx;
+		color: $u-tips-color;
+		position: absolute;
+		top: 20rpx;
+		right: 20rpx;
+		line-height: 1;
+	}
+</style>
diff --git a/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue
new file mode 100644
index 0000000..a48dd54
--- /dev/null
+++ b/uview-ui/components/u-avatar-cropper/u-avatar-cropper.vue
@@ -0,0 +1,290 @@
+<template>
+	<view class="content">
+		<view class="cropper-wrapper" :style="{ height: cropperOpt.height + 'px' }">
+			<canvas
+				class="cropper"
+				:disable-scroll="true"
+				@touchstart="touchStart"
+				@touchmove="touchMove"
+				@touchend="touchEnd"
+				:style="{ width: cropperOpt.width, height: cropperOpt.height, backgroundColor: 'rgba(0, 0, 0, 0.8)' }"
+				canvas-id="cropper"
+				id="cropper"
+			></canvas>
+			<canvas
+				class="cropper"
+				:disable-scroll="true"
+				:style="{
+					position: 'fixed',
+					top: `-${cropperOpt.width * cropperOpt.pixelRatio}px`,
+					left: `-${cropperOpt.height * cropperOpt.pixelRatio}px`,
+					width: `${cropperOpt.width * cropperOpt.pixelRatio}px`,
+					height: `${cropperOpt.height * cropperOpt.pixelRatio}`
+				}"
+				canvas-id="targetId"
+				id="targetId"
+			></canvas>
+		</view>
+		<view class="cropper-buttons safe-area-padding" :style="{ height: bottomNavHeight + 'px' }">
+			<!-- #ifdef H5 -->
+			<view class="upload" @tap="uploadTap">閫夋嫨鍥剧墖</view>
+			<!-- #endif -->
+			<!-- #ifndef H5 -->
+			<view class="upload" @tap="uploadTap">閲嶆柊閫夋嫨</view>
+			<!-- #endif -->
+			<view class="getCropperImage" @tap="getCropperImage(false)">纭畾</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import WeCropper from './weCropper.js';
+export default {
+	props: {
+		// 瑁佸壀鐭╁舰妗嗙殑鏍峰紡锛屽叾涓彲鍖呭惈鐨勫睘鎬т负lineWidth-杈规瀹藉害(鍗曚綅rpx)锛宑olor: 杈规棰滆壊锛�
+		// mask-閬僵棰滆壊锛屼竴鑸缃负涓�涓猺gba鐨勯�忔槑搴︼紝濡�"rgba(0, 0, 0, 0.35)"
+		boundStyle: {
+			type: Object,
+			default() {
+				return {
+					lineWidth: 4,
+					borderColor: 'rgb(245, 245, 245)',
+					mask: 'rgba(0, 0, 0, 0.35)'
+				};
+			}
+		}
+		// // 瑁佸壀妗嗗搴︼紝鍗曚綅rpx
+		// rectWidth: {
+		// 	type: [String, Number],
+		// 	default: 400
+		// },
+		// // 瑁佸壀妗嗛珮搴︼紝鍗曚綅rpx
+		// rectHeight: {
+		// 	type: [String, Number],
+		// 	default: 400
+		// },
+		// // 杈撳嚭鍥剧墖瀹藉害锛屽崟浣峳px
+		// destWidth: {
+		// 	type: [String, Number],
+		// 	default: 400
+		// },
+		// // 杈撳嚭鍥剧墖楂樺害锛屽崟浣峳px
+		// destHeight: {
+		// 	type: [String, Number],
+		// 	default: 400
+		// },
+		// // 杈撳嚭鐨勫浘鐗囩被鍨嬶紝濡傛灉鍙戠幇瑁佸壀鐨勫浘鐗囧緢澶э紝鍙兘鏄洜涓鸿缃负浜�"png"锛屾敼鎴�"jpg"鍗冲彲
+		// fileType: {
+		// 	type: String,
+		// 	default: 'jpg',
+		// },
+		// // 鐢熸垚鐨勫浘鐗囪川閲�
+		// // H5涓婃棤鏁堬紝鐩墠涓嶈�冭檻浣跨敤姝ゅ弬鏁�
+		// quality: {
+		// 	type: [Number, String],
+		// 	default: 1
+		// }
+	},
+	data() {
+		return {
+			// 搴曢儴瀵艰埅鐨勯珮搴�
+			bottomNavHeight: 50,
+			originWidth: 200,
+			width: 0,
+			height: 0,
+			cropperOpt: {
+				id: 'cropper',
+				targetId: 'targetCropper',
+				pixelRatio: 1,
+				width: 0,
+				height: 0,
+				scale: 2.5,
+				zoom: 8,
+				cut: {
+					x: (this.width - this.originWidth) / 2,
+					y: (this.height - this.originWidth) / 2,
+					width: this.originWidth,
+					height: this.originWidth
+				},
+				boundStyle: {
+					lineWidth: uni.upx2px(this.boundStyle.lineWidth),
+					mask: this.boundStyle.mask,
+					color: this.boundStyle.borderColor
+				}
+			},
+			// 瑁佸壀妗嗗拰杈撳嚭鍥剧墖鐨勫昂瀵革紝楂樺害榛樿绛変簬瀹藉害
+			// 杈撳嚭鍥剧墖瀹藉害锛屽崟浣峱x
+			destWidth: 200,
+			// 瑁佸壀妗嗗搴︼紝鍗曚綅px
+			rectWidth: 200,
+			// 杈撳嚭鐨勫浘鐗囩被鍨嬶紝濡傛灉'png'绫诲瀷鍙戠幇瑁佸壀鐨勫浘鐗囧お澶э紝鏀规垚"jpg"鍗冲彲
+			fileType: 'jpg',
+			src: '', // 閫夋嫨鐨勫浘鐗囪矾寰勶紝鐢ㄤ簬鍦ㄧ偣鍑荤‘瀹氭椂锛屽垽鏂槸鍚﹂�夋嫨浜嗗浘鐗�
+		};
+	},
+	onLoad(option) {
+		let rectInfo = uni.getSystemInfoSync();
+		this.width = rectInfo.windowWidth;
+		this.height = rectInfo.windowHeight - this.bottomNavHeight;
+		this.cropperOpt.width = this.width;
+		this.cropperOpt.height = this.height;
+		this.cropperOpt.pixelRatio = rectInfo.pixelRatio;
+
+		if (option.destWidth) this.destWidth = option.destWidth;
+		if (option.rectWidth) {
+			let rectWidth = Number(option.rectWidth);
+			this.cropperOpt.cut = {
+				x: (this.width - rectWidth) / 2,
+				y: (this.height - rectWidth) / 2,
+				width: rectWidth,
+				height: rectWidth
+			};
+		}
+		this.rectWidth = option.rectWidth;
+		if (option.fileType) this.fileType = option.fileType;
+		// 鍒濆鍖�
+		this.cropper = new WeCropper(this.cropperOpt)
+			.on('ready', ctx => {
+				// wecropper is ready for work!
+			})
+			.on('beforeImageLoad', ctx => {
+				// before picture loaded, i can do something
+			})
+			.on('imageLoad', ctx => {
+				// picture loaded
+			})
+			.on('beforeDraw', (ctx, instance) => {
+				// before canvas draw,i can do something
+			});
+		// 璁剧疆瀵艰埅鏍忔牱寮忥紝浠ュ厤鐢ㄦ埛鍦╬age.json涓病鏈夎缃负榛戣壊鑳屾櫙
+		uni.setNavigationBarColor({
+			frontColor: '#ffffff',
+			backgroundColor: '#000000'
+		});
+		uni.chooseImage({
+			count: 1, // 榛樿9
+			sizeType: ['compressed'], // 鍙互鎸囧畾鏄師鍥捐繕鏄帇缂╁浘锛岄粯璁や簩鑰呴兘鏈�
+			sourceType: ['album', 'camera'], // 鍙互鎸囧畾鏉ユ簮鏄浉鍐岃繕鏄浉鏈猴紝榛樿浜岃�呴兘鏈�
+			success: res => {
+				this.src = res.tempFilePaths[0];
+				//  鑾峰彇瑁佸壀鍥剧墖璧勬簮鍚庯紝缁檇ata娣诲姞src灞炴�у強鍏跺��
+				this.cropper.pushOrign(this.src);
+			}
+		});
+	},
+	methods: {
+		touchStart(e) {
+			this.cropper.touchStart(e);
+		},
+		touchMove(e) {
+			this.cropper.touchMove(e);
+		},
+		touchEnd(e) {
+			this.cropper.touchEnd(e);
+		},
+		getCropperImage(isPre = false) {
+			if(!this.src) return this.$u.toast('璇峰厛閫夋嫨鍥剧墖鍐嶈鍓�');
+
+			let cropper_opt = {
+				destHeight: Number(this.destWidth), // uni.canvasToTempFilePath瑕佹眰杩欎簺鍙傛暟涓烘暟鍊�
+				destWidth: Number(this.destWidth),
+				fileType: this.fileType
+			};
+			this.cropper.getCropperImage(cropper_opt, (path, err) => {
+				if (err) {
+					uni.showModal({
+						title: '娓╅Θ鎻愮ず',
+						content: err.message
+					});
+				} else {
+					if (isPre) {
+						uni.previewImage({
+							current: '', // 褰撳墠鏄剧ず鍥剧墖鐨� http 閾炬帴
+							urls: [path] // 闇�瑕侀瑙堢殑鍥剧墖 http 閾炬帴鍒楄〃
+						});
+					} else {
+						uni.$emit('uAvatarCropper', path);
+						this.$u.route({
+							type: 'back'
+						});
+					}
+				}
+			});
+		},
+		uploadTap() {
+			const self = this;
+			uni.chooseImage({
+				count: 1, // 榛樿9
+				sizeType: ['original', 'compressed'], // 鍙互鎸囧畾鏄師鍥捐繕鏄帇缂╁浘锛岄粯璁や簩鑰呴兘鏈�
+				sourceType: ['album', 'camera'], // 鍙互鎸囧畾鏉ユ簮鏄浉鍐岃繕鏄浉鏈猴紝榛樿浜岃�呴兘鏈�
+				success: (res) => {
+					self.src = res.tempFilePaths[0];
+					//  鑾峰彇瑁佸壀鍥剧墖璧勬簮鍚庯紝缁檇ata娣诲姞src灞炴�у強鍏跺��
+
+					self.cropper.pushOrign(this.src);
+				}
+			});
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import '../../libs/css/style.components.scss';
+
+.content {
+	background: rgba(255, 255, 255, 1);
+}
+
+.cropper {
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	z-index: 11;
+}
+
+.cropper-buttons {
+	background-color: #000000;
+	color: #eee;
+}
+
+.cropper-wrapper {
+	position: relative;
+	@include vue-flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	width: 100%;
+	background-color: #000;
+}
+
+.cropper-buttons {
+	width: 100vw;
+	@include vue-flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	position: fixed;
+	bottom: 0;
+	left: 0;
+	font-size: 28rpx;
+}
+
+.cropper-buttons .upload,
+.cropper-buttons .getCropperImage {
+	width: 50%;
+	text-align: center;
+}
+
+.cropper-buttons .upload {
+	text-align: left;
+	padding-left: 50rpx;
+}
+
+.cropper-buttons .getCropperImage {
+	text-align: right;
+	padding-right: 50rpx;
+}
+</style>
diff --git a/uview-ui/components/u-avatar-cropper/weCropper.js b/uview-ui/components/u-avatar-cropper/weCropper.js
new file mode 100644
index 0000000..df02483
--- /dev/null
+++ b/uview-ui/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();
+			// 鑾峰彇鍒板綋鍓峱age涓婁笅鏂�
+			var pageContext = pages[pages.length - 1];
+			// 鎶妕his渚濋檮鍦≒age涓婁笅鏂囩殑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鈥檚 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) {
+						// 鈥onvert 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
+	}
+
+	/**
+	 * 杞崲涓哄浘鐗嘼ase64
+	 * @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 + '\'绫诲瀷鐨刡ase64鍥剧墖');
+		}
+	}
+
+	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 绗竴鎸噒ouch瀵硅薄
+	 * @param touch1 绗簩鎸噒ouch瀵硅薄
+	 * @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/uview-ui/components/u-avatar/u-avatar.vue b/uview-ui/components/u-avatar/u-avatar.vue
new file mode 100644
index 0000000..289b9b0
--- /dev/null
+++ b/uview-ui/components/u-avatar/u-avatar.vue
@@ -0,0 +1,244 @@
+<template>
+	<view class="u-avatar" :style="[wrapStyle]" @tap="click">
+		<image
+			@error="loadError"
+			:style="[imgStyle]"
+			class="u-avatar__img"
+			v-if="!uText && avatar"
+			:src="avatar" 
+			:mode="imgMode"
+		></image>
+		<text class="u-line-1" v-else-if="uText" :style="{
+			fontSize: '38rpx'
+		}">{{uText}}</text>
+		<slot v-else></slot>
+		<view class="u-avatar__sex" v-if="showSex" :class="['u-avatar__sex--' + sexIcon]" :style="[uSexStyle]">
+			<u-icon :name="sexIcon" size="20"></u-icon>
+		</view>
+		<view class="u-avatar__level" v-if="showLevel" :style="[uLevelStyle]">
+			<u-icon :name="levelIcon" size="20"></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+	let base64Avatar = "data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMEQwRkY0RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMEQwRkY1RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQwRDBGRjJGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQwRDBGRjNGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwMDBAMDg8QDw4MExMUFBMTHBsbGxwfHx8fHx8fHx8fAQcHBw0MDRgQEBgaFREVGh8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx//wAARCADIAMgDAREAAhEBAxEB/8QAcQABAQEAAwEBAAAAAAAAAAAAAAUEAQMGAgcBAQAAAAAAAAAAAAAAAAAAAAAQAAIBAwICBgkDBQAAAAAAAAABAhEDBCEFMVFBYXGREiKBscHRMkJSEyOh4XLxYjNDFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A/fAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHbHFyZ/Dam+yLA+Z2L0Pjtyj2poD4AAAAAAAAAAAAAAAAAAAAAAAAKWFs9y6lcvvwQeqj8z9wFaziY1n/HbUX9XF97A7QAGXI23EvJ1goyfzR0YEfN269jeZ+a03pNe0DIAAAAAAAAAAAAAAAAAAAACvtO3RcVkXlWutuL9YFYAAAAAOJRjKLjJVi9GmB5/csH/mu1h/in8PU+QGMAAAAAAAAAAAAAAAAAAaMDG/6MmMH8C80+xAelSSVFolwQAAAAAAAHVlWI37ErUulaPk+hgeYnCUJuElSUXRrrQHAAAAAAAAAAAAAAAAABa2Oz4bM7r4zdF2ICmAAAAAAAAAg7zZ8GX41wuJP0rRgYAAAAAAAAAAAAAAAAAD0m2R8ODaXU33tsDSAAAAAAAAAlb9HyWZcnJd9PcBHAAAAAAAAAAAAAAAAAPS7e64Vn+KA0AAAAAAAAAJm+v8Ftf3ewCKAAAAAAAAAAAAAAAAAX9muqeGo9NttP06+0DcAAAAAAAAAjb7dTu2ra+VOT9P8AQCWAAAAAAAAAAAAAAAAAUNmyPt5Ltv4bui/kuAF0AAAAAAADiUlGLlJ0SVW+oDzOXfd/Ind6JPRdS0QHSAAAAAAAAAAAAAAAAAE2nVaNcGB6Lbs6OTao9LsF51z60BrAAAAAABJ3jOVHjW3r/sa9QEgAAAAAAAAAAAAAAAAAAAPu1duWriuW34ZR4MC9hbnZyEoy8l36XwfYBsAAADaSq9EuLAlZ+7xSdrGdW9Hc5dgEdtt1erfFgAAAAAAAAAAAAAAAAADVjbblX6NR8MH80tEBRs7HYivyzlN8lovaBPzduvY0m6eK10TXtAyAarO55lpJK54orolr+4GqO/Xaea1FvqbXvA+Z77kNeW3GPbV+4DJfzcm/pcm3H6Vou5AdAFLC2ed2Pjv1txa8sV8T6wOL+yZEKu1JXFy4MDBOE4ScZxcZLinoB8gAAAAAAAAAAAB242LeyJ+C3GvN9C7QLmJtePYpKS+5c+p8F2IDYAANJqj1T4oCfk7Nj3G5Wn9qXJax7gJ93Z82D8sVNc4v30A6Xg5i42Z+iLfqARwcyT0sz9MWvWBps7LlTf5Grce9/oBTxdtxseklHxT+uWr9AGoAB138ezfj4bsFJdD6V2MCPm7RdtJzs1uW1xXzL3gTgAAAAAAAAADRhYc8q74I6RWs5ckB6GxYtWLat21SK731sDsAAAAAAAAAAAAAAAASt021NO/YjrxuQXT1oCOAAAAAAABzGLlJRSq26JAelwsWONYjbXxcZvmwO8AAAAAAAAAAAAAAAAAAef3TEWPkVivx3NY9T6UBiAAAAAABo2+VmGXblddIJ8eivRUD0oAAAAAAAAAAAAAAAAAAAYt4tKeFKVNYNSXfRgefAAAAAAAAr7VuSSWPedKaW5v1MCsAAAAAAAAAAAAAAAAAAIe6bj96Ts2n+JPzSXzP3ATgAAAAAAAAFbbt1UUrOQ9FpC4/UwK6aaqtU+DAAAAAAAAAAAAAAA4lKMIuUmoxWrb4ARNx3R3q2rLpa4Sl0y/YCcAAAAAAAAAAANmFud7G8r89r6X0dgFvGzLGRGtuWvTF6NAdwAAAAAAAAAAAy5W442PVN+K59EePp5ARMvOv5MvO6QXCC4AZwAAAAAAAAAAAAAcxlKLUotprg1owN+PvORborq+7Hnwl3gUbO74VzRydt8pKn68ANcJwmqwkpLmnUDkAAAAfNy9atqtyagut0AxXt5xIV8Fbj6lRd7Am5G65V6qUvtwfyx94GMAAAAAAAAAAAAAAAAAAAOU2nVOj5gdsc3LiqRvTpyqwOxbnnrhdfpSfrQB7pnv/AGvuS9gHXPMy5/Fem1yq0v0A6W29XqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf//Z";
+	/**
+	 * avatar 澶村儚
+	 * @description 鏈粍浠朵竴鑸敤浜庡睍绀哄ご鍍忕殑鍦版柟锛屽涓汉涓績锛屾垨鑰呰瘎璁哄垪琛ㄩ〉鐨勭敤鎴峰ご鍍忓睍绀虹瓑鍦烘墍銆�
+	 * @tutorial https://www.uviewui.com/components/avatar.html
+	 * @property {String} bg-color 鑳屾櫙棰滆壊锛屼竴鑸樉绀烘枃瀛楁椂鐢紙榛樿#ffffff锛�
+	 * @property {String} src 澶村儚璺緞锛屽鍔犺浇澶辫触锛屽皢浼氭樉绀洪粯璁ゅご鍍�
+	 * @property {String Number} size 澶村儚灏哄锛屽彲浠ヤ负鎸囧畾瀛楃涓�(large, default, mini)锛屾垨鑰呮暟鍊硷紝鍗曚綅rpx锛堥粯璁efault锛�
+	 * @property {String} mode 鏄剧ず绫诲瀷锛岃涓婃柟璇存槑锛堥粯璁ircle锛�
+	 * @property {String} sex-icon 鎬у埆鍥炬爣锛宮an-鐢凤紝woman-濂筹紙榛樿man锛�
+	 * @property {String} level-icon 绛夌骇鍥炬爣锛堥粯璁evel锛�
+	 * @property {String} sex-bg-color 鎬у埆鍥炬爣鑳屾櫙棰滆壊
+	 * @property {String} level-bg-color 绛夌骇鍥炬爣鑳屾櫙棰滆壊
+	 * @property {String} show-sex 鏄惁鏄剧ず鎬у埆鍥炬爣锛堥粯璁alse锛�
+	 * @property {String} show-level 鏄惁鏄剧ず绛夌骇鍥炬爣锛堥粯璁alse锛�
+	 * @property {String} img-mode 澶村儚鍥剧墖鐨勮鍓被鍨嬶紝涓巙ni鐨刬mage缁勪欢鐨刴ode鍙傛暟涓�鑷达紝濡傛晥鏋滆揪涓嶅埌闇�姹傦紝鍙皾璇曚紶widthFix鍊硷紙榛樿aspectFill锛�
+	 * @property {String} index 鐢ㄦ埛浼犻�掔殑鏍囪瘑绗﹀�硷紝濡傛灉鏄垪琛ㄥ惊鐜紝鍙┛v-for鐨刬ndex鍊�
+	 * @event {Function} click 澶村儚琚偣鍑�
+	 * @example <u-avatar :src="src"></u-avatar>
+	 */
+	export default {
+		name: 'u-avatar',
+		props: {
+			// 鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: 'transparent'
+			},
+			// 澶村儚璺緞
+			src: {
+				type: String,
+				default: ''
+			},
+			// 灏哄锛宭arge-澶э紝default-涓瓑锛宮ini-灏忥紝濡傛灉涓烘暟鍊硷紝鍒欏崟浣嶄负rpx
+			// 瀹藉害绛変簬楂樺害
+			size: {
+				type: [String, Number],
+				default: 'default'
+			},
+			// 澶村儚妯″瀷锛宻quare-甯﹀渾瑙掓柟褰紝circle-鍦嗗舰
+			mode: {
+				type: String,
+				default: 'circle'
+			},
+			// 鏂囧瓧鍐呭
+			text: {
+				type: String,
+				default: ''
+			},
+			// 鍥剧墖鐨勮鍓ā鍨�
+			imgMode: {
+				type: String,
+				default: 'aspectFill'
+			},
+			// 鏍囪瘑绗�
+			index: {
+				type: [String, Number],
+				default: ''
+			},
+			// 鍙充笂瑙掓�у埆瑙掓爣锛宮an-鐢凤紝woman-濂�
+			sexIcon: {
+				type: String,
+				default: 'man'
+			},
+			// 鍙充笅瑙掔殑绛夌骇鍥炬爣
+			levelIcon: {
+				type: String,
+				default: 'level'
+			},
+			// 鍙充笅瑙掔瓑绾у浘鏍囪儗鏅鑹�
+			levelBgColor: {
+				type: String,
+				default: ''
+			},
+			// 鍙充笂瑙掓�у埆鍥炬爣鐨勮儗鏅鑹�
+			sexBgColor: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず鎬у埆鍥炬爣
+			showSex: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鏄剧ず绛夌骇鍥炬爣
+			showLevel: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				error: false,
+				// 澶村儚鐨勫湴鍧�锛屽洜涓哄鏋滃姞杞介敊璇紝闇�瑕佽祴鍊间负榛樿鍥剧墖锛宲rops鍊兼棤娉曚慨鏀癸紝鎵�浠ラ渶瑕佷竴涓腑闂村��
+                avatar: this.src ? this.src : base64Avatar, 
+			}
+		},
+        watch: {
+            src(n) {
+                // 鐢ㄦ埛鍙兘浼氬湪澶村儚鍔犺浇澶辫触鏃讹紝鍐嶆淇敼澶村儚鍊硷紝鎵�浠ラ渶瑕侀噸鏂拌祴鍊�
+                if(!n) {
+					// 濡傛灉浼犲叆null鎴栬��''锛屾垨鑰卽ndefined锛屾樉绀洪粯璁ゅご鍍�
+					this.avatar = base64Avatar;
+					this.error = true;
+				} else {
+					this.avatar = n;
+					this.error = false;
+				}
+            }
+        },
+		computed: {
+			wrapStyle() {
+				let style = {};  
+				style.height = this.size == 'large' ? '120rpx' : this.size == 'default' ?
+				'90rpx' : this.size == 'mini' ? '70rpx' : this.size + 'rpx';
+				style.width = style.height;
+				style.flex = `0 0 ${style.height}`;
+				style.backgroundColor = this.bgColor;
+				style.borderRadius = this.mode == 'circle' ? '500px' : '5px';
+				if(this.text) style.padding = `0 6rpx`;
+				return style;
+			},
+			imgStyle() {
+				let style = {};
+				style.borderRadius = this.mode == 'circle' ? '500px' : '5px';
+				return style;
+			},
+			// 鍙栧瓧绗︿覆鐨勭涓�涓瓧绗�
+			uText() {
+				return String(this.text)[0];
+			},
+			// 鎬у埆鍥炬爣鐨勮嚜瀹氫箟鏍峰紡
+			uSexStyle() {
+				let style = {};
+				if(this.sexBgColor) style.backgroundColor = this.sexBgColor;
+				return style;
+			},
+			// 绛夌骇鍥炬爣鐨勮嚜瀹氫箟鏍峰紡
+			uLevelStyle() {
+				let style = {};
+				if(this.levelBgColor) style.backgroundColor = this.levelBgColor;
+				return style;
+			}
+		},
+		methods: {
+			// 鍥剧墖鍔犺浇閿欒鏃讹紝鏄剧ず榛樿澶村儚
+			loadError() {
+				this.error = true;
+                this.avatar = base64Avatar;
+			},
+			click() {
+				this.$emit('click', this.index);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-avatar {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
+		align-items: center;
+		justify-content: center;
+		font-size: 28rpx;
+		color: $u-content-color;
+		border-radius: 10px;
+		position: relative;
+		
+		&__img {
+			width: 100%;
+			height: 100%;
+		}
+		
+		&__sex {
+			position: absolute;
+			width: 32rpx;
+			color: #ffffff;
+			height: 32rpx;
+			@include vue-flex;
+			justify-content: center;
+			align-items: center;
+			border-radius: 100rpx;
+			top: 5%;
+			z-index: 1;
+			right: -7%;
+			border: 1px #ffffff solid;
+			
+			&--man {
+				background-color: $u-type-primary;
+			}
+			
+			&--woman {
+				background-color: $u-type-error;
+			}
+			
+			&--none {
+				background-color: $u-type-warning;
+			}
+		}
+		
+		&__level {
+			position: absolute;
+			width: 32rpx;
+			color: #ffffff;
+			height: 32rpx;
+			@include vue-flex;
+			justify-content: center;
+			align-items: center;
+			border-radius: 100rpx;
+			bottom: 5%; 
+			z-index: 1;
+			right: -7%;
+			border: 1px #ffffff solid;
+			background-color: $u-type-warning;
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-back-top/u-back-top.vue b/uview-ui/components/u-back-top/u-back-top.vue
new file mode 100644
index 0000000..7970fc7
--- /dev/null
+++ b/uview-ui/components/u-back-top/u-back-top.vue
@@ -0,0 +1,153 @@
+<template>
+	<view @tap="backToTop" class="u-back-top" :class="['u-back-top--mode--' + mode]" :style="[{
+		bottom: bottom + 'rpx',
+		right: right + 'rpx',
+		borderRadius: mode == 'circle' ? '10000rpx' : '8rpx',
+		zIndex: uZIndex,
+		opacity: opacity
+	}, customStyle]">
+		<view class="u-back-top__content" v-if="!$slots.default && !$slots.$default">
+			<u-icon @click="backToTop" :name="icon" :custom-style="iconStyle"></u-icon>
+			<view class="u-back-top__content__tips">
+				{{tips}}
+			</view>
+		</view>
+		<slot v-else />
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'u-back-top',
+		props: {
+			// 杩斿洖椤堕儴鐨勫舰鐘讹紝circle-鍦嗗舰锛宻quare-鏂瑰舰
+			mode: {
+				type: String,
+				default: 'circle'
+			},
+			// 鑷畾涔夊浘鏍�
+			icon: {
+				type: String,
+				default: 'arrow-upward'
+			},
+			// 鎻愮ず鏂囧瓧
+			tips: {
+				type: String,
+				default: ''
+			},
+			// 杩斿洖椤堕儴婊氬姩鏃堕棿
+			duration: {
+				type: [Number, String],
+				default: 100
+			},
+			// 婊氬姩璺濈
+			scrollTop: {
+				type: [Number, String],
+				default: 0
+			},
+			// 璺濈椤堕儴澶氬皯璺濈鏄剧ず锛屽崟浣峳px
+			top: {
+				type: [Number, String],
+				default: 400
+			},
+			// 杩斿洖椤堕儴鎸夐挳鍒板簳閮ㄧ殑璺濈锛屽崟浣峳px
+			bottom: {
+				type: [Number, String],
+				default: 200
+			},
+			// 杩斿洖椤堕儴鎸夐挳鍒板彸杈圭殑璺濈锛屽崟浣峳px
+			right: {
+				type: [Number, String],
+				default: 40
+			},
+			// 灞傜骇
+			zIndex: {
+				type: [Number, String],
+				default: '9'
+			},
+			// 鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+			iconStyle: {
+				type: Object,
+				default() {
+					return {
+						color: '#909399',
+						fontSize: '38rpx'
+					}
+				}
+			},
+			// 鏁翠釜缁勪欢鐨勬牱寮�
+			customStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			}
+		},
+		watch: {
+			showBackTop(nVal, oVal) {
+				// 褰撶粍浠剁殑鏄剧ず涓庨殣钘忕姸鎬佸彂鐢熻烦鍙樻椂锛屼慨鏀圭粍浠剁殑灞傜骇鍜屼笉閫忔槑搴�
+				// 璁╃粍浠舵湁鏄剧ず鍜屾秷澶辩殑鍔ㄧ敾鏁堟灉锛屽鏋滅敤v-if鎺у埗缁勪欢鐘舵�侊紝灏嗘棤璁剧疆鍔ㄧ敾鏁堟灉
+				if(nVal) {
+					this.uZIndex = this.zIndex;
+					this.opacity = 1;
+				} else {
+					this.uZIndex = -1;
+					this.opacity = 0;
+				}
+			}
+		},
+		computed: {
+			showBackTop() {
+				// 鐢变簬scrollTop涓洪〉闈㈢殑婊氬姩璺濈锛岄粯璁や负px鍗曚綅锛岃繖閲屽皢鐢ㄤ簬浼犲叆鐨則op(rpx)鍊�
+				// 杞负px鐢ㄤ簬姣旇緝锛屽鏋滄粴鍔ㄦ潯鍒伴《鐨勮窛绂诲ぇ浜庤瀹氱殑璺濈锛屽氨鏄剧ず杩斿洖椤堕儴鐨勬寜閽�
+				return this.scrollTop > uni.upx2px(this.top);
+			},
+		},
+		data() {
+			return {
+				// 涓嶉�忔槑搴︼紝涓轰簡璁╃粍浠舵湁涓�涓樉绀哄拰闅愯棌鐨勮繃娓″姩鐢�
+				opacity: 0,
+				// 缁勪欢鐨剒-index鍊硷紝闅愯棌鏃惰缃负-1锛屽氨浼氱湅涓嶅埌
+				uZIndex: -1
+			}
+		},
+		methods: {
+			backToTop() {
+				uni.pageScrollTo({
+					scrollTop: 0,
+					duration: this.duration
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-back-top {
+		width: 80rpx;
+		height: 80rpx;
+		position: fixed;
+		z-index: 9;
+		@include vue-flex;
+		flex-direction: column;
+		justify-content: center;
+		background-color: #E1E1E1;
+		color: $u-content-color;
+		align-items: center;
+		transition: opacity 0.4s;
+		
+		&__content {
+			@include vue-flex;
+			flex-direction: column;
+			align-items: center;
+			
+			&__tips {
+				font-size: 24rpx;
+				transform: scale(0.8);
+				line-height: 1;
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-badge/u-badge.vue b/uview-ui/components/u-badge/u-badge.vue
new file mode 100644
index 0000000..24c1164
--- /dev/null
+++ b/uview-ui/components/u-badge/u-badge.vue
@@ -0,0 +1,217 @@
+<template>
+	<view v-if="show" class="u-badge" :class="[
+			isDot ? 'u-badge-dot' : '', 
+			size == 'mini' ? 'u-badge-mini' : '',
+			type ? 'u-badge--bg--' + type : ''
+		]" :style="[{
+			top: offset[0] + 'rpx',
+			right: offset[1] + 'rpx',
+			fontSize: fontSize + 'rpx',
+			position: absolute ? 'absolute' : 'static',
+			color: color,
+			backgroundColor: bgColor
+		}, boxStyle]"
+	>
+		{{showText}}
+	</view>
+</template>
+
+<script>
+	/**
+	 * badge 瑙掓爣
+	 * @description 鏈粍浠朵竴鑸敤浜庡睍绀哄ご鍍忕殑鍦版柟锛屽涓汉涓績锛屾垨鑰呰瘎璁哄垪琛ㄩ〉鐨勭敤鎴峰ご鍍忓睍绀虹瓑鍦烘墍銆�
+	 * @tutorial https://www.uviewui.com/components/badge.html
+	 * @property {String Number} count 灞曠ず鐨勬暟瀛楋紝澶т簬 overflowCount 鏃舵樉绀轰负 ${overflowCount}+锛屼负0涓攕how-zero涓篺alse鏃堕殣钘�
+	 * @property {Boolean} is-dot 涓嶅睍绀烘暟瀛楋紝鍙湁涓�涓皬鐐癸紙榛樿false锛�
+	 * @property {Boolean} absolute 缁勪欢鏄惁缁濆瀹氫綅锛屼负true鏃讹紝offset鍙傛暟鎵嶆湁鏁堬紙榛樿true锛�
+	 * @property {String Number} overflow-count 灞曠ず灏侀《鐨勬暟瀛楀�硷紙榛樿99锛�
+	 * @property {String} type 浣跨敤棰勮鐨勮儗鏅鑹诧紙榛樿error锛�
+	 * @property {Boolean} show-zero 褰撴暟鍊间负 0 鏃讹紝鏄惁灞曠ず Badge锛堥粯璁alse锛�
+	 * @property {String} size Badge鐨勫昂瀵革紝璁句负mini浼氬緱鍒板皬涓�鍙风殑Badge锛堥粯璁efault锛�
+	 * @property {Array} offset 璁剧疆badge鐨勪綅缃亸绉伙紝鏍煎紡涓� [x, y]锛屼篃鍗宠缃殑涓簍op鍜宺ight鐨勫�硷紝鍗曚綅rpx銆俛bsolute涓簍rue鏃舵湁鏁堬紙榛樿[20, 20]锛�
+	 * @property {String} color 瀛椾綋棰滆壊锛堥粯璁�#ffffff锛�
+	 * @property {String} bgColor 鑳屾櫙棰滆壊锛屼紭鍏堢骇姣攖ype楂橈紝濡傝缃紝type鍙傛暟浼氬け鏁�
+	 * @property {Boolean} is-center 缁勪欢涓績鐐规槸鍚﹀拰鐖剁粍浠跺彸涓婅閲嶅悎锛屼紭鍏堢骇姣攐ffset楂橈紝濡傝缃紝offset鍙傛暟浼氬け鏁堬紙榛樿false锛�
+	 * @example <u-badge type="error" count="7"></u-badge>
+	 */
+	export default {
+		name: 'u-badge',
+		props: {
+			// primary,warning,success,error,info
+			type: {
+				type: String,
+				default: 'error'
+			},
+			// default, mini
+			size: {
+				type: String,
+				default: 'default'
+			},
+			//鏄惁鏄渾鐐�
+			isDot: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄剧ず鐨勬暟鍊煎唴瀹�
+			count: {
+				type: [Number, String],
+			},
+			// 灞曠ず灏侀《鐨勬暟瀛楀��
+			overflowCount: {
+				type: Number,
+				default: 99
+			},
+			// 褰撴暟鍊间负 0 鏃讹紝鏄惁灞曠ず Badge
+			showZero: {
+				type: Boolean,
+				default: false
+			},
+			// 浣嶇疆鍋忕Щ
+			offset: {
+				type: Array,
+				default: () => {
+					return [20, 20]
+				}
+			},
+			// 鏄惁寮�鍚粷瀵瑰畾浣嶏紝寮�鍚簡offset鎵嶄細璧蜂綔鐢�
+			absolute: {
+				type: Boolean,
+				default: true
+			},
+			// 瀛椾綋澶у皬
+			fontSize: {
+				type: [String, Number],
+				default: '24'
+			},
+			// 瀛椾綋婕旂ず
+			color: {
+				type: String,
+				default: '#ffffff'
+			},
+			// badge鐨勮儗鏅鑹�
+			bgColor: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁璁゜adge缁勪欢鐨勪腑蹇冪偣鍜岀埗缁勪欢鍙充笂瑙掗噸鍚堬紝閰嶇疆鐨勮瘽锛宱ffset灏嗕細澶辨晥
+			isCenter: {
+				type: Boolean,
+				default: false
+			}
+		},
+		computed: {
+			// 鏄惁灏哹adge涓績涓庣埗缁勪欢鍙充笂瑙掗噸鍚�
+			boxStyle() {
+				let style = {};
+				if(this.isCenter) {
+					style.top = 0;
+					style.right = 0;
+					// Y杞�-50%锛屾剰鍛崇潃badge鍚戜笂绉诲姩浜哹adge鑷韩楂樺害涓�鍗婏紝X杞�50%锛屾剰鍛崇潃鍚戝彸绉诲姩浜嗚嚜韬搴︿竴鍗�
+					style.transform = "translateY(-50%) translateX(50%)";
+				} else {
+					style.top = this.offset[0] + 'rpx';
+					style.right = this.offset[1] + 'rpx';
+					style.transform = "translateY(0) translateX(0)";
+				}
+				// 濡傛灉灏哄涓簃ini锛屽悗鎺ヤ笂scal()
+				if(this.size == 'mini') {
+					style.transform = style.transform + " scale(0.8)";
+				}
+				return style;
+			},
+			// isDot绫诲瀷鏃讹紝涓嶆樉绀烘枃瀛�
+			showText() {
+				if(this.isDot) return '';
+				else {
+					if(this.count > this.overflowCount) return `${this.overflowCount}+`;
+					else return this.count;
+				}
+			},
+			// 鏄惁鏄剧ず缁勪欢
+			show() {
+				// 濡傛灉count鐨勫�间负0锛屽苟涓攕howZero璁剧疆涓篺alse锛屼笉鏄剧ず缁勪欢
+				if(this.count == 0 && this.showZero == false) return false;
+				else return true;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-badge {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		line-height: 24rpx;
+		height: 33rpx;
+		padding: 4rpx 10rpx;
+		border-radius: 100rpx;
+		z-index: 9;
+		
+		&--bg--primary {
+			background-color: $u-type-primary;
+		}
+		
+		&--bg--error {
+			background-color: $u-type-error;
+		}
+		
+		&--bg--success {
+			background-color: $u-type-success;
+		}
+		
+		&--bg--info {
+			background-color: $u-type-info;
+		}
+		
+		&--bg--warning {
+			background-color: $u-type-warning;
+		}
+	}
+	
+	.u-badge-dot {
+		height: 16rpx;
+		width: 16rpx;
+		border-radius: 100rpx;
+		line-height: 1;
+	}
+	
+	.u-badge-mini {
+		transform: scale(0.8);
+		transform-origin: center center;
+	}
+	
+	// .u-primary {
+	// 	background: $u-type-primary;
+	// 	color: #fff;
+	// }
+	
+	// .u-error {
+	// 	background: $u-type-error;
+	// 	color: #fff;
+	// }
+	
+	// .u-warning {
+	// 	background: $u-type-warning;
+	// 	color: #fff;
+	// }
+	
+	// .u-success {
+	// 	background: $u-type-success;
+	// 	color: #fff;
+	// }
+	
+	// .u-black {
+	// 	background: #585858;
+	// 	color: #fff;
+	// }
+	
+	.u-info {
+		background-color: $u-type-info;
+		color: #fff;
+	}
+</style>
\ No newline at end of file
diff --git a/uview-ui/components/u-button/u-button.vue b/uview-ui/components/u-button/u-button.vue
new file mode 100644
index 0000000..82c3a6f
--- /dev/null
+++ b/uview-ui/components/u-button/u-button.vue
@@ -0,0 +1,596 @@
+<template>
+	<button
+		id="u-wave-btn"
+		class="u-btn u-line-1 u-fix-ios-appearance"
+		:class="[
+			'u-size-' + size,
+			plain ? 'u-btn--' + type + '--plain' : '',
+			loading ? 'u-loading' : '',
+			shape == 'circle' ? 'u-round-circle' : '',
+			hairLine ? showHairLineBorder : 'u-btn--bold-border',
+			'u-btn--' + type,
+			disabled ? `u-btn--${type}--disabled` : '',
+		]"
+		:hover-start-time="Number(hoverStartTime)"
+		:hover-stay-time="Number(hoverStayTime)"
+		:disabled="disabled"
+		:form-type="formType"
+		:open-type="openType"
+		:app-parameter="appParameter"
+		:hover-stop-propagation="hoverStopPropagation"
+		:send-message-title="sendMessageTitle"
+		send-message-path="sendMessagePath"
+		:lang="lang"
+		:data-name="dataName"
+		:session-from="sessionFrom"
+		:send-message-img="sendMessageImg"
+		:show-message-card="showMessageCard"
+		@getphonenumber="getphonenumber"
+		@getuserinfo="getuserinfo"
+		@error="error"
+		@opensetting="opensetting"
+		@launchapp="launchapp"
+		:style="[customStyle, {
+			overflow: ripple ? 'hidden' : 'visible'
+		}]"
+		@tap.stop="click($event)"
+		:hover-class="getHoverClass"
+		:loading="loading"
+	>
+		<slot></slot>
+		<view
+			v-if="ripple"
+			class="u-wave-ripple"
+			:class="[waveActive ? 'u-wave-active' : '']"
+			:style="{
+				top: rippleTop + 'px',
+				left: rippleLeft + 'px',
+				width: fields.targetWidth + 'px',
+				height: fields.targetWidth + 'px',
+				'background-color': rippleBgColor || 'rgba(0, 0, 0, 0.15)'
+			}"
+		></view>
+	</button>
+</template>
+
+<script>
+/**
+ * button 鎸夐挳
+ * @description Button 鎸夐挳
+ * @tutorial https://www.uviewui.com/components/button.html
+ * @property {String} size 鎸夐挳鐨勫ぇ灏�
+ * @property {Boolean} ripple 鏄惁寮�鍚偣鍑绘按娉㈢汗鏁堟灉
+ * @property {String} ripple-bg-color 姘存尝绾圭殑鑳屾櫙鑹诧紝ripple涓簍rue鏃舵湁鏁�
+ * @property {String} type 鎸夐挳鐨勬牱寮忕被鍨�
+ * @property {Boolean} plain 鎸夐挳鏄惁闀傜┖锛岃儗鏅壊閫忔槑
+ * @property {Boolean} disabled 鏄惁绂佺敤
+ * @property {Boolean} hair-line 鏄惁鏄剧ず鎸夐挳鐨勭粏杈规(榛樿true)
+ * @property {Boolean} shape 鎸夐挳澶栬褰㈢姸锛岃鏂囨。璇存槑
+ * @property {Boolean} loading 鎸夐挳鍚嶇О鍓嶆槸鍚﹀甫 loading 鍥炬爣(App-nvue 骞冲彴锛屽湪 ios 涓婁负闆姳锛孉ndroid涓婁负鍦嗗湀)
+ * @property {String} form-type 鐢ㄤ簬 <form> 缁勪欢锛岀偣鍑诲垎鍒細瑙﹀彂 <form> 缁勪欢鐨� submit/reset 浜嬩欢
+ * @property {String} open-type 寮�鏀捐兘鍔�
+ * @property {String} data-name 棰濆浼犲弬鍙傛暟锛岀敤浜庡皬绋嬪簭鐨刣ata-xxx灞炴�э紝閫氳繃target.dataset.name鑾峰彇
+ * @property {String} hover-class 鎸囧畾鎸夐挳鎸変笅鍘荤殑鏍峰紡绫汇�傚綋 hover-class="none" 鏃讹紝娌℃湁鐐瑰嚮鎬佹晥鏋�(App-nvue 骞冲彴鏆備笉鏀寔)
+ * @property {Number} hover-start-time 鎸変綇鍚庡涔呭嚭鐜扮偣鍑绘�侊紝鍗曚綅姣
+ * @property {Number} hover-stay-time 鎵嬫寚鏉惧紑鍚庣偣鍑绘�佷繚鐣欐椂闂达紝鍗曚綅姣
+ * @property {Object} custom-style 瀵规寜閽殑鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡锛岃鏂囨。璇存槑
+ * @event {Function} click 鎸夐挳鐐瑰嚮
+ * @event {Function} getphonenumber open-type="getPhoneNumber"鏃舵湁鏁�
+ * @event {Function} getuserinfo 鐢ㄦ埛鐐瑰嚮璇ユ寜閽椂锛屼細杩斿洖鑾峰彇鍒扮殑鐢ㄦ埛淇℃伅锛屼粠杩斿洖鍙傛暟鐨刣etail涓幏鍙栧埌鐨勫�煎悓uni.getUserInfo
+ * @event {Function} error 褰撲娇鐢ㄥ紑鏀捐兘鍔涙椂锛屽彂鐢熼敊璇殑鍥炶皟
+ * @event {Function} opensetting 鍦ㄦ墦寮�鎺堟潈璁剧疆椤靛苟鍏抽棴鍚庡洖璋�
+ * @event {Function} launchapp 鎵撳紑 APP 鎴愬姛鐨勫洖璋�
+ * @example <u-button>鏈堣惤</u-button>
+ */
+export default {
+	name: 'u-button',
+	props: {
+		// 鏄惁缁嗚竟妗�
+		hairLine: {
+			type: Boolean,
+			default: true
+		},
+		// 鎸夐挳鐨勯缃牱寮忥紝default锛宲rimary锛宔rror锛寃arning锛宻uccess
+		type: {
+			type: String,
+			default: 'default'
+		},
+		// 鎸夐挳灏哄锛宒efault锛宮edium锛宮ini
+		size: {
+			type: String,
+			default: 'default'
+		},
+		// 鎸夐挳褰㈢姸锛宑ircle锛堜袱杈逛负鍗婂渾锛夛紝square锛堝甫鍦嗚锛�
+		shape: {
+			type: String,
+			default: 'square'
+		},
+		// 鎸夐挳鏄惁闀傜┖
+		plain: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁绂佹鐘舵��
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鍔犺浇涓�
+		loading: {
+			type: Boolean,
+			default: false
+		},
+		// 寮�鏀捐兘鍔涳紝鍏蜂綋璇风湅uniapp绋冲畾鍏充簬button缁勪欢閮ㄥ垎璇存槑
+		// https://uniapp.dcloud.io/component/button
+		openType: {
+			type: String,
+			default: ''
+		},
+		// 鐢ㄤ簬 <form> 缁勪欢锛岀偣鍑诲垎鍒細瑙﹀彂 <form> 缁勪欢鐨� submit/reset 浜嬩欢
+		// 鍙栧�间负submit锛堟彁浜よ〃鍗曪級锛宺eset锛堥噸缃〃鍗曪級
+		formType: {
+			type: String,
+			default: ''
+		},
+		// 鎵撳紑 APP 鏃讹紝鍚� APP 浼犻�掔殑鍙傛暟锛宱pen-type=launchApp鏃舵湁鏁�
+		// 鍙井淇″皬绋嬪簭銆丵Q灏忕▼搴忔湁鏁�
+		appParameter: {
+			type: String,
+			default: ''
+		},
+		// 鎸囧畾鏄惁闃绘鏈妭鐐圭殑绁栧厛鑺傜偣鍑虹幇鐐瑰嚮鎬侊紝寰俊灏忕▼搴忔湁鏁�
+		hoverStopPropagation: {
+			type: Boolean,
+			default: false
+		},
+		// 鎸囧畾杩斿洖鐢ㄦ埛淇℃伅鐨勮瑷�锛寊h_CN 绠�浣撲腑鏂囷紝zh_TW 绻佷綋涓枃锛宔n 鑻辨枃銆傚彧寰俊灏忕▼搴忔湁鏁�
+		lang: {
+			type: String,
+			default: 'en'
+		},
+		// 浼氳瘽鏉ユ簮锛宱pen-type="contact"鏃舵湁鏁堛�傚彧寰俊灏忕▼搴忔湁鏁�
+		sessionFrom: {
+			type: String,
+			default: ''
+		},
+		// 浼氳瘽鍐呮秷鎭崱鐗囨爣棰橈紝open-type="contact"鏃舵湁鏁�
+		// 榛樿褰撳墠鏍囬锛屽彧寰俊灏忕▼搴忔湁鏁�
+		sendMessageTitle: {
+			type: String,
+			default: ''
+		},
+		// 浼氳瘽鍐呮秷鎭崱鐗囩偣鍑昏烦杞皬绋嬪簭璺緞锛宱pen-type="contact"鏃舵湁鏁�
+		// 榛樿褰撳墠鍒嗕韩璺緞锛屽彧寰俊灏忕▼搴忔湁鏁�
+		sendMessagePath: {
+			type: String,
+			default: ''
+		},
+		// 浼氳瘽鍐呮秷鎭崱鐗囧浘鐗囷紝open-type="contact"鏃舵湁鏁�
+		// 榛樿褰撳墠椤甸潰鎴浘锛屽彧寰俊灏忕▼搴忔湁鏁�
+		sendMessageImg: {
+			type: String,
+			default: ''
+		},
+		// 鏄惁鏄剧ず浼氳瘽鍐呮秷鎭崱鐗囷紝璁剧疆姝ゅ弬鏁颁负 true锛岀敤鎴疯繘鍏ュ鏈嶄細璇濅細鍦ㄥ彸涓嬭鏄剧ず"鍙兘瑕佸彂閫佺殑灏忕▼搴�"鎻愮ず锛�
+		// 鐢ㄦ埛鐐瑰嚮鍚庡彲浠ュ揩閫熷彂閫佸皬绋嬪簭娑堟伅锛宱pen-type="contact"鏃舵湁鏁�
+		showMessageCard: {
+			type: Boolean,
+			default: false
+		},
+		// 鎵嬫寚鎸夛紙瑙︽懜锛夋寜閽椂鎸夐挳鏃剁殑鑳屾櫙棰滆壊
+		hoverBgColor: {
+			type: String,
+			default: ''
+		},
+		// 姘存尝绾圭殑鑳屾櫙棰滆壊
+		rippleBgColor: {
+			type: String,
+			default: ''
+		},
+		// 鏄惁寮�鍚按娉㈢汗鏁堟灉
+		ripple: {
+			type: Boolean,
+			default: false
+		},
+		// 鎸変笅鐨勭被鍚�
+		hoverClass: {
+			type: String,
+			default: ''
+		},
+		// 鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+		customStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 棰濆浼犲弬鍙傛暟锛岀敤浜庡皬绋嬪簭鐨刣ata-xxx灞炴�э紝閫氳繃target.dataset.name鑾峰彇
+		dataName: {
+			type: String,
+			default: ''
+		},
+		// 鑺傛祦锛屼竴瀹氭椂闂村唴鍙兘瑙﹀彂涓�娆�
+		throttleTime: {
+			type: [String, Number],
+			default: 1000
+		},
+		// 鎸変綇鍚庡涔呭嚭鐜扮偣鍑绘�侊紝鍗曚綅姣
+		hoverStartTime: {
+			type: [String, Number],
+			default: 20
+		},
+		// 鎵嬫寚鏉惧紑鍚庣偣鍑绘�佷繚鐣欐椂闂达紝鍗曚綅姣
+		hoverStayTime: {
+			type: [String, Number],
+			default: 150
+		},
+	},
+	computed: {
+		// 褰撴病鏈変紶bgColor鍙橀噺鏃讹紝鎸夐挳鎸変笅鍘荤殑棰滆壊绫诲悕
+		getHoverClass() {
+			// 濡傛灉寮�鍚按娉㈢汗鏁堟灉锛屽垯涓嶅惎鐢╤over-class鏁堟灉
+			if (this.loading || this.disabled || this.ripple || this.hoverClass) return '';
+			let hoverClass = '';
+			hoverClass = this.plain ? 'u-' + this.type + '-plain-hover' : 'u-' + this.type + '-hover';
+			return hoverClass;
+		},
+		// 鍦�'primary', 'success', 'error', 'warning'绫诲瀷涓嬶紝涓嶆樉绀鸿竟妗嗭紝鍚﹀垯浼氶�犳垚鍥涜鏈夋瘺鍒虹幇璞�
+		showHairLineBorder() {
+			if (['primary', 'success', 'error', 'warning'].indexOf(this.type) >= 0 && !this.plain) {
+				return '';
+			} else {
+				return 'u-hairline-border';
+			}
+		}
+	},
+	data() {
+		return {
+			rippleTop: 0, // 姘存尝绾圭殑璧风偣Y鍧愭爣鍒版寜閽笂杈圭晫鐨勮窛绂�
+			rippleLeft: 0, // 姘存尝绾硅捣鐐筙鍧愭爣鍒版寜閽乏杈圭晫鐨勮窛绂�
+			fields: {}, // 娉㈢汗鎸夐挳鑺傜偣淇℃伅
+			waveActive: false // 婵�娲绘按娉㈢汗
+		};
+	},
+	methods: {
+		// 鎸夐挳鐐瑰嚮
+		click(e) {
+			// 杩涜鑺傛祦鎺у埗锛屾瘡this.throttle姣鍐咃紝鍙湪寮�濮嬪鎵ц
+			this.$u.throttle(() => {
+				// 濡傛灉鎸夐挳鏃禿isabled鍜宭oading鐘舵�侊紝涓嶈Е鍙戞按娉㈢汗鏁堟灉
+				if (this.loading === true || this.disabled === true) return;
+				// 鏄惁寮�鍚按娉㈢汗鏁堟灉
+				if (this.ripple) {
+					// 姣忔鐐瑰嚮鏃讹紝绉婚櫎涓婁竴娆$殑绫伙紝鍐嶆娣诲姞锛屾墠鑳借Е鍙戝姩鐢绘晥鏋�
+					this.waveActive = false;
+					this.$nextTick(function() {
+						this.getWaveQuery(e);
+					});
+				}
+				this.$emit('click', e);
+			}, this.throttleTime);
+		},
+		// 鏌ヨ鎸夐挳鐨勮妭鐐逛俊鎭�
+		getWaveQuery(e) {
+			this.getElQuery().then(res => {
+				// 鏌ヨ杩斿洖鐨勬槸涓�涓暟缁勮妭鐐�
+				let data = res[0];
+				// 鏌ヨ涓嶅埌鑺傜偣淇℃伅锛屼笉鎿嶄綔
+				if (!data.width || !data.width) return;
+				// 姘存尝绾圭殑鏈�缁堝舰鎬佹槸涓�涓鏂瑰舰(閫氳繃border-radius璁╁叾鍙樹负涓�涓渾褰�)锛岃繖閲岃淇濊瘉姝f柟褰㈢殑杈归暱绛変簬鎸夐挳鐨勬渶闀胯竟
+				// 鏈�缁堢殑鏂瑰舰锛堝彉鎹㈠悗鐨勫渾褰級鎵嶈兘瑕嗙洊鏁翠釜鎸夐挳
+				data.targetWidth = data.height > data.width ? data.height : data.width;
+				if (!data.targetWidth) return;
+				this.fields = data;
+				let touchesX = '',
+					touchesY = '';
+				// #ifdef MP-BAIDU
+				touchesX = e.changedTouches[0].clientX;
+				touchesY = e.changedTouches[0].clientY;
+				// #endif
+				// #ifdef MP-ALIPAY
+				touchesX = e.detail.clientX;
+				touchesY = e.detail.clientY;
+				// #endif
+				// #ifndef MP-BAIDU || MP-ALIPAY
+				touchesX = e.touches[0].clientX;
+				touchesY = e.touches[0].clientY;
+				// #endif
+				// 鑾峰彇瑙︽懜鐐圭浉瀵逛簬鎸夐挳涓婅竟鍜屽乏杈圭殑x鍜寉鍧愭爣锛屽師鐞嗘槸閫氳繃灞忓箷鐨勮Е鎽哥偣锛坱ouchesY锛夛紝鍑忓幓鎸夐挳鐨勪笂杈圭晫data.top
+				// 浣嗘槸鐢变簬`transform-origin`榛樿鏄痗enter锛屾墍浠ヨ繖閲屽啀鍑忓幓鍗婂緞鎵嶆槸姘存尝绾箆iew搴旇鐨勪綅缃�
+				// 鎬荤殑鏉ヨ锛屽氨鏄妸姘存尝绾圭殑鐭╁舰锛堝彉鎹㈠悗鐨勫渾褰級鐨勪腑蹇冪偣锛岀Щ鍔ㄥ埌鎴戜滑鐨勮Е鎽哥偣浣嶇疆
+				this.rippleTop = touchesY - data.top - data.targetWidth / 2;
+				this.rippleLeft = touchesX - data.left - data.targetWidth / 2;
+				this.$nextTick(() => {
+					this.waveActive = true;
+				});
+			});
+		},
+		// 鑾峰彇鑺傜偣淇℃伅
+		getElQuery() {
+			return new Promise(resolve => {
+				let queryInfo = '';
+				// 鑾峰彇鍏冪礌鑺傜偣淇℃伅锛岃鏌ョ湅uniapp鐩稿叧鏂囨。
+				// https://uniapp.dcloud.io/api/ui/nodes-info?id=nodesrefboundingclientrect
+				queryInfo = uni.createSelectorQuery().in(this);
+				//#ifdef MP-ALIPAY
+				queryInfo = uni.createSelectorQuery();
+				//#endif
+				queryInfo.select('.u-btn').boundingClientRect();
+				queryInfo.exec(data => {
+					resolve(data);
+				});
+			});
+		},
+		// 涓嬮潰涓哄鎺niapp瀹樻柟鎸夐挳寮�鏀捐兘鍔涗簨浠跺洖璋冪殑瀵规帴
+		getphonenumber(res) {
+			this.$emit('getphonenumber', res);
+		},
+		getuserinfo(res) {
+			this.$emit('getuserinfo', res);
+		},
+		error(res) {
+			this.$emit('error', res);
+		},
+		opensetting(res) {
+			this.$emit('opensetting', res);
+		},
+		launchapp(res) {
+			this.$emit('launchapp', res);
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import '../../libs/css/style.components.scss';
+.u-btn::after {
+	border: none;
+}
+
+.u-btn {
+	position: relative;
+	border: 0;
+	//border-radius: 10rpx;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	// 閬垮厤杈规鏌愪簺鍦烘櫙鍙兘琚�滆鍓�濓紝涓嶈兘璁剧疆涓篽idden
+	overflow: visible;
+	line-height: 1;
+	@include vue-flex;
+	align-items: center;
+	justify-content: center;
+	cursor: pointer;
+	padding: 0 40rpx;
+	z-index: 1;
+	box-sizing: border-box;
+	transition: all 0.15s;
+	
+	&--bold-border {
+		border: 1px solid #ffffff;
+	}
+	
+	&--default {
+		color: $u-content-color;
+		border-color: #c0c4cc;
+		background-color: #ffffff;
+	}
+	
+	&--primary {
+		color: #ffffff;
+		border-color: $u-type-primary;
+		background-color: $u-type-primary;
+	}
+	
+	&--success {
+		color: #ffffff;
+		border-color: $u-type-success;
+		background-color: $u-type-success;
+	}
+	
+	&--error {
+		color: #ffffff;
+		border-color: $u-type-error;
+		background-color: $u-type-error;
+	}
+	
+	&--warning {
+		color: #ffffff;
+		border-color: $u-type-warning;
+		background-color: $u-type-warning;
+	}
+	
+	&--default--disabled {
+		color: #ffffff;
+		border-color: #e4e7ed;
+		background-color: #ffffff;
+	}
+	
+	&--primary--disabled {
+		color: #ffffff!important;
+		border-color: $u-type-primary-disabled!important;
+		background-color: $u-type-primary-disabled!important;
+	}
+	
+	&--success--disabled {
+		color: #ffffff!important;
+		border-color: $u-type-success-disabled!important;
+		background-color: $u-type-success-disabled!important;
+	}
+	
+	&--error--disabled {
+		color: #ffffff!important;
+		border-color: $u-type-error-disabled!important;
+		background-color: $u-type-error-disabled!important;
+	}
+	
+	&--warning--disabled {
+		color: #ffffff!important;
+		border-color: $u-type-warning-disabled!important;
+		background-color: $u-type-warning-disabled!important;
+	}
+	
+	&--primary--plain {
+		color: $u-type-primary!important;
+		border-color: $u-type-primary-disabled!important;
+		background-color: $u-type-primary-light!important;
+	}
+	
+	&--success--plain {
+		color: $u-type-success!important;
+		border-color: $u-type-success-disabled!important;
+		background-color: $u-type-success-light!important;
+	}
+	
+	&--error--plain {
+		color: $u-type-error!important;
+		border-color: $u-type-error-disabled!important;
+		background-color: $u-type-error-light!important;
+	}
+	
+	&--warning--plain {
+		color: $u-type-warning!important;
+		border-color: $u-type-warning-disabled!important;
+		background-color: $u-type-warning-light!important;
+	}
+}
+
+.u-hairline-border:after {
+	content: ' ';
+	position: absolute;
+	pointer-events: none;
+	// 璁剧疆涓篵order-box锛屾剰鍛崇潃涓嬮潰鐨剆cale缂╁皬涓�0.5锛屽疄闄呬笂缂╁皬鐨勬槸浼厓绱犵殑鍐呭锛坆order-box鎰忓懗鐫�鍐呭涓嶅惈border锛�
+	box-sizing: border-box;
+	// 涓績鐐逛綔涓哄彉褰�(scale())鐨勫師鐐�
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	left: 0;
+	top: 0;
+	width: 199.8%;
+	height: 199.7%;
+	-webkit-transform: scale(0.5, 0.5);
+	transform: scale(0.5, 0.5);
+	border: 1px solid currentColor;
+	z-index: 1;
+}
+
+.u-wave-ripple {
+	z-index: 0;
+	position: absolute;
+	border-radius: 100%;
+	background-clip: padding-box;
+	pointer-events: none;
+	user-select: none;
+	transform: scale(0);
+	opacity: 1;
+	transform-origin: center;
+}
+
+.u-wave-ripple.u-wave-active {
+	opacity: 0;
+	transform: scale(2);
+	transition: opacity 1s linear, transform 0.4s linear;
+}
+
+.u-round-circle {
+	border-radius: 100rpx;
+}
+
+.u-round-circle::after {
+	border-radius: 100rpx;
+}
+
+.u-loading::after {
+	background-color: hsla(0, 0%, 100%, 0.35);
+}
+
+.u-size-default {
+	font-size: 30rpx;
+	height: 80rpx;
+	line-height: 80rpx;
+}
+
+.u-size-medium {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	width: auto;
+	font-size: 26rpx;
+	height: 70rpx;
+	line-height: 70rpx;
+	padding: 0 80rpx;
+}
+
+.u-size-mini {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	width: auto;
+	font-size: 22rpx;
+	padding-top: 1px;
+	height: 50rpx;
+	line-height: 50rpx;
+	padding: 0 20rpx;
+}
+
+.u-primary-plain-hover {
+	color: #ffffff !important;
+	background: $u-type-primary-dark !important;
+}
+
+.u-default-plain-hover {
+	color: $u-type-primary-dark !important;
+	background: $u-type-primary-light !important;
+}
+
+.u-success-plain-hover {
+	color: #ffffff !important;
+	background: $u-type-success-dark !important;
+}
+
+.u-warning-plain-hover {
+	color: #ffffff !important;
+	background: $u-type-warning-dark !important;
+}
+
+.u-error-plain-hover {
+	color: #ffffff !important;
+	background: $u-type-error-dark !important;
+}
+
+.u-info-plain-hover {
+	color: #ffffff !important;
+	background: $u-type-info-dark !important;
+}
+
+.u-default-hover {
+	color: $u-type-primary-dark !important;
+	border-color: $u-type-primary-dark !important;
+	background-color: $u-type-primary-light !important;
+}
+
+.u-primary-hover {
+	background: $u-type-primary-dark !important;
+	color: #fff;
+}
+
+.u-success-hover {
+	background: $u-type-success-dark !important;
+	color: #fff;
+}
+
+.u-info-hover {
+	background: $u-type-info-dark !important;
+	color: #fff;
+}
+
+.u-warning-hover {
+	background: $u-type-warning-dark !important;
+	color: #fff;
+}
+
+.u-error-hover {
+	background: $u-type-error-dark !important;
+	color: #fff;
+}
+</style>
diff --git a/uview-ui/components/u-calendar/u-calendar.vue b/uview-ui/components/u-calendar/u-calendar.vue
new file mode 100644
index 0000000..bdef3d1
--- /dev/null
+++ b/uview-ui/components/u-calendar/u-calendar.vue
@@ -0,0 +1,639 @@
+<template>
+	<u-popup closeable :maskCloseAble="maskCloseAble" mode="bottom" :popup="false" v-model="value" length="auto"
+	 :safeAreaInsetBottom="safeAreaInsetBottom" @close="close" :z-index="uZIndex" :border-radius="borderRadius" :closeable="closeable">
+		<view class="u-calendar">
+			<view class="u-calendar__header">
+				<view class="u-calendar__header__text" v-if="!$slots['tooltip']">
+					{{toolTip}}
+				</view>
+				<slot v-else name="tooltip" />
+			</view>
+			<view class="u-calendar__action u-flex u-row-center">
+				<view class="u-calendar__action__icon">
+					<u-icon v-if="changeYear" name="arrow-left-double" :color="yearArrowColor" @click="changeYearHandler(0)"></u-icon>
+				</view>
+				<view class="u-calendar__action__icon">
+					<u-icon v-if="changeMonth" name="arrow-left" :color="monthArrowColor" @click="changeMonthHandler(0)"></u-icon>
+				</view>
+				<view class="u-calendar__action__text">{{ showTitle }}</view>
+				<view class="u-calendar__action__icon">
+					<u-icon v-if="changeMonth" name="arrow-right" :color="monthArrowColor" @click="changeMonthHandler(1)"></u-icon>
+				</view>
+				<view class="u-calendar__action__icon">
+					<u-icon v-if="changeYear" name="arrow-right-double" :color="yearArrowColor" @click="changeYearHandler(1)"></u-icon>
+				</view>
+			</view>
+			<view class="u-calendar__week-day">
+				<view class="u-calendar__week-day__text" v-for="(item, index) in weekDayZh" :key="index">{{item}}</view>
+			</view>
+			<view class="u-calendar__content">
+				<!-- 鍓嶇疆绌虹櫧閮ㄥ垎 -->
+				<block v-for="(item, index) in weekdayArr" :key="index">
+					<view class="u-calendar__content__item"></view>
+				</block>
+				<view class="u-calendar__content__item" :class="{
+					'u-hover-class':openDisAbled(year,month,index+1),
+					'u-calendar__content--start-date': (mode == 'range' && startDate==`${year}-${month}-${index+1}`) || mode== 'date',
+					'u-calendar__content--end-date':(mode== 'range' && endDate==`${year}-${month}-${index+1}`) || mode == 'date'
+				}" :style="{backgroundColor: getColor(index,1)}" v-for="(item, index) in daysArr" :key="index"
+				 @tap="dateClick(index)">
+					<view class="u-calendar__content__item__inner" :style="{color: getColor(index,2)}">
+						<view>{{ index + 1 }}</view>
+					</view>
+					<view class="u-calendar__content__item__tips" :style="{color:activeColor}" v-if="mode== 'range' && startDate==`${year}-${month}-${index+1}` && startDate!=endDate">{{startText}}</view>
+					<view class="u-calendar__content__item__tips" :style="{color:activeColor}" v-if="mode== 'range' && endDate==`${year}-${month}-${index+1}`">{{endText}}</view>
+				</view>
+				<view class="u-calendar__content__bg-month">{{month}}</view>
+			</view>
+			<view class="u-calendar__bottom">
+				<view class="u-calendar__bottom__choose">
+					<text>{{mode == 'date' ? activeDate : startDate}}</text>
+					<text v-if="endDate">鑷硔{endDate}}</text>
+				</view>
+				<view class="u-calendar__bottom__btn">
+					<u-button :type="btnType" shape="circle" size="default" @click="btnFix(false)">纭畾</u-button>
+				</view>
+			</view>
+		</view>
+	</u-popup>
+</template>
+<script>
+	/**
+	 * calendar 鏃ュ巻
+	 * @description 姝ょ粍浠剁敤浜庡崟涓�夋嫨鏃ユ湡锛岃寖鍥撮�夋嫨鏃ユ湡绛夛紝鏃ュ巻琚寘瑁瑰湪搴曢儴寮硅捣鐨勫鍣ㄤ腑銆�
+	 * @tutorial http://uviewui.com/components/calendar.html
+	 * @property {String} mode 閫夋嫨鏃ユ湡鐨勬ā寮忥紝date-涓哄崟涓棩鏈燂紝range-涓洪�夋嫨鏃ユ湡鑼冨洿
+	 * @property {Boolean} v-model 甯冨皵鍊煎彉閲忥紝鐢ㄤ簬鎺у埗鏃ュ巻鐨勫脊鍑轰笌鏀惰捣
+	 * @property {Boolean} safe-area-inset-bottom 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤(榛樿false)
+	 * @property {Boolean} change-year 鏄惁鏄剧ず椤堕儴鐨勫垏鎹㈠勾浠芥柟鍚戠殑鎸夐挳(榛樿true)
+	 * @property {Boolean} change-month 鏄惁鏄剧ず椤堕儴鐨勫垏鎹㈡湀浠芥柟鍚戠殑鎸夐挳(榛樿true)
+	 * @property {String Number} max-year 鍙垏鎹㈢殑鏈�澶у勾浠�(榛樿2050)
+	 * @property {String Number} min-year 鍙垏鎹㈢殑鏈�灏忓勾浠�(榛樿1950)
+	 * @property {String Number} min-date 鏈�灏忓彲閫夋棩鏈�(榛樿1950-01-01)
+	 * @property {String Number} max-date 鏈�澶у彲閫夋棩鏈�(榛樿褰撳墠鏃ユ湡)
+	 * @property {String Number} 寮圭獥椤堕儴宸﹀彸涓よ竟鐨勫渾瑙掑�硷紝鍗曚綅rpx(榛樿20)
+	 * @property {Boolean} mask-close-able 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴鏃ュ巻(榛樿true)
+	 * @property {String} month-arrow-color 鏈堜唤鍒囨崲鎸夐挳绠ご棰滆壊(榛樿#606266)
+	 * @property {String} year-arrow-color 骞翠唤鍒囨崲鎸夐挳绠ご棰滆壊(榛樿#909399)
+	 * @property {String} color 鏃ユ湡瀛椾綋鐨勯粯璁ら鑹�(榛樿#303133)
+	 * @property {String} active-bg-color 璧峰/缁撴潫鏃ユ湡鎸夐挳鐨勮儗鏅壊(榛樿#497bff)
+	 * @property {String Number} z-index 寮瑰嚭鏃剁殑z-index鍊�(榛樿10075)
+	 * @property {String} active-color 璧峰/缁撴潫鏃ユ湡鎸夐挳鐨勫瓧浣撻鑹�(榛樿#ffffff)
+	 * @property {String} range-bg-color 璧峰/缁撴潫鏃ユ湡涔嬮棿鐨勫尯鍩熺殑鑳屾櫙棰滆壊(榛樿rgba(41,121,255,0.13))
+	 * @property {String} range-color 閫夋嫨鑼冨洿鍐呭瓧浣撻鑹�(榛樿#497bff)
+	 * @property {String} start-text 璧峰鏃ユ湡搴曢儴鐨勬彁绀烘枃瀛�(榛樿 '寮�濮�')
+	 * @property {String} end-text 缁撴潫鏃ユ湡搴曢儴鐨勬彁绀烘枃瀛�(榛樿 '缁撴潫')
+	 * @property {String} btn-type 搴曢儴纭畾鎸夐挳鐨勪富棰�(榛樿 'primary')
+	 * @property {String} toolTip 椤堕儴鎻愮ず鏂囧瓧锛屽璁剧疆鍚嶄负tooltip鐨剆lot锛屾鍙傛暟灏嗗け鏁�(榛樿 '閫夋嫨鏃ユ湡')
+	 * @property {Boolean} closeable 鏄惁鏄剧ず鍙充笂瑙掔殑鍏抽棴鍥炬爣(榛樿true)
+	 * @example <u-calendar v-model="show" :mode="mode"></u-calendar>
+	 */
+	
+	export default {
+		name: 'u-calendar',
+		props: {
+			safeAreaInsetBottom: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴Picker
+			maskCloseAble: {
+				type: Boolean,
+				default: true
+			},
+			// 閫氳繃鍙屽悜缁戝畾鎺у埗缁勪欢鐨勫脊鍑轰笌鏀惰捣
+			value: {
+				type: Boolean,
+				default: false
+			},
+			// 寮瑰嚭鐨剒-index鍊�
+			zIndex: {
+				type: [String, Number],
+				default: 0
+			},
+			// 鏄惁鍏佽鍒囨崲骞翠唤
+			changeYear: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鍏佽鍒囨崲鏈堜唤
+			changeMonth: {
+				type: Boolean,
+				default: true
+			},
+			// date-鍗曚釜鏃ユ湡閫夋嫨锛宺ange-寮�濮嬫棩鏈�+缁撴潫鏃ユ湡閫夋嫨
+			mode: {
+				type: String,
+				default: 'date'
+			},
+			// 鍙垏鎹㈢殑鏈�澶у勾浠�
+			maxYear: {
+				type: [Number, String],
+				default: 2050
+			},
+			// 鍙垏鎹㈢殑鏈�灏忓勾浠�
+			minYear: {
+				type: [Number, String],
+				default: 1950
+			},
+			// 鏈�灏忓彲閫夋棩鏈�(涓嶅湪鑼冨洿鍐呮棩鏈熺鐢ㄤ笉鍙��)
+			minDate: {
+				type: [Number, String],
+				default: '1950-01-01'
+			},
+			/**
+			 * 鏈�澶у彲閫夋棩鏈�
+			 * 榛樿鏈�澶у�间负浠婂ぉ锛屼箣鍚庣殑鏃ユ湡涓嶅彲閫�
+			 * 2030-12-31
+			 * */
+			maxDate: {
+				type: [Number, String],
+				default: ''
+			},
+			// 寮圭獥椤堕儴宸﹀彸涓よ竟鐨勫渾瑙掑��
+			borderRadius: {
+				type: [String, Number],
+				default: 20
+			},
+			// 鏈堜唤鍒囨崲鎸夐挳绠ご棰滆壊
+			monthArrowColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 骞翠唤鍒囨崲鎸夐挳绠ご棰滆壊
+			yearArrowColor: {
+				type: String,
+				default: '#909399'
+			},
+			// 榛樿鏃ユ湡瀛椾綋棰滆壊
+			color: {
+				type: String,
+				default: '#303133'
+			},
+			// 閫変腑|璧峰缁撴潫鏃ユ湡鑳屾櫙鑹�
+			activeBgColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 閫変腑|璧峰缁撴潫鏃ユ湡瀛椾綋棰滆壊
+			activeColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// 鑼冨洿鍐呮棩鏈熻儗鏅壊
+			rangeBgColor: {
+				type: String,
+				default: 'rgba(41,121,255,0.13)'
+			}, 
+			// 鑼冨洿鍐呮棩鏈熷瓧浣撻鑹�
+			rangeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// mode=range鏃剁敓鏁堬紝璧峰鏃ユ湡鑷畾涔夋枃妗�
+			startText: {
+				type: String,
+				default: '寮�濮�'
+			},
+			// mode=range鏃剁敓鏁堬紝缁撴潫鏃ユ湡鑷畾涔夋枃妗�
+			endText: {
+				type: String,
+				default: '缁撴潫'
+			},
+			//鎸夐挳鏍峰紡绫诲瀷
+			btnType: {
+				type: String,
+				default: 'primary'
+			},
+			// 褰撳墠閫変腑鏃ユ湡甯﹂�変腑鏁堟灉
+			isActiveCurrent: {
+				type: Boolean,
+				default: true
+			},
+			// 鍒囨崲骞存湀鏄惁瑙﹀彂浜嬩欢 mode=date鏃剁敓鏁�
+			isChange: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鏄剧ず鍙充笂瑙掔殑鍏抽棴鍥炬爣
+			closeable: {
+				type: Boolean,
+				default: true
+			},
+			// 椤堕儴鐨勬彁绀烘枃瀛�
+			toolTip: {
+				type: String,
+				default: '閫夋嫨鏃ユ湡'
+			}
+		},
+		data() {
+			return {
+				// 鏄熸湡鍑�,鍊间负1-7
+				weekday: 1, 
+				weekdayArr:[],
+				// 褰撳墠鏈堟湁澶氬皯澶�
+				days: 0, 
+				daysArr:[],
+				showTitle: '',
+				year: 2020,
+				month: 0,
+				day: 0,
+				startYear: 0,
+				startMonth: 0,
+				startDay: 0,
+				endYear: 0,
+				endMonth: 0,
+				endDay: 0,
+				today: '',
+				activeDate: '',
+				startDate: '',
+				endDate: '',
+				isStart: true,
+				min: null,
+				max: null,
+				weekDayZh: ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�']
+			};
+		},
+		computed: {
+			dataChange() {
+				return `${this.mode}-${this.minDate}-${this.maxDate}`;
+			},
+			uZIndex() {
+				// 濡傛灉鐢ㄦ埛鏈変紶閫抸-index鍊硷紝浼樺厛浣跨敤
+				return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+			}
+		},
+		watch: {
+			dataChange(val) {
+				this.init()
+			}
+		},
+		created() {
+			this.init()
+		},
+		methods: {
+			getColor(index, type) {
+				let color = type == 1 ? '' : this.color;
+				let day = index + 1
+				let date = `${this.year}-${this.month}-${day}`
+				let timestamp = new Date(date.replace(/\-/g, '/')).getTime();
+				let start = this.startDate.replace(/\-/g, '/')
+				let end = this.endDate.replace(/\-/g, '/')
+				if ((this.isActiveCurrent && this.activeDate == date) || this.startDate == date || this.endDate == date) {
+					color = type == 1 ? this.activeBgColor : this.activeColor;
+				} else if (this.endDate && timestamp > new Date(start).getTime() && timestamp < new Date(end).getTime()) {
+					color = type == 1 ? this.rangeBgColor : this.rangeColor;
+				}
+				return color;
+			},
+			init() {
+				let now = new Date();
+				this.year = now.getFullYear();
+				this.month = now.getMonth() + 1;
+				this.day = now.getDate();
+				this.today = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
+				this.activeDate = this.today;
+				this.min = this.initDate(this.minDate);
+				this.max = this.initDate(this.maxDate || this.today);
+				this.startDate = "";
+				this.startYear = 0;
+				this.startMonth = 0;
+				this.startDay = 0;
+				this.endYear = 0;
+				this.endMonth = 0;
+				this.endDay = 0;
+				this.endDate = "";
+				this.isStart = true;
+				this.changeData();
+			},
+			//鏃ユ湡澶勭悊
+			initDate(date) {
+				let fdate = date.split('-');
+				return {
+					year: Number(fdate[0] || 1920),
+					month: Number(fdate[1] || 1),
+					day: Number(fdate[2] || 1)
+				}
+			},
+			openDisAbled: function(year, month, day) {
+				let bool = true;
+				let date = `${year}/${month}/${day}`;
+				// let today = this.today.replace(/\-/g, '/');
+				let min = `${this.min.year}/${this.min.month}/${this.min.day}`;
+				let max = `${this.max.year}/${this.max.month}/${this.max.day}`;
+				let timestamp = new Date(date).getTime();
+				if (timestamp >= new Date(min).getTime() && timestamp <= new Date(max).getTime()) {
+					bool = false;
+				}
+				return bool;
+			},
+			generateArray: function(start, end) {
+				return Array.from(new Array(end + 1).keys()).slice(start);
+			},
+			formatNum: function(num) {
+				return num < 10 ? '0' + num : num + '';
+			},
+			//涓�涓湀鏈夊灏戝ぉ
+			getMonthDay(year, month) {
+				let days = new Date(year, month, 0).getDate();
+				return days;
+			},
+			getWeekday(year, month) {
+				let date = new Date(`${year}/${month}/01 00:00:00`);
+				return date.getDay();
+			},
+			checkRange(year) {
+				let overstep = false;
+				if (year < this.minYear || year > this.maxYear) {
+					uni.showToast({
+						title: "鏃ユ湡瓒呭嚭鑼冨洿鍟",
+						icon: 'none'
+					})
+					overstep = true;
+				}
+				return overstep;
+			},
+			changeMonthHandler(isAdd) {
+				if (isAdd) {
+					let month = this.month + 1;
+					let year = month > 12 ? this.year + 1 : this.year;
+					if (!this.checkRange(year)) {
+						this.month = month > 12 ? 1 : month;
+						this.year = year;
+						this.changeData();
+					}
+
+				} else {
+					let month = this.month - 1;
+					let year = month < 1 ? this.year - 1 : this.year;
+					if (!this.checkRange(year)) {
+						this.month = month < 1 ? 12 : month;
+						this.year = year;
+						this.changeData();
+					}
+				}
+			},
+			changeYearHandler(isAdd) {
+				let year = isAdd ? this.year + 1 : this.year - 1;
+				if (!this.checkRange(year)) {
+					this.year = year;
+					this.changeData();
+				}
+			},
+			changeData() {
+				this.days = this.getMonthDay(this.year, this.month);
+				this.daysArr=this.generateArray(1,this.days)
+				this.weekday = this.getWeekday(this.year, this.month);
+				this.weekdayArr=this.generateArray(1,this.weekday)
+				this.showTitle = `${this.year}骞�${this.month}鏈坄;
+				if (this.isChange && this.mode == 'date') {
+					this.btnFix(true);
+				}
+			},
+			dateClick: function(day) {
+				day += 1;
+				if (!this.openDisAbled(this.year, this.month, day)) {
+					this.day = day;
+					let date = `${this.year}-${this.month}-${day}`;
+					if (this.mode == 'date') {
+						this.activeDate = date;
+					} else {
+						let compare = new Date(date.replace(/\-/g, '/')).getTime() < new Date(this.startDate.replace(/\-/g, '/')).getTime()
+						if (this.isStart || compare) {
+							this.startDate = date;
+							this.startYear = this.year;
+							this.startMonth = this.month;
+							this.startDay = this.day;
+							this.endYear = 0;
+							this.endMonth = 0;
+							this.endDay = 0;
+							this.endDate = "";
+							this.activeDate = "";
+							this.isStart = false;
+						} else {
+							this.endDate = date;
+							this.endYear = this.year;
+							this.endMonth = this.month;
+							this.endDay = this.day;
+							this.isStart = true;
+						}
+					}
+				}
+			},
+			close() {
+				// 淇敼閫氳繃v-model缁戝畾鐨勭埗缁勪欢鍙橀噺鐨勫�间负false锛屼粠鑰岄殣钘忔棩鍘嗗脊绐�
+				this.$emit('input', false);
+			},
+			getWeekText(date) {
+				date = new Date(`${date.replace(/\-/g, '/')} 00:00:00`);
+				let week = date.getDay();
+				return '鏄熸湡' + ['鏃�', '涓�', '浜�', '涓�', '鍥�', '浜�', '鍏�'][week];
+			},
+			btnFix(show) {
+				if (!show) {
+					this.close();
+				}
+				if (this.mode == 'date') {
+					let arr = this.activeDate.split('-')
+					let year = this.isChange ? this.year : Number(arr[0]);
+					let month = this.isChange ? this.month : Number(arr[1]);
+					let day = this.isChange ? this.day : Number(arr[2]);
+					//褰撳墠鏈堟湁澶氬皯澶�
+					let days = this.getMonthDay(year, month);
+					let result = `${year}-${this.formatNum(month)}-${this.formatNum(day)}`;
+					let weekText = this.getWeekText(result);
+					let isToday = false;
+					if (`${year}-${month}-${day}` == this.today) {
+						//浠婂ぉ
+						isToday = true;
+					}
+					this.$emit('change', {
+						year: year,
+						month: month,
+						day: day,
+						days: days,
+						result: result,
+						week: weekText,
+						isToday: isToday,
+						// switch: show //鏄惁鏄垏鎹㈠勾鏈堟搷浣�
+					});
+				} else {
+					if (!this.startDate || !this.endDate) return;
+					let startMonth = this.formatNum(this.startMonth);
+					let startDay = this.formatNum(this.startDay);
+					let startDate = `${this.startYear}-${startMonth}-${startDay}`;
+					let startWeek = this.getWeekText(startDate)
+
+					let endMonth = this.formatNum(this.endMonth);
+					let endDay = this.formatNum(this.endDay);
+					let endDate = `${this.endYear}-${endMonth}-${endDay}`;
+					let endWeek = this.getWeekText(endDate);
+					this.$emit('change', {
+						startYear: this.startYear,
+						startMonth: this.startMonth,
+						startDay: this.startDay,
+						startDate: startDate,
+						startWeek: startWeek,
+						endYear: this.endYear,
+						endMonth: this.endMonth,
+						endDay: this.endDay,
+						endDate: endDate,
+						endWeek: endWeek
+					});
+				}
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	.u-calendar {
+		color: $u-content-color;
+		
+		&__header {
+			width: 100%;
+			box-sizing: border-box;
+			font-size: 30rpx;
+			background-color: #fff;
+			color: $u-main-color;
+			
+			&__text {
+				margin-top: 30rpx;
+				padding: 0 60rpx;
+				@include vue-flex;
+				justify-content: center;
+				align-items: center;
+			}
+		}
+		
+		&__action {
+			padding: 40rpx 0 40rpx 0;
+			
+			&__icon {
+				margin: 0 16rpx;
+			}
+			
+			&__text {
+				padding: 0 16rpx;
+				color: $u-main-color;
+				font-size: 32rpx;
+				line-height: 32rpx;
+				font-weight: bold;
+			}
+		}
+	
+		&__week-day {
+			@include vue-flex;
+			align-items: center;
+			justify-content: center;
+			padding: 6px 0;
+			overflow: hidden;
+			
+			&__text {
+				flex: 1;
+				text-align: center;
+			}
+		}
+	
+		&__content {
+			width: 100%;
+			@include vue-flex;
+			flex-wrap: wrap;
+			padding: 6px 0;
+			box-sizing: border-box;
+			background-color: #fff;
+			position: relative;
+			
+			&--end-date {
+				border-top-right-radius: 8rpx;
+				border-bottom-right-radius: 8rpx;
+			}
+			
+			&--start-date {
+				border-top-left-radius: 8rpx;
+				border-bottom-left-radius: 8rpx;
+			}
+			
+			&__item {
+				width: 14.2857%;
+				@include vue-flex;
+				align-items: center;
+				justify-content: center;
+				padding: 6px 0;
+				overflow: hidden;
+				position: relative;
+				z-index: 2;
+				
+				&__inner {
+					height: 84rpx;
+					@include vue-flex;
+					align-items: center;
+					justify-content: center;
+					flex-direction: column;
+					font-size: 32rpx;
+					position: relative;
+					border-radius: 50%;
+					
+					&__desc {
+						width: 100%;
+						font-size: 24rpx;
+						line-height: 24rpx;
+						transform: scale(0.75);
+						transform-origin: center center;
+						position: absolute;
+						left: 0;
+						text-align: center;
+						bottom: 2rpx;
+					}
+				}
+				
+				&__tips {
+					width: 100%;
+					font-size: 24rpx;
+					line-height: 24rpx;
+					position: absolute;
+					left: 0;
+					transform: scale(0.8);
+					transform-origin: center center;
+					text-align: center;
+					bottom: 8rpx;
+					z-index: 2;
+				}
+			}
+			
+			&__bg-month {
+				position: absolute;
+				font-size: 130px;
+				line-height: 130px;
+				left: 50%;
+				top: 50%;
+				transform: translate(-50%, -50%);
+				color: #e4e7ed;
+				z-index: 1;
+			}
+		}
+	
+		&__bottom {
+			width: 100%;
+			@include vue-flex;
+			align-items: center;
+			justify-content: center;
+			flex-direction: column;
+			background-color: #fff;
+			padding: 0 40rpx 30rpx;
+			box-sizing: border-box;
+			font-size: 24rpx;
+			color: $u-tips-color;
+			
+			&__choose {
+				height: 50rpx;
+			}
+			
+			&__btn {
+				width: 100%;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/uview-ui/components/u-car-keyboard/u-car-keyboard.vue b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue
new file mode 100644
index 0000000..84b1467
--- /dev/null
+++ b/uview-ui/components/u-car-keyboard/u-car-keyboard.vue
@@ -0,0 +1,257 @@
+<template>
+	<view class="u-keyboard" @touchmove.stop.prevent="() => {}">
+		<view class="u-keyboard-grids">
+			<block>
+				<view class="u-keyboard-grids-item" v-for="(group, i) in abc ? EngKeyBoardList : areaList" :key="i">
+					<view :hover-stay-time="100" @tap="carInputClick(i, j)" hover-class="u-carinput-hover" class="u-keyboard-grids-btn"
+					 v-for="(item, j) in group" :key="j">
+						{{ item }}
+					</view>
+				</view>
+				<view @touchstart="backspaceClick" @touchend="clearTimer" :hover-stay-time="100" class="u-keyboard-back"
+				 hover-class="u-hover-class">
+					<u-icon :size="38" name="backspace" :bold="true"></u-icon>
+				</view>
+				<view :hover-stay-time="100" class="u-keyboard-change" hover-class="u-carinput-hover" @tap="changeCarInputMode">
+					<text class="zh" :class="[!abc ? 'active' : 'inactive']">涓�</text>
+					/
+					<text class="en" :class="[abc ? 'active' : 'inactive']">鑻�</text>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "u-keyboard",
+		props: {
+			// 鏄惁鎵撲贡閿洏鎸夐敭鐨勯『搴�
+			random: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				// 杞︾墝杈撳叆鏃讹紝abc=true涓鸿緭鍏ヨ溅鐗屽彿鐮侊紝bac=false涓鸿緭鍏ョ渷浠戒腑鏂囩畝绉�
+				abc: false
+			};
+		},
+		computed: {
+			areaList() {
+				let data = [
+					'浜�',
+					'娌�',
+					'绮�',
+					'娲�',
+					'鍐�',
+					'璞�',
+					'浜�',
+					'杈�',
+					'榛�',
+					'婀�',
+					'鐨�',
+					'椴�',
+					'鑻�',
+					'娴�',
+					'璧�',
+					'閯�',
+					'妗�',
+					'鐢�',
+					'鏅�',
+					'闄�',
+					'钂�',
+					'鍚�',
+					'闂�',
+					'璐�',
+					'娓�',
+					'宸�',
+					'闈�',
+					'鐞�',
+					'瀹�',
+					'鎸�',
+					'钘�',
+					'娓�',
+					'婢�',
+					'鏂�',
+					'浣�',
+					'瀛�'
+				];
+				let tmp = [];
+				// 鎵撲贡椤哄簭
+				if (this.random) data = this.$u.randomArray(data);
+				// 鍒囧壊鎴愪簩缁存暟缁�
+				tmp[0] = data.slice(0, 10);
+				tmp[1] = data.slice(10, 20);
+				tmp[2] = data.slice(20, 30);
+				tmp[3] = data.slice(30, 36);
+				return tmp;
+			},
+			EngKeyBoardList() {
+				let data = [
+					1,
+					2,
+					3,
+					4,
+					5,
+					6,
+					7,
+					8,
+					9,
+					0,
+					'Q',
+					'W',
+					'E',
+					'R',
+					'T',
+					'Y',
+					'U',
+					'I',
+					'O',
+					'P',
+					'A',
+					'S',
+					'D',
+					'F',
+					'G',
+					'H',
+					'J',
+					'K',
+					'L',
+					'Z',
+					'X',
+					'C',
+					'V',
+					'B',
+					'N',
+					'M'
+				];
+				let tmp = [];
+				if (this.random) data = this.$u.randomArray(data);
+				tmp[0] = data.slice(0, 10);
+				tmp[1] = data.slice(10, 20);
+				tmp[2] = data.slice(20, 30);
+				tmp[3] = data.slice(30, 36);
+				return tmp;
+			}
+		},
+		methods: {
+			// 鐐瑰嚮閿洏鎸夐挳
+			carInputClick(i, j) {
+				let value = '';
+				// 涓嶅悓妯″紡锛岃幏鍙栦笉鍚屾暟缁勭殑鍊�
+				if (this.abc) value = this.EngKeyBoardList[i][j];
+				else value = this.areaList[i][j];
+				this.$emit('change', value);
+			},
+			// 淇敼姹借溅鐗岄敭鐩樼殑杈撳叆妯″紡锛屼腑鏂噟鑻辨枃
+			changeCarInputMode() {
+				this.abc = !this.abc;
+			},
+			// 鐐瑰嚮閫�鏍奸敭
+			backspaceClick() {
+				this.$emit('backspace');
+				clearInterval(this.timer); //鍐嶆娓呯┖瀹氭椂鍣紝闃叉閲嶅娉ㄥ唽瀹氭椂鍣�
+				this.timer = null;
+				this.timer = setInterval(() => {
+					this.$emit('backspace');
+				}, 250);
+			},
+			clearTimer() {
+				clearInterval(this.timer);
+				this.timer = null;
+			},
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-keyboard-grids {
+		background: rgb(215, 215, 217);
+		padding: 24rpx 0;
+		position: relative;
+	}
+
+	.u-keyboard-grids-item {
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.u-keyboard-grids-btn {
+		text-decoration: none;
+		width: 62rpx;
+		flex: 0 0 64rpx;
+		height: 80rpx;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
+		font-size: 36rpx;
+		text-align: center;
+		line-height: 80rpx;
+		background-color: #fff;
+		margin: 8rpx 5rpx;
+		border-radius: 8rpx;
+		box-shadow: 0 2rpx 0rpx #888992;
+		font-weight: 500;
+		justify-content: center;
+	}
+
+	.u-carinput-hover {
+		background-color: rgb(185, 188, 195) !important;
+	}
+
+	.u-keyboard-back {
+		position: absolute;
+		width: 96rpx;
+		right: 22rpx;
+		bottom: 32rpx;
+		height: 80rpx;
+		background-color: rgb(185, 188, 195);
+		@include vue-flex;
+		align-items: center;
+		border-radius: 8rpx;
+		justify-content: center;
+		box-shadow: 0 2rpx 0rpx #888992;
+	}
+
+	.u-keyboard-change {
+		font-size: 24rpx;
+		box-shadow: 0 2rpx 0rpx #888992;
+		position: absolute;
+		width: 96rpx;
+		left: 22rpx;
+		line-height: 1;
+		bottom: 32rpx;
+		height: 80rpx;
+		background-color: #ffffff;
+		@include vue-flex;
+		align-items: center;
+		border-radius: 8rpx;
+		justify-content: center;
+	}
+
+	.u-keyboard-change .inactive.zh {
+		transform: scale(0.85) translateY(-10rpx);
+	}
+
+	.u-keyboard-change .inactive.en {
+		transform: scale(0.85) translateY(10rpx);
+	}
+
+	.u-keyboard-change .active {
+		color: rgb(237, 112, 64);
+		font-size: 30rpx;
+	}
+
+	.u-keyboard-change .zh {
+		transform: translateY(-10rpx);
+	}
+
+	.u-keyboard-change .en {
+		transform: translateY(10rpx);
+	}
+</style>
diff --git a/uview-ui/components/u-card/u-card.vue b/uview-ui/components/u-card/u-card.vue
new file mode 100644
index 0000000..a3cb2aa
--- /dev/null
+++ b/uview-ui/components/u-card/u-card.vue
@@ -0,0 +1,299 @@
+<template>
+	<view
+		class="u-card"
+		@tap.stop="click"
+		:class="{ 'u-border': border, 'u-card-full': full, 'u-card--border': borderRadius > 0 }"
+		:style="{
+			borderRadius: borderRadius + 'rpx',
+			margin: margin,
+			boxShadow: boxShadow
+		}"
+	>
+		<view
+			v-if="showHead"
+			class="u-card__head"
+			:style="[{padding: padding + 'rpx'}, headStyle]"
+			:class="{
+				'u-border-bottom': headBorderBottom
+			}"
+			@tap="headClick"
+		>
+			<view v-if="!$slots.head" class="u-flex u-row-between">
+				<view class="u-card__head--left u-flex u-line-1" v-if="title">
+					<image
+						:src="thumb"
+						class="u-card__head--left__thumb"
+						mode="aspectfull"
+						v-if="thumb"
+						:style="{ 
+							height: thumbWidth + 'rpx', 
+							width: thumbWidth + 'rpx', 
+							borderRadius: thumbCircle ? '100rpx' : '6rpx' 
+						}"
+					></image>
+					<text
+						class="u-card__head--left__title u-line-1"
+						:style="{
+							fontSize: titleSize + 'rpx',
+							color: titleColor
+						}"
+					>
+						{{ title }}
+					</text>
+				</view>
+				<view class="u-card__head--right u-line-1" v-if="subTitle">
+					<text
+						class="u-card__head__title__text"
+						:style="{
+							fontSize: subTitleSize + 'rpx',
+							color: subTitleColor
+						}"
+					>
+						{{ subTitle }}
+					</text>
+				</view>
+			</view>
+			<slot name="head" v-else />
+		</view>
+		<view @tap="bodyClick" class="u-card__body" :style="[{padding: padding + 'rpx'}, bodyStyle]"><slot name="body" /></view>
+		<view
+			v-if="showFoot"
+			class="u-card__foot"
+			 @tap="footClick"
+			:style="[{padding: $slots.foot ? padding + 'rpx' : 0}, footStyle]"
+			:class="{
+				'u-border-top': footBorderTop
+			}"
+		>
+			<slot name="foot" />
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * card 鍗$墖
+ * @description 鍗$墖缁勪欢涓�鑸敤浜庡涓垪琛ㄦ潯鐩紝涓旈鏍肩粺涓�鐨勫満鏅�
+ * @tutorial https://www.uviewui.com/components/card.html
+ * @property {Boolean} full 鍗$墖涓庡睆骞曚袱渚ф槸鍚︾暀绌洪殭锛堥粯璁alse锛�
+ * @property {String} title 澶撮儴宸﹁竟鐨勬爣棰�
+ * @property {String} title-color 鏍囬棰滆壊锛堥粯璁�#303133锛�
+ * @property {String | Number} title-size 鏍囬瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�30锛�
+ * @property {String} sub-title 澶撮儴鍙宠竟鐨勫壇鏍囬
+ * @property {String} sub-title-color 鍓爣棰橀鑹诧紙榛樿#909399锛�
+ * @property {String | Number} sub-title-size 鍓爣棰樺瓧浣撳ぇ灏忥紙榛樿26锛�
+ * @property {Boolean} border 鏄惁鏄剧ず杈规锛堥粯璁rue锛�
+ * @property {String | Number} index 鐢ㄤ簬鏍囪瘑鐐瑰嚮浜嗙鍑犱釜鍗$墖
+ * @property {String} box-shadow 鍗$墖澶栧洿闃村奖锛屽瓧绗︿覆褰㈠紡锛堥粯璁one锛�
+ * @property {String} margin 鍗$墖涓庡睆骞曚袱杈瑰拰涓婁笅鍏冪礌鐨勯棿璺濓紝闇�甯﹀崟浣嶏紝濡�"30rpx 20rpx"锛堥粯璁�30rpx锛�
+ * @property {String | Number} border-radius 鍗$墖鏁翠綋鐨勫渾瑙掑�硷紝鍗曚綅rpx锛堥粯璁�16锛�
+ * @property {Object} head-style 澶撮儴鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+ * @property {Object} body-style 涓儴鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+ * @property {Object} foot-style 搴曢儴鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+ * @property {Boolean} head-border-bottom 鏄惁鏄剧ず澶撮儴鐨勪笅杈规锛堥粯璁rue锛�
+ * @property {Boolean} foot-border-top 鏄惁鏄剧ず搴曢儴鐨勪笂杈规锛堥粯璁rue锛�
+ * @property {Boolean} show-head 鏄惁鏄剧ず澶撮儴锛堥粯璁rue锛�
+ * @property {Boolean} show-head 鏄惁鏄剧ず灏鹃儴锛堥粯璁rue锛�
+ * @property {String} thumb 缂╃暐鍥捐矾寰勶紝濡傝缃皢鏄剧ず鍦ㄦ爣棰樼殑宸﹁竟锛屼笉寤鸿浣跨敤鐩稿璺緞
+ * @property {String | Number} thumb-width 缂╃暐鍥剧殑瀹藉害锛岄珮绛変簬瀹斤紝鍗曚綅rpx锛堥粯璁�60锛�
+ * @property {Boolean} thumb-circle 缂╃暐鍥炬槸鍚︿负鍦嗗舰锛堥粯璁alse锛�
+ * @event {Function} click 鏁翠釜鍗$墖浠绘剰浣嶇疆琚偣鍑绘椂瑙﹀彂
+ * @event {Function} head-click 鍗$墖澶撮儴琚偣鍑绘椂瑙﹀彂
+ * @event {Function} body-click 鍗$墖涓讳綋閮ㄥ垎琚偣鍑绘椂瑙﹀彂
+ * @event {Function} foot-click 鍗$墖搴曢儴閮ㄥ垎琚偣鍑绘椂瑙﹀彂
+ * @example <u-card padding="30" title="card"></u-card>
+ */
+export default {
+	name: 'u-card',
+	props: {
+		// 涓庡睆骞曚袱渚ф槸鍚︾暀绌洪殭
+		full: {
+			type: Boolean,
+			default: false
+		},
+		// 鏍囬
+		title: {
+			type: String,
+			default: ''
+		},
+		// 鏍囬棰滆壊
+		titleColor: {
+			type: String,
+			default: '#303133'
+		},
+		// 鏍囬瀛椾綋澶у皬锛屽崟浣峳px
+		titleSize: {
+			type: [Number, String],
+			default: '30'
+		},
+		// 鍓爣棰�
+		subTitle: {
+			type: String,
+			default: ''
+		},
+		// 鍓爣棰橀鑹�
+		subTitleColor: {
+			type: String,
+			default: '#909399'
+		},
+		// 鍓爣棰樺瓧浣撳ぇ灏忥紝鍗曚綅rpx
+		subTitleSize: {
+			type: [Number, String],
+			default: '26'
+		},
+		// 鏄惁鏄剧ず澶栭儴杈规锛屽彧瀵筬ull=false鏃舵湁鏁�(鍗$墖涓庤竟妗嗘湁绌洪殭鏃�)
+		border: {
+			type: Boolean,
+			default: true
+		},
+		// 鐢ㄤ簬鏍囪瘑鐐瑰嚮浜嗙鍑犱釜
+		index: {
+			type: [Number, String, Object],
+			default: ''
+		},
+		// 鐢ㄤ簬闅斿紑涓婁笅宸﹀彸鐨勮竟璺濓紝甯﹀崟浣嶇殑鍐欐硶锛屽锛�"30rpx 30rpx"锛�"20rpx 20rpx 30rpx 30rpx"
+		margin: {
+			type: String,
+			default: '30rpx'
+		},
+		// card鍗$墖鐨勫渾瑙�
+		borderRadius: {
+			type: [Number, String],
+			default: '16'
+		},
+		// 澶撮儴鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+		headStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 涓讳綋鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+		bodyStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 搴曢儴鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+		footStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 澶撮儴鏄惁涓嬭竟妗�
+		headBorderBottom: {
+			type: Boolean,
+			default: true
+		},
+		// 搴曢儴鏄惁鏈変笂杈规
+		footBorderTop: {
+			type: Boolean,
+			default: true
+		},
+		// 鏍囬宸﹁竟鐨勭缉鐣ュ浘
+		thumb: {
+			type: String,
+			default: ''
+		},
+		// 缂╃暐鍥惧楂橈紝鍗曚綅rpx
+		thumbWidth: {
+			type: [String, Number],
+			default: '60'
+		},
+		// 缂╃暐鍥炬槸鍚︿负鍦嗗舰
+		thumbCircle: {
+			type: Boolean,
+			default: false
+		},
+		// 缁檋ead锛宐ody锛宖oot鐨勫唴杈硅窛
+		padding: {
+			type: [String, Number],
+			default: '30'
+		},
+		// 鏄惁鏄剧ず澶撮儴
+		showHead: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず灏鹃儴
+		showFoot: {
+			type: Boolean,
+			default: true
+		},
+		// 鍗$墖澶栧洿闃村奖锛屽瓧绗︿覆褰㈠紡
+		boxShadow: {
+			type: String,
+			default: 'none'
+		}
+	},
+	data() {
+		return {};
+	},
+	methods: {
+		click() {
+			this.$emit('click', this.index);
+		},
+		headClick() {
+			this.$emit('head-click', this.index);
+		},
+		bodyClick() {
+			this.$emit('body-click', this.index);
+		},
+		footClick() {
+			this.$emit('foot-click', this.index);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+	
+.u-card {
+	position: relative;
+	overflow: hidden;
+	font-size: 28rpx;
+	background-color: #ffffff;
+	box-sizing: border-box;
+	
+	&-full {
+		// 濡傛灉鏄笌灞忓箷涔嬮棿涓嶇暀绌洪殭锛屽簲璇ヨ缃乏鍙宠竟璺濅负0
+		margin-left: 0 !important;
+		margin-right: 0 !important;
+		width: 100%;
+	}
+	
+	&--border:after {
+		border-radius: 16rpx;
+	}
+
+	&__head {
+		&--left {
+			color: $u-main-color;
+			
+			&__thumb {
+				margin-right: 16rpx;
+			}
+			
+			&__title {
+				max-width: 400rpx;
+			}
+		}
+
+		&--right {
+			color: $u-tips-color;
+			margin-left: 6rpx;
+		}
+	}
+
+	&__body {
+		color: $u-content-color;
+	}
+
+	&__foot {
+		color: $u-tips-color;
+	}
+}
+</style>
diff --git a/uview-ui/components/u-cell-group/u-cell-group.vue b/uview-ui/components/u-cell-group/u-cell-group.vue
new file mode 100644
index 0000000..3fbca72
--- /dev/null
+++ b/uview-ui/components/u-cell-group/u-cell-group.vue
@@ -0,0 +1,70 @@
+<template>
+	<view class="u-cell-box">
+		<view class="u-cell-title" v-if="title" :style="[titleStyle]">
+			{{title}}
+		</view>
+		<view class="u-cell-item-box" :class="{'u-border-bottom u-border-top': border}">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * cellGroup 鍗曞厓鏍肩埗缁勪欢Group
+	 * @description cell鍗曞厓鏍间竴鑸敤浜庝竴缁勫垪琛ㄧ殑鎯呭喌锛屾瘮濡備釜浜轰腑蹇冮〉锛岃缃〉绛夈�傛惌閰島-cell-item
+	 * @tutorial https://www.uviewui.com/components/cell.html
+	 * @property {String} title 鍒嗙粍鏍囬
+	 * @property {Boolean} border 鏄惁鏄剧ず澶栬竟妗嗭紙榛樿true锛�
+	 * @property {Object} title-style 鍒嗙粍鏍囬鐨勭殑鏍峰紡锛屽璞″舰寮忥紝濡倇'font-size': '24rpx'} 鎴� {'fontSize': '24rpx'}
+	 * @example <u-cell-group title="璁剧疆鍠滃ソ">
+	 */
+	export default {
+		name: "u-cell-group",
+		props: {
+			// 鍒嗙粍鏍囬
+			title: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず鍒嗙粍list涓婁笅杈规
+			border: {
+				type: Boolean,
+				default: true
+			},
+			// 鍒嗙粍鏍囬鐨勬牱寮忥紝瀵硅薄褰㈠紡锛屾敞鎰忛┘宄板睘鎬у啓娉�
+			// 绫讳技 {'font-size': '24rpx'} 鍜� {'fontSize': '24rpx'}
+			titleStyle: {
+				type: Object,
+				default () {
+					return {};
+				}
+			}
+		},
+		data() {
+			return {
+				index: 0,
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-cell-box {
+		width: 100%;
+	}
+
+	.u-cell-title {
+		padding: 30rpx 32rpx 10rpx 32rpx;
+		font-size: 30rpx;
+		text-align: left;
+		color: $u-tips-color;
+	}
+
+	.u-cell-item-box {
+		background-color: #FFFFFF;
+		flex-direction: row;
+	}
+</style>
diff --git a/uview-ui/components/u-cell-item/u-cell-item.vue b/uview-ui/components/u-cell-item/u-cell-item.vue
new file mode 100644
index 0000000..055af3a
--- /dev/null
+++ b/uview-ui/components/u-cell-item/u-cell-item.vue
@@ -0,0 +1,316 @@
+<template>
+	<view
+		@tap="click"
+		class="u-cell"
+		:class="{ 'u-border-bottom': borderBottom, 'u-border-top': borderTop, 'u-col-center': center, 'u-cell--required': required }"
+		hover-stay-time="150"
+		:hover-class="hoverClass"
+		:style="{
+			backgroundColor: bgColor
+		}"
+	>
+		<u-icon :size="iconSize" :name="icon" v-if="icon" :custom-style="iconStyle" class="u-cell__left-icon-wrap"></u-icon>
+		<view class="u-flex" v-else>
+			<slot name="icon"></slot>
+		</view>
+		<view
+			class="u-cell_title"
+			:style="[
+				{
+					width: titleWidth ? titleWidth + 'rpx' : 'auto'
+				},
+				titleStyle
+			]"
+		>
+			<block v-if="title !== ''">{{ title }}</block>
+			<slot name="title" v-else></slot>
+
+			<view class="u-cell__label" v-if="label || $slots.label" :style="[labelStyle]">
+				<block v-if="label !== ''">{{ label }}</block>
+				<slot name="label" v-else></slot>
+			</view>
+		</view>
+
+		<view class="u-cell__value" :style="[valueStyle]">
+			<block class="u-cell__value" v-if="value !== ''">{{ value }}</block>
+			<slot v-else></slot>
+		</view>
+		<view class="u-flex u-cell_right" v-if="$slots['right-icon']">
+			<slot name="right-icon"></slot>
+		</view>
+		<u-icon v-if="arrow" name="arrow-right" :style="[arrowStyle]" class="u-icon-wrap u-cell__right-icon-wrap"></u-icon>
+	</view>
+</template>
+
+<script>
+/**
+ * cellItem 鍗曞厓鏍糏tem
+ * @description cell鍗曞厓鏍间竴鑸敤浜庝竴缁勫垪琛ㄧ殑鎯呭喌锛屾瘮濡備釜浜轰腑蹇冮〉锛岃缃〉绛夈�傛惌閰島-cell-group浣跨敤
+ * @tutorial https://www.uviewui.com/components/cell.html
+ * @property {String} title 宸︿晶鏍囬
+ * @property {String} icon 宸︿晶鍥炬爣鍚嶏紝鍙敮鎸乽View鍐呯疆鍥炬爣锛岃Icon 鍥炬爣
+ * @property {Object} icon-style 宸﹁竟鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {String} value 鍙充晶鍐呭
+ * @property {String} label 鏍囬涓嬫柟鐨勬弿杩颁俊鎭�
+ * @property {Boolean} border-bottom 鏄惁鏄剧ずcell鐨勪笅杈规锛堥粯璁rue锛�
+ * @property {Boolean} border-top 鏄惁鏄剧ずcell鐨勪笂杈规锛堥粯璁alse锛�
+ * @property {Boolean} center 鏄惁浣垮唴瀹瑰瀭鐩村眳涓紙榛樿false锛�
+ * @property {String} hover-class 鏄惁寮�鍚偣鍑诲弽棣堬紝none涓烘棤鏁堟灉锛堥粯璁rue锛�
+ * // @property {Boolean} border-gap border-bottom涓簍rue鏃讹紝Cell鍒楄〃涓棿鐨勬潯鐩殑涓嬭竟妗嗘槸鍚︿笌宸﹁竟鏈変竴涓棿闅旓紙榛樿true锛�
+ * @property {Boolean} arrow 鏄惁鏄剧ず鍙充晶绠ご锛堥粯璁rue锛�
+ * @property {Boolean} required 绠ご鏂瑰悜锛屽彲閫夊�硷紙榛樿right锛�
+ * @property {Boolean} arrow-direction 鏄惁鏄剧ず宸﹁竟琛ㄧず蹇呭~鐨勬槦鍙凤紙榛樿false锛�
+ * @property {Object} title-style 鏍囬鏍峰紡锛屽璞″舰寮�
+ * @property {Object} value-style 鍙充晶鍐呭鏍峰紡锛屽璞″舰寮�
+ * @property {Object} label-style 鏍囬涓嬫柟鎻忚堪淇℃伅鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {String} bg-color 鑳屾櫙棰滆壊锛堥粯璁ransparent锛�
+ * @property {String Number} index 鐢ㄤ簬鍦╟lick浜嬩欢鍥炶皟涓繑鍥烇紝鏍囪瘑褰撳墠鏄鍑犱釜Item
+ * @property {String Number} title-width 鏍囬鐨勫搴︼紝鍗曚綅rpx
+ * @example <u-cell-item icon="integral-fill" title="浼氬憳绛夌骇" value="鏂扮増鏈�"></u-cell-item>
+ */
+export default {
+	name: 'u-cell-item',
+	props: {
+		// 宸︿晶鍥炬爣鍚嶇О(鍙兘uView鍐呯疆鍥炬爣)锛屾垨鑰呭浘鏍噑rc
+		icon: {
+			type: String,
+			default: ''
+		},
+		// 宸︿晶鏍囬
+		title: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鍙充晶鍐呭
+		value: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鏍囬涓嬫柟鐨勬弿杩颁俊鎭�
+		label: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鏄惁鏄剧ず涓嬭竟妗�
+		borderBottom: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず涓婅竟妗�
+		borderTop: {
+			type: Boolean,
+			default: false
+		},
+		// 澶氫釜cell涓紝涓棿鐨刢ell鏄剧ず涓嬪垝绾挎椂锛屼笅鍒掔嚎鏄惁缁欎竴涓埌宸﹁竟鐨勮窛绂�
+		// 1.4.0鐗堟湰搴熼櫎姝ゅ弬鏁帮紝榛樿杈规鐢眀order-top鍜宐order-bottom鎻愪緵锛屾鍙傛暟浼氶�犳垚骞叉壈
+		// borderGap: {
+		// 	type: Boolean,
+		// 	default: true
+		// },
+		// 鏄惁寮�鍚偣鍑诲弽棣堬紝鍗崇偣鍑绘椂cell鑳屾櫙涓虹伆鑹诧紝none涓烘棤鏁堟灉
+		hoverClass: {
+			type: String,
+			default: 'u-cell-hover'
+		},
+		// 鏄惁鏄剧ず鍙充晶绠ご
+		arrow: {
+			type: Boolean,
+			default: true
+		},
+		// 鍐呭鏄惁鍨傜洿灞呬腑
+		center: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鏄剧ず宸﹁竟琛ㄧず蹇呭~鐨勬槦鍙�
+		required: {
+			type: Boolean,
+			default: false
+		},
+		// 鏍囬鐨勫搴︼紝鍗曚綅rpx
+		titleWidth: {
+			type: [Number, String],
+			default: ''
+		},
+		// 鍙充晶绠ご鏂瑰悜锛屽彲閫夊�硷細right|up|down锛岄粯璁や负right
+		arrowDirection: {
+			type: String,
+			default: 'right'
+		},
+		// 鎺у埗鏍囬鐨勬牱寮�
+		titleStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 鍙充晶鏄剧ず鍐呭鐨勬牱寮�
+		valueStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 鎻忚堪淇℃伅鐨勬牱寮�
+		labelStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 鑳屾櫙棰滆壊
+		bgColor: {
+			type: String,
+			default: 'transparent'
+		},
+		// 鐢ㄤ簬璇嗗埆琚偣鍑荤殑鏄鍑犱釜cell
+		index: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鏄惁浣跨敤lable鎻掓Ы
+		useLabelSlot: {
+			type: Boolean,
+			default: false
+		},
+		// 宸﹁竟鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx锛屽彧瀵逛紶鍏con瀛楁鏃舵湁鏁�
+		iconSize: {
+			type: [Number, String],
+			default: 34
+		},
+		// 宸﹁竟鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+		iconStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+	},
+	data() {
+		return {
+
+		};
+	},
+	computed: {
+		arrowStyle() {
+			let style = {};
+			if (this.arrowDirection == 'up') style.transform = 'rotate(-90deg)';
+			else if (this.arrowDirection == 'down') style.transform = 'rotate(90deg)';
+			else style.transform = 'rotate(0deg)';
+			return style;
+		}
+	},
+	methods: {
+		click() {
+			this.$emit('click', this.index);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+.u-cell {
+	@include vue-flex;
+	align-items: center;
+	position: relative;
+	/* #ifndef APP-NVUE */
+	box-sizing: border-box;
+	/* #endif */
+	width: 100%;
+	padding: 26rpx 32rpx;
+	font-size: 28rpx;
+	line-height: 54rpx;
+	color: $u-content-color;
+	background-color: #fff;
+	text-align: left;
+}
+
+.u-cell_title {
+	font-size: 28rpx;
+}
+
+.u-cell__left-icon-wrap {
+	margin-right: 10rpx;
+	font-size: 32rpx;
+}
+
+.u-cell__right-icon-wrap {
+	margin-left: 10rpx;
+	color: #969799;
+	font-size: 28rpx;
+}
+
+.u-cell__left-icon-wrap,
+.u-cell__right-icon-wrap {
+	@include vue-flex;
+	align-items: center;
+	height: 48rpx;
+}
+
+.u-cell-border:after {
+	position: absolute; 
+	/* #ifndef APP-NVUE */
+	box-sizing: border-box;
+	content: ' ';
+	pointer-events: none;
+	border-bottom: 1px solid $u-border-color;
+	/* #endif */
+	right: 0;
+	left: 0;
+	top: 0;
+	transform: scaleY(0.5);
+}
+
+.u-cell-border {
+	position: relative;
+}
+
+.u-cell__label {
+	margin-top: 6rpx;
+	font-size: 26rpx;
+	line-height: 36rpx;
+	color: $u-tips-color;
+	/* #ifndef APP-NVUE */
+	word-wrap: break-word;
+	/* #endif */
+}
+
+.u-cell__value {
+	overflow: hidden;
+	text-align: right;
+	/* #ifndef APP-NVUE */
+	vertical-align: middle;
+	/* #endif */
+	color: $u-tips-color;
+	font-size: 26rpx;
+}
+
+.u-cell__title,
+.u-cell__value {
+	flex: 1;
+}
+
+.u-cell--required {
+	/* #ifndef APP-NVUE */
+	overflow: visible;
+	/* #endif */
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-cell--required:before {
+	position: absolute;
+	/* #ifndef APP-NVUE */
+	content: '*';
+	/* #endif */
+	left: 8px;
+	margin-top: 4rpx;
+	font-size: 14px;
+	color: $u-type-error;
+}
+
+.u-cell_right {
+	line-height: 1;
+}
+</style>
diff --git a/uview-ui/components/u-checkbox-group/u-checkbox-group.vue b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue
new file mode 100644
index 0000000..028da26
--- /dev/null
+++ b/uview-ui/components/u-checkbox-group/u-checkbox-group.vue
@@ -0,0 +1,123 @@
+<template>
+	<view class="u-checkbox-group u-clearfix">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import Emitter from '../../libs/util/emitter.js';
+	/**
+	 * checkboxGroup 寮�鍏抽�夋嫨鍣ㄧ埗缁勪欢Group
+	 * @description 澶嶉�夋缁勪欢涓�鑸敤浜庨渶瑕佸涓�夋嫨鐨勫満鏅紝璇ョ粍浠跺姛鑳藉畬鏁达紝浣跨敤鏂逛究
+	 * @tutorial https://www.uviewui.com/components/checkbox.html
+	 * @property {String Number} max 鏈�澶氳兘閫変腑澶氬皯涓猚heckbox锛堥粯璁�999锛�
+	 * @property {String Number} size 缁勪欢鏁翠綋鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�40锛�
+	 * @property {Boolean} disabled 鏄惁绂佺敤鎵�鏈塩heckbox锛堥粯璁alse锛�
+	 * @property {String Number} icon-size 鍥炬爣澶у皬锛屽崟浣峳px锛堥粯璁�20锛�
+	 * @property {Boolean} label-disabled 鏄惁绂佹鐐瑰嚮鏂囨湰鎿嶄綔checkbox(榛樿false)
+	 * @property {String} width 瀹藉害锛岄渶甯﹀崟浣�
+	 * @property {String} width 瀹藉害锛岄渶甯﹀崟浣�
+	 * @property {String} shape 澶栬褰㈢姸锛宻hape-鏂瑰舰锛宑ircle-鍦嗗舰(榛樿circle)
+	 * @property {Boolean} wrap 鏄惁姣忎釜checkbox閮芥崲琛岋紙榛樿false锛�
+	 * @property {String} active-color 閫変腑鏃剁殑棰滆壊锛屽簲鐢ㄥ埌鎵�鏈夊瓙Checkbox缁勪欢锛堥粯璁�#497bff锛�
+	 * @event {Function} change 浠讳竴涓猚heckbox鐘舵�佸彂鐢熷彉鍖栨椂瑙﹀彂锛屽洖璋冧负涓�涓璞�
+	 * @example <u-checkbox-group></u-checkbox-group>
+	 */
+	export default {
+		name: 'u-checkbox-group',
+		mixins: [Emitter],
+		props: {
+			// 鏈�澶氳兘閫変腑澶氬皯涓猚heckbox
+			max: {
+				type: [Number, String],
+				default: 999
+			},
+			// 鎵�鏈夐�変腑椤圭殑 name
+			// value: {
+			// 	default: Array,
+			// 	default() {
+			// 		return []
+			// 	}
+			// },
+			// 鏄惁绂佺敤鎵�鏈夊閫夋
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 鍦ㄨ〃鍗曞唴鎻愪氦鏃剁殑鏍囪瘑绗�
+			name: {
+				type: [Boolean, String],
+				default: ''
+			},
+			// 鏄惁绂佹鐐瑰嚮鎻愮ず璇�変腑澶嶉�夋
+			labelDisabled: {
+				type: Boolean,
+				default: false
+			},
+			// 褰㈢姸锛宻quare涓烘柟褰紝circle涓哄師鍨�
+			shape: {
+				type: String,
+				default: 'square'
+			},
+			// 閫変腑鐘舵�佷笅鐨勯鑹�
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 缁勪欢鐨勬暣浣撳ぇ灏�
+			size: {
+				type: [String, Number],
+				default: 34
+			},
+			// 姣忎釜checkbox鍗爑-checkbox-group鐨勫搴�
+			width: {
+				type: String,
+				default: 'auto'
+			},
+			// 鏄惁姣忎釜checkbox閮芥崲琛�
+			wrap: { 
+				type: Boolean,
+				default: false
+			},
+			// 鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx
+			iconSize: {
+				type: [String, Number],
+				default: 20
+			},
+		},
+		data() {
+			return {
+			}
+		},
+		created() {
+			// 濡傛灉灏哻hildren瀹氫箟鍦╠ata涓紝鍦ㄥ井淇″皬绋嬪簭浼氶�犳垚寰幆寮曠敤鑰屾姤閿�
+			this.children = [];
+		},
+		methods: {
+			emitEvent() {
+				let values = [];
+				this.children.map(val => {
+					if(val.value) values.push(val.name);
+				})
+				this.$emit('change', values);
+				// 鍙戝嚭浜嬩欢锛岀敤浜庡湪琛ㄥ崟缁勪欢涓祵鍏heckbox鐨勬儏鍐碉紝杩涜楠岃瘉
+				// 鐢变簬澶存潯灏忕▼搴忔墽琛岃繜閽濓紝鏁呴渶瑕佺敤鍑犲崄姣鐨勫欢鏃�
+				setTimeout(() => {
+					// 灏嗗綋鍓嶇殑鍊煎彂閫佸埌 u-form-item 杩涜鏍¢獙
+					this.dispatch('u-form-item', 'on-form-change', values);
+				}, 60)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-checkbox-group {
+		/* #ifndef MP || APP-NVUE */
+		display: inline-flex;
+		flex-wrap: wrap;
+		/* #endif */
+	}
+</style>
diff --git a/uview-ui/components/u-checkbox/u-checkbox.vue b/uview-ui/components/u-checkbox/u-checkbox.vue
new file mode 100644
index 0000000..9414461
--- /dev/null
+++ b/uview-ui/components/u-checkbox/u-checkbox.vue
@@ -0,0 +1,284 @@
+<template>
+	<view class="u-checkbox" :style="[checkboxStyle]">
+		<view class="u-checkbox__icon-wrap" @tap="toggle" :class="[iconClass]" :style="[iconStyle]">
+			<u-icon class="u-checkbox__icon-wrap__icon" name="checkbox-mark" :size="checkboxIconSize" :color="iconColor"/>
+		</view>
+		<view class="u-checkbox__label" @tap="onClickLabel" :style="{
+			fontSize: $u.addUnit(labelSize)
+		}">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * checkbox 澶嶉�夋
+	 * @description 璇ョ粍浠堕渶瑕佹惌閰峜heckboxGroup缁勪欢浣跨敤锛屼互渚跨敤鎴疯繘琛屾搷浣滄椂锛岃幏寰楀綋鍓嶅閫夋缁勭殑閫変腑鎯呭喌銆�
+	 * @tutorial https://www.uviewui.com/components/checkbox.html
+	 * @property {String Number} icon-size 鍥炬爣澶у皬锛屽崟浣峳px锛堥粯璁�20锛�
+	 * @property {String Number} label-size label瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+	 * @property {String Number} name checkbox缁勪欢鐨勬爣绀虹
+	 * @property {String} shape 褰㈢姸锛岃瀹樼綉璇存槑锛堥粯璁ircle锛�
+	 * @property {Boolean} disabled 鏄惁绂佺敤
+	 * @property {Boolean} label-disabled 鏄惁绂佹鐐瑰嚮鏂囨湰鎿嶄綔checkbox
+	 * @property {String} active-color 閫変腑鏃剁殑棰滆壊锛屽璁剧疆CheckboxGroup鐨刟ctive-color灏嗗け鏁�
+	 * @event {Function} change 鏌愪釜checkbox鐘舵�佸彂鐢熷彉鍖栨椂瑙﹀彂锛屽洖璋冧负涓�涓璞�
+	 * @example <u-checkbox v-model="checked" :disabled="false">澶╂动</u-checkbox>
+	 */
+	export default {
+		name: "u-checkbox",
+		props: {
+			// checkbox鐨勫悕绉�
+			name: {
+				type: [String, Number],
+				default: ''
+			},
+			// 褰㈢姸锛宻quare涓烘柟褰紝circle涓哄師鍨�
+			shape: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁涓洪�変腑鐘舵��
+			value: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁绂佺敤
+			disabled: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// 鏄惁绂佹鐐瑰嚮鎻愮ず璇�変腑澶嶉�夋
+			labelDisabled: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// 閫変腑鐘舵�佷笅鐨勯鑹诧紝濡傝缃鍊硷紝灏嗕細瑕嗙洊checkboxGroup鐨刟ctiveColor鍊�
+			activeColor: {
+				type: String,
+				default: ''
+			},
+			// 鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx
+			iconSize: {
+				type: [String, Number],
+				default: ''
+			},
+			// label鐨勫瓧浣撳ぇ灏忥紝rpx鍗曚綅
+			labelSize: {
+				type: [String, Number],
+				default: ''
+			},
+			// 缁勪欢鐨勬暣浣撳ぇ灏�
+			size: {
+				type: [String, Number],
+				default: ''
+			},
+		},
+		data() {
+			return {
+				parentDisabled: false,
+				newParams: {},
+			};
+		},
+		created() {
+			// 鏀粯瀹濆皬绋嬪簭涓嶆敮鎸乸rovide/inject锛屾墍浠ヤ娇鐢ㄨ繖涓柟娉曡幏鍙栨暣涓埗缁勪欢锛屽湪created瀹氫箟锛岄伩鍏嶅惊鐜簲鐢�
+			this.parent = this.$u.$parent.call(this, 'u-checkbox-group');
+			// 濡傛灉瀛樺湪u-checkbox-group锛屽皢鏈粍浠剁殑this濉炶繘鐖剁粍浠剁殑children涓�
+			this.parent && this.parent.children.push(this);
+		},
+		computed: {
+			// 鏄惁绂佺敤锛屽鏋滅埗缁勪欢u-checkbox-group绂佺敤鐨勮瘽锛屽皢浼氬拷鐣ュ瓙缁勪欢鐨勯厤缃�
+			isDisabled() {
+				return this.disabled !== '' ? this.disabled : this.parent ? this.parent.disabled : false;
+			},
+			// 鏄惁绂佺敤label鐐瑰嚮
+			isLabelDisabled() {
+				return this.labelDisabled !== '' ? this.labelDisabled : this.parent ? this.parent.labelDisabled : false;
+			},
+			// 缁勪欢灏哄锛屽搴攕ize鐨勫�硷紝榛樿鍊间负34rpx
+			checkboxSize() {
+				return this.size ? this.size : (this.parent ? this.parent.size : 34);
+			},
+			// 缁勪欢鐨勫嬀閫夊浘鏍囩殑灏哄锛岄粯璁�20
+			checkboxIconSize() {
+				return this.iconSize ? this.iconSize : (this.parent ? this.parent.iconSize : 20);
+			},
+			// 缁勪欢閫変腑婵�娲绘椂鐨勯鑹�
+			elActiveColor() {
+				return this.activeColor ? this.activeColor : (this.parent ? this.parent.activeColor : 'primary');
+			},
+			// 缁勪欢鐨勫舰鐘�
+			elShape() {
+				return this.shape ? this.shape : (this.parent ? this.parent.shape : 'square');
+			},
+			iconStyle() {
+				let style = {};
+				// 鏃㈣鍒ゆ柇鏄惁鎵嬪姩绂佺敤锛岃繕瑕佸垽鏂敤鎴穠-model缁戝畾鐨勫�硷紝濡傛灉缁戝畾涓篺alse锛岄偅涔堜篃鏃犳硶閫変腑
+				if (this.elActiveColor && this.value && !this.isDisabled) {
+					style.borderColor = this.elActiveColor; 
+					style.backgroundColor = this.elActiveColor;
+				}
+				style.width = this.$u.addUnit(this.checkboxSize);
+				style.height = this.$u.addUnit(this.checkboxSize);
+				return style;
+			},
+			// checkbox鍐呴儴鐨勫嬀閫夊浘鏍囷紝濡傛灉閫変腑鐘舵�侊紝涓虹櫧鑹诧紝鍚﹀垯涓洪�忔槑鑹插嵆鍙�
+			iconColor() {
+				return this.value ? '#ffffff' : 'transparent';
+			},
+			iconClass() {
+				let classes = [];
+				classes.push('u-checkbox__icon-wrap--' + this.elShape);
+				if (this.value == true) classes.push('u-checkbox__icon-wrap--checked');
+				if (this.isDisabled) classes.push('u-checkbox__icon-wrap--disabled');
+				if (this.value && this.isDisabled) classes.push('u-checkbox__icon-wrap--disabled--checked');
+				// 鏀粯瀹濆皬绋嬪簭鏃犳硶鍔ㄦ�佺粦瀹氫竴涓暟缁勭被鍚嶏紝鍚﹀垯瑙f瀽鍑烘潵鐨勭粨鏋滀細甯︽湁","锛岃�屽鑷村け鏁�
+				return classes.join(' ');
+			},
+			checkboxStyle() {
+				let style = {};
+				if(this.parent && this.parent.width) {
+					style.width = this.parent.width;
+					// #ifdef MP
+					// 鍚勫灏忕▼搴忓洜涓哄畠浠壒娈婄殑缂栬瘧缁撴瀯锛屼娇鐢╢loat甯冨眬
+					style.float = 'left';
+					// #endif
+					// #ifndef MP
+					// H5鍜孉PP浣跨敤flex甯冨眬
+					style.flex = `0 0 ${this.parent.width}`;
+					// #endif
+				}
+				if(this.parent && this.parent.wrap) {
+					style.width = '100%';
+					// #ifndef MP
+					// H5鍜孉PP浣跨敤flex甯冨眬锛屽皢瀹藉害璁剧疆100%锛屽嵆鍙嚜鍔ㄦ崲琛�
+					style.flex = '0 0 100%';
+					// #endif
+				}
+				return style;
+			}
+		},
+		methods: {
+			onClickLabel() {
+				if (!this.isLabelDisabled && !this.isDisabled) {
+					this.setValue();
+				}
+			},
+			toggle() {
+				if (!this.isDisabled) {
+					this.setValue();
+				}
+			},
+			emitEvent() {
+				this.$emit('change', {
+					value: !this.value,
+					name: this.name
+				})
+				// 鎵ц鐖剁粍浠秛-checkbox-group鐨勪簨浠舵柟娉�
+				// 绛夊緟涓嬩竴涓懆鏈熷啀鎵ц锛屽洜涓簍his.$emit('input')浣滅敤浜庣埗缁勪欢锛屽啀鍙嶉鍒板瓙缁勪欢鍐呴儴锛岄渶瑕佹椂闂�
+				setTimeout(() => {
+					if(this.parent && this.parent.emitEvent) this.parent.emitEvent();
+				}, 80);
+			},
+			// 璁剧疆input鐨勫�硷紝杩欓噷閫氳繃input浜嬩欢锛岃缃�氳繃v-model缁戝畾鐨勭粍浠剁殑鍊�
+			setValue() {
+				// 鍒ゆ柇鏄惁瓒呰繃浜嗗彲閫夌殑鏈�澶ф暟閲�
+				let checkedNum = 0;
+				if(this.parent && this.parent.children) {
+					// 鍙鐖剁粍浠剁殑鏌愪竴涓瓙鍏冪礌鐨剉alue涓簍rue锛屽氨鍔�1(宸叉湁鐨勯�変腑鏁伴噺)
+					this.parent.children.map(val => {
+						if (val.value) checkedNum++;
+					})
+				}
+				// 濡傛灉鍘熸潵涓洪�変腑鐘舵�侊紝閭d箞鍙互鍙栨秷
+				if (this.value == true) {
+					this.emitEvent();
+					this.$emit('input', !this.value);
+				} else {
+					// 濡傛灉瓒呭嚭鏈�澶氬彲閫夐」锛屾彁绀�
+					if(this.parent && checkedNum >= this.parent.max) {
+						return this.$u.toast(`鏈�澶氬彲閫�${this.parent.max}椤筦);
+					}
+					// 濡傛灉鍘熸潵涓烘湭閫変腑鐘舵�侊紝闇�瑕侀�変腑鐨勬暟閲忓皯浜庣埗缁勪欢涓缃殑max鍊硷紝鎵嶅彲浠ラ�変腑
+					this.emitEvent();
+					this.$emit('input', !this.value);
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-checkbox {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		align-items: center;
+		overflow: hidden;
+		user-select: none;
+		line-height: 1.8;
+		
+		&__icon-wrap {
+			color: $u-content-color;
+			flex: none;
+			display: -webkit-flex;
+			@include vue-flex;
+			align-items: center;
+			justify-content: center;
+			box-sizing: border-box;
+			width: 42rpx;
+			height: 42rpx;
+			color: transparent;
+			text-align: center;
+			transition-property: color, border-color, background-color;
+			font-size: 20px;
+			border: 1px solid #c8c9cc;
+			transition-duration: 0.2s;
+			
+			/* #ifdef MP-TOUTIAO */
+			// 澶存潯灏忕▼搴忓吋瀹规�ч棶棰橈紝闇�瑕佽缃楂樹负0锛屽惁鍒欏浘鏍囧亸涓�
+			&__icon {
+				line-height: 0;
+			}
+			/* #endif */
+			
+			&--circle {
+				border-radius: 100%;
+			}
+			
+			&--square {
+				border-radius: 6rpx;
+			}
+			
+			&--checked {
+				color: #fff;
+				background-color: $u-type-primary;
+				border-color: $u-type-primary;
+			}
+			
+			&--disabled {
+				background-color: #ebedf0;
+				border-color: #c8c9cc;
+			}
+			
+			&--disabled--checked {
+				color: #c8c9cc !important;
+			}
+		}
+	
+		&__label {
+			word-wrap: break-word;
+			margin-left: 10rpx;
+			margin-right: 24rpx;
+			color: $u-content-color;
+			font-size: 30rpx;
+			
+			&--disabled {
+				color: #c8c9cc;
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-circle-progress/u-circle-progress.vue b/uview-ui/components/u-circle-progress/u-circle-progress.vue
new file mode 100644
index 0000000..ef51c06
--- /dev/null
+++ b/uview-ui/components/u-circle-progress/u-circle-progress.vue
@@ -0,0 +1,220 @@
+<template>
+	<view
+		class="u-circle-progress"
+		:style="{
+			width: widthPx + 'px',
+			height: widthPx + 'px',
+			backgroundColor: bgColor
+		}"
+	>
+		<!-- 鏀粯瀹濆皬绋嬪簭涓嶆敮鎸乧anvas-id灞炴�э紝蹇呴』鐢╥d灞炴�� -->
+		<canvas
+			class="u-canvas-bg"
+			:canvas-id="elBgId"
+			:id="elBgId"
+			:style="{
+				width: widthPx + 'px',
+				height: widthPx + 'px'
+			}"
+		></canvas>
+		<canvas
+			class="u-canvas"
+			:canvas-id="elId"
+			:id="elId"
+			:style="{
+				width: widthPx + 'px',
+				height: widthPx + 'px'
+			}"
+		></canvas>
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+/**
+ * circleProgress 鐜舰杩涘害鏉�
+ * @description 灞曠ず鎿嶄綔鎴栦换鍔$殑褰撳墠杩涘害锛屾瘮濡備笂浼犳枃浠讹紝鏄竴涓渾褰㈢殑杩涘害鏉°�傛敞鎰忥細姝ょ粍浠剁殑percent鍊煎彧鑳藉姩鎬佸鍔狅紝涓嶈兘鍔ㄦ�佸噺灏戙��
+ * @tutorial https://www.uviewui.com/components/circleProgress.html
+ * @property {String Number} percent 鍦嗙幆杩涘害鐧惧垎姣斿�硷紝涓烘暟鍊肩被鍨嬶紝0-100
+ * @property {String} inactive-color 鍦嗙幆鐨勫簳鑹诧紝榛樿涓虹伆鑹�(璇ュ�兼棤娉曞姩鎬佸彉鏇�)锛堥粯璁�#ececec锛�
+ * @property {String} active-color 鍦嗙幆婵�娲婚儴鍒嗙殑棰滆壊(璇ュ�兼棤娉曞姩鎬佸彉鏇�)锛堥粯璁�#19be6b锛�
+ * @property {String Number} width 鏁翠釜鍦嗙幆缁勪欢鐨勫搴︼紝楂樺害榛樿绛変簬瀹藉害鍊硷紝鍗曚綅rpx锛堥粯璁�200锛�
+ * @property {String Number} border-width 鍦嗙幆鐨勮竟妗嗗搴︼紝鍗曚綅rpx锛堥粯璁�14锛�
+ * @property {String Number} duration 鏁翠釜鍦嗙幆鎵ц涓�鍦堢殑鏃堕棿锛屽崟浣峬s锛堥粯璁ゅ憿1500锛�
+ * @property {String} type 濡傝缃紝active-color鍊煎皢浼氬け鏁�
+ * @property {String} bg-color 鏁翠釜缁勪欢鑳屾櫙棰滆壊锛岄粯璁や负鐧借壊
+ * @example <u-circle-progress active-color="#497bff" :percent="80"></u-circle-progress>
+ */
+export default {
+	name: 'u-circle-progress',
+	props: {
+		// 鍦嗙幆杩涘害鐧惧垎姣斿��
+		percent: {
+			type: Number,
+			default: 0,
+			// 闄愬埗鍊煎湪0鍒�100涔嬮棿
+			validator: val => {
+				return val >= 0 && val <= 100;
+			}
+		},
+		// 搴曢儴鍦嗙幆鐨勯鑹诧紙鐏拌壊鐨勫渾鐜級
+		inactiveColor: {
+			type: String,
+			default: '#ececec'
+		},
+		// 鍦嗙幆婵�娲婚儴鍒嗙殑棰滆壊
+		activeColor: {
+			type: String,
+			default: '#19be6b'
+		},
+		// 鍦嗙幆绾挎潯鐨勫搴︼紝鍗曚綅rpx
+		borderWidth: {
+			type: [Number, String],
+			default: 14
+		},
+		// 鏁翠釜鍦嗗舰鐨勫搴︼紝鍗曚綅rpx
+		width: {
+			type: [Number, String],
+			default: 200
+		},
+		// 鏁翠釜鍦嗙幆鎵ц涓�鍦堢殑鏃堕棿锛屽崟浣峬s
+		duration: {
+			type: [Number, String],
+			default: 1500
+		},
+		// 涓婚绫诲瀷
+		type: {
+			type: String,
+			default: ''
+		},
+		// 鏁翠釜鍦嗙幆杩涘害鍖哄煙鐨勮儗鏅壊
+		bgColor: {
+			type: String,
+			default: '#ffffff'
+		}
+	},
+	data() {
+		return {
+			// #ifdef MP-WEIXIN
+			elBgId: 'uCircleProgressBgId', // 寰俊灏忕▼搴忎腑涓嶈兘浣跨敤this.$u.guid()褰㈠紡鍔ㄦ�佺敓鎴恑d鍊硷紝鍚﹀垯浼氭姤閿�
+			elId: 'uCircleProgressElId',
+			// #endif
+			// #ifndef MP-WEIXIN
+			elBgId: this.$u.guid(), // 闈炲井淇$鐨勬椂鍊欙紝闇�鐢ㄥ姩鎬佺殑id锛屽惁鍒欎竴涓〉闈㈠涓渾褰㈣繘搴︽潯缁勪欢鏁版嵁浼氭贩涔�
+			elId: this.$u.guid(),
+			// #endif
+			widthPx: uni.upx2px(this.width), // 杞垚px鍚庣殑鏁翠釜缁勪欢鐨勮儗鏅搴�
+			borderWidthPx: uni.upx2px(this.borderWidth), // 杞垚px鍚庣殑鍦嗙幆鐨勫搴�
+			startAngle: -Math.PI / 2, // canvas鐢诲渾鐨勮捣濮嬭搴︼紝榛樿涓�3鐐归挓鏂瑰悜锛屽畾浣嶅埌12鐐归挓鏂瑰悜
+			progressContext: null, // 娲诲姩鍦嗙殑canvas涓婁笅鏂�
+			newPercent: 0, // 褰撳姩鎬佷慨鏀硅繘搴﹀�肩殑鏃跺�欙紝淇濆瓨杩涘害鍊肩殑鍙樺寲鍓嶅悗鍊硷紝鐢ㄤ簬姣旇緝鐢�
+			oldPercent: 0 // 褰撳姩鎬佷慨鏀硅繘搴﹀�肩殑鏃跺�欙紝淇濆瓨杩涘害鍊肩殑鍙樺寲鍓嶅悗鍊硷紝鐢ㄤ簬姣旇緝鐢�
+		};
+	},
+	watch: {
+		percent(nVal, oVal = 0) {
+			if (nVal > 100) nVal = 100;
+			if (nVal < 0) oVal = 0;
+			// 姝ゅ�煎叾瀹炵瓑浜巘his.percent锛屽懡鍚嶄竴涓柊
+			this.newPercent = nVal;
+			this.oldPercent = oVal;
+			setTimeout(() => {
+				// 鏃犺鏄櫨鍒嗘瘮鍊煎鍔犺繕鏄噺灏戯紝闇�瑕佹搷浣滆繕鏄師鏉ョ殑鏃х殑鐧惧垎姣斿��
+				// 灏嗘鍊煎噺灏戞垨鑰呮柊澧炲埌鏂扮殑鐧惧垎姣斿��
+				this.drawCircleByProgress(oVal);
+			}, 50);
+		}
+	},
+	created() {
+		// 璧嬪�硷紝鐢ㄤ簬鍔犺浇鍚庣涓�涓敾鍦嗕娇鐢�
+		this.newPercent = this.percent;
+		this.oldPercent = 0;
+	},
+	computed: {
+		// 鏈塼ype涓婚鏃讹紝浼樺厛璧蜂綔鐢�
+		circleColor() {
+			if (['success', 'error', 'info', 'primary', 'warning'].indexOf(this.type) >= 0) return this.$u.color[this.type];
+			else return this.activeColor;
+		}
+	},
+	mounted() {
+		// 鍦╤5绔紝蹇呴』瑕佸仛涓�鐐瑰欢鏃舵墠璧蜂綔鐢紝this.$nextTick()鏃犳晥(HX2.4.7)
+		setTimeout(() => {
+			this.drawProgressBg();
+			this.drawCircleByProgress(this.oldPercent);
+		}, 50);
+	},
+	methods: {
+		drawProgressBg() {
+			let ctx = uni.createCanvasContext(this.elBgId, this);
+			ctx.setLineWidth(this.borderWidthPx); // 璁剧疆鍦嗙幆瀹藉害
+			ctx.setStrokeStyle(this.inactiveColor); // 绾挎潯棰滆壊
+			ctx.beginPath(); // 寮�濮嬫弿缁樿矾寰�
+			// 璁剧疆涓�涓師鐐�(110,110)锛屽崐寰勪负100鐨勫渾鐨勮矾寰勫埌褰撳墠璺緞
+			let radius = this.widthPx / 2;
+			ctx.arc(radius, radius, radius - this.borderWidthPx, 0, 2 * Math.PI, false);
+			ctx.stroke(); // 瀵硅矾寰勮繘琛屾弿缁�
+			ctx.draw();
+		},
+		drawCircleByProgress(progress) {
+			// 绗竴娆℃搷浣滆繘搴︾幆鏃跺皢涓婁笅鏂囦繚瀛樺埌浜唗his.data涓紝鐩存帴浣跨敤鍗冲彲
+			let ctx = this.progressContext;
+			if (!ctx) {
+				ctx = uni.createCanvasContext(this.elId, this);
+				this.progressContext = ctx;
+			}
+			// 琛ㄧず杩涘害鐨勪袱绔负鍦嗗舰
+			ctx.setLineCap('round');
+			// 璁剧疆绾挎潯鐨勫搴﹀拰棰滆壊
+			ctx.setLineWidth(this.borderWidthPx);
+			ctx.setStrokeStyle(this.circleColor);
+			// 灏嗘�昏繃娓℃椂闂撮櫎浠�100锛屽緱鍑烘瘡淇敼鐧惧垎涔嬩竴杩涘害鎵�闇�鐨勬椂闂�
+			let time = Math.floor(this.duration / 100);
+			// 缁撴潫瑙掔殑璁$畻渚濇嵁涓猴細灏�2蟺鍒嗕负100浠斤紝涔樹互褰撳墠鐨勮繘搴﹀�硷紝寰楀嚭缁堟鐐圭殑寮у害鍊硷紝鍔犺捣濮嬭锛屼负鏁翠釜鍦嗕粠榛樿鐨�
+			// 3鐐归挓鏂瑰悜寮�濮嬬敾鍥撅紝杞负鏇村ソ鐞嗚В鐨�12鐐归挓鏂瑰悜寮�濮嬩綔鍥撅紝杩欓渶瑕佽捣濮嬭鍜岀粓姝㈣鍚屾椂鍔犱笂this.startAngle鍊�
+			let endAngle = ((2 * Math.PI) / 100) * progress + this.startAngle;
+			ctx.beginPath();
+			// 鍗婂緞涓烘暣涓猚anvas瀹藉害鐨勪竴鍗�
+			let radius = this.widthPx / 2;
+			ctx.arc(radius, radius, radius - this.borderWidthPx, this.startAngle, endAngle, false);
+			ctx.stroke();
+			ctx.draw();
+			// 濡傛灉鍙樻洿鍚庢柊鍊煎ぇ浜庢棫鍊硷紝鎰忓懗鐫�澧炲ぇ浜嗙櫨鍒嗘瘮
+			if (this.newPercent > this.oldPercent) {
+				// 姣忔閫掑鐧惧垎涔嬩竴
+				progress++;
+				// 濡傛灉鏂板鍚庣殑鍊硷紝澶т簬闇�瑕佽缃殑鍊肩櫨鍒嗘瘮鍊硷紝鍋滄缁х画澧炲姞
+				if (progress > this.newPercent) return;
+			} else {
+				// 鍚岀悊浜庝笂闈�
+				progress--;
+				if (progress < this.newPercent) return;
+			}
+			setTimeout(() => {
+				// 瀹氭椂鍣紝姣忔鎿嶄綔闂撮殧涓簍ime鍊硷紝涓轰簡璁╄繘搴︽潯鏈夊姩鐢绘晥鏋�
+				this.drawCircleByProgress(progress);
+			}, time);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+.u-circle-progress {
+	position: relative;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	align-items: center;
+	justify-content: center;
+}
+
+.u-canvas-bg {
+	position: absolute;
+}
+
+.u-canvas {
+	position: absolute;
+}
+</style>
diff --git a/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue b/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue
new file mode 100644
index 0000000..77e2da2
--- /dev/null
+++ b/uview-ui/components/u-circle-progress/u-line-progress/u-line-progress.vue
@@ -0,0 +1,147 @@
+<template>
+	<view class="u-progress" :style="{
+		borderRadius: round ? '100rpx' : 0,
+		height: height + 'rpx',
+		backgroundColor: inactiveColor
+	}">
+		<view :class="[
+			type ? `u-type-${type}-bg` : '',
+			striped ? 'u-striped' : '',
+			striped && stripedActive ? 'u-striped-active' : ''
+		]" class="u-active" :style="[progressStyle]">
+			<slot v-if="$slots.default || $slots.$default" />
+			<block v-else-if="showPercent">
+				{{percent + '%'}}
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * lineProgress 绾垮瀷杩涘害鏉�
+	 * @description 灞曠ず鎿嶄綔鎴栦换鍔$殑褰撳墠杩涘害锛屾瘮濡備笂浼犳枃浠讹紝鏄竴涓嚎褰㈢殑杩涘害鏉°��
+	 * @tutorial https://www.uviewui.com/components/lineProgress.html
+	 * @property {String Number} percent 杩涘害鏉$櫨鍒嗘瘮鍊硷紝涓烘暟鍊肩被鍨嬶紝0-100
+	 * @property {Boolean} round 杩涘害鏉′袱绔槸鍚︿负鍗婂渾锛堥粯璁rue锛�
+	 * @property {String} type 濡傝缃紝active-color鍊煎皢浼氬け鏁�
+	 * @property {String} active-color 杩涘害鏉℃縺娲婚儴鍒嗙殑棰滆壊锛堥粯璁�#19be6b锛�
+	 * @property {String} inactive-color 杩涘害鏉$殑搴曡壊锛堥粯璁�#ececec锛�
+	 * @property {Boolean} show-percent 鏄惁鍦ㄨ繘搴︽潯鍐呴儴鏄剧ず褰撳墠鐨勭櫨鍒嗘瘮鍊兼暟鍊硷紙榛樿true锛�
+	 * @property {String Number} height 杩涘害鏉$殑楂樺害锛屽崟浣峳px锛堥粯璁�28锛�
+	 * @property {Boolean} striped 鏄惁鏄剧ず杩涘害鏉℃縺娲婚儴鍒嗙殑鏉$汗锛堥粯璁alse锛�
+	 * @property {Boolean} striped-active 鏉$汗鏄惁鍏锋湁鍔ㄦ�佹晥鏋滐紙榛樿false锛�
+	 * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress>
+	 */
+	export default {
+		name: "u-line-progress",
+		props: {
+			// 涓ょ鏄惁鏄剧ず鍗婂渾褰�
+			round: {
+				type: Boolean,
+				default: true
+			},
+			// 涓婚棰滆壊
+			type: {
+				type: String,
+				default: ''
+			},
+			// 婵�娲婚儴鍒嗙殑棰滆壊
+			activeColor: {
+				type: String,
+				default: '#19be6b'
+			},
+			inactiveColor: {
+				type: String,
+				default: '#ececec'
+			},
+			// 杩涘害鐧惧垎姣旓紝鏁板��
+			percent: {
+				type: Number,
+				default: 0
+			},
+			// 鏄惁鍦ㄨ繘搴︽潯鍐呴儴鏄剧ず鐧惧垎姣旂殑鍊�
+			showPercent: {
+				type: Boolean,
+				default: true
+			},
+			// 杩涘害鏉$殑楂樺害锛屽崟浣峳px
+			height: {
+				type: [Number, String],
+				default: 28
+			},
+			// 鏄惁鏄剧ず鏉$汗
+			striped: {
+				type: Boolean,
+				default: false
+			},
+			// 鏉$汗鏄惁鏄剧ず娲诲姩鐘舵��
+			stripedActive: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			progressStyle() {
+				let style = {};
+				style.width = this.percent + '%';
+				if(this.activeColor) style.backgroundColor = this.activeColor;
+				return style;
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-progress {
+		overflow: hidden;
+		height: 15px;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		align-items: center;
+		width: 100%;
+		border-radius: 100rpx;
+	}
+
+	.u-active {
+		width: 0;
+		height: 100%;
+		align-items: center;
+		@include vue-flex;
+		justify-items: flex-end;
+		justify-content: space-around;
+		font-size: 20rpx;
+		color: #ffffff;
+		transition: all 0.4s ease;
+	}
+
+	.u-striped {
+		background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+		background-size: 39px 39px;
+	}
+
+	.u-striped-active {
+		animation: progress-stripes 2s linear infinite;
+	}
+
+	@keyframes progress-stripes {
+		0% {
+			background-position: 0 0;
+		}
+
+		100% {
+			background-position: 39px 0;
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-col/u-col.vue b/uview-ui/components/u-col/u-col.vue
new file mode 100644
index 0000000..3b6cc64
--- /dev/null
+++ b/uview-ui/components/u-col/u-col.vue
@@ -0,0 +1,156 @@
+<template>
+	<view class="u-col" :class="[
+		'u-col-' + span
+	]" :style="{
+		padding: `0 ${Number(gutter)/2 + 'rpx'}`,
+		marginLeft: 100 / 12 * offset + '%',
+		flex: `0 0 ${100 / 12 * span}%`,
+		alignItems: uAlignItem,
+		justifyContent: uJustify,
+		textAlign: textAlign
+	}"
+	 @tap="click">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	/**
+	 * col 甯冨眬鍗曞厓鏍�
+	 * @description 閫氳繃鍩虹鐨� 12 鍒嗘爮锛岃繀閫熺畝渚垮湴鍒涘缓甯冨眬锛堟惌閰�<u-row>浣跨敤锛�
+	 * @tutorial https://www.uviewui.com/components/layout.html
+	 * @property {String Number} span 鏍呮牸鍗犳嵁鐨勫垪鏁帮紝鎬�12绛夊垎锛堥粯璁�0锛�
+	 * @property {String} text-align 鏂囧瓧姘村钩瀵归綈鏂瑰紡锛堥粯璁eft锛�
+	 * @property {String Number} offset 鍒嗘爮宸﹁竟鍋忕Щ锛岃绠楁柟寮忎笌span鐩稿悓锛堥粯璁�0锛�
+	 * @example <u-col span="3"><view class="demo-layout bg-purple"></view></u-col>
+	 */
+	export default {
+		name: "u-col",
+		props: {
+			// 鍗犵埗瀹瑰櫒瀹藉害鐨勫灏戠瓑鍒嗭紝鎬诲垎涓�12浠�
+			span: {
+				type: [Number, String],
+				default: 12
+			},
+			// 鎸囧畾鏍呮牸宸︿晶鐨勯棿闅旀暟(鎬�12鏍�)
+			offset: {
+				type: [Number, String],
+				default: 0
+			},
+			// 姘村钩鎺掑垪鏂瑰紡锛屽彲閫夊�间负`start`(鎴朻flex-start`)銆乣end`(鎴朻flex-end`)銆乣center`銆乣around`(鎴朻space-around`)銆乣between`(鎴朻space-between`)
+			justify: {
+				type: String,
+				default: 'start'
+			},
+			// 鍨傜洿瀵归綈鏂瑰紡锛屽彲閫夊�间负top銆乧enter銆乥ottom
+			align: {
+				type: String,
+				default: 'center'
+			},
+			// 鏂囧瓧瀵归綈鏂瑰紡
+			textAlign: {
+				type: String,
+				default: 'left'
+			},
+			// 鏄惁闃绘浜嬩欢浼犳挱
+			stop: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				gutter: 20, // 缁檆ol娣诲姞闂磋窛锛屽乏鍙宠竟璺濆悇鍗犱竴鍗婏紝浠庣埗缁勪欢u-row鑾峰彇
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			// 鑾峰彇鐖剁粍浠跺疄渚嬶紝骞惰祴鍊肩粰瀵瑰簲鐨勫弬鏁�
+			this.parent = this.$u.$parent.call(this, 'u-row');
+			if (this.parent) {
+				this.gutter = this.parent.gutter;
+			}
+		},
+		computed: {
+			uJustify() {
+				if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify;
+				else if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify;
+				else return this.justify;
+			},
+			uAlignItem() {
+				if (this.align == 'top') return 'flex-start';
+				if (this.align == 'bottom') return 'flex-end';
+				else return this.align;
+			}
+		},
+		methods: {
+			click(e) {
+				this.$emit('click');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	.u-col {
+		/* #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO */
+		float: left;
+		/* #endif */
+	}
+
+	.u-col-0 {
+		width: 0;
+	}
+
+	.u-col-1 {
+		width: calc(100%/12);
+	}
+
+	.u-col-2 {
+		width: calc(100%/12 * 2);
+	}
+
+	.u-col-3 {
+		width: calc(100%/12 * 3);
+	}
+
+	.u-col-4 {
+		width: calc(100%/12 * 4);
+	}
+
+	.u-col-5 {
+		width: calc(100%/12 * 5);
+	}
+
+	.u-col-6 {
+		width: calc(100%/12 * 6);
+	}
+
+	.u-col-7 {
+		width: calc(100%/12 * 7);
+	}
+
+	.u-col-8 {
+		width: calc(100%/12 * 8);
+	}
+
+	.u-col-9 {
+		width: calc(100%/12 * 9);
+	}
+
+	.u-col-10 {
+		width: calc(100%/12 * 10);
+	}
+
+	.u-col-11 {
+		width: calc(100%/12 * 11);
+	}
+
+	.u-col-12 {
+		width: calc(100%/12 * 12);
+	}
+</style>
diff --git a/uview-ui/components/u-collapse-item/u-collapse-item.vue b/uview-ui/components/u-collapse-item/u-collapse-item.vue
new file mode 100644
index 0000000..3b66bfa
--- /dev/null
+++ b/uview-ui/components/u-collapse-item/u-collapse-item.vue
@@ -0,0 +1,204 @@
+<template>
+	<view class="u-collapse-item" :style="[itemStyle]">
+		<view :hover-stay-time="200" class="u-collapse-head" @tap.stop="headClick" :hover-class="hoverClass" :style="[headStyle]">
+			<block v-if="!$slots['title-all']">
+				<view v-if="!$slots['title']" class="u-collapse-title u-line-1" :style="[{ textAlign: align ? align : 'left' },
+					isShow && activeStyle && !arrow ? activeStyle : '']">
+					{{ title }}
+				</view>
+				<slot v-else name="title" />
+				<view class="u-icon-wrap">
+					<u-icon v-if="arrow" :color="arrowColor" :class="{ 'u-arrow-down-icon-active': isShow }"
+					 class="u-arrow-down-icon" name="arrow-down"></u-icon>
+				</view>
+			</block>
+			<slot v-else name="title-all" />
+		</view>
+		<view class="u-collapse-body" :style="[{
+				height: isShow ? height + 'px' : '0'
+			}]">
+			<view class="u-collapse-content" :id="elId" :style="[bodyStyle]">
+				<slot></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * collapseItem 鎵嬮鐞碔tem
+	 * @description 閫氳繃鎶樺彔闈㈡澘鏀剁撼鍐呭鍖哄煙锛堟惌閰島-collapse浣跨敤锛�
+	 * @tutorial https://www.uviewui.com/components/collapse.html
+	 * @property {String} title 闈㈡澘鏍囬
+	 * @property {String Number} index 涓昏鐢ㄤ簬浜嬩欢鐨勫洖璋冿紝鏍囪瘑閭d釜Item琚偣鍑�
+	 * @property {Boolean} disabled 闈㈡澘鏄惁鍙互鎵撳紑鎴栨敹璧凤紙榛樿false锛�
+	 * @property {Boolean} open 璁剧疆鏌愪釜闈㈡澘鐨勫垵濮嬬姸鎬佹槸鍚︽墦寮�锛堥粯璁alse锛�
+	 * @property {String Number} name 鍞竴鏍囪瘑绗︼紝濡備笉璁剧疆锛岄粯璁ょ敤褰撳墠collapse-item鐨勭储寮曞��
+	 * @property {String} align 鏍囬鐨勫榻愭柟寮忥紙榛樿left锛�
+	 * @property {Object} active-style 涓嶆樉绀虹澶存椂锛屽彲浠ユ坊鍔犲綋鍓嶉�夋嫨鐨刢ollapse-item娲诲姩鏍峰紡锛屽璞″舰寮�
+	 * @event {Function} change 鏌愪釜item琚墦寮�鎴栬�呮敹璧锋椂瑙﹀彂
+	 * @example <u-collapse-item :title="item.head" v-for="(item, index) in itemList" :key="index">{{item.body}}</u-collapse-item>
+	 */
+	export default {
+		name: "u-collapse-item",
+		props: {
+			// 鏍囬
+			title: {
+				type: String,
+				default: ''
+			},
+			// 鏍囬鐨勫榻愭柟寮�
+			align: {
+				type: String,
+				default: 'left'
+			},
+			// 鏄惁鍙互鐐瑰嚮鏀惰捣
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// collapse鏄剧ず涓庡惁
+			open: {
+				type: Boolean,
+				default: false
+			},
+			// 鍞竴鏍囪瘑绗�
+			name: {
+				type: [Number, String],
+				default: ''
+			},
+			//娲诲姩鏍峰紡
+			activeStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 鏍囪瘑褰撳墠涓虹鍑犱釜
+			index: {
+				type: [String, Number],
+				default: ''
+			}
+		},
+		data() {
+			return {
+				isShow: false,
+				elId: this.$u.guid(),
+				height: 0, // body鍐呭鐨勯珮搴�
+				headStyle: {}, // 澶撮儴鏍峰紡锛屽璞″舰寮�
+				bodyStyle: {}, // 涓讳綋閮ㄥ垎鏍峰紡
+				itemStyle: {}, // 姣忎釜item鐨勬暣浣撴牱寮�
+				arrowColor: '', // 绠ご鐨勯鑹�
+				hoverClass: '', // 澶撮儴鎸変笅鏃剁殑鏁堟灉鏍峰紡绫�
+				arrow: true, // 鏄惁鏄剧ず鍙充晶绠ご
+				
+			};
+		},
+		watch: {
+			open(val) {
+				this.isShow = val;
+			}
+		},
+		created() {
+			this.parent = false;
+			// 鑾峰彇u-collapse鐨勪俊鎭紝鏀惧湪u-collapse鏄负浜嗘柟渚匡紝涓嶇敤姣忎釜u-collapse-item鍐欎竴閬�
+			this.isShow = this.open;
+		},
+		methods: {
+			// 寮傛鑾峰彇鍐呭锛屾垨鑰呭姩鎬佷慨鏀逛簡鍐呭鏃讹紝闇�瑕侀噸鏂板垵濮嬪寲
+			init() {
+				this.parent = this.$u.$parent.call(this, 'u-collapse');
+				if(this.parent) {
+					this.nameSync = this.name ? this.name : this.parent.childrens.length;
+					this.parent.childrens.push(this);
+					this.headStyle = this.parent.headStyle;
+					this.bodyStyle = this.parent.bodyStyle;
+					this.arrowColor = this.parent.arrowColor;
+					this.hoverClass = this.parent.hoverClass;
+					this.arrow = this.parent.arrow;
+					this.itemStyle = this.parent.itemStyle;
+				}
+				this.$nextTick(() => {
+					this.queryRect();
+				});
+			},
+			// 鐐瑰嚮collapsehead澶撮儴
+			headClick() {
+				if (this.disabled) return;
+				if (this.parent && this.parent.accordion == true) {
+					this.parent.childrens.map(val => {
+						// 鑷韩涓嶈缃负false锛屽洜涓哄悗闈㈡湁this.isShow = !this.isShow;澶勭悊浜�
+						if (this != val) {
+							val.isShow = false;
+						}
+					});
+				}
+
+				this.isShow = !this.isShow;
+				// 瑙﹀彂鏈粍浠剁殑浜嬩欢
+				this.$emit('change', {
+					index: this.index,
+					show: this.isShow
+				})
+				// 鍙湁鍦ㄦ墦寮�鏃舵墠鍙戝嚭浜嬩欢
+				if (this.isShow) this.parent && this.parent.onChange();
+				this.$forceUpdate();
+			},
+			// 鏌ヨ鍐呭楂樺害
+			queryRect() {
+				// $uGetRect涓簎View鑷甫鐨勮妭鐐规煡璇㈢畝鍖栨柟娉曪紝璇﹁鏂囨。浠嬬粛锛歨ttps://www.uviewui.com/js/getRect.html
+				// 缁勪欢鍐呴儴涓�鑸敤this.$uGetRect锛屽澶栫殑涓簍his.$u.getRect锛屼簩鑰呭姛鑳戒竴鑷达紝鍚嶇О涓嶅悓
+				this.$uGetRect('#' + this.elId).then(res => {
+					this.height = res.height;
+				})
+			}
+		},
+		mounted() {
+			this.init();
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-collapse-head {
+		position: relative;
+		@include vue-flex;
+		justify-content: space-between;
+		align-items: center;
+		color: $u-main-color;
+		font-size: 30rpx;
+		line-height: 1;
+		padding: 24rpx 0;
+		text-align: left;
+	}
+
+	.u-collapse-title {
+		flex: 1;
+		overflow: hidden;
+	}
+
+	.u-arrow-down-icon {
+		transition: all 0.3s;
+		margin-right: 20rpx;
+		margin-left: 14rpx;
+	}
+
+	.u-arrow-down-icon-active {
+		transform: rotate(180deg);
+		transform-origin: center center;
+	}
+
+	.u-collapse-body {
+		overflow: hidden;
+		transition: all 0.3s;
+	}
+
+	.u-collapse-content {
+		overflow: hidden;
+		font-size: 28rpx;
+		color: $u-tips-color;
+		text-align: left;
+	}
+</style>
diff --git a/uview-ui/components/u-collapse/u-collapse.vue b/uview-ui/components/u-collapse/u-collapse.vue
new file mode 100644
index 0000000..8572957
--- /dev/null
+++ b/uview-ui/components/u-collapse/u-collapse.vue
@@ -0,0 +1,99 @@
+<template>
+	<view class="u-collapse">
+		<slot />
+	</view>
+</template>
+
+<script>
+	/**
+	 * collapse 鎵嬮鐞�
+	 * @description 閫氳繃鎶樺彔闈㈡澘鏀剁撼鍐呭鍖哄煙
+	 * @tutorial https://www.uviewui.com/components/collapse.html
+	 * @property {Boolean} accordion 鏄惁鎵嬮鐞存ā寮忥紙榛樿true锛�
+	 * @property {Boolean} arrow 鏄惁鏄剧ず鏍囬鍙充晶鐨勭澶达紙榛樿true锛�
+	 * @property {String} arrow-color 鏍囬鍙充晶绠ご鐨勯鑹诧紙榛樿#909399锛�
+	 * @property {Object} head-style 鏍囬鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} body-style 涓讳綋鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {String} hover-class 鏍峰紡绫诲悕锛屾寜涓嬫椂鏈夋晥锛堥粯璁-hover-class锛�
+	 * @event {Function} change 褰撳墠婵�娲婚潰鏉垮睍寮�鏃惰Е鍙�(濡傛灉鏄墜椋庣惔妯″紡锛屽弬鏁癮ctiveNames绫诲瀷涓篠tring锛屽惁鍒欎负Array)
+	 * @example <u-collapse></u-collapse>
+	 */
+	export default {
+		name:"u-collapse",
+		props: {
+			// 鏄惁鎵嬮鐞存ā寮�
+			accordion: {
+				type: Boolean,
+				default: true
+			},
+			// 澶撮儴鐨勬牱寮�
+			headStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 涓讳綋鐨勬牱寮�
+			bodyStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 姣忎竴涓猧tem鐨勬牱寮�
+			itemStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 鏄惁鏄剧ず鍙充晶鐨勭澶�
+			arrow: {
+				type: Boolean,
+				default: true
+			},
+			// 绠ご鐨勯鑹�
+			arrowColor: {
+				type: String,
+				default: '#909399'
+			},
+			// 鏍囬閮ㄥ垎鎸夊帇鏃剁殑鏍峰紡绫伙紝"none"涓烘棤鏁堟灉
+			hoverClass: {
+				type: String,
+				default: 'u-hover-class'
+			}
+		},
+		created() {
+			this.childrens = []
+		},
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+			// 閲嶆柊鍒濆鍖栦竴娆″唴閮ㄧ殑鎵�鏈夊瓙鍏冪礌鐨勯珮搴﹁绠楋紝鐢ㄤ簬寮傛鑾峰彇鏁版嵁娓叉煋鐨勬儏鍐�
+			init() {
+				this.childrens.forEach((vm, index) => {
+					vm.init();
+				})
+			},
+			// collapse item琚偣鍑伙紝鐢眂ollapse item璋冪敤鐖剁粍浠舵柟娉�
+			onChange() {
+				let activeItem = [];
+				this.childrens.forEach((vm, index) => {
+					if (vm.isShow) {
+						activeItem.push(vm.nameSync);
+					}
+				})
+				// 濡傛灉鏄墜椋庣惔妯″紡锛屽彧鏈変竴涓尮閰嶇粨鏋滐紝涔熷嵆activeItem闀垮害涓�1锛屽皢鍏惰浆涓哄瓧绗︿覆
+				if (this.accordion) activeItem = activeItem.join('');
+				this.$emit('change', activeItem);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+</style>
diff --git a/uview-ui/components/u-column-notice/u-column-notice.vue b/uview-ui/components/u-column-notice/u-column-notice.vue
new file mode 100644
index 0000000..dd8bd31
--- /dev/null
+++ b/uview-ui/components/u-column-notice/u-column-notice.vue
@@ -0,0 +1,237 @@
+<template>
+	<view
+		class="u-notice-bar"
+		:style="{
+			background: computeBgColor,
+			padding: padding
+		}"
+		:class="[
+			type ? `u-type-${type}-light-bg` : ''
+		]"
+	>
+		<view class="u-icon-wrap">
+			<u-icon class="u-left-icon" v-if="volumeIcon" name="volume-fill" :size="volumeSize" :color="computeColor"></u-icon>
+		</view>
+		<swiper :disable-touch="disableTouch" @change="change" :autoplay="autoplay && playState == 'play'" :vertical="vertical" circular :interval="duration" class="u-swiper">
+			<swiper-item v-for="(item, index) in list" :key="index" class="u-swiper-item">
+				<view
+					class="u-news-item u-line-1"
+					:style="[textStyle]"
+					@tap="click(index)"
+					:class="['u-type-' + type]"
+				>
+					{{ item }}
+				</view>
+			</swiper-item>
+		</swiper>
+		<view class="u-icon-wrap">
+			<u-icon @click="getMore" class="u-right-icon" v-if="moreIcon" name="arrow-right" :size="26" :color="computeColor"></u-icon>
+			<u-icon @click="close" class="u-right-icon" v-if="closeIcon" name="close" :size="24" :color="computeColor"></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		// 鏄剧ず鐨勫唴瀹癸紝鏁扮粍
+		list: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 鏄剧ず鐨勪富棰橈紝success|error|primary|info|warning
+		type: {
+			type: String,
+			default: 'warning'
+		},
+		// 鏄惁鏄剧ず宸︿晶鐨勯煶閲忓浘鏍�
+		volumeIcon: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず鍙充晶鐨勫彸绠ご鍥炬爣
+		moreIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鏄剧ず鍙充晶鐨勫叧闂浘鏍�
+		closeIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鑷姩鎾斁
+		autoplay: {
+			type: Boolean,
+			default: true
+		},
+		// 鏂囧瓧棰滆壊锛屽悇鍥炬爣涔熶細浣跨敤鏂囧瓧棰滆壊
+		color: {
+			type: String,
+			default: ''
+		},
+		// 鑳屾櫙棰滆壊
+		bgColor: {
+			type: String,
+			default: ''
+		},
+		// 婊氬姩鏂瑰悜锛宺ow-姘村钩婊氬姩锛宑olumn-鍨傜洿婊氬姩
+		direction: {
+			type: String,
+			default: 'row'
+		},
+		// 鏄惁鏄剧ず
+		show: {
+			type: Boolean,
+			default: true
+		},
+		// 瀛椾綋澶у皬锛屽崟浣峳px
+		fontSize: {
+			type: [Number, String],
+			default: 26
+		},
+		// 婊氬姩涓�涓懆鏈熺殑鏃堕棿闀匡紝鍗曚綅ms
+		duration: {
+			type: [Number, String],
+			default: 2000
+		},
+		// 闊抽噺鍠囧彮鐨勫ぇ灏�
+		volumeSize: {
+			type: [Number, String],
+			default: 34
+		},
+		// 姘村钩婊氬姩鏃剁殑婊氬姩閫熷害锛屽嵆姣忕婊氬姩澶氬皯rpx锛岃繖鏈夊埄浜庢帶鍒舵枃瀛楁棤璁哄灏戞椂锛岄兘鑳芥湁涓�涓亽瀹氱殑閫熷害
+		speed: {
+			type: Number,
+			default: 160
+		},
+		// 姘村钩婊氬姩鏃讹紝鏄惁閲囩敤琛旀帴褰㈠紡婊氬姩
+		isCircular: {
+			type: Boolean,
+			default: true
+		},
+		// 婊氬姩鏂瑰悜锛宧orizontal-姘村钩婊氬姩锛寁ertical-鍨傜洿婊氬姩
+		mode: {
+			type: String,
+			default: 'horizontal'
+		},
+		// 鎾斁鐘舵�侊紝play-鎾斁锛宲aused-鏆傚仠
+		playState: {
+			type: String,
+			default: 'play'
+		},
+		// 鏄惁绂佹鐢ㄦ墜婊戝姩鍒囨崲
+		// 鐩墠HX2.6.11锛屽彧鏀寔App 2.5.5+銆丠5 2.5.5+銆佹敮浠樺疂灏忕▼搴忋�佸瓧鑺傝烦鍔ㄥ皬绋嬪簭
+		disableTouch: {
+			type: Boolean,
+			default: true
+		},
+		// 閫氱煡鐨勮竟璺�
+		padding: {
+			type: [Number, String],
+			default: '18rpx 24rpx'
+		}
+	},
+	computed: {
+		// 璁$畻瀛椾綋棰滆壊锛屽鏋滄病鏈夎嚜瀹氫箟鐨勶紝灏辩敤uview涓婚棰滆壊
+		computeColor() {
+			if (this.color) return this.color;
+			// 濡傛灉鏄棤涓婚锛屽氨榛樿浣跨敤content-color
+			else if(this.type == 'none') return '#606266';
+			else return this.type;
+		},
+		// 鏂囧瓧鍐呭鐨勬牱寮�
+		textStyle() {
+			let style = {};
+			if (this.color) style.color = this.color;
+			else if(this.type == 'none') style.color = '#606266';
+			style.fontSize = this.fontSize + 'rpx';
+			return style;
+		},
+		// 鍨傜洿鎴栬�呮按骞虫粴鍔�
+		vertical() {
+			if(this.mode == 'horizontal') return false;
+			else return true;
+		},
+		// 璁$畻鑳屾櫙棰滆壊
+		computeBgColor() {
+			if (this.bgColor) return this.bgColor;
+			else if(this.type == 'none') return 'transparent';
+		}
+	},
+	data() {
+		return {
+			// animation: false
+		};
+	},
+	methods: {
+		// 鐐瑰嚮閫氬憡鏍�
+		click(index) {
+			this.$emit('click', index);
+		},
+		// 鐐瑰嚮鍏抽棴鎸夐挳
+		close() {
+			this.$emit('close');
+		},
+		// 鐐瑰嚮鏇村绠ご鎸夐挳
+		getMore() {
+			this.$emit('getMore');
+		},
+		change(e) {
+			let index = e.detail.current;
+			if(index == this.list.length - 1) {
+				this.$emit('end');
+			}
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-notice-bar {
+	width: 100%;
+	@include vue-flex;
+	align-items: center;
+	justify-content: center;
+	flex-wrap: nowrap;
+	padding: 18rpx 24rpx;
+	overflow: hidden;
+}
+
+.u-swiper {
+	font-size: 26rpx;
+	height: 32rpx;
+	@include vue-flex;
+	align-items: center;
+	flex: 1;
+	margin-left: 12rpx;
+}
+
+.u-swiper-item {
+	@include vue-flex;
+	align-items: center;
+	overflow: hidden;
+}
+
+.u-news-item {
+	overflow: hidden;
+}
+
+.u-right-icon {
+	margin-left: 12rpx;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	align-items: center;
+}
+
+.u-left-icon {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	align-items: center;
+}
+</style>
diff --git a/uview-ui/components/u-count-down/u-count-down.vue b/uview-ui/components/u-count-down/u-count-down.vue
new file mode 100644
index 0000000..7285d67
--- /dev/null
+++ b/uview-ui/components/u-count-down/u-count-down.vue
@@ -0,0 +1,318 @@
+<template>
+	<view class="u-countdown">
+		<view class="u-countdown-item" :style="[itemStyle]" v-if="showDays && (hideZeroDay || (!hideZeroDay && d != '00'))">
+			<view class="u-countdown-time" :style="[letterStyle]">
+				{{ d }}
+			</view>
+		</view>
+		<view
+			class="u-countdown-colon"
+			:style="{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}"
+			v-if="showDays && (hideZeroDay || (!hideZeroDay && d != '00'))"
+		>
+			{{ separator == 'colon' ? ':' : '澶�' }}
+		</view>
+		<view class="u-countdown-item" :style="[itemStyle]" v-if="showHours">
+			<view class="u-countdown-time" :style="{ fontSize: fontSize + 'rpx', color: color}">
+				{{ h }}
+			</view>
+		</view>
+		<view
+			class="u-countdown-colon"
+			:style="{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}"
+			v-if="showHours"
+		>
+			{{ separator == 'colon' ? ':' : '鏃�' }}
+		</view>
+		<view class="u-countdown-item" :style="[itemStyle]" v-if="showMinutes">
+			<view class="u-countdown-time" :style="{ fontSize: fontSize + 'rpx', color: color}">
+				{{ i }}
+			</view>
+		</view>
+		<view
+			class="u-countdown-colon"
+			:style="{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}"
+			v-if="showMinutes"
+		>
+			{{ separator == 'colon' ? ':' : '鍒�' }}
+		</view>
+		<view class="u-countdown-item" :style="[itemStyle]" v-if="showSeconds">
+			<view class="u-countdown-time" :style="{ fontSize: fontSize + 'rpx', color: color}">
+				{{ s }}
+			</view>
+		</view>
+		<view
+			class="u-countdown-colon"
+			:style="{fontSize: separatorSize + 'rpx', color: separatorColor, paddingBottom: separator == 'colon' ? '4rpx' : 0}"
+			v-if="showSeconds && separator == 'zh'"
+		>
+			绉�
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * countDown 鍊掕鏃�
+ * @description 璇ョ粍浠朵竴鑸娇鐢ㄤ簬鏌愪釜娲诲姩鐨勬埅姝㈡椂闂翠笂锛岄�氳繃鏁板瓧鐨勫彉鍖栵紝缁欑敤鎴锋槑纭殑鏃堕棿鎰熷彈锛屾彁绀虹敤鎴疯繘琛屾煇涓�涓涓烘搷浣溿��
+ * @tutorial https://www.uviewui.com/components/countDown.html
+ * @property {String Number} timestamp 鍊掕鏃讹紝鍗曚綅涓虹
+ * @property {Boolean} autoplay 鏄惁鑷姩寮�濮嬪�掕鏃讹紝濡傛灉涓篺alse锛岄渶鎵嬪姩璋冪敤寮�濮嬫柟娉曘�傝瀹樼綉璇存槑锛堥粯璁rue锛�
+ * @property {String} separator 鍒嗛殧绗︼紝colon涓鸿嫳鏂囧啋鍙凤紝zh涓轰腑鏂囷紙榛樿colon锛�
+ * @property {String Number} separator-size 鍒嗛殧绗︾殑瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�30锛�
+ * @property {String} separator-color 鍒嗛殧绗︾殑棰滆壊锛堥粯璁�#303133锛�
+ * @property {String Number} font-size 鍊掕鏃跺瓧浣撳ぇ灏忥紝鍗曚綅rpx锛堥粯璁�30锛�
+ * @property {Boolean} show-border 鏄惁鏄剧ず鍊掕鏃舵暟瀛楃殑杈规锛堥粯璁alse锛�
+ * @property {Boolean} hide-zero-day 褰�"澶�"鐨勯儴鍒嗕负0鏃讹紝闅愯棌璇ュ瓧娈� 锛堥粯璁rue锛�
+ * @property {String} border-color 鏁板瓧杈规鐨勯鑹诧紙榛樿#303133锛�
+ * @property {String} bg-color 鍊掕鏃舵暟瀛楃殑鑳屾櫙棰滆壊锛堥粯璁�#ffffff锛�
+ * @property {String} color 鍊掕鏃舵暟瀛楃殑棰滆壊锛堥粯璁�#303133锛�
+ * @property {String} height 鏁板瓧楂樺害鍊�(瀹藉害绛夊悓姝ゅ��)锛岃缃竟妗嗘椂鐪嬫儏鍐垫槸鍚﹂渶瑕佽缃鍊硷紝鍗曚綅rpx锛堥粯璁uto锛�
+ * @property {Boolean} show-days 鏄惁鏄剧ず鍊掕鏃剁殑"澶�"閮ㄥ垎锛堥粯璁rue锛�
+ * @property {Boolean} show-hours 鏄惁鏄剧ず鍊掕鏃剁殑"鏃�"閮ㄥ垎锛堥粯璁rue锛�
+ * @property {Boolean} show-minutes 鏄惁鏄剧ず鍊掕鏃剁殑"鍒�"閮ㄥ垎锛堥粯璁rue锛�
+ * @property {Boolean} show-seconds 鏄惁鏄剧ず鍊掕鏃剁殑"绉�"閮ㄥ垎锛堥粯璁rue锛�
+ * @event {Function} end 鍊掕鏃剁粨鏉�
+ * @event {Function} change 姣忕瑙﹀彂涓�娆★紝鍥炶皟涓哄綋鍓嶅墿浣欑殑鍊掕绉掓暟
+ * @example <u-count-down ref="uCountDown" :timestamp="86400" :autoplay="false"></u-count-down>
+ */
+export default {
+	name: 'u-count-down',
+	props: {
+		// 鍊掕鏃剁殑鏃堕棿锛岀涓哄崟浣�
+		timestamp: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鏄惁鑷姩寮�濮嬪�掕鏃�
+		autoplay: {
+			type: Boolean,
+			default: true
+		},
+		// 鐢ㄨ嫳鏂囧啋鍙�(colon)鎴栬�呬腑鏂�(zh)褰撳仛鍒嗛殧绗︼紝false鐨勬椂鍊欎负涓枃锛屽锛�"11:22"鎴�"11鏃�22绉�"
+		separator: {
+			type: String,
+			default: 'colon'
+		},
+		// 鍒嗛殧绗︾殑澶у皬锛屽崟浣峳px
+		separatorSize: {
+			type: [Number, String],
+			default: 30
+		},
+		// 鍒嗛殧绗﹂鑹�
+		separatorColor: {
+			type: String,
+			default: "#303133"
+		},
+		// 瀛椾綋棰滆壊
+		color: {
+			type: String,
+			default: '#303133'
+		},
+		// 瀛椾綋澶у皬锛屽崟浣峳px
+		fontSize: {
+			type: [Number, String],
+			default: 30
+		},
+		// 鑳屾櫙棰滆壊
+		bgColor: {
+			type: String,
+			default: '#fff'
+		},
+		// 鏁板瓧妗嗛珮搴︼紝鍗曚綅rpx
+		height: {
+			type: [Number, String],
+			default: 'auto'
+		},
+		// 鏄惁鏄剧ず鏁板瓧妗�
+		showBorder: {
+			type: Boolean,
+			default: false
+		},
+		// 杈规棰滆壊
+		borderColor: {
+			type: String,
+			default: '#303133'
+		},
+		// 鏄惁鏄剧ず绉�
+		showSeconds: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず鍒嗛挓
+		showMinutes: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず灏忔椂
+		showHours: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず鈥滃ぉ鈥�
+		showDays: {
+			type: Boolean,
+			default: true
+		},
+		// 褰�"澶�"鐨勯儴鍒嗕负0鏃讹紝涓嶆樉绀�
+		hideZeroDay: {
+			type: Boolean,
+			default: false
+		}
+	},
+	watch: {
+		// 鐩戝惉鏃堕棿鎴崇殑鍙樺寲
+		timestamp(newVal, oldVal) {
+			// 濡傛灉鍊掕鏃堕棿鍙戠敓鍙樺寲锛屾竻闄ゅ畾鏃跺櫒锛岄噸鏂板紑濮嬪�掕鏃�
+			this.clearTimer();
+			this.start();
+		}
+	},
+	data() {
+		return {
+			d: '00', // 澶╃殑榛樿鍊�
+			h: '00', // 灏忔椂鐨勯粯璁ゅ��
+			i: '00', // 鍒嗛挓鐨勯粯璁ゅ��
+			s: '00', // 绉掔殑榛樿鍊�
+			timer: null ,// 瀹氭椂鍣�
+			seconds: 0, // 璁板綍涓嶅仠鍊掕杩囩▼涓彉鍖栫殑绉掓暟
+		};
+	},
+	computed: {
+		// 鍊掕鏃秈tem鐨勬牱寮忥紝item涓哄垎鍒殑鏃跺垎绉掗儴鍒嗙殑鏁板瓧
+		itemStyle() {
+			let style = {};
+			if(this.height) {
+				style.height = this.height + 'rpx';
+				style.width = this.height + 'rpx';
+			}
+			if(this.showBorder) {
+				style.borderStyle = 'solid';
+				style.borderColor = this.borderColor;
+				style.borderWidth = '1px';
+			}
+			if(this.bgColor) {
+				style.backgroundColor = this.bgColor;
+			}
+			return style;
+		},
+		// 鍊掕鏃舵暟瀛楃殑鏍峰紡
+		letterStyle() {
+			let style = {};
+			if(this.fontSize) style.fontSize = this.fontSize +  'rpx';
+			if(this.color) style.color = this.color;
+			return style;
+		}
+	},
+	mounted() {
+		// 濡傛灉鑷姩鍊掕鏃�
+		this.autoplay && this.timestamp && this.start();
+	},
+	methods: {
+		// 鍊掕鏃�
+		start() {
+			// 閬垮厤鍙兘鍑虹幇鐨勫�掕鏃堕噸鍙犳儏鍐�
+			this.clearTimer();
+			if (this.timestamp <= 0) return;
+			this.seconds = Number(this.timestamp);
+			this.formatTime(this.seconds);
+			this.timer = setInterval(() => {
+				this.seconds--;
+				// 鍙戝嚭change浜嬩欢
+				this.$emit('change', this.seconds);
+				if (this.seconds < 0) {
+					return this.end();
+				}
+				this.formatTime(this.seconds);
+			}, 1000);
+		},
+		// 鏍煎紡鍖栨椂闂�
+		formatTime(seconds) {
+			// 灏忎簬绛変簬0鐨勮瘽锛岀粨鏉熷�掕鏃�
+			seconds <= 0 && this.end();
+			let [day, hour, minute, second] = [0, 0, 0, 0];
+			day = Math.floor(seconds / (60 * 60 * 24));
+			// 鍒ゆ柇鏄惁鏄剧ず鈥滃ぉ鈥濆弬鏁帮紝濡傛灉涓嶆樉绀猴紝灏嗗ぉ閮ㄥ垎鐨勫�硷紝鍔犲叆鍒板皬鏃朵腑
+			// hour涓虹粰鍚庨潰璁$畻绉掑拰鍒嗙瓑鐢ㄧ殑(鍩轰簬鏄剧ず澶╃殑鍓嶆彁涓嬭绠�)
+			hour = Math.floor(seconds / (60 * 60)) - day * 24;
+			// showHour涓洪渶瑕佹樉绀虹殑灏忔椂
+			let showHour = null;
+			if(this.showDays) {
+				showHour = hour;
+			} else {
+				// 濡傛灉涓嶆樉绀哄ぉ鏁帮紝灏嗏�滃ぉ鈥濋儴鍒嗙殑鏃堕棿鎶樼畻鍒板皬鏃朵腑鍘�
+				showHour = Math.floor(seconds / (60 * 60));
+			}
+			minute = Math.floor(seconds / 60) - hour * 60 - day * 24 * 60;
+			second = Math.floor(seconds) - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60;
+			// 濡傛灉灏忎簬10锛屽湪鍓嶉潰琛ヤ笂涓�涓�"0"
+			showHour = showHour < 10 ? '0' + showHour : showHour;
+			minute = minute < 10 ? '0' + minute : minute;
+			second = second < 10 ? '0' + second : second;
+			day = day < 10 ? '0' + day : day;
+			this.d = day;
+			this.h = showHour;
+			this.i = minute;
+			this.s = second;
+		},
+		// 鍋滄鍊掕鏃�
+		end() {
+			this.clearTimer();
+			this.$emit('end', {});
+		},
+		// 娓呴櫎瀹氭椂鍣�
+		clearTimer() {
+			if(this.timer) {
+				// 娓呴櫎瀹氭椂鍣�
+				clearInterval(this.timer);
+				this.timer = null;
+			}
+		}
+	},
+	beforeDestroy() {
+		clearInterval(this.timer);
+		this.timer = null;
+	}
+};
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	.u-countdown {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
+		align-items: center;
+	}
+
+	.u-countdown-item {
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		padding: 2rpx;
+		border-radius: 6rpx;
+		white-space: nowrap;
+		transform: translateZ(0);
+	}
+
+	.u-countdown-time {
+		margin: 0;
+		padding: 0;
+		line-height: 1;
+	}
+
+	.u-countdown-colon {
+		@include vue-flex;
+		justify-content: center;
+		padding: 0 5rpx;
+		line-height: 1;
+		align-items: center;
+		padding-bottom: 4rpx;
+	}
+
+	.u-countdown-scale {
+		transform: scale(0.9);
+		transform-origin: center center;
+	}
+</style>
diff --git a/uview-ui/components/u-count-to/u-count-to.vue b/uview-ui/components/u-count-to/u-count-to.vue
new file mode 100644
index 0000000..053dc5f
--- /dev/null
+++ b/uview-ui/components/u-count-to/u-count-to.vue
@@ -0,0 +1,241 @@
+<template>
+	<view
+		class="u-count-num"
+		:style="{
+			fontSize: fontSize + 'rpx',
+			fontWeight: bold ? 'bold' : 'normal',
+			color: color
+		}"
+	>
+		{{ displayValue }}
+	</view>
+</template>
+
+<script>
+/**
+ * countTo 鏁板瓧婊氬姩
+ * @description 璇ョ粍浠朵竴鑸敤浜庨渶瑕佹粴鍔ㄦ暟瀛楀埌鏌愪竴涓�肩殑鍦烘櫙锛岀洰鏍囪姹傛槸涓�涓�掑鐨勫�笺��
+ * @tutorial https://www.uviewui.com/components/countTo.html
+ * @property {String Number} start-val 寮�濮嬪��
+ * @property {String Number} end-val 缁撴潫鍊�
+ * @property {String Number} duration 婊氬姩杩囩▼鎵�闇�鐨勬椂闂达紝鍗曚綅ms锛堥粯璁�2000锛�
+ * @property {Boolean} autoplay 鏄惁鑷姩寮�濮嬫粴鍔紙榛樿true锛�
+ * @property {String Number} decimals 瑕佹樉绀虹殑灏忔暟浣嶆暟锛岃瀹樼綉璇存槑锛堥粯璁�0锛�
+ * @property {Boolean} use-easing 婊氬姩缁撴潫鏃讹紝鏄惁缂撳姩缁撳熬锛岃瀹樼綉璇存槑锛堥粯璁rue锛�
+ * @property {String} separator 鍗冧綅鍒嗛殧绗︼紝瑙佸畼缃戣鏄�
+ * @property {String} color 瀛椾綋棰滆壊锛堥粯璁�#303133锛�
+ * @property {String Number} font-size 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�50锛�
+ * @property {Boolean} bold 瀛椾綋鏄惁鍔犵矖锛堥粯璁alse锛�
+ * @event {Function} end 鏁板�兼粴鍔ㄥ埌鐩爣鍊兼椂瑙﹀彂
+ * @example <u-count-to ref="uCountTo" :end-val="endVal" :autoplay="autoplay"></u-count-to>
+ */
+export default {
+	name: 'u-count-to',
+	props: {
+		// 寮�濮嬬殑鏁板�硷紝榛樿浠�0澧為暱鍒版煇涓�涓暟
+		startVal: {
+			type: [Number, String],
+			default: 0
+		},
+		// 瑕佹粴鍔ㄧ殑鐩爣鏁板�硷紝蹇呴』
+		endVal: {
+			type: [Number, String],
+			default: 0,
+			required: true
+		},
+		// 婊氬姩鍒扮洰鏍囨暟鍊肩殑鍔ㄧ敾鎸佺画鏃堕棿锛屽崟浣嶄负姣锛坢s锛�
+		duration: {
+			type: [Number, String],
+			default: 2000
+		},
+		// 璁剧疆鏁板�煎悗鏄惁鑷姩寮�濮嬫粴鍔�
+		autoplay: {
+			type: Boolean,
+			default: true
+		},
+		// 瑕佹樉绀虹殑灏忔暟浣嶆暟
+		decimals: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鏄惁鍦ㄥ嵆灏嗗埌杈剧洰鏍囨暟鍊肩殑鏃跺�欙紝浣跨敤缂撴參婊氬姩鐨勬晥鏋�
+		useEasing: {
+			type: Boolean,
+			default: true
+		},
+		// 鍗佽繘鍒跺垎鍓�
+		decimal: {
+			type: [Number, String],
+			default: '.'
+		},
+		// 瀛椾綋棰滆壊
+		color: {
+			type: String,
+			default: '#303133'
+		},
+		// 瀛椾綋澶у皬
+		fontSize: {
+			type: [Number, String],
+			default: 50
+		},
+		// 鏄惁鍔犵矖瀛椾綋
+		bold: {
+			type: Boolean,
+			default: false
+		},
+		// 鍗冧綅鍒嗛殧绗︼紝绫讳技閲戦鐨勫垎鍓�(锟�23,321.05涓殑",")
+		separator: {
+			type: String,
+			default: ''
+		}
+	},
+	data() {
+		return {
+			localStartVal: this.startVal,
+			displayValue: this.formatNumber(this.startVal),
+			printVal: null,
+			paused: false, // 鏄惁鏆傚仠
+			localDuration: Number(this.duration),
+			startTime: null, // 寮�濮嬬殑鏃堕棿
+			timestamp: null, // 鏃堕棿鎴�
+			remaining: null, // 鍋滅暀鐨勬椂闂�
+			rAF: null,
+			lastTime: 0 // 涓婁竴娆$殑鏃堕棿
+		};
+	},
+	computed: {
+		countDown() {
+			return this.startVal > this.endVal;
+		}
+	},
+	watch: {
+		startVal() {
+			this.autoplay && this.start();
+		},
+		endVal() {
+			this.autoplay && this.start();
+		}
+	},
+	mounted() {
+		this.autoplay && this.start();
+	},
+	methods: {
+		easingFn(t, b, c, d) {
+			return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;
+		},
+		requestAnimationFrame(callback) {
+			const currTime = new Date().getTime();
+			// 涓轰簡浣縮etTimteout鐨勫敖鍙兘鐨勬帴杩戞瘡绉�60甯х殑鏁堟灉
+			const timeToCall = Math.max(0, 16 - (currTime - this.lastTime));
+			const id = setTimeout(() => {
+				callback(currTime + timeToCall);
+			}, timeToCall);
+			this.lastTime = currTime + timeToCall;
+			return id;
+		},
+
+		cancelAnimationFrame(id) {
+			clearTimeout(id);
+		},
+		// 寮�濮嬫粴鍔ㄦ暟瀛�
+		start() {
+			this.localStartVal = this.startVal;
+			this.startTime = null;
+			this.localDuration = this.duration;
+			this.paused = false;
+			this.rAF = this.requestAnimationFrame(this.count);
+		},
+		// 鏆傚畾鐘舵�侊紝閲嶆柊鍐嶅紑濮嬫粴鍔紱鎴栬�呮粴鍔ㄧ姸鎬佷笅锛屾殏鍋�
+		reStart() {
+			if (this.paused) {
+				this.resume();
+				this.paused = false;
+			} else {
+				this.stop();
+				this.paused = true;
+			}
+		},
+		// 鏆傚仠
+		stop() {
+			this.cancelAnimationFrame(this.rAF);
+		},
+		// 閲嶆柊寮�濮�(鏆傚仠鐨勬儏鍐典笅)
+		resume() {
+			this.startTime = null;
+			this.localDuration = this.remaining;
+			this.localStartVal = this.printVal;
+			this.requestAnimationFrame(this.count);
+		},
+		// 閲嶇疆
+		reset() {
+			this.startTime = null;
+			this.cancelAnimationFrame(this.rAF);
+			this.displayValue = this.formatNumber(this.startVal);
+		},
+		count(timestamp) {
+			if (!this.startTime) this.startTime = timestamp;
+			this.timestamp = timestamp;
+			const progress = timestamp - this.startTime;
+			this.remaining = this.localDuration - progress;
+			if (this.useEasing) {
+				if (this.countDown) {
+					this.printVal = this.localStartVal - this.easingFn(progress, 0, this.localStartVal - this.endVal, this.localDuration);
+				} else {
+					this.printVal = this.easingFn(progress, this.localStartVal, this.endVal - this.localStartVal, this.localDuration);
+				}
+			} else {
+				if (this.countDown) {
+					this.printVal = this.localStartVal - (this.localStartVal - this.endVal) * (progress / this.localDuration);
+				} else {
+					this.printVal = this.localStartVal + (this.endVal - this.localStartVal) * (progress / this.localDuration);
+				}
+			}
+			if (this.countDown) {
+				this.printVal = this.printVal < this.endVal ? this.endVal : this.printVal;
+			} else {
+				this.printVal = this.printVal > this.endVal ? this.endVal : this.printVal;
+			}
+			this.displayValue = this.formatNumber(this.printVal);
+			if (progress < this.localDuration) {
+				this.rAF = this.requestAnimationFrame(this.count);
+			} else {
+				this.$emit('end');
+			}
+		},
+		// 鍒ゆ柇鏄惁鏁板瓧
+		isNumber(val) {
+			return !isNaN(parseFloat(val));
+		},
+		formatNumber(num) {
+			// 灏唍um杞负Number绫诲瀷锛屽洜涓哄叾鍊煎彲鑳戒负瀛楃涓叉暟鍊硷紝璋冪敤toFixed浼氭姤閿�
+			num = Number(num);
+			num = num.toFixed(Number(this.decimals));
+			num += '';
+			const x = num.split('.');
+			let x1 = x[0];
+			const x2 = x.length > 1 ? this.decimal + x[1] : '';
+			const rgx = /(\d+)(\d{3})/;
+			if (this.separator && !this.isNumber(this.separator)) {
+				while (rgx.test(x1)) {
+					x1 = x1.replace(rgx, '$1' + this.separator + '$2');
+				}
+			}
+			return x1 + x2;
+		},
+		destroyed() {
+			this.cancelAnimationFrame(this.rAF);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-count-num {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+	text-align: center;
+}
+</style>
diff --git a/uview-ui/components/u-divider/u-divider.vue b/uview-ui/components/u-divider/u-divider.vue
new file mode 100644
index 0000000..6f8d7e6
--- /dev/null
+++ b/uview-ui/components/u-divider/u-divider.vue
@@ -0,0 +1,153 @@
+<template>
+	<view class="u-divider" :style="{
+		height: height == 'auto' ? 'auto' : height + 'rpx',
+		backgroundColor: bgColor,
+		marginBottom: marginBottom + 'rpx',
+		marginTop: marginTop + 'rpx'
+	}" @tap="click">
+		<view class="u-divider-line" :class="[type ? 'u-divider-line--bordercolor--' + type : '']" :style="[lineStyle]"></view>
+		<view v-if="useSlot" class="u-divider-text" :style="{
+			color: color,
+			fontSize: fontSize + 'rpx'
+		}"><slot /></view>
+		<view class="u-divider-line" :class="[type ? 'u-divider-line--bordercolor--' + type : '']" :style="[lineStyle]"></view>
+	</view>
+</template>
+
+<script>
+/**
+ * divider 鍒嗗壊绾�
+ * @description 鍖洪殧鍐呭鐨勫垎鍓茬嚎锛屼竴鑸敤浜庨〉闈㈠簳閮�"娌℃湁鏇村"鐨勬彁绀恒��
+ * @tutorial https://www.uviewui.com/components/divider.html
+ * @property {String Number} half-width 鏂囧瓧宸︽垨鍙宠竟绾挎潯瀹藉害锛屾暟鍊兼垨鐧惧垎姣旓紝鏁板�兼椂鍗曚綅涓簉px
+ * @property {String} border-color 绾挎潯棰滆壊锛屼紭鍏堢骇楂樹簬type锛堥粯璁�#dcdfe6锛�
+ * @property {String} color 鏂囧瓧棰滆壊锛堥粯璁�#909399锛�
+ * @property {String Number} fontSize 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�26锛�
+ * @property {String} bg-color 鏁翠釜divider鐨勮儗鏅鑹诧紙榛樿鍛�#ffffff锛�
+ * @property {String Number} height 鏁翠釜divider鐨勯珮搴︼紝鍗曚綅rpx锛堥粯璁�40锛�
+ * @property {String} type 灏嗙嚎鏉¤缃富棰樿壊锛堥粯璁rimary锛�
+ * @property {Boolean} useSlot 鏄惁浣跨敤slot浼犲叆鍐呭锛屽鏋滀笉浼犲叆锛屼腑闂翠笉浼氭湁绌洪殭锛堥粯璁rue锛�
+ * @property {String Number} margin-top 涓庡墠涓�涓粍浠剁殑璺濈锛屽崟浣峳px锛堥粯璁�0锛�
+ * @property {String Number} margin-bottom 涓庡悗涓�涓粍浠剁殑璺濈锛屽崟浣峳px锛�0锛�
+ * @event {Function} click divider缁勪欢琚偣鍑绘椂瑙﹀彂
+ * @example <u-divider color="#fa3534">闀挎渤钀芥棩鍦�</u-divider>
+ */
+export default {
+	name: 'u-divider',
+	props: {
+		// 鍗曚竴杈筪ivider妯嚎鐨勫搴�(鏁板��)锛屽崟浣峳px銆傛垨鑰呯櫨鍒嗘瘮
+		halfWidth: {
+			type: [Number, String],
+			default: 150
+		},
+		// divider妯嚎鐨勯鑹诧紝濡傝缃紝
+		borderColor: {
+			type: String,
+			default: '#dcdfe6'
+		},
+		// 涓婚鑹诧紝鍙互鏄痯rimary|info|success|warning|error涔嬩竴鍊�
+		type: {
+			type: String,
+			default: 'primary'
+		},
+		// 鏂囧瓧棰滆壊
+		color: {
+			type: String,
+			default: '#909399'
+		},
+		// 鏂囧瓧澶у皬锛屽崟浣峳px
+		fontSize: {
+			type: [Number, String],
+			default: 26
+		},
+		// 鏁翠釜divider鐨勮儗鏅鑹�
+		bgColor: {
+			type: String,
+			default: '#ffffff'
+		},
+		// 鏁翠釜divider鐨勯珮搴﹀崟浣峳px
+		height: {
+			type: [Number, String],
+			default: 'auto'
+		},
+		// 涓婅竟璺�
+		marginTop: {
+			type: [String, Number],
+			default: 0
+		},
+		// 涓嬭竟璺�
+		marginBottom: {
+			type: [String, Number],
+			default: 0
+		},
+		// 鏄惁浣跨敤slot浼犲叆鍐呭锛屽鏋滀笉鐢╯lot浼犲叆鍐呭锛屽厛鐨勪腑闂村氨涓嶄細鏈夌┖闅�
+		useSlot: {
+			type: Boolean,
+			default: true
+		}
+	},
+	computed: {
+		lineStyle() {
+			let style = {};
+			if(String(this.halfWidth).indexOf('%') != -1) style.width = this.halfWidth;
+			else style.width = this.halfWidth + 'rpx';
+			// borderColor浼樺厛绾ч珮浜巘ype鍊�
+			if(this.borderColor) style.borderColor = this.borderColor;
+			return style;
+		}
+	},
+	methods: {
+		click() {
+			this.$emit('click');
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+.u-divider {
+	width: 100%;
+	position: relative;
+	text-align: center;
+	@include vue-flex;
+	justify-content: center;
+	align-items: center;
+	overflow: hidden;
+	flex-direction: row;
+}
+
+.u-divider-line {
+	border-bottom: 1px solid $u-border-color;
+	transform: scale(1, 0.5);
+	transform-origin: center;
+	
+	&--bordercolor--primary {
+		border-color: $u-type-primary;
+	}
+	
+	&--bordercolor--success {
+		border-color: $u-type-success;
+	}
+	
+	&--bordercolor--error {
+		border-color: $u-type-primary;
+	}
+	
+	&--bordercolor--info {
+		border-color: $u-type-info;
+	}
+	
+	&--bordercolor--warning {
+		border-color: $u-type-warning;
+	}
+}
+
+.u-divider-text {
+	white-space: nowrap;
+	padding: 0 16rpx;
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+}
+</style>
diff --git a/uview-ui/components/u-dropdown-item/u-dropdown-item.vue b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue
new file mode 100644
index 0000000..6ccf217
--- /dev/null
+++ b/uview-ui/components/u-dropdown-item/u-dropdown-item.vue
@@ -0,0 +1,132 @@
+<template>
+	<view class="u-dropdown-item" v-if="active" @touchmove.stop.prevent="() => {}" @tap.stop.prevent="() => {}">
+		<block v-if="!$slots.default && !$slots.$default">
+			<scroll-view scroll-y="true" :style="{
+				height: $u.addUnit(height)
+			}">
+				<view class="u-dropdown-item__options">
+					<u-cell-group>
+						<u-cell-item @click="cellClick(item.value)" :arrow="false" :title="item.label" v-for="(item, index) in options"
+						 :key="index" :title-style="{
+							color: value == item.value ? activeColor : inactiveColor
+						}">
+							<u-icon v-if="value == item.value" name="checkbox-mark" :color="activeColor" size="32"></u-icon>
+						</u-cell-item>
+					</u-cell-group>
+				</view>
+			</scroll-view>
+		</block>
+		<slot v-else />
+	</view>
+</template>
+
+<script>
+	/**
+	 * dropdown-item 涓嬫媺鑿滃崟
+	 * @description 璇ョ粍浠朵竴鑸敤浜庡悜涓嬪睍寮�鑿滃崟锛屽悓鏃跺彲鍒囨崲澶氫釜閫夐」鍗$殑鍦烘櫙
+	 * @tutorial http://uviewui.com/components/dropdown.html
+	 * @property {String | Number} v-model 鍙屽悜缁戝畾閫夐」鍗¢�夋嫨鍊�
+	 * @property {String} title 鑿滃崟椤规爣棰�
+	 * @property {Array[Object]} options 閫夐」鏁版嵁锛屽鏋滀紶鍏ヤ簡榛樿slot锛屾鍙傛暟鏃犳晥
+	 * @property {Boolean} disabled 鏄惁绂佺敤姝ら�夐」鍗★紙榛樿false锛�
+	 * @property {String | Number} duration 閫夐」鍗″睍寮�鍜屾敹璧风殑杩囨浮鏃堕棿锛屽崟浣峬s锛堥粯璁�300锛�
+	 * @property {String | Number} height 寮圭獥涓嬫媺鍐呭鐨勯珮搴�(鍐呭瓒呭嚭灏嗕細婊氬姩)锛堥粯璁uto锛�
+	 * @example <u-dropdown-item title="鏍囬"></u-dropdown-item>
+	 */
+	export default {
+		name: 'u-dropdown-item',
+		props: {
+			// 褰撳墠閫変腑椤圭殑value鍊�
+			value: {
+				type: [Number, String, Array],
+				default: ''
+			},
+			// 鑿滃崟椤规爣棰�
+			title: {
+				type: [String, Number],
+				default: ''
+			},
+			// 閫夐」鏁版嵁锛屽鏋滀紶鍏ヤ簡榛樿slot锛屾鍙傛暟鏃犳晥
+			options: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 鏄惁绂佺敤姝よ彍鍗曢」
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 涓嬫媺寮圭獥鐨勯珮搴�
+			height: {
+				type: [Number, String],
+				default: 'auto'
+			},
+		},
+		data() {
+			return {
+				active: false, // 褰撳墠椤规槸鍚﹀浜庡睍寮�鐘舵��
+				activeColor: '#497bff', // 婵�娲绘椂宸﹁竟鏂囧瓧鍜屽彸杈瑰鍕惧浘鏍囩殑棰滆壊
+				inactiveColor: '#606266', // 鏈縺娲绘椂宸﹁竟鏂囧瓧鍜屽彸杈瑰鍕惧浘鏍囩殑棰滆壊
+			}
+		},
+		computed: {
+			// 鐩戝惉props鏄惁鍙戠敓浜嗗彉鍖栵紝鏈変簺鍊奸渶瑕佷紶閫掔粰鐖剁粍浠秛-dropdown锛屾棤娉曞弻鍚戠粦瀹�
+			propsChange() {
+				return `${this.title}-${this.disabled}`;
+			}
+		},
+		watch: {
+			propsChange(n) {
+				// 褰撳�煎彉鍖栨椂锛岄�氱煡鐖剁粍浠堕噸鏂板垵濮嬪寲锛岃鐖剁粍浠舵墽琛屾瘡涓瓙缁勪欢鐨刬nit()鏂规硶
+				// 灏嗘墍鏈夊瓙缁勪欢鏁版嵁閲嶆柊鏁寸悊涓�閬�
+				if (this.parent) this.parent.init();
+			}
+		},
+		created() {
+			// 鐖剁粍浠剁殑瀹炰緥
+			this.parent = false;
+		},
+		methods: {
+			init() {
+				// 鑾峰彇鐖剁粍浠秛-dropdown
+				let parent = this.$u.$parent.call(this, 'u-dropdown');
+				if (parent) {
+					this.parent = parent;
+					// 灏嗗瓙缁勪欢鐨勬縺娲婚鑹查厤缃负鐖剁粍浠惰缃殑婵�娲诲拰鏈縺娲绘椂鐨勯鑹�
+					this.activeColor = parent.activeColor;
+					this.inactiveColor = parent.inactiveColor;
+					// 灏嗘湰缁勪欢鐨則his锛屾斁鍏ュ埌鐖剁粍浠剁殑children鏁扮粍涓紝璁╃埗缁勪欢鍙互鎿嶄綔鏈�(瀛�)缁勪欢鐨勬柟娉曞拰灞炴��
+					// push杩涘幓鍓嶏紝鏄惧垽鏂槸鍚﹀凡缁忓瓨鍦ㄤ簡鏈疄渚嬶紝鍥犱负鍦ㄥ瓙缁勪欢鍐呴儴鏁版嵁鍙樺寲鏃讹紝浼氶�氳繃鐖剁粍浠堕噸鏂板垵濮嬪寲瀛愮粍浠�
+					let exist = parent.children.find(val => {
+						return this === val;
+					})
+					if (!exist) parent.children.push(this);
+					if (parent.children.length == 1) this.active = true;
+					// 鐖剁粍浠舵棤娉曠洃鍚琧hildren鐨勫彉鍖栵紝鏁呭皢瀛愮粍浠剁殑title锛屼紶鍏ョ埗缁勪欢鐨刴enuList鏁扮粍涓�
+					parent.menuList.push({
+						title: this.title,
+						disabled: this.disabled
+					});
+				}
+			},
+			// cell琚偣鍑�
+			cellClick(value) {
+				// 淇敼閫氳繃v-model缁戝畾鐨勫��
+				this.$emit('input', value);
+				// 閫氱煡鐖剁粍浠�(u-dropdown)鏀惰捣鑿滃崟
+				this.parent.close();
+				// 鍙戝嚭浜嬩欢锛屾姏鍑哄綋鍓嶅嬀閫夐」鐨剉alue
+				this.$emit('change', value);
+			}
+		},
+		mounted() {
+			this.init();
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+</style>
diff --git a/uview-ui/components/u-dropdown/u-dropdown.vue b/uview-ui/components/u-dropdown/u-dropdown.vue
new file mode 100644
index 0000000..a665cc8
--- /dev/null
+++ b/uview-ui/components/u-dropdown/u-dropdown.vue
@@ -0,0 +1,298 @@
+<template>
+	<view class="u-dropdown">
+		<view class="u-dropdown__menu" :style="{
+			height: $u.addUnit(height)
+		}" :class="{
+			'u-border-bottom': borderBottom
+		}">
+			<view class="u-dropdown__menu__item" v-for="(item, index) in menuList" :key="index" @tap.stop="menuClick(index)">
+				<view class="u-flex">
+					<text class="u-dropdown__menu__item__text" :style="{
+						color: item.disabled ? '#c0c4cc' : (index === current || highlightIndex == index) ? activeColor : inactiveColor,
+						fontSize: $u.addUnit(titleSize)
+					}">{{item.title}}</text>
+					<view class="u-dropdown__menu__item__arrow" :class="{
+						'u-dropdown__menu__item__arrow--rotate': index === current
+					}">
+						<u-icon :custom-style="{display: 'flex'}" :name="menuIcon" :size="$u.addUnit(menuIconSize)" :color="index === current || highlightIndex == index ? activeColor : '#c0c4cc'"></u-icon>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="u-dropdown__content" :style="[contentStyle, {
+			transition: `opacity ${duration / 1000}s linear`,
+			top: $u.addUnit(height),
+			height: contentHeight + 'px'
+		}]"
+		 @tap="maskClick" @touchmove.stop.prevent>
+			<view @tap.stop.prevent class="u-dropdown__content__popup" :style="[popupStyle]">
+				<slot></slot>
+			</view>
+			<view class="u-dropdown__content__mask"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * dropdown 涓嬫媺鑿滃崟
+	 * @description 璇ョ粍浠朵竴鑸敤浜庡悜涓嬪睍寮�鑿滃崟锛屽悓鏃跺彲鍒囨崲澶氫釜閫夐」鍗$殑鍦烘櫙
+	 * @tutorial http://uviewui.com/components/dropdown.html
+	 * @property {String} active-color 鏍囬鍜岄�夐」鍗¢�変腑鐨勯鑹诧紙榛樿#497bff锛�
+	 * @property {String} inactive-color 鏍囬鍜岄�夐」鍗℃湭閫変腑鐨勯鑹诧紙榛樿#606266锛�
+	 * @property {Boolean} close-on-click-mask 鐐瑰嚮閬僵鏄惁鍏抽棴鑿滃崟锛堥粯璁rue锛�
+	 * @property {Boolean} close-on-click-self 鐐瑰嚮褰撳墠婵�娲婚」鏍囬鏄惁鍏抽棴鑿滃崟锛堥粯璁rue锛�
+	 * @property {String | Number} duration 閫夐」鍗″睍寮�鍜屾敹璧风殑杩囨浮鏃堕棿锛屽崟浣峬s锛堥粯璁�300锛�
+	 * @property {String | Number} height 鏍囬鑿滃崟鐨勯珮搴︼紝鍗曚綅浠绘剰锛堥粯璁�80锛�
+	 * @property {String | Number} border-radius 鑿滃崟灞曞紑鍐呭涓嬫柟鐨勫渾瑙掑�硷紝鍗曚綅浠绘剰锛堥粯璁�0锛�
+	 * @property {Boolean} border-bottom 鏍囬鑿滃崟鏄惁鏄剧ず涓嬭竟妗嗭紙榛樿false锛�
+	 * @property {String | Number} title-size 鏍囬鐨勫瓧浣撳ぇ灏忥紝鍗曚綅浠绘剰锛屾暟鍊奸粯璁や负rpx鍗曚綅锛堥粯璁�28锛�
+	 * @event {Function} open 涓嬫媺鑿滃崟琚墦寮�鏃惰Е鍙�
+	 * @event {Function} close 涓嬫媺鑿滃崟琚叧闂椂瑙﹀彂
+	 * @example <u-dropdown></u-dropdown>
+	 */
+	export default {
+		name: 'u-dropdown',
+		props: {
+			// 鑿滃崟鏍囬鍜岄�夐」鐨勬縺娲绘�侀鑹�
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鑿滃崟鏍囬鍜岄�夐」鐨勬湭婵�娲绘�侀鑹�
+			inactiveColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 鐐瑰嚮閬僵鏄惁鍏抽棴鑿滃崟
+			closeOnClickMask: {
+				type: Boolean,
+				default: true
+			},
+			// 鐐瑰嚮褰撳墠婵�娲婚」鏍囬鏄惁鍏抽棴鑿滃崟
+			closeOnClickSelf: {
+				type: Boolean,
+				default: true
+			},
+			// 杩囨浮鏃堕棿
+			duration: {
+				type: [Number, String],
+				default: 300
+			},
+			// 鏍囬鑿滃崟鐨勯珮搴︼紝鍗曚綅浠绘剰锛屾暟鍊奸粯璁や负rpx鍗曚綅
+			height: {
+				type: [Number, String],
+				default: 80
+			},
+			// 鏄惁鏄剧ず涓嬭竟妗�
+			borderBottom: {
+				type: Boolean,
+				default: false
+			},
+			// 鏍囬鐨勫瓧浣撳ぇ灏�
+			titleSize: {
+				type: [Number, String],
+				default: 28
+			},
+			// 涓嬫媺鍑烘潵鐨勫唴瀹归儴鍒嗙殑鍦嗚鍊�
+			borderRadius: {
+				type: [Number, String],
+				default: 0
+			},
+			// 鑿滃崟鍙充晶鐨刬con鍥炬爣
+			menuIcon: {
+				type: String,
+				default: 'arrow-down'
+			},
+			// 鑿滃崟鍙充晶鍥炬爣鐨勫ぇ灏�
+			menuIconSize: {
+				type: [Number, String],
+				default: 26
+			}
+		},
+		data() {
+			return {
+				showDropdown: true, // 鏄惁鎵撳紑涓嬫潵鑿滃崟,
+				menuList: [], // 鏄剧ず鐨勮彍鍗�
+				active: false, // 涓嬫媺鑿滃崟鐨勭姸鎬�
+				// 褰撳墠鏄鍑犱釜鑿滃崟澶勪簬婵�娲荤姸鎬侊紝灏忕▼搴忎腑姝ゅ涓嶈兘鍐欐垚false鎴栬��""锛屽惁鍒欏悗缁皢current璧嬪�间负0锛�
+				// 鏃犺兘鐨凾X娌℃湁浣跨敤===鑰屾槸浣跨敤==鍒ゆ柇锛屽鑷寸▼搴忚涓哄墠鍚庝簩鑰呮病鏈夊彉鍖栵紝浠庤�屼笉浼氳Е鍙戣鍥炬洿鏂�
+				current: 99999,
+				// 澶栧眰鍐呭鐨勬牱寮忥紝鍒濆鏃跺浜庡簳灞傦紝涓旈�忔槑
+				contentStyle: {
+					zIndex: -1,
+					opacity: 0
+				},
+				// 璁╂煇涓彍鍗曚繚鎸侀珮浜殑鐘舵��
+				highlightIndex: 99999,
+				contentHeight: 0
+			}
+		},
+		computed: {
+			// 涓嬫媺鍑烘潵閮ㄥ垎鐨勬牱寮�
+			popupStyle() {
+				let style = {};
+				// 杩涜Y杞翠綅绉伙紝灞曞紑鐘舵�佹椂锛屾仮澶嶅師浣嶃�傛敹榻愮姸鎬佹椂锛屽線涓婁綅绉�100%锛岃繘琛岄殣钘�
+				style.transform = `translateY(${this.active ? 0 : '-100%'})`
+				style['transition-duration'] = this.duration / 1000 + 's';
+				style.borderRadius = `0 0 ${this.$u.addUnit(this.borderRadius)} ${this.$u.addUnit(this.borderRadius)}`;
+				return style;
+			}
+		},
+		created() {
+			// 寮曠敤鎵�鏈夊瓙缁勪欢(u-dropdown-item)鐨則his锛屼笉鑳藉湪data涓0鏄庡彉閲忥紝鍚﹀垯鍦ㄥ井淇″皬绋嬪簭浼氶�犳垚寰幆寮曠敤鑰屾姤閿�
+			this.children = [];
+		},
+		mounted() {
+			this.getContentHeight();
+		},
+		methods: {
+			init() {
+				// 褰撴煇涓瓙缁勪欢鍐呭鍙樺寲鏃讹紝瑙﹀彂鐖剁粍浠剁殑init锛岀埗缁勪欢鍐嶈姣忎竴涓瓙缁勪欢閲嶆柊鍒濆鍖栦竴閬�
+				// 浠ヤ繚璇佹暟鎹殑姝g‘鎬�
+				this.menuList = [];
+				this.children.map(child => {
+					child.init();
+				})
+			},
+			// 鐐瑰嚮鑿滃崟
+			menuClick(index) {
+				// 鍒ゆ柇鏄惁琚鐢�
+				if (this.menuList[index].disabled) return;
+				// 濡傛灉鐐瑰嚮鏃剁殑绱㈠紩鍜屽綋鍓嶆縺娲婚」绱㈠紩鐩稿悓锛屾剰鍛崇潃鐐瑰嚮浜嗘縺娲婚」锛岄渶瑕佹敹璧蜂笅鎷夎彍鍗�
+				if (index === this.current && this.closeOnClickSelf) {
+					this.close();
+					// 绛夊姩鐢荤粨鏉熷悗锛屽啀绉婚櫎涓嬫媺鑿滃崟涓殑鍐呭锛屽惁鍒欑洿鎺ョЩ闄わ紝涔熷氨娌℃湁涓嬫媺鑿滃崟鏀惰捣鐨勬晥鏋滀簡
+					setTimeout(() => {
+						this.children[index].active = false;
+					}, this.duration)
+					return;
+				}
+				this.open(index);
+			},
+			// 鎵撳紑涓嬫媺鑿滃崟
+			open(index) {
+				// 閲嶇疆楂樹寒绱㈠紩锛屽惁鍒欎細閫犳垚澶氫釜鑿滃崟鍚屾椂楂樹寒
+				// this.highlightIndex = 9999;
+				// 灞曞紑鏃讹紝璁剧疆涓嬫媺鍐呭鐨勬牱寮�
+				this.contentStyle = {
+					zIndex: 11,
+				}
+				// 鏍囪灞曞紑鐘舵�佷互鍙婂綋鍓嶅睍寮�椤圭殑绱㈠紩
+				this.active = true;
+				this.current = index;
+				// 鍘嗛亶鎵�鏈夌殑瀛愬厓绱狅紝灏嗙储寮曞尮閰嶇殑椤规爣璁颁负婵�娲荤姸鎬侊紝鍥犱负瀛愬厓绱犳槸閫氳繃v-if鎺у埗鍒囨崲鐨�
+				// 涔嬫墍浠ヤ笉鏄洜display: none锛屾槸鍥犱负nvue娌℃湁display杩欎釜灞炴��
+				this.children.map((val, idx) => {
+					val.active = index == idx ? true : false;
+				})
+				this.$emit('open', this.current);
+			},
+			// 璁剧疆涓嬫媺鑿滃崟澶勪簬鏀惰捣鐘舵��
+			close() {
+				this.$emit('close', this.current);
+				// 璁剧疆涓烘敹璧风姸鎬侊紝鍚屾椂current褰掍綅锛岃缃负绌哄瓧绗︿覆
+				this.active = false;
+				this.current = 99999;
+				// 涓嬫媺鍐呭鐨勬牱寮忚繘琛岃皟鏁达紝涓嶉�忔槑搴﹁缃负0
+				this.contentStyle = {
+					zIndex: -1,
+					opacity: 0
+				}
+			},
+			// 鐐瑰嚮閬僵
+			maskClick() {
+				// 濡傛灉涓嶅厑璁哥偣鍑婚伄缃╋紝鐩存帴杩斿洖
+				if (!this.closeOnClickMask) return;
+				this.close();
+			},
+			// 澶栭儴鎵嬪姩璁剧疆鏌愪釜鑿滃崟楂樹寒
+			highlight(index = undefined) {
+				this.highlightIndex = index !== undefined ? index : 99999;
+			},
+			// 鑾峰彇涓嬫媺鑿滃崟鍐呭鐨勯珮搴�
+			getContentHeight() {
+				// 杩欓噷鐨勫師鐞嗕负锛屽洜涓篸ropdown缁勪欢鏄浉瀵瑰畾浣嶇殑锛屽畠鐨勪笅鎷夊嚭鏉ョ殑鍐呭锛屽繀椤荤粰瀹氫竴涓珮搴�
+				// 鎵嶈兘璁╅伄缃╁崰婊¤彍鍗曚竴涓嬶紝鐩村埌灞忓箷搴曢儴鐨勯珮搴�
+				// this.$u.sys()涓簎View灏佽鐨勮幏鍙栬澶囦俊鎭殑鏂规硶
+				let windowHeight = this.$u.sys().windowHeight;
+				this.$uGetRect('.u-dropdown__menu').then(res => {
+					// 杩欓噷鑾峰彇鐨勬槸dropdown鐨勫昂瀵革紝鍦℉5涓婏紝uniapp鑾峰彇灏哄鏄湁bug鐨�(浠ュ墠鎻愬嚭淇杩囷紝鍚庢潵鍙堝嚭鐜颁簡姝ug锛岀洰鍓峢x2.8.11鐗堟湰)
+					// H5绔痓ug琛ㄧ幇涓哄厓绱犲昂瀵哥殑top鍊间负瀵艰埅鏍忓簳閮ㄥ埌鍒板厓绱犵殑涓婅竟娌跨殑璺濈锛屼絾鏄厓绱犵殑bottom鍊肩‘鏄鑸爮椤堕儴鍒板厓绱犲簳閮ㄧ殑璺濈
+					// 浜岃�呮槸浜掔浉鐭涚浘鐨勶紝鏈川鍘熷洜鏄疕5绔鑸爮闈炲師鐢燂紝uni鐨勫紑鍙戣�呭ぇ鎰忛�犳垚
+					// 杩欓噷鍙栬彍鍗曟爮鐨刡otton鍊煎悎鐞嗙殑锛屼笉鑳界敤res.top锛屽惁鍒欓〉闈細閫犳垚婊氬姩
+					this.contentHeight = windowHeight - res.bottom;
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	.u-dropdown {
+		flex: 1;
+		width: 100%;
+		position: relative;
+
+		&__menu {
+			@include vue-flex;
+			position: relative;
+			z-index: 11;
+			height: 80rpx;
+
+			&__item {
+				flex: 1;
+				@include vue-flex;
+				justify-content: center;
+				align-items: center;
+
+				&__text {
+					font-size: 28rpx;
+					color: $u-content-color;
+				}
+
+				&__arrow {
+					margin-left: 6rpx;
+					transition: transform .3s;
+					align-items: center;
+					@include vue-flex;
+
+					&--rotate {
+						transform: rotate(180deg);
+					}
+				}
+			}
+		}
+
+		&__content {
+			position: absolute;
+			z-index: 8;
+			width: 100%;
+			left: 0px;
+			bottom: 0;
+			overflow: hidden;
+			
+
+			&__mask {
+				position: absolute;
+				z-index: 9;
+				background: rgba(0, 0, 0, .3);
+				width: 100%;
+				left: 0;
+				top: 0;
+				bottom: 0;
+			}
+
+			&__popup {
+				position: relative;
+				z-index: 10;
+				transition: all 0.3s;
+				transform: translate3D(0, -100%, 0);
+				overflow: hidden;
+			}
+		}
+
+	}
+</style>
diff --git a/uview-ui/components/u-empty/u-empty.vue b/uview-ui/components/u-empty/u-empty.vue
new file mode 100644
index 0000000..2c77b24
--- /dev/null
+++ b/uview-ui/components/u-empty/u-empty.vue
@@ -0,0 +1,193 @@
+<template>
+	<view class="u-empty" v-if="show" :style="{
+		marginTop: marginTop + 'rpx'
+	}">
+		<u-icon
+			:name="src ? src : 'empty-' + mode"
+			:custom-style="iconStyle"
+			:label="text ? text : icons[mode]"
+			label-pos="bottom"
+			:label-color="color"
+			:label-size="fontSize"
+			:size="iconSize"
+			:color="iconColor"
+			margin-top="14"
+		></u-icon>
+		<view class="u-slot-wrap">
+			<slot name="bottom"></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * empty 鍐呭涓虹┖
+	 * @description 璇ョ粍浠剁敤浜庨渶瑕佸姞杞藉唴瀹癸紝浣嗘槸鍔犺浇鐨勭涓�椤垫暟鎹氨涓虹┖锛屾彁绀轰竴涓�"娌℃湁鍐呭"鐨勫満鏅紝 鎴戜滑绮惧績鎸戦�変簡鍗佸嚑涓満鏅殑鍥炬爣锛屾柟渚挎偍浣跨敤銆�
+	 * @tutorial https://www.uviewui.com/components/empty.html
+	 * @property {String} color 鏂囧瓧棰滆壊锛堥粯璁�#c0c4cc锛�
+	 * @property {String} text 鏂囧瓧鎻愮ず锛堥粯璁も�滄棤鍐呭鈥濓級
+	 * @property {String} src 鑷畾涔夊浘鏍囪矾寰勶紝濡傚畾涔夛紝mode鍙傛暟浼氬け鏁�
+	 * @property {String Number} font-size 鎻愮ず鏂囧瓧鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�28锛�
+	 * @property {String} mode 鍐呯疆鐨勫浘鏍囷紝瑙佸畼缃戣鏄庯紙榛樿data锛�
+	 * @property {String Number} img-width 鍥炬爣鐨勫搴︼紝鍗曚綅rpx锛堥粯璁�240锛�
+	 * @property {String} img-height 鍥炬爣鐨勯珮搴︼紝鍗曚綅rpx锛堥粯璁uto锛�
+	 * @property {String Number} margin-top 缁勪欢璺濈涓婁竴涓厓绱犱箣闂寸殑璺濈锛堥粯璁�0锛�
+	 * @property {Boolean} show 鏄惁鏄剧ず缁勪欢锛堥粯璁rue锛�
+	 * @event {Function} click 鐐瑰嚮缁勪欢鏃惰Е鍙�
+	 * @event {Function} close 鐐瑰嚮鍏抽棴鎸夐挳鏃惰Е鍙�
+	 * @example <u-empty text="鎵�璋撲紛浜猴紝鍦ㄦ按涓�鏂�" mode="list"></u-empty>
+	 */
+	export default {
+		name: "u-empty",
+		props: {
+			// 鍥炬爣璺緞
+			src: {
+				type: String,
+				default: ''
+			},
+			// 鎻愮ず鏂囧瓧
+			text: {
+				type: String,
+				default: ''
+			},
+			// 鏂囧瓧棰滆壊
+			color: {
+				type: String,
+				default: '#c0c4cc'
+			},
+			// 鍥炬爣鐨勯鑹�
+			iconColor: {
+				type: String,
+				default: '#c0c4cc'
+			},
+			// 鍥炬爣鐨勫ぇ灏�
+			iconSize: {
+				type: [String, Number],
+				default: 120
+			},
+			// 鏂囧瓧澶у皬锛屽崟浣峳px
+			fontSize: {
+				type: [String, Number],
+				default: 26
+			},
+			// 閫夋嫨棰勭疆鐨勫浘鏍囩被鍨�
+			mode: {
+				type: String,
+				default: 'data'
+			},
+			//  鍥炬爣瀹藉害锛屽崟浣峳px
+			imgWidth: {
+				type: [String, Number],
+				default: 120
+			},
+			// 鍥炬爣楂樺害锛屽崟浣峳px
+			imgHeight: {
+				type: [String, Number],
+				default: 'auto'
+			},
+			// 鏄惁鏄剧ず缁勪欢
+			show: {
+				type: Boolean,
+				default: true
+			},
+			// 缁勪欢璺濈涓婁竴涓厓绱犱箣闂寸殑璺濈
+			marginTop: {
+				type: [String, Number],
+				default: 0
+			},
+			iconStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			}
+		},
+		data() {
+			return {
+				icons: {
+					car: '璐墿杞︿负绌�',
+					page: '椤甸潰涓嶅瓨鍦�',
+					search: '娌℃湁鎼滅储缁撴灉',
+					address: '娌℃湁鏀惰揣鍦板潃',
+					wifi: '娌℃湁WiFi',
+					order: '璁㈠崟涓虹┖',
+					coupon: '娌℃湁浼樻儬鍒�',
+					favor: '鏆傛棤鏀惰棌',
+					permission: '鏃犳潈闄�',
+					history: '鏃犲巻鍙茶褰�',
+					news: '鏃犳柊闂诲垪琛�',
+					message: '娑堟伅鍒楄〃涓虹┖',
+					list: '鍒楄〃涓虹┖',
+					data: '鏁版嵁涓虹┖'
+				},
+				// icons: [{
+				// 	icon: 'car',
+				// 	text: '璐墿杞︿负绌�'
+				// },{
+				// 	icon: 'page',
+				// 	text: '椤甸潰涓嶅瓨鍦�'
+				// },{
+				// 	icon: 'search',
+				// 	text: '娌℃湁鎼滅储缁撴灉'
+				// },{
+				// 	icon: 'address',
+				// 	text: '娌℃湁鏀惰揣鍦板潃'
+				// },{
+				// 	icon: 'wifi',
+				// 	text: '娌℃湁WiFi'
+				// },{
+				// 	icon: 'order',
+				// 	text: '璁㈠崟涓虹┖'
+				// },{
+				// 	icon: 'coupon',
+				// 	text: '娌℃湁浼樻儬鍒�'
+				// },{
+				// 	icon: 'favor',
+				// 	text: '鏆傛棤鏀惰棌'
+				// },{
+				// 	icon: 'permission',
+				// 	text: '鏃犳潈闄�'
+				// },{
+				// 	icon: 'history',
+				// 	text: '鏃犲巻鍙茶褰�'
+				// },{
+				// 	icon: 'news',
+				// 	text: '鏃犳柊闂诲垪琛�'
+				// },{
+				// 	icon: 'message',
+				// 	text: '娑堟伅鍒楄〃涓虹┖'
+				// },{
+				// 	icon: 'list',
+				// 	text: '鍒楄〃涓虹┖'
+				// },{
+				// 	icon: 'data',
+				// 	text: '鏁版嵁涓虹┖'
+				// }],
+
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	.u-empty {
+		@include vue-flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		height: 100%;
+	}
+
+	.u-image {
+		margin-bottom: 20rpx;
+	}
+
+	.u-slot-wrap {
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+		margin-top: 20rpx;
+	}
+</style>
diff --git a/uview-ui/components/u-field/u-field.vue b/uview-ui/components/u-field/u-field.vue
new file mode 100644
index 0000000..b562798
--- /dev/null
+++ b/uview-ui/components/u-field/u-field.vue
@@ -0,0 +1,384 @@
+<template>
+	<view class="u-field" :class="{'u-border-top': borderTop, 'u-border-bottom': borderBottom }">
+		<view class="u-field-inner" :class="[type == 'textarea' ? 'u-textarea-inner' : '', 'u-label-postion-' + labelPosition]">
+			<view class="u-label" :class="[required ? 'u-required' : '']" :style="{
+				justifyContent: justifyContent, 
+				flex: labelPosition == 'left' ? `0 0 ${labelWidth}rpx` : '1'
+			}">
+				<view class="u-icon-wrap" v-if="icon">
+					<u-icon size="32" :custom-style="iconStyle" :name="icon" :color="iconColor" class="u-icon"></u-icon>
+				</view>
+				<slot name="icon"></slot>
+				<text class="u-label-text" :class="[this.$slots.icon || icon ? 'u-label-left-gap' : '']">{{ label }}</text>
+			</view>
+			<view class="fild-body">
+				<view class="u-flex-1 u-flex" :style="[inputWrapStyle]">
+					<textarea v-if="type == 'textarea'" class="u-flex-1 u-textarea-class" :style="[fieldStyle]" :value="value"
+					 :placeholder="placeholder" :placeholderStyle="placeholderStyle" :disabled="disabled" :maxlength="inputMaxlength"
+					 :focus="focus" :autoHeight="autoHeight" :fixed="fixed" @input="onInput" @blur="onBlur" @focus="onFocus" @confirm="onConfirm"
+					 @tap="fieldClick" />
+					<input
+						v-else
+						:style="[fieldStyle]"
+						:type="type"
+						class="u-flex-1 u-field__input-wrap"
+						:value="value"
+						:password="password || this.type === 'password'"
+						:placeholder="placeholder"
+						:placeholderStyle="placeholderStyle"
+						:disabled="disabled"
+						:maxlength="inputMaxlength"
+						:focus="focus"
+						:confirmType="confirmType"
+						@focus="onFocus"
+						@blur="onBlur"
+						@input="onInput"
+						@confirm="onConfirm"
+						@tap="fieldClick"
+					/>
+				</view>
+				<u-icon :size="clearSize" v-if="clearable && value != '' && focused" name="close-circle-fill" color="#c0c4cc" class="u-clear-icon" @click="onClear"/>
+				<view class="u-button-wrap"><slot name="right" /></view>
+				<u-icon v-if="rightIcon" @click="rightIconClick" :name="rightIcon" color="#c0c4cc" :style="[rightIconStyle]" size="26" class="u-arror-right" />
+			</view>
+		</view>
+		<view v-if="errorMessage !== false && errorMessage != ''" class="u-error-message" :style="{
+			paddingLeft: labelWidth + 'rpx'
+		}">{{ errorMessage }}</view>
+	</view>
+</template>
+
+<script>
+/**
+ * field 杈撳叆妗�
+ * @description 鍊熷姪姝ょ粍浠讹紝鍙互瀹炵幇琛ㄥ崟鐨勮緭鍏ワ紝 鏈�"text"鍜�"textarea"绫诲瀷鐨勶紝姝ゅ锛屽�熷姪uView鐨刾icker鍜宎ctionSheet缁勪欢鍙互蹇�熷疄鐜颁笂鎷夎彍鍗曪紝鏃堕棿锛屽湴鍖洪�夋嫨绛夛紝 涓鸿〃鍗曡В鍐虫柟妗堢殑鍒╁櫒銆�
+ * @tutorial https://www.uviewui.com/components/field.html
+ * @property {String} type 杈撳叆妗嗙殑绫诲瀷锛堥粯璁ext锛�
+ * @property {String} icon label宸﹁竟鐨勫浘鏍囷紝闄恥View鐨勫浘鏍囧悕绉�
+ * @property {Object} icon-style 宸﹁竟鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {Boolean} right-icon 杈撳叆妗嗗彸杈圭殑鍥炬爣鍚嶇О锛岄檺uView鐨勫浘鏍囧悕绉帮紙榛樿false锛�
+ * @property {Boolean} required 鏄惁蹇呭~锛屽乏杈规偍鏄剧ず绾㈣壊"*"鍙凤紙榛樿false锛�
+ * @property {String} label 杈撳叆妗嗗乏杈圭殑鏂囧瓧鎻愮ず
+ * @property {Boolean} password 鏄惁瀵嗙爜杈撳叆鏂瑰紡(鐢ㄧ偣鏇挎崲鏂囧瓧)锛宼ype涓簍ext鏃舵湁鏁堬紙榛樿false锛�
+ * @property {Boolean} clearable 鏄惁鏄剧ず鍙充晶娓呯┖鍐呭鐨勫浘鏍囨帶浠�(杈撳叆妗嗘湁鍐呭锛屼笖鑾峰緱鐒︾偣鏃舵墠鏄剧ず)锛岀偣鍑诲彲娓呯┖杈撳叆妗嗗唴瀹癸紙榛樿true锛�
+ * @property {Number String} label-width label鐨勫搴︼紝鍗曚綅rpx锛堥粯璁�130锛�
+ * @property {String} label-align label鐨勬枃瀛楀榻愭柟寮忥紙榛樿left锛�
+ * @property {Object} field-style 鑷畾涔夎緭鍏ユ鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {Number | String} clear-size 娓呴櫎鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�30锛�
+ * @property {String} input-align 杈撳叆妗嗗唴瀹瑰榻愭柟寮忥紙榛樿left锛�
+ * @property {Boolean} border-bottom 鏄惁鏄剧ずfield鐨勪笅杈规锛堥粯璁rue锛�
+ * @property {Boolean} border-top 鏄惁鏄剧ずfield鐨勪笂杈规锛堥粯璁alse锛�
+ * @property {String} icon-color 宸﹁竟閫氳繃icon閰嶇疆鐨勫浘鏍囩殑棰滆壊锛堥粯璁�#606266锛�
+ * @property {Boolean} auto-height 鏄惁鑷姩澧為珮杈撳叆鍖哄煙锛宼ype涓簍extarea鏃舵湁鏁堬紙榛樿true锛�
+ * @property {String Boolean} error-message 鏄剧ず鐨勯敊璇彁绀哄唴瀹癸紝濡傛灉涓虹┖瀛楃涓叉垨鑰協alse锛屽垯涓嶆樉绀洪敊璇俊鎭�
+ * @property {String} placeholder 杈撳叆妗嗙殑鎻愮ず鏂囧瓧
+ * @property {String} placeholder-style placeholder鐨勬牱寮�(鍐呰仈鏍峰紡锛屽瓧绗︿覆)锛屽"color: #ddd"
+ * @property {Boolean} focus 鏄惁鑷姩鑾峰緱鐒︾偣锛堥粯璁alse锛�
+ * @property {Boolean} fixed 濡傛灉type涓簍extarea锛屼笖鍦ㄤ竴涓�"position:fixed"鐨勫尯鍩燂紝闇�瑕佹寚鏄庝负true锛堥粯璁alse锛�
+ * @property {Boolean} disabled 鏄惁涓嶅彲杈撳叆锛堥粯璁alse锛�
+ * @property {Number String} maxlength 鏈�澶ц緭鍏ラ暱搴︼紝璁剧疆涓� -1 鐨勬椂鍊欎笉闄愬埗鏈�澶ч暱搴︼紙榛樿140锛�
+ * @property {String} confirm-type 璁剧疆閿洏鍙充笅瑙掓寜閽殑鏂囧瓧锛屼粎鍦╰ype="text"鏃剁敓鏁堬紙榛樿done锛�
+ * @event {Function} input 杈撳叆妗嗗唴瀹瑰彂鐢熷彉鍖栨椂瑙﹀彂
+ * @event {Function} focus 杈撳叆妗嗚幏寰楃劍鐐规椂瑙﹀彂
+ * @event {Function} blur 杈撳叆妗嗗け鍘荤劍鐐规椂瑙﹀彂
+ * @event {Function} confirm 鐐瑰嚮瀹屾垚鎸夐挳鏃惰Е鍙�
+ * @event {Function} right-icon-click 閫氳繃right-icon鐢熸垚鐨勫浘鏍囪鐐瑰嚮鏃惰Е鍙�
+ * @event {Function} click 杈撳叆妗嗚鐐瑰嚮鎴栬�呴�氳繃right-icon鐢熸垚鐨勫浘鏍囪鐐瑰嚮鏃惰Е鍙戯紝杩欐牱璁捐鏄�冭檻鍒颁紶閫掑彸杈圭殑鍥炬爣锛屼竴鑸兘涓洪渶瑕佸脊鍑�"picker"绛夋搷浣滄椂鐨勫満鏅紝鐐瑰嚮鍊掍笁瑙掑浘鏍囷紝鐞嗗簲鍙戝嚭姝や簨浠讹紝瑙佷笂鏂硅鏄�
+ * @example <u-field v-model="mobile" label="鎵嬫満鍙�" required :error-message="errorMessage"></u-field>
+ */
+export default {
+	name:"u-field",
+	props: {
+		icon: String,
+		rightIcon: String,
+		// arrowDirection: {
+		// 	type: String,
+		// 	default: 'right'
+		// },
+		required: Boolean,
+		label: String,
+		password: Boolean,
+		clearable: {
+			type: Boolean,
+			default: true
+		},
+		// 宸﹁竟鏍囬鐨勫搴﹀崟浣峳px
+		labelWidth: {
+			type: [Number, String],
+			default: 130
+		},
+		// 瀵归綈鏂瑰紡锛宭eft|center|right
+		labelAlign: {
+			type: String,
+			default: 'left'
+		},
+		inputAlign: {
+			type: String,
+			default: 'left'
+		},
+		iconColor: {
+			type: String,
+			default: '#606266'
+		},
+		autoHeight: {
+			type: Boolean,
+			default: true
+		},
+		errorMessage: {
+			type: [String, Boolean],
+			default: ''
+		},
+		placeholder: String,
+		placeholderStyle: String,
+		focus: Boolean,
+		fixed: Boolean,
+		value: [Number, String],
+		type: {
+			type: String,
+			default: 'text'
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		maxlength: {
+			type: [Number, String],
+			default: 140
+		},
+		confirmType: {
+			type: String,
+			default: 'done'
+		},
+		// lable鐨勪綅缃紝鍙�変负 left-宸﹁竟锛宼op-涓婅竟
+		labelPosition: {
+			type: String,
+			default: 'left'
+		},
+		// 杈撳叆妗嗙殑鑷畾涔夋牱寮�
+		fieldStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		// 娓呴櫎鎸夐挳鐨勫ぇ灏�
+		clearSize: {
+			type: [Number, String],
+			default: 30
+		},
+		// lable宸﹁竟鐨勫浘鏍囨牱寮忥紝瀵硅薄褰㈠紡
+		iconStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		// 鏄惁鏄剧ず涓婅竟妗�
+		borderTop: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鏄剧ず涓嬭竟妗�
+		borderBottom: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鑷姩鍘婚櫎涓ょ鐨勭┖鏍�
+		trim: {
+			type: Boolean,
+			default: true
+		}
+	},
+	data() {
+		return {
+			focused: false,
+			itemIndex: 0,
+		};
+	},
+	computed: {
+		inputWrapStyle() {
+			let style = {};
+			style.textAlign = this.inputAlign;
+			// 鍒ゆ柇lable鐨勪綅缃紝濡傛灉鏄痩eft鐨勮瘽锛岃input宸﹁竟涓よ竟鏈夐棿闅�
+			if(this.labelPosition == 'left') {
+				style.margin = `0 8rpx`;
+			} else {
+				// 濡傛灉lable鏄痶op鐨勶紝input鐨勫乏杈瑰氨娌″繀瑕佹湁闂撮殭浜�
+				style.marginRight = `8rpx`;
+			}
+			return style;
+		},
+		rightIconStyle() {
+			let style = {};
+			if (this.arrowDirection == 'top') style.transform = 'roate(-90deg)';
+			if (this.arrowDirection == 'bottom') style.transform = 'roate(90deg)';
+			else style.transform = 'roate(0deg)';
+			return style;
+		},
+		labelStyle() {
+			let style = {};
+			if(this.labelAlign == 'left') style.justifyContent = 'flext-start';
+			if(this.labelAlign == 'center') style.justifyContent = 'center';
+			if(this.labelAlign == 'right') style.justifyContent = 'flext-end';
+			return style;
+		},
+		// uni涓嶆敮鎸佸湪computed涓啓style.justifyContent = 'center'鐨勫舰寮忥紝鏁呯敤姝ゆ柟娉�
+		justifyContent() {
+			if(this.labelAlign == 'left') return 'flex-start';
+			if(this.labelAlign == 'center') return 'center';
+			if(this.labelAlign == 'right') return 'flex-end';
+		},
+		// 鍥犱负uniapp鐨刬nput缁勪欢鐨刴axlength缁勪欢蹇呴』瑕佹暟鍊硷紝杩欓噷杞负鏁板�硷紝缁欑敤鎴峰彲浠ヤ紶鍏ュ瓧绗︿覆鏁板��
+		inputMaxlength() {
+			return Number(this.maxlength)
+		},
+		// label鐨勪綅缃�
+		fieldInnerStyle() {
+			let style = {};
+			if(this.labelPosition == 'left') {
+				style.flexDirection = 'row';
+			} else {
+				style.flexDirection = 'column';
+			}
+			
+			return style;
+		}
+	},
+	methods: {
+		onInput(event) {
+			let value = event.detail.value;
+			// 鍒ゆ柇鏄惁鍘婚櫎绌烘牸
+			if(this.trim) value = this.$u.trim(value);
+			this.$emit('input', value);
+		},
+		onFocus(event) {
+			this.focused = true;
+			this.$emit('focus', event);
+		},
+		onBlur(event) {
+			// 鏈�寮�濮嬩娇鐢ㄧ殑鏄洃鍚浘鏍嘆touchstart浜嬩欢锛岃嚜浠巋x2.8.4鍚庯紝姝ゆ柟娉曞湪寰俊灏忕▼搴忓嚭閿�
+			// 杩欓噷鏀逛负鐩戝惉鐐瑰嚮浜嬩欢锛屾墜鐐瑰嚮娓呴櫎鍥炬爣鏃讹紝鍚屾椂涔熷彂鐢熶簡@blur浜嬩欢锛屽鑷村浘鏍囨秷澶辫�屾棤娉曠偣鍑伙紝杩欓噷鍋氫竴涓欢鏃�
+			setTimeout(() => {
+				this.focused = false;
+			}, 100)
+			this.$emit('blur', event);
+		},
+		onConfirm(e) {
+			this.$emit('confirm', e.detail.value);
+		},
+		onClear(event) {
+			this.$emit('input', '');
+		},
+		rightIconClick() {
+			this.$emit('right-icon-click');
+			this.$emit('click');
+		},
+		fieldClick() {
+			this.$emit('click');
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+	
+.u-field {
+	font-size: 28rpx;
+	padding: 20rpx 28rpx;
+	text-align: left;
+	position: relative;
+	color: $u-main-color;
+}
+
+.u-field-inner {
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-textarea-inner {
+	align-items: flex-start;
+}
+
+.u-textarea-class {
+	min-height: 96rpx;
+	width: auto;
+	font-size: 28rpx;
+}
+
+.fild-body {
+	@include vue-flex;
+	flex: 1;
+	align-items: center;
+}
+
+.u-arror-right {
+	margin-left: 8rpx;
+}
+
+.u-label-text {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;		
+	/* #endif */
+}
+
+.u-label-left-gap {
+	margin-left: 6rpx;
+}
+
+.u-label-postion-top {
+	flex-direction: column;
+	align-items: flex-start;
+}
+
+.u-label {
+	width: 130rpx;
+	flex: 1 1 130rpx;
+	text-align: left;
+	position: relative;
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-required::before {
+	content: '*';
+	position: absolute;
+	left: -16rpx;
+	font-size: 14px;
+	color: $u-type-error;
+	height: 9px;
+	line-height: 1;
+}
+
+.u-field__input-wrap {
+	position: relative;
+	overflow: hidden;
+	font-size: 28rpx;
+	height: 48rpx;
+	flex: 1;
+	width: auto;
+}
+
+.u-clear-icon {
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-error-message {
+	color: $u-type-error;
+	font-size: 26rpx;
+	text-align: left;
+}
+
+.placeholder-style {
+	color: rgb(150, 151, 153);
+}
+
+.u-input-class {
+	font-size: 28rpx;
+}
+
+.u-button-wrap {
+	margin-left: 8rpx;
+}
+</style>
diff --git a/uview-ui/components/u-form-item/u-form-item.vue b/uview-ui/components/u-form-item/u-form-item.vue
new file mode 100644
index 0000000..d6b8c8b
--- /dev/null
+++ b/uview-ui/components/u-form-item/u-form-item.vue
@@ -0,0 +1,431 @@
+<template>
+	<view class="u-form-item" :class="{'u-border-bottom': elBorderBottom, 'u-form-item__border-bottom--error': validateState === 'error' && showError('border-bottom')}">
+		<view class="u-form-item__body" :style="{
+			flexDirection: elLabelPosition == 'left' ? 'row' : 'column'
+		}">
+			<!-- 寰俊灏忕▼搴忎腑锛屽皢涓�涓弬鏁拌缃┖瀛楃涓诧紝缁撴灉浼氬彉鎴愬瓧绗︿覆"true" -->
+			<view class="u-form-item--left" :style="{
+				width: uLabelWidth,
+				flex: `0 0 ${uLabelWidth}`,
+				marginBottom: elLabelPosition == 'left' ? 0 : '10rpx',
+			}">
+				<!-- 涓轰簡鍧楀榻� -->
+				<view class="u-form-item--left__content" v-if="required || leftIcon || label">
+					<!-- nvue涓嶆敮鎸佷吉鍏冪礌before -->
+					<text v-if="required" class="u-form-item--left__content--required">*</text>
+					<view class="u-form-item--left__content__icon" v-if="leftIcon">
+						<u-icon :name="leftIcon" :custom-style="leftIconStyle"></u-icon>
+					</view>
+					<view class="u-form-item--left__content__label" :style="[elLabelStyle, {
+						'justify-content': elLabelAlign == 'left' ? 'flex-start' : elLabelAlign == 'center' ? 'center' : 'flex-end'
+					}]">
+						{{label}}
+					</view>
+				</view>
+			</view>
+			<view class="u-form-item--right u-flex">
+				<view class="u-form-item--right__content">
+					<view class="u-form-item--right__content__slot ">
+						<slot />
+					</view>
+					<view class="u-form-item--right__content__icon u-flex" v-if="$slots.right || rightIcon">
+						<u-icon :custom-style="rightIconStyle" v-if="rightIcon" :name="rightIcon"></u-icon>
+						<slot name="right" />
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="u-form-item__message" v-if="validateState === 'error' && showError('message')" :style="{
+			paddingLeft: elLabelPosition == 'left' ? $u.addUnit(elLabelWidth) : '0',
+		}">{{validateMessage}}</view>
+	</view>
+</template>
+
+<script>
+	import Emitter from '../../libs/util/emitter.js';
+	import schema from '../../libs/util/async-validator';
+	// 鍘婚櫎璀﹀憡淇℃伅
+	schema.warning = function() {};
+
+	/**
+	 * form-item 琛ㄥ崟item
+	 * @description 姝ょ粍浠朵竴鑸敤浜庤〃鍗曞満鏅紝鍙互閰嶇疆Input杈撳叆妗嗭紝Select寮瑰嚭妗嗭紝杩涜琛ㄥ崟楠岃瘉绛夈��
+	 * @tutorial http://uviewui.com/components/form.html
+	 * @property {String} label 宸︿晶鎻愮ず鏂囧瓧
+	 * @property {Object} prop 琛ㄥ崟鍩焟odel瀵硅薄鐨勫睘鎬у悕锛屽湪浣跨敤 validate銆乺esetFields 鏂规硶鐨勬儏鍐典笅锛岃灞炴�ф槸蹇呭~鐨�
+	 * @property {Boolean} border-bottom 鏄惁鏄剧ず琛ㄥ崟鍩熺殑涓嬪垝绾胯竟妗�
+	 * @property {String} label-position 琛ㄥ崟鍩熸彁绀烘枃瀛楃殑浣嶇疆锛宭eft-宸︿晶锛宼op-涓婃柟
+	 * @property {String Number} label-width 鎻愮ず鏂囧瓧鐨勫搴︼紝鍗曚綅rpx锛堥粯璁�90锛�
+	 * @property {Object} label-style lable鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {String} label-align lable鐨勫榻愭柟寮�
+	 * @property {String} right-icon 鍙充晶鑷畾涔夊瓧浣撳浘鏍�(闄恥View鍐呯疆鍥炬爣)鎴栧浘鐗囧湴鍧�
+	 * @property {String} left-icon 宸︿晶鑷畾涔夊瓧浣撳浘鏍�(闄恥View鍐呯疆鍥炬爣)鎴栧浘鐗囧湴鍧�
+	 * @property {Object} left-icon-style 宸︿晶鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} right-icon-style 鍙充晶鍥炬爣鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Boolean} required 鏄惁鏄剧ず宸﹁竟鐨�"*"鍙凤紝杩欓噷浠呰捣灞曠ず浣滅敤锛屽闇�鏍¢獙蹇呭~锛岃閫氳繃rules閰嶇疆蹇呭~瑙勫垯(榛樿false)
+	 * @example <u-form-item label="濮撳悕"><u-input v-model="form.name" /></u-form-item>
+	 */
+
+	export default {
+		name: 'u-form-item',
+		mixins: [Emitter],
+		inject: {
+			uForm: {
+				default () {
+					return null
+				}
+			}
+		},
+		props: {
+			// input鐨刲abel鎻愮ず璇�
+			label: {
+				type: String,
+				default: ''
+			},
+			// 缁戝畾鐨勫��
+			prop: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず琛ㄥ崟鍩熺殑涓嬪垝绾胯竟妗�
+			borderBottom: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// label鐨勪綅缃紝left-宸﹁竟锛宼op-涓婅竟
+			labelPosition: {
+				type: String,
+				default: ''
+			},
+			// label鐨勫搴︼紝鍗曚綅rpx
+			labelWidth: {
+				type: [String, Number],
+				default: ''
+			},
+			// lable鐨勬牱寮忥紝瀵硅薄褰㈠紡
+			labelStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// lable瀛椾綋鐨勫榻愭柟寮�
+			labelAlign: {
+				type: String,
+				default: ''
+			},
+			// 鍙充晶鍥炬爣
+			rightIcon: {
+				type: String,
+				default: ''
+			},
+			// 宸︿晶鍥炬爣
+			leftIcon: {
+				type: String,
+				default: ''
+			},
+			// 宸︿晶鍥炬爣鐨勬牱寮�
+			leftIconStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 宸︿晶鍥炬爣鐨勬牱寮�
+			rightIconStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 鏄惁鏄剧ず宸﹁竟鐨勫繀濉槦鍙凤紝鍙綔鏄剧ず鐢紝鍏蜂綋鏍¢獙蹇呭~鐨勯�昏緫锛岃鍦╮ules涓厤缃�
+			required: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				initialValue: '', // 瀛樺偍鐨勯粯璁ゅ��
+				// isRequired: false, // 鏄惁蹇呭~锛岀敱浜庝汉鎬у寲鑰冭檻锛屽繀濉�"*"鍙烽�氳繃props鐨剅equired閰嶇疆锛屼笉鍐嶉�氳繃rules鐨勮鍒欒嚜鍔ㄧ敓鎴�
+				validateState: '', // 鏄惁鏍¢獙鎴愬姛
+				validateMessage: '', // 鏍¢獙澶辫触鐨勬彁绀鸿
+				// 鏈夐敊璇椂鐨勬彁绀烘柟寮忥紝message-鎻愮ず淇℃伅锛宐order-濡傛灉input璁剧疆浜嗚竟妗嗭紝鍙樻垚鍛堢孩鑹诧紝
+				errorType: ['message'],
+				fieldValue: '', // 鑾峰彇褰撳墠瀛愮粍浠秈nput鐨勮緭鍏ョ殑鍊�
+				// 鐖剁粍浠剁殑鍙傛暟锛屽湪computed璁$畻涓紝鏃犳硶寰楃煡this.parent鍙戠敓鍙樺寲锛屾晠灏嗙埗缁勪欢鐨勫弬鏁板�硷紝鏀惧埌data涓�
+				parentData: {
+					borderBottom: true,
+					labelWidth: 90,
+					labelPosition: 'left',
+					labelStyle: {},
+					labelAlign: 'left',
+				}
+			};
+		},
+		watch: {
+			validateState(val) {
+				this.broadcastInputError();
+			},
+			// 鐩戝惉u-form缁勪欢鐨別rrorType鐨勫彉鍖�
+			"uForm.errorType"(val) {
+				this.errorType = val;
+				this.broadcastInputError();
+			},
+		},
+		computed: {
+			// 璁$畻鍚庣殑label瀹藉害锛岀敱浜庨渶瑕佸涓垽鏂紝鏁呮斁鍒癱omputed涓�
+			uLabelWidth() {
+				// 濡傛灉鐢ㄦ埛璁剧疆label涓虹┖瀛楃涓�(寰俊灏忕▼搴忕┖瀛楃涓叉渶缁堜細鍙樻垚瀛楃涓茬殑'true')锛屾剰鍛崇潃瑕佸皢label鐨勪綅缃搴﹁缃负auto
+				return this.elLabelPosition == 'left' ? (this.label === 'true' || this.label === '' ? 'auto' : this.$u.addUnit(this
+					.elLabelWidth)) : '100%';
+			},
+			showError() {
+				return type => {
+					// 濡傛灉errorType鏁扮粍涓惈鏈塶one锛屾垨鑰卼oast鎻愮ず绫诲瀷
+					if (this.errorType.indexOf('none') >= 0) return false;
+					else if (this.errorType.indexOf(type) >= 0) return true;
+					else return false;
+				}
+			},
+			// label鐨勫搴�
+			elLabelWidth() {
+				// label榛樿瀹藉害涓�90锛屼紭鍏堜娇鐢ㄦ湰缁勪欢鐨勫�硷紝濡傛灉娌℃湁(濡傛灉璁剧疆涓�0锛屼篃绠楁槸閰嶇疆浜嗗�硷紝渚濈劧璧锋晥)锛屽垯鐢╱-form鐨勫��
+				return (this.labelWidth != 0 || this.labelWidth != '') ? this.labelWidth : (this.parentData.labelWidth ? this.parentData
+					.labelWidth :
+					90);
+			},
+			// label鐨勬牱寮�
+			elLabelStyle() {
+				return Object.keys(this.labelStyle).length ? this.labelStyle : (this.parentData.labelStyle ? this.parentData.labelStyle :
+					{});
+			},
+			// label鐨勪綅缃紝宸︿晶鎴栬�呬笂鏂�
+			elLabelPosition() {
+				return this.labelPosition ? this.labelPosition : (this.parentData.labelPosition ? this.parentData.labelPosition :
+					'left');
+			},
+			// label鐨勫榻愭柟寮�
+			elLabelAlign() {
+				return this.labelAlign ? this.labelAlign : (this.parentData.labelAlign ? this.parentData.labelAlign : 'left');
+			},
+			// label鐨勪笅鍒掔嚎
+			elBorderBottom() {
+				// 瀛愮粍浠剁殑borderBottom榛樿涓虹┖瀛楃涓诧紝濡傛灉涓嶇瓑浜庣┖瀛楃涓诧紝鎰忓懗鐫�瀛愮粍浠惰缃簡鍊硷紝浼樺厛浣跨敤瀛愮粍浠剁殑鍊�
+				return this.borderBottom !== '' ? this.borderBottom : this.parentData.borderBottom ? this.parentData.borderBottom :
+					true;
+			}
+		},
+		methods: {
+			broadcastInputError() {
+				// 瀛愮粍浠跺彂鍑轰簨浠讹紝绗笁涓弬鏁颁负true鎴栬�協alse锛宼rue浠h〃鏈夐敊璇�
+				this.broadcast('u-input', 'on-form-item-error', this.validateState === 'error' && this.showError('border'));
+			},
+			// 鍒ゆ柇鏄惁闇�瑕乺equired鏍¢獙
+			setRules() {
+				let that = this;
+				// 鐢变簬浜烘�у寲鑰冭檻锛屽繀濉�"*"鍙烽�氳繃props鐨剅equired閰嶇疆锛屼笉鍐嶉�氳繃rules鐨勮鍒欒嚜鍔ㄧ敓鎴�
+				// 浠庣埗缁勪欢u-form鎷垮埌褰撳墠u-form-item闇�瑕侀獙璇� 鐨勮鍒�
+				// let rules = this.getRules();
+				// if (rules.length) {
+				// 	this.isRequired = rules.some(rule => {
+				// 		// 濡傛灉鏈夊繀濉」锛屽氨杩斿洖锛屾病鏈夌殑璇濓紝灏辨槸undefined
+				// 		return rule.required;
+				// 	});
+				// }
+
+				// blur浜嬩欢
+				this.$on('on-form-blur', that.onFieldBlur);
+				// change浜嬩欢
+				this.$on('on-form-change', that.onFieldChange);
+			},
+
+			// 浠巙-form鐨剅ules灞炴�т腑锛屽彇鍑哄綋鍓島-form-item鐨勬牎楠岃鍒�
+			getRules() {
+				// 鐖剁粍浠剁殑鎵�鏈夎鍒�
+				let rules = this.parent.rules;
+				rules = rules ? rules[this.prop] : [];
+				// 淇濊瘉杩斿洖鐨勬槸涓�涓暟缁勫舰寮�
+				return [].concat(rules || []);
+			},
+
+			// blur浜嬩欢鏃惰繘琛岃〃鍗曟牎楠�
+			onFieldBlur() {
+				this.validation('blur');
+			},
+
+			// change浜嬩欢杩涜琛ㄥ崟鏍¢獙
+			onFieldChange() {
+				this.validation('change');
+			},
+
+			// 杩囨护鍑虹鍚堣姹傜殑rule瑙勫垯
+			getFilteredRule(triggerType = '') {
+				let rules = this.getRules();
+				// 鏁翠綋楠岃瘉琛ㄥ崟鏃讹紝triggerType涓虹┖瀛楃涓诧紝姝ゆ椂杩斿洖鎵�鏈夎鍒欒繘琛岄獙璇�
+				if (!triggerType) return rules;
+				// 鍘嗛亶鍒ゆ柇瑙勫垯鏄惁鏈夊搴旂殑浜嬩欢锛屾瘮濡俠lur锛宑hange瑙﹀彂绛夌殑浜嬩欢
+				// 浣跨敤indexOf鍒ゆ柇锛屾槸鍥犱负鏌愪簺鏃跺�欒缃殑楠岃瘉瑙勫垯鐨則rigger灞炴�у彲鑳戒负澶氫釜锛屾瘮濡俒'blur','change']
+				// 鏌愪簺鍦烘櫙鍙兘鐨勫垽鏂鍒欙紝鍙兘涓嶅瓨鍦╰rigger灞炴�э紝鏁呭厛鍒ゆ柇鏄惁瀛樺湪姝ゅ睘鎬�
+				return rules.filter(res => res.trigger && res.trigger.indexOf(triggerType) !== -1);
+			},
+
+			// 鏍¢獙鏁版嵁
+			validation(trigger, callback = () => {}) {
+				// 妫�楠屼箣闂达紝鍏堣幏鍙栭渶瑕佹牎楠岀殑鍊�
+				this.fieldValue = this.parent.model[this.prop];
+				// blur鍜宑hange鏄惁鏈夊綋鍓嶆柟寮忕殑鏍¢獙瑙勫垯
+				let rules = this.getFilteredRule(trigger);
+				// 鍒ゆ柇鏄惁鏈夐獙璇佽鍒欙紝濡傛灉娌℃湁瑙勫垯锛屼篃璋冪敤鍥炶皟鏂规硶锛屽惁鍒欑埗缁勪欢u-form浼氬洜涓�
+				// 瀵筩ount鍙橀噺鐨勭粺璁¢敊璇�屾棤娉曡繘鍏ヤ笂涓�灞傜殑鍥炶皟
+				if (!rules || rules.length === 0) {
+					return callback('');
+				}
+				// 璁剧疆褰撳墠鐨勮濉紝鏍囪瘑涓烘牎楠屼腑
+				this.validateState = 'validating';
+				// 璋冪敤async-validator鐨勬柟娉�
+				let validator = new schema({
+					[this.prop]: rules
+				});
+				validator.validate({
+					[this.prop]: this.fieldValue
+				}, {
+					firstFields: true
+				}, (errors, fields) => {
+					// 璁板綍鐘舵�佸拰鎶ラ敊淇℃伅
+					this.validateState = !errors ? 'success' : 'error';
+					this.validateMessage = errors ? errors[0].message : '';
+					// 璋冪敤鍥炶皟鏂规硶
+					callback(this.validateMessage);
+				});
+			},
+
+			// 娓呯┖褰撳墠鐨剈-form-item
+			resetField() {
+				this.parent.model[this.prop] = this.initialValue;
+				// 璁剧疆涓篳success`鐘舵�侊紝鍙槸涓轰簡娓呯┖閿欒鏍囪
+				this.validateState = 'success';
+			}
+		},
+
+		// 缁勪欢鍒涘缓瀹屾垚鏃讹紝灏嗗綋鍓嶅疄渚嬩繚瀛樺埌u-form涓�
+		mounted() {
+			// 鏀粯瀹濄�佸ご鏉″皬绋嬪簭涓嶆敮鎸乸rovide/inject锛屾墍浠ヤ娇鐢ㄨ繖涓柟娉曡幏鍙栨暣涓埗缁勪欢锛屽湪created瀹氫箟锛岄伩鍏嶅惊鐜簲鐢�
+			this.parent = this.$u.$parent.call(this, 'u-form');
+			if (this.parent) {
+				// 鍘嗛亶parentData涓殑灞炴�э紝灏唒arent涓殑鍚屽悕灞炴�ц祴鍊肩粰parentData
+				Object.keys(this.parentData).map(key => {
+					this.parentData[key] = this.parent[key];
+				});
+				// 濡傛灉娌℃湁浼犲叆prop锛屾垨鑰卽Form涓虹┖(濡傛灉u-form-input鍗曠嫭浣跨敤锛屽氨涓嶄細鏈塽Form娉ㄥ叆)锛屽氨涓嶈繘琛屾牎楠�
+				if (this.prop) {
+					// 灏嗘湰瀹炰緥娣诲姞鍒扮埗缁勪欢涓�
+					this.parent.fields.push(this);
+					this.errorType = this.parent.errorType;
+					// 璁剧疆鍒濆鍊�
+					this.initialValue = this.fieldValue;
+					// 娣诲姞琛ㄥ崟鏍¢獙锛岃繖閲屽繀椤昏鍐欏湪$nextTick涓紝鍥犱负u-form鐨剅ules鏄�氳繃ref鎵嬪姩浼犲叆鐨�
+					// 涓嶅湪$nextTick涓殑璇濓紝鍙兘浼氶�犳垚鎵ц姝ゅ浠g爜鏃讹紝鐖剁粍浠惰繕娌¢�氳繃ref鎶婅鍒欑粰u-form锛屽鑷磋鍒欎负绌�
+					this.$nextTick(() => {
+						this.setRules();
+					})
+				}
+			}
+		},
+
+		// 缁勪欢閿�姣佸墠锛屽皢瀹炰緥浠巙-form鐨勭紦瀛樹腑绉婚櫎
+		beforeDestroy() {
+			// 濡傛灉褰撳墠娌℃湁prop鐨勮瘽琛ㄧず褰撳墠涓嶈杩涜鍒犻櫎锛堝洜涓烘病鏈夋敞鍏ワ級
+			if (this.parent && this.prop) {
+				this.parent.fields.map((item, index) => {
+					if (item === this) this.parent.fields.splice(index, 1);
+				})
+			}
+		},
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-form-item {
+		@include vue-flex;
+		// align-items: flex-start;
+		padding: 20rpx 0;
+		font-size: 28rpx;
+		color: $u-main-color;
+		box-sizing: border-box;
+		line-height: $u-form-item-height;
+		flex-direction: column;
+
+		&__border-bottom--error:after {
+			border-color: $u-type-error;
+		}
+
+		&__body {
+			@include vue-flex;
+		}
+
+		&--left {
+			@include vue-flex;
+			align-items: center;
+
+			&__content {
+				position: relative;
+				@include vue-flex;
+				align-items: center;
+				padding-right: 10rpx;
+				flex: 1;
+
+				&__icon {
+					margin-right: 8rpx;
+				}
+
+				&--required {
+					position: absolute;
+					left: -16rpx;
+					vertical-align: middle;
+					color: $u-type-error;
+					padding-top: 6rpx;
+				}
+
+				&__label {
+					@include vue-flex;
+					align-items: center;
+					flex: 1;
+				}
+			}
+		}
+
+		&--right {
+			flex: 1;
+
+			&__content {
+				@include vue-flex;
+				align-items: center;
+				flex: 1;
+
+				&__slot {
+					flex: 1;
+					/* #ifndef MP */
+					@include vue-flex;
+					align-items: center;
+					/* #endif */
+				}
+
+				&__icon {
+					margin-left: 10rpx;
+					color: $u-light-color;
+					font-size: 30rpx;
+				}
+			}
+		}
+
+		&__message {
+			font-size: 24rpx;
+			line-height: 24rpx;
+			color: $u-type-error;
+			margin-top: 12rpx;
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-form/u-form.vue b/uview-ui/components/u-form/u-form.vue
new file mode 100644
index 0000000..bdbafaf
--- /dev/null
+++ b/uview-ui/components/u-form/u-form.vue
@@ -0,0 +1,134 @@
+<template>
+	<view class="u-form"><slot /></view>
+</template>
+
+<script>
+	/**
+	 * form 琛ㄥ崟
+	 * @description 姝ょ粍浠朵竴鑸敤浜庤〃鍗曞満鏅紝鍙互閰嶇疆Input杈撳叆妗嗭紝Select寮瑰嚭妗嗭紝杩涜琛ㄥ崟楠岃瘉绛夈��
+	 * @tutorial http://uviewui.com/components/form.html
+	 * @property {Object} model 琛ㄥ崟鏁版嵁瀵硅薄
+	 * @property {Boolean} border-bottom 鏄惁鏄剧ず琛ㄥ崟鍩熺殑涓嬪垝绾胯竟妗�
+	 * @property {String} label-position 琛ㄥ崟鍩熸彁绀烘枃瀛楃殑浣嶇疆锛宭eft-宸︿晶锛宼op-涓婃柟
+	 * @property {String Number} label-width 鎻愮ず鏂囧瓧鐨勫搴︼紝鍗曚綅rpx锛堥粯璁�90锛�
+	 * @property {Object} label-style lable鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {String} label-align lable鐨勫榻愭柟寮�
+	 * @property {Object} rules 閫氳繃ref璁剧疆锛岃瀹樼綉璇存槑
+	 * @property {Array} error-type 閿欒鐨勬彁绀烘柟寮忥紝鏁扮粍褰㈠紡锛岃涓婃柟璇存槑(榛樿['message'])
+	 * @example <u-form :model="form" ref="uForm"></u-form>
+	 */
+
+export default {
+	name: 'u-form',
+	props: {
+		// 褰撳墠form鐨勯渶瑕侀獙璇佸瓧娈电殑闆嗗悎
+		model: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 楠岃瘉瑙勫垯
+		// rules: {
+		// 	type: [Object, Function, Array],
+		// 	default() {
+		// 		return {};
+		// 	}
+		// },
+		// 鏈夐敊璇椂鐨勬彁绀烘柟寮忥紝message-鎻愮ず淇℃伅锛宐order-濡傛灉input璁剧疆浜嗚竟妗嗭紝鍙樻垚鍛堢孩鑹诧紝
+		// border-bottom-涓嬭竟妗嗗憟鐜扮孩鑹诧紝none-鏃犳彁绀�
+		errorType: {
+			type: Array,
+			default() {
+				return ['message', 'toast']
+			}
+		},
+		// 鏄惁鏄剧ず琛ㄥ崟鍩熺殑涓嬪垝绾胯竟妗�
+		borderBottom: {
+			type: Boolean,
+			default: true
+		},
+		// label鐨勪綅缃紝left-宸﹁竟锛宼op-涓婅竟
+		labelPosition: {
+			type: String,
+			default: 'left'
+		},
+		// label鐨勫搴︼紝鍗曚綅rpx
+		labelWidth: {
+			type: [String, Number],
+			default: 90
+		},
+		// lable瀛椾綋鐨勫榻愭柟寮�
+		labelAlign: {
+			type: String,
+			default: 'left'
+		},
+		// lable鐨勬牱寮忥紝瀵硅薄褰㈠紡
+		labelStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+	},
+	provide() {
+		return {
+			uForm: this
+		};
+	},
+	data() {
+		return {
+			rules: {}
+		};
+	},
+	created() {
+		// 瀛樺偍褰撳墠form涓嬬殑鎵�鏈塽-form-item鐨勫疄渚�
+		// 涓嶈兘瀹氫箟鍦╠ata涓紝鍚﹀垯寰俊灏忕▼搴忎細閫犳垚寰幆寮曠敤鑰屾姤閿�
+		this.fields = [];
+	},
+	methods: {
+		setRules(rules) {
+			this.rules = rules;
+		},
+		// 娓呯┖鎵�鏈塽-form-item缁勪欢鐨勫唴瀹癸紝鏈川涓婃槸璋冪敤浜唘-form-item缁勪欢涓殑resetField()鏂规硶
+		resetFields() {
+			this.fields.map(field => {
+				field.resetField();
+			});
+		},
+		// 鏍¢獙鍏ㄩ儴鏁版嵁
+		validate(callback) {
+			return new Promise(resolve => {
+				// 瀵规墍鏈夌殑u-form-item杩涜鏍¢獙
+				let valid = true; // 榛樿閫氳繃
+				let count = 0; // 鐢ㄤ簬鏍囪鏄惁妫�鏌ュ畬姣�
+				let errorArr = []; // 瀛樻斁閿欒淇℃伅
+				this.fields.map(field => {
+					// 璋冪敤姣忎竴涓猽-form-item瀹炰緥鐨剉alidation鐨勬牎楠屾柟娉�
+					field.validation('', error => {
+						// 濡傛灉浠绘剰涓�涓猽-form-item鏍¢獙涓嶉�氳繃锛屽氨鎰忓懗鐫�鏁翠釜琛ㄥ崟涓嶉�氳繃
+						if (error) {
+							valid = false;
+							errorArr.push(error);
+						}
+						// 褰撳巻閬嶄簡鎵�鏈夌殑u-form-item鏃讹紝璋冪敤promise鐨則hen鏂规硶
+						if (++count === this.fields.length) {
+							resolve(valid); // 杩涘叆promise鐨則hen鏂规硶
+							// 鍒ゆ柇鏄惁璁剧疆浜唗oast鐨勬彁绀烘柟寮忥紝鍙彁绀烘渶鍓嶉潰鐨勮〃鍗曞煙鐨勭涓�涓敊璇俊鎭�
+							if(this.errorType.indexOf('none') === -1 && this.errorType.indexOf('toast') >= 0 && errorArr.length) {
+								this.$u.toast(errorArr[0]);
+							}
+							// 璋冪敤鍥炶皟鏂规硶
+							if (typeof callback == 'function') callback(valid);
+						}
+					});
+				});
+			});
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+</style>
diff --git a/uview-ui/components/u-full-screen/u-full-screen.vue b/uview-ui/components/u-full-screen/u-full-screen.vue
new file mode 100644
index 0000000..4f7e7d9
--- /dev/null
+++ b/uview-ui/components/u-full-screen/u-full-screen.vue
@@ -0,0 +1,52 @@
+<template>
+	<u-modal v-model="show" :show-cancel-button="true" confirm-text="鍗囩骇" title="鍙戠幇鏂扮増鏈�" @cancel="cancel" @confirm="confirm">
+		<view class="u-update-content">
+			<rich-text :nodes="content"></rich-text>
+		</view>
+	</u-modal>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				show: false,
+				content: `
+					1. 淇badge缁勪欢鐨剆ize鍙傛暟鏃犳晥闂<br>
+					2. 鏂板Modal妯℃�佹缁勪欢<br>
+					3. 鏂板鍘嬬獥灞忕粍浠讹紝鍙互鍦ˋPP涓婁互寮圭獥鐨勫舰寮忛伄鐩栧鑸爮鍜屽簳閮╰abbar<br>
+					4. 淇閿洏缁勪欢鍦ㄥ井淇″皬绋嬪簭涓婇伄缃╂棤鏁堢殑闂
+				`,
+			}
+		},
+		onReady() {
+			this.show = true;
+		},
+		methods: {
+			cancel() {
+				this.closeModal();
+			},
+			confirm() {
+				this.closeModal();
+			},
+			closeModal() {
+				uni.navigateBack();
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	.u-full-content {
+		background-color: #00C777;
+	}
+	
+	.u-update-content {
+		font-size: 26rpx;
+		color: $u-content-color;
+		line-height: 1.7;
+		padding: 30rpx;
+	}
+</style>
diff --git a/uview-ui/components/u-gap/u-gap.vue b/uview-ui/components/u-gap/u-gap.vue
new file mode 100644
index 0000000..6c01f94
--- /dev/null
+++ b/uview-ui/components/u-gap/u-gap.vue
@@ -0,0 +1,54 @@
+<template>
+	<view class="u-gap" :style="[gapStyle]"></view>
+</template>
+
+<script>
+/**
+ * gap 闂撮殧妲�
+ * @description 璇ョ粍浠朵竴鑸敤浜庡唴瀹瑰潡涔嬮棿鐨勭敤涓�涓伆鑹插潡闅斿紑鐨勫満鏅紝鏂逛究鐢ㄦ埛椋庢牸缁熶竴锛屽噺灏戝伐浣滈噺
+ * @tutorial https://www.uviewui.com/components/gap.html
+ * @property {String} bg-color 鑳屾櫙棰滆壊锛堥粯璁�#f3f4f6锛�
+ * @property {String Number} height 鍒嗗壊妲介珮搴︼紝鍗曚綅rpx锛堥粯璁�30锛�
+ * @property {String Number} margin-top 涓庡墠涓�涓粍浠剁殑璺濈锛屽崟浣峳px锛堥粯璁�0锛�
+ * @property {String Number} margin-bottom 涓庡悗涓�涓粍浠剁殑璺濈锛屽崟浣峳px锛�0锛�
+ * @example <u-gap height="80" bg-color="#bbb"></u-gap>
+ */
+export default {
+	name: "u-gap",
+	props: {
+		bgColor: {
+			type: String,
+			default: 'transparent ' // 鑳屾櫙閫忔槑
+		},
+		// 楂樺害
+		height: {
+			type: [String, Number],
+			default: 30
+		},
+		// 涓庝笂涓�涓粍浠剁殑璺濈
+		marginTop: {
+			type: [String, Number],
+			default: 0
+		},
+		// 涓庝笅涓�涓粍浠剁殑璺濈
+		marginBottom: {
+			type: [String, Number],
+			default: 0
+		},
+	},
+	computed: {
+		gapStyle() {
+			return {
+				backgroundColor: this.bgColor,
+				height: this.height + 'rpx',
+				marginTop: this.marginTop + 'rpx',
+				marginBottom: this.marginBottom + 'rpx'
+			};
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+</style>
diff --git a/uview-ui/components/u-grid-item/u-grid-item.vue b/uview-ui/components/u-grid-item/u-grid-item.vue
new file mode 100644
index 0000000..0773307
--- /dev/null
+++ b/uview-ui/components/u-grid-item/u-grid-item.vue
@@ -0,0 +1,126 @@
+<template>
+	<view class="u-grid-item" :hover-class="parentData.hoverClass"
+	 :hover-stay-time="200" @tap="click" :style="{
+			background: bgColor,
+			width: width,
+		}">
+		<view class="u-grid-item-box" :style="[customStyle]" :class="[parentData.border ? 'u-border-right u-border-bottom' : '']">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * gridItem 鎻愮ず
+	 * @description 瀹牸缁勪欢涓�鑸敤浜庡悓鏃跺睍绀哄涓悓绫婚」鐩殑鍦烘櫙锛屽彲浠ョ粰瀹牸鐨勯」鐩缃窘鏍囩粍浠�(badge)锛屾垨鑰呭浘鏍囩瓑锛屼篃鍙互鎵╁睍涓哄乏鍙虫粦鍔ㄧ殑杞挱褰㈠紡銆傛惌閰島-grid浣跨敤
+	 * @tutorial https://www.uviewui.com/components/grid.html
+	 * @property {String} bg-color 瀹牸鐨勮儗鏅鑹诧紙榛樿#ffffff锛�
+	 * @property {String Number} index 鐐瑰嚮瀹牸鏃讹紝杩斿洖鐨勫��
+	 * @property {Object} custom-style 鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+	 * @event {Function} click 鐐瑰嚮瀹牸瑙﹀彂
+	 * @example <u-grid-item></u-grid-item>
+	 */
+	export default {
+		name: "u-grid-item",
+		props: {
+			// 鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// 鐐瑰嚮鏃惰繑鍥炵殑index
+			index: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡
+			customStyle: {
+				type: Object,
+				default() {
+					return {
+						padding: '30rpx 0'
+					}
+				}
+			}
+		},
+		data() {
+			return {
+				parentData: {
+					hoverClass: '', // 鎸変笅鍘荤殑鏃跺�欙紝鏄惁鏄剧ず鑳屾櫙鐏拌壊
+					col: 3, // 鐖剁粍浠跺垝鍒嗙殑瀹牸鏁�
+					border: true, // 鏄惁鏄剧ず杈规锛屾牴鎹埗缁勪欢鍐冲畾
+				}
+			};
+		},
+		created() {
+			// 鐖剁粍浠剁殑瀹炰緥
+			this.updateParentData();
+			// this.parent鍦╱pdateParentData()涓畾涔�
+			this.parent.children.push(this);
+		},
+		computed: {
+			// 姣忎釜grid-item鐨勫搴�
+			width() {
+				return 100 / Number(this.parentData.col) + '%';
+			},
+		},
+		methods: {
+			// 鑾峰彇鐖剁粍浠剁殑鍙傛暟
+			updateParentData() {
+				// 姝ゆ柟娉曞啓鍦╩ixin涓�
+				this.getParentData('u-grid');
+			},
+			click() {
+				this.$emit('click', this.index);
+				this.parent && this.parent.click(this.index);
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	.u-grid-item {
+		box-sizing: border-box;
+		background: #fff;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		position: relative;
+		flex-direction: column;
+		
+		/* #ifdef MP */
+		position: relative;
+		float: left;
+		/* #endif */
+	}
+
+	.u-grid-item-hover {
+		background: #f7f7f7 !important;
+	}
+
+	.u-grid-marker-box {
+		position: absolute;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;		
+		/* #endif */
+		line-height: 0;
+	}
+
+	.u-grid-marker-wrap {
+		position: absolute;
+	}
+
+	.u-grid-item-box {
+		padding: 30rpx 0;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		flex: 1;
+		width: 100%;
+		height: 100%;
+	}
+</style>
diff --git a/uview-ui/components/u-grid/u-grid.vue b/uview-ui/components/u-grid/u-grid.vue
new file mode 100644
index 0000000..6588c06
--- /dev/null
+++ b/uview-ui/components/u-grid/u-grid.vue
@@ -0,0 +1,108 @@
+<template>
+	<view class="u-grid" :class="{'u-border-top u-border-left': border}" :style="[gridStyle]"><slot /></view>
+</template>
+
+<script>
+/**
+ * grid 瀹牸甯冨眬
+ * @description 瀹牸缁勪欢涓�鑸敤浜庡悓鏃跺睍绀哄涓悓绫婚」鐩殑鍦烘櫙锛屽彲浠ョ粰瀹牸鐨勯」鐩缃窘鏍囩粍浠�(badge)锛屾垨鑰呭浘鏍囩瓑锛屼篃鍙互鎵╁睍涓哄乏鍙虫粦鍔ㄧ殑杞挱褰㈠紡銆�
+ * @tutorial https://www.uviewui.com/components/grid.html
+ * @property {String Number} col 瀹牸鐨勫垪鏁帮紙榛樿3锛�
+ * @property {Boolean} border 鏄惁鏄剧ず瀹牸鐨勮竟妗嗭紙榛樿true锛�
+ * @property {Boolean} hover-class 鐐瑰嚮瀹牸鐨勬椂鍊欙紝鏄惁鏄剧ず鎸変笅鐨勭伆鑹茶儗鏅紙榛樿false锛�
+ * @event {Function} click 鐐瑰嚮瀹牸瑙﹀彂
+ * @example <u-grid :col="3" @click="click"></u-grid>
+ */
+export default {
+	name: 'u-grid',
+	props: {
+		// 鍒嗘垚鍑犲垪
+		col: {
+			type: [Number, String],
+			default: 3
+		},
+		// 鏄惁鏄剧ず杈规
+		border: {
+			type: Boolean,
+			default: true
+		},
+		// 瀹牸瀵归綈鏂瑰紡锛岃〃鐜颁负鏁伴噺灏戠殑鏃跺�欙紝闈犲乏锛屽眳涓紝杩樻槸闈犲彸
+		align: {
+			type: String,
+			default: 'left'
+		},
+		// 瀹牸鎸夊帇鏃剁殑鏍峰紡绫伙紝"none"涓烘棤鏁堟灉
+		hoverClass: {
+			type: String,
+			default: 'u-hover-class'
+		}
+	},
+	data() {
+		return {
+			index: 0,
+		}
+	},
+	watch: {
+		// 褰撶埗缁勪欢闇�瑕佸瓙缁勪欢闇�瑕佸叡浜殑鍙傛暟鍙戠敓浜嗗彉鍖栵紝鎵嬪姩閫氱煡瀛愮粍浠�
+		parentData() {
+			if(this.children.length) {
+				this.children.map(child => {
+					// 鍒ゆ柇瀛愮粍浠�(u-radio)濡傛灉鏈塽pdateParentData鏂规硶鐨勮瘽锛屽氨灏辨墽琛�(鎵ц鐨勭粨鏋滄槸瀛愮粍浠堕噸鏂颁粠鐖剁粍浠舵媺鍙栦簡鏈�鏂扮殑鍊�)
+					typeof(child.updateParentData) == 'function' && child.updateParentData();
+				})
+			}
+		},
+	},
+	created() {
+		// 濡傛灉灏哻hildren瀹氫箟鍦╠ata涓紝鍦ㄥ井淇″皬绋嬪簭浼氶�犳垚寰幆寮曠敤鑰屾姤閿�
+		this.children = [];
+	},
+	computed: {
+		// 璁$畻鐖剁粍浠剁殑鍊兼槸鍚﹀彂鐢熷彉鍖�
+		parentData() {
+			return [this.hoverClass, this.col, this.size, this.border];
+		},
+		// 瀹牸瀵归綈鏂瑰紡
+		gridStyle() {
+			let style = {};
+			switch(this.align) {
+				case 'left':
+					style.justifyContent = 'flex-start';
+					break;
+				case 'center':
+					style.justifyContent = 'center';
+					break;
+				case 'right':
+					style.justifyContent = 'flex-end';
+					break;
+				default: style.justifyContent = 'flex-start';
+			};
+			return style;
+		}
+	},
+	methods: {
+		click(index) {
+			this.$emit('click', index);
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+
+.u-grid {
+	width: 100%;
+	/* #ifdef MP */
+	position: relative;
+	box-sizing: border-box;
+	overflow: hidden;
+	/* #endif */
+	
+	/* #ifndef MP */
+	@include vue-flex;
+	flex-wrap: wrap;
+	align-items: center;
+	/* #endif */
+}
+</style>
diff --git a/uview-ui/components/u-icon/u-icon.vue b/uview-ui/components/u-icon/u-icon.vue
new file mode 100644
index 0000000..e09a831
--- /dev/null
+++ b/uview-ui/components/u-icon/u-icon.vue
@@ -0,0 +1,336 @@
+<template>
+	<view :style="[customStyle]" class="u-icon" @tap="click" :class="['u-icon--' + labelPos]">
+		<image class="u-icon__img" v-if="isImg" :src="name" :mode="imgMode" :style="[imgStyle]"></image>
+		<text v-else class="u-icon__icon" :class="customClass" :style="[iconStyle]" :hover-class="hoverClass"
+			  @touchstart="touchstart">
+			<text v-if="showDecimalIcon" :style="[decimalIconStyle]" :class="decimalIconClass" :hover-class="hoverClass"
+				  class="u-icon__decimal">
+			</text>
+		</text>
+		<!-- 杩欓噷杩涜绌哄瓧绗︿覆鍒ゆ柇锛屽鏋滀粎浠呮槸v-if="label"锛屽彲鑳戒細鍑虹幇浼犻��0鐨勬椂鍊欙紝缁撴灉涔熸棤娉曟樉绀� -->
+		<text v-if="label !== ''" class="u-icon__label" :style="{
+			color: labelColor,
+			fontSize: $u.addUnit(labelSize),
+			marginLeft: labelPos == 'right' ? $u.addUnit(marginLeft) : 0,
+			marginTop: labelPos == 'bottom' ? $u.addUnit(marginTop) : 0,
+			marginRight: labelPos == 'left' ? $u.addUnit(marginRight) : 0,
+			marginBottom: labelPos == 'top' ? $u.addUnit(marginBottom) : 0,
+		}">{{ label }}
+		</text>
+	</view>
+</template>
+
+<script>
+/**
+ * icon 鍥炬爣
+ * @description 鍩轰簬瀛椾綋鐨勫浘鏍囬泦锛屽寘鍚簡澶у鏁板父瑙佸満鏅殑鍥炬爣銆�
+ * @tutorial https://www.uviewui.com/components/icon.html
+ * @property {String} name 鍥炬爣鍚嶇О锛岃绀轰緥鍥炬爣闆�
+ * @property {String} color 鍥炬爣棰滆壊锛堥粯璁nherit锛�
+ * @property {String | Number} size 鍥炬爣瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�32锛�
+ * @property {String | Number} label-size label瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+ * @property {String} label 鍥炬爣鍙充晶鐨刲abel鏂囧瓧锛堥粯璁�28锛�
+ * @property {String} label-pos label鏂囧瓧鐩稿浜庡浘鏍囩殑浣嶇疆锛屽彧鑳絩ight鎴朾ottom锛堥粯璁ight锛�
+ * @property {String} label-color label瀛椾綋棰滆壊锛堥粯璁�#606266锛�
+ * @property {Object} custom-style icon鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {String} custom-prefix 鑷畾涔夊瓧浣撳浘鏍囧簱鏃讹紝闇�瑕佸啓涓婃鍊�
+ * @property {String | Number} margin-left label鍦ㄥ彸渚ф椂涓庡浘鏍囩殑璺濈锛屽崟浣峳px锛堥粯璁�6锛�
+ * @property {String | Number} margin-top label鍦ㄤ笅鏂规椂涓庡浘鏍囩殑璺濈锛屽崟浣峳px锛堥粯璁�6锛�
+ * @property {String | Number} margin-bottom label鍦ㄤ笂鏂规椂涓庡浘鏍囩殑璺濈锛屽崟浣峳px锛堥粯璁�6锛�
+ * @property {String | Number} margin-right label鍦ㄥ乏渚ф椂涓庡浘鏍囩殑璺濈锛屽崟浣峳px锛堥粯璁�6锛�
+ * @property {String} label-pos label鐩稿浜庡浘鏍囩殑浣嶇疆锛屽彧鑳絩ight鎴朾ottom锛堥粯璁ight锛�
+ * @property {String} index 涓�涓敤浜庡尯鍒嗗涓浘鏍囩殑鍊硷紝鐐瑰嚮鍥炬爣鏃堕�氳繃click浜嬩欢浼犲嚭
+ * @property {String} hover-class 鍥炬爣鎸変笅鍘荤殑鏍峰紡绫伙紝鐢ㄦ硶鍚寀ni鐨剉iew缁勪欢鐨刪over-class鍙傛暟锛岃鎯呰瀹樼綉
+ * @property {String} width 鏄剧ず鍥剧墖灏忓浘鏍囨椂鐨勫搴�
+ * @property {String} height 鏄剧ず鍥剧墖灏忓浘鏍囨椂鐨勯珮搴�
+ * @property {String} top 鍥炬爣鍦ㄥ瀭鐩存柟鍚戜笂鐨勫畾浣�
+ * @property {String} top 鍥炬爣鍦ㄥ瀭鐩存柟鍚戜笂鐨勫畾浣�
+ * @property {String} top 鍥炬爣鍦ㄥ瀭鐩存柟鍚戜笂鐨勫畾浣�
+ * @property {Boolean} show-decimal-icon 鏄惁涓篋ecimalIcon
+ * @property {String} inactive-color 鑳屾櫙棰滆壊锛屽彲鎺ュ彈涓婚鑹诧紝浠匘ecimal鏃舵湁鏁�
+ * @property {String | Number} percent 鏄剧ず鐨勭櫨鍒嗘瘮锛屼粎Decimal鏃舵湁鏁�
+ * @event {Function} click 鐐瑰嚮鍥炬爣鏃惰Е鍙�
+ * @example <u-icon name="photo" color="#497bff" size="28"></u-icon>
+ */
+export default {
+	name: 'u-icon',
+	props: {
+		// 鍥炬爣绫诲悕
+		name: {
+			type: String,
+			default: ''
+		},
+		// 鍥炬爣棰滆壊锛屽彲鎺ュ彈涓婚鑹�
+		color: {
+			type: String,
+			default: ''
+		},
+		// 瀛椾綋澶у皬锛屽崟浣峳px
+		size: {
+			type: [Number, String],
+			default: 'inherit'
+		},
+		// 鏄惁鏄剧ず绮椾綋
+		bold: {
+			type: Boolean,
+			default: false
+		},
+		// 鐐瑰嚮鍥炬爣鐨勬椂鍊欎紶閫掍簨浠跺嚭鍘荤殑index锛堢敤浜庡尯鍒嗙偣鍑讳簡鍝竴涓級
+		index: {
+			type: [Number, String],
+			default: ''
+		},
+		// 瑙︽懜鍥炬爣鏃剁殑绫诲悕
+		hoverClass: {
+			type: String,
+			default: ''
+		},
+		// 鑷畾涔夋墿灞曞墠缂�锛屾柟渚跨敤鎴锋墿灞曡嚜宸辩殑鍥炬爣搴�
+		customPrefix: {
+			type: String,
+			default: 'uicon'
+		},
+		// 鍥炬爣鍙宠竟鎴栬�呬笅闈㈢殑鏂囧瓧
+		label: {
+			type: [String, Number],
+			default: ''
+		},
+		// label鐨勪綅缃紝鍙兘鍙宠竟鎴栬�呬笅杈�
+		labelPos: {
+			type: String,
+			default: 'right'
+		},
+		// label鐨勫ぇ灏�
+		labelSize: {
+			type: [String, Number],
+			default: '28'
+		},
+		// label鐨勯鑹�
+		labelColor: {
+			type: String,
+			default: '#606266'
+		},
+		// label涓庡浘鏍囩殑璺濈(妯悜鎺掑垪)
+		marginLeft: {
+			type: [String, Number],
+			default: '6'
+		},
+		// label涓庡浘鏍囩殑璺濈(绔栧悜鎺掑垪)
+		marginTop: {
+			type: [String, Number],
+			default: '6'
+		},
+		// label涓庡浘鏍囩殑璺濈(绔栧悜鎺掑垪)
+		marginRight: {
+			type: [String, Number],
+			default: '6'
+		},
+		// label涓庡浘鏍囩殑璺濈(绔栧悜鎺掑垪)
+		marginBottom: {
+			type: [String, Number],
+			default: '6'
+		},
+		// 鍥剧墖鐨刴ode
+		imgMode: {
+			type: String,
+			default: 'widthFix'
+		},
+		// 鑷畾涔夋牱寮�
+		customStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		// 鐢ㄤ簬鏄剧ず鍥剧墖灏忓浘鏍囨椂锛屽浘鐗囩殑瀹藉害
+		width: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鐢ㄤ簬鏄剧ず鍥剧墖灏忓浘鏍囨椂锛屽浘鐗囩殑楂樺害
+		height: {
+			type: [String, Number],
+			default: ''
+		},
+		// 鐢ㄤ簬瑙e喅鏌愪簺鎯呭喌涓嬶紝璁╁浘鏍囧瀭鐩村眳涓殑鐢ㄩ��
+		top: {
+			type: [String, Number],
+			default: 0
+		},
+		// 鏄惁涓篋ecimalIcon
+		showDecimalIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鑳屾櫙棰滆壊锛屽彲鎺ュ彈涓婚鑹诧紝浠匘ecimal鏃舵湁鏁�
+		inactiveColor: {
+			type: String,
+			default: '#ececec'
+		},
+		// 鏄剧ず鐨勭櫨鍒嗘瘮锛屼粎Decimal鏃舵湁鏁�
+		percent: {
+			type: [Number, String],
+			default: '50'
+		}
+	},
+	computed: {
+		customClass() {
+			let classes = []
+			classes.push(this.customPrefix + '-' + this.name)
+			// uView鐨勮嚜瀹氫箟鍥炬爣绫诲悕涓簎-iconfont
+			if (this.customPrefix == 'uicon') {
+				classes.push('u-iconfont')
+			} else {
+				classes.push(this.customPrefix)
+			}
+			// 涓婚鑹诧紝閫氳繃绫婚厤缃�
+			if (this.showDecimalIcon && this.inactiveColor && this.$u.config.type.includes(this.inactiveColor)) {
+				classes.push('u-icon__icon--' + this.inactiveColor)
+			} else if (this.color && this.$u.config.type.includes(this.color)) classes.push('u-icon__icon--' + this.color)
+			// 闃块噷锛屽ご鏉★紝鐧惧害灏忕▼搴忛�氳繃鏁扮粍缁戝畾绫诲悕鏃讹紝鏃犳硶鐩存帴浣跨敤[a, b, c]鐨勫舰寮忥紝鍚﹀垯鏃犳硶璇嗗埆
+			// 鏁呴渶灏嗗叾鎷嗘垚涓�涓瓧绗︿覆鐨勫舰寮忥紝閫氳繃绌烘牸闅斿紑鍚勪釜绫诲悕
+			//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
+			classes = classes.join(' ')
+			//#endif
+			return classes
+		},
+		iconStyle() {
+			let style = {}
+			style = {
+				fontSize: this.size == 'inherit' ? 'inherit' : this.$u.addUnit(this.size),
+				fontWeight: this.bold ? 'bold' : 'normal',
+				// 鏌愪簺鐗规畩鎯呭喌闇�瑕佽缃竴涓埌椤堕儴鐨勮窛绂伙紝鎵嶈兘鏇村ソ鐨勫瀭鐩村眳涓�
+				top: this.$u.addUnit(this.top)
+			}
+			// 闈炰富棰樿壊鍊兼椂锛屾墠褰撲綔棰滆壊鍊�
+			if (this.showDecimalIcon && this.inactiveColor && !this.$u.config.type.includes(this.inactiveColor)) {
+				style.color = this.inactiveColor
+			} else if (this.color && !this.$u.config.type.includes(this.color)) style.color = this.color
+
+			return style
+		},
+		// 鍒ゆ柇浼犲叆鐨刵ame灞炴�э紝鏄惁鍥剧墖璺緞锛屽彧瑕佸甫鏈�"/"鍧囪涓烘槸鍥剧墖褰㈠紡
+		isImg() {
+			return this.name.indexOf('/') !== -1
+		},
+		imgStyle() {
+			let style = {}
+			// 濡傛灉璁剧疆width鍜宧eight灞炴�э紝鍒欎紭鍏堜娇鐢紝鍚﹀垯浣跨敤size灞炴��
+			style.width = this.width ? this.$u.addUnit(this.width) : this.$u.addUnit(this.size)
+			style.height = this.height ? this.$u.addUnit(this.height) : this.$u.addUnit(this.size)
+			return style
+		},
+		decimalIconStyle() {
+			let style = {}
+			style = {
+				fontSize: this.size == 'inherit' ? 'inherit' : this.$u.addUnit(this.size),
+				fontWeight: this.bold ? 'bold' : 'normal',
+				// 鏌愪簺鐗规畩鎯呭喌闇�瑕佽缃竴涓埌椤堕儴鐨勮窛绂伙紝鎵嶈兘鏇村ソ鐨勫瀭鐩村眳涓�
+				top: this.$u.addUnit(this.top),
+				width: this.percent + '%'
+			}
+			// 闈炰富棰樿壊鍊兼椂锛屾墠褰撲綔棰滆壊鍊�
+			if (this.color && !this.$u.config.type.includes(this.color)) style.color = this.color
+			return style
+		},
+		decimalIconClass() {
+			let classes = []
+			classes.push(this.customPrefix + '-' + this.name)
+			// uView鐨勮嚜瀹氫箟鍥炬爣绫诲悕涓簎-iconfont
+			if (this.customPrefix == 'uicon') {
+				classes.push('u-iconfont')
+			} else {
+				classes.push(this.customPrefix)
+			}
+			// 涓婚鑹诧紝閫氳繃绫婚厤缃�
+			if (this.color && this.$u.config.type.includes(this.color)) classes.push('u-icon__icon--' + this.color)
+			else classes.push('u-icon__icon--primary')
+			// 闃块噷锛屽ご鏉★紝鐧惧害灏忕▼搴忛�氳繃鏁扮粍缁戝畾绫诲悕鏃讹紝鏃犳硶鐩存帴浣跨敤[a, b, c]鐨勫舰寮忥紝鍚﹀垯鏃犳硶璇嗗埆
+			// 鏁呴渶灏嗗叾鎷嗘垚涓�涓瓧绗︿覆鐨勫舰寮忥紝閫氳繃绌烘牸闅斿紑鍚勪釜绫诲悕
+			//#ifdef MP-ALIPAY || MP-TOUTIAO || MP-BAIDU
+			classes = classes.join(' ')
+			//#endif
+			return classes
+		}
+	},
+	methods: {
+		click() {
+			this.$emit('click', this.index)
+		},
+		touchstart() {
+			this.$emit('touchstart', this.index)
+		}
+	}
+}
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+@import '../../iconfont.css';
+
+.u-icon {
+	display: inline-flex;
+	align-items: center;
+
+	&--left {
+		flex-direction: row-reverse;
+		align-items: center;
+	}
+
+	&--right {
+		flex-direction: row;
+		align-items: center;
+	}
+
+	&--top {
+		flex-direction: column-reverse;
+		justify-content: center;
+	}
+
+	&--bottom {
+		flex-direction: column;
+		justify-content: center;
+	}
+
+	&__icon {
+		position: relative;
+
+		&--primary {
+			color: $u-type-primary;
+		}
+
+		&--success {
+			color: $u-type-success;
+		}
+
+		&--error {
+			color: $u-type-error;
+		}
+
+		&--warning {
+			color: $u-type-warning;
+		}
+
+		&--info {
+			color: $u-type-info;
+		}
+	}
+
+	&__decimal {
+		position: absolute;
+		top: 0;
+		left: 0;
+		display: inline-block;
+		overflow: hidden;
+	}
+
+	&__img {
+		height: auto;
+		will-change: transform;
+	}
+
+	&__label {
+		line-height: 1;
+	}
+}
+</style>
diff --git a/uview-ui/components/u-image/u-image.vue b/uview-ui/components/u-image/u-image.vue
new file mode 100644
index 0000000..c729c3c
--- /dev/null
+++ b/uview-ui/components/u-image/u-image.vue
@@ -0,0 +1,267 @@
+<template>
+	<view class="u-image" @tap="onClick" :style="[wrapStyle, backgroundStyle]">
+		<image
+			v-if="!isError"
+			:src="src"
+			:mode="mode"
+			@error="onErrorHandler"
+			@load="onLoadHandler"
+			:lazy-load="lazyLoad"
+			class="u-image__image"
+			:show-menu-by-longpress="showMenuByLongpress"
+			:style="{
+				borderRadius: shape == 'circle' ? '50%' : $u.addUnit(borderRadius)
+			}"
+		></image>
+		<view
+			v-if="showLoading && loading"
+			class="u-image__loading"
+			:style="{
+				borderRadius: shape == 'circle' ? '50%' : $u.addUnit(borderRadius),
+				backgroundColor: this.bgColor
+			}"
+		>
+			<slot v-if="$slots.loading" name="loading" />
+			<u-icon v-else :name="loadingIcon" :width="width" :height="height"></u-icon>
+		</view>
+		<view
+			v-if="showError && isError && !loading"
+			class="u-image__error"
+			:style="{
+				borderRadius: shape == 'circle' ? '50%' : $u.addUnit(borderRadius)
+			}"
+		>
+			<slot v-if="$slots.error" name="error" />
+			<u-icon v-else :name="errorIcon" :width="width" :height="height"></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * Image 鍥剧墖
+ * @description 姝ょ粍浠朵负uni-app鐨刬mage缁勪欢鐨勫姞寮虹増锛屽湪缁ф壙浜嗗師鏈夊姛鑳藉锛岃繕鏀寔娣″叆鍔ㄧ敾銆佸姞杞戒腑銆佸姞杞藉け璐ユ彁绀恒�佸渾瑙掑�煎拰褰㈢姸绛夈��
+ * @tutorial https://uviewui.com/components/image.html
+ * @property {String} src 鍥剧墖鍦板潃
+ * @property {String} mode 瑁佸壀妯″紡锛岃瀹樼綉璇存槑
+ * @property {String | Number} width 瀹藉害锛屽崟浣嶄换鎰忥紝濡傛灉涓烘暟鍊硷紝鍒欎负rpx鍗曚綅锛堥粯璁�100%锛�
+ * @property {String | Number} height 楂樺害锛屽崟浣嶄换鎰忥紝濡傛灉涓烘暟鍊硷紝鍒欎负rpx鍗曚綅锛堥粯璁� auto锛�
+ * @property {String} shape 鍥剧墖褰㈢姸锛宑ircle-鍦嗗舰锛宻quare-鏂瑰舰锛堥粯璁quare锛�
+ * @property {String | Number} border-radius 鍦嗚鍊硷紝鍗曚綅浠绘剰锛屽鏋滀负鏁板�硷紝鍒欎负rpx鍗曚綅锛堥粯璁� 0锛�
+ * @property {Boolean} lazy-load 鏄惁鎳掑姞杞斤紝浠呭井淇″皬绋嬪簭銆丄pp銆佺櫨搴﹀皬绋嬪簭銆佸瓧鑺傝烦鍔ㄥ皬绋嬪簭鏈夋晥锛堥粯璁� true锛�
+ * @property {Boolean} show-menu-by-longpress 鏄惁寮�鍚暱鎸夊浘鐗囨樉绀鸿瘑鍒皬绋嬪簭鐮佽彍鍗曪紝浠呭井淇″皬绋嬪簭鏈夋晥锛堥粯璁� false锛�
+ * @property {String} loading-icon 鍔犺浇涓殑鍥炬爣锛屾垨鑰呭皬鍥剧墖锛堥粯璁� photo锛�
+ * @property {String} error-icon 鍔犺浇澶辫触鐨勫浘鏍囷紝鎴栬�呭皬鍥剧墖锛堥粯璁� error-circle锛�
+ * @property {Boolean} show-loading 鏄惁鏄剧ず鍔犺浇涓殑鍥炬爣鎴栬�呰嚜瀹氫箟鐨剆lot锛堥粯璁� true锛�
+ * @property {Boolean} show-error 鏄惁鏄剧ず鍔犺浇閿欒鐨勫浘鏍囨垨鑰呰嚜瀹氫箟鐨剆lot锛堥粯璁� true锛�
+ * @property {Boolean} fade 鏄惁闇�瑕佹贰鍏ユ晥鏋滐紙榛樿 true锛�
+ * @property {String Number} width 浼犲叆鍥剧墖璺緞鏃跺浘鐗囩殑瀹藉害
+ * @property {String Number} height 浼犲叆鍥剧墖璺緞鏃跺浘鐗囩殑楂樺害
+ * @property {Boolean} webp 鍙敮鎸佺綉缁滆祫婧愶紝鍙寰俊灏忕▼搴忔湁鏁堬紙榛樿 false锛�
+ * @property {String | Number} duration 鎼厤fade鍙傛暟鐨勮繃娓℃椂闂达紝鍗曚綅ms锛堥粯璁� 500锛�
+ * @event {Function} click 鐐瑰嚮鍥剧墖鏃惰Е鍙�
+ * @event {Function} error 鍥剧墖鍔犺浇澶辫触鏃惰Е鍙�
+ * @event {Function} load 鍥剧墖鍔犺浇鎴愬姛鏃惰Е鍙�
+ * @example <u-image width="100%" height="300rpx" :src="src"></u-image>
+ */
+export default {
+	name: 'u-image',
+	props: {
+		// 鍥剧墖鍦板潃
+		src: {
+			type: String,
+			default: ''
+		},
+		// 瑁佸壀妯″紡
+		mode: {
+			type: String,
+			default: 'aspectFill'
+		},
+		// 瀹藉害锛屽崟浣嶄换鎰�
+		width: {
+			type: [String, Number],
+			default: '100%'
+		},
+		// 楂樺害锛屽崟浣嶄换鎰�
+		height: {
+			type: [String, Number],
+			default: 'auto'
+		},
+		// 鍥剧墖褰㈢姸锛宑ircle-鍦嗗舰锛宻quare-鏂瑰舰
+		shape: {
+			type: String,
+			default: 'square'
+		},
+		// 鍦嗚锛屽崟浣嶄换鎰�
+		borderRadius: {
+			type: [String, Number],
+			default: 0
+		},
+		// 鏄惁鎳掑姞杞斤紝寰俊灏忕▼搴忋�丄pp銆佺櫨搴﹀皬绋嬪簭銆佸瓧鑺傝烦鍔ㄥ皬绋嬪簭
+		lazyLoad: {
+			type: Boolean,
+			default: true
+		},
+		// 寮�鍚暱鎸夊浘鐗囨樉绀鸿瘑鍒井淇″皬绋嬪簭鐮佽彍鍗�
+		showMenuByLongpress: {
+			type: Boolean,
+			default: true
+		},
+		// 鍔犺浇涓殑鍥炬爣锛屾垨鑰呭皬鍥剧墖
+		loadingIcon: {
+			type: String,
+			default: 'photo'
+		},
+		// 鍔犺浇澶辫触鐨勫浘鏍囷紝鎴栬�呭皬鍥剧墖
+		errorIcon: {
+			type: String,
+			default: 'error-circle'
+		},
+		// 鏄惁鏄剧ず鍔犺浇涓殑鍥炬爣鎴栬�呰嚜瀹氫箟鐨剆lot
+		showLoading: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず鍔犺浇閿欒鐨勫浘鏍囨垨鑰呰嚜瀹氫箟鐨剆lot
+		showError: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁闇�瑕佹贰鍏ユ晥鏋�
+		fade: {
+			type: Boolean,
+			default: true
+		},
+		// 鍙敮鎸佺綉缁滆祫婧愶紝鍙寰俊灏忕▼搴忔湁鏁�
+		webp: {
+			type: Boolean,
+			default: false
+		},
+		// 杩囨浮鏃堕棿锛屽崟浣峬s
+		duration: {
+			type: [String, Number],
+			default: 500
+		},
+		// 鑳屾櫙棰滆壊锛岀敤浜庢繁鑹查〉闈㈠姞杞藉浘鐗囨椂锛屼负浜嗗拰鑳屾櫙鑹茶瀺鍚�
+		bgColor: {
+			type: String,
+			default: '#f3f4f6'
+		}
+	},
+	data() {
+		return {
+			// 鍥剧墖鏄惁鍔犺浇閿欒锛屽鏋滄槸锛屽垯鏄剧ず閿欒鍗犱綅鍥�
+			isError: false,
+			// 鍒濆鍖栫粍浠舵椂锛岄粯璁や负鍔犺浇涓姸鎬�
+			loading: true,
+			// 涓嶉�忔槑搴︼紝涓轰簡瀹炵幇娣″叆娣″嚭鐨勬晥鏋�
+			opacity: 1,
+			// 杩囨浮鏃堕棿锛屽洜涓簆rops鐨勫�兼棤娉曚慨鏀癸紝鏁呴渶瑕佷竴涓腑闂村��
+			durationTime: this.duration,
+			// 鍥剧墖鍔犺浇瀹屾垚鏃讹紝鍘绘帀鑳屾櫙棰滆壊锛屽洜涓哄鏋滄槸png鍥剧墖锛屽氨浼氭樉绀虹伆鑹茬殑鑳屾櫙
+			backgroundStyle: {}
+		};
+	},
+	watch: {
+		src: {
+			immediate: true,
+			handler (n) {
+				if(!n) {
+					// 濡傛灉浼犲叆null鎴栬��''锛屾垨鑰協alse锛屾垨鑰卽ndefined锛屾爣璁颁负閿欒鐘舵��
+					this.isError = true;
+					this.loading = false;
+				} else {
+					this.isError = false;
+				}
+			}
+		}
+	},
+	computed: {
+		wrapStyle() {
+			let style = {};
+			// 閫氳繃璋冪敤addUnit()鏂规硶锛屽鏋滄湁鍗曚綅锛屽鐧惧垎姣旓紝px鍗曚綅绛夛紝鐩存帴杩斿洖锛屽鏋滄槸绾补鐨勬暟鍊硷紝鍒欏姞涓妑px鍗曚綅
+			style.width = this.$u.addUnit(this.width);
+			style.height = this.$u.addUnit(this.height);
+			// 濡傛灉鏄厤缃簡鍦嗗舰锛岃缃�50%鐨勫渾瑙掞紝鍚﹀垯鎸夌収榛樿鐨勯厤缃��
+			style.borderRadius = this.shape == 'circle' ? '50%' : this.$u.addUnit(this.borderRadius);
+			// 濡傛灉璁剧疆鍦嗚锛屽繀椤昏鏈塰idden锛屽惁鍒欏彲鑳藉渾瑙掓棤鏁�
+			style.overflow = this.borderRadius > 0 ? 'hidden' : 'visible';
+			if (this.fade) {
+				style.opacity = this.opacity;
+				style.transition = `opacity ${Number(this.durationTime) / 1000}s ease-in-out`;
+			}
+			return style;
+		}
+	},
+	methods: {
+		// 鐐瑰嚮鍥剧墖
+		onClick() {
+			this.$emit('click');
+		},
+		// 鍥剧墖鍔犺浇澶辫触
+		onErrorHandler(err) {
+			this.loading = false;
+			this.isError = true;
+			this.$emit('error', err);
+		},
+		// 鍥剧墖鍔犺浇瀹屾垚锛屾爣璁發oading缁撴潫
+		onLoadHandler() {
+			this.loading = false;
+			this.isError = false;
+			this.$emit('load');
+			// 濡傛灉涓嶉渶瑕佸姩鐢绘晥鏋滐紝灏变笉鎵ц涓嬫柟浠g爜锛屽悓鏃剁Щ闄ゅ姞杞芥椂鐨勮儗鏅鑹�
+			// 鍚﹀垯鏃犻渶fade鏁堟灉鏃讹紝png鍥剧墖渚濈劧鑳界湅鍒颁笅鏂圭殑鑳屾櫙鑹�
+			if (!this.fade) return this.removeBgColor();
+			// 鍘熸潵opacity涓�1(涓嶉�忔槑锛屾槸涓轰簡鏄剧ず鍗犱綅鍥�)锛屾敼鎴�0(閫忔槑锛屾剰鍛崇潃璇ュ厓绱犳樉绀虹殑鏄儗鏅鑹诧紝榛樿鐨勭伆鑹�)锛屽啀鏀规垚1锛屾槸涓轰簡鑾峰緱杩囨浮鏁堟灉
+			this.opacity = 0;
+			// 杩欓噷璁剧疆涓�0锛屾槸涓轰簡鍥剧墖灞曠ず鍒拌儗鏅叏閫忔槑杩欎釜杩囩▼鏃堕棿涓�0锛屽欢鏃朵箣鍚庡欢鏃朵箣鍚庨噸鏂拌缃负duration锛屾槸涓轰簡鑾峰緱鑳屾櫙閫忔槑(鐏拌壊)
+			// 鍒板浘鐗囧睍绀虹殑杩囩▼涓殑娣″叆鏁堟灉
+			this.durationTime = 0;
+			// 寤舵椂50ms锛屽惁鍒欏湪娴忚鍣℉5锛岃繃娓℃晥鏋滄棤鏁�
+			setTimeout(() => {
+				this.durationTime = this.duration;
+				this.opacity = 1;
+				setTimeout(() => {
+					this.removeBgColor();
+				}, this.durationTime);
+			}, 50);
+		},
+		// 绉婚櫎鍥剧墖鐨勮儗鏅壊
+		removeBgColor() {
+			// 娣″叆鍔ㄧ敾杩囨浮瀹屾垚鍚庯紝灏嗚儗鏅缃负閫忔槑鑹诧紝鍚﹀垯png鍥剧墖浼氱湅鍒扮伆鑹茬殑鑳屾櫙
+			this.backgroundStyle = {
+				backgroundColor: 'transparent'
+			};
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import '../../libs/css/style.components.scss';
+
+.u-image {
+	position: relative;
+	transition: opacity 0.5s ease-in-out;
+
+	&__image {
+		width: 100%;
+		height: 100%;
+	}
+
+	&__loading,
+	&__error {
+		position: absolute;
+		top: 0;
+		left: 0;
+		width: 100%;
+		height: 100%;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		background-color: $u-bg-color;
+		color: $u-tips-color;
+		font-size: 46rpx;
+	}
+}
+</style>
diff --git a/uview-ui/components/u-index-anchor/u-index-anchor.vue b/uview-ui/components/u-index-anchor/u-index-anchor.vue
new file mode 100644
index 0000000..bcd8bbf
--- /dev/null
+++ b/uview-ui/components/u-index-anchor/u-index-anchor.vue
@@ -0,0 +1,89 @@
+<template>
+	<!-- 鏀粯瀹濆皬绋嬪簭浣跨敤$u.getRect()鑾峰彇缁勪欢鐨勬牴鍏冪礌灏哄锛屾墍浠ュ湪澶栭潰濂椾竴涓�"澹�" -->
+	<view>
+		<view class="u-index-anchor-wrapper" :id="$u.guid()" :style="[wrapperStyle]">
+			<view class="u-index-anchor " :class="[active ? 'u-index-anchor--active' : '']" :style="[customAnchorStyle]">
+				<slot v-if="useSlot" />
+				<block v-else>
+					<text>{{ index }}</text>
+				</block>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * indexAnchor 绱㈠紩鍒楄〃閿氱偣
+	 * @description 閫氳繃鎶樺彔闈㈡澘鏀剁撼鍐呭鍖哄煙,鎼厤<u-index-anchor>浣跨敤
+	 * @tutorial https://www.uviewui.com/components/indexList.html#indexanchor-props
+	 * @property {Boolean} use-slot 鏄惁浣跨敤鑷畾涔夊唴瀹圭殑鎻掓Ы锛堥粯璁alse锛�
+	 * @property {String Number} index 绱㈠紩瀛楃锛屽鏋滃畾涔変簡use-slot锛屾鍙傛暟鑷姩澶辨晥
+	 * @property {Object} custStyle 鑷畾涔夋牱寮忥紝瀵硅薄褰㈠紡锛屽"{color: 'red'}"
+	 * @event {Function} default 閿氱偣浣嶇疆鏄剧ず鍐呭锛岄粯璁や负绱㈠紩瀛楃
+	 * @example <u-index-anchor :index="item" />
+	 */
+	export default {
+		name: "u-index-anchor",
+		props: {
+			useSlot: {
+				type: Boolean,
+				default: false
+			},
+			index: {
+				type: String,
+				default: ''
+			},
+			customStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			}
+		},
+		data() {
+			return {
+				active: false,
+				wrapperStyle: {},
+				anchorStyle: {}
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			this.parent = this.$u.$parent.call(this, 'u-index-list');
+			if(this.parent) {
+				this.parent.children.push(this);
+				this.parent.updateData();
+			}
+		},
+		computed: {
+			customAnchorStyle() {
+				return Object.assign(this.anchorStyle, this.customStyle);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-index-anchor {
+		box-sizing: border-box;
+		padding: 14rpx 24rpx;
+		color: #606266;
+		width: 100%;
+		font-weight: 500;
+		font-size: 28rpx;
+		line-height: 1.2;
+		background-color: rgb(245, 245, 245);
+	}
+
+	.u-index-anchor--active {
+		right: 0;
+		left: 0;
+		color: #497bff;
+		background-color: #fff;
+	}
+</style>
diff --git a/uview-ui/components/u-index-list/u-index-list.vue b/uview-ui/components/u-index-list/u-index-list.vue
new file mode 100644
index 0000000..37a9763
--- /dev/null
+++ b/uview-ui/components/u-index-list/u-index-list.vue
@@ -0,0 +1,315 @@
+<template>
+	<!-- 鏀粯瀹濆皬绋嬪簭浣跨敤$u.getRect()鑾峰彇缁勪欢鐨勬牴鍏冪礌灏哄锛屾墍浠ュ湪澶栭潰濂椾竴涓�"澹�" -->
+	<view>
+		<view class="u-index-bar">
+			<slot />
+			<view v-if="showSidebar" class="u-index-bar__sidebar" @touchstart.stop.prevent="onTouchMove" @touchmove.stop.prevent="onTouchMove"
+			 @touchend.stop.prevent="onTouchStop" @touchcancel.stop.prevent="onTouchStop">
+				<view v-for="(item, index) in indexList" :key="index" class="u-index-bar__index" :style="{zIndex: zIndex + 1, color: activeAnchorIndex === index ? activeColor : ''}"
+				 :data-index="index">
+					{{ item }}
+				</view>
+			</view>
+			<view class="u-indexed-list-alert" v-if="touchmove && indexList[touchmoveIndex]" :style="{
+				zIndex: alertZIndex
+			}">
+				<text>{{indexList[touchmoveIndex]}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	var indexList = function() {
+		var indexList = [];
+		var charCodeOfA = 'A'.charCodeAt(0);
+		for (var i = 0; i < 26; i++) {
+			indexList.push(String.fromCharCode(charCodeOfA + i));
+		}
+		return indexList;
+	};
+
+	/**
+	 * indexList 绱㈠紩鍒楄〃
+	 * @description 閫氳繃鎶樺彔闈㈡澘鏀剁撼鍐呭鍖哄煙,鎼厤<u-index-anchor>浣跨敤
+	 * @tutorial https://www.uviewui.com/components/indexList.html#indexanchor-props
+	 * @property {Number String} scroll-top 褰撳墠婊氬姩楂樺害锛岃嚜瀹氫箟缁勪欢鏃犳硶鑾峰緱婊氬姩鏉′簨浠讹紝鎵�浠ヤ緷璧栨帴鍏ユ柟浼犲叆
+	 * @property {Array} index-list 绱㈠紩瀛楃鍒楄〃锛屾暟缁勶紙榛樿A-Z锛�
+	 * @property {Number String} z-index 閿氱偣鍚搁《鏃剁殑灞傜骇锛堥粯璁�965锛�
+	 * @property {Boolean} sticky 鏄惁寮�鍚敋鐐硅嚜鍔ㄥ惛椤讹紙榛樿true锛�
+	 * @property {Number String} offset-top 閿氱偣鑷姩鍚搁《鏃朵笌椤堕儴鐨勮窛绂伙紙榛樿0锛�
+	 * @property {String} highlight-color 閿氱偣鍜屽彸杈圭储寮曞瓧绗﹂珮浜鑹诧紙榛樿#497bff锛�
+	 * @event {Function} select 閫変腑鍙宠竟绱㈠紩瀛楃鏃惰Е鍙�
+	 * @example <u-index-list :scrollTop="scrollTop"></u-index-list>
+	 */
+	export default {
+		name: "u-index-list",
+		props: {
+			sticky: {
+				type: Boolean,
+				default: true
+			},
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			},
+			scrollTop: {
+				type: [Number, String],
+				default: 0,
+			},
+			offsetTop: {
+				type: [Number, String],
+				default: 0
+			},
+			indexList: {
+				type: Array,
+				default () {
+					return indexList()
+				}
+			},
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			}
+		},
+		created() {
+			// #ifdef H5
+			this.stickyOffsetTop = this.offsetTop ? uni.upx2px(this.offsetTop) : 44;
+			// #endif
+			// #ifndef H5
+			this.stickyOffsetTop = this.offsetTop ? uni.upx2px(this.offsetTop) : 0;
+			// #endif
+			// 鍙兘鍦╟reated鐢熷懡鍛ㄦ湡瀹氫箟children锛屽鏋滃湪data瀹氫箟锛屼細鍥犱负寰幆寮曠敤鑰屾姤閿�
+			this.children = [];
+		},
+		data() {
+			return {
+				activeAnchorIndex: 0,
+				showSidebar: true,
+				// children: [],
+				touchmove: false,
+				touchmoveIndex: 0,
+			}
+		},
+		watch: {
+			scrollTop() {
+				this.updateData()
+			}
+		},
+		computed: {
+			// 寮瑰嚭toast鐨剒-index鍊�
+			alertZIndex() {
+				return this.$u.zIndex.toast;
+			}
+		},
+		methods: {
+			updateData() {
+				this.timer && clearTimeout(this.timer);
+				this.timer = setTimeout(() => {
+					this.showSidebar = !!this.children.length;
+					this.setRect().then(() => {
+						this.onScroll();
+					});
+				}, 0);
+			},
+			setRect() {
+				return Promise.all([
+					this.setAnchorsRect(),
+					this.setListRect(),
+					this.setSiderbarRect()
+				]);
+			},
+			setAnchorsRect() {
+				return Promise.all(this.children.map((anchor, index) => anchor
+					.$uGetRect('.u-index-anchor-wrapper')
+					.then((rect) => {
+						Object.assign(anchor, {
+							height: rect.height,
+							top: rect.top
+						});
+					})));
+			},
+			setListRect() {
+				return this.$uGetRect('.u-index-bar').then((rect) => {
+					Object.assign(this, {
+						height: rect.height,
+						top: rect.top + this.scrollTop
+					});
+				});
+			},
+			setSiderbarRect() {
+				return this.$uGetRect('.u-index-bar__sidebar').then(rect => {
+					this.sidebar = {
+						height: rect.height,
+						top: rect.top
+					};
+				});
+			},
+			getActiveAnchorIndex() {
+				const {
+					children
+				} = this;
+				const {
+					sticky
+				} = this;
+				for (let i = this.children.length - 1; i >= 0; i--) {
+					const preAnchorHeight = i > 0 ? children[i - 1].height : 0;
+					const reachTop = sticky ? preAnchorHeight : 0;
+					if (reachTop >= children[i].top) {
+						return i;
+					}
+				}
+				return -1;
+			},
+			onScroll() {
+				const {
+					children = []
+				} = this;
+				if (!children.length) {
+					return;
+				}
+				const {
+					sticky,
+					stickyOffsetTop,
+					zIndex,
+					scrollTop,
+					activeColor
+				} = this;
+				const active = this.getActiveAnchorIndex();
+				this.activeAnchorIndex = active;
+				if (sticky) {
+					let isActiveAnchorSticky = false;
+					if (active !== -1) {
+						isActiveAnchorSticky =
+							children[active].top <= 0;
+					}
+					children.forEach((item, index) => {
+						if (index === active) {
+							let wrapperStyle = '';
+							let anchorStyle = {
+								color: `${activeColor}`
+							};
+							if (isActiveAnchorSticky) {
+								wrapperStyle = {
+									height: `${children[index].height}px`
+								};
+								anchorStyle = {
+									position: 'fixed',
+									top: `${stickyOffsetTop}px`,
+									zIndex: `${zIndex ? zIndex : this.$u.zIndex.indexListSticky}`,
+									color: `${activeColor}`
+								};
+							}
+							item.active = active;
+							item.wrapperStyle = wrapperStyle;
+							item.anchorStyle = anchorStyle;
+						} else if (index === active - 1) {
+							const currentAnchor = children[index];
+							const currentOffsetTop = currentAnchor.top;
+							const targetOffsetTop = index === children.length - 1 ?
+								this.top :
+								children[index + 1].top;
+							const parentOffsetHeight = targetOffsetTop - currentOffsetTop;
+							const translateY = parentOffsetHeight - currentAnchor.height;
+							const anchorStyle = {
+								position: 'relative',
+								transform: `translate3d(0, ${translateY}px, 0)`,
+								zIndex: `${zIndex ? zIndex : this.$u.zIndex.indexListSticky}`,
+								color: `${activeColor}`
+							};
+							item.active = active;
+							item.anchorStyle = anchorStyle;
+						} else {
+							item.active = false;
+							item.anchorStyle = '';
+							item.wrapperStyle = '';
+						}
+					});
+				}
+			},
+			onTouchMove(event) {
+				this.touchmove = true;
+				const sidebarLength = this.children.length;
+				const touch = event.touches[0];
+				const itemHeight = this.sidebar.height / sidebarLength;
+				let clientY = 0;
+				clientY = touch.clientY;
+				let index = Math.floor((clientY - this.sidebar.top) / itemHeight);
+				if (index < 0) {
+					index = 0;
+				} else if (index > sidebarLength - 1) {
+					index = sidebarLength - 1;
+				}
+				this.touchmoveIndex = index;
+				this.scrollToAnchor(index);
+			},
+			onTouchStop() {
+				this.touchmove = false;
+				this.scrollToAnchorIndex = null;
+			},
+			scrollToAnchor(index) {
+				if (this.scrollToAnchorIndex === index) {
+					return;
+				}
+				this.scrollToAnchorIndex = index;
+				const anchor = this.children.find((item) => item.index === this.indexList[index]);
+				if (anchor) {
+					this.$emit('select', anchor.index);
+					uni.pageScrollTo({
+						duration: 0,
+						scrollTop: anchor.top + this.scrollTop
+					});
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-index-bar {
+		position: relative
+	}
+
+	.u-index-bar__sidebar {
+		position: fixed;
+		top: 50%;
+		right: 0;
+		@include vue-flex;
+		flex-direction: column;
+		text-align: center;
+		transform: translateY(-50%);
+		user-select: none;
+		z-index: 99;
+	}
+
+	.u-index-bar__index {
+		font-weight: 500;
+		padding: 8rpx 18rpx;
+		font-size: 22rpx;
+		line-height: 1
+	}
+
+	.u-indexed-list-alert {
+		position: fixed;
+		width: 120rpx;
+		height: 120rpx;
+		right: 90rpx;
+		top: 50%;
+		margin-top: -60rpx;
+		border-radius: 24rpx;
+		font-size: 50rpx;
+		color: #fff;
+		background-color: rgba(0, 0, 0, 0.65);
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+		padding: 0;
+		z-index: 9999999;
+	}
+
+	.u-indexed-list-alert text {
+		line-height: 50rpx;
+	}
+</style>
diff --git a/uview-ui/components/u-input/u-input.vue b/uview-ui/components/u-input/u-input.vue
new file mode 100644
index 0000000..f2aea72
--- /dev/null
+++ b/uview-ui/components/u-input/u-input.vue
@@ -0,0 +1,387 @@
+<template>
+	<view
+		class="u-input"
+		:class="{
+			'u-input--border': border,
+			'u-input--error': validateState
+		}"
+		:style="{
+			padding: `0 ${border ? 20 : 0}rpx`,
+			borderColor: borderColor,
+			textAlign: inputAlign
+		}"
+		@tap.stop="inputClick"
+	>
+		<textarea
+			v-if="type == 'textarea'"
+			class="u-input__input u-input__textarea"
+			:style="[getStyle]"
+			:value="defaultValue"
+			:placeholder="placeholder"
+			:placeholderStyle="placeholderStyle"
+			:disabled="disabled"
+			:maxlength="inputMaxlength"
+			:fixed="fixed"
+			:focus="focus"
+			:autoHeight="autoHeight"
+			:selection-end="uSelectionEnd"
+			:selection-start="uSelectionStart"
+			:cursor-spacing="getCursorSpacing"
+			:show-confirm-bar="showConfirmbar"
+			@input="handleInput"
+			@blur="handleBlur"
+			@focus="onFocus"
+			@confirm="onConfirm"
+		/>
+		<input
+			v-else
+			class="u-input__input"
+			:type="type == 'password' ? 'text' : type"
+			:style="[getStyle]"
+			:value="defaultValue"
+			:password="type == 'password' && !showPassword"
+			:placeholder="placeholder"
+			:placeholderStyle="placeholderStyle"
+			:disabled="disabled || type === 'select'"
+			:maxlength="inputMaxlength"
+			:focus="focus"
+			:confirmType="confirmType"
+			:cursor-spacing="getCursorSpacing"
+			:selection-end="uSelectionEnd"
+			:selection-start="uSelectionStart"
+			:show-confirm-bar="showConfirmbar"
+			@focus="onFocus"
+			@blur="handleBlur"
+			@input="handleInput"
+			@confirm="onConfirm"
+		/>
+		<view class="u-input__right-icon u-flex">
+			<view class="u-input__right-icon__clear u-input__right-icon__item" @tap="onClear" v-if="clearable && value != '' && focused">
+				<u-icon size="32" name="close-circle-fill" color="#c0c4cc"/>
+			</view>
+			<view class="u-input__right-icon__clear u-input__right-icon__item" v-if="passwordIcon && type == 'password'">
+				<u-icon size="32" :name="!showPassword ? 'eye' : 'eye-fill'" color="#c0c4cc" @click="showPassword = !showPassword"/>
+			</view>
+			<view class="u-input__right-icon--select u-input__right-icon__item" v-if="type == 'select'" :class="{
+				'u-input__right-icon--select--reverse': selectOpen
+			}">
+				<u-icon name="arrow-down-fill" size="26" color="#c0c4cc"></u-icon>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import Emitter from '../../libs/util/emitter.js';
+
+/**
+ * input 杈撳叆妗�
+ * @description 姝ょ粍浠朵负涓�涓緭鍏ユ锛岄粯璁ゆ病鏈夎竟妗嗗拰鏍峰紡锛屾槸涓撻棬涓洪厤鍚堣〃鍗曠粍浠秛-form鑰岃璁$殑锛屽埄鐢ㄥ畠鍙互蹇�熷疄鐜拌〃鍗曢獙璇侊紝杈撳叆鍐呭锛屼笅鎷夐�夋嫨绛夊姛鑳姐��
+ * @tutorial http://uviewui.com/components/input.html
+ * @property {String} type 妯″紡閫夋嫨锛岃瀹樼綉璇存槑
+ * @property {Boolean} clearable 鏄惁鏄剧ず鍙充晶鐨勬竻闄ゅ浘鏍�(榛樿true)
+ * @property {} v-model 鐢ㄤ簬鍙屽悜缁戝畾杈撳叆妗嗙殑鍊�
+ * @property {String} input-align 杈撳叆妗嗘枃瀛楃殑瀵归綈鏂瑰紡(榛樿left)
+ * @property {String} placeholder placeholder鏄剧ず鍊�(榛樿 '璇疯緭鍏ュ唴瀹�')
+ * @property {Boolean} disabled 鏄惁绂佺敤杈撳叆妗�(榛樿false)
+ * @property {String Number} maxlength 杈撳叆妗嗙殑鏈�澶у彲杈撳叆闀垮害(榛樿140)
+ * @property {String Number} selection-start 鍏夋爣璧峰浣嶇疆锛岃嚜鍔ㄨ仛鐒︽椂鏈夋晥锛岄渶涓巗election-end鎼厤浣跨敤锛堥粯璁�-1锛�
+ * @property {String Number} maxlength 鍏夋爣缁撴潫浣嶇疆锛岃嚜鍔ㄨ仛鐒︽椂鏈夋晥锛岄渶涓巗election-start鎼厤浣跨敤锛堥粯璁�-1锛�
+ * @property {String Number} cursor-spacing 鎸囧畾鍏夋爣涓庨敭鐩樼殑璺濈锛屽崟浣峱x(榛樿0)
+ * @property {String} placeholderStyle placeholder鐨勬牱寮忥紝瀛楃涓插舰寮忥紝濡�"color: red;"(榛樿 "color: #c0c4cc;")
+ * @property {String} confirm-type 璁剧疆閿洏鍙充笅瑙掓寜閽殑鏂囧瓧锛屼粎鍦╰ype涓簍ext鏃剁敓鏁�(榛樿done)
+ * @property {Object} custom-style 鑷畾涔夎緭鍏ユ鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {Boolean} focus 鏄惁鑷姩鑾峰緱鐒︾偣(榛樿false)
+ * @property {Boolean} fixed 濡傛灉type涓簍extarea锛屼笖鍦ㄤ竴涓�"position:fixed"鐨勫尯鍩燂紝闇�瑕佹寚鏄庝负true(榛樿false)
+ * @property {Boolean} password-icon type涓簆assword鏃讹紝鏄惁鏄剧ず鍙充晶鐨勫瘑鐮佹煡鐪嬪浘鏍�(榛樿true)
+ * @property {Boolean} border 鏄惁鏄剧ず杈规(榛樿false)
+ * @property {String} border-color 杈撳叆妗嗙殑杈规棰滆壊(榛樿#dcdfe6)
+ * @property {Boolean} auto-height 鏄惁鑷姩澧為珮杈撳叆鍖哄煙锛宼ype涓簍extarea鏃舵湁鏁�(榛樿true)
+ * @property {String Number} height 楂樺害锛屽崟浣峳px(text绫诲瀷鏃朵负70锛宼extarea鏃朵负100)
+ * @example <u-input v-model="value" :type="type" :border="border" />
+ */
+export default {
+	name: 'u-input',
+	mixins: [Emitter],
+	props: {
+		value: {
+			type: [String, Number],
+			default: ''
+		},
+		// 杈撳叆妗嗙殑绫诲瀷锛宼extarea锛宼ext锛宯umber
+		type: {
+			type: String,
+			default: 'text'
+		},
+		inputAlign: {
+			type: String,
+			default: 'left'
+		},
+		placeholder: {
+			type: String,
+			default: '璇疯緭鍏ュ唴瀹�'
+		},
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		maxlength: {
+			type: [Number, String],
+			default: 140
+		},
+		placeholderStyle: {
+			type: String,
+			default: 'color: #c0c4cc;'
+		},
+		confirmType: {
+			type: String,
+			default: 'done'
+		},
+		// 杈撳叆妗嗙殑鑷畾涔夋牱寮�
+		customStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 濡傛灉 textarea 鏄湪涓�涓� position:fixed 鐨勫尯鍩燂紝闇�瑕佹樉绀烘寚瀹氬睘鎬� fixed 涓� true
+		fixed: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鑷姩鑾峰緱鐒︾偣
+		focus: {
+			type: Boolean,
+			default: false
+		},
+		// 瀵嗙爜绫诲瀷鏃讹紝鏄惁鏄剧ず鍙充晶鐨勫瘑鐮佸浘鏍�
+		passwordIcon: {
+			type: Boolean,
+			default: true
+		},
+		// input|textarea鏄惁鏄剧ず杈规
+		border: {
+			type: Boolean,
+			default: false
+		},
+		// 杈撳叆妗嗙殑杈规棰滆壊
+		borderColor: {
+			type: String,
+			default: '#dcdfe6'
+		},
+		autoHeight: {
+			type: Boolean,
+			default: true
+		},
+		// type=select鏃讹紝鏃嬭浆鍙充晶鐨勫浘鏍囷紝鏍囪瘑褰撳墠澶勪簬鎵撳紑杩樻槸鍏抽棴select鐨勭姸鎬�
+		// open-鎵撳紑锛宑lose-鍏抽棴
+		selectOpen: {
+			type: Boolean,
+			default: false
+		},
+		// 楂樺害锛屽崟浣峳px
+		height: {
+			type: [Number, String],
+			default: ''
+		},
+		// 鏄惁鍙竻绌�
+		clearable: {
+			type: Boolean,
+			default: true
+		},
+		// 鎸囧畾鍏夋爣涓庨敭鐩樼殑璺濈锛屽崟浣� px
+		cursorSpacing: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鍏夋爣璧峰浣嶇疆锛岃嚜鍔ㄨ仛鐒︽椂鏈夋晥锛岄渶涓巗election-end鎼厤浣跨敤
+		selectionStart: {
+			type: [Number, String],
+			default: -1
+		},
+		// 鍏夋爣缁撴潫浣嶇疆锛岃嚜鍔ㄨ仛鐒︽椂鏈夋晥锛岄渶涓巗election-start鎼厤浣跨敤
+		selectionEnd: {
+			type: [Number, String],
+			default: -1
+		},
+		// 鏄惁鑷姩鍘婚櫎涓ょ鐨勭┖鏍�
+		trim: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず閿洏涓婃柟甯︽湁鈥濆畬鎴愨�滄寜閽偅涓�鏍�
+		showConfirmbar:{
+			type:Boolean,
+			default:true
+		}
+	},
+	data() {
+		return {
+			defaultValue: this.value,
+			inputHeight: 70, // input鐨勯珮搴�
+			textareaHeight: 100, // textarea鐨勯珮搴�
+			validateState: false, // 褰撳墠input鐨勯獙璇佺姸鎬侊紝鐢ㄤ簬閿欒鏃讹紝杈规鏄惁鏀逛负绾㈣壊
+			focused: false, // 褰撳墠鏄惁澶勪簬鑾峰緱鐒︾偣鐨勭姸鎬�
+			showPassword: false, // 鏄惁棰勮瀵嗙爜
+			lastValue: '', // 鐢ㄤ簬澶存潯灏忕▼搴忥紝鍒ゆ柇@input涓紝鍓嶅悗鐨勫�兼槸鍚﹀彂鐢熶簡鍙樺寲锛屽洜涓哄ご鏉′腑鏂囦笅锛屾寜涓嬮敭娌℃湁杈撳叆鍐呭锛屼篃浼氳Е鍙慇input鏃堕棿
+		};
+	},
+	watch: {
+		value(nVal, oVal) {
+			this.defaultValue = nVal;
+			// 褰撳�煎彂鐢熷彉鍖栵紝涓斾负select绫诲瀷鏃�(姝ゆ椂input琚缃负disabled锛屼笉浼氳Е鍙慇input浜嬩欢)锛屾ā鎷熻Е鍙慇input浜嬩欢
+			if(nVal != oVal && this.type == 'select') this.handleInput({
+				detail: {
+					value: nVal
+				}
+			})
+		},
+	},
+	computed: {
+		// 鍥犱负uniapp鐨刬nput缁勪欢鐨刴axlength缁勪欢蹇呴』瑕佹暟鍊硷紝杩欓噷杞负鏁板�硷紝缁欑敤鎴峰彲浠ヤ紶鍏ュ瓧绗︿覆鏁板��
+		inputMaxlength() {
+			return Number(this.maxlength);
+		},
+		getStyle() {
+			let style = {};
+			// 濡傛灉娌℃湁鑷畾涔夐珮搴︼紝灏辨牴鎹畉ype涓篿nput杩樻槸textare鏉ュ垎閰嶄竴涓粯璁ょ殑楂樺害
+			style.minHeight = this.height ? this.height + 'rpx' : this.type == 'textarea' ?
+				this.textareaHeight + 'rpx' : this.inputHeight + 'rpx';
+			style = Object.assign(style, this.customStyle);
+			return style;
+		},
+		//
+		getCursorSpacing() {
+			return Number(this.cursorSpacing);
+		},
+		// 鍏夋爣璧峰浣嶇疆
+		uSelectionStart() {
+			return String(this.selectionStart);
+		},
+		// 鍏夋爣缁撴潫浣嶇疆
+		uSelectionEnd() {
+			return String(this.selectionEnd);
+		}
+	},
+	created() {
+		// 鐩戝惉u-form-item鍙戝嚭鐨勯敊璇簨浠讹紝灏嗚緭鍏ユ杈规鍙樼孩鑹�
+		this.$on('on-form-item-error', this.onFormItemError);
+	},
+	methods: {
+		/**
+		 * change 浜嬩欢
+		 * @param event
+		 */
+		handleInput(event) {
+			let value = event.detail.value;
+			// 鍒ゆ柇鏄惁鍘婚櫎绌烘牸
+			if(this.trim) value = this.$u.trim(value);
+			// vue 鍘熺敓鐨勬柟娉� return 鍑哄幓
+			this.$emit('input', value);
+			// 褰撳墠model 璧嬪��
+			this.defaultValue = value;
+			// 杩囦竴涓敓鍛藉懆鏈熷啀鍙戦�佷簨浠剁粰u-form-item锛屽惁鍒檛his.$emit('input')鏇存柊浜嗙埗缁勪欢鐨勫�硷紝浣嗘槸寰俊灏忕▼搴忎笂
+			// 灏氭湭鏇存柊鍒皍-form-item锛屽鑷磋幏鍙栫殑鍊间负绌猴紝浠庤�屾牎楠屾贩璁�
+			// 杩欓噷涓嶈兘寤舵椂鏃堕棿澶煭锛屾垨鑰呬娇鐢╰his.$nextTick锛屽惁鍒欏湪澶存潯涓婏紝浼氶�犳垚娣蜂贡
+			setTimeout(() => {
+				// 澶存潯灏忕▼搴忕敱浜庤嚜韬玝ug锛屽鑷翠腑鏂囦笅锛屾瘡鎸変笅涓�涓敭(灏氭湭瀹屾垚杈撳叆)锛岄兘浼氳Е鍙戜竴娆input锛屽鑷撮敊璇紝杩欓噷杩涜鍒ゆ柇澶勭悊
+				// #ifdef MP-TOUTIAO
+				if(this.$u.trim(value) == this.lastValue) return ;
+				this.lastValue = value;
+				// #endif
+				// 灏嗗綋鍓嶇殑鍊煎彂閫佸埌 u-form-item 杩涜鏍¢獙
+				this.dispatch('u-form-item', 'on-form-change', value);
+			}, 40)
+		},
+		/**
+		 * blur 浜嬩欢
+		 * @param event
+		 */
+		handleBlur(event) {
+			// 鏈�寮�濮嬩娇鐢ㄧ殑鏄洃鍚浘鏍嘆touchstart浜嬩欢锛岃嚜浠巋x2.8.4鍚庯紝姝ゆ柟娉曞湪寰俊灏忕▼搴忓嚭閿�
+			// 杩欓噷鏀逛负鐩戝惉鐐瑰嚮浜嬩欢锛屾墜鐐瑰嚮娓呴櫎鍥炬爣鏃讹紝鍚屾椂涔熷彂鐢熶簡@blur浜嬩欢锛屽鑷村浘鏍囨秷澶辫�屾棤娉曠偣鍑伙紝杩欓噷鍋氫竴涓欢鏃�
+			setTimeout(() => {
+				this.focused = false;
+			}, 100)
+			// vue 鍘熺敓鐨勬柟娉� return 鍑哄幓
+			this.$emit('blur', event.detail.value);
+			setTimeout(() => {
+				// 澶存潯灏忕▼搴忕敱浜庤嚜韬玝ug锛屽鑷翠腑鏂囦笅锛屾瘡鎸変笅涓�涓敭(灏氭湭瀹屾垚杈撳叆)锛岄兘浼氳Е鍙戜竴娆input锛屽鑷撮敊璇紝杩欓噷杩涜鍒ゆ柇澶勭悊
+				// #ifdef MP-TOUTIAO
+				if(this.$u.trim(value) == this.lastValue) return ;
+				this.lastValue = value;
+				// #endif
+				// 灏嗗綋鍓嶇殑鍊煎彂閫佸埌 u-form-item 杩涜鏍¢獙
+				this.dispatch('u-form-item', 'on-form-blur', event.detail.value);
+			}, 40)
+		},
+		onFormItemError(status) {
+			this.validateState = status;
+		},
+		onFocus(event) {
+			this.focused = true;
+			this.$emit('focus');
+		},
+		onConfirm(e) {
+			this.$emit('confirm', e.detail.value);
+		},
+		onClear(event) {
+			this.$emit('input', '');
+		},
+		inputClick() {
+			this.$emit('click');
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-input {
+	position: relative;
+	flex: 1;
+	@include vue-flex;
+
+	&__input {
+		//height: $u-form-item-height;
+		font-size: 28rpx;
+		color: $u-main-color;
+		flex: 1;
+	}
+
+	&__textarea {
+		width: auto;
+		font-size: 28rpx;
+		color: $u-main-color;
+		padding: 10rpx 0;
+		line-height: normal;
+		flex: 1;
+	}
+
+	&--border {
+		border-radius: 6rpx;
+		border-radius: 4px;
+		border: 1px solid $u-form-item-border-color;
+	}
+
+	&--error {
+		border-color: $u-type-error!important;
+	}
+
+	&__right-icon {
+
+		&__item {
+			margin-left: 10rpx;
+		}
+
+		&--select {
+			transition: transform .4s;
+
+			&--reverse {
+				transform: rotate(-180deg);
+			}
+		}
+	}
+}
+</style>
diff --git a/uview-ui/components/u-keyboard/u-keyboard.vue b/uview-ui/components/u-keyboard/u-keyboard.vue
new file mode 100644
index 0000000..1904a2b
--- /dev/null
+++ b/uview-ui/components/u-keyboard/u-keyboard.vue
@@ -0,0 +1,217 @@
+<template>
+	<u-popup class="" :mask="mask" :maskCloseAble="maskCloseAble" mode="bottom" :popup="false" v-model="value" length="auto"
+	 :safeAreaInsetBottom="safeAreaInsetBottom" @close="popupClose" :zIndex="uZIndex">
+		<slot />
+		<view class="u-tooltip" v-if="tooltip">
+			<view class="u-tooltip-item u-tooltip-cancel" hover-class="u-tooltip-cancel-hover" @tap="onCancel">
+				{{cancelBtn ? cancelText : ''}}
+			</view>
+			<view v-if="showTips" class="u-tooltip-item u-tooltip-tips">
+				{{tips ? tips : mode == 'number' ? '鏁板瓧閿洏' : mode == 'card' ? '韬唤璇侀敭鐩�' : '杞︾墝鍙烽敭鐩�'}}
+			</view>
+			<view v-if="confirmBtn" @tap="onConfirm" class="u-tooltip-item u-tooltips-submit" hover-class="u-tooltips-submit-hover">
+				{{confirmBtn ? confirmText : ''}}
+			</view>
+		</view>
+		<block v-if="mode == 'number' || mode == 'card'">
+			<u-number-keyboard :random="random" @backspace="backspace" @change="change" :mode="mode" :dotEnabled="dotEnabled"></u-number-keyboard>
+		</block>
+		<block v-else>
+			<u-car-keyboard :random="random" @backspace="backspace" @change="change"></u-car-keyboard>
+		</block>
+	</u-popup>
+</template>
+
+<script>
+	/**
+	 * keyboard 閿洏
+	 * @description 姝や负uViw鑷畾涔夌殑閿洏闈㈡澘锛屽唴鍚簡鏁板瓧閿洏锛岃溅鐗屽彿閿紝韬唤璇佸彿閿洏3涓ā寮忥紝閮芥湁鍙互鎵撲贡鎸夐敭椤哄簭鐨勯�夐」銆�
+	 * @tutorial https://www.uviewui.com/components/keyboard.html
+	 * @property {String} mode 閿洏绫诲瀷锛岃瀹樼綉鍩烘湰浣跨敤鐨勮鏄庯紙榛樿number锛�
+	 * @property {Boolean} dot-enabled 鏄惁鏄剧ず"."鎸夐敭锛屽彧鍦╩ode=number鏃舵湁鏁堬紙榛樿true锛�
+	 * @property {Boolean} tooltip 鏄惁鏄剧ず閿洏椤堕儴宸ュ叿鏉★紙榛樿true锛�
+	 * @property {String} tips 宸ュ叿鏉′腑闂寸殑鎻愮ず鏂囧瓧锛岃涓婃柟鍩烘湰浣跨敤鐨勮鏄庯紝濡備笉闇�瑕侊紝璇蜂紶""绌哄瓧绗�
+	 * @property {Boolean} cancel-btn 鏄惁鏄剧ず宸ュ叿鏉″乏杈圭殑"鍙栨秷"鎸夐挳锛堥粯璁rue锛�
+	 * @property {Boolean} confirm-btn 鏄惁鏄剧ず宸ュ叿鏉″彸杈圭殑"瀹屾垚"鎸夐挳锛堥粯璁rue锛�
+	 * @property {Boolean} mask 鏄惁鏄剧ず閬僵锛堥粯璁rue锛�
+	 * @property {String} confirm-text 纭鎸夐挳鐨勬枃瀛�
+	 * @property {String} cancel-text 鍙栨秷鎸夐挳鐨勬枃瀛�
+	 * @property {Number String} z-index 寮瑰嚭閿洏鐨剒-index鍊硷紙榛樿1075锛�
+	 * @property {Boolean} random 鏄惁鎵撲贡閿洏鎸夐敭鐨勯『搴忥紙榛樿false锛�
+	 * @property {Boolean} safe-area-inset-bottom 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛堥粯璁alse锛�
+	 * @property {Boolean} mask-close-able 鏄惁鍏佽鐐瑰嚮閬僵鏀惰捣閿洏锛堥粯璁rue锛�
+	 * @event {Function} change 鎸夐敭琚偣鍑�(涓嶅寘鍚��鏍奸敭琚偣鍑�)
+	 * @event {Function} cancel 閿洏椤堕儴宸ュ叿鏉″乏杈圭殑"鍙栨秷"鎸夐挳琚偣鍑�
+	 * @event {Function} confirm 閿洏椤堕儴宸ュ叿鏉″彸杈圭殑"瀹屾垚"鎸夐挳琚偣鍑�
+	 * @event {Function} backspace 閿洏閫�鏍奸敭琚偣鍑�
+	 * @example <u-keyboard mode="number" v-model="show"></u-keyboard> 
+	 */
+	export default {
+		name: "u-keyboard",
+		props: {
+			// 閿洏鐨勭被鍨嬶紝number-鏁板瓧閿洏锛宑ard-韬唤璇侀敭鐩橈紝car-杞︾墝鍙烽敭鐩�
+			mode: {
+				type: String,
+				default: 'number'
+			},
+			// 鏄惁鏄剧ず閿洏鐨�"."绗﹀彿
+			dotEnabled: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鏄剧ず椤堕儴宸ュ叿鏉�
+			tooltip: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鏄剧ず宸ュ叿鏉′腑闂寸殑鎻愮ず
+			showTips: {
+				type: Boolean,
+				default: true
+			},
+			// 宸ュ叿鏉′腑闂寸殑鎻愮ず鏂囧瓧
+			tips: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず宸ュ叿鏉″乏杈圭殑"鍙栨秷"鎸夐挳
+			cancelBtn: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鏄剧ず宸ュ叿鏉″彸杈圭殑"瀹屾垚"鎸夐挳
+			confirmBtn: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鎵撲贡閿洏鎸夐敭鐨勯『搴�
+			random: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛屽紑鍚殑璇濓紝浼氬湪iPhoneX鏈哄瀷搴曢儴娣诲姞涓�瀹氱殑鍐呰竟璺�
+			safeAreaInsetBottom: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴閿洏
+			maskCloseAble: {
+				type: Boolean,
+				default: true
+			},
+			// 閫氳繃鍙屽悜缁戝畾鎺у埗閿洏鐨勫脊鍑轰笌鏀惰捣
+			value: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鏄剧ず閬僵锛屾煇浜涙椂鍊欐暟瀛楅敭鐩樻椂锛岀敤鎴峰笇鏈涚湅鍒拌嚜宸辩殑鏁板�硷紝鎵�浠ュ彲鑳戒笉鎯宠閬僵
+			mask: {
+				type: Boolean,
+				default: true
+			},
+			// z-index鍊�
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鍙栨秷鎸夐挳鐨勬枃瀛�
+			cancelText: {
+				type: String,
+				default: '鍙栨秷'
+			},
+			// 纭鎸夐挳鐨勬枃瀛�
+			confirmText: {
+				type: String,
+				default: '纭'
+			}
+		},
+		data() {
+			return {
+				//show: false
+			}
+		},
+		computed: {
+			uZIndex() {
+				return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+			}
+		},
+		methods: {
+			change(e) {
+				this.$emit('change', e);
+			},
+			// 閿洏鍏抽棴
+			popupClose() {
+				// 閫氳繃鍙戦�乮nput杩欎釜鐗规畩鐨勪簨浠跺悕锛屽彲浠ヤ慨鏀圭埗缁勪欢浼犵粰props鐨剉alue鐨勫彉閲忥紝涔熷嵆鍙屽悜缁戝畾
+				this.$emit('input', false);
+			},
+			// 杈撳叆瀹屾垚
+			onConfirm() {
+				this.popupClose();
+				this.$emit('confirm');
+			},
+			// 鍙栨秷杈撳叆
+			onCancel() {
+				this.popupClose();
+				this.$emit('cancel');
+			},
+			// 閫�鏍奸敭
+			backspace() {
+				this.$emit('backspace');
+			},
+			// 鍏抽棴閿洏
+			// close() {
+			// 	this.show = false;
+			// },
+			// // 鎵撳紑閿洏
+			// open() {
+			// 	this.show = true;
+			// }
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-keyboard {
+		position: relative;
+		z-index: 1003;
+	}
+
+	.u-tooltip {
+		@include vue-flex;
+		justify-content: space-between;
+	}
+
+	.u-tooltip-item {
+		color: #333333;
+		flex: 0 0 33.333333%;
+		text-align: center;
+		padding: 20rpx 10rpx;
+		font-size: 28rpx;
+	}
+
+	.u-tooltips-submit {
+		text-align: right;
+		flex-grow: 1;
+		flex-wrap: 0;
+		padding-right: 40rpx;
+		color: $u-type-primary;
+	}
+
+	.u-tooltip-cancel {
+		text-align: left;
+		flex-grow: 1;
+		flex-wrap: 0;
+		padding-left: 40rpx;
+		color: #888888;
+	}
+
+	.u-tooltips-submit-hover {
+		color: $u-type-success;
+	}
+
+	.u-tooltip-cancel-hover {
+		color: #333333;
+	}
+</style>
diff --git a/uview-ui/components/u-lazy-load/u-lazy-load.vue b/uview-ui/components/u-lazy-load/u-lazy-load.vue
new file mode 100644
index 0000000..429a680
--- /dev/null
+++ b/uview-ui/components/u-lazy-load/u-lazy-load.vue
@@ -0,0 +1,244 @@
+<template>
+	<view class="u-wrap" :style="{
+			  opacity: Number(opacity),
+			  borderRadius: borderRadius + 'rpx',
+			  // 鍥犱负time鍊奸渶瑕佹敼鍙�,鎵�浠ヤ笉鐩存帴鐢╠uration鍊�(涓嶈兘鏀瑰彉鐖剁粍浠秔rop浼犺繃鏉ョ殑鍊�)
+			  transition: `opacity ${time / 1000}s ease-in-out`
+		   }"
+	 :class="'u-lazy-item-' + elIndex">
+		<view :class="'u-lazy-item-' + elIndex">
+			<image :style="{borderRadius: borderRadius + 'rpx', height: imgHeight}" v-if="!isError" class="u-lazy-item"
+			 :src="isShow ? image : loadingImg" :mode="imgMode" @load="imgLoaded" @error="loadError" @tap="clickImg"></image>
+			<image :style="{borderRadius: borderRadius + 'rpx', height: imgHeight}" class="u-lazy-item error" v-else :src="errorImg"
+			 :mode="imgMode" @load="errorImgLoaded" @tap="clickImg"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * lazyLoad 鎳掑姞杞�
+	 * @description 鎳掑姞杞戒娇鐢ㄧ殑鍦烘櫙涓猴細椤甸潰鏈夊緢澶氬浘鐗囨椂锛孉PP浼氬悓鏃跺姞杞芥墍鏈夌殑鍥剧墖锛屽鑷撮〉闈㈠崱椤匡紝鍚勪釜浣嶇疆鐨勫浘鐗囧嚭鐜板墠鍚庝笉涓�鑷寸瓑.
+	 * @tutorial https://www.uviewui.com/components/lazyLoad.html
+	 * @property {String Number} index 鐢ㄦ埛鑷畾涔夊�硷紝鍦ㄤ簨浠惰Е鍙戞椂鍥炶皟锛岀敤浠ュ尯鍒嗘槸鍝釜鍥剧墖
+	 * @property {String} image 鍥剧墖璺緞
+	 * @property {String} loading-img 棰勫姞杞芥椂鐨勫崰浣嶅浘
+	 * @property {String} error-img 鍥剧墖鍔犺浇鍑洪敊鏃剁殑鍗犱綅鍥�
+	 * @property {String} threshold 瑙﹀彂鍔犺浇鏃剁殑浣嶇疆锛岃涓婃柟璇存槑锛屽崟浣� rpx锛堥粯璁�300锛�
+	 * @property {String Number} duration 鍥剧墖鍔犺浇鎴愬姛鏃讹紝娣″叆娣″嚭鏃堕棿锛屽崟浣峬s锛堥粯璁わ級
+	 * @property {String} effect 鍥剧墖鍔犺浇鎴愬姛鏃讹紝娣″叆娣″嚭鐨刢ss鍔ㄧ敾鏁堟灉锛堥粯璁ase-in-out锛�
+	 * @property {Boolean} is-effect 鍥剧墖鍔犺浇鎴愬姛鏃讹紝鏄惁鍚敤娣″叆娣″嚭鏁堟灉锛堥粯璁rue锛�
+	 * @property {String Number} border-radius 鍥剧墖鍦嗚鍊硷紝鍗曚綅rpx锛堥粯璁�0锛�
+	 * @property {String Number} height 鍥剧墖楂樺害锛屾敞鎰忥細瀹為檯楂樺害鍙兘鍙梚mg-mode鍙傛暟褰卞搷锛堥粯璁�450锛�
+	 * @property {String Number} mg-mode 鍥剧墖鐨勮鍓ā寮忥紝璇﹁image缁勪欢瑁佸壀妯″紡锛堥粯璁idthFix锛�
+	 * @event {Function} click 鐐瑰嚮鍥剧墖鏃惰Е鍙�
+	 * @event {Function} load 鍥剧墖鍔犺浇鎴愬姛鏃惰Е鍙�
+	 * @event {Function} error 鍥剧墖鍔犺浇澶辫触鏃惰Е鍙�
+	 * @example <u-lazy-load :image="image" :loading-img="loadingImg" :error-img="errorImg"></u-lazy-load>
+	 */
+	export default {
+		name: 'u-lazy-load',
+		props: {
+			index: {
+				type: [Number, String]
+			},
+			// 瑕佹樉绀虹殑鍥剧墖
+			image: {
+				type: String,
+				default: ''
+			},
+			// 鍥剧墖瑁佸壀妯″紡
+			imgMode: {
+				type: String,
+				default: 'widthFix'
+			},
+			// 鍗犱綅鍥剧墖璺緞
+			loadingImg: {
+				type: String,
+				default: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM0QjNBQjkyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM0QjNBQkEyQUQ2MTFFQTlCNUQ4RTIzNDE5RUIxNjciPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzRCM0FCNzJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzRCM0FCODJBRDYxMUVBOUI1RDhFMjM0MTlFQjE2NyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PtRHfPcAAAAzUExURZWVldfX18PDw62trZubm9zc3Li4uKGhoebm5tLS0uHh4c3Nzaenp729vcjIyLKysuvr6141L40AAAcXSURBVHja7NzZlqpGAEBR5lG0//9rIw7IJKJi4or7PGTdtN10wr5SVAEGf/qqArsAiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAIiIAAERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAgAgJEQIAICBABERAg+nmQFMi5Jis+sIniED23jSzIgLTtg2D//iYme/8QBM/9lQ+CAEhbNLM3N9hEHAThX7GPCiBfAxK1b51kD+R7QMLjXg7iCsgWIPUh7pfVozG791oeBPngm48G583uW5GkBvI+SBaM2xXDn1oqum423bX/mgF5FySc2cv93Voug9TdZotsggnkBZB2NzbhrSY5HnoG07jei8dvzsJB/c3W60SALILE46+WCztsbhPR7R2VJq0ukEcT49nyy8QhaKcRa3fYHZD4+ufqOJAcgDz8/59vtw1I3QP5K6JsOG0vm3hce4I8LQp/BaRZGJC3AAn7IKOKXbC+7EdA5vdmmVwOLksgRThqOqiH4XEGsht+peoPUE8U/jJIO5OLH4GEwUslV5G0PTBG5Uiw/Y2jyigO3l9HAHKv9PYb82LloH74dZBoBUgar+l48NsNvtD0fkez9iwrAvIYZDRCl+Xs149Hm/KZmQ+QjUCiO1ei4ru7EsgnQYrkznlQb7thCuRfAzlOAPN72427P4VA/i2Q/DKT/Ls/VR8fvIBsDZIuz7TPF6TCbnk4GJkB2RokejTjuE7/unlgCuSTIO0Cy+Plp6vDfnQlBchy8QtjSHVd3EgmK1bHLm+H6+nXYbz2DuQRSPnqoL7vvq0u70on4zvxgCyWD3b9UyDVdW24PaWaiGTnFZJwPIQAebDpIKheBIm7n124ZthMJipAlkqHO+IZkP1tbfzOJark/A7MgKyvvl60fRqkvXfhuow+t9+q00+0/yyBrK8ZngOtBzldhw2X9tvpNGty0gvkmbPeJ0Cy/r09s/stbmfo0yMWkEdjevgKyOn2t2pxv7UXoibTdCDLje9/Ww1ymqzn87dbp92242ZmMRjI8hASvwKSLq4udqN6ksw8nxXN3tszD9L8Gkg+2mFrQYql5az4tvFj5xOx4VwnSdeBtGdyPwUytxK77pBVlNHdO7OK3rh/eTPUvdutT3fO52tuHMqD4N7llv8pyOQQ//w19YVDfX27+Sfuby9/6nau4pdA8vEdOZuChEH/quHt0Jg+IRJ/5+PrHwKZXfjbDiS73Zo7mu5UkzX7uTsXe0e/7nC3ePf1O69+BUg2XDfZCqSqOu7rGVf8cHBe8zhC2b61dtUHXv0OkGo6ZL4JkpbRYXdUaFevivx2M/1GIOctNh949TtAoumQ+TpIHMX54CJu+8BDd8FkE5BqcZh/59XvAClmTvKfB0nDqIlHo3T70SftyW1eX9dXtgQJqs1f/Q6QaOa/7wmQKtxH8eiGoCRuovODIO3VxOMmruZbHrLyD7z6DSDtGyT7ew1kf9hNn07c986JTovzzem0Id9wUG+Vk/IDr34DSNR7huZJkMFT6vEhqrPx/j5cnlZML8N6/PAzh9Y99Flm5Yde/c9BquDOkvkKkMP58dA4qi9vivE8JOvGz/j8FokfPpr288+pH2ZPOZrLmeGD+7KOh6dqYWJ48ki7yUg0tz0go/fv/LLddfV3sgOLJyaGPY/zrSlh1a36Arkzoue9CyG35ze6E6/dzO2Ga0EGHqdRJIkfn9/8OEjTW8Vq91ZWh39FeehWA7Nu9ft8CpUEk1WWOyDF0OPyEU2Pnzf/bZC0P6IPzmAvu7KauQBVrgKpJ0tG2arHzX8e5Pb3PezNs/PrX+3JMyCLn9XXf37tPFHvt09WfCDDjx+yyn1/p1V11j7GnB/q3leLuVva79S/tzed+db08YpF4uOZtmz/9oXWMq6BCAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAERECACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiACAgQAQEiIEAEBIiAALELvqt/BBgACqVeUBXxcCkAAAAASUVORK5CYII='
+			},
+			// 鍔犺浇澶辫触鐨勯敊璇崰浣嶅浘
+			errorImg: {
+				type: String,
+				default: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAGQCAMAAAC3Ycb+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6ODdDMjhENDYyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ODdDMjhENDcyQUQ2MTFFQTlDQ0VBODgxQjFFOEEyMEMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4N0MyOEQ0NDJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4N0MyOEQ0NTJBRDYxMUVBOUNDRUE4ODFCMUU4QTIwQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PhLwhikAAAAzUExURZWVldfX162trcPDw5ubm7i4uNzc3Obm5s3NzaGhoeHh4cjIyKenp9LS0r29vbKysuvr67sDMEkAAAlpSURBVHja7NzpYqMgAIVRUVHc8/5PO66R1WAbOzX97q+ZtDEpR0AWTR7kVyWhCAAhgABCAAGEAAIIAQQQAggBBBACCCAEEEAIIIAQQAgggBBAACGAAEIAAYQAQgABhAACCAEEEAIIIAQQAgggBBBACCCAEEAAIYAQQAAhgABCAAGEAAIIAYQAAggBBBACCCAEEEAIIAQQQAgggBBAACGAAEIAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAAIYAQQAAhgABCAAGEAAIIAYQAAggBBBACCCAEEEAIIAQQQAgggBBAACGAAEIAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAIIIAQQAAhgABCAAGEAEIAAYQAAggBBBACCCAEEAIIIAQQQAgggBBAACGAEEAAIYAAsqeX5QWHKIcs/Ptl03lfL4zDFPWfBGmSpPn+IZzSH5KkCL5B+n+oklwz6Iz//R2QzFOabzhEmiRirAmZt/bl0w/dpMbLqeeo4wEdpC7zR5WAPKziHKtO7ql+ReKvIa9BxgNaL5ZtEkpeAGIVp5jKJa09xVo9vgSSzQcszdYvmOqjQNSQ6pHK6rO1n1Xj32788miwHLaZz1Tl9i/yayDlYJ/60/+lp8GSY7OY1B8E4p55bWmfquFk22GLuUUxi78cX+m+BjL2GLkhMrV+/muS6Sfic0CEp5T1Yu2OQdTzsKV0MJV73KVjroyTffxfuv5Tf3fd6iLT9wz8YdVHgUzF2Is9/Xhi5sYJqP1w/GUpjOiHVbaI0w2L+pg3GZzvtokcgHxWDXHaiy78l3sPke01qphamT5c+dqyeAGSumdL/mkggauTam0e3L/mPEiqtzKDbl0Z1Wn8xOa4ySo8X/7TQIJnY/seEKWf12UmC72CKP9xYjr19RPT7NNA+oMO+R0gwmlotAry+C6I0f59ch8yXVQOr0BKYcXt1IUYRyCt+Ur9HGsrQKI79WY9sY9ARPKlzFOFdb41ioD8b5Bp+mqeeRKAxINkESBFGpOpKhgv9OuYpH8A8l4Qa3qp60Kl2/k+rG2sWafuuyCBafb2j4JkgZUob3nWcmicpkxEgmTLLGejTxnWSWCi8lPmsk6DlIHFJv24ojiYyYoGacwL8zXTLEAVaDI/Ybb3NIgKDSv2oXpmHkvNs+PTpMASEdlk7fOZeRk37fwJ6yGnQarQsGIfqqcvx43rTOXY6jf7uKXdRzdLDRPbjIrx1cIj3Kr4KyBFezzgUGuR5893qkOQ19fR2uVBaU+r16LphJNOiatK7PeBZK/Kb+tUn71rcQjSvARpghfH/yG/D2RetTuI3N5QrMWdP46brP7FmKZ//CGQ9At9SL01DLkzY/Vs8Z97fQZ7gelw7jHqCz+/Wile5J4g3Vc79eb5a6oLSue+Ve83gaSv2jp5PxCzjzwFUm9zw9MllSMil1kS4d2E9SaQ1xNo9wMxx0+nQNLnew/WDHvveMAHYm08mofl3TFI/8pD3Q6kMAv6DIi2jTCwRJUvNdDYrrJum9oHhusCbWALonwxBRk1vXMnEGWuT5wAmfYuVGUYpJ7fUZujCN92hvzwWlrFgxSfANKb10DxIMbShnfrynyZZV30imA7P43ArXXHbvBVkTCIuGy25AdBrHmNeBCpL214QdLp9LZarG3IMWrmW0ehtuO7F2PS09UcgqS3B7FKPhpknrStD0HGF/vQRne37LwLG8EbHT4WxN7/Fg0yD9Yr/3br4nnstA+0Il6QxzdBmg8A6a2/IRbkcK9h/uzV8zywF/oSkOyageCPglRWgcWClHnEzs9q/t/SENVXgFijlsq3VtXdCsRp4qObrLLLgjuzSq3fX89ZZW6AfxNIzF6X9FYgThN/fk093KkvHX/hbWd+DqS/FUhlf+G3gohEXzVs3g9iDluWoaW8fL73QhB34u+tIHIf19nLuF4Q98a09Eynnl56q+ePgEhnX+dbQOp6H5XnJ0ACd8dFgkwf12nTOTcEqd2pom+CFF02TIPw6dKmrLS5qOtBpo8b5quUtrwrSGbuqPkeSJqllTFHO02NPxdMrm+y5LKdWyWXjw4vA5nGEtnjuyCFyHqNYvEolzmASm3zK1Eg5zr13lhqV1tlksnVw8Pkwgri7O07AVKLJkutRYw87bPlRpBpNXE8xGb+fhBlvEGrGPLqViu5sILIx9dAmqF1705sxF4M8+R8P5dOdQwi12fMnATpjJ2JSt/POIvU9wPJEs/jduJAjLvU0yFT0i64Yb1bsVi79dA4pEy3TzoHMq2O7Re4vXm5O9+l290NpE4CU+YRIMNye2iaqbVS2AUnn2fsekthYKReVNutVedA5juttyIXrT38mOds+ps9DWhwL7GWc61/DVKPzVN9UHDarf1icU98IOU8tm6L031Iq63t1tKzj3fe/FCpO4F0/i0Z2+yvA1KeGBjqj1qYx8/zoxpKZ1Yl367I1k+sfcft/QPy9csXy/32qX1qLZsrryG5BGQaRj0vc/b7N54XXq293TCLB5HO42Fy517obW19b+qjl3CHp0fdLJcWvmdy1etESi/uAdJrs1hTaUklHuW8qSDdC3UfXVR5cnD3rAFSSqtFb7z7eapErx7rC739jCXfbK3aWiipjXo8UbmxXPa7QQq9R289j2Gr88N7Ag5AlHPRKc37pNZv0CZtX1tVMG6rm8qW1/KlCgQvcMss933ybwXZz3dReW5yce4ByZtHFIhwT9kmjxg8BzbKDUe1PB9edBJqSN7/KM1LmqyuMZ5BpeTUw1aD/uDI0relPfSHa/Wn8Pxq1BNfxy/h3IdwOJqIKumb9CHvTqMefyY82RoQAgggBBBACCCAEEAAIYAQQAAhgABCAAGEAAIIAYQAAggBBBACCCAEEEAIIAQQQAgggBBAACGAAEIAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAIIIAQQAAhgABCAAGEAEIAAYQAAggBBBACCCAEEAIIIAQQQAgggBBAACGAEEAAIYAAQgABhAACCAEEEAIIAQQQAgggBBBACCCAEEAIIIAQQAAhgABCAAGEAEIAAYQAAggBBBACCCAEEAIIIAQQQAgggBBAACGAEEAAIYAAQgABhAACCAGEAAIIAQQQAgggBBBACCAEEEAIIIAQQAAhgABCACGAAEIAAYQAAggBBBACCAEEEAIIIAQQQAggfyL/BBgA8PgLdH0TBtkAAAAASUVORK5CYII='
+			},
+			// 鍥剧墖杩涘叆鍙鍖哄煙鍓嶅灏戝儚绱犳椂锛屽崟浣峳px锛屽紑濮嬪姞杞藉浘鐗�
+			// 璐熸暟涓哄浘鐗囪秴鍑哄睆骞曞簳閮ㄥ灏戣窛绂诲悗瑙﹀彂鎳掑姞杞斤紝姝f暟涓哄浘鐗囬《閮ㄨ窛绂诲睆骞曞簳閮ㄥ灏戣窛绂绘椂瑙﹀彂(鍥剧墖杩樻病鍑虹幇鍦ㄥ睆骞曚笂)
+			threshold: {
+				type: [Number, String],
+				default: 100
+			},
+			// 娣″叆娣″嚭鍔ㄧ敾鐨勮繃娓℃椂闂�
+			duration: {
+				type: [Number, String],
+				default: 500
+			},
+			// 娓℃晥鏋滅殑閫熷害鏇茬嚎锛屽悇涓箣闂村樊鍒笉澶э紝鍥犱负杩欐槸娣″叆娣″嚭锛屼笖鏃堕棿寰堢煭锛屼笉鏄偅浜涘彉褰㈡垨鑰呯Щ鍔ㄧ殑鎯呭喌锛屼細鏄庢樉
+			// linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);
+			effect: {
+				type: String,
+				default: 'ease-in-out'
+			},
+			// 鏄惁浣跨敤杩囨浮鏁堟灉
+			isEffect: {
+				type: Boolean,
+				default: true
+			},
+			// 鍦嗚鍊�
+			borderRadius: {
+				type: [Number, String],
+				default: 0
+			},
+			// 鍥剧墖楂樺害锛屽崟浣峳px
+			height: {
+				type: [Number, String],
+				default: '450'
+			}
+		},
+		data() {
+			return {
+				isShow: false,
+				opacity: 1,
+				time: this.duration,
+				loadStatus: '', // 榛樿鏄噿鍔犺浇涓殑鐘舵��
+				isError: false, // 鍥剧墖鍔犺浇澶辫触
+				elIndex: this.$u.guid()
+			}
+		},
+		computed: {
+			// 灏唗hreshold浠巖px杞负px
+			getThreshold() {
+				// 鍏堝彇缁濆鍊硷紝鍥犱负threshold鍙兘鏄礋鏁帮紝鏈�鍚庢牴鎹畉his.threshold鏄鏁版垨鑰呰礋鏁帮紝閲嶆柊杩樺師
+				let thresholdPx = uni.upx2px(Math.abs(this.threshold));
+				return this.threshold < 0 ? -thresholdPx : thresholdPx;
+			},
+			// 璁$畻鍥剧墖鐨勯珮搴︼紝鍙兘涓篴uto锛屽甫%锛屾垨鑰呯洿鎺ユ暟鍊�
+			imgHeight() {
+				return this.$u.addUnit(this.height);
+			}
+		},
+		created() {
+			// 鐢变簬涓�浜涚壒娈婂師鍥狅紝涓嶈兘灏嗘鍙橀噺鏀惧埌data涓畾涔�
+			this.observer = {};
+		},
+		watch: {
+			isShow(nVal) {
+				// 濡傛灉鏄笉寮�鍚繃娓℃晥鏋滐紝鐩存帴杩斿洖
+				if (!this.isEffect) return;
+				this.time = 0;
+				// 鍘熸潵opacity涓�1(涓嶉�忔槑锛屾槸涓轰簡鏄剧ず鍗犱綅鍥�)锛屾敼鎴�0(閫忔槑锛屾剰鍛崇潃璇ュ厓绱犳樉绀虹殑鏄儗鏅鑹诧紝榛樿鐨勭櫧鑹�)锛屽啀鏀规垚1锛屾槸涓轰簡鑾峰緱杩囨浮鏁堟灉
+				this.opacity = 0;
+				// 寤舵椂30ms锛屽惁鍒欏湪娴忚鍣℉5锛岃繃娓℃晥鏋滄棤鏁�
+				setTimeout(() => {
+					this.time = this.duration;
+					this.opacity = 1;
+				}, 30)
+			},
+			// 鍥剧墖璺緞鍙戠敓鍙樺寲鏃讹紝闇�瑕侀噸鏂版爣璁颁竴浜涘彉閲忥紝鍚﹀垯浼氫竴鐩村崱鍦ㄦ煇涓�涓姸鎬侊紝姣斿isError
+			image(n) {
+				if(!n) {
+					// 濡傛灉浼犲叆null鎴栬��''锛屾垨鑰卽ndefined锛屾爣璁颁负閿欒鐘舵��
+					this.isError = true;
+				} else {
+					this.init();
+					this.isError = false;
+				}
+			}
+		},
+		methods: {
+			// 鐢ㄤ簬閲嶆柊鍒濆鍖�
+			init() {
+				this.isError = false;
+				this.loadStatus = '';
+			},
+			// 鐐瑰嚮鍥剧墖瑙﹀彂鐨勪簨浠�,loadlazy-杩樻槸鎳掑姞杞戒腑鐘舵�侊紝loading-鍥剧墖姝e湪鍔犺浇锛宭oaded-鍥剧墖鍔犲姞杞藉畬鎴�
+			clickImg() {
+				let whichImg = '';
+				// 濡傛灉isShow涓篺alse锛屾剰鍛崇潃鍥剧墖杩樻病寮�濮嬪姞杞斤紝鐐瑰嚮鐨勫彧鑳芥槸鏈�寮�濮嬬殑鍗犱綅鍥�
+				if (this.isShow == false) whichImg = 'lazyImg';
+				// 濡傛灉isError涓簍rue锛屾剰鍛崇潃鍥剧墖鍔犺浇澶辫触锛岃繖鏄彧鍓╀笅閿欒鐨勫崰浣嶅浘锛屾墍浠ョ偣鍑荤殑鍙兘鏄敊璇崰浣嶅浘
+				// 褰撶劧锛屼篃鍙互缁欓敊璇殑鍗犱綅鍥惧厓绱犵粦瀹氱偣鍑讳簨浠讹紝鐪嬩綘鍠滄~
+				else if (this.isError == true) whichImg = 'errorImg';
+				// 鎬诲叡涓夊紶鍥剧墖锛岄櫎浜嗕袱涓崰浣嶅浘锛屽墿涓嬬殑鍙兘鏄甯哥殑閭e紶鍥剧墖浜�
+				else whichImg = 'realImg';
+				// 鍙�氱煡褰撳墠鍥剧墖鐨刬ndex
+				this.$emit('click', this.index);
+			},
+			// 鍥剧墖鍔犺浇瀹屾垚浜嬩欢锛屽彲鑳芥槸鍔犺浇鍗犱綅鍥炬椂瑙﹀彂锛屼篃鍙兘鏄姞杞界湡姝g殑鍥剧墖瀹屾垚鏃惰Е鍙戯紝閫氳繃isShow鍖哄垎
+			imgLoaded() {
+				// 鍗犱綅鍥惧姞杞藉畬鎴�
+				if (this.loadStatus == '') {
+					this.loadStatus = 'lazyed';
+				}
+				// 鐪熸鐨勫浘鐗囧姞杞藉畬鎴� 
+				else if (this.loadStatus == 'lazyed') {
+					this.loadStatus = 'loaded';
+					this.$emit('load', this.index);
+				}
+			},
+			// 閿欒鐨勫浘鐗囧姞杞藉畬鎴�
+			errorImgLoaded() {
+				this.$emit('error', this.index);
+			},
+			// 鍥剧墖鍔犺浇澶辫触
+			loadError() {
+				this.isError = true;
+			},
+			disconnectObserver(observerName) {
+				const observer = this[observerName];
+				observer && observer.disconnect();
+			},
+		},
+		beforeDestroy() {
+			// 閿�姣侀〉闈㈡椂锛屽彲鑳借繕娌¤Е鍙戞煇寮犲緢搴曢儴鐨勬噿鍔犺浇鍥剧墖锛屾墍浠ユ妸杩欎釜浜嬩欢缁欏幓鎺�
+			//observer.disconnect();
+		},
+		mounted() {
+			// 姝OnReachBottom浜嬩欢鐢眒ixin.js鍙戝嚭锛岀洰鐨勬槸璁╅〉闈㈠埌搴曟椂锛屼繚璇佹墍鏈夊浘鐗囬兘杩涜鍔犺浇锛屽仛鍒扮粷瀵圭ǔ瀹氫笖鍙潬
+			this.$nextTick(() => {
+				uni.$once('uOnReachBottom', () => {
+					if (!this.isShow) this.isShow = true;
+				});
+			})
+			// mounted鐨勬椂鍊欙紝涓嶄竴瀹氭寕杞戒簡杩欎釜鍏冪礌锛屽欢鏃�30ms锛屽惁鍒欎細鎶ラ敊鎴栬�呬笉鎶ラ敊锛屼絾鏄篃娌℃湁鏁堟灉
+			setTimeout(() => {
+				// 杩欓噷鏄粍浠跺唴鑾峰彇甯冨眬鐘舵�侊紝涓嶈兘鐢╱ni.createIntersectionObserver锛岃�屽繀椤荤敤this.createIntersectionObserver
+				this.disconnectObserver('contentObserver');
+				const contentObserver = uni.createIntersectionObserver(this);
+				// 瑕佺悊瑙h繖閲屾�庝箞璁$畻鐨勶紝璇风湅杩欎釜锛�
+				// https://blog.csdn.net/qq_25324335/article/details/83687695
+				contentObserver.relativeToViewport({
+					bottom: this.getThreshold,
+				}).observe('.u-lazy-item-' + this.elIndex, (res) => {
+					if (res.intersectionRatio > 0) {
+						// 鎳掑姞杞界姸鎬佹敼鍙�
+						this.isShow = true;
+						// 濡傛灉鍥剧墖宸茬粡鍔犺浇锛屽幓鎺夌洃鍚紝鍑忓皯鎬ц兘鐨勬秷鑰�
+						this.disconnectObserver('contentObserver');
+					}
+				})
+				this.contentObserver = contentObserver;
+			}, 30)
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	.u-wrap {
+		background-color: #eee;
+		overflow: hidden;
+	}
+
+	.u-lazy-item {
+		width: 100%;
+		// 楠楃郴缁熷紑鍚‖浠跺姞閫�
+		transform: transition3d(0, 0, 0);
+		// 闃叉鍥剧墖鍔犺浇鈥滈棯涓�涓嬧��
+		will-change: transform;
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+	}
+</style>
diff --git a/uview-ui/components/u-line-progress/u-line-progress.vue b/uview-ui/components/u-line-progress/u-line-progress.vue
new file mode 100644
index 0000000..77e2da2
--- /dev/null
+++ b/uview-ui/components/u-line-progress/u-line-progress.vue
@@ -0,0 +1,147 @@
+<template>
+	<view class="u-progress" :style="{
+		borderRadius: round ? '100rpx' : 0,
+		height: height + 'rpx',
+		backgroundColor: inactiveColor
+	}">
+		<view :class="[
+			type ? `u-type-${type}-bg` : '',
+			striped ? 'u-striped' : '',
+			striped && stripedActive ? 'u-striped-active' : ''
+		]" class="u-active" :style="[progressStyle]">
+			<slot v-if="$slots.default || $slots.$default" />
+			<block v-else-if="showPercent">
+				{{percent + '%'}}
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * lineProgress 绾垮瀷杩涘害鏉�
+	 * @description 灞曠ず鎿嶄綔鎴栦换鍔$殑褰撳墠杩涘害锛屾瘮濡備笂浼犳枃浠讹紝鏄竴涓嚎褰㈢殑杩涘害鏉°��
+	 * @tutorial https://www.uviewui.com/components/lineProgress.html
+	 * @property {String Number} percent 杩涘害鏉$櫨鍒嗘瘮鍊硷紝涓烘暟鍊肩被鍨嬶紝0-100
+	 * @property {Boolean} round 杩涘害鏉′袱绔槸鍚︿负鍗婂渾锛堥粯璁rue锛�
+	 * @property {String} type 濡傝缃紝active-color鍊煎皢浼氬け鏁�
+	 * @property {String} active-color 杩涘害鏉℃縺娲婚儴鍒嗙殑棰滆壊锛堥粯璁�#19be6b锛�
+	 * @property {String} inactive-color 杩涘害鏉$殑搴曡壊锛堥粯璁�#ececec锛�
+	 * @property {Boolean} show-percent 鏄惁鍦ㄨ繘搴︽潯鍐呴儴鏄剧ず褰撳墠鐨勭櫨鍒嗘瘮鍊兼暟鍊硷紙榛樿true锛�
+	 * @property {String Number} height 杩涘害鏉$殑楂樺害锛屽崟浣峳px锛堥粯璁�28锛�
+	 * @property {Boolean} striped 鏄惁鏄剧ず杩涘害鏉℃縺娲婚儴鍒嗙殑鏉$汗锛堥粯璁alse锛�
+	 * @property {Boolean} striped-active 鏉$汗鏄惁鍏锋湁鍔ㄦ�佹晥鏋滐紙榛樿false锛�
+	 * @example <u-line-progress :percent="70" :show-percent="true"></u-line-progress>
+	 */
+	export default {
+		name: "u-line-progress",
+		props: {
+			// 涓ょ鏄惁鏄剧ず鍗婂渾褰�
+			round: {
+				type: Boolean,
+				default: true
+			},
+			// 涓婚棰滆壊
+			type: {
+				type: String,
+				default: ''
+			},
+			// 婵�娲婚儴鍒嗙殑棰滆壊
+			activeColor: {
+				type: String,
+				default: '#19be6b'
+			},
+			inactiveColor: {
+				type: String,
+				default: '#ececec'
+			},
+			// 杩涘害鐧惧垎姣旓紝鏁板��
+			percent: {
+				type: Number,
+				default: 0
+			},
+			// 鏄惁鍦ㄨ繘搴︽潯鍐呴儴鏄剧ず鐧惧垎姣旂殑鍊�
+			showPercent: {
+				type: Boolean,
+				default: true
+			},
+			// 杩涘害鏉$殑楂樺害锛屽崟浣峳px
+			height: {
+				type: [Number, String],
+				default: 28
+			},
+			// 鏄惁鏄剧ず鏉$汗
+			striped: {
+				type: Boolean,
+				default: false
+			},
+			// 鏉$汗鏄惁鏄剧ず娲诲姩鐘舵��
+			stripedActive: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			progressStyle() {
+				let style = {};
+				style.width = this.percent + '%';
+				if(this.activeColor) style.backgroundColor = this.activeColor;
+				return style;
+			}
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-progress {
+		overflow: hidden;
+		height: 15px;
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		align-items: center;
+		width: 100%;
+		border-radius: 100rpx;
+	}
+
+	.u-active {
+		width: 0;
+		height: 100%;
+		align-items: center;
+		@include vue-flex;
+		justify-items: flex-end;
+		justify-content: space-around;
+		font-size: 20rpx;
+		color: #ffffff;
+		transition: all 0.4s ease;
+	}
+
+	.u-striped {
+		background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+		background-size: 39px 39px;
+	}
+
+	.u-striped-active {
+		animation: progress-stripes 2s linear infinite;
+	}
+
+	@keyframes progress-stripes {
+		0% {
+			background-position: 0 0;
+		}
+
+		100% {
+			background-position: 39px 0;
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-line/u-line.vue b/uview-ui/components/u-line/u-line.vue
new file mode 100644
index 0000000..c56fbc3
--- /dev/null
+++ b/uview-ui/components/u-line/u-line.vue
@@ -0,0 +1,84 @@
+<template>
+	<view class="u-line" :style="[lineStyle]">
+		
+	</view>
+</template>
+
+<script>
+	/**
+	 * line 绾挎潯
+	 * @description 姝ょ粍浠朵竴鑸敤浜庢樉绀轰竴鏍圭嚎鏉★紝鐢ㄤ簬鍒嗛殧鍐呭鍧楋紝鏈夋í鍚戝拰绔栧悜涓ょ妯″紡锛屼笖鑳借缃�0.5px绾挎潯锛屼娇鐢ㄤ篃寰堢畝鍗�
+	 * @tutorial https://www.uviewui.com/components/line.html
+	 * @property {String} color 绾挎潯鐨勯鑹�(榛樿#e4e7ed)
+	 * @property {String} length 闀垮害锛岀珫鍚戞椂琛ㄧ幇涓洪珮搴︼紝妯悜鏃惰〃鐜颁负闀垮害锛屽彲浠ヤ负鐧惧垎姣旓紝甯px鍗曚綅鐨勫�肩瓑
+	 * @property {String} direction 绾挎潯鐨勬柟鍚戯紝row-妯悜锛宑ol-绔栧悜(榛樿row)
+	 * @property {String} border-style 绾挎潯鐨勭被鍨嬶紝solid-瀹炵嚎锛宒ashed-鏂瑰舰铏氱嚎锛宒otted-鍦嗙偣铏氱嚎(榛樿solid)
+	 * @property {Boolean} hair-line 鏄惁鏄剧ず缁嗙嚎鏉�(榛樿true)
+	 * @property {String} margin 绾挎潯涓庝笂涓嬪乏鍙冲厓绱犵殑闂磋窛锛屽瓧绗︿覆褰㈠紡锛屽"30rpx"
+	 * @example <u-line color="red"></u-line>
+	 */
+	export default {
+		name: 'u-line',
+		props: {
+			color: {
+				type: String,
+				default: '#e4e7ed'
+			},
+			// 闀垮害锛岀珫鍚戞椂琛ㄧ幇涓洪珮搴︼紝妯悜鏃惰〃鐜颁负闀垮害锛屽彲浠ヤ负鐧惧垎姣旓紝甯px鍗曚綅鐨勫�肩瓑
+			length: {
+				type: String,
+				default: '100%'
+			},
+			// 绾挎潯鏂瑰悜锛宑ol-绔栧悜锛宺ow-妯悜
+			direction: {
+				type: String,
+				default: 'row'
+			},
+			// 鏄惁鏄剧ず缁嗚竟妗�
+			hairLine: {
+				type: Boolean,
+				default: true
+			},
+			// 绾挎潯涓庝笂涓嬪乏鍙冲厓绱犵殑闂磋窛锛屽瓧绗︿覆褰㈠紡锛屽"30rpx"銆�"20rpx 30rpx"
+			margin: {
+				type: String,
+				default: '0'
+			},
+			// 绾挎潯鐨勭被鍨嬶紝solid-瀹炵嚎锛宒ashed-鏂瑰舰铏氱嚎锛宒otted-鍦嗙偣铏氱嚎
+			borderStyle: {
+				type: String,
+				default: 'solid'
+			}
+		},
+		computed: {
+			lineStyle() {
+				let style = {};
+				style.margin = this.margin;
+				// 濡傛灉鏄按骞崇嚎鏉★紝杈规楂樺害涓�1px锛屽啀閫氳繃transform缂╁皬涓�鍗婏紝灏辨槸0.5px浜�
+				if(this.direction == 'row') {
+					// 姝ゅ閲囩敤鍏煎鍒嗗紑鍐欙紝鍏煎nvue鐨勫啓娉�
+					style.borderBottomWidth = '1px';
+					style.borderBottomStyle = this.borderStyle;
+					style.width = this.$u.addUnit(this.length);
+					if(this.hairLine) style.transform = 'scaleY(0.5)';
+				} else {
+					// 濡傛灉鏄珫鍚戠嚎鏉★紝杈规瀹藉害涓�1px锛屽啀閫氳繃transform缂╁皬涓�鍗婏紝灏辨槸0.5px浜�
+					style.borderLeftWidth = '1px';
+					style.borderLeftStyle = this.borderStyle;
+					style.height = this.$u.addUnit(this.length);
+					if(this.hairLine) style.transform = 'scaleX(0.5)';
+				}
+				style.borderColor = this.color;
+				return style;
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	.u-line {
+		vertical-align: middle;
+	}
+</style>
diff --git a/uview-ui/components/u-link/u-link.vue b/uview-ui/components/u-link/u-link.vue
new file mode 100644
index 0000000..18212e6
--- /dev/null
+++ b/uview-ui/components/u-link/u-link.vue
@@ -0,0 +1,89 @@
+<template>
+	<text class="u-link" @tap.stop="openLink" :style="{
+		color: color,
+		fontSize: fontSize + 'rpx',
+		borderBottom: underLine ? `1px solid ${lineColor ? lineColor : color}` : 'none',
+		paddingBottom: underLine ? '0rpx' : '0'
+	}">
+		<slot></slot>
+	</text>
+</template>
+
+<script>
+	/**
+	 * link 瓒呴摼鎺�
+	 * @description 璇ョ粍浠朵负瓒呴摼鎺ョ粍浠讹紝鍦ㄤ笉鍚屽钩鍙版湁涓嶅悓琛ㄧ幇褰㈠紡锛氬湪APP骞冲彴浼氶�氳繃plus鐜鎵撳紑鍐呯疆娴忚鍣紝鍦ㄥ皬绋嬪簭涓妸閾炬帴澶嶅埗鍒扮矘璐存澘锛屽悓鏃舵彁绀轰俊鎭紝鍦℉5涓�氳繃window.open鎵撳紑閾炬帴銆�
+	 * @tutorial https://www.uviewui.com/components/link.html
+	 * @property {String} color 鏂囧瓧棰滆壊锛堥粯璁�#606266锛�
+	 * @property {String Number} font-size 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+	 * @property {Boolean} under-line 鏄惁鏄剧ず涓嬪垝绾匡紙榛樿false锛�
+	 * @property {String} href 璺宠浆鐨勯摼鎺ワ紝瑕佸甫涓奾ttp(s)
+	 * @property {String} line-color 涓嬪垝绾块鑹诧紝榛樿鍚宑olor鍙傛暟棰滆壊 
+	 * @property {String} mp-tips 鍚勪釜灏忕▼搴忓钩鍙版妸閾炬帴澶嶅埗鍒扮矘璐存澘鍚庣殑鎻愮ず璇紙榛樿鈥滈摼鎺ュ凡澶嶅埗锛岃鍦ㄦ祻瑙堝櫒鎵撳紑鈥濓級
+	 * @example <u-link href="http://www.uviewui.com">铚�閬撻毦锛岄毦浜庝笂闈掑ぉ</u-link>
+	 */
+	export default {
+		name: "u-link",
+		props: {
+			// 鏂囧瓧棰滆壊
+			color: {
+				type: String,
+				default: '#497bff'
+			},
+			// 瀛椾綋澶у皬锛屽崟浣峳px
+			fontSize: {
+				type: [String, Number],
+				default: 28
+			},
+			// 鏄惁鏄剧ず涓嬪垝绾�
+			underLine: {
+				type: Boolean,
+				default: false
+			},
+			// 瑕佽烦杞殑閾炬帴
+			href: {
+				type: String,
+				default: ''
+			},
+			// 灏忕▼搴忎腑澶嶅埗鍒扮矘璐存澘鐨勬彁绀鸿
+			mpTips: {
+				type: String,
+				default: '閾炬帴宸插鍒讹紝璇峰湪娴忚鍣ㄦ墦寮�'
+			},
+			// 涓嬪垝绾块鑹�
+			lineColor: {
+				type: String,
+				default: ''
+			}
+		},
+		methods: {
+			openLink() {
+				// #ifdef APP-PLUS
+				plus.runtime.openURL(this.href)
+				// #endif
+				// #ifdef H5
+				window.open(this.href)
+				// #endif
+				// #ifdef MP
+				uni.setClipboardData({
+					data: this.href,
+					success: () => {
+						uni.hideToast();
+						this.$nextTick(() => {
+							this.$u.toast(this.mpTips);
+						})
+					}
+				});
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-link {
+		line-height: 1;
+	}
+</style>
diff --git a/uview-ui/components/u-loading-page/u-loading-page.vue b/uview-ui/components/u-loading-page/u-loading-page.vue
new file mode 100644
index 0000000..7e04401
--- /dev/null
+++ b/uview-ui/components/u-loading-page/u-loading-page.vue
@@ -0,0 +1,25 @@
+<template>
+	<view class="u-loading-page">
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			
+		},
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	
+</style>
diff --git a/uview-ui/components/u-loading/u-loading.vue b/uview-ui/components/u-loading/u-loading.vue
new file mode 100644
index 0000000..c747f64
--- /dev/null
+++ b/uview-ui/components/u-loading/u-loading.vue
@@ -0,0 +1,103 @@
+<template>
+	<view v-if="show" class="u-loading" :class="mode == 'circle' ? 'u-loading-circle' : 'u-loading-flower'" :style="[cricleStyle]">
+	</view>
+</template>
+
+<script>
+	/**
+	 * loading 鍔犺浇鍔ㄧ敾
+	 * @description 璀︽缁勪欢涓轰竴涓皬鍔ㄧ敾锛岀洰鍓嶇敤鍦╱View鐨刲oadmore鍔犺浇鏇村鍜宻witch寮�鍏崇瓑缁勪欢鐨勬鍦ㄥ姞杞界姸鎬佸満鏅��
+	 * @tutorial https://www.uviewui.com/components/loading.html
+	 * @property {String} mode 妯″紡閫夋嫨锛岃瀹樼綉璇存槑锛堥粯璁ircle锛�
+	 * @property {String} color 鍔ㄧ敾娲诲姩鍖哄煙鐨勯鑹诧紝鍙 mode = flower 妯″紡鏈夋晥锛堥粯璁�#c7c7c7锛�
+	 * @property {String Number} size 鍔犺浇鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�34锛�
+	 * @property {Boolean} show 鏄惁鏄剧ず鍔ㄧ敾锛堥粯璁rue锛�
+	 * @example <u-loading mode="circle"></u-loading>
+	 */
+	export default {
+		name: "u-loading",
+		props: {
+			// 鍔ㄧ敾鐨勭被鍨�
+			mode: {
+				type: String,
+				default: 'circle'
+			},
+			// 鍔ㄧ敾鐨勯鑹�
+			color: {
+				type: String,
+				default: '#c7c7c7'
+			},
+			// 鍔犺浇鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx
+			size: {
+				type: [String, Number],
+				default: '34'
+			},
+			// 鏄惁鏄剧ず鍔ㄧ敾
+			show: {
+				type: Boolean,
+				default: true
+			}
+		},
+		computed: {
+			// 鍔犺浇涓渾鍦堝姩鐢荤殑鏍峰紡
+			cricleStyle() {
+				let style = {};
+				style.width = this.size + 'rpx';
+				style.height = this.size + 'rpx';
+				if (this.mode == 'circle') style.borderColor = `#e4e4e4 #e4e4e4 #e4e4e4 ${this.color ? this.color : '#c7c7c7'}`;
+				return style;
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-loading-circle {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		vertical-align: middle;
+		width: 28rpx;
+		height: 28rpx;
+		background: 0 0;
+		border-radius: 50%;
+		border: 2px solid;
+		border-color: #e5e5e5 #e5e5e5 #e5e5e5 #8f8d8e;
+		animation: u-circle 1s linear infinite;
+	}
+
+	.u-loading-flower {
+		width: 20px;
+		height: 20px;
+		display: inline-block;
+		vertical-align: middle;
+		-webkit-animation: a 1s steps(12) infinite;
+		animation: u-flower 1s steps(12) infinite;
+		background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
+		background-size: 100%;
+	}
+
+	@keyframes u-flower {
+		0% {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		to {
+			-webkit-transform: rotate(1turn);
+			transform: rotate(1turn);
+		}
+	}
+
+	@-webkit-keyframes u-circle {
+		0% {
+			transform: rotate(0);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-loadmore/u-loadmore.vue b/uview-ui/components/u-loadmore/u-loadmore.vue
new file mode 100644
index 0000000..6b852a8
--- /dev/null
+++ b/uview-ui/components/u-loadmore/u-loadmore.vue
@@ -0,0 +1,203 @@
+<template>
+	<view class="u-load-more-wrap" :style="{
+		backgroundColor: bgColor,
+		marginBottom: marginBottom + 'rpx',
+		marginTop: marginTop + 'rpx',
+		height: $u.addUnit(height)
+	}">
+		<u-line color="#d4d4d4" length="50"></u-line>
+		<!-- 鍔犺浇涓拰娌℃湁鏇村鐨勭姸鎬佹墠鏄剧ず涓よ竟鐨勬í绾� -->
+		<view :class="status == 'loadmore' || status == 'nomore' ? 'u-more' : ''" class="u-load-more-inner">
+			<view class="u-loadmore-icon-wrap">
+				<u-loading class="u-loadmore-icon" :color="iconColor" :mode="iconType == 'circle' ? 'circle' : 'flower'" :show="status == 'loading' && icon"></u-loading>
+			</view>
+			<!-- 濡傛灉娌℃湁鏇村鐨勭姸鎬佷笅锛屾樉绀哄唴瀹逛负dot锛堢矖鐐癸級锛屽姞杞界壒瀹氭牱寮� -->
+			<view class="u-line-1" :style="[loadTextStyle]" :class="[(status == 'nomore' && isDot == true) ? 'u-dot-text' : 'u-more-text']" @tap="loadMore">
+				{{ showText }}
+			</view>
+		</view>
+		<u-line color="#d4d4d4" length="50"></u-line>
+	</view>
+</template>
+
+<script>
+	/**
+	 * loadmore 鍔犺浇鏇村
+	 * @description 姝ょ粍浠朵竴鑸敤浜庢爣璇嗛〉闈㈠簳閮ㄥ姞杞芥暟鎹椂鐨勭姸鎬併��
+	 * @tutorial https://www.uviewui.com/components/loadMore.html
+	 * @property {String} status 缁勪欢鐘舵�侊紙榛樿loadmore锛�
+	 * @property {String} bg-color 缁勪欢鑳屾櫙棰滆壊锛屽湪椤甸潰鏄潪鐧借壊鏃朵細鐢ㄥ埌锛堥粯璁�#ffffff锛�
+	 * @property {Boolean} icon 鍔犺浇涓椂鏄惁鏄剧ず鍥炬爣锛堥粯璁rue锛�
+	 * @property {String} icon-type 鍔犺浇涓椂鐨勫浘鏍囩被鍨嬶紙榛樿circle锛�
+	 * @property {String} icon-color icon-type涓篶ircle鏃舵湁鏁堬紝鍔犺浇涓殑鍔ㄧ敾鍥炬爣鐨勯鑹诧紙榛樿#b7b7b7锛�
+	 * @property {Boolean} is-dot status涓簄omore鏃讹紝鍐呭鏄剧ず涓轰竴涓�"鈼�"锛堥粯璁alse锛�
+	 * @property {String} color 瀛椾綋棰滆壊锛堥粯璁�#606266锛�
+	 * @property {String Number} margin-top 鍒颁笂涓�涓浉閭诲厓绱犵殑璺濈
+	 * @property {String Number} margin-bottom 鍒颁笅涓�涓浉閭诲厓绱犵殑璺濈
+	 * @property {Object} load-text 鑷畾涔夋樉绀虹殑鏂囧瓧锛岃涓婃柟璇存槑绀轰緥
+	 * @event {Function} loadmore status涓簂oadmore鏃讹紝鐐瑰嚮缁勪欢浼氬彂鍑烘浜嬩欢
+	 * @example <u-loadmore :status="status" icon-type="iconType" load-text="loadText" />
+	 */
+	export default {
+		name: "u-loadmore",
+		props: {
+			// 缁勪欢鑳屾櫙鑹�
+			bgColor: {
+				type: String,
+				default: 'transparent'
+			},
+			// 鏄惁鏄剧ず鍔犺浇涓殑鍥炬爣
+			icon: {
+				type: Boolean,
+				default: true
+			},
+			// 瀛椾綋澶у皬
+			fontSize: {
+				type: String,
+				default: '28'
+			},
+			// 瀛椾綋棰滆壊
+			color: {
+				type: String, 
+				default: '#606266'
+			},
+			// 缁勪欢鐘舵�侊紝loadmore-鍔犺浇鍓嶇殑鐘舵�侊紝loading-鍔犺浇涓殑鐘舵�侊紝nomore-娌℃湁鏇村鐨勭姸鎬�
+			status: {
+				type: String,
+				default: 'loadmore'
+			},
+			// 鍔犺浇涓姸鎬佺殑鍥炬爣锛宖lower-鑺辨湹鐘跺浘鏍囷紝circle-鍦嗗湀鐘跺浘鏍�
+			iconType: {
+				type: String,
+				default: 'circle'
+			},
+			// 鏄剧ず鐨勬枃瀛�
+			loadText: {
+				type: Object,
+				default () {
+					return {
+						loadmore: '鍔犺浇鏇村',
+						loading: '姝e湪鍔犺浇...',
+						nomore: '娌℃湁鏇村浜�'
+					}
+				}
+			},
+			// 鍦ㄢ�滄病鏈夋洿澶氣�濈姸鎬佷笅锛屾槸鍚︽樉绀虹矖鐐�
+			isDot: {
+				type: Boolean,
+				default: false
+			},
+			// 鍔犺浇涓樉绀哄渾鍦堝姩鐢绘椂锛屽姩鐢荤殑棰滆壊
+			iconColor: {
+				type: String,
+				default: '#b7b7b7'
+			},
+			// 涓婅竟璺�
+			marginTop: {
+				type: [String, Number],
+				default: 0
+			},
+			// 涓嬭竟璺�
+			marginBottom: {
+				type: [String, Number],
+				default: 0
+			},
+			// 楂樺害锛屽崟浣峳px
+			height: {
+				type: [String, Number],
+				default: 'auto'
+			}
+		},
+		data() {
+			return {
+				// 绮楃偣
+				dotText: "鈼�"
+			}
+		},
+		computed: {
+			// 鍔犺浇鐨勬枃瀛楁樉绀虹殑鏍峰紡
+			loadTextStyle() {
+				return {
+					color: this.color,
+					fontSize: this.fontSize + 'rpx',
+					position: 'relative',
+					zIndex: 1,
+					backgroundColor: this.bgColor,
+					// 濡傛灉鏄姞杞戒腑鐘舵�侊紝鍔ㄧ敾鍜屾枃瀛楅渶瑕佽窛绂昏繎涓�鐐�
+				}
+			},
+			// 鍔犺浇涓渾鍦堝姩鐢荤殑鏍峰紡
+			cricleStyle() {
+				return {
+					borderColor: `#e5e5e5 #e5e5e5 #e5e5e5 ${this.circleColor}`
+				}
+			},
+			// 鍔犺浇涓姳鏈靛姩鐢诲舰寮�
+			// 鍔ㄧ敾鐢眀ase64鍥剧墖鐢熸垚锛屾殏涓嶆敮鎸佷慨鏀�
+			flowerStyle() {
+				return {
+				}
+			},
+			// 鏄剧ず鐨勬彁绀烘枃瀛�
+			showText() {
+				let text = '';
+				if(this.status == 'loadmore') text = this.loadText.loadmore;
+				else if(this.status == 'loading') text = this.loadText.loading;
+				else if(this.status == 'nomore' && this.isDot) text = this.dotText;
+				else text = this.loadText.nomore;
+				return text;
+			}
+		},
+		methods: {
+			loadMore() {
+				// 鍙湁鍦ㄢ�滃姞杞芥洿澶氣�濈殑鐘舵�佷笅鎵嶅彂閫佺偣鍑讳簨浠讹紝鍐呭涓嶆弧涓�灞忔椂鏃犳硶瑙﹀彂搴曢儴涓婃媺浜嬩欢锛屾墍浠ラ渶瑕佺偣鍑绘潵瑙﹀彂
+				if(this.status == 'loadmore') this.$emit('loadmore');
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	/* #ifdef MP */
+	// 鍦╩p.scss涓紝璧嬩簣浜唘-line涓篺lex: 1锛岃繖閲岄渶瑕佷竴涓槑纭殑闀垮害锛屾墍浠ラ噸缃帀瀹�
+	// 鍦ㄧ粍浠跺唴閮紝鎶婄粍浠跺悕(u-line)褰撳仛閫夋嫨鍣紝鍦ㄥ井淇″紑鍙戝伐鍏蜂細鎻愮ず涓嶅悎娉曪紝浣嗕笉褰卞搷浣跨敤
+	u-line {
+		flex: none;
+	}
+	/* #endif */
+	
+	.u-load-more-wrap {
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+	}
+	
+	.u-load-more-inner {
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+		padding: 0 12rpx;
+	}
+	
+	.u-more {
+		position: relative;
+		@include vue-flex;
+		justify-content: center;
+	}
+	
+	.u-dot-text {
+		font-size: 28rpx;
+	}
+	
+	.u-loadmore-icon-wrap {
+		margin-right: 8rpx;
+	}
+	
+	.u-loadmore-icon {
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+	}
+</style>
diff --git a/uview-ui/components/u-mask/u-mask.vue b/uview-ui/components/u-mask/u-mask.vue
new file mode 100644
index 0000000..0b55d9d
--- /dev/null
+++ b/uview-ui/components/u-mask/u-mask.vue
@@ -0,0 +1,123 @@
+<template>
+	<view class="u-mask" hover-stop-propagation :style="[maskStyle, zoomStyle]" @tap="click" @touchmove.stop.prevent="() => {}" :class="{
+		'u-mask-zoom': zoom,
+		'u-mask-show': show
+	}">
+		<slot />
+	</view>
+</template>
+
+<script>
+	/**
+	 * mask 閬僵
+	 * @description 鍒涘缓涓�涓伄缃╁眰锛岀敤浜庡己璋冪壒瀹氱殑椤甸潰鍏冪礌锛屽苟闃绘鐢ㄦ埛瀵归伄缃╀笅灞傜殑鍐呭杩涜鎿嶄綔锛屼竴鑸敤浜庡脊绐楀満鏅�
+	 * @tutorial https://www.uviewui.com/components/mask.html
+	 * @property {Boolean} show 鏄惁鏄剧ず閬僵锛堥粯璁alse锛�
+	 * @property {String Number} z-index z-index 灞傜骇锛堥粯璁�1070锛�
+	 * @property {Object} custom-style 鑷畾涔夋牱寮忓璞★紝瑙佷笂鏂硅鏄�
+	 * @property {String Number} duration 鍔ㄧ敾鏃堕暱锛屽崟浣嶆绉掞紙榛樿300锛�
+	 * @property {Boolean} zoom 鏄惁浣跨敤scale瀵归伄缃╄繘琛岀缉鏀撅紙榛樿true锛�
+	 * @property {Boolean} mask-click-able 閬僵鏄惁鍙偣鍑伙紝涓篺alse鏃剁偣鍑讳笉浼氬彂閫乧lick浜嬩欢锛堥粯璁rue锛�
+	 * @event {Function} click mask-click-able涓簍rue鏃讹紝鐐瑰嚮閬僵鍙戦�佹浜嬩欢
+	 * @example <u-mask :show="show" @click="show = false"></u-mask>
+	 */
+	export default {
+		name: "u-mask",
+		props: {
+			// 鏄惁鏄剧ず閬僵
+			show: {
+				type: Boolean,
+				default: false
+			},
+			// 灞傜骇z-index
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鐢ㄦ埛鑷畾涔夋牱寮�
+			customStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 閬僵鐨勫姩鐢绘牱寮忥紝 鏄惁浣跨敤浣跨敤zoom杩涜scale杩涜缂╂斁
+			zoom: {
+				type: Boolean,
+				default: true
+			},
+			// 閬僵鐨勮繃娓℃椂闂达紝鍗曚綅涓簃s
+			duration: {
+				type: [Number, String],
+				default: 300
+			},
+			// 鏄惁鍙互閫氳繃鐐瑰嚮閬僵杩涜鍏抽棴
+			maskClickAble: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				zoomStyle: {
+					transform: ''
+				},
+				scale: 'scale(1.2, 1.2)'
+			}
+		},
+		watch: {
+			show(n) {
+				if(n && this.zoom) {
+					// 褰撳睍绀洪伄缃╃殑鏃跺�欙紝璁剧疆scale涓�1锛岃揪鍒扮缉灏�(鍘熸潵涓�1.2)鐨勬晥鏋�
+					this.zoomStyle.transform = 'scale(1, 1)';
+				} else if(!n && this.zoom) {
+					// 褰撻殣钘忛伄缃╃殑鏃跺�欙紝璁剧疆scale涓�1.2锛岃揪鍒版斁澶�(鍥犱负鏄剧ず閬僵鏃跺凡閲嶇疆涓�1)鐨勬晥鏋�
+					this.zoomStyle.transform = this.scale;
+				}
+			}
+		},
+		computed: {
+			maskStyle() {
+				let style = {};
+				style.backgroundColor = "rgba(0, 0, 0, 0.6)";
+				if(this.show) style.zIndex = this.zIndex ? this.zIndex : this.$u.zIndex.mask;
+				else style.zIndex = -1;
+				style.transition = `all ${this.duration / 1000}s ease-in-out`;
+				// 鍒ゆ柇鐢ㄦ埛浼犻�掔殑瀵硅薄鏄惁涓虹┖锛屼笉涓虹┖灏辫繘琛屽悎骞�
+				if (Object.keys(this.customStyle).length) style = { 
+					...style,
+					...this.customStyle
+				};
+				return style;
+			}
+		},
+		methods: {
+			click() {
+				if (!this.maskClickAble) return;
+				this.$emit('click');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		opacity: 0;
+		transition: transform 0.3s;
+	}
+
+	.u-mask-show {
+		opacity: 1;
+	}
+	
+	.u-mask-zoom {
+		transform: scale(1.2, 1.2);
+	}
+</style>
diff --git a/uview-ui/components/u-message-input/u-message-input.vue b/uview-ui/components/u-message-input/u-message-input.vue
new file mode 100644
index 0000000..f64bb19
--- /dev/null
+++ b/uview-ui/components/u-message-input/u-message-input.vue
@@ -0,0 +1,311 @@
+<template>
+	<view class="u-char-box">
+		<view class="u-char-flex">
+			<input :disabled="disabledKeyboard" :value="valueModel" type="number" :focus="focus" :maxlength="maxlength" class="u-input" @input="getVal"/>
+			<view v-for="(item, index) in loopCharArr" :key="index">
+				<view :class="[breathe && charArrLength == index ? 'u-breathe' : '', 'u-char-item',
+				charArrLength === index && mode == 'box' ? 'u-box-active' : '',
+				mode === 'box' ? 'u-box' : '']" :style="{
+					fontWeight: bold ? 'bold' : 'normal',
+					fontSize: fontSize + 'rpx',
+					width: width + 'rpx',
+					height: width + 'rpx',
+					color: inactiveColor,
+					borderColor: charArrLength === index && mode == 'box' ? activeColor : inactiveColor
+				}">
+					<view class="u-placeholder-line" :style="{
+							display: charArrLength === index ? 'block' : 'none',
+							height: width * 0.5 +'rpx'
+						}"
+						v-if="mode !== 'middleLine'"
+					></view>
+					<view v-if="mode === 'middleLine' && charArrLength <= index" :class="[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-middle-line-active' : '']"
+					 class="u-middle-line" :style="{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}"></view>
+					<view v-if="mode === 'bottomLine'" :class="[breathe && charArrLength == index ? 'u-breathe' : '', charArrLength === index ? 'u-buttom-line-active' : '']"
+					 class="u-bottom-line" :style="{height: bold ? '4px' : '2px', background: charArrLength === index ? activeColor : inactiveColor}"></view>
+					<block v-if="!dotFill"> {{ charArr[index] ? charArr[index] : ''}}</block>
+					<block v-else>
+						<text class="u-dot">{{ charArr[index] ? '鈼�' : ''}}</text>
+					</block>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * messageInput 楠岃瘉鐮佽緭鍏ユ
+	 * @description 璇ョ粍浠朵竴鑸敤浜庨獙璇佺敤鎴风煭淇¢獙璇佺爜鐨勫満鏅紝涔熷彲浠ョ粨鍚坲View鐨勯敭鐩樼粍浠朵娇鐢�
+	 * @tutorial https://www.uviewui.com/components/messageInput.html
+	 * @property {String Number} maxlength 杈撳叆瀛楃涓暟锛堥粯璁�4锛�
+	 * @property {Boolean} dot-fill 鏄惁鐢ㄥ渾鐐瑰~鍏咃紙榛樿false锛�
+	 * @property {String} mode 妯″紡閫夋嫨锛岃涓婃柟"鍩烘湰浣跨敤"璇存槑锛堥粯璁ox锛�
+	 * @property {String Number} value 棰勭疆鍊�
+	 * @property {Boolean} breathe 鏄惁寮�鍚懠鍚告晥鏋滐紝瑙佷笂鏂硅鏄庯紙榛樿true锛�
+	 * @property {Boolean} focus 鏄惁鑷姩鑾峰彇鐒︾偣锛堥粯璁alse锛�
+	 * @property {Boolean} bold 瀛椾綋鍜岃緭鍏ユí绾挎槸鍚﹀姞绮楋紙榛樿true锛�
+	 * @property {String Number} font-size 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�60锛�
+	 * @property {String} active-color 褰撳墠婵�娲昏緭鍏ユ鐨勬牱寮忥紙榛樿#497bff锛�
+	 * @property {String} inactive-color 闈炴縺娲昏緭鍏ユ鐨勬牱寮忥紝鏂囧瓧棰滆壊鍚屾鍊硷紙榛樿#606266锛�
+	 * @property {String | Number} width 杈撳叆妗嗗搴︼紝鍗曚綅rpx锛岄珮绛変簬瀹斤紙榛樿80锛�
+	 * @property {Boolean} disabled-keyboard 绂佹鐐瑰嚮杈撳叆妗嗗敜璧风郴缁熼敭鐩橈紙榛樿false锛�
+	 * @event {Function} change 杈撳叆鍐呭鍙戠敓鏀瑰彉鏃惰Е鍙戯紝鍏蜂綋瑙佸畼缃戣鏄�
+	 * @event {Function} finish 杈撳叆瀛楃涓暟杈緈axlength鍊兼椂瑙﹀彂锛岃瀹樼綉璇存槑
+	 * @example <u-message-input mode="bottomLine"></u-message-input>
+	 */
+	export default {
+		name: "u-message-input",
+		props: {
+			// 鏈�澶ц緭鍏ラ暱搴�
+			maxlength: {
+				type: [Number, String],
+				default: 4
+			},
+			// 鏄惁鐢ㄥ渾鐐瑰~鍏�
+			dotFill: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄剧ず妯″紡锛宐ox-鐩掑瓙妯″紡锛宐ottomLine-妯嚎鍦ㄥ簳閮ㄦā寮忥紝middleLine-妯嚎鍦ㄤ腑閮ㄦā寮�
+			mode: {
+				type: String,
+				default: "box"
+			},
+			// 棰勭疆鍊�
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// 褰撳墠婵�娲昏緭鍏tem锛屾槸鍚﹀甫鏈夊懠鍚告晥鏋�
+			breathe: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鑷姩鑾峰彇鐒︾偣
+			focus: {
+				type: Boolean,
+				default: false
+			},
+			// 瀛椾綋鏄惁鍔犵矖
+			bold: {
+				type: Boolean,
+				default: false
+			},
+			// 瀛椾綋澶у皬
+			fontSize: {
+				type: [String, Number],
+				default: 60
+			},
+			// 婵�娲绘牱寮�
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鏈縺娲荤殑鏍峰紡
+			inactiveColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 杈撳叆妗嗙殑澶у皬锛屽崟浣峳px锛屽绛変簬楂�
+			width: {
+				type: [Number, String],
+				default: '80'
+			},
+			// 鏄惁闅愯棌鍘熺敓閿洏锛屽鏋滄兂鐢ㄨ嚜瀹氫箟閿洏鐨勮瘽锛岄渶璁剧疆姝ゅ弬鏁颁负true
+			disabledKeyboard: {
+				type: Boolean,
+				default: false
+			}
+		},
+		watch: {
+			// maxlength: {
+			// 	// 姝ゅ�艰缃负true锛屼細鍦ㄧ粍浠跺姞杞藉悗鏃犻渶maxlength鍙樺寲灏变細鎵ц涓�娆℃湰鐩戝惉鍑芥暟锛屾棤闇�鍐峜reated鐢熷懡鍛ㄦ湡涓鐞�
+			// 	immediate: true,
+			// 	handler(val) {
+			// 		this.maxlength = Number(val);
+			// 	}
+			// }, 
+			value: {
+				immediate: true,
+				handler(val) {
+					// 杞负瀛楃涓�
+					val = String(val);
+					// 瓒呭嚭閮ㄥ垎鎴帀
+					this.valueModel = val.substring(0, this.maxlength);
+				}
+			},
+		},
+		data() {
+			return {
+				valueModel: ""
+			}
+		},
+		computed: {
+			// 鏄惁鏄剧ず鍛煎惛鐏晥鏋�
+			animationClass() {
+				return (index) => {
+					if (this.breathe && this.charArr.length == index) return 'u-breathe';
+					else return '';
+				}
+			},
+			// 鐢ㄤ簬鏄剧ず瀛楃
+			charArr() {
+				return this.valueModel.split('');
+			},
+			charArrLength() {
+				return this.charArr.length;
+			},
+			// 鏍规嵁闀垮害锛屽惊鐜緭鍏ユ鐨勪釜鏁帮紝鍥犱负澶存潯灏忕▼搴忔暟鍊间笉鑳界敤浜巚-for
+			loopCharArr() {
+				return new Array(this.maxlength);
+			}
+		},
+		methods: {
+			getVal(e) {
+				let {
+					value
+				} = e.detail
+				this.valueModel = value;
+				// 鍒ゆ柇闀垮害鏄惁瓒呭嚭浜唌axlength鍊硷紝鐞嗚涓婁笉浼氬彂鐢燂紝鍥犱负input缁勪欢璁剧疆浜唌axlength灞炴�у��
+				if (String(value).length > this.maxlength) return;
+				// 鏈揪鍒癿axlength涔嬪墠锛屽彂閫乧hange浜嬩欢锛岃揪鍒板悗鍙戦�乫inish浜嬩欢
+				this.$emit('change', value);
+				if (String(value).length == this.maxlength) {
+					this.$emit('finish', value);
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	@keyframes breathe {
+		0% {
+			opacity: 0.3;
+		}
+
+		50% {
+			opacity: 1;
+		}
+
+		100% {
+			opacity: 0.3;
+		}
+	}
+
+	.u-char-box {
+		text-align: center;
+	}
+
+	.u-char-flex {
+		@include vue-flex;
+		justify-content: center;
+		flex-wrap: wrap;
+		position: relative;
+	}
+
+	.u-input {
+		position: absolute;
+		top: 0;
+		left: -100%;
+		width: 200%;
+		height: 100%;
+		text-align: left;
+		z-index: 9;
+		opacity: 0;
+		background: none;
+	}
+
+	.u-char-item {
+		position: relative;
+		width: 90rpx;
+		height: 90rpx;
+		margin: 10rpx 10rpx;
+		font-size: 60rpx;
+		font-weight: bold;
+		color: $u-main-color;
+		line-height: 90rpx;
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.u-middle-line {
+		border: none;
+	}
+
+	.u-box {
+		box-sizing: border-box;
+		border: 2rpx solid #cccccc;
+		border-radius: 6rpx;
+	}
+
+	.u-box-active {
+		overflow: hidden;
+		animation-timing-function: ease-in-out;
+		animation-duration: 1500ms;
+		animation-iteration-count: infinite;
+		animation-direction: alternate;
+		border: 2rpx solid $u-type-primary;
+	}
+
+	.u-middle-line-active {
+		background: $u-type-primary;
+	}
+
+	.u-breathe {
+		animation: breathe 2s infinite ease;
+	}
+
+	.u-placeholder-line {
+		/* #ifndef APP-NVUE */
+		display: none;
+		/* #endif */
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%, -50%);
+		width: 2rpx;
+		height: 40rpx;
+		background: #333333;
+		animation: twinkling 1.5s infinite ease;
+	}
+
+	.u-animation-breathe {
+		animation-name: breathe;
+	}
+
+	.u-dot {
+		font-size: 34rpx;
+		line-height: 34rpx;
+	}
+
+	.u-middle-line {
+		height: 4px;
+		background: #000000;
+		width: 80%;
+		position: absolute;
+		border-radius: 2px;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+	}
+
+	.u-buttom-line-active {
+		background: $u-type-primary;
+	}
+
+	.u-bottom-line {
+		height: 4px;
+		background: #000000;
+		width: 80%;
+		position: absolute;
+		border-radius: 2px;
+		bottom: 0;
+		left: 50%;
+		transform: translate(-50%);
+	}
+</style>
diff --git a/uview-ui/components/u-modal/u-modal.vue b/uview-ui/components/u-modal/u-modal.vue
new file mode 100644
index 0000000..7fe5fbb
--- /dev/null
+++ b/uview-ui/components/u-modal/u-modal.vue
@@ -0,0 +1,283 @@
+<template>
+	<view>
+		<u-popup :zoom="zoom" mode="center" :popup="false" :z-index="uZIndex" v-model="value" :length="width"
+		 :mask-close-able="maskCloseAble" :border-radius="borderRadius" @close="popupClose" :negative-top="negativeTop">
+			<view class="u-model">
+				<view v-if="showTitle" class="u-model__title u-line-1" :style="[titleStyle]">{{ title }}</view>
+				<view class="u-model__content">
+					<view :style="[contentStyle]" v-if="$slots.default  || $slots.$default">
+						<slot />
+					</view>
+					<view v-else class="u-model__content__message" :style="[contentStyle]">{{ content }}</view>
+				</view>
+				<view class="u-model__footer u-border-top" v-if="showCancelButton || showConfirmButton">
+					<view v-if="showCancelButton" :hover-stay-time="100" hover-class="u-model__btn--hover" class="u-model__footer__button"
+					 :style="[cancelBtnStyle]" @tap="cancel">
+						{{cancelText}}
+					</view>
+					<view v-if="showConfirmButton || $slots['confirm-button']" :hover-stay-time="100" :hover-class="asyncClose ? 'none' : 'u-model__btn--hover'"
+					 class="u-model__footer__button hairline-left" :style="[confirmBtnStyle]" @tap="confirm">
+						<slot v-if="$slots['confirm-button']" name="confirm-button"></slot>
+						<block v-else>
+							<u-loading mode="circle" :color="confirmColor" v-if="loading"></u-loading>
+							<block v-else>
+								{{confirmText}}
+							</block>
+						</block>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	/**
+	 * modal 妯℃�佹
+	 * @description 寮瑰嚭妯℃�佹锛屽父鐢ㄤ簬娑堟伅鎻愮ず銆佹秷鎭‘璁ゃ�佸湪褰撳墠椤甸潰鍐呭畬鎴愮壒瀹氱殑浜や簰鎿嶄綔
+	 * @tutorial https://www.uviewui.com/components/modal.html
+	 * @property {Boolean} value 鏄惁鏄剧ず妯℃�佹
+	 * @property {String | Number} z-index 灞傜骇
+	 * @property {String} title 妯℃�佹鏍囬锛堥粯璁�"鎻愮ず"锛�
+	 * @property {String | Number} width 妯℃�佹瀹藉害锛堥粯璁�600锛�
+	 * @property {String} content 妯℃�佹鍐呭锛堥粯璁�"鍐呭"锛�
+	 * @property {Boolean} show-title 鏄惁鏄剧ず鏍囬锛堥粯璁rue锛�
+	 * @property {Boolean} async-close 鏄惁寮傛鍏抽棴锛屽彧瀵圭‘瀹氭寜閽湁鏁堬紙榛樿false锛�
+	 * @property {Boolean} show-confirm-button 鏄惁鏄剧ず纭鎸夐挳锛堥粯璁rue锛�
+	 * @property {Stringr | Number} negative-top modal寰�涓婂亸绉荤殑鍊�
+	 * @property {Boolean} show-cancel-button 鏄惁鏄剧ず鍙栨秷鎸夐挳锛堥粯璁alse锛�
+	 * @property {Boolean} mask-close-able 鏄惁鍏佽鐐瑰嚮閬僵鍏抽棴modal锛堥粯璁alse锛�
+	 * @property {String} confirm-text 纭鎸夐挳鐨勬枃瀛楀唴瀹癸紙榛樿"纭"锛�
+	 * @property {String} cancel-text 鍙栨秷鎸夐挳鐨勬枃瀛楀唴瀹癸紙榛樿"鍙栨秷"锛�
+	 * @property {String} cancel-color 鍙栨秷鎸夐挳鐨勯鑹诧紙榛樿"#606266"锛�
+	 * @property {String} confirm-color 纭鎸夐挳鐨勬枃瀛楀唴瀹癸紙榛樿"#497bff"锛�
+	 * @property {String | Number} border-radius 妯℃�佹鍦嗚鍊硷紝鍗曚綅rpx锛堥粯璁�16锛�
+	 * @property {Object} title-style 鑷畾涔夋爣棰樻牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} content-style 鑷畾涔夊唴瀹规牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} cancel-style 鑷畾涔夊彇娑堟寜閽牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} confirm-style 鑷畾涔夌‘璁ゆ寜閽牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Boolean} zoom 鏄惁寮�鍚缉鏀炬ā寮忥紙榛樿true锛�
+	 * @event {Function} confirm 纭鎸夐挳琚偣鍑�
+	 * @event {Function} cancel 鍙栨秷鎸夐挳琚偣鍑�
+	 * @example <u-modal :src="title" :content="content"></u-modal>
+	 */
+	export default {
+		name: 'u-modal',
+		props: {
+			// 鏄惁鏄剧ずModal
+			value: {
+				type: Boolean,
+				default: false
+			},
+			// 灞傜骇z-index
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鏍囬
+			title: {
+				type: [String],
+				default: '鎻愮ず'
+			},
+			// 寮圭獥瀹藉害锛屽彲浠ユ槸鏁板��(rpx)锛岀櫨鍒嗘瘮锛宎uto绛�
+			width: {
+				type: [Number, String],
+				default: 600
+			},
+			// 寮圭獥鍐呭
+			content: {
+				type: String,
+				default: '鍐呭'
+			},
+			// 鏄惁鏄剧ず鏍囬
+			showTitle: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鏄剧ず纭鎸夐挳
+			showConfirmButton: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鏄剧ず鍙栨秷鎸夐挳
+			showCancelButton: {
+				type: Boolean,
+				default: false
+			},
+			// 纭鏂囨
+			confirmText: {
+				type: String,
+				default: '纭'
+			},
+			// 鍙栨秷鏂囨
+			cancelText: {
+				type: String,
+				default: '鍙栨秷'
+			},
+			// 纭鎸夐挳棰滆壊
+			confirmColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鍙栨秷鏂囧瓧棰滆壊
+			cancelColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 鍦嗚鍊�
+			borderRadius: {
+				type: [Number, String],
+				default: 16
+			},
+			// 鏍囬鐨勬牱寮�
+			titleStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 鍐呭鐨勬牱寮�
+			contentStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 鍙栨秷鎸夐挳鐨勬牱寮�
+			cancelStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 纭畾鎸夐挳鐨勬牱寮�
+			confirmStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// 鏄惁寮�鍚缉鏀炬晥鏋�
+			zoom: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁寮傛鍏抽棴锛屽彧瀵圭‘瀹氭寜閽湁鏁�
+			asyncClose: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鍏佽鐐瑰嚮閬僵鍏抽棴modal
+			maskCloseAble: {
+				type: Boolean,
+				default: false
+			},
+			// 缁欎竴涓礋鐨刴argin-top锛屽線涓婂亸绉伙紝閬垮厤鍜岄敭鐩橀噸鍚堢殑鎯呭喌
+			negativeTop: {
+				type: [String, Number],
+				default: 0
+			}
+		},
+		data() {
+			return {
+				loading: false, // 纭鎸夐挳鏄惁姝e湪鍔犺浇涓�
+			}
+		},
+		computed: {
+			cancelBtnStyle() {
+				return Object.assign({
+					color: this.cancelColor
+				}, this.cancelStyle);
+			},
+			confirmBtnStyle() {
+				return Object.assign({
+					color: this.confirmColor
+				}, this.confirmStyle);
+			},
+			uZIndex() {
+				return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+			}
+		},
+		watch: {
+			// 濡傛灉鏄紓姝ュ叧闂椂锛屽閮ㄤ慨鏀箆-model鐨勫�间负false鏃讹紝閲嶇疆鍐呴儴鐨刲oading鐘舵��
+			// 閬垮厤涓嬫鎵撳紑鐨勬椂鍊欙紝鐘舵�佹贩涔�
+			value(n) {
+				if (n === true) this.loading = false;
+			}
+		},
+		methods: {
+			confirm() {
+				// 寮傛鍏抽棴
+				if (this.asyncClose) {
+					this.loading = true;
+				} else {
+					this.$emit('input', false);
+				}
+				this.$emit('confirm');
+			},
+			cancel() {
+				this.$emit('cancel');
+				this.$emit('input', false);
+				// 鐩墠popup寮圭獥鍏抽棴鏈変竴涓欢鏃舵搷浣滐紝姝ゅ鍋氫竴涓欢鏃�
+				// 閬垮厤纭鎸夐挳鏂囧瓧鍙樻垚浜�"纭畾"瀛楁牱锛宮odal杩樻病娑堝け锛岄�犳垚瑙嗚涓嶅ソ鐨勬晥鏋�
+				setTimeout(() => {
+					this.loading = false;
+				}, 300);
+			},
+			// 鐐瑰嚮閬僵鍏抽棴modal锛岃缃畍-model鐨勫�间负false锛屽惁鍒欐棤娉曠浜屾寮硅捣modal
+			popupClose() {
+				this.$emit('input', false);
+			},
+			// 娓呴櫎鍔犺浇涓殑鐘舵��
+			clearLoading() {
+				this.loading = false;
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-model {
+		height: auto;
+		overflow: hidden;
+		font-size: 32rpx;
+		background-color: #fff;
+
+		&__btn--hover {
+			background-color: rgb(230, 230, 230);
+		}
+
+		&__title {
+			padding-top: 48rpx;
+			font-weight: 500;
+			text-align: center;
+			color: $u-main-color;
+		}
+
+		&__content {
+			&__message {
+				padding: 48rpx;
+				font-size: 30rpx;
+				text-align: center;
+				color: $u-content-color;
+			}
+		}
+
+		&__footer {
+			@include vue-flex;
+
+			&__button {
+				flex: 1;
+				height: 100rpx;
+				line-height: 100rpx;
+				font-size: 32rpx;
+				box-sizing: border-box;
+				cursor: pointer;
+				text-align: center;
+				border-radius: 4rpx;
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-navbar/u-navbar.vue b/uview-ui/components/u-navbar/u-navbar.vue
new file mode 100644
index 0000000..450242e
--- /dev/null
+++ b/uview-ui/components/u-navbar/u-navbar.vue
@@ -0,0 +1,315 @@
+<template>
+	<view class="">
+		<view class="u-navbar" :style="[navbarStyle]" :class="{ 'u-navbar-fixed': isFixed, 'u-border-bottom': borderBottom }">
+			<view class="u-status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
+			<view class="u-navbar-inner" :style="[navbarInnerStyle]">
+				<view class="u-back-wrap" v-if="isBack" @tap="goBack">
+					<view class="u-icon-wrap">
+						<u-icon :name="backIconName" :color="backIconColor" :size="backIconSize"></u-icon>
+					</view>
+					<view class="u-icon-wrap u-back-text u-line-1" v-if="backText" :style="[backTextStyle]">{{ backText }}</view>
+				</view>
+				<view class="u-navbar-content-title" v-if="title" :style="[titleStyle]">
+					<view
+					    class="u-title u-line-1"
+					    :style="{
+							color: titleColor,
+							fontSize: titleSize + 'rpx',
+							fontWeight: titleBold ? 'bold' : 'normal'
+						}">
+						{{ title }}
+					</view>
+				</view>
+				<view class="u-slot-content">
+					<slot></slot>
+				</view>
+				<view class="u-slot-right">
+					<slot name="right"></slot>
+				</view>
+			</view>
+		</view>
+		<!-- 瑙e喅fixed瀹氫綅鍚庡鑸爮濉岄櫡鐨勯棶棰� -->
+		<view class="u-navbar-placeholder" v-if="isFixed && !immersive" :style="{ width: '100%', height: Number(navbarHeight) + statusBarHeight + 'px' }"></view>
+	</view>
+</template>
+
+<script>
+	// 鑾峰彇绯荤粺鐘舵�佹爮鐨勯珮搴�
+	let systemInfo = uni.getSystemInfoSync();
+	let menuButtonInfo = {};
+	// 濡傛灉鏄皬绋嬪簭锛岃幏鍙栧彸涓婅鑳跺泭鐨勫昂瀵镐俊鎭紝閬垮厤瀵艰埅鏍忓彸渚у唴瀹逛笌鑳跺泭閲嶅彔(鏀粯瀹濆皬绋嬪簭闈炴湰API锛屽皻鏈吋瀹�)
+	// #ifdef MP-WEIXIN || MP-BAIDU || MP-TOUTIAO || MP-QQ
+	menuButtonInfo = uni.getMenuButtonBoundingClientRect();
+	// #endif
+	/**
+	 * navbar 鑷畾涔夊鑸爮
+	 * @description 姝ょ粍浠朵竴鑸敤浜庡湪鐗规畩鎯呭喌涓嬶紝闇�瑕佽嚜瀹氫箟瀵艰埅鏍忕殑鏃跺�欑敤鍒帮紝涓�鑸缓璁娇鐢╱niapp鑷甫鐨勫鑸爮銆�
+	 * @tutorial https://www.uviewui.com/components/navbar.html
+	 * @property {String Number} height 瀵艰埅鏍忛珮搴�(涓嶅寘鎷姸鎬佹爮楂樺害鍦ㄥ唴锛屽唴閮ㄨ嚜鍔ㄥ姞涓�)锛屾敞鎰忚繖閲岀殑鍗曚綅鏄痯x锛堥粯璁�44锛�
+	 * @property {String} back-icon-color 宸﹁竟杩斿洖鍥炬爣鐨勯鑹诧紙榛樿#606266锛�
+	 * @property {String} back-icon-name 宸﹁竟杩斿洖鍥炬爣鐨勫悕绉帮紝鍙兘涓簎View鑷甫鐨勫浘鏍囷紙榛樿arrow-left锛�
+	 * @property {String Number} back-icon-size 宸﹁竟杩斿洖鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�30锛�
+	 * @property {String} back-text 杩斿洖鍥炬爣鍙宠竟鐨勮緟鍔╂彁绀烘枃瀛�
+	 * @property {Object} back-text-style 杩斿洖鍥炬爣鍙宠竟鐨勮緟鍔╂彁绀烘枃瀛楃殑鏍峰紡锛屽璞″舰寮忥紙榛樿{ color: '#606266' }锛�
+	 * @property {String} title 瀵艰埅鏍忔爣棰橈紝濡傝缃负绌哄瓧绗︼紝灏嗕細闅愯棌鏍囬鍗犱綅鍖哄煙
+	 * @property {String Number} title-width 瀵艰埅鏍忔爣棰樼殑鏈�澶у搴︼紝鍐呭瓒呭嚭浼氫互鐪佺暐鍙烽殣钘忥紝鍗曚綅rpx锛堥粯璁�250锛�
+	 * @property {String} title-color 鏍囬鐨勯鑹诧紙榛樿#606266锛�
+	 * @property {String Number} title-size 瀵艰埅鏍忔爣棰樺瓧浣撳ぇ灏忥紝鍗曚綅rpx锛堥粯璁�32锛�
+	 * @property {Function} custom-back 鑷畾涔夎繑鍥為�昏緫鏂规硶
+	 * @property {String Number} z-index 鍥哄畾鍦ㄩ《閮ㄦ椂鐨剒-index鍊硷紙榛樿980锛�
+	 * @property {Boolean} is-back 鏄惁鏄剧ず瀵艰埅鏍忓乏杈硅繑鍥炲浘鏍囧拰杈呭姪鏂囧瓧锛堥粯璁rue锛�
+	 * @property {Object} background 瀵艰埅鏍忚儗鏅缃紝瑙佸畼缃戣鏄庯紙榛樿{ background: '#ffffff' }锛�
+	 * @property {Boolean} is-fixed 瀵艰埅鏍忔槸鍚﹀浐瀹氬湪椤堕儴锛堥粯璁rue锛�
+	 * @property {Boolean} immersive 娌夋蹈寮忥紝鍏佽fixed瀹氫綅鍚庡鑸爮濉岄櫡锛屼粎fixed瀹氫綅涓嬬敓鏁堬紙榛樿false锛�
+	 * @property {Boolean} border-bottom 瀵艰埅鏍忓簳閮ㄦ槸鍚︽樉绀轰笅杈规锛屽瀹氫箟浜嗚緝娣辩殑鑳屾櫙棰滆壊锛屽彲鍙栨秷姝ゅ�硷紙榛樿true锛�
+	 * @example <u-navbar back-text="杩斿洖" title="鍓戞湭閰嶅Ε锛屽嚭闂ㄥ凡鏄睙婀�"></u-navbar>
+	 */
+	export default {
+		name: "u-navbar",
+		props: {
+			// 瀵艰埅鏍忛珮搴︼紝鍗曚綅px锛岄潪rpx
+			height: {
+				type: [String, Number],
+				default: ''
+			},
+			// 杩斿洖绠ご鐨勯鑹�
+			backIconColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 宸﹁竟杩斿洖鐨勫浘鏍�
+			backIconName: {
+				type: String,
+				default: 'nav-back'
+			},
+			// 宸﹁竟杩斿洖鍥炬爣鐨勫ぇ灏忥紝rpx
+			backIconSize: {
+				type: [String, Number],
+				default: '44'
+			},
+			// 杩斿洖鐨勬枃瀛楁彁绀�
+			backText: {
+				type: String,
+				default: ''
+			},
+			// 杩斿洖鐨勬枃瀛楃殑 鏍峰紡
+			backTextStyle: {
+				type: Object,
+				default () {
+					return {
+						color: '#606266'
+					}
+				}
+			},
+			// 瀵艰埅鏍忔爣棰�
+			title: {
+				type: String,
+				default: ''
+			},
+			// 鏍囬鐨勫搴︼紝濡傛灉闇�瑕佽嚜瀹氫箟鍙充晶鍐呭锛屼笖鍙充晶鍐呭寰堝鏃讹紝鍙兘闇�瑕佸噺灏戣繖涓搴︼紝鍗曚綅rpx
+			titleWidth: {
+				type: [String, Number],
+				default: '250'
+			},
+			// 鏍囬鐨勯鑹�
+			titleColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 鏍囬瀛椾綋鏄惁鍔犵矖
+			titleBold: {
+				type: Boolean,
+				default: false
+			},
+			// 鏍囬鐨勫瓧浣撳ぇ灏�
+			titleSize: {
+				type: [String, Number],
+				default: 32
+			},
+			isBack: {
+				type: [Boolean, String],
+				default: true
+			},
+			// 瀵硅薄褰㈠紡锛屽洜涓虹敤鎴峰彲鑳藉畾涔変竴涓函鑹诧紝鎴栬�呯嚎鎬ф笎鍙樼殑棰滆壊
+			background: {
+				type: Object,
+				default () {
+					return {
+						background: '#ffffff'
+					}
+				}
+			},
+			// 瀵艰埅鏍忔槸鍚﹀浐瀹氬湪椤堕儴
+			isFixed: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁娌夋蹈寮忥紝鍏佽fixed瀹氫綅鍚庡鑸爮濉岄櫡锛屼粎fixed瀹氫綅涓嬬敓鏁�
+			immersive: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鏄剧ず瀵艰埅鏍忕殑涓嬭竟妗�
+			borderBottom: {
+				type: Boolean,
+				default: true
+			},
+			zIndex: {
+				type: [String, Number],
+				default: ''
+			},
+			// 鑷畾涔夎繑鍥為�昏緫
+			customBack: {
+				type: Function,
+				default: null
+			}
+		},
+		data() {
+			return {
+				menuButtonInfo: menuButtonInfo,
+				statusBarHeight: systemInfo.statusBarHeight
+			};
+		},
+		computed: {
+			// 瀵艰埅鏍忓唴閮ㄧ洅瀛愮殑鏍峰紡
+			navbarInnerStyle() {
+				let style = {};
+				// 瀵艰埅鏍忓搴︼紝濡傛灉鍦ㄥ皬绋嬪簭涓嬶紝瀵艰埅鏍忓搴︿负鑳跺泭鐨勫乏杈瑰埌灞忓箷宸﹁竟鐨勮窛绂�
+				style.height = this.navbarHeight + 'px';
+				// // 濡傛灉鏄悇瀹跺皬绋嬪簭锛屽鑸爮鍐呴儴鐨勫搴﹂渶瑕佸噺灏戝彸杈硅兌鍥婄殑瀹藉害
+				// #ifdef MP
+				let rightButtonWidth = systemInfo.windowWidth - menuButtonInfo.left;
+				style.marginRight = rightButtonWidth + 'px';
+				// #endif
+				return style;
+			},
+			// 鏁翠釜瀵艰埅鏍忕殑鏍峰紡
+			navbarStyle() {
+				let style = {};
+				style.zIndex = this.zIndex ? this.zIndex : this.$u.zIndex.navbar;
+				// 鍚堝苟鐢ㄦ埛浼犻�掔殑鑳屾櫙鑹插璞�
+				Object.assign(style, this.background);
+				return style;
+			},
+			// 瀵艰埅涓棿鐨勬爣棰樼殑鏍峰紡
+			titleStyle() {
+				let style = {};
+				// #ifndef MP
+				style.left = (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + 'px';
+				style.right = (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + 'px';
+				// #endif
+				// #ifdef MP
+				// 姝ゅ鏄负浜嗚鏍囬鏄剧ず鍖哄煙鍗充娇鍦ㄥ皬绋嬪簭鏈夊彸渚ц兌鍥婄殑鎯呭喌涓嬩篃鑳藉浜庡睆骞曠殑涓棿锛屾槸閫氳繃缁濆瀹氫綅瀹炵幇鐨�
+				let rightButtonWidth = systemInfo.windowWidth - menuButtonInfo.left;
+				style.left = (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + 'px';
+				style.right = rightButtonWidth - (systemInfo.windowWidth - uni.upx2px(this.titleWidth)) / 2 + rightButtonWidth +
+					'px';
+				// #endif
+				style.width = uni.upx2px(this.titleWidth) + 'px';
+				return style;
+			},
+			// 杞崲瀛楃鏁板�间负鐪熸鐨勬暟鍊�
+			navbarHeight() {
+				// #ifdef APP-PLUS || H5
+				return this.height ? this.height : 44;
+				// #endif
+				// #ifdef MP
+				// 灏忕▼搴忕壒鍒鐞嗭紝璁╁鑸爮楂樺害 = 鑳跺泭楂樺害 + 涓ゅ�嶈兌鍥婇《閮ㄤ笌鐘舵�佹爮搴曢儴鐨勮窛绂讳箣宸�(鐩稿綋浜庡悓鏃惰幏寰椾簡瀵艰埅鏍忓簳閮ㄤ笌鑳跺泭搴曢儴鐨勮窛绂�)
+				// 姝ゆ柟娉曟湁缂洪櫡锛屾殏涓嶇敤(浼氬鑷村皯浜嗗嚑涓猵x)锛岄噰鐢ㄧ洿鎺ュ浐瀹氬�肩殑鏂瑰紡
+				// return menuButtonInfo.height + (menuButtonInfo.top - this.statusBarHeight) * 2;//瀵艰埅楂樺害
+				let height = systemInfo.platform == 'ios' ? 44 : 48;
+				return this.height ? this.height : height;
+				// #endif
+			}
+		},
+		created() {},
+		methods: {
+			goBack() {
+				// 濡傛灉鑷畾涔変簡鐐瑰嚮杩斿洖鎸夐挳鐨勫嚱鏁帮紝鍒欐墽琛岋紝鍚﹀垯鎵ц杩斿洖閫昏緫
+				if (typeof this.customBack === 'function') {
+					// 鍦ㄥ井淇★紝鏀粯瀹濈瓑鐜(H5姝e父)锛屼細瀵艰嚧鐖剁粍浠跺畾涔夌殑customBack()鍑芥暟浣撲腑鐨則his鍙樻垚瀛愮粍浠剁殑this
+					// 閫氳繃bind()鏂规硶锛岀粦瀹氱埗缁勪欢鐨則his锛岃this.customBack()鐨則his涓虹埗缁勪欢鐨勪笂涓嬫枃
+					this.customBack.bind(this.$u.$parent.call(this))();
+				} else {
+					uni.navigateBack();
+				}
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	.u-navbar {
+		width: 100%;
+	}
+
+	.u-navbar-fixed {
+		position: fixed;
+		left: 0;
+		right: 0;
+		top: 0;
+		z-index: 991;
+	}
+
+	.u-status-bar {
+		width: 100%;
+	}
+
+	.u-navbar-inner {
+		@include vue-flex;
+		justify-content: space-between;
+		position: relative;
+		align-items: center;
+	}
+
+	.u-back-wrap {
+		@include vue-flex;
+		align-items: center;
+		flex: 1;
+		flex-grow: 0;
+		padding: 14rpx 14rpx 14rpx 24rpx;
+	}
+
+	.u-back-text {
+		padding-left: 4rpx;
+		font-size: 30rpx;
+	}
+
+	.u-navbar-content-title {
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		flex: 1;
+		position: absolute;
+		left: 0;
+		right: 0;
+		height: 60rpx;
+		text-align: center;
+		flex-shrink: 0;
+	}
+
+	.u-navbar-centent-slot {
+		flex: 1;
+	}
+
+	.u-title {
+		line-height: 60rpx;
+		font-size: 32rpx;
+		flex: 1;
+	}
+
+	.u-navbar-right {
+		flex: 1;
+		@include vue-flex;
+		align-items: center;
+		justify-content: flex-end;
+	}
+
+	.u-slot-content {
+		flex: 1;
+		@include vue-flex;
+		align-items: center;
+	}
+</style>
diff --git a/uview-ui/components/u-no-network/u-no-network.vue b/uview-ui/components/u-no-network/u-no-network.vue
new file mode 100644
index 0000000..51d9f4f
--- /dev/null
+++ b/uview-ui/components/u-no-network/u-no-network.vue
@@ -0,0 +1,233 @@
+<template>
+	<view class="u-no-network" v-if="!isConnected" :style="{'z-index': uZIndex}" @touchmove.stop.prevent="() => {}">
+		<view class="u-inner">
+			<image class="u-error-icon" :src="image" mode="widthFix"></image>
+			<view class="u-tips">
+				{{tips}}
+			</view>
+			<!-- 鍙湁APP骞冲彴锛屾墠鑳借烦杞缃〉锛屽洜涓洪渶瑕佽皟鐢╬lus鐜 -->
+			<!-- #ifdef APP-PLUS -->
+			<view class="u-to-setting">
+				璇锋鏌ョ綉缁滐紝鎴栧墠寰�<text class="u-setting-btn" @tap="openSettings">璁剧疆</text>
+			</view>
+			<!-- #endif -->
+			<view class="u-retry" :hover-stay-time="150" @tap="retry" hover-class="u-retry-hover">
+				閲嶈瘯
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * noNetwork 鏃犵綉缁滄彁绀�
+	 * @description 璇ョ粍浠舵棤闇�浠讳綍閰嶇疆锛屽紩鍏ュ嵆鍙紝鍐呴儴鑷姩澶勭悊鎵�鏈夊姛鑳藉拰浜嬩欢銆�
+	 * @tutorial https://www.uviewui.com/components/noNetwork.html
+	 * @property {String} tips 娌℃湁缃戠粶鏃剁殑鎻愮ず璇紙榛樿鍝庡憖锛岀綉缁滀俊鍙蜂涪澶憋級
+	 * @property {String Number} zIndex 缁勪欢鐨剒-index鍊硷紙榛樿1080锛�
+	 * @property {String} image 鏃犵綉缁滅殑鍥剧墖鎻愮ず锛屽彲鐢ㄧ殑src鍦板潃鎴朾ase64鍥剧墖
+	 * @event {Function} retry 鐢ㄦ埛鐐瑰嚮椤甸潰鐨�"閲嶈瘯"鎸夐挳鏃惰Е鍙�
+	 * @example <u-no-network></u-no-network>
+	 */
+	export default {
+		name: "u-no-network",
+		props: {
+			// 椤甸潰鏂囧瓧鎻愮ず
+			tips: {
+				type: String,
+				default: '鍝庡憖锛岀綉缁滀俊鍙蜂涪澶�'
+			},
+			// 涓�涓獄-index鍊硷紝鐢ㄤ簬璁剧疆娌℃湁缃戠粶杩欎釜缁勪欢鐨勫眰娆★紝鍥犱负椤甸潰鍙兘浼氭湁鍏朵粬瀹氫綅鐨勫厓绱犲眰绾ц繃楂橈紝瀵艰嚧姝ょ粍浠惰瑕嗙洊
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			},
+			// image 娌℃湁缃戠粶鐨勫浘鐗囨彁绀�
+			image: {
+				type: String,
+				default: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAZAAAAEYCAMAAABFglBLAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M0U3MjVFMzQwNEY1MTFFQUE4MTNDOUEzMTVBREMxQjIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6M0U3MjVFMzUwNEY1MTFFQUE4MTNDOUEzMTVBREMxQjIiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDozRTcyNUUzMjA0RjUxMUVBQTgxM0M5QTMxNUFEQzFCMiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDozRTcyNUUzMzA0RjUxMUVBQTgxM0M5QTMxNUFEQzFCMiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkHIU9QAAAMAUExURdHW2OWiou7u7tve4dnc3/vw8N3g4sPCwvjn5+jo6M7Q0u6+vtyEhPXY2Li+wuikpPXW1uXo6dba3Pbg4Na5u+qurqqyt/HJydjb3fjo6LrAxO7Bwey1td6MjOrs7fbc3OTn6Maytf7+/vz19eqqqrzCxvzz87a8wLO6vuqxsf78/PDFxenr7L/FyNTY26+2u/z09MjMzqy0udnZ2dvb27G4vMjN0O7v8P339+Ll5u3v8NDS1ODj5frt7bC3vP76+u24uOKamtTW2MTIy9zc3N7e3vPQ0OCTk8DGyfDDw9LR0c7S1LussNbY2fPOztLU1cLHyrK6vvji4vrv78bKzPX29/np6crP0vjk5Ozu78bLzuepqczR1MHFyMDEyOq1tfTS0vP09cLIy9DU173Ex8bGxvHy88/U18vO0LK4vM7OzsTKzcPJzPLMzM/T1sbMz8HJy+7FxbW8wNTW18XKzvb3+MjLzczP0d3e3+Dh4r3Dxtna29zd3rK5vdPU1cfM0Prq6uOenuPm58HGyfHz8/ro6Lq/w8nO0bzCxcrKytjZ2uXm5vTU1LvBxbW7v+rp6eefn/39/eLi4u3t7Ozs7Pj4+Pr6+vX19fHx8erq6vPz8+Xl5ff39+fn5/v7+/z8/PLx8fX09Pb29ri4uOTk5PHw8OPj4/Py8ubm5vn5+e3s7Pb19fTz8/f29tfX1+7t7cvQ0+zr6/Ly8u3t7fr5+efm5quzuOvq6vT19uvr6/j5+a61uuy6uvb39/T09Ojn5+jq6621uvn6+t/i5KyzuPn4+Le+wvv6+s3S1fj4+fDw8OHk5vv7/Pr7++Xk5LS7v7y8vObl5fz9/ff4+OTj48DEx8XJy+Hk5euysu/x8re9wfn5+v38/Pv8/Pr6++vt7uLi4+Pi4ubl5uXk5dPV1tbV1fHMzNPX2e7u7ejn6PT19fX19PDw7/b29f39/vnr6+Hh4a+3u+7t7q61uePi48PHyf35+enp6fLz9PPz8qmxtuDg4N/f3/Dv7////////1cfN/UAAAEAdFJOU////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wBT9wclAAAlqElEQVR42uydCXwUVZrAk5CEJBAQshACCGyjIRwBJR0It6JBGZZBkRtm5PBgFXAXHBghqAMz6LjGTrd9n7lvwn0JQhARxYNxVJTMwcwOM+7uzK6Z3VXcrnTXVr2q6q7urrvfq26c+n4egXTSVfXv993veym4JkklKdoj0IBoogHRgGiiAdGAaKIB0YBoogHRgGiiAdFEA6IBUVuwx+vqet/v1YAkhxwmcNT9gvjnsAYkGcT7eN1TtThe+1TdL2o1IEkg+rrvUV90MF9oQBIqv6ijF4a3d51XA5J4jVVXx3z587ojGpDEm/QwkO9pQJJB2CvksAYk8fJUXT31xZG63ppRTwI5QgcgR35Rd1MDkgxSX1f31P33P1V3i3u936HUyc3edWSsjuEakKRRW3r9kVv+JrRsrwbklpKTnXs+z0wfONOtAUm8rJu55oqfkZ0TOzUgCZS3Zh7s54+S5RqQhNGYMsnPISkakCSiQcjkNzUgasvUDaVsBF1fb9GXd//B0ziliPzjEA2IujLqGRaMST+cawgLNpn4q30aEDV1Va+dYRqzNy00RMoYUmdpQNTzcb8sCtuKH8w9Z4iWLuIbVzQgapmOBedDOO6c0WjgENK2vKwBUUUmvBSiUbrqxwZuOU18d5MGhEe/dI6a2WvIxA0HX1hfvH7V8gUpA9Mz3x/VuVTRLxvwdAhH5aJjBj4hv39QAxIl743ITHm6azBPnOCfVLwlc6pR3upYFbLjvIuDlEUqRYZo38JYS4gVt5rNZhMQO46byksoMeG4w8QIjtvMpJA/wP1EdZ0bKvkitkh555mBA3zSLnBlSFnNnlJvEJJ95ItW3pJAamvtZhy3m/T0g7fhthJGiG+EviYgmEJ/wHFP6GsbnlZSoicoucxmGwHVguPTBz543C9LHky/Jnql1w5KxWGo8KsThsAFYneYMOb5mlnP11ZCrwOPjfgGI8RqsZuZtUOsFmbllFhZP+zEbc8vGcqzMibv7qos3rd7Mg+TrQv2vCVkiLYcl4rDYLhKvi79FgFirDU7TPpyHHexINg9ZnOazWazyPxlVhsBzcKAKrl84cHo5zx758H0ASufWGrVBWkxup8YMepCespDV6Jfe3z9kOnc7/OjLydJx2FoJF983norAEkLqSbiw4+ZHGY7+UQhyYCDEZml8+ufzLz+RlBAPpieGYPloczYdaIb8rAMHAbD1yr5WHEBqTW7XIwZwEykBoIcrH3JrkgcL554PShRPpie/hDbE9v97oTIXz2zUhYOw0Lw4glJDMRiNtGrIo1AYUFwYZlsVbVzwyhfUJ4YO1MqWb/hsfRw6rzzPnk4DNlk2sQ/BU9aIGZaS2EOI6LLunBn+Fk+fWFpUJmcvPBSWH2dXz4A/OqTB2XiMBimgJf/NCmBGO0OykM1mW3ILur9cNq1cuATwbjk801htC8QcUQmk0NcIhWHoWKwPBdr9KwVuWvz//nVxYXIgTg9wCu1OZxGdJ+RacWhxNKazmD8snJL2DN44Z/oL/btMkgWsFr3Sr+BvmF5oP+fMpABMaaBSKHcgnTJ7tnLPLz1mW8E4ch76S9Hec47pOOgPCz/COm38EDfCEkdn4UCiNVDGg69Ay2OqSEFU7wnCFNGvcB2hHtk8Lhbdn/D6r7RMigLARDSbjgRW7QhTNBdeSEIW6ZPYXgUzZXBg3IB9n0o4y6+iAHS9/Zhc2ACMToIS27yoA5URzCe7ju9gigk5O767/sXqTz04PUPT5VzH31uv3f1o30eTb2djeQnr8IDkqYnLTlqMX7JfIAHeoOI5P3HmDSXRJv+8WC5BoQtZSv++SdhJMMgAbGSISDy1YEPYFzdJ91BhJL5Dv020sw6VdgdEMd9zfrTallERIE4ieWB2VDj+GALE1F3BtHKB0N209E/Js6Dyt28H+fNzbtXBhExIGaqiIHaetDLY/LAIHo5STtcs2+I8ZgNXtdLtqYadiY1NfXMsGEFob+QTkQEiIPwdJEvD7zX29Qj2jQ9qIqk087c1X8XzGBRL3pX9u3khZ2rsfOovyqgF8m8eIFYSjAjahxvLKdzsr2CaslK2p/rJ1BFP0ZXHvE4gJCxOsXgK4rIA7PiAkJYcidyHp1DqTufsi6ooqTQXREL+Xj8gY5PFdxRQWQM8kABi8igeIDYS+zItRX+Pm3NBwbVlVF0sSWHm8f/Ut8d40pTkJqIDgvzWUT+pByIhXCvkPPIpG78yij2w7K6/7PFiJrIe3QafjsXj266+Z1M3uld1jiB9B1L/m0uZVaWKQaClegtyM05nUf8ll1asr9Oihv5IhlCvfneWB4Y7WQ4HRhVhrN77DJ0dx75n4y8M/dGEukDvjyjFEhaSUka8moMdeMb2I9J92+vU/Jn5EToj8NQzp4fv/8FkEBwknkjFyjHyU7l5aWyg8Jx4E+3FyoEokevsOgezkjvyv46I1bkRKZR/m9RJI/7qct6ie3+0z1KLrmf0TwmF58bcr/GKwNiJ3t50ApdiBoVWQsP8Xjdjt60X6PC9vNsHrQmWxPlcaa5yPpDOeF4ii6Ugrxh8/LoqLCMzpw8UMYk5u9VBgQj3xup0LHAyshH1BIGElDB2dL1iybyCnVZWziu2GbGPDheTi4UQTt/hkJwhioWjg0rrXngq1eVADEityB0AuPNqCdkCQN5XRX/l0oAb43s+BEoSBmpDg/MzO/xMJkSyoCX0badwFMGMvKrlQCxlSPOuL9L3XjM87GqqrJIWUPlGikec6nLmiiYvqB8rxKXKJC+95KLhMIA6DwKlo4yo46WB138+DD2+QRCQP5TpRhxA9WFEtp0QESpojUJuwuokHIPl0GZF45A7iVNR35fhsNI8NVoGCVcJPEHV8NVaIn8RbWonSrubjQY6CKApI4fo9OKO8m4MZYJO5kFTDjlahHhyV3MF7KBODwofaxOqhD3U87HY6ECkb8YVQMSpPy9nDV+mfl2C+j8iGFSlpeXN+wBVt4kP6Sz7hVLn/ABQVoFWbeVy78Ke75/tgf+zx1UU7pYPSmZsu7FSTHhyPrl0yl4QmllUP1AjMv1qAIgGEIgur0c8UdiZWl4B8pM2fdDMNEbcTuWFs6ugCgkL1wDoWJ04ov55P9TFQAx8fsQccuahKR3RSokDI9pim7JQn6ECb+LUl15hFuVWsB4W6tDkQmxVnIfzV02DlcExISKBxUJrwkml9BVmT2Kb8sOfGG9w4pnADf39gzGmFPq6/bUM1K6SlN4a+moMlkDqERRkvHo56f8jAVx3JnVDDJerjOhDO8ZJiLMyJXa4pvCn+tFUys8CeznC8mF463TCk16jDkhwhMHneJdTZZAHlg9LLdMVgKcvzqFpm8UNO8O/W1S8fiW5WOVXo7v/qxp1tUhY15WJvvnU/iz7w50FZBRScVjBIXi9ELgaj0d9z0W3B6K0XF4QFxIgMykMndqPm4sm+5Mbf8om/MFM+kOFAzL8cPZ/FxAKK0HMnC4QKwoTMhvgQG587/UBPK93r3/mO1tr/h5794Y1/cH0lXkYCOGgW7sSZfjv9GMAsUqRChbg0hhdQZVBsIIFxC61YHwwrMxrGcMHKUVzyPij3VMethELoMOxYnBJALyULgJyYxh2CK/WhMbFKTfOdJZRmNcywdkVe/UJQ+QT+he+JmgmE8AwfbCUloIVJapJGaJuDFqu6fX6VAQN+6hevuDSQPkGtXjMJiaSGAjgVQUJVhpCQCxxS4RN3nNjsvN5P/kvxdocd+iMo/2x8NA/hi1o4reIERXZVrIu4LmaaEw6rFLBAChRVlRqus9lYE81ZslH7G/c4Hezhjqd6Du6zPQ+P1eMgKxxJSN4wHyVldIW6soFWwevR9vj+lbXB/+GxO4r12zJRVxEwGE3B1igwZkInmfz6rMw9w7Up7yRhbS/ctZL66nbmwjaDb+VTICMeqjmrPYQGS6WSfBB++6ujy8j0cB6V1BfcNH75GOyBlk03d2RaWp4vKB4M4SV8Rzb2YBkZlZeRIkt9VOU3mz/8jWWCVm6q9P0k166REvdtB3tgMYO28yAsEjNVYAY4usbPBUstxQejIBqUNvNm3XK8yh8iBVQj8/LfKVR5g7G5NAR0u0DcgaXiPuCB6YSc5naE0Cq7ZuoLhKwnt1qPCjK1p/hj5vwPXtZ0xKIFZ9yNMymiKBYM3S3+YJct7k0P9KDBBg2sPmnN4j9FhMU5gzdGf9FO2+VWeFOELhodsRBSS7RfLbbInV2GpKSe/eIYd3IsWDw9+zYRFLZGhyAiG7KRhLYnSGmcgambWOnIjw1x8lDIj35x9FdvJyuhcslbwPxsAAREAI35e1tc1IOVoyZ/uBtPu7CSwKMm13S5+lm6mDwkDAEtmUnEDInFZ5+Pl7SUtSL4/Hm2Ck24jEF2sn0NndzKAIEOw18mXTkxMIuZmKFQaSpq9F3pukgx34iefRixpl3cVTIWMDAWPLnkxSICzDDv6EBWS+yYP8n0o1ZQE9LOs/guJA9GRj0O5fJSkQ3ONhGxW5Xb/XQHLog0T3+tDFwSf5DQ3bhSxOkOcreX+IUXnz9RDVO004ZBQ1wfe4wEKNAHIDxCrJC8SIKZ+zAXbxTU8sj3S612dCUCIQDKRXOpMZiFIiU8Eg0ITi8NEDh559MygZyEbVjr9VqLIUE5mYcJM+9TG/lAa9SCA/JvsYd+uSFohyIo8l2qS/T022nvRcUA4QqpbbmbxAABEFe9fXJXo3CJ28qhQtjp3FYnXWl0kMBBDxyH4H0NvwfsJwvEcPKHhBfG754Ugg+oT4WbK2RRNE5E/8W8U1r0E1uV4pkLziq4ew61RvJTMQ3GiSzeM3pALfmSgemdTg3dLPpbw4LQrI18r3HKoFBETt8qCMApo4QTzoeVyPTZVWx4oCsohjKFDyAYnMNIoLaLeZkBAcJ+mjFpZ/KO31N6OAgCPUt6J9/uMgrBCCiIzRf8WcI2bUkE461z5E6g9kRwMBO3OXIgWiix8IOexa+jDGX05md2uqmmunttUWST+HpDkayEbkRkQHwYYArSU5RLwODgBUH4eOniPzoIwjrBqjgSxEfiDxXVCAgAH9EkPEXonJmzxBH5y0Rs5mlO5oIGA46XqUQArhAMEt+hK9tHlaz5D3NFVtHnSuXV6fizGGB0ZOZNwNmcE3rK9HwwJChIgSpzc9nAibTje2b5W3N6glFgiIKt9A51e9WAYLCDAlke6v2+l0x7zmLb/6Nv0kfWT9s/8h7+dssUDug3/iKpvH6Kw5EIFYIt3fNHJCXkP0i8CQnSmq8pi2VeEweXsskBz4Tb6PsL7+KksHc4VEuL9HqRmS0e2+M9XedvvLJ+nSoPytjGmxQBZGD1SO389lASnLehGHCYR0f/WM++umgBzlKk5NUzGXSB/V85KCLklHLBDgZu2D6laxBjzMyvoKLhDg/tojVkg0kCnqOlnp1FE9gxV1ETdj3G6WHyaQrHDkMScr6xHIQEj3lx6JojtB8jgRrRPBMbJela15pbIeSRMHkH2Q3azRWWG/6pGsrELYQHBLqBXb0mowtMbsGAF1aZWt+cG3FP04RxiCYeAM3W/hAXkx7FeNy8qCbUOogEQoZPeBU4NUteanlZ5k1cIFBAT816HxKMti+VWzCCKjoQMhR2xYeCskb6q285ax5sUrlf4GGxeQq2C6FzQgs7JY5+voCCDL4AMBm6wwnjzKNbVSi7Q19z+pfPqynQvIxvin/rGEMONsv+ougshdCICAww658/ET1CkXMta8NJ4zps1cQHKgDhEgzHjWuIgFk1WgQwAEBCScRPaospONseYPXYvnt7i4gNyAuiuBMCFZ7IMMSbteiAIIb4UkU4VpGow1j7Od28fFA3sFbqieQRD4JkppjUMBBAQkHESGoJ/HxFjzojjzAZw2HauAXBFZFmlF8K+ysjKQAAFEYjPyE5F3ODDWfFO854SmcQLBlJ72KaC0yqKU1hwkQHBLOUdTI2ogjDWHkL/08AOBWTPMiIoGC6OXCLyKsdEYu6kHMRDGmr8Tv1bkNiEUEKi7caOiwWVRVgXqCTtGLLr1FymQkDWfAqFRtVYAyAswgRBKq8AYocIilwhUIK7oJjqUQEbQ1vw8FLc6IABkCtwKFZsAGYkU4qiAUE10RnWA0JsM/A+thPLrsgWAHIRbVGfZ8W+yspaNxhECiSaCDAhzQj2saqSxWwAI3PZeMvZ4JGTiZ83BkQIBRKyRcQiCyfsDqQkA/p2wYPOZEAz+/ADSjH9Fub6/zspAkVyMlDR2GiUTSZvc1PVMbP5LWL/yshCQFMhGPWsW7VcVjsbRA8HtLKW1R1azs9RY8DzdxwBx6TULAZkI8/G8SNh0OqGo4zqMCkHnqt0aOiZ0AvyRAdfoM7/9774B75da+Hjsgj3PoSzGiqMHQloSWmtdg77hs9dfKRxXPof5W/mcXirbuwfik5n11RxcfSA2xo6AiuEqeA/u22eYWHAp1GXHq7HAgNKVEBeI6DEvaFaITV+it8GvqWeW0oUoyH6Cm48Htc0Q4pad0XhigITS8WTXyRVYmcSX6OXx9BOQ3YQ0XiCg2xreNIdxeKKAMETIvqzjcJ7ahSIKx2T4FUgXLxDyPUtxNQXZ/iCKCOhchOEOvUmPj/E/uBI6D36NBbZ9xjuddHOf/NvyZpUlGgjY1GOcCKmV9POtcFMlEjUWlIJhnyogdwxPMBCCiJPqfo87gHuDnu3q34nkPDF+jbVNaW7xxe/nz+9zT5/NuSsK8UEUkKrViQZC9tDNhBGqT6P3N/s3+FDwqOXXWBsVBeovzmMY0NJncd7aqqqErxAyaAfDPTfF9bys9H5afyWi80GP8ANRNKFpflW05BMBCIElCYBQg/Vmx7U8+jGZRB8aHsw5LlwCLNeH8pK5d8TwqFpLROgAS6KBEDwGx+dmrWOcq2JklXknPw/sbdlO1m1VHDISx/Oqql5NOBCmqKd8Wlavh+nYA+FBFzf5eSyUbdOXcfGoysLxV6uqFsMAUhgHD6D7qWMBFdY96EHt/k0IR5oKmHT5rdZzOHlUZeD4eMKGjP9+bt5XZfEBmaecB1A2Y7D/IWNdZWVBuu5R2iuIUMwCQEAma538kCNK+o/D8TPhPw26Z9jm3MVlioBk9f9GKQ/w6X6t2wB6QxS0FU4oZhK736LkYRXgATa0SRrPNKdwVsHikbfN414gY4lXEI5wlC88TwGQWf0l+mqxAh5n0e8MBqC4ZG8T+JAePebvQtyqnSYEZLbEpqzRVYJCPsPUqjuIwCxj8W35Zxgwt8kFMgs41HfcVqh0fexuNBgMPUoikWlDmbLgJ2h5+BoFeGwTGRsw7pGfzXqksOybccuEgYwnXkrEhbmLmVp62bKR8+4gCclcIYWkSpyvhAc4pLy0HuyUniQ7Ell6EHEoKKG5ITRYg7s6tTi/zxf9IxTQq7l5+TxACOWUQX2VOmj4/M0jV5CP9J6qKgU2pA/pQitIIYNw8A/U1vWdcvOLmVdQh4Lhdqx6ISCkh1jJSaN/zEMn9+GM5QFCPMOsyL9JHTSIL3IXBvLNWMXx+WkXxcOQI28X1ROrkIeCYbEL8bjBPUh57SCuhz6aUCh8KmsFjo8kgpGR88afGcRC+aIStzdLAQ+QUDzfTPMwgBT2UMk9PpPQh4Ih0bkwMad3RPTqGA4e5j3z543MKsTLCr9akZe7lvg7XcwqiAhDCP+LVv3Gwp+NXDu+zz19limKQxR4veCU8sHnDCEplX4I7oi9KoSCYTmMiWmsqDknZePJBzxoc5RdvYPwffILeIGMIxOOqRILwdBTJ0ujeRhWST2i7Q36BGf/FZVmAjYL8QBTezdE3NsK0krMXxFzz6nguX/Bw4P0poZXDUpQxfA34Ika2AIc39m/EU9cMVXBd1UaTC68QH4Qk3pfS64OLi/nrs2DBLze4WAN3ZMgICBZ3h0BxCDpZPsJDzHGvFMdHEGfoIuFkZq2KyKNRFY2+DIeGd8fzgdkGI7rQDCiHEhq3zyFPECnzsJIHoZF4t1ZS5ki7Wz1zmc9IsgDtMhtieKRK3TvGf25gXwfOGDzEgLkS5B8iuJh+HdwOrPQrv703TSP5T9VjYdbkAd1PvGASB4iPudm3jCkQIQlKiAgAFliiJEfCPeLDHiMicxVnD0nVAchZAZ5PXdG8hB7KDwprSwQhqxIAJALYItZLA8qFCni69dlioLHv/SpyMMpvEBeZuexRhf0qZKidIbxhSGEO7D6izP580b+7C4VgVwnNdNOA5dc4e0G0g2k29n9z65UEYdI0gRbSJaeS98bnZW7edjw1ULp8oiokS8MYWW5+o89k782L0MFIB+SbaNdn3ICyeGbmzXtThrHVpXHkacJLxAQpf8920rPl/IMcrmAgJxg6qD+MSl5xEBIzXO6gpOH4V/e5jwueuoUpuq+5RN1ediEeVSQlRB/6k8ifFdJbaOxPMiI8AsQHZbNyruNWHBUW8pmSUCG9Y0UuQZ9roFHXuY4XPKTlLeZft1OdXEEjc3CQLaTV/UPgMegM+PX5r0otTMXj40QiYgw2L9q+G15BYVGJp21bBBP8l0ciKkEc5md4oP3J5D7Ynfw8TD0DI6xIr2YLHtRr6DaIqKwekBrxt/l5y5+ZJxcRXEHR3mqMFROH94n/9W8grtI869QZZlKgOC4RfAMl/fIEt99Bn75LGoI/LTHQtpK/RPcRBQWtgQUjxVuC5kf2yXHVVEcpBCI0+whmJhIMnqX2SIUoe8T4GFofJu9Q3olU/Twr5da9bCeaq4/ZVVFYeknxbX3dmTkIskDXXLLRv9s5GZ2lTEvHqNuIVQWtVL0rjQu9UUe2zK5QgiIAXzqroAZlUuZqTH+rZK11ZGSDlJOqaCwqLRivw8U5/PmrJg3PKKW+GqoGoIbM1bk5vNXQ2R4WUanmVJf5QSgqLGwb5DmYIYgD8O5SXQjvG7IwwyPJ92SeXSUHLG5D3d3ZMfP46wID9Db4L8QX5J1DvHcCYcqtaqqjAxD+ku2RfLcXqcDI0eLl5eYIrQXWUPfaxARkK3764/er2RwbLou+RlaS0qoKL67wxZ3J1ajCJBKiEPLxlZV5S6b00dyNURBHGK04lZKe3ns9EKZSnhYRY1iQAwggcjUPPxdciLBU8zKsMW/RG6K8ABBLKxTXFaHfV+UuSxLGu18UYP4p3Ck3Dnkhj8sk76U1RHf2HGY/qqjG7EBoU7AhTUASFacH1eByuj0lIOj2vSeCt4UVpSMYXAc3yKztzSsqTrK0Xq8GNhiNHsdJCB3FYxcm39mbP985ECohWLFnSUlr5HGWgKPuUwacbnsXaCnGPfK3dEcFw9vvZhFf5t/lrWvZX9bTXtN2/4WI45M4i3hWhxkz36xOI5tTGB+XsHESlvH/ZRRbw7pLmXiEFsg4MCQSo4H7mtrCISlyf3rJAVCtY1WiOFY1BW2H0qG0WR39DiJ9dHc0YjWgIBoieM4BF9bIFpsviQFUuT3fyZM419n0NZjE7V/c4/8J+nLBnFhR2NcNazDYjxuHOceWHaxIRArDZakBDJCLCbsuXs2jWMAvYunn5JRPrbm8vLm+PRVbbcYEFBI3xmjsNoC3FKTfECMblJjYfw4Fv7QH8aB4yeBJbkvmAixihl06viW2BCkJhBQj0hcQIy1DQHiQ1XKr6v6ReDA6SmMkvoYoTfy3hRVWIM5k4r8PFAQiQdISzVxSZOIKJ0bh/4qrav8q1hWcoEfxRxGCWIW41HxGqiiRd+lOyAkliQCYgNXtIm4iX/lshyv0TRKNzxHxPSYyWQ2m624zUQtmglq87gsxoNqNDk/PeouvYI8Ag2+pAFCr+QhHJXbj3P6hVJWMz7BXSWM2PC0kudB2vevKvOwi/L42s+5g61GGEjAnSxAqukL+u/TZLOiJwTjd6/k3BkKOR6kktg2p9lsMplIIBaTB0z6lL5jRCUeVL/Flujb1DWIADmcJEDCVwQ+WVt/uGrGK4vu/uzK8XAA2O/gcwHOYvxAv1qHt0ktgdCdiv5VsZmIgJhcSgog1eELat7n55DXCBqEVHNmfabEN3ADdhsvc9aUv99vcakhCDKzrgxIxGW2boqmMXvKc8J+IVWkUqv5xyvKo4e6bo4zVp2iQNqSAEhL1DXt6sdoquNjijfO7WF/7yLnb6B2Eg5QB4gojwrq4kdwXGiDKJD22qPGRANpirmqtN/p5y6Y23Mz9nqrObtpPvErzWrJ7zER5UF5GdxTZsSBgOTvfl8igbQE5IibNwWG4uQEBfpqG12l4bzOdqm32WTRJQxIkywg3EsEX+lXJWRvkehf8Z2NVyvjRlsSBMQbCEBYIgwRtCfl1oryyBHkIZI4iTYn1oQAccsEwpeAu049igUJjT9oHg/x3ayuGsaHDy2QdplAmiJ/PGj0tlzcX1vjbHqOHojlS1x8vsPPExDKiAzhpn9TkC+QQMBIczhqqa1pYrstP6bVxTU0PMTziVQBRPD04aA8ixk4qzIQd4NsHoH9be127u/QAcBuJO7vETEc99NNlNsD1U02t+WSl9P9sMq824tqArFWB+BKuh+ZsyVaj3qePm5hIyuZXt3edtEbFeftl3lPLeoBsQagyy66iLUcsiER23KAYRup/VvHb3AUOZra3Faj5Ax8tPjUAoKARyDg2onCkLSYpJU//F2ZAt5IzX4qKyIvEo4vu5WSYB6E7IBvSEQbRrfRKeq9N8Xjvfb9Vp88z9KqChBjNSIggSG7IRsS0f6rq3Qy9CCaGzqrChB3AJl4imHuxtWJuVeL6L690iGobsioAhBvAKGkMXNID8Y/NdniEXF2mal1O/cgux+3CkBqYDNoPXTCcO5Ys6vR1N3T05Pzj3RtK1695RRpT8yh9ePg7R97bjpOHTqQhgBIkwpAYFiQtLTWU4bsY/UAQZTod4Y+uAjbqRcy77Lv+fBbY6ZPXceyDYda4bHRIQeii+PqDhxyZHtc9SasR1BymA09Uy4r9nazhSvnewfTM0+381xDN4HGk+2IG40POZBLirTSiXMff2rqkSxLJtPPa+I6ZepKcD+n/ip93IJ/aIfopXSbXMcMJw4oBWJFDkSej3Uo+9hHjViPbAlplMkHR8gPzgXVVcVVeiKw//RGGVfU3ejKdhySDcSCHIjkYLU122XqUS4hveXfJLNNyCY4FfluZoigf+cr8q8Kazwmb7W0IAcixes9YDhWj/XEK4ze8vsr038lvXQu1Et9Y28p8ztfvqH4wro/zj4k1bZ4UQMRT/Meajb1wJGFn4XaH3dvkJjhcvLv/dh2X5EfAg56qXya3Yo2MpQE5NJZkfc/kv37HojySmgjg99fPFF84IP1FK+bu2RMuH9v6AwoV1cvnv8KII1DdCLtlAeyG3tgS8VG1oPsWiPcUXeYx7natqSfHzoOsE6aDyEr5IoD0YnE6AdMPUgkZyjraZ5+9sKHfKkSzq3O5TP27mb//M4cuFeXjapGJQrEKFKzTUPEg5Btn01mdwwXb8mcaozJJHL5uq/cvW8w+yf3bbwf+sUZhHbx6NAB8Ylpy/oehLLr7n3HI/u433lm4ADWJt6zUb7urhnbPxtzOuInti5ZiOTaHGgqVGJARHsabvagFf3GyvPR3fWTitevWr4gZeCQRTk5i2bMyMnZsfHu7UvuG7p7cPQr//EHixBdVz2/B9xgRAdEQo63uQe55Oyc5Jcvx4du34bskrAjiLrlUuJTWKAq3qOC3Pi66G05NIq+noHycrpPCGxyM6IDclRatsRjUoNJzyszrr5cJM5idtdnO/QorwNzOQQidrsXRwdEcu/3oWPdPSrJwh1Xh75WenpwLInzr+28mtNRjvj9G88JxuqX42y4hgSEEEezqUdN+fGujudzNm6/umT7jpxFNzp26cvRvyfWKBYSBuLdkwBDZYVjRIenvrvnOyom102zeG4RcbO1LyBfWh3HTN8xFli9R2r23YcWiIRdwTxr5US2x2XCbnkSja7sm6dk1HPR7w+Jr7chrdVwrrnx1tNimMnluXmiVf4No99BZYTU83PK4DnmakzuNUN1n5xoVVxJDxxVYUubDnIH6QGyEaj5o0ZTd7JQaPyo+ZzhBIweoP3qbPrcH0AkaQdaTzhuZje7Pvp9dzemJoJ6V3O24QTMRiyyKxvKXnUpFcOWhoAKQuA5dOqEw3DznOeY51jzx/WfNv7eZDJhCklh3SZTIyHEsz/mOZd97qbBceIUZATQl4fUEq6xLZBgSUsj/jlwgPz3QOuR1gOtrYcOmQ8R/xL/aW09YCb+Jb+bRvwLXqy6tMMaryGxycFbE9BEQFu14Li6QIigvUl77rzaKoirDwTHL9VWa8+eQ1lZoE6Cl7Xp03ixXQMQue8A+gx4ufvUfW5NdYVo7Pfi0EXBaA2f+6wGI1CNggaudMSfz1LT8LdMo8F2VIfjSQSETKlY3c6/TRg1Fm8QRyZxzX7XWff/bVkUe02LD0crcR9XQayUs5f/JoxG21Ejjl5SoPwWn8V2+LsM43AbMpuBBggIUryWtvbvnqmvrnFb1YIBFwitwbwXbd8Nu1Ld3ub2GnG1JQXJbzVesrQ1NdzCi6IlAShQArlFlViCFoVqQCgBwxb31ziTNzNZ3VTT5j7q9enwJJAUFd/L6LNe3G9rr06SRWNvt+23WL3GpOCQECBhy++71OJuO9vU1KA2m4aGJnI5XEyS5ZAsQNgKTWf0ei+1XHTXtp1tPwx98Vyurm5vt7W53S0tl7y/1iUrhSQCErt6dD6f9WiLez8ptbU2Ww0p7U5nEyHVhNiZZdVgJ/9YTfy10+lsBy+z2WpryZ9zW45avT6jLojfcpKCa6IB0UQDogHRRAOiAdFEA6IB0UQDogHRRAOiiQZEA6KJBuTWl/8XYADnNmjWHFGctAAAAABJRU5ErkJggg=="
+			}
+		},
+		data() {
+			return {
+				isConnected: true, // 鏄惁鏈夌綉缁滆繛鎺�
+				networkType: "none", // 缃戠粶绫诲瀷
+			}
+		},
+		computed: {
+			uZIndex() {
+				return this.zIndex ? this.zIndex : this.$u.zIndex.noNetwork;
+			}
+		},
+		mounted() {
+			this.isIOS = (uni.getSystemInfoSync().platform === 'ios');
+			uni.onNetworkStatusChange((res) => {
+				this.isConnected = res.isConnected;
+				this.networkType = res.networkType;
+			});
+			uni.getNetworkType({
+				success: (res) => {
+					this.networkType = res.networkType;
+					if (res.networkType == 'none') {
+						this.isConnected = false;
+					} else {
+						this.isConnected = true;
+					}
+				}
+			});
+		},
+		methods: {
+			retry() {
+				// 閲嶆柊妫�鏌ョ綉缁�
+				uni.getNetworkType({
+					success: (res) => {
+						this.networkType = res.networkType;
+						if (res.networkType == 'none') {
+							uni.showToast({
+								title: '鏃犵綉缁滆繛鎺�',
+								icon: 'none',
+								position: 'top'
+							})
+							this.isConnected = false;
+						} else {
+							uni.showToast({
+								title: '缃戠粶宸茶繛鎺�',
+								icon: 'none',
+								position: 'top'
+							})
+							this.isConnected = true;
+						}
+					}
+				});
+				this.$emit('retry');
+			},
+			async openSettings() {
+				if (this.networkType == "none") {
+					this.openSystemSettings();
+					return;
+				}
+			},
+			openAppSettings() {
+				this.gotoAppSetting();
+			},
+			openSystemSettings() {
+				// 浠ヤ笅鏂规硶鏉ヨ嚜5+鑼冪暣锛屽闇�娣辩┒锛岃鑷鏌ラ槄鐩稿叧鏂囨。
+				// https://ask.dcloud.net.cn/docs/
+				if (this.isIOS) {
+					this.gotoiOSSetting();
+				} else {
+					this.gotoAndroidSetting();
+				}
+			},
+			network() {
+				var result = null;
+				var cellularData = plus.ios.newObject("CTCellularData");
+				var state = cellularData.plusGetAttribute("restrictedState");
+				if (state == 0) {
+					result = null;
+				} else if (state == 2) {
+					result = 1;
+				} else if (state == 1) {
+					result = 2;
+				}
+				plus.ios.deleteObject(cellularData);
+				return result;
+			},
+			gotoAppSetting() {
+				if (this.isIOS) {
+					var UIApplication = plus.ios.import("UIApplication");
+					var application2 = UIApplication.sharedApplication();
+					var NSURL2 = plus.ios.import("NSURL");
+					var setting2 = NSURL2.URLWithString("app-settings:");
+					application2.openURL(setting2);
+					plus.ios.deleteObject(setting2);
+					plus.ios.deleteObject(NSURL2);
+					plus.ios.deleteObject(application2);
+				} else {
+					var Intent = plus.android.importClass("android.content.Intent");
+					var Settings = plus.android.importClass("android.provider.Settings");
+					var Uri = plus.android.importClass("android.net.Uri");
+					var mainActivity = plus.android.runtimeMainActivity();
+					var intent = new Intent();
+					intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+					var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+					intent.setData(uri);
+					mainActivity.startActivity(intent);
+				}
+			},
+			gotoiOSSetting() {
+				var UIApplication = plus.ios.import("UIApplication");
+				var application2 = UIApplication.sharedApplication();
+				var NSURL2 = plus.ios.import("NSURL");
+				var setting2 = NSURL2.URLWithString("App-prefs:root=General");
+				application2.openURL(setting2);
+				plus.ios.deleteObject(setting2);
+				plus.ios.deleteObject(NSURL2);
+				plus.ios.deleteObject(application2);
+			},
+			gotoAndroidSetting() {
+				var Intent = plus.android.importClass("android.content.Intent");
+				var Settings = plus.android.importClass("android.provider.Settings");
+				var mainActivity = plus.android.runtimeMainActivity();
+				var intent = new Intent(Settings.ACTION_SETTINGS);
+				mainActivity.startActivity(intent);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-no-network {
+		background-color: #fff;
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+
+	.u-inner {
+		height: 100vh;
+		@include vue-flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		margin-top: -15%;
+	}
+
+	.u-tips {
+		color: $u-tips-color;
+		font-size: 28rpx;
+		padding: 30rpx 0;
+	}
+
+	.u-error-icon {
+		width: 300rpx;
+	}
+
+	.u-to-setting {
+		color: $u-light-color;
+		font-size: 26rpx;
+	}
+
+	.u-setting-btn {
+		font-size: 26rpx;
+		color: $u-type-primary;
+	}
+
+	.u-retry {
+		margin-top: 30rpx;
+		border: 1px solid $u-tips-color;
+		color: $u-tips-color;
+		font-size: 28rpx;
+		padding: 6rpx 30rpx;
+		border-radius: 3px;
+	}
+
+	.u-retry-hover {
+		color: #fff;
+		background-color: $u-tips-color;
+	}
+</style>
diff --git a/uview-ui/components/u-notice-bar/u-notice-bar.vue b/uview-ui/components/u-notice-bar/u-notice-bar.vue
new file mode 100644
index 0000000..41a6cc4
--- /dev/null
+++ b/uview-ui/components/u-notice-bar/u-notice-bar.vue
@@ -0,0 +1,272 @@
+<template>
+	<view class="u-notice-bar-wrap" v-if="isShow" :style="{
+		borderRadius: borderRadius + 'rpx',
+	}">
+		<block v-if="mode == 'horizontal' && isCircular">
+			<u-row-notice
+				:type="type"
+				:color="color"
+				:bgColor="bgColor"
+				:list="list"
+				:volumeIcon="volumeIcon"
+				:moreIcon="moreIcon"
+				:volumeSize="volumeSize"
+				:closeIcon="closeIcon"
+				:mode="mode"
+				:fontSize="fontSize"
+				:speed="speed"
+				:playState="playState"
+				:padding="padding"
+				@getMore="getMore"
+				@close="close"
+				@click="click"
+			></u-row-notice>
+		</block>
+		<block v-if="mode == 'vertical' || (mode == 'horizontal' && !isCircular)">
+			<u-column-notice
+				:type="type"
+				:color="color"
+				:bgColor="bgColor"
+				:list="list"
+				:volumeIcon="volumeIcon"
+				:moreIcon="moreIcon"
+				:closeIcon="closeIcon"
+				:mode="mode"
+				:volumeSize="volumeSize"
+				:disable-touch="disableTouch"
+				:fontSize="fontSize"
+				:duration="duration"
+				:playState="playState"
+				:padding="padding"
+				@getMore="getMore"
+				@close="close"
+				@click="click"
+				@end="end"
+			></u-column-notice>
+		</block>
+	</view>
+</template>
+<script>
+/**
+ * noticeBar 婊氬姩閫氱煡
+ * @description 璇ョ粍浠剁敤浜庢粴鍔ㄩ�氬憡鍦烘櫙锛屾湁澶氱妯″紡鍙緵閫夋嫨
+ * @tutorial https://www.uviewui.com/components/noticeBar.html
+ * @property {Array} list 婊氬姩鍐呭锛屾暟缁勫舰寮忥紝瑙佷笂鏂硅鏄�
+ * @property {String} type 鏄剧ず鐨勪富棰橈紙榛樿warning锛�
+ * @property {Boolean} volume-icon 鏄惁鏄剧ず灏忓枃鍙浘鏍囷紙榛樿true锛�
+ * @property {Boolean} more-icon 鏄惁鏄剧ず鍙宠竟鐨勫悜鍙崇澶达紙榛樿false锛�
+ * @property {Boolean} close-icon 鏄惁鏄剧ず鍏抽棴鍥炬爣锛堥粯璁alse锛�
+ * @property {Boolean} autoplay 鏄惁鑷姩鎾斁锛堥粯璁rue锛�
+ * @property {String} color 鏂囧瓧棰滆壊
+ * @property {String Number} bg-color 鑳屾櫙棰滆壊
+ * @property {String} mode 婊氬姩妯″紡锛堥粯璁orizontal锛�
+ * @property {Boolean} show 鏄惁鏄剧ず锛堥粯璁rue锛�
+ * @property {String Number} font-size 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+ * @property {String Number} volume-size 宸﹁竟鍠囧彮鐨勫ぇ灏忥紙榛樿34锛�
+ * @property {String Number} duration 婊氬姩鍛ㄦ湡鏃堕暱锛屽彧瀵规杩涙ā寮忔湁鏁堬紝妯悜琛旀帴妯″紡鏃犳晥锛屽崟浣峬s锛堥粯璁�2000锛�
+ * @property {String Number} speed 姘村钩婊氬姩鏃剁殑婊氬姩閫熷害锛屽嵆姣忕绉诲姩澶氬皯璺濈锛屽彧瀵规按骞宠鎺ユ柟寮忔湁鏁堬紝鍗曚綅rpx锛堥粯璁�160锛�
+ * @property {String Number} font-size 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+ * @property {Boolean} is-circular mode涓篽orizontal鏃讹紝鎸囨槑鏄惁姘村钩琛旀帴婊氬姩锛堥粯璁rue锛�
+ * @property {String} play-state 鎾斁鐘舵�侊紝play - 鎾斁锛宲aused - 鏆傚仠锛堥粯璁lay锛�
+ * @property {String Nubmer} border-radius 閫氱煡鏍忓渾瑙掞紙榛樿涓�0锛�
+ * @property {String Nubmer} padding 鍐呰竟璺濓紝瀛楃涓诧紝涓庢櫘閫氱殑鍐呰竟璺漜ss鍐欐硶涓�鐩达紙榛樿"18rpx 24rpx"锛�
+ * @property {Boolean} no-list-hidden 鍒楄〃涓虹┖鏃讹紝鏄惁鏄剧ず缁勪欢锛堥粯璁alse锛�
+ * @property {Boolean} disable-touch 鏄惁绂佹閫氳繃鎵嬪姩婊戝姩鍒囨崲閫氱煡锛屽彧鏈塵ode = vertical锛屾垨鑰卪ode = horizontal涓攊s-circular = false鏃舵湁鏁堬紙榛樿true锛�
+ * @event {Function} click 鐐瑰嚮閫氬憡鏂囧瓧瑙﹀彂锛屽彧鏈塵ode = vertical锛屾垨鑰卪ode = horizontal涓攊s-circular = false鏃舵湁鏁�
+ * @event {Function} close 鐐瑰嚮鍙充晶鍏抽棴鍥炬爣瑙﹀彂
+ * @event {Function} getMore 鐐瑰嚮鍙充晶鍚戝彸鍥炬爣瑙﹀彂
+ * @event {Function} end 鍒楄〃鐨勬秷鎭瘡娆¤鎾斁涓�涓懆鏈熸椂瑙﹀彂锛屽彧鏈塵ode = vertical锛屾垨鑰卪ode = horizontal涓攊s-circular = false鏃舵湁鏁�
+ * @example <u-notice-bar :more-icon="true" :list="list"></u-notice-bar>
+ */
+export default {
+	name: "u-notice-bar",
+	props: {
+		// 鏄剧ず鐨勫唴瀹癸紝鏁扮粍
+		list: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 鏄剧ず鐨勪富棰橈紝success|error|primary|info|warning
+		type: {
+			type: String,
+			default: 'warning'
+		},
+		// 鏄惁鏄剧ず宸︿晶鐨勯煶閲忓浘鏍�
+		volumeIcon: {
+			type: Boolean,
+			default: true
+		},
+		// 闊抽噺鍠囧彮鐨勫ぇ灏�
+		volumeSize: {
+			type: [Number, String],
+			default: 34
+		},
+		// 鏄惁鏄剧ず鍙充晶鐨勫彸绠ご鍥炬爣
+		moreIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鏄剧ず鍙充晶鐨勫叧闂浘鏍�
+		closeIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鑷姩鎾斁
+		autoplay: {
+			type: Boolean,
+			default: true
+		},
+		// 鏂囧瓧棰滆壊锛屽悇鍥炬爣涔熶細浣跨敤鏂囧瓧棰滆壊
+		color: {
+			type: String,
+			default: ''
+		},
+		// 鑳屾櫙棰滆壊
+		bgColor: {
+			type: String,
+			default: ''
+		},
+		// 婊氬姩鏂瑰悜锛宧orizontal-姘村钩婊氬姩锛寁ertical-鍨傜洿婊氬姩
+		mode: {
+			type: String,
+			default: 'horizontal'
+		},
+		// 鏄惁鏄剧ず
+		show: {
+			type: Boolean,
+			default: true
+		},
+		// 瀛椾綋澶у皬锛屽崟浣峳px
+		fontSize: {
+			type: [Number, String],
+			default: 28
+		},
+		// 婊氬姩涓�涓懆鏈熺殑鏃堕棿闀匡紝鍗曚綅ms
+		duration: {
+			type: [Number, String],
+			default: 2000
+		},
+		// 姘村钩婊氬姩鏃剁殑婊氬姩閫熷害锛屽嵆姣忕婊氬姩澶氬皯rpx锛岃繖鏈夊埄浜庢帶鍒舵枃瀛楁棤璁哄灏戞椂锛岄兘鑳芥湁涓�涓亽瀹氱殑閫熷害
+		speed: {
+			type: [Number, String],
+			default: 160
+		},
+		// 姘村钩婊氬姩鏃讹紝鏄惁閲囩敤琛旀帴褰㈠紡婊氬姩
+		// 姘村钩琛旀帴妯″紡锛岄噰鐢ㄧ殑鏄痵wiper缁勪欢锛屾按骞虫粴鍔�
+		isCircular: {
+			type: Boolean,
+			default: true
+		},
+		// 鎾斁鐘舵�侊紝play-鎾斁锛宲aused-鏆傚仠
+		playState: {
+			type: String,
+			default: 'play'
+		},
+		// 鏄惁绂佹鐢ㄦ墜婊戝姩鍒囨崲
+		// 鐩墠HX2.6.11锛屽彧鏀寔App 2.5.5+銆丠5 2.5.5+銆佹敮浠樺疂灏忕▼搴忋�佸瓧鑺傝烦鍔ㄥ皬绋嬪簭
+		disableTouch: {
+			type: Boolean,
+			default: true
+		},
+		// 婊氬姩閫氱煡璁剧疆鍦嗚
+		borderRadius: {
+			type: [Number, String],
+			default: 0
+		},
+		// 閫氱煡鐨勮竟璺�
+		padding: {
+			type: [Number, String],
+			default: '18rpx 24rpx'
+		},
+		// list鍒楄〃涓虹┖鏃讹紝鏄惁鏄剧ず缁勪欢
+		noListHidden: {
+			type: Boolean,
+			default: true
+		}
+	},
+	computed: {
+		// 濡傛灉璁剧疆show涓篺alse锛屾垨鑰呰缃簡noListHidden涓簍rue锛屼笖list闀垮害鍙堜负闆剁殑璇濓紝闅愯棌缁勪欢
+		isShow() {
+			if(this.show == false || (this.noListHidden == true && this.list.length == 0)) return false;
+			else return true;
+		}
+	},
+	methods: {
+		// 鐐瑰嚮閫氬憡鏍�
+		click(index) {
+			this.$emit('click', index);
+		},
+		// 鐐瑰嚮鍏抽棴鎸夐挳
+		close() {
+			this.$emit('close');
+		},
+		// 鐐瑰嚮鏇村绠ご鎸夐挳
+		getMore() {
+			this.$emit('getMore');
+		},
+		// 婊氬姩涓�涓懆鏈熺粨鏉燂紝鍙鍨傜洿锛屾垨鑰呮按骞虫杩涘舰寮忔湁鏁�
+		end() {
+			this.$emit('end');
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-notice-bar-wrap {
+	overflow: hidden;
+}
+
+.u-notice-bar {
+	padding: 18rpx 24rpx;
+	overflow: hidden;
+}
+
+.u-direction-row {
+	@include vue-flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.u-left-icon {
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-notice-box {
+	flex: 1;
+	@include vue-flex;
+	overflow: hidden;
+	margin-left: 12rpx;
+}
+
+.u-right-icon {
+	margin-left: 12rpx;
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-notice-content {
+	line-height: 1;
+	white-space: nowrap;
+	font-size: 26rpx;
+	animation: u-loop-animation 10s linear infinite both;
+	text-align: right;
+	// 杩欎竴鍙ュ緢閲嶈锛屼负浜嗚兘璁╂粴鍔ㄥ乏鍙宠繛鎺ヨ捣鏉�
+	padding-left: 100%;
+}
+
+@keyframes u-loop-animation {
+	0% {
+		transform: translate3d(0, 0, 0);
+	}
+
+	100% {
+		transform: translate3d(-100%, 0, 0);
+	}
+}
+</style>
diff --git a/uview-ui/components/u-number-box/u-number-box.vue b/uview-ui/components/u-number-box/u-number-box.vue
new file mode 100644
index 0000000..54a679e
--- /dev/null
+++ b/uview-ui/components/u-number-box/u-number-box.vue
@@ -0,0 +1,363 @@
+<template>
+	<view class="u-numberbox">
+		<view class="u-icon-minus" @touchstart.stop.prevent="btnTouchStart('minus')" @touchend.stop.prevent="clearTimer" :class="{ 'u-icon-disabled': disabled || inputVal <= min }"
+		    :style="{
+				background: bgColor,
+				height: inputHeight + 'rpx',
+				color: color
+			}">
+			<u-icon name="minus" :size="size"></u-icon>
+		</view>
+		<input :disabled="disabledInput || disabled" :cursor-spacing="getCursorSpacing" :class="{ 'u-input-disabled': disabled }"
+		    v-model="inputVal" class="u-number-input" @blur="onBlur" @focus="onFocus"
+		    type="number" :style="{
+				color: color,
+				fontSize: size + 'rpx',
+				background: bgColor,
+				height: inputHeight + 'rpx',
+				width: inputWidth + 'rpx'
+			}" />
+		<view class="u-icon-plus" @touchstart.stop.prevent="btnTouchStart('plus')" @touchend.stop.prevent="clearTimer" :class="{ 'u-icon-disabled': disabled || inputVal >= max }"
+		    :style="{
+				background: bgColor,
+				height: inputHeight + 'rpx',
+				color: color
+			}">
+			<u-icon name="plus" :size="size"></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * numberBox 姝ヨ繘鍣�
+	 * @description 璇ョ粍浠朵竴鑸敤浜庡晢鍩庤喘鐗╅�夋嫨鐗╁搧鏁伴噺鐨勫満鏅�傛敞鎰忥細璇ヨ緭鍏ユ鍙兘杈撳叆澶т簬鎴栫瓑浜�0鐨勬暣鏁帮紝涓嶆敮鎸佸皬鏁拌緭鍏�
+	 * @tutorial https://www.uviewui.com/components/numberBox.html
+	 * @property {Number} value 杈撳叆妗嗗垵濮嬪�硷紙榛樿1锛�
+	 * @property {String} bg-color 杈撳叆妗嗗拰鎸夐挳鐨勮儗鏅鑹诧紙榛樿#F2F3F5锛�
+	 * @property {Number} min 鐢ㄦ埛鍙緭鍏ョ殑鏈�灏忓�硷紙榛樿0锛�
+	 * @property {Number} max 鐢ㄦ埛鍙緭鍏ョ殑鏈�澶у�硷紙榛樿99999锛�
+	 * @property {Number} step 姝ラ暱锛屾瘡娆″姞鎴栧噺鐨勫�硷紙榛樿1锛�
+	 * @property {Boolean} disabled 鏄惁绂佺敤鎿嶄綔锛岀鐢ㄥ悗鏃犳硶鍔犲噺鎴栨墜鍔ㄤ慨鏀硅緭鍏ユ鐨勫�硷紙榛樿false锛�
+	 * @property {Boolean} disabled-input 鏄惁绂佹杈撳叆妗嗘墜鍔ㄨ緭鍏ュ�硷紙榛樿false锛�
+	 * @property {Boolean} positive-integer 鏄惁鍙兘杈撳叆姝f暣鏁帮紙榛樿true锛�
+	 * @property {String | Number} size 杈撳叆妗嗘枃瀛楀拰鎸夐挳瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�26锛�
+	 * @property {String} color 杈撳叆妗嗘枃瀛楀拰鍔犲噺鎸夐挳鍥炬爣鐨勯鑹诧紙榛樿#323233锛�
+	 * @property {String | Number} input-width 杈撳叆妗嗗搴︼紝鍗曚綅rpx锛堥粯璁�80锛�
+	 * @property {String | Number} input-height 杈撳叆妗嗗拰鎸夐挳鐨勯珮搴︼紝鍗曚綅rpx锛堥粯璁�50锛�
+	 * @property {String | Number} index 浜嬩欢鍥炶皟鏃剁敤浠ュ尯鍒嗗綋鍓嶅彂鐢熷彉鍖栫殑鏄摢涓緭鍏ユ
+	 * @property {Boolean} long-press 鏄惁寮�鍚暱鎸夎繛缁�掑鎴栭�掑噺(榛樿true)
+	 * @property {String | Number} press-time 寮�鍚暱鎸夎Е鍙戝悗锛屾瘡瑙﹀彂涓�娆¢渶瑕佸涔咃紝鍗曚綅ms(榛樿250)
+	 * @property {String | Number} cursor-spacing 鎸囧畾鍏夋爣浜庨敭鐩樼殑璺濈锛岄伩鍏嶉敭鐩橀伄鎸¤緭鍏ユ锛屽崟浣峳px锛堥粯璁�200锛�
+	 * @event {Function} change 杈撳叆妗嗗唴瀹瑰彂鐢熷彉鍖栨椂瑙﹀彂锛屽璞″舰寮�
+	 * @event {Function} blur 杈撳叆妗嗗け鍘荤劍鐐规椂瑙﹀彂锛屽璞″舰寮�
+	 * @event {Function} minus 鐐瑰嚮鍑忓皯鎸夐挳鏃惰Е鍙�(鎸夐挳鍙偣鍑绘儏鍐典笅)锛屽璞″舰寮�
+	 * @event {Function} plus 鐐瑰嚮澧炲姞鎸夐挳鏃惰Е鍙�(鎸夐挳鍙偣鍑绘儏鍐典笅)锛屽璞″舰寮�
+	 * @example <u-number-box :min="1" :max="100"></u-number-box>
+	 */
+	export default {
+		name: "u-number-box",
+		props: {
+			// 棰勬樉绀虹殑鏁板瓧
+			value: {
+				type: Number,
+				default: 1
+			},
+			// 鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#F2F3F5'
+			},
+			// 鏈�灏忓��
+			min: {
+				type: Number,
+				default: 0
+			},
+			// 鏈�澶у��
+			max: {
+				type: Number,
+				default: 99999
+			},
+			// 姝ヨ繘鍊硷紝姣忔鍔犳垨鍑忕殑鍊�
+			step: {
+				type: Number,
+				default: 1
+			},
+			// 鏄惁绂佺敤鍔犲噺鎿嶄綔
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// input鐨勫瓧浣撳ぇ灏忥紝鍗曚綅rpx
+			size: {
+				type: [Number, String],
+				default: 26
+			},
+			// 鍔犲噺鍥炬爣鐨勯鑹�
+			color: {
+				type: String,
+				default: '#323233'
+			},
+			// input瀹藉害锛屽崟浣峳px
+			inputWidth: {
+				type: [Number, String],
+				default: 80
+			},
+			// input楂樺害锛屽崟浣峳px
+			inputHeight: {
+				type: [Number, String],
+				default: 50
+			},
+			// index绱㈠紩锛岀敤浜庡垪琛ㄤ腑浣跨敤锛岃鐢ㄦ埛鐭ラ亾鏄摢涓猲umberbox鍙戠敓浜嗗彉鍖栵紝涓�鑸娇鐢╢or寰幆鍑烘潵鐨刬ndex鍊煎嵆鍙�
+			index: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鏄惁绂佺敤杈撳叆妗嗭紝涓巇isabled浣滅敤浜庤緭鍏ユ鏃讹紝涓篛R鐨勫叧绯伙紝鍗虫兂瑕佺鐢ㄨ緭鍏ユ锛屽張鍙互鍔犲噺鐨勮瘽
+			// 璁剧疆disabled涓篺alse锛宒isabledInput涓簍rue鍗冲彲
+			disabledInput: {
+				type: Boolean,
+				default: false
+			},
+			// 杈撳叆妗嗕簬閿洏涔嬮棿鐨勮窛绂�
+			cursorSpacing: {
+				type: [Number, String],
+				default: 100
+			},
+			// 鏄惁寮�鍚暱鎸夎繛缁�掑鎴栭�掑噺
+			longPress: {
+				type: Boolean,
+				default: true
+			},
+			// 寮�鍚暱鎸夎Е鍙戝悗锛屾瘡瑙﹀彂涓�娆¢渶瑕佸涔�
+			pressTime: {
+				type: [Number, String],
+				default: 250
+			},
+			// 鏄惁鍙兘杈撳叆澶т簬鎴栫瓑浜�0鐨勬暣鏁�(姝f暣鏁�)
+			positiveInteger: {
+				type: Boolean,
+				default: true
+			}
+		},
+		watch: {
+			value(v1, v2) {
+				// 鍙湁value鐨勬敼鍙樻槸鏉ヨ嚜澶栭儴鐨勬椂鍊欙紝鎵嶅幓鍚屾inputVal鐨勫�硷紝鍚﹀垯浼氶�犳垚寰幆閿欒
+				if(!this.changeFromInner) {
+					this.inputVal = v1;
+					// 鍥犱负inputVal鍙樺寲鍚庯紝浼氳Е鍙憈his.handleChange()锛屽湪鍏朵腑changeFromInner浼氬啀娆¤璁剧疆涓簍rue锛�
+					// 閫犳垚澶栭潰淇敼鍊硷紝涔熷鑷磋璁や负鏄唴閮ㄤ慨鏀圭殑娣蜂贡锛岃繖閲岃繘琛宼his.$nextTick寤舵椂锛屼繚璇佸湪杩愯鍛ㄦ湡鐨勬渶鍚庡
+					// 灏哻hangeFromInner璁剧疆涓篺alse
+					this.$nextTick(function(){
+						this.changeFromInner = false;
+					})
+				}
+			},
+			inputVal(v1, v2) {
+				// 涓轰簡璁╃敤鎴疯兘澶熷垹闄ゆ墍鏈夎緭鍏ュ�硷紝閲嶆柊杈撳叆鍐呭锛屽垹闄ゆ墍鏈夊�煎悗锛屽唴瀹逛负绌哄瓧绗︿覆
+				if (v1 == '') return;
+				let value = 0;
+				// 棣栧厛鍒ゆ柇鏄惁鏁板�硷紝骞朵笖鍦╩in鍜宮ax涔嬮棿锛屽鏋滀笉鏄紝浣跨敤鍘熸潵鍊�
+				let tmp = this.$u.test.number(v1);
+				if (tmp && v1 >= this.min && v1 <= this.max) value = v1;
+				else value = v2;
+				// 鍒ゆ柇鏄惁鍙兘杈撳叆澶т簬绛変簬0鐨勬暣鏁�
+				if(this.positiveInteger) {
+					// 灏忎簬0锛屾垨鑰呭甫鏈夊皬鏁扮偣锛�
+					if(v1 < 0 || String(v1).indexOf('.') !== -1) {
+						value = v2;
+						// 鍙屽悜缁戝畾input鐨勫�硷紝蹇呴』瑕佷娇鐢�$nextTick淇敼鏄剧ず鐨勫��
+						this.$nextTick(() => {
+							this.inputVal = v2;
+						})
+					}
+				}
+				// 鍙戝嚭change浜嬩欢
+				this.handleChange(value, 'change');
+			}
+		},
+		data() {
+			return {
+				inputVal: 1, // 杈撳叆妗嗕腑鐨勫�硷紝涓嶈兘鐩存帴浣跨敤props涓殑value锛屽洜涓哄簲璇ユ敼鍙榩rops鐨勭姸鎬�
+				timer: null, // 鐢ㄤ綔闀挎寜鐨勫畾鏃跺櫒
+				changeFromInner: false, // 鍊煎彂鐢熷彉鍖栵紝鏄潵鑷唴閮ㄨ繕鏄閮�
+				innerChangeTimer: null, // 鍐呴儴瀹氭椂鍣�
+			};
+		},
+		created() {
+			this.inputVal = Number(this.value);
+		},
+		computed: {
+			getCursorSpacing() {
+				// 鍏堝皢鍊艰浆涓簆x鍗曚綅锛屽啀杞负鏁板��
+				return Number(uni.upx2px(this.cursorSpacing));
+			}
+		},
+		methods: {
+			// 鐐瑰嚮閫�鏍奸敭
+			btnTouchStart(callback) {
+				// 鍏堟墽琛屼竴閬嶆柟娉曪紝鍚﹀垯浼氶�犳垚鏉惧紑鎵嬫椂锛屽氨鎵ц浜哻learTimer锛屽鑷存棤娉曞疄鐜板姛鑳�
+				this[callback]();
+				// 濡傛灉娌″紑鍚暱鎸夊姛鑳斤紝鐩存帴杩斿洖
+				if (!this.longPress) return;
+				clearInterval(this.timer); //鍐嶆娓呯┖瀹氭椂鍣紝闃叉閲嶅娉ㄥ唽瀹氭椂鍣�
+				this.timer = null;
+				this.timer = setInterval(() => {
+					// 鎵ц鍔犳垨鍑忓嚱鏁�
+					this[callback]();
+				}, this.pressTime);
+			},
+			clearTimer() {
+				this.$nextTick(() => {
+					clearInterval(this.timer);
+					this.timer = null;
+				})
+			},
+			minus() {
+				this.computeVal('minus');
+			},
+			plus() {
+				this.computeVal('plus');
+			},
+			// 涓轰簡淇濊瘉灏忔暟鐩稿姞鍑忓嚭鐜扮簿搴︽孩鍑虹殑闂
+			calcPlus(num1, num2) {
+				let baseNum, baseNum1, baseNum2;
+				try {
+					baseNum1 = num1.toString().split('.')[1].length;
+				} catch (e) {
+					baseNum1 = 0;
+				}
+				try {
+					baseNum2 = num2.toString().split('.')[1].length;
+				} catch (e) {
+					baseNum2 = 0;
+				}
+				baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
+				let precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2; //绮惧害
+				return ((num1 * baseNum + num2 * baseNum) / baseNum).toFixed(precision);
+			},
+			// 涓轰簡淇濊瘉灏忔暟鐩稿姞鍑忓嚭鐜扮簿搴︽孩鍑虹殑闂
+			calcMinus(num1, num2) {
+				let baseNum, baseNum1, baseNum2;
+				try {
+					baseNum1 = num1.toString().split('.')[1].length;
+				} catch (e) {
+					baseNum1 = 0;
+				}
+				try {
+					baseNum2 = num2.toString().split('.')[1].length;
+				} catch (e) {
+					baseNum2 = 0;
+				}
+				baseNum = Math.pow(10, Math.max(baseNum1, baseNum2));
+				let precision = baseNum1 >= baseNum2 ? baseNum1 : baseNum2;
+				return ((num1 * baseNum - num2 * baseNum) / baseNum).toFixed(precision);
+			},
+			computeVal(type) {
+				uni.hideKeyboard();
+				if (this.disabled) return;
+				let value = 0;
+				// 鍑�
+				if (type === 'minus') {
+					value = this.calcMinus(this.inputVal, this.step);
+				} else if (type === 'plus') {
+					value = this.calcPlus(this.inputVal, this.step);
+				}
+				// 鍒ゆ柇鏄惁灏忎簬鏈�灏忓�煎拰澶т簬鏈�澶у��
+				if (value < this.min || value > this.max) {
+					return;
+				}
+				this.inputVal = value;
+				this.handleChange(value, type);
+			},
+			// 澶勭悊鐢ㄦ埛鎵嬪姩杈撳叆鐨勬儏鍐�
+			onBlur(event) {
+				let val = 0;
+				let value = event.detail.value;
+				// 濡傛灉涓洪潪0-9鏁板瓧缁勬垚锛屾垨鑰呭叾绗竴浣嶆暟鍊间负0锛岀洿鎺ヨ鍏剁瓑浜巑in鍊�
+				// 杩欓噷涓嶇洿鎺ュ垽鏂槸鍚︽鏁存暟锛屾槸鍥犱负鐢ㄦ埛浼犻�掔殑props min鍊煎彲鑳戒负0
+				if (!/(^\d+$)/.test(value) || value[0] == 0) val = this.min;
+				val = +value;
+				if (val > this.max) {
+					val = this.max;
+				} else if (val < this.min) {
+					val = this.min;
+				}
+				this.$nextTick(() => {
+					this.inputVal = val;
+				})
+				this.handleChange(val, 'blur');
+			},
+			// 杈撳叆妗嗚幏寰楃劍鐐逛簨浠�
+			onFocus() {
+				this.$emit('focus');
+			},
+			handleChange(value, type) {
+				if (this.disabled) return;
+				// 娓呴櫎瀹氭椂鍣紝閬垮厤閫犳垚娣蜂贡
+				if(this.innerChangeTimer) {
+					clearTimeout(this.innerChangeTimer);
+					this.innerChangeTimer = null;
+				}
+				// 鍙戝嚭input浜嬩欢锛屼慨鏀归�氳繃v-model缁戝畾鐨勫�硷紝杈惧埌鍙屽悜缁戝畾鐨勬晥鏋�
+				this.changeFromInner = true;
+				// 涓�瀹氭椂闂村唴锛屾竻闄hangeFromInner鏍囪锛屽惁鍒欏唴閮ㄥ�兼敼鍙樺悗
+				// 澶栭儴閫氳繃绋嬪簭淇敼value鍊硷紝灏嗕細鏃犳晥
+				this.innerChangeTimer = setTimeout(() => {
+					this.changeFromInner = false;
+				}, 150);
+				this.$emit('input', Number(value));
+				this.$emit(type, {
+					// 杞负Number绫诲瀷
+					value: Number(value),
+					index: this.index
+				})
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-numberbox {
+		display: inline-flex;
+		align-items: center;
+	}
+
+	.u-number-input {
+		position: relative;
+		text-align: center;
+		padding: 0;
+		margin: 0 6rpx;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.u-icon-plus,
+	.u-icon-minus {
+		width: 60rpx;
+		@include vue-flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.u-icon-plus {
+		border-radius: 0 8rpx 8rpx 0;
+	}
+
+	.u-icon-minus {
+		border-radius: 8rpx 0 0 8rpx;
+	}
+
+	.u-icon-disabled {
+		color: #c8c9cc !important;
+		background: #f7f8fa !important;
+	}
+
+	.u-input-disabled {
+		color: #c8c9cc !important;
+		background-color: #f2f3f5 !important;
+	}
+</style>
diff --git a/uview-ui/components/u-number-keyboard/u-number-keyboard.vue b/uview-ui/components/u-number-keyboard/u-number-keyboard.vue
new file mode 100644
index 0000000..6425a1f
--- /dev/null
+++ b/uview-ui/components/u-number-keyboard/u-number-keyboard.vue
@@ -0,0 +1,158 @@
+<template>
+	<view class="u-keyboard" @touchmove.stop.prevent="() => {}">
+		<view class="u-keyboard-grids">
+			<view
+			    class="u-keyboard-grids-item"
+			    :class="[btnBgGray(index) ? 'u-bg-gray' : '', index <= 2 ? 'u-border-top' : '', index < 9 ? 'u-border-bottom' : '', (index + 1) % 3 != 0 ? 'u-border-right' : '']"
+			    :style="[itemStyle(index)]"
+			    v-for="(item, index) in numList"
+			    :key="index"
+			    :hover-class="hoverClass(index)"
+			    :hover-stay-time="100"
+			    @tap="keyboardClick(item)">
+				<view class="u-keyboard-grids-btn">{{ item }}</view>
+			</view>
+			<view class="u-keyboard-grids-item u-bg-gray" hover-class="u-hover-class" :hover-stay-time="100" @touchstart.stop="backspaceClick"
+			    @touchend="clearTimer">
+				<view class="u-keyboard-back u-keyboard-grids-btn">
+					<u-icon name="backspace" :size="38" :bold="true"></u-icon>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			// 閿洏鐨勭被鍨嬶紝number-鏁板瓧閿洏锛宑ard-韬唤璇侀敭鐩�
+			mode: {
+				type: String,
+				default: 'number'
+			},
+			// 鏄惁鏄剧ず閿洏鐨�"."绗﹀彿
+			dotEnabled: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁鎵撲贡閿洏鎸夐敭鐨勯『搴�
+			random: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				backspace: 'backspace', // 閫�鏍奸敭鍐呭
+				dot: '.', // 鐐�
+				timer: null, // 闀挎寜澶氭鍒犻櫎鐨勪簨浠剁洃鍚�
+				cardX: 'X' // 韬唤璇佺殑X绗﹀彿
+			};
+		},
+		computed: {
+			// 閿洏闇�瑕佹樉绀虹殑鍐呭
+			numList() {
+				let tmp = [];
+				if (!this.dotEnabled && this.mode == 'number') {
+					if (!this.random) {
+						return [1, 2, 3, 4, 5, 6, 7, 8, 9, 0];
+					} else {
+						return this.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
+					}
+				} else if (this.dotEnabled && this.mode == 'number') {
+					if (!this.random) {
+						return [1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0];
+					} else {
+						return this.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.dot, 0]);
+					}
+				} else if (this.mode == 'card') {
+					if (!this.random) {
+						return [1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0];
+					} else {
+						return this.$u.randomArray([1, 2, 3, 4, 5, 6, 7, 8, 9, this.cardX, 0]);
+					}
+				}
+			},
+			// 鎸夐敭鐨勬牱寮忥紝鍦ㄩ潪涔卞簭&&鏁板瓧閿洏&&涓嶆樉绀虹偣鎸夐挳鏃讹紝index涓�9鏃讹紝鎸夐敭鍗犱綅涓や釜绌洪棿
+			itemStyle() {
+				return index => {
+					let style = {};
+					if (this.mode == 'number' && !this.dotEnabled && index == 9) style.flex = '0 0 66.6666666666%';
+					return style;
+				};
+			},
+			// 鏄惁璁╂寜閿樉绀虹伆鑹诧紝鍙湪闈炰贡搴�&&鏁板瓧閿洏&&涓斿厑璁哥偣鎸夐敭鐨勬椂鍊�
+			btnBgGray() {
+				return index => {
+					if (!this.random && index == 9 && (this.mode != 'number' || (this.mode == 'number' && this.dotEnabled))) return true;
+					else return false;
+				};
+			},
+			hoverClass() {
+				return index => {
+					if (!this.random && index == 9 && (this.mode == 'number' && this.dotEnabled || this.mode == 'card')) return 'u-hover-class';
+					else return 'u-keyboard-hover';
+				}
+			}
+		},
+		methods: {
+			// 鐐瑰嚮閫�鏍奸敭
+			backspaceClick() {
+				this.$emit('backspace');
+				clearInterval(this.timer); //鍐嶆娓呯┖瀹氭椂鍣紝闃叉閲嶅娉ㄥ唽瀹氭椂鍣�
+				this.timer = null;
+				this.timer = setInterval(() => {
+					this.$emit('backspace');
+				}, 250);
+			},
+			clearTimer() {
+				clearInterval(this.timer);
+				this.timer = null;
+			},
+			// 鑾峰彇閿洏鏄剧ず鐨勫唴瀹�
+			keyboardClick(val) {
+				// 鍏佽閿洏鏄剧ず鐐规ā寮忓拰瑙﹀彂闈炵偣鎸夐敭鏃讹紝灏嗗唴瀹硅浆涓烘暟瀛楃被鍨�
+				if (this.dotEnabled && val != this.dot && val != this.cardX) val = Number(val);
+				this.$emit('change', val);
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-keyboard {
+		position: relative;
+		z-index: 1003;
+	}
+
+	.u-keyboard-grids {
+		@include vue-flex;
+		flex-wrap: wrap;
+	}
+
+	.u-keyboard-grids-item {
+		flex: 0 0 33.3333333333%;
+		text-align: center;
+		font-size: 50rpx;
+		color: #333;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		height: 110rpx;
+		font-weight: 500;
+	}
+
+	.u-bg-gray {
+		background-color: $u-border-color;
+	}
+
+	.u-keyboard-back {
+		font-size: 36rpx;
+	}
+
+	.u-keyboard-hover {
+		background-color: #e7e6eb;
+	}
+</style>
diff --git a/uview-ui/components/u-parse/libs/CssHandler.js b/uview-ui/components/u-parse/libs/CssHandler.js
new file mode 100644
index 0000000..75c6015
--- /dev/null
+++ b/uview-ui/components/u-parse/libs/CssHandler.js
@@ -0,0 +1,100 @@
+const cfg = require('./config.js'),
+	isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+
+function CssHandler(tagStyle) {
+	var styles = Object.assign(Object.create(null), cfg.userAgentStyles);
+	for (var item in tagStyle)
+		styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];
+	this.styles = styles;
+}
+CssHandler.prototype.getStyle = function(data) {
+	this.styles = new parser(data, this.styles).parse();
+}
+CssHandler.prototype.match = function(name, attrs) {
+	var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';
+	if (attrs.class) {
+		var items = attrs.class.split(' ');
+		for (var i = 0, item; item = items[i]; i++)
+			if (tmp = this.styles['.' + item])
+				matched += tmp + ';';
+	}
+	if (tmp = this.styles['#' + attrs.id])
+		matched += tmp + ';';
+	return matched;
+}
+module.exports = CssHandler;
+
+function parser(data, init) {
+	this.data = data;
+	this.floor = 0;
+	this.i = 0;
+	this.list = [];
+	this.res = init;
+	this.state = this.Space;
+}
+parser.prototype.parse = function() {
+	for (var c; c = this.data[this.i]; this.i++)
+		this.state(c);
+	return this.res;
+}
+parser.prototype.section = function() {
+	return this.data.substring(this.start, this.i);
+}
+// 鐘舵�佹満
+parser.prototype.Space = function(c) {
+	if (c == '.' || c == '#' || isLetter(c)) {
+		this.start = this.i;
+		this.state = this.Name;
+	} else if (c == '/' && this.data[this.i + 1] == '*')
+		this.Comment();
+	else if (!cfg.blankChar[c] && c != ';')
+		this.state = this.Ignore;
+}
+parser.prototype.Comment = function() {
+	this.i = this.data.indexOf('*/', this.i) + 1;
+	if (!this.i) this.i = this.data.length;
+	this.state = this.Space;
+}
+parser.prototype.Ignore = function(c) {
+	if (c == '{') this.floor++;
+	else if (c == '}' && !--this.floor) {
+		this.list = [];
+		this.state = this.Space;
+	}
+}
+parser.prototype.Name = function(c) {
+	if (cfg.blankChar[c]) {
+		this.list.push(this.section());
+		this.state = this.NameSpace;
+	} else if (c == '{') {
+		this.list.push(this.section());
+		this.Content();
+	} else if (c == ',') {
+		this.list.push(this.section());
+		this.Comma();
+	} else if (!isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')
+		this.state = this.Ignore;
+}
+parser.prototype.NameSpace = function(c) {
+	if (c == '{') this.Content();
+	else if (c == ',') this.Comma();
+	else if (!cfg.blankChar[c]) this.state = this.Ignore;
+}
+parser.prototype.Comma = function() {
+	while (cfg.blankChar[this.data[++this.i]]);
+	if (this.data[this.i] == '{') this.Content();
+	else {
+		this.start = this.i--;
+		this.state = this.Name;
+	}
+}
+parser.prototype.Content = function() {
+	this.start = ++this.i;
+	if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;
+	var content = this.section();
+	for (var i = 0, item; item = this.list[i++];)
+		if (this.res[item]) this.res[item] += ';' + content;
+		else this.res[item] = content;
+	this.list = [];
+	this.state = this.Space;
+}
diff --git a/uview-ui/components/u-parse/libs/MpHtmlParser.js b/uview-ui/components/u-parse/libs/MpHtmlParser.js
new file mode 100644
index 0000000..aeb0fc3
--- /dev/null
+++ b/uview-ui/components/u-parse/libs/MpHtmlParser.js
@@ -0,0 +1,580 @@
+/**
+ * html 瑙f瀽鍣�
+ * @tutorial https://github.com/jin-yufeng/Parser
+ * @version 20201029
+ * @author JinYufeng
+ * @listens MIT
+ */
+const cfg = require('./config.js'),
+	blankChar = cfg.blankChar,
+	CssHandler = require('./CssHandler.js'),
+	windowWidth = uni.getSystemInfoSync().windowWidth;
+var emoji;
+
+function MpHtmlParser(data, options = {}) {
+	this.attrs = {};
+	this.CssHandler = new CssHandler(options.tagStyle, windowWidth);
+	this.data = data;
+	this.domain = options.domain;
+	this.DOM = [];
+	this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;
+	options.prot = (this.domain || '').includes('://') ? this.domain.split('://')[0] : 'http';
+	this.options = options;
+	this.state = this.Text;
+	this.STACK = [];
+	// 宸ュ叿鍑芥暟
+	this.bubble = () => {
+		for (var i = this.STACK.length, item; item = this.STACK[--i];) {
+			if (cfg.richOnlyTags[item.name]) return false;
+			item.c = 1;
+		}
+		return true;
+	}
+	this.decode = (val, amp) => {
+		var i = -1,
+			j, en;
+		while (1) {
+			if ((i = val.indexOf('&', i + 1)) == -1) break;
+			if ((j = val.indexOf(';', i + 2)) == -1) break;
+			if (val[i + 1] == '#') {
+				en = parseInt((val[i + 2] == 'x' ? '0' : '') + val.substring(i + 2, j));
+				if (!isNaN(en)) val = val.substr(0, i) + String.fromCharCode(en) + val.substr(j + 1);
+			} else {
+				en = val.substring(i + 1, j);
+				if (cfg.entities[en] || en == amp)
+					val = val.substr(0, i) + (cfg.entities[en] || '&') + val.substr(j + 1);
+			}
+		}
+		return val;
+	}
+	this.getUrl = url => {
+		if (url[0] == '/') {
+			if (url[1] == '/') url = this.options.prot + ':' + url;
+			else if (this.domain) url = this.domain + url;
+		} else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))
+			url = this.domain + '/' + url;
+		return url;
+	}
+	this.isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');
+	this.section = () => this.data.substring(this.start, this.i);
+	this.parent = () => this.STACK[this.STACK.length - 1];
+	this.siblings = () => this.STACK.length ? this.parent().children : this.DOM;
+}
+MpHtmlParser.prototype.parse = function() {
+	if (emoji) this.data = emoji.parseEmoji(this.data);
+	for (var c; c = this.data[this.i]; this.i++)
+		this.state(c);
+	if (this.state == this.Text) this.setText();
+	while (this.STACK.length) this.popNode(this.STACK.pop());
+	return this.DOM;
+}
+// 璁剧疆灞炴��
+MpHtmlParser.prototype.setAttr = function() {
+	var name = this.attrName.toLowerCase(),
+		val = this.attrVal;
+	if (cfg.boolAttrs[name]) this.attrs[name] = 'T';
+	else if (val) {
+		if (name == 'src' || (name == 'data-src' && !this.attrs.src)) this.attrs.src = this.getUrl(this.decode(val, 'amp'));
+		else if (name == 'href' || name == 'style') this.attrs[name] = this.decode(val, 'amp');
+		else if (name.substr(0, 5) != 'data-') this.attrs[name] = val;
+	}
+	this.attrVal = '';
+	while (blankChar[this.data[this.i]]) this.i++;
+	if (this.isClose()) this.setNode();
+	else {
+		this.start = this.i;
+		this.state = this.AttrName;
+	}
+}
+// 璁剧疆鏂囨湰鑺傜偣
+MpHtmlParser.prototype.setText = function() {
+	var back, text = this.section();
+	if (!text) return;
+	text = (cfg.onText && cfg.onText(text, () => back = true)) || text;
+	if (back) {
+		this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);
+		let j = this.start + text.length;
+		for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);
+		return;
+	}
+	if (!this.pre) {
+		// 鍚堝苟绌虹櫧绗�
+		var flag, tmp = [];
+		for (let i = text.length, c; c = text[--i];)
+			if (!blankChar[c]) {
+				tmp.unshift(c);
+				if (!flag) flag = 1;
+			} else {
+				if (tmp[0] != ' ') tmp.unshift(' ');
+				if (c == '\n' && flag == void 0) flag = 0;
+			}
+		if (flag == 0) return;
+		text = tmp.join('');
+	}
+	this.siblings().push({
+		type: 'text',
+		text: this.decode(text)
+	});
+}
+// 璁剧疆鍏冪礌鑺傜偣
+MpHtmlParser.prototype.setNode = function() {
+	var node = {
+			name: this.tagName.toLowerCase(),
+			attrs: this.attrs
+		},
+		close = cfg.selfClosingTags[node.name];
+	if (this.options.nodes.length) node.type = 'node';
+	this.attrs = {};
+	if (!cfg.ignoreTags[node.name]) {
+		// 澶勭悊灞炴��
+		var attrs = node.attrs,
+			style = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''),
+			styleObj = {};
+		if (attrs.id) {
+			if (this.options.compress & 1) attrs.id = void 0;
+			else if (this.options.useAnchor) this.bubble();
+		}
+		if ((this.options.compress & 2) && attrs.class) attrs.class = void 0;
+		switch (node.name) {
+			case 'a':
+			case 'ad': // #ifdef APP-PLUS
+			case 'iframe':
+				// #endif
+				this.bubble();
+				break;
+			case 'font':
+				if (attrs.color) {
+					styleObj['color'] = attrs.color;
+					attrs.color = void 0;
+				}
+				if (attrs.face) {
+					styleObj['font-family'] = attrs.face;
+					attrs.face = void 0;
+				}
+				if (attrs.size) {
+					var size = parseInt(attrs.size);
+					if (size < 1) size = 1;
+					else if (size > 7) size = 7;
+					var map = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];
+					styleObj['font-size'] = map[size - 1];
+					attrs.size = void 0;
+				}
+				break;
+			case 'embed':
+				// #ifndef APP-PLUS
+				var src = node.attrs.src || '',
+					type = node.attrs.type || '';
+				if (type.includes('video') || src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8'))
+					node.name = 'video';
+				else if (type.includes('audio') || src.includes('.m4a') || src.includes('.wav') || src.includes('.mp3') || src.includes(
+						'.aac'))
+					node.name = 'audio';
+				else break;
+				if (node.attrs.autostart)
+					node.attrs.autoplay = 'T';
+				node.attrs.controls = 'T';
+				// #endif
+				// #ifdef APP-PLUS
+				this.bubble();
+				break;
+				// #endif
+			case 'video':
+			case 'audio':
+				if (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]);
+				else this[`${node.name}Num`]++;
+				if (node.name == 'video') {
+					if (this.videoNum > 3)
+						node.lazyLoad = 1;
+					if (attrs.width) {
+						styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px');
+						attrs.width = void 0;
+					}
+					if (attrs.height) {
+						styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px');
+						attrs.height = void 0;
+					}
+				}
+				if (!attrs.controls && !attrs.autoplay) attrs.controls = 'T';
+				attrs.source = [];
+				if (attrs.src) {
+					attrs.source.push(attrs.src);
+					attrs.src = void 0;
+				}
+				this.bubble();
+				break;
+			case 'td':
+			case 'th':
+				if (attrs.colspan || attrs.rowspan)
+					for (var k = this.STACK.length, item; item = this.STACK[--k];)
+						if (item.name == 'table') {
+							item.flag = 1;
+							break;
+						}
+		}
+		if (attrs.align) {
+			if (node.name == 'table') {
+				if (attrs.align == 'center') styleObj['margin-inline-start'] = styleObj['margin-inline-end'] = 'auto';
+				else styleObj['float'] = attrs.align;
+			} else styleObj['text-align'] = attrs.align;
+			attrs.align = void 0;
+		}
+		// 鍘嬬缉 style
+		var styles = style.split(';');
+		style = '';
+		for (var i = 0, len = styles.length; i < len; i++) {
+			var info = styles[i].split(':');
+			if (info.length < 2) continue;
+			let key = info[0].trim().toLowerCase(),
+				value = info.slice(1).join(':').trim();
+			if (value[0] == '-' || value.includes('safe'))
+				style += `;${key}:${value}`;
+			else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import'))
+				styleObj[key] = value;
+		}
+		if (node.name == 'img') {
+			if (attrs.src && !attrs.ignore) {
+				if (this.bubble())
+					attrs.i = (this.imgNum++).toString();
+				else attrs.ignore = 'T';
+			}
+			if (attrs.ignore) {
+				style += ';-webkit-touch-callout:none';
+				styleObj['max-width'] = '100%';
+			}
+			var width;
+			if (styleObj.width) width = styleObj.width;
+			else if (attrs.width) width = attrs.width.includes('%') ? attrs.width : parseFloat(attrs.width) + 'px';
+			if (width) {
+				styleObj.width = width;
+				attrs.width = '100%';
+				if (parseInt(width) > windowWidth) {
+					styleObj.height = '';
+					if (attrs.height) attrs.height = void 0;
+				}
+			}
+			if (styleObj.height) {
+				attrs.height = styleObj.height;
+				styleObj.height = '';
+			} else if (attrs.height && !attrs.height.includes('%'))
+				attrs.height = parseFloat(attrs.height) + 'px';
+		}
+		for (var key in styleObj) {
+			var value = styleObj[key];
+			if (!value) continue;
+			if (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1;
+			// 濉厖閾炬帴
+			if (value.includes('url')) {
+				var j = value.indexOf('(');
+				if (j++ != -1) {
+					while (value[j] == '"' || value[j] == "'" || blankChar[value[j]]) j++;
+					value = value.substr(0, j) + this.getUrl(value.substr(j));
+				}
+			}
+			// 杞崲 rpx
+			else if (value.includes('rpx'))
+				value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px');
+			else if (key == 'white-space' && value.includes('pre') && !close)
+				this.pre = node.pre = true;
+			style += `;${key}:${value}`;
+		}
+		style = style.substr(1);
+		if (style) attrs.style = style;
+		if (!close) {
+			node.children = [];
+			if (node.name == 'pre' && cfg.highlight) {
+				this.remove(node);
+				this.pre = node.pre = true;
+			}
+			this.siblings().push(node);
+			this.STACK.push(node);
+		} else if (!cfg.filter || cfg.filter(node, this) != false)
+			this.siblings().push(node);
+	} else {
+		if (!close) this.remove(node);
+		else if (node.name == 'source') {
+			var parent = this.parent();
+			if (parent && (parent.name == 'video' || parent.name == 'audio') && node.attrs.src)
+				parent.attrs.source.push(node.attrs.src);
+		} else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;
+	}
+	if (this.data[this.i] == '/') this.i++;
+	this.start = this.i + 1;
+	this.state = this.Text;
+}
+// 绉婚櫎鏍囩
+MpHtmlParser.prototype.remove = function(node) {
+	var name = node.name,
+		j = this.i;
+	// 澶勭悊 svg
+	var handleSvg = () => {
+		var src = this.data.substring(j, this.i + 1);
+		node.attrs.xmlns = 'http://www.w3.org/2000/svg';
+		for (var key in node.attrs) {
+			if (key == 'viewbox') src = ` viewBox="${node.attrs.viewbox}"` + src;
+			else if (key != 'style') src = ` ${key}="${node.attrs[key]}"` + src;
+		}
+		src = '<svg' + src;
+		var parent = this.parent();
+		if (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline'))
+			parent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style;
+		this.siblings().push({
+			name: 'img',
+			attrs: {
+				src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+				style: node.attrs.style,
+				ignore: 'T'
+			}
+		})
+	}
+	if (node.name == 'svg' && this.data[j] == '/') return handleSvg(this.i++);
+	while (1) {
+		if ((this.i = this.data.indexOf('</', this.i + 1)) == -1) {
+			if (name == 'pre' || name == 'svg') this.i = j;
+			else this.i = this.data.length;
+			return;
+		}
+		this.start = (this.i += 2);
+		while (!blankChar[this.data[this.i]] && !this.isClose()) this.i++;
+		if (this.section().toLowerCase() == name) {
+			// 浠g爜鍧楅珮浜�
+			if (name == 'pre') {
+				this.data = this.data.substr(0, j + 1) + cfg.highlight(this.data.substring(j + 1, this.i - 5), node.attrs) + this.data
+					.substr(this.i - 5);
+				return this.i = j;
+			} else if (name == 'style')
+				this.CssHandler.getStyle(this.data.substring(j + 1, this.i - 7));
+			else if (name == 'title')
+				this.DOM.title = this.data.substring(j + 1, this.i - 7);
+			if ((this.i = this.data.indexOf('>', this.i)) == -1) this.i = this.data.length;
+			if (name == 'svg') handleSvg();
+			return;
+		}
+	}
+}
+// 鑺傜偣鍑烘爤澶勭悊
+MpHtmlParser.prototype.popNode = function(node) {
+	// 绌虹櫧绗﹀鐞�
+	if (node.pre) {
+		node.pre = this.pre = void 0;
+		for (let i = this.STACK.length; i--;)
+			if (this.STACK[i].pre)
+				this.pre = true;
+	}
+	var siblings = this.siblings(),
+		len = siblings.length,
+		childs = node.children;
+	if (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false))
+		return siblings.pop();
+	var attrs = node.attrs;
+	// 鏇挎崲涓�浜涙爣绛惧悕
+	if (cfg.blockTags[node.name]) node.name = 'div';
+	else if (!cfg.trustTags[node.name]) node.name = 'span';
+	// 澶勭悊鍒楄〃
+	if (node.c && (node.name == 'ul' || node.name == 'ol')) {
+		if ((node.attrs.style || '').includes('list-style:none')) {
+			for (let i = 0, child; child = childs[i++];)
+				if (child.name == 'li')
+					child.name = 'div';
+		} else if (node.name == 'ul') {
+			var floor = 1;
+			for (let i = this.STACK.length; i--;)
+				if (this.STACK[i].name == 'ul') floor++;
+			if (floor != 1)
+				for (let i = childs.length; i--;)
+					childs[i].floor = floor;
+		} else {
+			for (let i = 0, num = 1, child; child = childs[i++];)
+				if (child.name == 'li') {
+					child.type = 'ol';
+					child.num = ((num, type) => {
+						if (type == 'a') return String.fromCharCode(97 + (num - 1) % 26);
+						if (type == 'A') return String.fromCharCode(65 + (num - 1) % 26);
+						if (type == 'i' || type == 'I') {
+							num = (num - 1) % 99 + 1;
+							var one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
+								ten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
+								res = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || '');
+							if (type == 'i') return res.toLowerCase();
+							return res;
+						}
+						return num;
+					})(num++, attrs.type) + '.';
+				}
+		}
+	}
+	// 澶勭悊琛ㄦ牸
+	if (node.name == 'table') {
+		var padding = parseFloat(attrs.cellpadding),
+			spacing = parseFloat(attrs.cellspacing),
+			border = parseFloat(attrs.border);
+		if (node.c) {
+			if (isNaN(padding)) padding = 2;
+			if (isNaN(spacing)) spacing = 2;
+		}
+		if (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`;
+		if (node.flag && node.c) {
+			// 鏈� colspan 鎴� rowspan 涓斿惈鏈夐摼鎺ョ殑琛ㄦ牸杞负 grid 甯冨眬瀹炵幇
+			attrs.style = `${attrs.style || ''};${spacing ? `;grid-gap:${spacing}px` : ';border-left:0;border-top:0'}`;
+			var row = 1,
+				col = 1,
+				colNum,
+				trs = [],
+				children = [],
+				map = {};
+			(function f(ns) {
+				for (var i = 0; i < ns.length; i++) {
+					if (ns[i].name == 'tr') trs.push(ns[i]);
+					else f(ns[i].children || []);
+				}
+			})(node.children)
+			for (let i = 0; i < trs.length; i++) {
+				for (let j = 0, td; td = trs[i].children[j]; j++) {
+					if (td.name == 'td' || td.name == 'th') {
+						while (map[row + '.' + col]) col++;
+						var cell = {
+							name: 'div',
+							c: 1,
+							attrs: {
+								style: (td.attrs.style || '') + (border ? `;border:${border}px solid gray` + (spacing ? '' :
+									';border-right:0;border-bottom:0') : '') + (padding ? `;padding:${padding}px` : '')
+							},
+							children: td.children
+						}
+						if (td.attrs.colspan) {
+							cell.attrs.style += ';grid-column-start:' + col + ';grid-column-end:' + (col + parseInt(td.attrs.colspan));
+							if (!td.attrs.rowspan) cell.attrs.style += ';grid-row-start:' + row + ';grid-row-end:' + (row + 1);
+							col += parseInt(td.attrs.colspan) - 1;
+						}
+						if (td.attrs.rowspan) {
+							cell.attrs.style += ';grid-row-start:' + row + ';grid-row-end:' + (row + parseInt(td.attrs.rowspan));
+							if (!td.attrs.colspan) cell.attrs.style += ';grid-column-start:' + col + ';grid-column-end:' + (col + 1);
+							for (var k = 1; k < td.attrs.rowspan; k++) map[(row + k) + '.' + col] = 1;
+						}
+						children.push(cell);
+						col++;
+					}
+				}
+				if (!colNum) {
+					colNum = col - 1;
+					attrs.style += `;grid-template-columns:repeat(${colNum},auto)`
+				}
+				col = 1;
+				row++;
+			}
+			node.children = children;
+		} else {
+			attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`;
+			if (border || padding)
+				(function f(ns) {
+					for (var i = 0, n; n = ns[i]; i++) {
+						if (n.name == 'th' || n.name == 'td') {
+							if (border) n.attrs.style = `border:${border}px solid gray;${n.attrs.style || ''}`;
+							if (padding) n.attrs.style = `padding:${padding}px;${n.attrs.style || ''}`;
+						} else f(n.children || []);
+					}
+				})(childs)
+		}
+		if (this.options.autoscroll) {
+			var table = Object.assign({}, node);
+			node.name = 'div';
+			node.attrs = {
+				style: 'overflow:scroll'
+			}
+			node.children = [table];
+		}
+	}
+	this.CssHandler.pop && this.CssHandler.pop(node);
+	// 鑷姩鍘嬬缉
+	if (node.name == 'div' && !Object.keys(attrs).length && childs.length == 1 && childs[0].name == 'div')
+		siblings[len - 1] = childs[0];
+}
+// 鐘舵�佹満
+MpHtmlParser.prototype.Text = function(c) {
+	if (c == '<') {
+		var next = this.data[this.i + 1],
+			isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+		if (isLetter(next)) {
+			this.setText();
+			this.start = this.i + 1;
+			this.state = this.TagName;
+		} else if (next == '/') {
+			this.setText();
+			if (isLetter(this.data[++this.i + 1])) {
+				this.start = this.i + 1;
+				this.state = this.EndTag;
+			} else this.Comment();
+		} else if (next == '!' || next == '?') {
+			this.setText();
+			this.Comment();
+		}
+	}
+}
+MpHtmlParser.prototype.Comment = function() {
+	var key;
+	if (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->';
+	else if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>';
+	else key = '>';
+	if ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length;
+	else this.i += key.length - 1;
+	this.start = this.i + 1;
+	this.state = this.Text;
+}
+MpHtmlParser.prototype.TagName = function(c) {
+	if (blankChar[c]) {
+		this.tagName = this.section();
+		while (blankChar[this.data[this.i]]) this.i++;
+		if (this.isClose()) this.setNode();
+		else {
+			this.start = this.i;
+			this.state = this.AttrName;
+		}
+	} else if (this.isClose()) {
+		this.tagName = this.section();
+		this.setNode();
+	}
+}
+MpHtmlParser.prototype.AttrName = function(c) {
+	if (c == '=' || blankChar[c] || this.isClose()) {
+		this.attrName = this.section();
+		if (blankChar[c])
+			while (blankChar[this.data[++this.i]]);
+		if (this.data[this.i] == '=') {
+			while (blankChar[this.data[++this.i]]);
+			this.start = this.i--;
+			this.state = this.AttrValue;
+		} else this.setAttr();
+	}
+}
+MpHtmlParser.prototype.AttrValue = function(c) {
+	if (c == '"' || c == "'") {
+		this.start++;
+		if ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length;
+		this.attrVal = this.section();
+		this.i++;
+	} else {
+		for (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++);
+		this.attrVal = this.section();
+	}
+	this.setAttr();
+}
+MpHtmlParser.prototype.EndTag = function(c) {
+	if (blankChar[c] || c == '>' || c == '/') {
+		var name = this.section().toLowerCase();
+		for (var i = this.STACK.length; i--;)
+			if (this.STACK[i].name == name) break;
+		if (i != -1) {
+			var node;
+			while ((node = this.STACK.pop()).name != name) this.popNode(node);
+			this.popNode(node);
+		} else if (name == 'p' || name == 'br')
+			this.siblings().push({
+				name,
+				attrs: {}
+			});
+		this.i = this.data.indexOf('>', this.i);
+		this.start = this.i + 1;
+		if (this.i == -1) this.i = this.data.length;
+		else this.state = this.Text;
+	}
+}
+module.exports = MpHtmlParser;
diff --git a/uview-ui/components/u-parse/libs/config.js b/uview-ui/components/u-parse/libs/config.js
new file mode 100644
index 0000000..1f772e9
--- /dev/null
+++ b/uview-ui/components/u-parse/libs/config.js
@@ -0,0 +1,80 @@
+/* 閰嶇疆鏂囦欢 */
+var cfg = {
+	// 鍑洪敊鍗犱綅鍥�
+	errorImg: null,
+	// 杩囨护鍣ㄥ嚱鏁�
+	filter: null,
+	// 浠g爜楂樹寒鍑芥暟
+	highlight: null,
+	// 鏂囨湰澶勭悊鍑芥暟
+	onText: null,
+	// 瀹炰綋缂栫爜鍒楄〃
+	entities: {
+		quot: '"',
+		apos: "'",
+		semi: ';',
+		nbsp: '\xA0',
+		ensp: '\u2002',
+		emsp: '\u2003',
+		ndash: '鈥�',
+		mdash: '鈥�',
+		middot: '路',
+		lsquo: '鈥�',
+		rsquo: '鈥�',
+		ldquo: '鈥�',
+		rdquo: '鈥�',
+		bull: '鈥�',
+		hellip: '鈥�'
+	},
+	blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'),
+	boolAttrs: makeMap('allowfullscreen,autoplay,autostart,controls,ignore,loop,muted'),
+	// 鍧楃骇鏍囩锛屽皢琚浆涓� div
+	blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
+	// 灏嗚绉婚櫎鐨勬爣绛�
+	ignoreTags: makeMap('area,base,canvas,frame,iframe,input,link,map,meta,param,script,source,style,svg,textarea,title,track,wbr'),
+	// 鍙兘琚� rich-text 鏄剧ず鐨勬爣绛�
+	richOnlyTags: makeMap('a,colgroup,fieldset,legend'),
+	// 鑷棴鍚堢殑鏍囩
+	selfClosingTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
+	// 淇′换鐨勬爣绛�
+	trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
+	// 榛樿鐨勬爣绛炬牱寮�
+	userAgentStyles: {
+		address: 'font-style:italic',
+		big: 'display:inline;font-size:1.2em',
+		blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px',
+		caption: 'display:table-caption;text-align:center',
+		center: 'text-align:center',
+		cite: 'font-style:italic',
+		dd: 'margin-left:40px',
+		mark: 'background-color:yellow',
+		pre: 'font-family:monospace;white-space:pre;overflow:scroll',
+		s: 'text-decoration:line-through',
+		small: 'display:inline;font-size:0.8em',
+		u: 'text-decoration:underline'
+	}
+}
+
+function makeMap(str) {
+	var map = Object.create(null),
+		list = str.split(',');
+	for (var i = list.length; i--;)
+		map[list[i]] = true;
+	return map;
+}
+
+// #ifdef MP-WEIXIN
+if (wx.canIUse('editor')) {
+	cfg.blockTags.pre = void 0;
+	cfg.ignoreTags.rp = true;
+	Object.assign(cfg.richOnlyTags, makeMap('bdi,bdo,caption,rt,ruby'));
+	Object.assign(cfg.trustTags, makeMap('bdi,bdo,caption,pre,rt,ruby'));
+}
+// #endif
+
+// #ifdef APP-PLUS
+cfg.ignoreTags.iframe = void 0;
+Object.assign(cfg.trustTags, makeMap('embed,iframe'));
+// #endif
+
+module.exports = cfg;
diff --git a/uview-ui/components/u-parse/libs/handler.wxs b/uview-ui/components/u-parse/libs/handler.wxs
new file mode 100644
index 0000000..d3b1aaa
--- /dev/null
+++ b/uview-ui/components/u-parse/libs/handler.wxs
@@ -0,0 +1,22 @@
+var inline = {
+	abbr: 1,
+	b: 1,
+	big: 1,
+	code: 1,
+	del: 1,
+	em: 1,
+	i: 1,
+	ins: 1,
+	label: 1,
+	q: 1,
+	small: 1,
+	span: 1,
+	strong: 1,
+	sub: 1,
+	sup: 1
+}
+module.exports = {
+	use: function(item) {
+		return !item.c && !inline[item.name] && (item.attrs.style || '').indexOf('display:inline') == -1
+	}
+}
diff --git a/uview-ui/components/u-parse/libs/trees.vue b/uview-ui/components/u-parse/libs/trees.vue
new file mode 100644
index 0000000..2b24820
--- /dev/null
+++ b/uview-ui/components/u-parse/libs/trees.vue
@@ -0,0 +1,505 @@
+<template>
+	<view :class="'interlayer '+(c||'')" :style="s">
+		<block v-for="(n, i) in nodes" v-bind:key="i">
+			<!--鍥剧墖-->
+			<view v-if="n.name=='img'" :class="'_img '+n.attrs.class" :style="n.attrs.style" :data-attrs="n.attrs" @tap.stop="imgtap">
+				<rich-text v-if="ctrl[i]!=0" :nodes="[{attrs:{src:loading&&(ctrl[i]||0)<2?loading:(lazyLoad&&!ctrl[i]?placeholder:(ctrl[i]==3?errorImg:n.attrs.src||'')),alt:n.attrs.alt||'',width:n.attrs.width||'',style:'-webkit-touch-callout:none;max-width:100%;display:block'+(n.attrs.height?';height:'+n.attrs.height:'')},name:'img'}]" />
+				<image class="_image" :src="lazyLoad&&!ctrl[i]?placeholder:n.attrs.src" :lazy-load="lazyLoad"
+				 :show-menu-by-longpress="!n.attrs.ignore" :data-i="i" :data-index="n.attrs.i" data-source="img" @load="loadImg"
+				 @error="error" />
+			</view>
+			<!--鏂囨湰-->
+			<text v-else-if="n.type=='text'" decode>{{n.text}}</text>
+			<!--#ifndef MP-BAIDU-->
+			<text v-else-if="n.name=='br'">\n</text>
+			<!--#endif-->
+			<!--瑙嗛-->
+			<view v-else-if="((n.lazyLoad&&!n.attrs.autoplay)||(n.name=='video'&&!loadVideo))&&ctrl[i]==undefined" :id="n.attrs.id"
+			 :class="'_video '+(n.attrs.class||'')" :style="n.attrs.style" :data-i="i" @tap.stop="_loadVideo" />
+			<video v-else-if="n.name=='video'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay||ctrl[i]==0"
+			 :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :poster="n.attrs.poster" :src="n.attrs.source[ctrl[i]||0]"
+			 :unit-id="n.attrs['unit-id']" :data-id="n.attrs.id" :data-i="i" data-source="video" @error="error" @play="play" />
+			<!--闊抽-->
+			<audio v-else-if="n.name=='audio'" :ref="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author"
+			 :autoplay="n.attrs.autoplay" :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster"
+			 :src="n.attrs.source[ctrl[i]||0]" :data-i="i" :data-id="n.attrs.id" data-source="audio" @error.native="error"
+			 @play.native="play" />
+			<!--閾炬帴-->
+			<view v-else-if="n.name=='a'" :id="n.attrs.id" :class="'_a '+(n.attrs.class||'')" hover-class="_hover" :style="n.attrs.style"
+			 :data-attrs="n.attrs" @tap.stop="linkpress">
+				<trees class="_span" c="_span" :nodes="n.children" />
+			</view>
+			<!--骞垮憡-->
+			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :unit-id="n.attrs['unit-id']" :appid="n.attrs.appid" :apid="n.attrs.apid" :type="n.attrs.type" :adpid="n.attrs.adpid" data-source="ad" @error="error" />-->
+			<!--鍒楄〃-->
+			<view v-else-if="n.name=='li'" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:flex;flex-direction:row'">
+				<view v-if="n.type=='ol'" class="_ol-bef">{{n.num}}</view>
+				<view v-else class="_ul-bef">
+					<view v-if="n.floor%3==0" class="_ul-p1">鈻�</view>
+					<view v-else-if="n.floor%3==2" class="_ul-p2" />
+					<view v-else class="_ul-p1" style="border-radius:50%">鈻�</view>
+				</view>
+				<trees class="_li" c="_li" :nodes="n.children" :lazyLoad="lazyLoad" :loading="loading" />
+			</view>
+			<!--琛ㄦ牸-->
+			<view v-else-if="n.name=='table'&&n.c&&n.flag" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:grid'">
+				<trees v-for="(cell,n) in n.children" v-bind:key="n" :class="cell.attrs.class" :c="cell.attrs.class" :style="cell.attrs.style"
+				 :s="cell.attrs.style" :nodes="cell.children" />
+			</view>
+			<view v-else-if="n.name=='table'&&n.c" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:table'">
+				<view v-for="(tbody, o) in n.children" v-bind:key="o" :class="tbody.attrs.class" :style="(tbody.attrs.style||'')+(tbody.name[0]=='t'?';display:table-'+(tbody.name=='tr'?'row':'row-group'):'')">
+					<view v-for="(tr, p) in tbody.children" v-bind:key="p" :class="tr.attrs.class" :style="(tr.attrs.style||'')+(tr.name[0]=='t'?';display:table-'+(tr.name=='tr'?'row':'cell'):'')">
+						<trees v-if="tr.name=='td'" :nodes="tr.children" />
+						<trees v-else v-for="(td, q) in tr.children" v-bind:key="q" :class="td.attrs.class" :c="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')"
+						 :s="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')" :nodes="td.children" />
+					</view>
+				</view>
+			</view>
+			<!--#ifdef APP-PLUS-->
+			<iframe v-else-if="n.name=='iframe'" :style="n.attrs.style" :allowfullscreen="n.attrs.allowfullscreen" :frameborder="n.attrs.frameborder"
+			 :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
+			<embed v-else-if="n.name=='embed'" :style="n.attrs.style" :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
+			<!--#endif-->
+			<!--瀵屾枃鏈�-->
+			<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="handler.use(n)" :id="n.attrs.id" :class="'_p __'+n.name" :nodes="[n]" />
+			<!--#endif-->
+			<!--#ifndef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="!n.c" :id="n.attrs.id" :nodes="[n]" style="display:inline" />
+			<!--#endif-->
+			<trees v-else :class="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')" :c="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')"
+			 :style="n.attrs.style" :s="n.attrs.style" :nodes="n.children" :lazyLoad="lazyLoad" :loading="loading" />
+		</block>
+	</view>
+</template>
+<script module="handler" lang="wxs" src="./handler.wxs"></script>
+<script>
+	global.Parser = {};
+	import trees from './trees'
+	const errorImg = require('../libs/config.js').errorImg;
+	export default {
+		components: {
+			trees
+		},
+		name: 'trees',
+		data() {
+			return {
+				ctrl: [],
+				placeholder: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="300" height="225"/>',
+				errorImg,
+				loadVideo: typeof plus == 'undefined',
+				// #ifndef MP-ALIPAY
+				c: '',
+				s: ''
+				// #endif
+			}
+		},
+		props: {
+			nodes: Array,
+			lazyLoad: Boolean,
+			loading: String,
+			// #ifdef MP-ALIPAY
+			c: String,
+			s: String
+			// #endif
+		},
+		mounted() {
+			for (this.top = this.$parent; this.top.$options.name != 'parser'; this.top = this.top.$parent);
+			this.init();
+		},
+		// #ifdef APP-PLUS
+		beforeDestroy() {
+			this.observer && this.observer.disconnect();
+		},
+		// #endif
+		methods: {
+			init() {
+				for (var i = this.nodes.length, n; n = this.nodes[--i];) {
+					if (n.name == 'img') {
+						this.top.imgList.setItem(n.attrs.i, n.attrs['original-src'] || n.attrs.src);
+						// #ifdef APP-PLUS
+						if (this.lazyLoad && !this.observer) {
+							this.observer = uni.createIntersectionObserver(this).relativeToViewport({
+								top: 500,
+								bottom: 500
+							});
+							setTimeout(() => {
+								this.observer.observe('._img', res => {
+									if (res.intersectionRatio) {
+										for (var j = this.nodes.length; j--;)
+											if (this.nodes[j].name == 'img')
+												this.$set(this.ctrl, j, 1);
+										this.observer.disconnect();
+									}
+								})
+							}, 0)
+						}
+						// #endif
+					} else if (n.name == 'video' || n.name == 'audio') {
+						var ctx;
+						if (n.name == 'video') {
+							ctx = uni.createVideoContext(n.attrs.id
+								// #ifndef MP-BAIDU
+								, this
+								// #endif
+							);
+						} else if (this.$refs[n.attrs.id])
+							ctx = this.$refs[n.attrs.id][0];
+						if (ctx) {
+							ctx.id = n.attrs.id;
+							this.top.videoContexts.push(ctx);
+						}
+					}
+				}
+				// #ifdef APP-PLUS
+				// APP 涓婇伩鍏� video 閿欎綅闇�瑕佸欢鏃舵覆鏌�
+				setTimeout(() => {
+					this.loadVideo = true;
+				}, 1000)
+				// #endif
+			},
+			play(e) {
+				var contexts = this.top.videoContexts;
+				if (contexts.length > 1 && this.top.autopause)
+					for (var i = contexts.length; i--;)
+						if (contexts[i].id != e.currentTarget.dataset.id)
+							contexts[i].pause();
+			},
+			imgtap(e) {
+				var attrs = e.currentTarget.dataset.attrs;
+				if (!attrs.ignore) {
+					var preview = true,
+						data = {
+							id: e.target.id,
+							src: attrs.src,
+							ignore: () => preview = false
+						};
+					global.Parser.onImgtap && global.Parser.onImgtap(data);
+					this.top.$emit('imgtap', data);
+					if (preview) {
+						var urls = this.top.imgList,
+							current = urls[attrs.i] ? parseInt(attrs.i) : (urls = [attrs.src], 0);
+						uni.previewImage({
+							current,
+							urls
+						})
+					}
+				}
+			},
+			loadImg(e) {
+				var i = e.currentTarget.dataset.i;
+				if (this.lazyLoad && !this.ctrl[i]) {
+					// #ifdef QUICKAPP-WEBVIEW
+					this.$set(this.ctrl, i, 0);
+					this.$nextTick(function() {
+						// #endif
+						// #ifndef APP-PLUS
+						this.$set(this.ctrl, i, 1);
+						// #endif
+						// #ifdef QUICKAPP-WEBVIEW
+					})
+					// #endif
+				} else if (this.loading && this.ctrl[i] != 2) {
+					// #ifdef QUICKAPP-WEBVIEW
+					this.$set(this.ctrl, i, 0);
+					this.$nextTick(function() {
+						// #endif
+						this.$set(this.ctrl, i, 2);
+						// #ifdef QUICKAPP-WEBVIEW
+					})
+					// #endif
+				}
+			},
+			linkpress(e) {
+				var jump = true,
+					attrs = e.currentTarget.dataset.attrs;
+				attrs.ignore = () => jump = false;
+				global.Parser.onLinkpress && global.Parser.onLinkpress(attrs);
+				this.top.$emit('linkpress', attrs);
+				if (jump) {
+					// #ifdef MP
+					if (attrs['app-id']) {
+						return uni.navigateToMiniProgram({
+							appId: attrs['app-id'],
+							path: attrs.path
+						})
+					}
+					// #endif
+					if (attrs.href) {
+						if (attrs.href[0] == '#') {
+							if (this.top.useAnchor)
+								this.top.navigateTo({
+									id: attrs.href.substring(1)
+								})
+						} else if (attrs.href.indexOf('http') == 0 || attrs.href.indexOf('//') == 0) {
+							// #ifdef APP-PLUS
+							plus.runtime.openWeb(attrs.href);
+							// #endif
+							// #ifndef APP-PLUS
+							uni.setClipboardData({
+								data: attrs.href,
+								success: () =>
+									uni.showToast({
+										title: '閾炬帴宸插鍒�'
+									})
+							})
+							// #endif
+						} else
+							uni.navigateTo({
+								url: attrs.href,
+								fail() {
+									uni.switchTab({
+										url: attrs.href,
+									})
+								}
+							})
+					}
+				}
+			},
+			error(e) {
+				var target = e.currentTarget,
+					source = target.dataset.source,
+					i = target.dataset.i;
+				if (source == 'video' || source == 'audio') {
+					// 鍔犺浇鍏朵粬 source
+					var index = this.ctrl[i] ? this.ctrl[i].i + 1 : 1;
+					if (index < this.nodes[i].attrs.source.length)
+						this.$set(this.ctrl, i, index);
+					if (e.detail.__args__)
+						e.detail = e.detail.__args__[0];
+				} else if (errorImg && source == 'img') {
+					this.top.imgList.setItem(target.dataset.index, errorImg);
+					this.$set(this.ctrl, i, 3);
+				}
+				this.top && this.top.$emit('error', {
+					source,
+					target,
+					errMsg: e.detail.errMsg
+				});
+			},
+			_loadVideo(e) {
+				this.$set(this.ctrl, e.target.dataset.i, 0);
+			}
+		}
+	}
+</script>
+
+<style>
+	/* 鍦ㄨ繖閲屽紩鍏ヨ嚜瀹氫箟鏍峰紡 */
+
+	/* 閾炬帴鍜屽浘鐗囨晥鏋� */
+	._a {
+		display: inline;
+		padding: 1.5px 0 1.5px 0;
+		color: #366092;
+		word-break: break-all;
+	}
+
+	._hover {
+		text-decoration: underline;
+		opacity: 0.7;
+	}
+
+	._img {
+		display: inline-block;
+		max-width: 100%;
+		overflow: hidden;
+	}
+
+	/* #ifdef MP-WEIXIN */
+	:host {
+		display: inline;
+	}
+
+	/* #endif */
+
+	/* #ifndef MP-ALIPAY || APP-PLUS */
+	.interlayer {
+		display: inherit;
+		flex-direction: inherit;
+		flex-wrap: inherit;
+		align-content: inherit;
+		align-items: inherit;
+		justify-content: inherit;
+		width: 100%;
+		white-space: inherit;
+	}
+
+	/* #endif */
+
+	._b,
+	._strong {
+		font-weight: bold;
+	}
+
+	/* #ifndef MP-ALIPAY */
+	._blockquote,
+	._div,
+	._p,
+	._ol,
+	._ul,
+	._li {
+		display: block;
+	}
+
+	/* #endif */
+
+	._code {
+		font-family: monospace;
+	}
+
+	._del {
+		text-decoration: line-through;
+	}
+
+	._em,
+	._i {
+		font-style: italic;
+	}
+
+	._h1 {
+		font-size: 2em;
+	}
+
+	._h2 {
+		font-size: 1.5em;
+	}
+
+	._h3 {
+		font-size: 1.17em;
+	}
+
+	._h5 {
+		font-size: 0.83em;
+	}
+
+	._h6 {
+		font-size: 0.67em;
+	}
+
+	._h1,
+	._h2,
+	._h3,
+	._h4,
+	._h5,
+	._h6 {
+		display: block;
+		font-weight: bold;
+	}
+
+	._image {
+		display: block;
+		width: 100%;
+		height: 360px;
+		margin-top: -360px;
+		opacity: 0;
+	}
+
+	._ins {
+		text-decoration: underline;
+	}
+
+	._li {
+		flex: 1;
+		width: 0;
+	}
+
+	._ol-bef {
+		width: 36px;
+		margin-right: 5px;
+		text-align: right;
+	}
+
+	._ul-bef {
+		display: block;
+		margin: 0 12px 0 23px;
+		line-height: normal;
+	}
+
+	._ol-bef,
+	._ul-bef {
+		flex: none;
+		user-select: none;
+	}
+
+	._ul-p1 {
+		display: inline-block;
+		width: 0.3em;
+		height: 0.3em;
+		overflow: hidden;
+		line-height: 0.3em;
+	}
+
+	._ul-p2 {
+		display: inline-block;
+		width: 0.23em;
+		height: 0.23em;
+		border: 0.05em solid black;
+		border-radius: 50%;
+	}
+
+	._q::before {
+		content: '"';
+	}
+
+	._q::after {
+		content: '"';
+	}
+
+	._sub {
+		font-size: smaller;
+		vertical-align: sub;
+	}
+
+	._sup {
+		font-size: smaller;
+		vertical-align: super;
+	}
+
+	/* #ifdef MP-ALIPAY || APP-PLUS || QUICKAPP-WEBVIEW */
+	._abbr,
+	._b,
+	._code,
+	._del,
+	._em,
+	._i,
+	._ins,
+	._label,
+	._q,
+	._span,
+	._strong,
+	._sub,
+	._sup {
+		display: inline;
+	}
+
+	/* #endif */
+
+	/* #ifdef MP-WEIXIN || MP-QQ */
+	.__bdo,
+	.__bdi,
+	.__ruby,
+	.__rt {
+		display: inline-block;
+	}
+
+	/* #endif */
+	._video {
+		position: relative;
+		display: inline-block;
+		width: 300px;
+		height: 225px;
+		background-color: black;
+	}
+
+	._video::after {
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		margin: -15px 0 0 -15px;
+		content: '';
+		border-color: transparent transparent transparent white;
+		border-style: solid;
+		border-width: 15px 0 15px 30px;
+	}
+</style>
diff --git a/uview-ui/components/u-parse/u-parse.vue b/uview-ui/components/u-parse/u-parse.vue
new file mode 100644
index 0000000..57a105e
--- /dev/null
+++ b/uview-ui/components/u-parse/u-parse.vue
@@ -0,0 +1,645 @@
+<template>
+	<view>
+		<slot v-if="!nodes.length" />
+		<!--#ifdef APP-PLUS-NVUE-->
+		<web-view id="_top" ref="web" :style="'margin-top:-2px;height:'+height+'px'" @onPostMessage="_message" />
+		<!--#endif-->
+		<!--#ifndef APP-PLUS-NVUE-->
+		<view id="_top" :style="showAm+(selectable?';user-select:text;-webkit-user-select:text':'')">
+			<!--#ifdef H5 || MP-360-->
+			<div :id="'rtf'+uid"></div>
+			<!--#endif-->
+			<!--#ifndef H5 || MP-360-->
+			<trees :nodes="nodes" :lazyLoad="lazyLoad" :loading="loadingImg" />
+			<!--#endif-->
+		</view>
+		<!--#endif-->
+	</view>
+</template>
+
+<script>
+	var search;
+	// #ifndef H5 || APP-PLUS-NVUE || MP-360
+	import trees from './libs/trees';
+	var cache = {},
+		// #ifdef MP-WEIXIN || MP-TOUTIAO
+		fs = uni.getFileSystemManager ? uni.getFileSystemManager() : null,
+		// #endif
+		Parser = require('./libs/MpHtmlParser.js');
+	var dom;
+	// 璁$畻 cache 鐨� key
+	function hash(str) {
+		for (var i = str.length, val = 5381; i--;)
+			val += (val << 5) + str.charCodeAt(i);
+		return val;
+	}
+	// #endif
+	// #ifdef H5 || APP-PLUS-NVUE || MP-360
+	var {
+		windowWidth,
+		platform
+	} = uni.getSystemInfoSync(),
+		cfg = require('./libs/config.js');
+	// #endif
+	// #ifdef APP-PLUS-NVUE
+	var weexDom = weex.requireModule('dom');
+	// #endif
+	/**
+	 * Parser 瀵屾枃鏈粍浠�
+	 * @tutorial https://github.com/jin-yufeng/Parser
+	 * @property {String} html 瀵屾枃鏈暟鎹�
+	 * @property {Boolean} autopause 鏄惁鍦ㄦ挱鏀句竴涓棰戞椂鑷姩鏆傚仠鍏朵粬瑙嗛
+	 * @property {Boolean} autoscroll 鏄惁鑷姩缁欐墍鏈夎〃鏍兼坊鍔犱竴涓粴鍔ㄥ眰
+	 * @property {Boolean} autosetTitle 鏄惁鑷姩灏� title 鏍囩涓殑鍐呭璁剧疆鍒伴〉闈㈡爣棰�
+	 * @property {Number} compress 鍘嬬缉绛夌骇
+	 * @property {String} domain 鍥剧墖銆佽棰戠瓑閾炬帴鐨勪富鍩熷悕
+	 * @property {Boolean} lazyLoad 鏄惁寮�鍚浘鐗囨噿鍔犺浇
+	 * @property {String} loadingImg 鍥剧墖鍔犺浇瀹屾垚鍓嶇殑鍗犱綅鍥�
+	 * @property {Boolean} selectable 鏄惁寮�鍚暱鎸夊鍒�
+	 * @property {Object} tagStyle 鏍囩鐨勯粯璁ゆ牱寮�
+	 * @property {Boolean} showWithAnimation 鏄惁浣跨敤娓愭樉鍔ㄧ敾
+	 * @property {Boolean} useAnchor 鏄惁浣跨敤閿氱偣
+	 * @property {Boolean} useCache 鏄惁缂撳瓨瑙f瀽缁撴灉
+	 * @event {Function} parse 瑙f瀽瀹屾垚浜嬩欢
+	 * @event {Function} load dom 鍔犺浇瀹屾垚浜嬩欢
+	 * @event {Function} ready 鎵�鏈夊浘鐗囧姞杞藉畬姣曚簨浠�
+	 * @event {Function} error 閿欒浜嬩欢
+	 * @event {Function} imgtap 鍥剧墖鐐瑰嚮浜嬩欢
+	 * @event {Function} linkpress 閾炬帴鐐瑰嚮浜嬩欢
+	 * @author JinYufeng
+	 * @version 20201029
+	 * @listens MIT
+	 */
+	export default {
+		name: 'parser',
+		data() {
+			return {
+				// #ifdef H5 || MP-360
+				uid: this._uid,
+				// #endif
+				// #ifdef APP-PLUS-NVUE
+				height: 1,
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				showAm: '',
+				// #endif
+				nodes: []
+			}
+		},
+		// #ifndef H5 || APP-PLUS-NVUE || MP-360
+		components: {
+			trees
+		},
+		// #endif
+		props: {
+			html: String,
+			autopause: {
+				type: Boolean,
+				default: true
+			},
+			autoscroll: Boolean,
+			autosetTitle: {
+				type: Boolean,
+				default: true
+			},
+			// #ifndef H5 || APP-PLUS-NVUE || MP-360
+			compress: Number,
+			loadingImg: String,
+			useCache: Boolean,
+			// #endif
+			domain: String,
+			lazyLoad: Boolean,
+			selectable: Boolean,
+			tagStyle: Object,
+			showWithAnimation: Boolean,
+			useAnchor: Boolean
+		},
+		watch: {
+			html(html) {
+				this.setContent(html);
+			}
+		},
+		created() {
+			// 鍥剧墖鏁扮粍
+			this.imgList = [];
+			this.imgList.each = function(f) {
+				for (var i = 0, len = this.length; i < len; i++)
+					this.setItem(i, f(this[i], i, this));
+			}
+			this.imgList.setItem = function(i, src) {
+				if (i == void 0 || !src) return;
+				// #ifndef MP-ALIPAY || APP-PLUS
+				// 鍘婚噸
+				if (src.indexOf('http') == 0 && this.includes(src)) {
+					var newSrc = src.split('://')[0];
+					for (var j = newSrc.length, c; c = src[j]; j++) {
+						if (c == '/' && src[j - 1] != '/' && src[j + 1] != '/') break;
+						newSrc += Math.random() > 0.5 ? c.toUpperCase() : c;
+					}
+					newSrc += src.substr(j);
+					return this[i] = newSrc;
+				}
+				// #endif
+				this[i] = src;
+				// 鏆傚瓨 data src
+				if (src.includes('data:image')) {
+					var filePath, info = src.match(/data:image\/(\S+?);(\S+?),(.+)/);
+					if (!info) return;
+					// #ifdef MP-WEIXIN || MP-TOUTIAO
+					filePath = `${wx.env.USER_DATA_PATH}/${Date.now()}.${info[1]}`;
+					fs && fs.writeFile({
+						filePath,
+						data: info[3],
+						encoding: info[2],
+						success: () => this[i] = filePath
+					})
+					// #endif
+					// #ifdef APP-PLUS
+					filePath = `_doc/parser_tmp/${Date.now()}.${info[1]}`;
+					var bitmap = new plus.nativeObj.Bitmap();
+					bitmap.loadBase64Data(src, () => {
+						bitmap.save(filePath, {}, () => {
+							bitmap.clear()
+							this[i] = filePath;
+						})
+					})
+					// #endif
+				}
+			}
+		},
+		mounted() {
+			// #ifdef H5 || MP-360
+			this.document = document.getElementById('rtf' + this._uid);
+			// #endif
+			// #ifndef H5 || APP-PLUS-NVUE || MP-360
+			if (dom) this.document = new dom(this);
+			// #endif
+			if (search) this.search = args => search(this, args);
+			// #ifdef APP-PLUS-NVUE
+			this.document = this.$refs.web;
+			setTimeout(() => {
+				// #endif
+				if (this.html) this.setContent(this.html);
+				// #ifdef APP-PLUS-NVUE
+			}, 30)
+			// #endif
+		},
+		beforeDestroy() {
+			// #ifdef H5 || MP-360
+			if (this._observer) this._observer.disconnect();
+			// #endif
+			this.imgList.each(src => {
+				// #ifdef APP-PLUS
+				if (src && src.includes('_doc')) {
+					plus.io.resolveLocalFileSystemURL(src, entry => {
+						entry.remove();
+					});
+				}
+				// #endif
+				// #ifdef MP-WEIXIN || MP-TOUTIAO
+				if (src && src.includes(uni.env.USER_DATA_PATH))
+					fs && fs.unlink({
+						filePath: src
+					})
+				// #endif
+			})
+			clearInterval(this._timer);
+		},
+		methods: {
+			// 璁剧疆瀵屾枃鏈唴瀹�
+			setContent(html, append) {
+				// #ifdef APP-PLUS-NVUE
+				if (!html)
+					return this.height = 1;
+				if (append)
+					this.$refs.web.evalJs("var b=document.createElement('div');b.innerHTML='" + html.replace(/'/g, "\\'") +
+						"';document.getElementById('parser').appendChild(b)");
+				else {
+					html =
+						'<meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><style>html,body{width:100%;height:100%;overflow:hidden}body{margin:0}</style><base href="' +
+						this.domain + '"><div id="parser"' + (this.selectable ? '>' : ' style="user-select:none">') + this._handleHtml(html).replace(/\n/g, '\\n') +
+						'</div><script>"use strict";function e(e){if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){var t={data:[e]};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(t):window.__dcloud_weex_.postMessage(JSON.stringify(t))}}document.body.onclick=function(){e({action:"click"})},' +
+						(this.showWithAnimation ? 'document.body.style.animation="_show .5s",' : '') +
+						'setTimeout(function(){e({action:"load",text:document.body.innerText,height:document.getElementById("parser").scrollHeight})},50);\x3c/script>';
+					if (platform == 'android') html = html.replace(/%/g, '%25');
+					this.$refs.web.evalJs("document.write('" + html.replace(/'/g, "\\'") + "');document.close()");
+				}
+				this.$refs.web.evalJs(
+					'var t=document.getElementsByTagName("title");t.length&&e({action:"getTitle",title:t[0].innerText});for(var o,n=document.getElementsByTagName("style"),r=1;o=n[r++];)o.innerHTML=o.innerHTML.replace(/body/g,"#parser");for(var a,c=document.getElementsByTagName("img"),s=[],i=0==c.length,d=0,l=0,g=0;a=c[l];l++)parseInt(a.style.width||a.getAttribute("width"))>' +
+					windowWidth + '&&(a.style.height="auto"),a.onload=function(){++d==c.length&&(i=!0)},a.onerror=function(){++d==c.length&&(i=!0),' + (cfg.errorImg ? 'this.src="' + cfg.errorImg + '",' : '') +
+					'e({action:"error",source:"img",target:this})},a.hasAttribute("ignore")||"A"==a.parentElement.nodeName||(a.i=g++,s.push(a.getAttribute("original-src")||a.src||a.getAttribute("data-src")),a.onclick=function(t){t.stopPropagation(),e({action:"preview",img:{i:this.i,src:this.src}})});e({action:"getImgList",imgList:s});for(var u,m=document.getElementsByTagName("a"),f=0;u=m[f];f++)u.onclick=function(m){m.stopPropagation();var t,o=this.getAttribute("href");if("#"==o[0]){var n=document.getElementById(o.substr(1));n&&(t=n.offsetTop)}return e({action:"linkpress",href:o,offset:t}),!1};for(var h,y=document.getElementsByTagName("video"),v=0;h=y[v];v++)h.style.maxWidth="100%",h.onerror=function(){e({action:"error",source:"video",target:this})}' +
+					(this.autopause ? ',h.onplay=function(){for(var e,t=0;e=y[t];t++)e!=this&&e.pause()}' : '') +
+					';for(var _,p=document.getElementsByTagName("audio"),w=0;_=p[w];w++)_.onerror=function(){e({action:"error",source:"audio",target:this})};' +
+					(this.autoscroll ? 'for(var T,E=document.getElementsByTagName("table"),B=0;T=E[B];B++){var N=document.createElement("div");N.style.overflow="scroll",T.parentNode.replaceChild(N,T),N.appendChild(T)}' : '') +
+					'var x=document.getElementById("parser");clearInterval(window.timer),window.timer=setInterval(function(){i&&clearInterval(window.timer),e({action:"ready",ready:i,height:x.scrollHeight})},350)'
+				)
+				this.nodes = [1];
+				// #endif
+				// #ifdef H5 || MP-360
+				if (!html) {
+					if (this.rtf && !append) this.rtf.parentNode.removeChild(this.rtf);
+					return;
+				}
+				var div = document.createElement('div');
+				if (!append) {
+					if (this.rtf) this.rtf.parentNode.removeChild(this.rtf);
+					this.rtf = div;
+				} else {
+					if (!this.rtf) this.rtf = div;
+					else this.rtf.appendChild(div);
+				}
+				div.innerHTML = this._handleHtml(html, append);
+				for (var styles = this.rtf.getElementsByTagName('style'), i = 0, style; style = styles[i++];) {
+					style.innerHTML = style.innerHTML.replace(/body/g, '#rtf' + this._uid);
+					style.setAttribute('scoped', 'true');
+				}
+				// 鎳掑姞杞�
+				if (!this._observer && this.lazyLoad && IntersectionObserver) {
+					this._observer = new IntersectionObserver(changes => {
+						for (let item, i = 0; item = changes[i++];) {
+							if (item.isIntersecting) {
+								item.target.src = item.target.getAttribute('data-src');
+								item.target.removeAttribute('data-src');
+								this._observer.unobserve(item.target);
+							}
+						}
+					}, {
+						rootMargin: '500px 0px 500px 0px'
+					})
+				}
+				var _ts = this;
+				// 鑾峰彇鏍囬
+				var title = this.rtf.getElementsByTagName('title');
+				if (title.length && this.autosetTitle)
+					uni.setNavigationBarTitle({
+						title: title[0].innerText
+					})
+				// 濉厖 domain
+				var fill = target => {
+					var src = target.getAttribute('src');
+					if (this.domain && src) {
+						if (src[0] == '/') {
+							if (src[1] == '/')
+								target.src = (this.domain.includes('://') ? this.domain.split('://')[0] : '') + ':' + src;
+							else target.src = this.domain + src;
+						} else if (!src.includes('://') && src.indexOf('data:') != 0) target.src = this.domain + '/' + src;
+					}
+				}
+				// 鍥剧墖澶勭悊
+				this.imgList.length = 0;
+				var imgs = this.rtf.getElementsByTagName('img');
+				for (let i = 0, j = 0, img; img = imgs[i]; i++) {
+					if (parseInt(img.style.width || img.getAttribute('width')) > windowWidth)
+						img.style.height = 'auto';
+					fill(img);
+					if (!img.hasAttribute('ignore') && img.parentElement.nodeName != 'A') {
+						img.i = j++;
+						_ts.imgList.push(img.getAttribute('original-src') || img.src || img.getAttribute('data-src'));
+						img.onclick = function(e) {
+							e.stopPropagation();
+							var preview = true;
+							this.ignore = () => preview = false;
+							_ts.$emit('imgtap', this);
+							if (preview) {
+								uni.previewImage({
+									current: this.i,
+									urls: _ts.imgList
+								});
+							}
+						}
+					}
+					img.onerror = function() {
+						if (cfg.errorImg)
+							_ts.imgList[this.i] = this.src = cfg.errorImg;
+						_ts.$emit('error', {
+							source: 'img',
+							target: this
+						});
+					}
+					if (_ts.lazyLoad && this._observer && img.src && img.i != 0) {
+						img.setAttribute('data-src', img.src);
+						img.removeAttribute('src');
+						this._observer.observe(img);
+					}
+				}
+				// 閾炬帴澶勭悊
+				var links = this.rtf.getElementsByTagName('a');
+				for (var link of links) {
+					link.onclick = function(e) {
+						e.stopPropagation();
+						var jump = true,
+							href = this.getAttribute('href');
+						_ts.$emit('linkpress', {
+							href,
+							ignore: () => jump = false
+						});
+						if (jump && href) {
+							if (href[0] == '#') {
+								if (_ts.useAnchor) {
+									_ts.navigateTo({
+										id: href.substr(1)
+									})
+								}
+							} else if (href.indexOf('http') == 0 || href.indexOf('//') == 0)
+								return true;
+							else
+								uni.navigateTo({
+									url: href
+								})
+						}
+						return false;
+					}
+				}
+				// 瑙嗛澶勭悊
+				var videos = this.rtf.getElementsByTagName('video');
+				_ts.videoContexts = videos;
+				for (let video, i = 0; video = videos[i++];) {
+					fill(video);
+					video.style.maxWidth = '100%';
+					video.onerror = function() {
+						_ts.$emit('error', {
+							source: 'video',
+							target: this
+						});
+					}
+					video.onplay = function() {
+						if (_ts.autopause)
+							for (let item, i = 0; item = _ts.videoContexts[i++];)
+								if (item != this) item.pause();
+					}
+				}
+				// 闊抽澶勭悊
+				var audios = this.rtf.getElementsByTagName('audio');
+				for (var audio of audios) {
+					fill(audio);
+					audio.onerror = function() {
+						_ts.$emit('error', {
+							source: 'audio',
+							target: this
+						});
+					}
+				}
+				// 琛ㄦ牸澶勭悊
+				if (this.autoscroll) {
+					var tables = this.rtf.getElementsByTagName('table');
+					for (var table of tables) {
+						let div = document.createElement('div');
+						div.style.overflow = 'scroll';
+						table.parentNode.replaceChild(div, table);
+						div.appendChild(table);
+					}
+				}
+				if (!append) this.document.appendChild(this.rtf);
+				this.$nextTick(() => {
+					this.nodes = [1];
+					this.$emit('load');
+				});
+				setTimeout(() => this.showAm = '', 500);
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				// #ifndef H5 || MP-360
+				var nodes;
+				if (!html) return this.nodes = [];
+				var parser = new Parser(html, this);
+				// 缂撳瓨璇诲彇
+				if (this.useCache) {
+					var hashVal = hash(html);
+					if (cache[hashVal])
+						nodes = cache[hashVal];
+					else {
+						nodes = parser.parse();
+						cache[hashVal] = nodes;
+					}
+				} else nodes = parser.parse();
+				this.$emit('parse', nodes);
+				if (append) this.nodes = this.nodes.concat(nodes);
+				else this.nodes = nodes;
+				if (nodes.length && nodes.title && this.autosetTitle)
+					uni.setNavigationBarTitle({
+						title: nodes.title
+					})
+				if (this.imgList) this.imgList.length = 0;
+				this.videoContexts = [];
+				this.$nextTick(() => {
+					(function f(cs) {
+						for (var i = cs.length; i--;) {
+							if (cs[i].top) {
+								cs[i].controls = [];
+								cs[i].init();
+								f(cs[i].$children);
+							}
+						}
+					})(this.$children)
+					this.$emit('load');
+				})
+				// #endif
+				var height;
+				clearInterval(this._timer);
+				this._timer = setInterval(() => {
+					// #ifdef H5 || MP-360
+					this.rect = this.rtf.getBoundingClientRect();
+					// #endif
+					// #ifndef H5 || MP-360
+					uni.createSelectorQuery().in(this)
+						.select('#_top').boundingClientRect().exec(res => {
+							if (!res) return;
+							this.rect = res[0];
+							// #endif
+							if (this.rect.height == height) {
+								this.$emit('ready', this.rect)
+								clearInterval(this._timer);
+							}
+							height = this.rect.height;
+							// #ifndef H5 || MP-360
+						});
+					// #endif
+				}, 350);
+				if (this.showWithAnimation && !append) this.showAm = 'animation:_show .5s';
+				// #endif
+			},
+			// 鑾峰彇鏂囨湰鍐呭
+			getText(ns = this.nodes) {
+				var txt = '';
+				// #ifdef APP-PLUS-NVUE
+				txt = this._text;
+				// #endif
+				// #ifdef H5 || MP-360
+				txt = this.rtf.innerText;
+				// #endif
+				// #ifndef H5 || APP-PLUS-NVUE || MP-360
+				for (var i = 0, n; n = ns[i++];) {
+					if (n.type == 'text') txt += n.text.replace(/&nbsp;/g, '\u00A0').replace(/&lt;/g, '<').replace(/&gt;/g, '>')
+						.replace(/&amp;/g, '&');
+					else if (n.type == 'br') txt += '\n';
+					else {
+						// 鍧楃骇鏍囩鍓嶅悗鍔犳崲琛�
+						var block = n.name == 'p' || n.name == 'div' || n.name == 'tr' || n.name == 'li' || (n.name[0] == 'h' && n.name[1] >
+							'0' && n.name[1] < '7');
+						if (block && txt && txt[txt.length - 1] != '\n') txt += '\n';
+						if (n.children) txt += this.getText(n.children);
+						if (block && txt[txt.length - 1] != '\n') txt += '\n';
+						else if (n.name == 'td' || n.name == 'th') txt += '\t';
+					}
+				}
+				// #endif
+				return txt;
+			},
+			// 閿氱偣璺宠浆
+			in (obj) {
+				if (obj.page && obj.selector && obj.scrollTop) this._in = obj;
+			},
+			navigateTo(obj) {
+				if (!this.useAnchor) return obj.fail && obj.fail('Anchor is disabled');
+				// #ifdef APP-PLUS-NVUE
+				if (!obj.id)
+					weexDom.scrollToElement(this.$refs.web);
+				else
+					this.$refs.web.evalJs('var pos=document.getElementById("' + obj.id +
+						'");if(pos)post({action:"linkpress",href:"#",offset:pos.offsetTop+' + (obj.offset || 0) + '})');
+				obj.success && obj.success();
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				var d = ' ';
+				// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
+				d = '>>>';
+				// #endif
+				var selector = uni.createSelectorQuery().in(this._in ? this._in.page : this).select((this._in ? this._in.selector :
+					'#_top') + (obj.id ? `${d}#${obj.id},${this._in?this._in.selector:'#_top'}${d}.${obj.id}` : '')).boundingClientRect();
+				if (this._in) selector.select(this._in.selector).scrollOffset().select(this._in.selector).boundingClientRect();
+				else selector.selectViewport().scrollOffset();
+				selector.exec(res => {
+					if (!res[0]) return obj.fail && obj.fail('Label not found')
+					var scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + (obj.offset || 0);
+					if (this._in) this._in.page[this._in.scrollTop] = scrollTop;
+					else uni.pageScrollTo({
+						scrollTop,
+						duration: 300
+					})
+					obj.success && obj.success();
+				})
+				// #endif
+			},
+			// 鑾峰彇瑙嗛瀵硅薄
+			getVideoContext(id) {
+				// #ifndef APP-PLUS-NVUE
+				if (!id) return this.videoContexts;
+				else
+					for (var i = this.videoContexts.length; i--;)
+						if (this.videoContexts[i].id == id) return this.videoContexts[i];
+				// #endif
+			},
+			// #ifdef H5 || APP-PLUS-NVUE || MP-360
+			_handleHtml(html, append) {
+				if (!append) {
+					// 澶勭悊 tag-style 鍜� userAgentStyles
+					var style = '<style>@keyframes _show{0%{opacity:0}100%{opacity:1}}img{max-width:100%}';
+					for (var item in cfg.userAgentStyles)
+						style += `${item}{${cfg.userAgentStyles[item]}}`;
+					for (item in this.tagStyle)
+						style += `${item}{${this.tagStyle[item]}}`;
+					style += '</style>';
+					html = style + html;
+				}
+				// 澶勭悊 rpx
+				if (html.includes('rpx'))
+					html = html.replace(/[0-9.]+\s*rpx/g, $ => (parseFloat($) * windowWidth / 750) + 'px');
+				return html;
+			},
+			// #endif
+			// #ifdef APP-PLUS-NVUE
+			_message(e) {
+				// 鎺ユ敹 web-view 娑堟伅
+				var d = e.detail.data[0];
+				switch (d.action) {
+					case 'load':
+						this.$emit('load');
+						this.height = d.height;
+						this._text = d.text;
+						break;
+					case 'getTitle':
+						if (this.autosetTitle)
+							uni.setNavigationBarTitle({
+								title: d.title
+							})
+						break;
+					case 'getImgList':
+						this.imgList.length = 0;
+						for (var i = d.imgList.length; i--;)
+							this.imgList.setItem(i, d.imgList[i]);
+						break;
+					case 'preview':
+						var preview = true;
+						d.img.ignore = () => preview = false;
+						this.$emit('imgtap', d.img);
+						if (preview)
+							uni.previewImage({
+								current: d.img.i,
+								urls: this.imgList
+							})
+						break;
+					case 'linkpress':
+						var jump = true,
+							href = d.href;
+						this.$emit('linkpress', {
+							href,
+							ignore: () => jump = false
+						})
+						if (jump && href) {
+							if (href[0] == '#') {
+								if (this.useAnchor)
+									weexDom.scrollToElement(this.$refs.web, {
+										offset: d.offset
+									})
+							} else if (href.includes('://'))
+								plus.runtime.openWeb(href);
+							else
+								uni.navigateTo({
+									url: href
+								})
+						}
+						break;
+					case 'error':
+						if (d.source == 'img' && cfg.errorImg)
+							this.imgList.setItem(d.target.i, cfg.errorImg);
+						this.$emit('error', {
+							source: d.source,
+							target: d.target
+						})
+						break;
+					case 'ready':
+						this.height = d.height;
+						if (d.ready) uni.createSelectorQuery().in(this).select('#_top').boundingClientRect().exec(res => {
+							this.rect = res[0];
+							this.$emit('ready', res[0]);
+						})
+						break;
+					case 'click':
+						this.$emit('click');
+						this.$emit('tap');
+				}
+			},
+			// #endif
+		}
+	}
+</script>
+
+<style>
+	@keyframes _show {
+		0% {
+			opacity: 0;
+		}
+
+		100% {
+			opacity: 1;
+		}
+	}
+
+	/* #ifdef MP-WEIXIN */
+	:host {
+		display: block;
+		overflow: auto;
+		-webkit-overflow-scrolling: touch;
+	}
+
+	/* #endif */
+</style>
diff --git a/uview-ui/components/u-picker/u-picker.vue b/uview-ui/components/u-picker/u-picker.vue
new file mode 100644
index 0000000..f0032ab
--- /dev/null
+++ b/uview-ui/components/u-picker/u-picker.vue
@@ -0,0 +1,676 @@
+<template>
+	<u-popup :maskCloseAble="maskCloseAble" mode="bottom" :popup="false" v-model="value" length="auto" :safeAreaInsetBottom="safeAreaInsetBottom" @close="close" :z-index="uZIndex">
+		<view class="u-datetime-picker">
+			<view class="u-picker-header" @touchmove.stop.prevent="">
+				<view class="u-btn-picker u-btn-picker--tips" 
+					:style="{ color: cancelColor }" 
+					hover-class="u-opacity" 
+					:hover-stay-time="150" 
+					@tap="getResult('cancel')"
+				>{{cancelText}}</view>
+				<view class="u-picker__title">{{ title }}</view>
+				<view
+					class="u-btn-picker u-btn-picker--primary"
+					:style="{ color: moving ? cancelColor : confirmColor }"
+					hover-class="u-opacity"
+					:hover-stay-time="150"
+					@touchmove.stop=""
+					@tap.stop="getResult('confirm')"
+				>
+					{{confirmText}}
+				</view>
+			</view>
+			<view class="u-picker-body">
+				<picker-view v-if="mode == 'region'" :value="valueArr" @change="change" class="u-picker-view" @pickstart="pickstart" @pickend="pickend">
+					<picker-view-column v-if="!reset && params.province">
+						<view class="u-column-item" v-for="(item, index) in provinces" :key="index">
+							<view class="u-line-1">{{ item.label }}</view>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.city">
+						<view class="u-column-item" v-for="(item, index) in citys" :key="index">
+							<view class="u-line-1">{{ item.label }}</view>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.area">
+						<view class="u-column-item" v-for="(item, index) in areas" :key="index">
+							<view class="u-line-1">{{ item.label }}</view>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view v-else-if="mode == 'time'" :value="valueArr" @change="change" class="u-picker-view" @pickstart="pickstart" @pickend="pickend">
+					<picker-view-column v-if="!reset && params.year">
+						<view class="u-column-item" v-for="(item, index) in years" :key="index">
+							{{ item }}
+							<text class="u-text" v-if="showTimeTag">骞�</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.month">
+						<view class="u-column-item" v-for="(item, index) in months" :key="index">
+							{{ formatNumber(item) }}
+							<text class="u-text" v-if="showTimeTag">鏈�</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.day">
+						<view class="u-column-item" v-for="(item, index) in days" :key="index">
+							{{ formatNumber(item) }}
+							<text class="u-text" v-if="showTimeTag">鏃�</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.hour">
+						<view class="u-column-item" v-for="(item, index) in hours" :key="index">
+							{{ formatNumber(item) }}
+							<text class="u-text" v-if="showTimeTag">鏃�</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.minute">
+						<view class="u-column-item" v-for="(item, index) in minutes" :key="index">
+							{{ formatNumber(item) }}
+							<text class="u-text" v-if="showTimeTag">鍒�</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && params.second">
+						<view class="u-column-item" v-for="(item, index) in seconds" :key="index">
+							{{ formatNumber(item) }}
+							<text class="u-text" v-if="showTimeTag">绉�</text>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view v-else-if="mode == 'selector'" :value="valueArr" @change="change" class="u-picker-view" @pickstart="pickstart" @pickend="pickend">
+					<picker-view-column v-if="!reset">
+						<view class="u-column-item" v-for="(item, index) in range" :key="index">
+							<view class="u-line-1">{{ getItemValue(item, 'selector') }}</view>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view v-else-if="mode == 'multiSelector'" :value="valueArr" @change="change" class="u-picker-view" @pickstart="pickstart" @pickend="pickend">
+					<picker-view-column v-if="!reset" v-for="(item, index) in range" :key="index">
+						<view class="u-column-item" v-for="(item1, index1) in item" :key="index1">
+							<view class="u-line-1">{{ getItemValue(item1, 'multiSelector') }}</view>
+						</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+import provinces from '../../libs/util/province.js';
+import citys from '../../libs/util/city.js';
+import areas from '../../libs/util/area.js';
+
+/**
+ * picker picker寮瑰嚭閫夋嫨鍣�
+ * @description 姝ら�夋嫨鍣ㄦ湁涓ょ寮瑰嚭妯″紡锛氫竴鏄椂闂存ā寮忥紝鍙互閰嶇疆骞达紝鏃ワ紝鏈堬紝鏃讹紝鍒嗭紝绉掑弬鏁� 浜屾槸鍦板尯妯″紡锛屽彲浠ラ厤缃渷锛屽競锛屽尯鍙傛暟
+ * @tutorial https://www.uviewui.com/components/picker.html
+ * @property {Object} params 闇�瑕佹樉绀虹殑鍙傛暟锛岃瀹樼綉璇存槑
+ * @property {String} mode 妯″紡閫夋嫨锛宺egion-鍦板尯绫诲瀷锛宼ime-鏃堕棿绫诲瀷锛堥粯璁ime锛�
+ * @property {String Number} start-year 鍙�夌殑寮�濮嬪勾浠斤紝mode=time鏃舵湁鏁堬紙榛樿1950锛�
+ * @property {String Number} end-year 鍙�夌殑缁撴潫骞翠唤锛宮ode=time鏃舵湁鏁堬紙榛樿2050锛�
+ * @property {Boolean} safe-area-inset-bottom 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛堥粯璁alse锛�
+ * @property {Boolean} show-time-tag 鏃堕棿妯″紡鏃讹紝鏄惁鏄剧ず鍚庨潰鐨勫勾鏈堟棩涓枃鎻愮ず
+ * @property {String} cancel-color 鍙栨秷鎸夐挳鐨勯鑹诧紙榛樿#606266锛�
+ * @property {String} confirm-color 纭鎸夐挳鐨勯鑹诧紙榛樿#497bff锛�
+ * @property {String} default-time 榛樿閫変腑鐨勬椂闂达紝mode=time鏃舵湁鏁�
+ * @property {String} confirm-text 纭鎸夐挳鐨勬枃瀛�
+ * @property {String} cancel-text 鍙栨秷鎸夐挳鐨勬枃瀛�
+ * @property {String} default-region 榛樿閫変腑鐨勫湴鍖猴紝涓枃褰㈠紡锛宮ode=region鏃舵湁鏁�
+ * @property {String} default-code 榛樿閫変腑鐨勫湴鍖猴紝缂栧彿褰㈠紡锛宮ode=region鏃舵湁鏁�
+ * @property {Boolean} mask-close-able 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴Picker锛堥粯璁rue锛�
+ * @property {String Number} z-index 寮瑰嚭鏃剁殑z-index鍊硷紙榛樿1075锛�
+ * @property {Array} default-selector 鏁扮粍褰㈠紡锛屽叾涓瘡涓�椤硅〃绀洪�夋嫨浜唕ange瀵瑰簲椤逛腑鐨勭鍑犱釜
+ * @property {Array} range 鑷畾涔夐�夋嫨鐨勬暟鎹紝mode=selector鎴杕ode=multiSelector鏃舵湁鏁�
+ * @property {String} range-key 褰搑ange鍙傛暟鐨勫厓绱犱负瀵硅薄鏃讹紝鎸囧畾Object涓殑鍝釜key鐨勫�间綔涓洪�夋嫨鍣ㄦ樉绀哄唴瀹�
+ * @event {Function} confirm 鐐瑰嚮纭畾鎸夐挳锛岃繑鍥炲綋鍓嶉�夋嫨鐨勫��
+ * @event {Function} cancel 鐐瑰嚮鍙栨秷鎸夐挳锛岃繑鍥炲綋鍓嶉�夋嫨鐨勫��
+ * @example <u-picker v-model="show" mode="time"></u-picker>
+ */
+export default {
+	name: 'u-picker',
+	props: {
+		// picker涓渶瑕佹樉绀虹殑鍙傛暟
+		params: {
+			type: Object,
+			default() {
+				return {
+					year: true,
+					month: true,
+					day: true,
+					hour: false,
+					minute: false,
+					second: false,
+					province: true,
+					city: true,
+					area: true,
+					timestamp: true,
+				};
+			}
+		},
+		// 褰搈ode=selector鎴栬�卪ode=multiSelector鏃讹紝鎻愪緵鐨勬暟缁�
+		range: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 褰搈ode=selector鎴栬�卪ode=multiSelector鏃讹紝鎻愪緵鐨勯粯璁ら�変腑鐨勪笅鏍�
+		defaultSelector: {
+			type: Array,
+			default() {
+				return [0];
+			}
+		},
+		// 褰� range 鏄竴涓� Array锛淥bject锛� 鏃讹紝閫氳繃 range-key 鏉ユ寚瀹� Object 涓� key 鐨勫�间綔涓洪�夋嫨鍣ㄦ樉绀哄唴瀹�
+		rangeKey: {
+			type: String,
+			default: ''
+		},
+		// 妯″紡閫夋嫨锛宺egion-鍦板尯绫诲瀷锛宼ime-鏃堕棿绫诲瀷锛宻elector-鍗曞垪妯″紡锛宮ultiSelector-澶氬垪妯″紡
+		mode: {
+			type: String,
+			default: 'time'
+		},
+		// 骞翠唤寮�濮嬫椂闂�
+		startYear: {
+			type: [String, Number],
+			default: 1950
+		},
+		// 骞翠唤缁撴潫鏃堕棿
+		endYear: {
+			type: [String, Number],
+			default: 2050
+		},
+		// "鍙栨秷"鎸夐挳鐨勯鑹�
+		cancelColor: {
+			type: String,
+			default: '#606266'
+		},
+		// "纭畾"鎸夐挳鐨勯鑹�
+		confirmColor: {
+			type: String,
+			default: '#497bff'
+		},
+		// 榛樿鏄剧ず鐨勬椂闂达紝2025-07-02 || 2025-07-02 13:01:00 || 2025/07/02
+		defaultTime: {
+			type: String,
+			default: ''
+		},
+		// 榛樿鏄剧ず鐨勫湴鍖猴紝鍙紶绫讳技["娌冲寳鐪�", "绉︾殗宀涘競", "鍖楁埓娌冲尯"]
+		defaultRegion: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 鏃堕棿妯″紡鏃讹紝鏄惁鏄剧ず鍚庨潰鐨勫勾鏈堟棩涓枃鎻愮ず
+		showTimeTag: {
+			type: Boolean,
+			default: true
+		},
+		// 榛樿鏄剧ず鍦板尯鐨勭紪鐮侊紝defaultRegion鍜宎reaCode鍚屾椂瀛樺湪锛宎reaCode浼樺厛锛屽彲浼犵被浼糩"13", "1303", "130304"]
+		areaCode: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		safeAreaInsetBottom: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴Picker
+		maskCloseAble: {
+			type: Boolean,
+			default: true
+		},
+		// 閫氳繃鍙屽悜缁戝畾鎺у埗缁勪欢鐨勫脊鍑轰笌鏀惰捣
+		value: {
+			type: Boolean,
+			default: false
+		},
+		// 寮瑰嚭鐨剒-index鍊�
+		zIndex: {
+			type: [String, Number],
+			default: 0
+		},
+		// 椤堕儴鏍囬
+		title: {
+			type: String,
+			default: ''
+		},
+		// 鍙栨秷鎸夐挳鐨勬枃瀛�
+		cancelText: {
+			type: String,
+			default: '鍙栨秷'
+		},
+		// 纭鎸夐挳鐨勬枃瀛�
+		confirmText: {
+			type: String,
+			default: '纭'
+		}
+	},
+	data() {
+		return {
+			years: [],
+			months: [],
+			days: [],
+			hours: [],
+			minutes: [],
+			seconds: [],
+			year: 0,
+			month: 0,
+			day: 0,
+			hour: 0,
+			minute: 0,
+			second: 0,
+			reset: false,
+			startDate: '',
+			endDate: '',
+			valueArr: [],
+			provinces: provinces,
+			citys: citys[0],
+			areas: areas[0][0],
+			province: 0,
+			city: 0,
+			area: 0,
+			moving: false // 鍒楁槸鍚﹁繕鍦ㄦ粦鍔ㄤ腑锛屽井淇″皬绋嬪簭濡傛灉鍦ㄦ粦鍔ㄤ腑灏辩偣纭畾锛岀粨鏋滃彲鑳戒笉鍑嗙‘
+		};
+	},
+	mounted() {
+		this.init();
+	},
+	computed: {
+		propsChange() {
+			// 寮曠敤杩欏嚑涓彉閲忥紝鏄负浜嗙洃鍚叾鍙樺寲
+			return `${this.mode}-${this.defaultTime}-${this.startYear}-${this.endYear}-${this.defaultRegion}-${this.areaCode}`;
+		},
+		regionChange() {
+			// 寮曠敤杩欏嚑涓彉閲忥紝鏄负浜嗙洃鍚叾鍙樺寲
+			return `${this.province}-${this.city}`;
+		},
+		yearAndMonth() {
+			return `${this.year}-${this.month}`;
+		},
+		uZIndex() {
+			// 濡傛灉鐢ㄦ埛鏈変紶閫抸-index鍊硷紝浼樺厛浣跨敤
+			return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+		}
+	},
+	watch: {
+		propsChange() {
+			this.reset = true;
+			setTimeout(() => this.init(), 10);
+		},
+		// 濡傛灉鍦板尯鍙戠敓鍙樺寲锛屼负浜嗚picker鑱斿姩璧锋潵锛屽繀椤婚噸缃畉his.citys鍜宼his.areas
+		regionChange(val) {
+			this.citys = citys[this.province];
+			this.areas = areas[this.province][this.city];
+		},
+		// watch鐩戝惉鏈堜唤鐨勫彉鍖栵紝瀹炴椂鍙樻洿鏃ョ殑澶╂暟锛屽洜涓轰笉鍚屾湀浠斤紝澶╂暟涓嶄竴鏍�
+		// 涓�涓湀鍙兘鏈�30锛�31澶╋紝鐢氳嚦闂板勾2鏈堢殑29澶╋紝骞冲勾2鏈�28澶�
+		yearAndMonth(val) {
+			if (this.params.year) this.setDays();
+		},
+		// 寰俊鍜孮Q灏忕▼搴忕敱浜庝竴浜涘鎬殑鍘熷洜(鏁呭悓鏃跺鎵�鏈夊钩鍙板潎鍒濆鍖栦竴閬�)锛岄渶瑕侀噸鏂板垵濮嬪寲鎵嶈兘鏄剧ず姝g‘鐨勫��
+		value(n) {
+			if (n) {
+				this.reset = true;
+				setTimeout(() => this.init(), 10);
+			}
+		}
+	},
+	methods: {
+		// 鏍囪瘑婊戝姩寮�濮嬶紝鍙湁寰俊灏忕▼搴忔墠鏈夎繖鏍风殑浜嬩欢
+		pickstart() {
+			// #ifdef MP-WEIXIN
+			this.moving = true;
+			// #endif
+		},
+		// 鏍囪瘑婊戝姩缁撴潫
+		pickend() {
+			// #ifdef MP-WEIXIN
+			this.moving = false;
+			// #endif
+		},
+		// 瀵瑰崟鍒楀拰澶氬垪褰㈠紡鐨勫垽鏂槸鍚︽湁浼犲叆鍙橀噺鐨勬儏鍐�
+		getItemValue(item, mode) {
+			// 鐩墠(2020-05-25)uni-app瀵瑰井淇″皬绋嬪簭缂栬瘧鏈夐敊璇紝瀵艰嚧v-if涓篺alse涓殑鍐呭涔熸墽琛岋紝閿欒瀵艰嚧
+			// 鍗曞垪妯″紡鎴栬�呭鍒楁ā寮忎腑鐨刧etItemValue鍚屾椂琚墽琛岋紝鏁呭湪杩欓噷鍐嶅姞涓�灞傚垽鏂�
+			if (this.mode == mode) {
+				return typeof item == 'object' ? item[this.rangeKey] : item;
+			}
+		},
+		// 灏忎簬10鍓嶉潰琛�0锛岀敤浜庢湀浠斤紝鏃ユ湡锛屾椂鍒嗙绛�
+		formatNumber(num) {
+			return +num < 10 ? '0' + num : String(num);
+		},
+		// 鐢熸垚閫掕繘鐨勬暟缁�
+		generateArray: function(start, end) {
+			// 杞负鏁板�兼牸寮忥紝鍚﹀垯鐢ㄦ埛缁檈nd-year绛変紶閫掑瓧绗︿覆鍊兼椂锛屼笅闈㈢殑end+1浼氬鑷村瓧绗︿覆鎷兼帴锛岃�屼笉鏄浉鍔�
+			start = Number(start);
+			end = Number(end);
+			end = end > start ? end : start;
+			// 鐢熸垚鏁扮粍锛岃幏鍙栧叾涓殑绱㈠紩锛屽苟鍓嚭鏉�
+			return [...Array(end + 1).keys()].slice(start);
+		},
+		getIndex: function(arr, val) {
+			let index = arr.indexOf(val);
+			// 濡傛灉index涓�-1(鍗虫壘涓嶅埌index鍊�)锛寏(-1)=-(-1)-1=0锛屽鑷存潯浠朵笉鎴愮珛
+			return ~index ? index : 0;
+		},
+		//鏃ユ湡鏃堕棿澶勭悊
+		initTimeValue() {
+			// 鏍煎紡鍖栨椂闂达紝鍦↖E娴忚鍣�(uni涓嶅瓨鍦ㄦ鎯呭喌)锛屾棤娉曡瘑鍒棩鏈熼棿鐨�"-"闂撮殧绗﹀彿
+			let fdate = this.defaultTime.replace(/\-/g, '/');
+			fdate = fdate && fdate.indexOf('/') == -1 ? `2020/01/01 ${fdate}` : fdate;
+			let time = null;
+			if (fdate) time = new Date(fdate);
+			else time = new Date();
+			// 鑾峰彇骞存棩鏈堟椂鍒嗙
+			this.year = time.getFullYear();
+			this.month = Number(time.getMonth()) + 1;
+			this.day = time.getDate();
+			this.hour = time.getHours();
+			this.minute = time.getMinutes();
+			this.second = time.getSeconds();
+		},
+		init() {
+			this.valueArr = [];
+			this.reset = false;
+			if (this.mode == 'time') {
+				this.initTimeValue();
+				if (this.params.year) {
+					this.valueArr.push(0);
+					this.setYears();
+				}
+				if (this.params.month) {
+					this.valueArr.push(0);
+					this.setMonths();
+				}
+				if (this.params.day) {
+					this.valueArr.push(0);
+					this.setDays();
+				}
+				if (this.params.hour) {
+					this.valueArr.push(0);
+					this.setHours();
+				}
+				if (this.params.minute) {
+					this.valueArr.push(0);
+					this.setMinutes();
+				}
+				if (this.params.second) {
+					this.valueArr.push(0);
+					this.setSeconds();
+				}
+			} else if (this.mode == 'region') {
+				if (this.params.province) {
+					this.valueArr.push(0);
+					this.setProvinces();
+				}
+				if (this.params.city) {
+					this.valueArr.push(0);
+					this.setCitys();
+				}
+				if (this.params.area) {
+					this.valueArr.push(0);
+					this.setAreas();
+				}
+			} else if (this.mode == 'selector') {
+				this.valueArr = this.defaultSelector;
+			} else if (this.mode == 'multiSelector') {
+				this.valueArr = this.defaultSelector;
+				this.multiSelectorValue = this.defaultSelector;
+			}
+			this.$forceUpdate();
+		},
+		// 璁剧疆picker鐨勬煇涓�鍒楀��
+		setYears() {
+			// 鑾峰彇骞翠唤闆嗗悎
+			this.years = this.generateArray(this.startYear, this.endYear);
+			// 璁剧疆this.valueArr鏌愪竴椤圭殑鍊硷紝鏄负浜嗚picker棰勯�変腑鏌愪竴涓��
+			this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.years, this.year));
+		},
+		setMonths() {
+			this.months = this.generateArray(1, 12);
+			this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.months, this.month));
+		},
+		setDays() {
+			let totalDays = new Date(this.year, this.month, 0).getDate();
+			this.days = this.generateArray(1, totalDays);
+			let index = 0;
+			// 杩欓噷涓嶈兘浣跨敤绫讳技setMonths()涓殑this.valueArr.splice(this.valueArr.length - 1, xxx)鍋氭硶
+			// 鍥犱负this.month鍜宼his.year鍙樺寲鏃讹紝浼氳Е鍙憌atch涓殑this.setDays()锛屽鑷磘his.valueArr.length璁$畻鏈夎
+			if (this.params.year && this.params.month) index = 2;
+			else if (this.params.month) index = 1;
+			else if (this.params.year) index = 1;
+			else index = 0;
+			// 褰撴湀浠藉彉鍖栨椂锛屼細瀵艰嚧鏃ユ湡鐨勫ぉ鏁颁篃浼氬彉鍖栵紝濡傛灉鍘熸潵閫夌殑澶╂暟澶т簬鍙樺寲鍚庣殑澶╂暟锛屽垯閲嶇疆涓哄彉鍖栧悗鐨勬渶澶у��
+			// 姣斿鍘熸潵閫変腑3鏈�31鏃ワ紝璋冩暣涓�2鏈堝悗锛屾棩鏈熷彉涓烘渶澶�29锛岃繖鏃跺鏋渄ay鍊肩户缁负31鏄剧劧涓嶅悎鐞嗭紝浜庢槸灏嗗叾缃负29(picker-column浠�1寮�濮�)
+			if(this.day > this.days.length) this.day = this.days.length;
+			this.valueArr.splice(index, 1, this.getIndex(this.days, this.day));
+		},
+		setHours() {
+			this.hours = this.generateArray(0, 23);
+			this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.hours, this.hour));
+		},
+		setMinutes() {
+			this.minutes = this.generateArray(0, 59);
+			this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.minutes, this.minute));
+		},
+		setSeconds() {
+			this.seconds = this.generateArray(0, 59);
+			this.valueArr.splice(this.valueArr.length - 1, 1, this.getIndex(this.seconds, this.second));
+		},
+		setProvinces() {
+			// 鍒ゆ柇鏄惁闇�瑕乸rovince鍙傛暟
+			if (!this.params.province) return;
+			let tmp = '';
+			let useCode = false;
+			// 濡傛灉鍚屾椂閰嶇疆浜哾efaultRegion鍜宎reaCode锛屼紭鍏堜娇鐢╝reaCode鍙傛暟
+			if (this.areaCode.length) {
+				tmp = this.areaCode[0];
+				useCode = true;
+			} else if (this.defaultRegion.length) tmp = this.defaultRegion[0];
+			else tmp = 0;
+			// 鍘嗛亶鐪佷唤鏁扮粍鍖归厤
+			provinces.map((v, k) => {
+				if (useCode ? v.value == tmp : v.label == tmp) {
+					tmp = k;
+				}
+			});
+			this.province = tmp;
+			this.provinces = provinces;
+			// 璁剧疆榛樿鐪佷唤鐨勫��
+			this.valueArr.splice(0, 1, this.province);
+		},
+		setCitys() {
+			if (!this.params.city) return;
+			let tmp = '';
+			let useCode = false;
+			if (this.areaCode.length) {
+				tmp = this.areaCode[1];
+				useCode = true;
+			} else if (this.defaultRegion.length) tmp = this.defaultRegion[1];
+			else tmp = 0;
+			citys[this.province].map((v, k) => {
+				if (useCode ? v.value == tmp : v.label == tmp) {
+					tmp = k;
+				}
+			});
+			this.city = tmp;
+			this.citys = citys[this.province];
+			this.valueArr.splice(1, 1, this.city);
+		},
+		setAreas() {
+			if (!this.params.area) return;
+			let tmp = '';
+			let useCode = false;
+			if (this.areaCode.length) {
+				tmp = this.areaCode[2];
+				useCode = true;
+			} else if (this.defaultRegion.length) tmp = this.defaultRegion[2];
+			else tmp = 0;
+			areas[this.province][this.city].map((v, k) => {
+				if (useCode ? v.value == tmp : v.label == tmp) {
+					tmp = k;
+				}
+			});
+			this.area = tmp;
+			this.areas = areas[this.province][this.city];
+			this.valueArr.splice(2, 1, this.area);
+		},
+		close() {
+			this.$emit('input', false);
+		},
+		// 鐢ㄦ埛鏇存敼picker鐨勫垪閫夐」
+		change(e) {
+			this.valueArr = e.detail.value;
+			let i = 0;
+			if (this.mode == 'time') {
+				// 杩欓噷浣跨敤i++锛屾槸鍥犱负this.valueArr鏁扮粍鐨勯暱搴︽槸涓嶇‘瀹氶暱搴︾殑锛屽畠鏍规嵁this.params鐨勫�兼潵閰嶇疆闀垮害
+				// 杩涘叆if瑙勫垯锛宨浼氬姞1锛屼繚璇佷簡鑳借幏鍙栧噯纭殑鍊�
+				if (this.params.year) this.year = this.years[this.valueArr[i++]];
+				if (this.params.month) this.month = this.months[this.valueArr[i++]];
+				if (this.params.day) this.day = this.days[this.valueArr[i++]];
+				if (this.params.hour) this.hour = this.hours[this.valueArr[i++]];
+				if (this.params.minute) this.minute = this.minutes[this.valueArr[i++]];
+				if (this.params.second) this.second = this.seconds[this.valueArr[i++]];
+			} else if (this.mode == 'region') {
+				if (this.params.province) this.province = this.valueArr[i++];
+				if (this.params.city) this.city = this.valueArr[i++];
+				if (this.params.area) this.area = this.valueArr[i++];
+			} else if (this.mode == 'multiSelector') {
+				let index = null;
+				// 瀵规瘮鍓嶅悗涓や釜鏁扮粍锛屽鎵惧彉鏇寸殑鏄摢涓�鍒楋紝濡傛灉鏌愪竴涓厓绱犱笉鍚岋紝鍗冲彲鍒ゅ畾璇ュ垪鍙戠敓浜嗗彉鍖�
+				this.defaultSelector.map((val, idx) => {
+					if (val != e.detail.value[idx]) index = idx;
+				});
+				// 涓轰簡璁╃敤鎴峰澶氬垪鍙樺寲鏃讹紝瀵瑰姩鎬佽缃叾浠栧垪鐨勫彉鏇�
+				if (index != null) {
+					this.$emit('columnchange', {
+						column: index,
+						index: e.detail.value[index]
+					});
+				}
+			}
+		},
+		// 鐢ㄦ埛鐐瑰嚮纭畾鎸夐挳
+		getResult(event = null) {
+			// #ifdef MP-WEIXIN
+			if (this.moving) return;
+			// #endif
+			let result = {};
+			// 鍙繑鍥炵敤鎴峰湪this.params涓厤缃簡涓簍rue鐨勫瓧娈�
+			if (this.mode == 'time') {
+				if (this.params.year) result.year = this.formatNumber(this.year || 0);
+				if (this.params.month) result.month = this.formatNumber(this.month || 0);
+				if (this.params.day) result.day = this.formatNumber(this.day || 0);
+				if (this.params.hour) result.hour = this.formatNumber(this.hour || 0);
+				if (this.params.minute) result.minute = this.formatNumber(this.minute || 0);
+				if (this.params.second) result.second = this.formatNumber(this.second || 0);
+				if (this.params.timestamp) result.timestamp = this.getTimestamp();
+			} else if (this.mode == 'region') {
+				if (this.params.province) result.province = provinces[this.province];
+				if (this.params.city) result.city = citys[this.province][this.city];
+				if (this.params.area) result.area = areas[this.province][this.city][this.area];
+			} else if (this.mode == 'selector') {
+				result = this.valueArr;
+			} else if (this.mode == 'multiSelector') {
+				result = this.valueArr;
+			}
+			if (event) this.$emit(event, result);
+			this.close();
+		},
+		// 鑾峰彇鏃堕棿鎴�
+		getTimestamp() {
+			// yyyy-mm-dd涓哄畨鍗撳啓娉曪紝涓嶆敮鎸乮OS锛岄渶瑕佷娇鐢�"/"鍒嗛殧锛屾墠鑳戒簩鑰呭吋瀹�
+			let time = this.year + '/' + this.month + '/' + this.day + ' ' + this.hour + ':' + this.minute + ':' + this.second;
+			return new Date(time).getTime() / 1000;
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/style.components.scss';
+
+.u-datetime-picker {
+	position: relative;
+	z-index: 999;
+}
+
+.u-picker-view {
+	height: 100%;
+	box-sizing: border-box;
+}
+
+.u-picker-header {
+	width: 100%;
+	height: 90rpx;
+	padding: 0 40rpx;
+	@include vue-flex;
+	justify-content: space-between;
+	align-items: center;
+	box-sizing: border-box;
+	font-size: 30rpx;
+	background: #fff;
+	position: relative;
+}
+
+.u-picker-header::after {
+	content: '';
+	position: absolute;
+	border-bottom: 1rpx solid #eaeef1;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	bottom: 0;
+	right: 0;
+	left: 0;
+}
+
+.u-picker__title {
+	color: $u-content-color;
+}
+
+.u-picker-body {
+	width: 100%;
+	height: 500rpx;
+	overflow: hidden;
+	background-color: #fff;
+}
+
+.u-column-item {
+	@include vue-flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 32rpx;
+	color: $u-main-color;
+	padding: 0 8rpx;
+}
+
+.u-text {
+	font-size: 24rpx;
+	padding-left: 8rpx;
+}
+
+.u-btn-picker {
+	padding: 16rpx;
+	box-sizing: border-box;
+	text-align: center;
+	text-decoration: none;
+}
+
+.u-opacity {
+	opacity: 0.5;
+}
+
+.u-btn-picker--primary {
+	color: $u-type-primary;
+}
+
+.u-btn-picker--tips {
+	color: $u-tips-color;
+}
+</style>
diff --git a/uview-ui/components/u-popup/u-popup.vue b/uview-ui/components/u-popup/u-popup.vue
new file mode 100644
index 0000000..69c0ec8
--- /dev/null
+++ b/uview-ui/components/u-popup/u-popup.vue
@@ -0,0 +1,456 @@
+<template>
+	<view v-if="visibleSync" :style="[customStyle, {
+		zIndex: uZindex - 1
+	}]" class="u-drawer" hover-stop-propagation>
+		<u-mask :duration="duration" :custom-style="maskCustomStyle" :maskClickAble="maskCloseAble" :z-index="uZindex - 2" :show="showDrawer && mask" @click="maskClick"></u-mask>
+		<view
+			class="u-drawer-content"
+			@tap="modeCenterClose(mode)"
+			:class="[
+				safeAreaInsetBottom ? 'safe-area-inset-bottom' : '',
+				'u-drawer-' + mode,
+				showDrawer ? 'u-drawer-content-visible' : '',
+				zoom && mode == 'center' ? 'u-animation-zoom' : ''
+			]"
+			@touchmove.stop.prevent
+			@tap.stop.prevent
+			:style="[style]"
+		>
+			<view class="u-mode-center-box" @tap.stop.prevent @touchmove.stop.prevent v-if="mode == 'center'" :style="[centerStyle]">
+				<u-icon
+					@click="close"
+					v-if="closeable"
+					class="u-close"
+					:class="['u-close--' + closeIconPos]"
+					:name="closeIcon"
+					:color="closeIconColor"
+					:size="closeIconSize"
+				></u-icon>
+				<scroll-view class="u-drawer__scroll-view" scroll-y="true">
+					<slot />
+				</scroll-view>
+			</view>
+			<scroll-view class="u-drawer__scroll-view" scroll-y="true" v-else>
+				<slot />
+			</scroll-view>
+			<view @tap="close" class="u-close" :class="['u-close--' + closeIconPos]">
+				<u-icon
+					v-if="mode != 'center' && closeable"
+					:name="closeIcon"
+					:color="closeIconColor"
+					:size="closeIconSize"
+				></u-icon>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * popup 寮圭獥
+ * @description 寮瑰嚭灞傚鍣紝鐢ㄤ簬灞曠ず寮圭獥銆佷俊鎭彁绀虹瓑鍐呭锛屾敮鎸佷笂銆佷笅銆佸乏銆佸彸鍜屼腑閮ㄥ脊鍑恒�傜粍浠跺彧鎻愪緵瀹瑰櫒锛屽唴閮ㄥ唴瀹圭敱鐢ㄦ埛鑷畾涔�
+ * @tutorial https://www.uviewui.com/components/popup.html
+ * @property {String} mode 寮瑰嚭鏂瑰悜锛堥粯璁eft锛�
+ * @property {Boolean} mask 鏄惁鏄剧ず閬僵锛堥粯璁rue锛�
+ * @property {Stringr | Number} length mode=left | 瑙佸畼缃戣鏄庯紙榛樿auto锛�
+ * @property {Boolean} zoom 鏄惁寮�鍚缉鏀惧姩鐢伙紝鍙湪mode涓篶enter鏃舵湁鏁堬紙榛樿true锛�
+ * @property {Boolean} safe-area-inset-bottom 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛堥粯璁alse锛�
+ * @property {Boolean} mask-close-able 鐐瑰嚮閬僵鏄惁鍙互鍏抽棴寮瑰嚭灞傦紙榛樿true锛�
+ * @property {Object} custom-style 鐢ㄦ埛鑷畾涔夋牱寮�
+ * @property {Stringr | Number} negative-top 涓儴寮瑰嚭鏃讹紝寰�涓婂亸绉荤殑鍊�
+ * @property {Numberr | String} border-radius 寮圭獥鍦嗚鍊硷紙榛樿0锛�
+ * @property {Numberr | String} z-index 寮瑰嚭鍐呭鐨剒-index鍊硷紙榛樿1075锛�
+ * @property {Boolean} closeable 鏄惁鏄剧ず鍏抽棴鍥炬爣锛堥粯璁alse锛�
+ * @property {String} close-icon 鍏抽棴鍥炬爣鐨勫悕绉帮紝鍙兘uView鐨勫唴缃浘鏍�
+ * @property {String} close-icon-pos 鑷畾涔夊叧闂浘鏍囦綅缃紙榛樿top-right锛�
+ * @property {String} close-icon-color 鍏抽棴鍥炬爣鐨勯鑹诧紙榛樿#909399锛�
+ * @property {Number | String} close-icon-size 鍏抽棴鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�30锛�
+ * @event {Function} open 寮瑰嚭灞傛墦寮�
+ * @event {Function} close 寮瑰嚭灞傛敹璧�
+ * @example <u-popup v-model="show"><view>鍑烘筏娉ヨ�屼笉鏌擄紝婵竻娑熻�屼笉濡�</view></u-popup>
+ */
+export default {
+	name: 'u-popup',
+	props: {
+		/**
+		 * 鏄剧ず鐘舵��
+		 */
+		show: {
+			type: Boolean,
+			default: false
+		},
+		/**
+		 * 寮瑰嚭鏂瑰悜锛宭eft|right|top|bottom|center
+		 */
+		mode: {
+			type: String,
+			default: 'left'
+		},
+		/**
+		 * 鏄惁鏄剧ず閬僵
+		 */
+		mask: {
+			type: Boolean,
+			default: true
+		},
+		// 鎶藉眽鐨勫搴�(mode=left|right)锛屾垨鑰呴珮搴�(mode=top|bottom)锛屽崟浣峳px锛屾垨鑰�"auto"
+		// 鎴栬�呯櫨鍒嗘瘮"50%"锛岃〃绀虹敱鍐呭鎾戝紑楂樺害鎴栬�呭搴�
+		length: {
+			type: [Number, String],
+			default: 'auto'
+		},
+		// 鏄惁寮�鍚缉鏀惧姩鐢伙紝鍙湪mode=center鏃舵湁鏁�
+		zoom: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤锛屽紑鍚殑璇濓紝浼氬湪iPhoneX鏈哄瀷搴曢儴娣诲姞涓�瀹氱殑鍐呰竟璺�
+		safeAreaInsetBottom: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鍙互閫氳繃鐐瑰嚮閬僵杩涜鍏抽棴
+		maskCloseAble: {
+			type: Boolean,
+			default: true
+		},
+		// 鐢ㄦ埛鑷畾涔夋牱寮�
+		customStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		value: {
+			type: Boolean,
+			default: false
+		},
+		// 姝や负鍐呴儴鍙傛暟锛屼笉鍦ㄦ枃妗e澶栦娇鐢紝涓轰簡瑙e喅Picker鍜宬eyboard绛夎瀺鍚堜簡寮圭獥鐨勭粍浠�
+		// 瀵箆-model鍙屽悜缁戝畾澶氬眰璋冪敤閫犳垚鎶ラ敊涓嶈兘淇敼props鍊肩殑闂
+		popup: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄剧ず鏄剧ず寮圭獥鐨勫渾瑙掞紝鍗曚綅rpx
+		borderRadius: {
+			type: [Number, String],
+			default: 0
+		},
+		zIndex: {
+			type: [Number, String],
+			default: ''
+		},
+		// 鏄惁鏄剧ず鍏抽棴鍥炬爣
+		closeable: {
+			type: Boolean,
+			default: false
+		},
+		// 鍏抽棴鍥炬爣鐨勫悕绉帮紝鍙兘uView鐨勫唴缃浘鏍�
+		closeIcon: {
+			type: String,
+			default: 'close'
+		},
+		// 鑷畾涔夊叧闂浘鏍囦綅缃紝top-left涓哄乏涓婅锛宼op-right涓哄彸涓婅锛宐ottom-left涓哄乏涓嬭锛宐ottom-right涓哄彸涓嬭
+		closeIconPos: {
+			type: String,
+			default: 'top-right'
+		},
+		// 鍏抽棴鍥炬爣鐨勯鑹�
+		closeIconColor: {
+			type: String,
+			default: '#909399'
+		},
+		// 鍏抽棴鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx
+		closeIconSize: {
+			type: [String, Number],
+			default: '30'
+		},
+		// 瀹藉害锛屽彧瀵瑰乏锛屽彸锛屼腑閮ㄥ脊鍑烘椂璧蜂綔鐢紝鍗曚綅rpx锛屾垨鑰�"auto"
+		// 鎴栬�呯櫨鍒嗘瘮"50%"锛岃〃绀虹敱鍐呭鎾戝紑楂樺害鎴栬�呭搴︼紝浼樺厛绾ч珮浜巐ength鍙傛暟
+		width: {
+			type: String,
+			default: ''
+		},
+		// 楂樺害锛屽彧瀵逛笂锛屼笅锛屼腑閮ㄥ脊鍑烘椂璧蜂綔鐢紝鍗曚綅rpx锛屾垨鑰�"auto"
+		// 鎴栬�呯櫨鍒嗘瘮"50%"锛岃〃绀虹敱鍐呭鎾戝紑楂樺害鎴栬�呭搴︼紝浼樺厛绾ч珮浜巐ength鍙傛暟
+		height: {
+			type: String,
+			default: ''
+		},
+		// 缁欎竴涓礋鐨刴argin-top锛屽線涓婂亸绉伙紝閬垮厤鍜岄敭鐩橀噸鍚堢殑鎯呭喌锛屼粎鍦╩ode=center鏃舵湁鏁�
+		negativeTop: {
+			type: [String, Number],
+			default: 0
+		},
+		// 閬僵鐨勬牱寮忥紝涓�鑸敤浜庝慨鏀归伄缃╃殑閫忔槑搴�
+		maskCustomStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		// 閬僵鎵撳紑鎴栨敹璧风殑鍔ㄧ敾杩囨浮鏃堕棿锛屽崟浣峬s
+		duration: {
+			type: [String, Number],
+			default: 250
+		}
+	},
+	data() {
+		return {
+			visibleSync: false,
+			showDrawer: false,
+			timer: null,
+			closeFromInner: false, // value鐨勫�兼敼鍙橈紝鏄彂鐢熷湪鍐呴儴杩樻槸澶栭儴
+		};
+	},
+	computed: {
+		// 鏍规嵁mode鐨勪綅缃紝璁惧畾鍏跺脊绐楃殑瀹藉害(mode = left|right)锛屾垨鑰呴珮搴�(mode = top|bottom)
+		style() {
+			let style = {};
+			// 濡傛灉鏄乏杈规垨鑰呬笂杈瑰脊鍑烘椂锛岄渶瑕佺粰translate璁剧疆涓鸿礋鍊硷紝鐢ㄤ簬闅愯棌
+			if (this.mode == 'left' || this.mode == 'right') {
+				style = {
+					width: this.width ? this.getUnitValue(this.width) : this.getUnitValue(this.length),
+					height: '100%',
+					transform: `translate3D(${this.mode == 'left' ? '-100%' : '100%'},0px,0px)`
+				};
+			} else if (this.mode == 'top' || this.mode == 'bottom') {
+				style = {
+					width: '100%',
+					height: this.height ? this.getUnitValue(this.height) : this.getUnitValue(this.length),
+					transform: `translate3D(0px,${this.mode == 'top' ? '-100%' : '100%'},0px)`
+				};
+			}
+			style.zIndex = this.uZindex;
+			// 濡傛灉鐢ㄦ埛璁剧疆浜哹orderRadius鍊硷紝娣诲姞寮圭獥鐨勫渾瑙�
+			if (this.borderRadius) {
+				switch (this.mode) {
+					case 'left':
+						style.borderRadius = `0 ${this.borderRadius}rpx ${this.borderRadius}rpx 0`;
+						break;
+					case 'top':
+						style.borderRadius = `0 0 ${this.borderRadius}rpx ${this.borderRadius}rpx`;
+						break;
+					case 'right':
+						style.borderRadius = `${this.borderRadius}rpx 0 0 ${this.borderRadius}rpx`;
+						break;
+					case 'bottom':
+						style.borderRadius = `${this.borderRadius}rpx ${this.borderRadius}rpx 0 0`;
+						break;
+					default:
+				}
+				// 涓嶅姞鍙兘鍦嗚鏃犳晥
+				style.overflow = 'hidden';
+			}
+			if(this.duration) style.transition = `all ${this.duration / 1000}s linear`;
+			return style;
+		},
+		// 涓儴寮圭獥鐨勭壒鏈夋牱寮�
+		centerStyle() {
+			let style = {};
+			style.width = this.width ? this.getUnitValue(this.width) : this.getUnitValue(this.length);
+			// 涓儴寮瑰嚭鐨勬ā寮忥紝濡傛灉娌℃湁璁剧疆楂樺害锛屽氨鐢╝uto鍊硷紝鐢卞唴瀹规拺寮�楂樺害
+			style.height = this.height ? this.getUnitValue(this.height) : 'auto';
+			style.zIndex = this.uZindex;
+			style.marginTop = `-${this.$u.addUnit(this.negativeTop)}`;
+			if (this.borderRadius) {
+				style.borderRadius = `${this.borderRadius}rpx`;
+				// 涓嶅姞鍙兘鍦嗚鏃犳晥
+				style.overflow = 'hidden';
+			}
+			return style;
+		},
+		// 璁$畻鏁寸悊鍚庣殑z-index鍊�
+		uZindex() {
+			return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+		}
+	},
+	watch: {
+		value(val) {
+			if (val) {
+				this.open();
+			} else if(!this.closeFromInner) {
+				this.close();
+			}
+			this.closeFromInner = false;
+		}
+	},
+	mounted() {
+		// 缁勪欢娓叉煋瀹屾垚鏃讹紝妫�鏌alue鏄惁涓簍rue锛屽鏋滄槸锛屽脊鍑簆opup
+		this.value && this.open();
+	},
+    methods: {
+		// 鍒ゆ柇浼犲叆鐨勫�硷紝鏄惁甯︽湁鍗曚綅锛屽鏋滄病鏈夛紝灏遍粯璁ょ敤rpx鍗曚綅
+		getUnitValue(val) {
+			if(/(%|px|rpx|auto)$/.test(val)) return val;
+			else return val + 'rpx'
+		},
+		// 閬僵琚偣鍑�
+		maskClick() {
+			this.close();
+		},
+		close() {
+			// 鏍囪鍏抽棴鏄唴閮ㄥ彂鐢熺殑锛屽惁鍒欎慨鏀逛簡value鍊硷紝瀵艰嚧watch涓value妫�娴嬶紝瀵艰嚧鍐嶆墽琛屼竴閬峜lose
+			// 閫犳垚@close浜嬩欢瑙﹀彂涓ゆ
+			this.closeFromInner = true;
+			this.change('showDrawer', 'visibleSync', false);
+		},
+		// 涓儴寮瑰嚭鏃讹紝闇�瑕�.u-drawer-content灏嗗眳涓唴瀹癸紝姝ゅ厓绱犱細閾烘弧灞忓箷锛岀偣鍑婚渶瑕佸叧闂脊绐�
+		// 璁╁叾鍙湪mode=center鏃惰捣浣滅敤
+		modeCenterClose(mode) {
+			if (mode != 'center' || !this.maskCloseAble) return;
+			this.close();
+		},
+		open() {
+			this.change('visibleSync', 'showDrawer', true);
+		},
+		// 姝ゅ鐨勫師鐞嗘槸锛屽叧闂椂鍏堥�氳繃鍔ㄧ敾闅愯棌寮圭獥鍜岄伄缃╋紝鍐嶇Щ闄ゆ暣涓粍浠�
+		// 鎵撳紑鏃讹紝鍏堟覆鏌撶粍浠讹紝寤舵椂涓�瀹氭椂闂村啀璁╅伄缃╁拰寮圭獥鐨勫姩鐢昏捣浣滅敤
+		change(param1, param2, status) {
+			// 濡傛灉this.popup涓篺alse锛屾剰鍛崇潃涓簆icker锛宎ctionsheet绛夌粍浠惰皟鐢ㄤ簡popup缁勪欢
+			if (this.popup == true) {
+				this.$emit('input', status);
+			}
+			this[param1] = status;
+			if(status) {
+				// #ifdef H5 || MP
+				this.timer = setTimeout(() => {
+					this[param2] = status;
+					this.$emit(status ? 'open' : 'close');
+				}, 50);
+				// #endif
+				// #ifndef H5 || MP
+				this.$nextTick(() => {
+					this[param2] = status;
+					this.$emit(status ? 'open' : 'close');
+				})
+				// #endif
+			} else {
+				this.timer = setTimeout(() => {
+					this[param2] = status;
+					this.$emit(status ? 'open' : 'close');
+				}, this.duration);
+			}
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+
+.u-drawer {
+	/* #ifndef APP-NVUE */
+	display: block;
+	/* #endif */
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	overflow: hidden;
+}
+
+.u-drawer-content {
+	/* #ifndef APP-NVUE */
+	display: block;
+	/* #endif */
+	position: absolute;
+	z-index: 1003;
+	transition: all 0.25s linear;
+}
+
+.u-drawer__scroll-view {
+	width: 100%;
+	height: 100%;
+}
+
+.u-drawer-left {
+	top: 0;
+	bottom: 0;
+	left: 0;
+	background-color: #ffffff;
+}
+
+.u-drawer-right {
+	right: 0;
+	top: 0;
+	bottom: 0;
+	background-color: #ffffff;
+}
+
+.u-drawer-top {
+	top: 0;
+	left: 0;
+	right: 0;
+	background-color: #ffffff;
+}
+
+.u-drawer-bottom {
+	bottom: 0;
+	left: 0;
+	right: 0;
+	background-color: #ffffff;
+}
+
+.u-drawer-center {
+	@include vue-flex;
+	flex-direction: column;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	top: 0;
+	justify-content: center;
+	align-items: center;
+	opacity: 0;
+	z-index: 99999;
+}
+
+.u-mode-center-box {
+	min-width: 100rpx;
+	min-height: 100rpx;
+	/* #ifndef APP-NVUE */
+	display: block;
+	/* #endif */
+	position: relative;
+	background-color: #ffffff;
+}
+
+.u-drawer-content-visible.u-drawer-center {
+	transform: scale(1);
+	opacity: 1;
+}
+
+.u-animation-zoom {
+	transform: scale(1.15);
+}
+
+.u-drawer-content-visible {
+	transform: translate3D(0px, 0px, 0px) !important;
+}
+
+.u-close {
+	position: absolute;
+	z-index: 3;
+}
+
+.u-close--top-left {
+	top: 30rpx;
+	left: 30rpx;
+}
+
+.u-close--top-right {
+	top: 30rpx;
+	right: 30rpx;
+}
+
+.u-close--bottom-left {
+	bottom: 30rpx;
+	left: 30rpx;
+}
+
+.u-close--bottom-right {
+	right: 30rpx;
+	bottom: 30rpx;
+}
+</style>
diff --git a/uview-ui/components/u-radio-group/u-radio-group.vue b/uview-ui/components/u-radio-group/u-radio-group.vue
new file mode 100644
index 0000000..0c91447
--- /dev/null
+++ b/uview-ui/components/u-radio-group/u-radio-group.vue
@@ -0,0 +1,128 @@
+<template>
+	<view class="u-radio-group u-clearfix">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	import Emitter from '../../libs/util/emitter.js';
+	/**
+	 * radioRroup 鍗曢�夋鐖剁粍浠�
+	 * @description 鍗曢�夋鐢ㄤ簬鏈変竴涓�夋嫨锛岀敤鎴峰彧鑳介�夋嫨鍏朵腑涓�涓殑鍦烘櫙銆傛惌閰島-radio浣跨敤
+	 * @tutorial https://www.uviewui.com/components/radio.html
+	 * @property {Boolean} disabled 鏄惁绂佺敤鎵�鏈塺adio锛堥粯璁alse锛�
+	 * @property {String Number} size 缁勪欢鏁翠綋鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�40锛�
+	 * @property {String} active-color 閫変腑鏃剁殑棰滆壊锛屽簲鐢ㄥ埌鎵�鏈夊瓙Radio缁勪欢锛堥粯璁�#497bff锛�
+	 * @property {String Number} icon-size 鍥炬爣澶у皬锛屽崟浣峳px锛堥粯璁�20锛�
+	 * @property {String} shape 澶栬褰㈢姸锛宻hape-鏂瑰舰锛宑ircle-鍦嗗舰(榛樿circle)
+	 * @property {Boolean} label-disabled 鏄惁绂佹鐐瑰嚮鏂囨湰鎿嶄綔checkbox(榛樿false)
+	 * @property {String} width 瀹藉害锛岄渶甯﹀崟浣�
+	 * @property {Boolean} wrap 鏄惁姣忎釜radio閮芥崲琛岋紙榛樿false锛�
+	 * @event {Function} change 浠讳竴涓猺adio鐘舵�佸彂鐢熷彉鍖栨椂瑙﹀彂
+	 * @example <u-radio-group v-model="value"></u-radio-group>
+	 */
+	export default {
+		name: "u-radio-group",
+		mixins: [Emitter],
+		props: {
+			// 鏄惁绂佺敤鎵�鏈夊崟閫夋
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 鍖归厤鏌愪竴涓猺adio缁勪欢锛屽鏋滄煇涓猺adio鐨刵ame鍊肩瓑浜庢鍊硷紝閭d箞杩欎釜radio灏辫浼氶�変腑
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// 閫変腑鐘舵�佷笅鐨勯鑹�
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 缁勪欢鐨勬暣浣撳ぇ灏�
+			size: {
+				type: [String, Number],
+				default: 34
+			},
+			// 鏄惁绂佹鐐瑰嚮鎻愮ず璇�変腑澶嶉�夋
+			labelDisabled: {
+				type: Boolean,
+				default: false
+			},
+			// 褰㈢姸锛宻quare涓烘柟褰紝circle涓哄師鍨�
+			shape: {
+				type: String,
+				default: 'circle'
+			},
+			// 鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx
+			iconSize: {
+				type: [String, Number],
+				default: 20
+			},
+			// 姣忎釜checkbox鍗爑-checkbox-group鐨勫搴�
+			width: {
+				type: [String, Number],
+				default: 'auto'
+			},
+			// 鏄惁姣忎釜checkbox閮芥崲琛�
+			wrap: {
+				type: Boolean,
+				default: false
+			}
+		},
+		created() {
+			// 濡傛灉灏哻hildren瀹氫箟鍦╠ata涓紝鍦ㄥ井淇″皬绋嬪簭浼氶�犳垚寰幆寮曠敤鑰屾姤閿�
+			this.children = [];
+		},
+		watch: {
+			// 褰撶埗缁勪欢闇�瑕佸瓙缁勪欢闇�瑕佸叡浜殑鍙傛暟鍙戠敓浜嗗彉鍖栵紝鎵嬪姩閫氱煡瀛愮粍浠�
+			parentData() {
+				if(this.children.length) {
+					this.children.map(child => {
+						// 鍒ゆ柇瀛愮粍浠�(u-radio)濡傛灉鏈塽pdateParentData鏂规硶鐨勮瘽锛屽氨灏辨墽琛�(鎵ц鐨勭粨鏋滄槸瀛愮粍浠堕噸鏂颁粠鐖剁粍浠舵媺鍙栦簡鏈�鏂扮殑鍊�)
+						typeof(child.updateParentData) == 'function' && child.updateParentData();
+					})
+				}
+			},
+		},
+		computed: {
+			// 杩欓噷computed鐨勫彉閲忥紝閮芥槸瀛愮粍浠秛-radio闇�瑕佺敤鍒扮殑锛岀敱浜庡ご鏉″皬绋嬪簭鐨勫吋瀹规�у樊寮傦紝瀛愮粍浠舵棤娉曞疄鏃剁洃鍚埗缁勪欢鍙傛暟鐨勫彉鍖�
+			// 鎵�浠ラ渶瑕佹墜鍔ㄩ�氱煡瀛愮粍浠讹紝杩欓噷杩斿洖涓�涓猵arentData鍙橀噺锛屼緵watch鐩戝惉锛屽湪鍏朵腑鍘婚�氱煡姣忎竴涓瓙缁勪欢閲嶆柊浠庣埗缁勪欢(u-radio-group)
+			// 鎷夊彇鐖剁粍浠舵柊鐨勫彉鍖栧悗鐨勫弬鏁�
+			parentData() {
+				return [this.value, this.disabled, this.activeColor, this.size, this.labelDisabled, this.shape, this.iconSize, this.width, this.wrap];
+			}
+		},
+		methods: {
+			// 璇ユ柟娉曟湁瀛愮粍浠秗adio璋冪敤锛屽綋涓�涓猺adio琚�変腑鐨勬椂鍊欙紝缁欑埗缁勪欢璁剧疆value鍊�(props浼犻�掔殑value)
+			setValue(val) {
+				// 閫氳繃瀛愮粍浠朵紶閫掕繃鏉ョ殑val鍊�(姝よ閫変腑鐨勫瓙缁勪欢鍐呴儴宸插皢parentValue璁剧疆绛変簬val鐨勫��)锛屽皢鍏朵粬
+				// u-radio璁剧疆鏈�変腑鐨勭姸鎬�
+				this.children.map(child => {
+					if(child.parentData.value != val) child.parentData.value = '';
+				})
+				// 閫氳繃emit浜嬩欢锛岃缃埗缁勪欢閫氳繃v-model鍙屽悜缁戝畾鐨勫��
+				this.$emit('input', val);
+				this.$emit('change', val);
+				// 绛夊緟涓嬩竴涓懆鏈熷啀鎵ц锛屽洜涓簍his.$emit('input')浣滅敤浜庣埗缁勪欢锛屽啀鍙嶉鍒板瓙缁勪欢鍐呴儴锛岄渶瑕佹椂闂�
+				// 鐢变簬澶存潯灏忕▼搴忔墽琛岃繜閽濓紝鏁呴渶瑕佺敤鍑犲崄姣鐨勫欢鏃�
+				setTimeout(() => {
+					// 灏嗗綋鍓嶇殑鍊煎彂閫佸埌 u-form-item 杩涜鏍¢獙
+					this.dispatch('u-form-item', 'on-form-change', val);
+				}, 60)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-radio-group {
+		/* #ifndef MP || APP-NVUE */
+		display: inline-flex;
+		flex-wrap: wrap;
+		/* #endif */
+	}
+</style>
diff --git a/uview-ui/components/u-radio/u-radio.vue b/uview-ui/components/u-radio/u-radio.vue
new file mode 100644
index 0000000..f540309
--- /dev/null
+++ b/uview-ui/components/u-radio/u-radio.vue
@@ -0,0 +1,276 @@
+<template>
+	<view class="u-radio" :style="[radioStyle]">
+		<view class="u-radio__icon-wrap" @tap="toggle" :class="[iconClass]" :style="[iconStyle]">
+			<u-icon
+				class="u-radio__icon-wrap__icon"
+			    name="checkbox-mark"
+			    :size="elIconSize" 
+				:color="iconColor"/>
+		</view>
+		<view class="u-radio__label" @tap="onClickLabel" :style="{
+			fontSize: $u.addUnit(labelSize)
+		}">
+			<slot />
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * radio 鍗曢�夋
+	 * @description 鍗曢�夋鐢ㄤ簬鏈変竴涓�夋嫨锛岀敤鎴峰彧鑳介�夋嫨鍏朵腑涓�涓殑鍦烘櫙銆傛惌閰島-radio-group浣跨敤
+	 * @tutorial https://www.uviewui.com/components/radio.html
+	 * @property {String Number} icon-size 鍥炬爣澶у皬锛屽崟浣峳px锛堥粯璁�24锛�
+	 * @property {String Number} label-size label瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+	 * @property {String Number} name radio缁勪欢鐨勬爣绀虹
+	 * @property {String} shape 褰㈢姸锛岃涓婃柟璇存槑锛堥粯璁ircle锛�
+	 * @property {Boolean} disabled 鏄惁绂佺敤锛堥粯璁alse锛�
+	 * @property {Boolean} label-disabled 鐐瑰嚮鏂囨湰鏄惁鍙互鎿嶄綔radio锛堥粯璁rue锛�
+	 * @property {String} active-color 閫変腑鏃剁殑棰滆壊锛屽璁剧疆parent鐨刟ctive-color灏嗗け鏁�
+	 * @event {Function} change 鏌愪釜radio鐘舵�佸彂鐢熷彉鍖栨椂瑙﹀彂(閫変腑鐘舵��)
+	 * @example <u-radio :label-disabled="false">闂ㄦ帺榛勬槒锛屾棤璁$暀鏄ヤ綇</u-radio>
+	 */
+	export default {
+		name: "u-radio",
+		props: {
+			// radio鐨勫悕绉�
+			name: {
+				type: [String, Number],
+				default: ''
+			},
+			// 褰㈢姸锛宻quare涓烘柟褰紝circle涓哄師鍨�
+			shape: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁绂佺敤
+			disabled: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// 鏄惁绂佹鐐瑰嚮鎻愮ず璇�変腑澶嶉�夋
+			labelDisabled: {
+				type: [String, Boolean],
+				default: ''
+			},
+			// 閫変腑鐘舵�佷笅鐨勯鑹诧紝濡傝缃鍊硷紝灏嗕細瑕嗙洊parent鐨刟ctiveColor鍊�
+			activeColor: {
+				type: String,
+				default: ''
+			},
+			// 鍥炬爣鐨勫ぇ灏忥紝鍗曚綅rpx
+			iconSize: {
+				type: [String, Number],
+				default: ''
+			},
+			// label鐨勫瓧浣撳ぇ灏忥紝rpx鍗曚綅
+			labelSize: {
+				type: [String, Number],
+				default: ''
+			},
+		},
+		data() {
+			return {
+				// 鐖剁粍浠剁殑榛樿鍊硷紝鍥犱负澶存潯灏忕▼搴忎笉鏀寔鍦╟omputed涓娇鐢╰his.parent.shape鐨勫舰寮�
+				// 鏁呭彧鑳戒娇鐢ㄥ姝ゆ柟娉�
+				parentData: {
+					iconSize: null,
+					labelDisabled: null,
+					disabled: null,
+					shape: null,
+					activeColor: null,
+					size: null,
+					width: null,
+					height: null,
+					value: null,
+					wrap: null
+				}
+			};
+		},
+		created() {
+			this.parent = false;
+			// 鏀粯瀹濆皬绋嬪簭涓嶆敮鎸乸rovide/inject锛屾墍浠ヤ娇鐢ㄨ繖涓柟娉曡幏鍙栨暣涓埗缁勪欢锛屽湪created瀹氫箟锛岄伩鍏嶅惊鐜紩鐢�
+			this.updateParentData();
+			this.parent.children.push(this);
+		},
+		computed: {
+			// 鏄惁绂佺敤锛屽鏋滅埗缁勪欢u-raios-group绂佺敤鐨勮瘽锛屽皢浼氬拷鐣ュ瓙缁勪欢鐨勯厤缃�
+			elDisabled() {
+				return this.disabled !== '' ? this.disabled : this.parentData.disabled !== null ? this.parentData.disabled : false;
+			},
+			// 鏄惁绂佺敤label鐐瑰嚮
+			elLabelDisabled() {
+				return this.labelDisabled !== '' ? this.labelDisabled : this.parentData.labelDisabled !== null ? this.parentData.labelDisabled : false;
+			},
+			// 缁勪欢灏哄锛屽搴攕ize鐨勫�硷紝榛樿鍊间负34rpx
+			elSize() {
+				return this.size ? this.size : (this.parentData.size ? this.parentData.size : 34);
+			},
+			// 缁勪欢鐨勫嬀閫夊浘鏍囩殑灏哄锛岄粯璁�20
+			elIconSize() {
+				return this.iconSize ? this.iconSize : (this.parentData.iconSize ? this.parentData.iconSize : 20);
+			},
+			// 缁勪欢閫変腑婵�娲绘椂鐨勯鑹�
+			elActiveColor() {
+				return this.activeColor ? this.activeColor : (this.parentData.activeColor ? this.parentData.activeColor : 'primary');
+			},
+			// 缁勪欢鐨勫舰鐘�
+			elShape() {
+				return this.shape ? this.shape : (this.parentData.shape ? this.parentData.shape : 'circle');
+			},
+			// 璁剧疆radio鐨勭姸鎬侊紝瑕佹眰radio鐨刵ame绛変簬parent鐨剉alue鏃舵墠涓洪�変腑鐘舵��
+			iconStyle() {
+				let style = {};
+				if (this.elActiveColor && this.parentData.value == this.name && !this.elDisabled) {
+					style.borderColor = this.elActiveColor;
+					style.backgroundColor = this.elActiveColor;
+				}
+				style.width = this.$u.addUnit(this.elSize);
+				style.height = this.$u.addUnit(this.elSize);
+				return style;
+			},
+			iconColor() {
+				return this.name ==  this.parentData.value ? '#ffffff' : 'transparent';
+			},
+			iconClass() {
+				let classes = [];
+				classes.push('u-radio__icon-wrap--' + this.elShape);
+				if (this.name == this.parentData.value) classes.push('u-radio__icon-wrap--checked');
+				if (this.elDisabled) classes.push('u-radio__icon-wrap--disabled');
+				if (this.name == this.parentData.value && this.elDisabled) classes.push(
+					'u-radio__icon-wrap--disabled--checked');
+				// 鏀粯瀹濆皬绋嬪簭鏃犳硶鍔ㄦ�佺粦瀹氫竴涓暟缁勭被鍚嶏紝鍚﹀垯瑙f瀽鍑烘潵鐨勭粨鏋滀細甯︽湁","锛岃�屽鑷村け鏁�
+				return classes.join(' ');
+			},
+			radioStyle() {
+				let style = {};
+				if (this.parentData.width) {
+					style.width = this.$u.addUnit(this.parentData.width);
+					// #ifdef MP
+					// 鍚勫灏忕▼搴忓洜涓哄畠浠壒娈婄殑缂栬瘧缁撴瀯锛屼娇鐢╢loat甯冨眬
+					style.float = 'left';
+					// #endif
+					// #ifndef MP
+					// H5鍜孉PP浣跨敤flex甯冨眬
+					style.flex = `0 0 ${this.$u.addUnit(this.parentData.width)}`;
+					// #endif
+				}
+				if (this.parentData.wrap) {
+					style.width = '100%';
+					// #ifndef MP
+					// H5鍜孉PP浣跨敤flex甯冨眬锛屽皢瀹藉害璁剧疆100%锛屽嵆鍙嚜鍔ㄦ崲琛�
+					style.flex = '0 0 100%';
+					// #endif
+				}
+				return style;
+			}
+		},
+		methods: {
+			updateParentData() {
+				this.getParentData('u-radio-group');
+			},
+			onClickLabel() {
+				if (!this.elLabelDisabled && !this.elDisabled) {
+					this.setRadioCheckedStatus();
+				}
+			},
+			toggle() {
+				if (!this.elDisabled) {
+					this.setRadioCheckedStatus();
+				}
+			},
+			emitEvent() {
+				// u-radio鐨刵ame涓嶇瓑浜庣埗缁勪欢鐨剉-model鐨勫�兼椂(鎰忓懗鐫�鏈�変腑)锛屾墠鍙戝嚭浜嬩欢锛岄伩鍏嶅娆$偣鍑昏Е鍙戜簨浠�
+				if(this.parentData.value != this.name) this.$emit('change', this.name);
+			},
+			// 鏀瑰彉缁勪欢閫変腑鐘舵��
+			// 杩欓噷鐨勬敼鍙樼殑渚濇嵁鏄紝鏇存敼鏈粍浠剁殑parentData.value鍊间负鏈粍浠剁殑name鍊硷紝鍚屾椂閫氳繃鐖剁粍浠堕亶鍘嗘墍鏈塽-radio瀹炰緥
+			// 灏嗘湰缁勪欢澶栫殑鍏朵粬u-radio鐨刾arentData.value閮借缃负绌�(鐢眂omputed璁$畻鍚庯紝閮借鍙栨秷閫変腑鐘舵��)锛屽洜鑰屽彧鍓╀笅涓�涓负閫変腑鐘舵��
+			setRadioCheckedStatus() {
+				this.emitEvent();
+				if(this.parent) {
+					if (this.parentData.value !== this.name) {
+						this.parent.setValue(this.name);
+						this.parentData.value = this.name;
+					} else {
+						this.parent.setValue('');
+						this.parentData.value = '';
+					}
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-radio {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		align-items: center;
+		overflow: hidden;
+		user-select: none;
+		line-height: 1.8;
+		
+		&__icon-wrap {
+			color: $u-content-color;
+			@include vue-flex;
+			flex: none;
+			align-items: center;
+			justify-content: center;
+			box-sizing: border-box;
+			width: 42rpx;
+			height: 42rpx;
+			color: transparent;
+			text-align: center;
+			transition-property: color, border-color, background-color;
+			font-size: 20px;
+			border: 1px solid #c8c9cc;
+			transition-duration: 0.2s;
+			
+			/* #ifdef MP-TOUTIAO */
+			// 澶存潯灏忕▼搴忓吋瀹规�ч棶棰橈紝闇�瑕佽缃楂樹负0锛屽惁鍒欏浘鏍囧亸涓�
+			&__icon {
+				line-height: 0;
+			}
+			/* #endif */
+			
+			&--circle {
+				border-radius: 100%;
+			}
+			
+			&--square {
+				border-radius: 3px;
+			}
+			
+			&--checked {
+				color: #fff;
+				background-color: #497bff;
+				border-color: #497bff;
+			}
+			
+			&--disabled {
+				background-color: #ebedf0;
+				border-color: #c8c9cc;
+			}
+			
+			&--disabled--checked {
+				color: #c8c9cc !important;
+			}
+		}
+		
+		&__label {
+			word-wrap: break-word;
+			margin-left: 10rpx;
+			margin-right: 24rpx;
+			color: $u-content-color;
+			font-size: 30rpx;
+			
+			&--disabled {
+				color: #c8c9cc;
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-rate/u-rate.vue b/uview-ui/components/u-rate/u-rate.vue
new file mode 100644
index 0000000..17eb3a8
--- /dev/null
+++ b/uview-ui/components/u-rate/u-rate.vue
@@ -0,0 +1,275 @@
+<template>
+	<view class="u-rate" :id="elId" @touchmove.stop.prevent="touchMove">
+		<view class="u-star-wrap" v-for="(item, index) in count" :key="index" :class="[elClass]">
+			<u-icon
+				:name="activeIndex > index ? elActiveIcon : inactiveIcon"
+				@click="click(index + 1, $event)"
+				:color="activeIndex > index ? elActiveColor : inactiveColor"
+				:custom-style="{
+					fontSize: size + 'rpx',
+					padding: `0 ${gutter / 2 + 'rpx'}`
+				}"
+				:custom-prefix="customPrefix"
+				:show-decimal-icon="showDecimalIcon(index)"
+				:percent="decimal"
+				:inactive-color="inactiveColor"
+			></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>/**
+ * rate 璇勫垎
+ * @description 璇ョ粍浠朵竴鑸敤浜庢弧鎰忓害璋冩煡锛屾槦鍨嬭瘎鍒嗙殑鍦烘櫙
+ * @tutorial https://www.uviewui.com/components/rate.html
+ * @property {String Number} count 鏈�澶氬彲閫夌殑鏄熸槦鏁伴噺锛堥粯璁�5锛�
+ * @property {String Number} current 榛樿閫変腑鐨勬槦鏄熸暟閲忥紙榛樿0锛�
+ * @property {Boolean} disabled 鏄惁绂佹鐢ㄦ埛鎿嶄綔锛堥粯璁alse锛�
+ * @property {String Number} size 鏄熸槦鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�32锛�
+ * @property {String} inactive-color 鏈�変腑鏄熸槦鐨勯鑹诧紙榛樿#b2b2b2锛�
+ * @property {String} active-color 閫変腑鐨勬槦鏄熼鑹诧紙榛樿#FA3534锛�
+ * @property {String} active-icon 閫変腑鏃剁殑鍥炬爣鍚嶏紝鍙兘涓簎View鐨勫唴缃浘鏍囷紙榛樿star-fill锛�
+ * @property {String} inactive-icon 鏈�変腑鏃剁殑鍥炬爣鍚嶏紝鍙兘涓簎View鐨勫唴缃浘鏍囷紙榛樿star锛�
+ * @property {String} gutter 鏄熸槦涔嬮棿鐨勮窛绂伙紙榛樿10锛�
+ * @property {String Number} min-count 鏈�灏戦�変腑鏄熸槦鐨勪釜鏁帮紙榛樿0锛�
+ * @property {Boolean} allow-half 鏄惁鍏佽鍗婃槦閫夋嫨锛堥粯璁alse锛�
+ * @event {Function} change 閫変腑鐨勬槦鏄熷彂鐢熷彉鍖栨椂瑙﹀彂
+ * @example <u-rate :count="count" :current="2"></u-rate>
+ */
+
+export default {
+	name: 'u-rate',
+	props: {
+		// 鐢ㄤ簬v-model鍙屽悜缁戝畾閫変腑鐨勬槦鏄熸暟閲�
+		// 1.4.5鐗堟柊澧�
+		value: {
+			type: [Number, String],
+			default: -1
+		},
+		// 瑕佹樉绀虹殑鏄熸槦鏁伴噺
+		count: {
+			type: [Number, String],
+			default: 5
+		},
+		// 褰撳墠闇�瑕侀粯璁ら�変腑鐨勬槦鏄�(閫変腑鐨勪釜鏁�)
+		// 1.4.5鍚庨�氳繃value鍙屽悜缁戝畾锛屼笉鍐嶅缓璁娇鐢ㄦ鍙傛暟
+		current: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鏄惁涓嶅彲閫変腑
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄熸槦鐨勫ぇ灏忥紝鍗曚綅rpx
+		size: {
+			type: [Number, String],
+			default: 32
+		},
+		// 鏈�変腑鏃剁殑棰滆壊
+		inactiveColor: {
+			type: String,
+			default: '#b2b2b2'
+		},
+		// 閫変腑鐨勯鑹�
+		activeColor: {
+			type: String,
+			default: '#FA3534'
+		},
+		// 鏄熸槦涔嬮棿鐨勯棿璺濓紝鍗曚綅rpx
+		gutter: {
+			type: [Number, String],
+			default: 10
+		},
+		// 鏈�灏戣兘閫夋嫨鐨勬槦鏄熶釜鏁�
+		minCount: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鏄惁鍏佽鍗婃槦(鍔熻兘灏氭湭瀹炵幇)
+		allowHalf: {
+			type: Boolean,
+			default: false
+		},
+		// 閫変腑鏃剁殑鍥炬爣(鏄熸槦)
+		activeIcon: {
+			type: String,
+			default: 'star-fill'
+		},
+		// 鏈�変腑鏃剁殑鍥炬爣(鏄熸槦)
+		inactiveIcon: {
+			type: String,
+			default: 'star'
+		},
+		// 鑷畾涔夋墿灞曞墠缂�锛屾柟渚跨敤鎴锋墿灞曡嚜宸辩殑鍥炬爣搴�
+		customPrefix: {
+			type: String,
+			default: 'uicon'
+		},
+		colors: {
+			type: Array,
+			default() {
+				return []
+			}
+		},
+		icons: {
+			type: Array,
+			default() {
+				return []
+			}
+		}
+	},
+	data() {
+		return {
+			// 鐢熸垚涓�涓敮涓�id锛屽惁鍒欎竴涓〉闈㈠涓瘎鍒嗙粍浠讹紝浼氶�犳垚鍐茬獊
+			elId: this.$u.guid(),
+			elClass: this.$u.guid(),
+			starBoxLeft: 0, // 璇勫垎鐩掑瓙宸﹁竟鍒板睆骞曞乏杈圭殑璺濈锛岀敤浜庢粦鍔ㄩ�夋嫨鏃惰绠楄窛绂�
+			// 褰撳墠婵�娲荤殑鏄熸槦鐨刬ndex锛屽鏋滃瓨鍦╲alue锛屼紭鍏堜娇鐢╲alue锛屽洜涓哄畠鍙互鍙屽悜缁戝畾(1.4.5鏂板)
+			activeIndex: this.value != -1 ? this.value : this.current,
+			starWidth: 0, // 姣忎釜鏄熸槦鐨勫搴�
+			starWidthArr: [] //姣忎釜鏄熸槦鏈�鍙宠竟鍒扮粍浠剁洅瀛愭渶宸﹁竟鐨勮窛绂�
+		}
+	},
+	watch: {
+		current(val) {
+			this.activeIndex = val
+		},
+		value(val) {
+			this.activeIndex = val
+		}
+	},
+	computed: {
+		decimal() {
+			if (this.disabled) {
+				return this.activeIndex * 100 % 100
+			} else if (this.allowHalf) {
+				return 50
+			}
+		},
+		elActiveIcon() {
+			const len = this.icons.length
+			// 姝ゅ瑙勫垯绫讳技浜庝笅鏂圭殑elActiveColor鍙傛暟锛岄兘鏄牴鎹竴瀹氱殑瑙勫垯锛屾樉绀轰笉鍚岀殑鍥炬爣
+			// 缁撴灉鍙兘濡傛锛歩cons鍙傛暟浼犻�掍簡3涓浘鏍囷紝褰撻�変腑涓や釜鏃讹紝鐢ㄧ涓�涓浘鏍囷紝4涓椂锛岀敤绗簩涓浘鏍�
+			// 绗笁涓椂锛岀敤绗笁涓浘鏍囦綔涓烘縺娲荤殑鍥炬爣
+			if (len && len <= this.count) {
+				const step = Math.round(this.activeIndex / Math.round(this.count / len))
+				if (step < 1) return this.icons[0]
+				if (step > len) return this.icons[len - 1]
+				return this.icons[step - 1]
+			}
+			return this.activeIcon
+		},
+		elActiveColor() {
+			const len = this.colors.length
+			// 濡傛灉鏈夎缃甤olors鍙傛暟(姝ゅ弬鏁扮敤浜庡皢鍥炬爣鍒嗘锛屾瘮濡備竴鍏�5棰楁槦锛宑olors浼�3涓鑹插�硷紝閭d箞鏍规嵁涓�瀹氱殑瑙勫垯锛�2棰楁槦鍙兘涓虹涓�涓鑹�
+			// 4棰楁槦涓虹浜屼釜棰滆壊鍊硷紝5棰楁槦涓虹涓変釜棰滆壊鍊�)
+			if (len && len <= this.count) {
+				const step = Math.round(this.activeIndex / Math.round(this.count / len))
+				if (step < 1) return this.colors[0]
+				if (step > len) return this.colors[len - 1]
+				return this.colors[step - 1]
+			}
+			return this.activeColor
+		}
+	},
+	methods: {
+		// 鑾峰彇璇勫垎缁勪欢鐩掑瓙鐨勫竷灞�淇℃伅
+		getElRectById() {
+			// uView灏佽鐨勮幏鍙栬妭鐐圭殑鏂规硶锛岃瑙佹枃妗�
+			this.$uGetRect('#' + this.elId).then(res => {
+				this.starBoxLeft = res.left
+			})
+		},
+		// 鑾峰彇鍗曚釜鏄熸槦鐨勫昂瀵�
+		getElRectByClass() {
+			// uView灏佽鐨勮幏鍙栬妭鐐圭殑鏂规硶锛岃瑙佹枃妗�
+			this.$uGetRect('.' + this.elClass).then(res => {
+				this.starWidth = res.width
+				// 鎶婃瘡涓槦鏄熷彸杈瑰埌缁勪欢鐩掑瓙宸﹁竟鐨勮窛绂绘斁鍏ユ暟缁勪腑
+				for (let i = 0; i < this.count; i++) {
+					this.starWidthArr[i] = (i + 1) * this.starWidth
+				}
+			})
+		},
+		// 鎵嬫寚婊戝姩
+		touchMove(e) {
+			if (this.disabled) {
+				return
+			}
+			if (!e.changedTouches[0]) {
+				return
+			}
+			const movePageX = e.changedTouches[0].pageX
+			// 婊戝姩鐐圭浉瀵逛簬璇勫垎鐩掑瓙宸﹁竟鐨勮窛绂�
+			const distance = movePageX - this.starBoxLeft
+
+			// 濡傛灉婊戝姩鍒颁簡璇勫垎鐩掑瓙鐨勫乏杈圭晫锛屽氨璁剧疆涓�0鏄�
+			if (distance <= 0) {
+				this.activeIndex = 0
+			}
+			// 婊戝姩鐨勮窛绂伙紝鐩稿綋浜庡灏戦鏄熸槦
+			let index = Math.ceil(distance / this.starWidth)
+			this.activeIndex = index > this.count ? this.count : index
+			// 瀵规渶灏戦鏄熸槦鐨勯檺鍒�
+			if (this.activeIndex < this.minCount) this.activeIndex = this.minCount
+			this.emitEvent()
+		},
+		// 閫氳繃鐐瑰嚮锛岀洿鎺ラ�変腑
+		click(index, e) {
+			if (this.disabled) {
+				return
+			}
+			// 鍗婃槦閫夋嫨锛屽皻鏈疄鐜�
+			if (this.allowHalf) {
+			}
+			// 瀵圭涓�涓槦鏄熺壒娈婂鐞嗭紝鍙湁涓�涓殑鏃跺�欙紝鐐瑰嚮鍙互鍙栨秷锛屽惁鍒欐棤娉曚綔0鏄熻瘎浠�
+			if (index == 1) {
+				if (this.activeIndex == 1) {
+					this.activeIndex = 0
+				} else {
+					this.activeIndex = 1
+				}
+			} else {
+				this.activeIndex = index
+			}
+			// 瀵规渶灏戦鏄熸槦鐨勯檺鍒�
+			if (this.activeIndex < this.minCount) this.activeIndex = this.minCount
+			this.emitEvent()
+		},
+		// 鍙戝嚭浜嬩欢
+		emitEvent() {
+			// 鍙戝嚭change浜嬩欢
+			this.$emit('change', this.activeIndex)
+			// 鍚屾椂淇敼鍙屽悜缁戝畾鐨剉alue鐨勫��
+			if (this.value != -1) {
+				this.$emit('input', this.activeIndex)
+			}
+		},
+		showDecimalIcon(index) {
+			return this.disabled && parseInt(this.activeIndex) === index
+		}
+	},
+	mounted() {
+		this.getElRectById()
+		this.getElRectByClass()
+	}
+}
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+
+.u-rate {
+	display: -webkit-inline-flex;
+	display: inline-flex;
+	align-items: center;
+	margin: 0;
+	padding: 0;
+}
+
+.u-icon {
+	box-sizing: border-box;
+}
+</style>
diff --git a/uview-ui/components/u-read-more/u-read-more.vue b/uview-ui/components/u-read-more/u-read-more.vue
new file mode 100644
index 0000000..affbb57
--- /dev/null
+++ b/uview-ui/components/u-read-more/u-read-more.vue
@@ -0,0 +1,179 @@
+<template>
+	<view class="">
+		<view class="u-content" :class="[elId]" :style="{ 
+			height: isLongContent && !showMore ? showHeight + 'rpx' : 'auto',
+			textIndent: textIndent
+		}">
+			<slot></slot>
+		</view>
+		<view @tap="toggleReadMore" v-if="isLongContent" class="u-content__showmore-wrap"
+		    :class="{ 'u-content__show-more': showMore }"
+		    :style="[innerShadowStyle]">
+			<text class="u-content__showmore-wrap__readmore-btn" :style="{
+				fontSize: fontSize + 'rpx',
+				color: color
+			}">
+				{{ showMore ? openText : closeText }}
+			</text>
+			<view class="u-content__showmore-wrap__readmore-btn__icon u-flex">
+				<u-icon :color="color" :size="fontSize" :name="showMore ? 'arrow-up' : 'arrow-down'"></u-icon>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * readMore 闃呰鏇村
+	 * @description 璇ョ粍浠朵竴鑸敤浜庡唴瀹硅緝闀匡紝棰勫厛鏀惰捣涓�閮ㄥ垎锛岀偣鍑诲睍寮�鍏ㄩ儴鍐呭鐨勫満鏅��
+	 * @tutorial https://www.uviewui.com/components/readMore.html
+	 * @property {String Number} show-height 鍐呭瓒呭嚭姝ら珮搴︽墠浼氭樉绀哄睍寮�鍏ㄦ枃鎸夐挳锛屽崟浣峳px锛堥粯璁�400锛�
+	 * @property {Boolean} toggle 灞曞紑鍚庢槸鍚︽樉绀烘敹璧锋寜閽紙榛樿false锛�
+	 * @property {String} close-text 鍏抽棴鏃剁殑鎻愮ず鏂囧瓧锛堥粯璁も�滃睍寮�闃呰鍏ㄦ枃鈥濓級
+	 * @property {String Number} font-size 鎻愮ず鏂囧瓧鐨勫ぇ灏忥紝鍗曚綅rpx锛堥粯璁�28锛�
+	 * @property {String} text-indent 娈佃惤棣栬缂╄繘鐨勫瓧绗︿釜鏁帮紙榛樿2em锛�
+	 * @property {String} open-text 灞曞紑鏃剁殑鎻愮ず鏂囧瓧锛堥粯璁も�滄敹璧封�濓級
+	 * @property {String} color 鎻愮ず鏂囧瓧鐨勯鑹诧紙榛樿#497bff锛�
+	 * @example <u-read-more><rich-text :nodes="content"></rich-text></u-read-more>
+	 */
+	export default {
+		name: "u-read-more",
+		props: {
+			// 榛樿鐨勬樉绀哄崰浣嶉珮搴︼紝鍗曚綅涓簉px
+			showHeight: {
+				type: [Number, String],
+				default: 400
+			},
+			// 灞曞紑鍚庢槸鍚︽樉绀�"鏀惰捣"鎸夐挳
+			toggle: {
+				type: Boolean,
+				default: false
+			},
+			// 鍏抽棴鏃剁殑鎻愮ず鏂囧瓧
+			closeText: {
+				type: String,
+				default: '灞曞紑闃呰鍏ㄦ枃'
+			},
+			// 灞曞紑鏃剁殑鎻愮ず鏂囧瓧
+			openText: {
+				type: String,
+				default: '鏀惰捣'
+			},
+			// 鎻愮ず鐨勬枃瀛楅鑹�
+			color: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鎻愮ず鏂囧瓧鐨勫ぇ灏�
+			fontSize: {
+				type: [String, Number],
+				default: 28
+			},
+			// 鏄惁鏄剧ず闃村奖
+			shadowStyle: {
+				type: Object,
+				default () {
+					return {
+						backgroundImage: "linear-gradient(-180deg, rgba(255, 255, 255, 0) 0%, #fff 80%)",
+						paddingTop: "300rpx",
+						marginTop: "-300rpx"
+					}
+				}
+			},
+			// 娈佃惤棣栬缂╄繘鐨勫瓧绗︿釜鏁�
+			textIndent: {
+				type: String,
+				default: '2em'
+			},
+			// open鍜宑lose浜嬩欢鏃讹紝灏嗘鍙傛暟杩斿洖鍦ㄥ洖璋冨弬鏁颁腑
+			index: {
+				type: [Number, String],
+				default: ''
+			}
+		},
+		watch: {
+			paramsChange(val) {
+				this.init();
+			}
+		},
+		computed: {
+			paramsChange() {
+				return `${this.toggle}-${this.showHeight}`;
+			},
+			// 灞曞紑鍚庢棤闇�闃村奖锛屾敹璧锋椂鎵嶉渶瑕侀槾褰辨牱寮�
+			innerShadowStyle() {
+				if (this.showMore) return {};
+				else return this.shadowStyle
+			}
+		},
+		data() {
+			return {
+				isLongContent: false, // 鏄惁闇�瑕侀殣钘忎竴閮ㄥ垎鍐呭
+				showMore: false, // 褰撳墠闅愯棌涓庢樉绀虹殑鐘舵�侊紝true-鏄剧ず锛宖alse-鏀惰捣
+				elId: this.$u.guid(), // 鐢熸垚鍞竴class
+			};
+		},
+		mounted() {
+			this.$nextTick(() => {
+				this.init();
+			})
+		},
+		methods: {
+			init() {
+				this.$uGetRect('.' + this.elId).then(res => {
+					// 鍒ゆ柇楂樺害锛屽鏋滅湡瀹炲唴瀹归珮搴﹀ぇ浜庡崰浣嶉珮搴︼紝鍒欐樉绀烘敹璧蜂笌灞曞紑鐨勬帶鍒舵寜閽�
+					if (res.height > uni.upx2px(this.showHeight)) {
+						this.isLongContent = true;
+						this.showMore = false;
+					}
+				})
+			},
+			// 灞曞紑鎴栬�呮敹璧�
+			toggleReadMore() {
+				this.showMore = !this.showMore;
+				// 濡傛灉toggle涓篺alse锛岄殣钘�"鏀惰捣"閮ㄥ垎鐨勫唴瀹�
+				if (this.toggle == false) this.isLongContent = false;
+				// 鍙戝嚭鎵撳紑鎴栬�呮敹榻愮殑浜嬩欢
+				this.$emit(this.showMore ? 'open' : 'close', this.index);
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-content {
+		font-size: 30rpx;
+		color: $u-content-color;
+		line-height: 1.8;
+		text-align: left;
+		overflow: hidden;
+
+		&__show-more {
+			padding-top: 0;
+			background: none;
+			margin-top: 20rpx;
+		}
+
+		&__showmore-wrap {
+			position: relative;
+			width: 100%;
+			padding-bottom: 26rpx;
+			@include vue-flex;
+			align-items: center;
+			justify-content: center;
+
+			&__readmore-btn {
+				@include vue-flex;
+				align-items: center;
+				justify-content: center;
+				line-height: 1;
+
+				&__icon {
+					margin-left: 14rpx;
+				}
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-row-notice/u-row-notice.vue b/uview-ui/components/u-row-notice/u-row-notice.vue
new file mode 100644
index 0000000..f4683f1
--- /dev/null
+++ b/uview-ui/components/u-row-notice/u-row-notice.vue
@@ -0,0 +1,269 @@
+<template>
+	<view
+		v-if="show"
+		class="u-notice-bar"
+		:style="{
+			background: computeBgColor,
+			padding: padding
+		}"
+		:class="[
+			type ? `u-type-${type}-light-bg` : ''
+		]"
+	>
+		<view class="u-direction-row">
+			<view class="u-icon-wrap">
+				<u-icon class="u-left-icon" v-if="volumeIcon" name="volume-fill" :size="volumeSize" :color="computeColor"></u-icon>
+			</view>
+			<view class="u-notice-box" id="u-notice-box">
+				<view
+					class="u-notice-content"
+					id="u-notice-content"
+					:style="{
+						animationDuration: animationDuration,
+						animationPlayState: animationPlayState,
+					}"
+				>
+					<text class="u-notice-text" @tap="click" :style="[textStyle]"
+					:class="['u-type-' + type]">{{showText}}</text>
+				</view>
+			</view>
+			<view class="u-icon-wrap">
+				<u-icon @click="getMore" class="u-right-icon" v-if="moreIcon" name="arrow-right" :size="26" :color="computeColor"></u-icon>
+				<u-icon @click="close" class="u-right-icon" v-if="closeIcon" name="close" :size="24" :color="computeColor"></u-icon>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+export default {
+	props: {
+		// 鏄剧ず鐨勫唴瀹癸紝鏁扮粍
+		list: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 鏄剧ず鐨勪富棰橈紝success|error|primary|info|warning|none
+		// none涓婚榛樿涓洪�忔槑鑳屾櫙锛岄粦鑹�(contentColor)瀛椾綋
+		type: {
+			type: String,
+			default: 'warning'
+		},
+		// 鏄惁鏄剧ず宸︿晶鐨勯煶閲忓浘鏍�
+		volumeIcon: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ず鍙充晶鐨勫彸绠ご鍥炬爣
+		moreIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鏄剧ず鍙充晶鐨勫叧闂浘鏍�
+		closeIcon: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鑷姩鎾斁
+		autoplay: {
+			type: Boolean,
+			default: true
+		},
+		// 鏂囧瓧棰滆壊锛屽悇鍥炬爣涔熶細浣跨敤鏂囧瓧棰滆壊
+		color: {
+			type: String,
+			default: ''
+		},
+		// 鑳屾櫙棰滆壊
+		bgColor: {
+			type: String,
+			default: ''
+		},
+		// 鏄惁鏄剧ず
+		show: {
+			type: Boolean,
+			default: true
+		},
+		// 瀛椾綋澶у皬锛屽崟浣峳px
+		fontSize: {
+			type: [Number, String],
+			default: 26
+		},
+		// 闊抽噺鍠囧彮鐨勫ぇ灏�
+		volumeSize: {
+			type: [Number, String],
+			default: 34
+		},
+		// 姘村钩婊氬姩鏃剁殑婊氬姩閫熷害锛屽嵆姣忕婊氬姩澶氬皯rpx锛岃繖鏈夊埄浜庢帶鍒舵枃瀛楁棤璁哄灏戞椂锛岄兘鑳芥湁涓�涓亽瀹氱殑閫熷害
+		speed: {
+			type: [Number, String],
+			default: 160
+		},
+		// 鎾斁鐘舵�侊紝play-鎾斁锛宲aused-鏆傚仠
+		playState: {
+			type: String,
+			default: 'play'
+		},
+		// 閫氱煡鐨勮竟璺�
+		padding: {
+			type: [Number, String],
+			default: '18rpx 24rpx'
+		}
+	},
+	data() {
+		return {
+			textWidth: 0, // 婊氬姩鐨勬枃瀛楀搴�
+			boxWidth: 0, // 渚涙枃瀛楁粴鍔ㄧ殑鐖剁洅瀛愮殑瀹藉害锛屽拰鍓嶈�呬竴璧蜂负浜嗚绠楁粴鍔ㄩ�熷害
+			animationDuration: '10s', // 鍔ㄧ敾鎵ц鏃堕棿
+			animationPlayState: 'paused', // 鍔ㄧ敾鐨勫紑濮嬪拰缁撴潫鎵ц
+			showText: '' // 鏄剧ず鐨勬枃鏈�
+		};
+	},
+	watch: {
+		list: {
+			immediate: true,
+			handler(val) {
+				this.showText = val.join('锛�');
+				this.$nextTick(() => {
+					this.initSize();
+				});
+			}
+		},
+		playState(val) {
+			if(val == 'play') this.animationPlayState = 'running';
+			else this.animationPlayState = 'paused';
+		},
+		speed(val) {
+			this.initSize();
+		}
+	},
+	computed: {
+		// 璁$畻瀛椾綋棰滆壊锛屽鏋滄病鏈夎嚜瀹氫箟鐨勶紝灏辩敤uview涓婚棰滆壊
+		computeColor() {
+			if (this.color) return this.color;
+			// 濡傛灉鏄棤涓婚锛屽氨榛樿浣跨敤content-color
+			else if(this.type == 'none') return '#606266';
+			else return this.type;
+		},
+		// 鏂囧瓧鍐呭鐨勬牱寮�
+		textStyle() {
+			let style = {};
+			if (this.color) style.color = this.color;
+			else if(this.type == 'none') style.color = '#606266';
+			style.fontSize = this.fontSize + 'rpx';
+			return style;
+		},
+		// 璁$畻鑳屾櫙棰滆壊
+		computeBgColor() {
+			if (this.bgColor) return this.bgColor;
+			else if(this.type == 'none') return 'transparent';
+		}
+	},
+	mounted() {
+		this.$nextTick(() => {
+			this.initSize();
+		});
+	},
+	methods: {
+		initSize() {
+			let query = [],
+				boxWidth = 0,
+				textWidth = 0;
+			let textQuery = new Promise((resolve, reject) => {
+				uni.createSelectorQuery()
+					.in(this)
+					.select(`#u-notice-content`)
+					.boundingClientRect()
+					.exec(ret => {
+						this.textWidth = ret[0].width;
+						resolve();
+					});
+			});
+			query.push(textQuery);
+			Promise.all(query).then(() => {
+				// 鏍规嵁t=s/v(鏃堕棿=璺▼/閫熷害)锛岃繖閲屼负浣曚笉闇�瑕佸姞涓�#u-notice-box鐨勫搴︼紝鍥犱负涓缃簡.u-notice-content鏍峰紡涓缃簡padding-left: 100%
+				// 鎭板阀璁$畻鍑烘潵鐨勭粨鏋滀腑宸茬粡鍖呭惈浜�#u-notice-box鐨勫搴�
+				this.animationDuration = `${this.textWidth / uni.upx2px(this.speed)}s`;
+				// 杩欓噷蹇呴』杩欐牱寮�濮嬪姩鐢伙紝鍚﹀垯鍦ˋPP涓婂姩鐢婚�熷害涓嶄細鏀瑰彉(HX鐗堟湰2.4.6锛孖OS13)
+				this.animationPlayState = 'paused';
+				setTimeout(() => {
+					if(this.playState == 'play' && this.autoplay) this.animationPlayState = 'running';
+				}, 10);
+			});
+		},
+		// 鐐瑰嚮閫氬憡鏍�
+		click(index) {
+			this.$emit('click');
+		},
+		// 鐐瑰嚮鍏抽棴鎸夐挳
+		close() {
+			this.$emit('close');
+		},
+		// 鐐瑰嚮鏇村绠ご鎸夐挳
+		getMore() {
+			this.$emit('getMore');
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+	
+.u-notice-bar {
+	padding: 18rpx 24rpx;
+	overflow: hidden;
+}
+
+.u-direction-row {
+	@include vue-flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.u-left-icon {
+	/* #ifndef APP-NVUE */
+	display: inline-flex;
+	/* #endif */
+	align-items: center;
+}
+
+.u-notice-box {
+	flex: 1;
+	@include vue-flex;
+	overflow: hidden;
+	margin-left: 12rpx;
+}
+
+.u-right-icon {
+	margin-left: 12rpx;
+	display: inline-flex;
+	align-items: center;
+}
+
+.u-notice-content {
+	animation: u-loop-animation 10s linear infinite both;
+	text-align: right;
+	// 杩欎竴鍙ュ緢閲嶈锛屼负浜嗚兘璁╂粴鍔ㄥ乏鍙宠繛鎺ヨ捣鏉�
+	padding-left: 100%;
+	@include vue-flex;
+	flex-wrap: nowrap;
+}
+
+.u-notice-text {
+	font-size: 26rpx;
+	word-break: keep-all;
+	white-space: nowrap
+}
+
+@keyframes u-loop-animation {
+	0% {
+		transform: translate3d(0, 0, 0);
+	}
+
+	100% {
+		transform: translate3d(-100%, 0, 0);
+	}
+}
+</style>
diff --git a/uview-ui/components/u-row/u-row.vue b/uview-ui/components/u-row/u-row.vue
new file mode 100644
index 0000000..915dfa6
--- /dev/null
+++ b/uview-ui/components/u-row/u-row.vue
@@ -0,0 +1,84 @@
+<template>
+	<view class="u-row" :style="{
+			alignItems: uAlignItem,
+			justifyContent: uJustify
+		}"
+		@tap="click"
+	>
+		<slot />
+	</view>
+</template>
+
+<script>
+	/**
+	 * row 琛屽竷灞�
+	 * @description 閫氳繃鍩虹鐨� 12 鍒嗘爮锛岃繀閫熺畝渚垮湴鍒涘缓甯冨眬銆�
+	 * @tutorial https://www.uviewui.com/components/layout.html#row-props
+	 * @property {String Number} gutter 鏍呮牸闂撮殧锛屽乏鍙冲悇涓烘鍊肩殑涓�鍗婏紝鍗曚綅rpx锛堥粯璁�0锛�
+	 * @property {String} justify 姘村钩鎺掑垪鏂瑰紡(寰俊灏忕▼搴忔殏涓嶆敮鎸�)榛樿锛坰tart(鎴杅lex-start)锛�
+	 * @property {String} align 鍨傜洿鎺掑垪鏂瑰紡锛堥粯璁enter锛�
+	 * @example <u-row gutter="16"></u-row>
+	 */
+	export default {
+		name: "u-row",
+		props: {
+			// 缁檆ol娣诲姞闂磋窛锛屽乏鍙宠竟璺濆悇鍗犱竴鍗�
+			gutter: {
+				type: [String, Number],
+				default: 20
+			},
+			// 姘村钩鎺掑垪鏂瑰紡锛屽彲閫夊�间负`start`(鎴朻flex-start`)銆乣end`(鎴朻flex-end`)銆乣center`銆乣around`(鎴朻space-around`)銆乣between`(鎴朻space-between`)
+			justify: {
+				type: String,
+				default: 'start'
+			},
+			// 鍨傜洿瀵归綈鏂瑰紡锛屽彲閫夊�间负top銆乧enter銆乥ottom
+			align: {
+				type: String,
+				default: 'center'
+			},
+			// 鏄惁闃绘浜嬩欢浼犳挱
+			stop: {
+				type: Boolean,
+				default: true
+			}
+		},
+		computed: {
+			uJustify() {
+				if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify;
+				else if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify;
+				else return this.justify;
+			},
+			uAlignItem() {
+				if (this.align == 'top') return 'flex-start';
+				if (this.align == 'bottom') return 'flex-end';
+				else return this.align;
+			}
+		},
+		methods: {
+			click(e) {
+				this.$emit('click');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	.u-row {
+		// 鐢变簬寰俊灏忕▼搴忕紪璇戝悗濂囨�殑椤甸潰缁撴瀯锛屽彧鑳戒娇鐢╢loat甯冨眬瀹炵幇锛宖lex鏃犳硶瀹炵幇
+		/* #ifndef MP-WEIXIN || MP-QQ || MP-TOUTIAO */
+		@include vue-flex;
+		/* #endif */
+		flex-wrap: wrap;
+	}
+
+	.u-row:after {
+		/* #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO */
+		display: table;
+		clear: both;
+		content: "";
+		/* #endif */
+	}
+</style>
diff --git a/uview-ui/components/u-search/u-search.vue b/uview-ui/components/u-search/u-search.vue
new file mode 100644
index 0000000..206f661
--- /dev/null
+++ b/uview-ui/components/u-search/u-search.vue
@@ -0,0 +1,342 @@
+<template>
+	<view class="u-search" @tap="clickHandler" :style="{
+		margin: margin,
+	}">
+		<view
+			class="u-content"
+			:style="{
+				backgroundColor: bgColor,
+				borderRadius: shape == 'round' ? '100rpx' : '10rpx',
+				border: borderStyle,
+				height: height + 'rpx'
+			}"
+		>
+			<view class="u-icon-wrap">
+				<u-icon class="u-clear-icon" :size="30" :name="searchIcon" :color="searchIconColor ? searchIconColor : color"></u-icon>
+			</view>
+			<input
+				confirm-type="search"
+				@blur="blur"
+				:value="value"
+				@confirm="search"
+				@input="inputChange"
+				:disabled="disabled"
+				@focus="getFocus"
+				:focus="focus"
+				:maxlength="maxlength"
+				placeholder-class="u-placeholder-class"
+				:placeholder="placeholder"
+				:placeholder-style="`color: ${placeholderColor}`"
+				class="u-input"
+				type="text"
+				:style="[{
+					textAlign: inputAlign,
+					color: color,
+					backgroundColor: bgColor,
+				}, inputStyle]"
+			/>
+			<view class="u-close-wrap" v-if="keyword && clearabled && focused" @tap="clear">
+				<u-icon class="u-clear-icon" name="close-circle-fill" size="34" color="#c0c4cc"></u-icon>
+			</view>
+		</view>
+		<view :style="[actionStyle]" class="u-action" 
+			:class="[showActionBtn || show ? 'u-action-active' : '']" 
+			@tap.stop.prevent="custom"
+		>{{ actionText }}</view>
+	</view>
+</template>
+
+<script>
+/**
+ * search 鎼滅储妗�
+ * @description 鎼滅储缁勪欢锛岄泦鎴愪簡甯歌鎼滅储妗嗘墍闇�鍔熻兘锛岀敤鎴峰彲浠ヤ竴閿紩鍏ワ紝寮�绠卞嵆鐢ㄣ��
+ * @tutorial https://www.uviewui.com/components/search.html
+ * @property {String} shape 鎼滅储妗嗗舰鐘讹紝round-鍦嗗舰锛宻quare-鏂瑰舰锛堥粯璁ound锛�
+ * @property {String} bg-color 鎼滅储妗嗚儗鏅鑹诧紙榛樿#f2f2f2锛�
+ * @property {String} border-color 杈规棰滆壊锛岄厤缃簡棰滆壊锛屾墠浼氭湁杈规
+ * @property {String} placeholder 鍗犱綅鏂囧瓧鍐呭锛堥粯璁も�滆杈撳叆鍏抽敭瀛椻�濓級
+ * @property {Boolean} clearabled 鏄惁鍚敤娓呴櫎鎺т欢锛堥粯璁rue锛�
+ * @property {Boolean} focus 鏄惁鑷姩鑾峰緱鐒︾偣锛堥粯璁alse锛�
+ * @property {Boolean} show-action 鏄惁鏄剧ず鍙充晶鎺т欢锛堥粯璁rue锛�
+ * @property {String} action-text 鍙充晶鎺т欢鏂囧瓧锛堥粯璁も�滄悳绱⑩�濓級
+ * @property {Object} action-style 鍙充晶鎺т欢鐨勬牱寮忥紝瀵硅薄褰㈠紡
+ * @property {String} input-align 杈撳叆妗嗗唴瀹规按骞冲榻愭柟寮忥紙榛樿left锛�
+ * @property {Object} input-style 鑷畾涔夎緭鍏ユ鏍峰紡锛屽璞″舰寮�
+ * @property {Boolean} disabled 鏄惁鍚敤杈撳叆妗嗭紙榛樿false锛�
+ * @property {String} search-icon-color 鎼滅储鍥炬爣鐨勯鑹诧紝榛樿鍚岃緭鍏ユ瀛椾綋棰滆壊
+ * @property {String} color 杈撳叆妗嗗瓧浣撻鑹诧紙榛樿#606266锛�
+ * @property {String} placeholder-color placeholder鐨勯鑹诧紙榛樿#909399锛�
+ * @property {String} search-icon 杈撳叆妗嗗乏杈圭殑鍥炬爣锛屽彲浠ヤ负uView鍥炬爣鍚嶇О鎴栧浘鐗囪矾寰�
+ * @property {String} margin 缁勪欢涓庡叾浠栦笂涓嬪乏鍙冲厓绱犱箣闂寸殑璺濈锛屽甫鍗曚綅鐨勫瓧绗︿覆褰㈠紡锛屽"30rpx"
+ * @property {Boolean} animation 鏄惁寮�鍚姩鐢伙紝瑙佷笂鏂硅鏄庯紙榛樿false锛�
+ * @property {String} value 杈撳叆妗嗗垵濮嬪��
+ * @property {String | Number} maxlength 杈撳叆妗嗘渶澶ц兘杈撳叆鐨勯暱搴︼紝-1涓轰笉闄愬埗闀垮害
+ * @property {Boolean} input-style input杈撳叆妗嗙殑鏍峰紡锛屽彲浠ュ畾涔夋枃瀛楅鑹诧紝澶у皬绛夛紝瀵硅薄褰㈠紡
+ * @property {String | Number} height 杈撳叆妗嗛珮搴︼紝鍗曚綅rpx锛堥粯璁�64锛�
+ * @event {Function} change 杈撳叆妗嗗唴瀹瑰彂鐢熷彉鍖栨椂瑙﹀彂
+ * @event {Function} search 鐢ㄦ埛纭畾鎼滅储鏃惰Е鍙戯紝鐢ㄦ埛鎸夊洖杞﹂敭锛屾垨鑰呮墜鏈洪敭鐩樺彸涓嬭鐨�"鎼滅储"閿椂瑙﹀彂
+ * @event {Function} custom 鐢ㄦ埛鐐瑰嚮鍙充晶鎺т欢鏃惰Е鍙�
+ * @event {Function} clear 鐢ㄦ埛鐐瑰嚮娓呴櫎鎸夐挳鏃惰Е鍙�
+ * @example <u-search placeholder="鏃ョ収棣欑倝鐢熺传鐑�" v-model="keyword"></u-search>
+ */
+export default {
+	name: "u-search",
+	props: {
+		// 鎼滅储妗嗗舰鐘讹紝round-鍦嗗舰锛宻quare-鏂瑰舰
+		shape: {
+			type: String,
+			default: 'round'
+		},
+		// 鎼滅储妗嗚儗鏅壊锛岄粯璁ゅ��#f2f2f2
+		bgColor: {
+			type: String,
+			default: '#f2f2f2'
+		},
+		// 鍗犱綅鎻愮ず鏂囧瓧
+		placeholder: {
+			type: String,
+			default: '璇疯緭鍏ュ叧閿瓧'
+		},
+		// 鏄惁鍚敤娓呴櫎鎺т欢
+		clearabled: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鑷姩鑱氱劍
+		focus: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鍦ㄦ悳绱㈡鍙充晶鏄剧ず鍙栨秷鎸夐挳
+		showAction: {
+			type: Boolean,
+			default: true
+		},
+		// 鍙宠竟鎺т欢鐨勬牱寮�
+		actionStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 鍙栨秷鎸夐挳鏂囧瓧
+		actionText: {
+			type: String,
+			default: '鎼滅储'
+		},
+		// 杈撳叆妗嗗唴瀹瑰榻愭柟寮忥紝鍙�夊�间负 left|center|right
+		inputAlign: {
+			type: String,
+			default: 'left'
+		},
+		// 鏄惁鍚敤杈撳叆妗�
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 寮�鍚痵howAction鏃讹紝鏄惁鍦╥nput鑾峰彇鐒︾偣鏃舵墠鏄剧ず
+		animation: {
+			type: Boolean,
+			default: false
+		},
+		// 杈规棰滆壊锛屽彧瑕侀厤缃簡棰滆壊锛屾墠浼氭湁杈规
+		borderColor: {
+			type: String,
+			default: 'none'
+		},
+		// 杈撳叆妗嗙殑鍒濆鍖栧唴瀹�
+		value: {
+			type: String,
+			default: ''
+		},
+		// 鎼滅储妗嗛珮搴︼紝鍗曚綅rpx
+		height: {
+			type: [Number, String],
+			default: 64
+		},
+		// input杈撳叆妗嗙殑鏍峰紡锛屽彲浠ュ畾涔夋枃瀛楅鑹诧紝澶у皬绛夛紝瀵硅薄褰㈠紡
+		inputStyle: {
+			type: Object,
+			default() {
+				return {}
+			}
+		},
+		// 杈撳叆妗嗘渶澶ц兘杈撳叆鐨勯暱搴︼紝-1涓轰笉闄愬埗闀垮害(鏉ヨ嚜uniapp鏂囨。)
+		maxlength: {
+			type: [Number, String],
+			default: '-1'
+		},
+		// 鎼滅储鍥炬爣鐨勯鑹诧紝榛樿鍚岃緭鍏ユ瀛椾綋棰滆壊
+		searchIconColor: {
+			type: String,
+			default: ''
+		},
+		// 杈撳叆妗嗗瓧浣撻鑹�
+		color: {
+			type: String,
+			default: '#606266'
+		},
+		// placeholder鐨勯鑹�
+		placeholderColor: {
+			type: String,
+			default: '#909399'
+		},
+		// 缁勪欢涓庡叾浠栦笂涓嬪乏鍙冲厓绱犱箣闂寸殑璺濈锛屽甫鍗曚綅鐨勫瓧绗︿覆褰㈠紡锛屽"30rpx"銆�"30rpx 20rpx"绛夊啓娉�
+		margin: {
+			type: String,
+			default: '0'
+		},
+		// 宸﹁竟杈撳叆妗嗙殑鍥炬爣锛屽彲浠ヤ负uView鍥炬爣鍚嶇О鎴栧浘鐗囪矾寰�
+		searchIcon: {
+			type: String,
+			default: 'search'
+		}
+	},
+	data() {
+		return {
+			keyword: '',
+			showClear: false, // 鏄惁鏄剧ず鍙宠竟鐨勬竻闄ゅ浘鏍�
+			show: false,
+			// 鏍囪input褰撳墠鐘舵�佹槸鍚﹀浜庤仛鐒︿腑锛屽鏋滄槸锛屾墠浼氭樉绀哄彸渚х殑娓呴櫎鎺т欢
+			focused: this.focus
+			// 缁戝畾杈撳叆妗嗙殑鍊�
+			// inputValue: this.value
+		};
+	},
+	watch: {
+		keyword(nVal) {
+			// 鍙屽悜缁戝畾鍊硷紝璁﹙-model缁戝畾鐨勫�煎弻鍚戝彉鍖�
+			this.$emit('input', nVal);
+			// 瑙﹀彂change浜嬩欢锛屼簨浠舵晥鏋滃拰v-model鍙屽悜缁戝畾鐨勬晥鏋滀竴鏍凤紝璁╃敤鎴峰涓�涓�夋嫨
+			this.$emit('change', nVal);
+		},
+		value: {
+			immediate: true,
+			handler(nVal) {
+				this.keyword = nVal;
+			}
+		}
+	},
+	computed: {
+		showActionBtn() {
+			if (!this.animation && this.showAction) return true;
+			else return false;
+		},
+		// 鏍峰紡锛屾牴鎹敤鎴蜂紶鍏ョ殑棰滆壊鍊肩敓鎴愶紝濡傛灉涓嶄紶鍏ワ紝榛樿涓簄one
+		borderStyle() {
+			if (this.borderColor) return `1px solid ${this.borderColor}`;
+			else return 'none';
+		},
+	},
+	methods: {
+		// 鐩墠HX2.6.9 v-model鍙屽悜缁戝畾鏃犳晥锛屾晠鐩戝惉input浜嬩欢鑾峰彇杈撳叆妗嗗唴瀹圭殑鍙樺寲
+		inputChange(e) {
+			this.keyword = e.detail.value;
+		},
+		// 娓呯┖杈撳叆
+		// 涔熷彲浠ヤ綔涓虹敤鎴烽�氳繃this.$refs褰㈠紡璋冪敤娓呯┖杈撳叆妗嗗唴瀹�
+		clear() {
+			this.keyword = '';
+			// 寤跺悗鍙戝嚭浜嬩欢锛岄伩鍏嶅湪鐖剁粍浠剁洃鍚琧lear浜嬩欢鏃讹紝value涓烘洿鏂板墠鐨勫��(涓嶄负绌�)
+			this.$nextTick(() => {
+				this.$emit('clear');
+			})
+		},
+		// 纭畾鎼滅储
+		search(e) {
+			this.$emit('search', e.detail.value);
+			try{
+				// 鏀惰捣閿洏
+				uni.hideKeyboard();
+			}catch(e){}
+		},
+		// 鐐瑰嚮鍙宠竟鑷畾涔夋寜閽殑浜嬩欢
+		custom() {
+			this.$emit('custom', this.keyword);
+			try{
+				// 鏀惰捣閿洏
+				uni.hideKeyboard();
+			}catch(e){}
+		},
+		// 鑾峰彇鐒︾偣
+		getFocus() {
+			this.focused = true;
+			// 寮�鍚彸渚ф悳绱㈡寜閽睍寮�鐨勫姩鐢绘晥鏋�
+			if (this.animation && this.showAction) this.show = true;
+			this.$emit('focus', this.keyword);
+		},
+		// 澶卞幓鐒︾偣
+		blur() {
+			// 鏈�寮�濮嬩娇鐢ㄧ殑鏄洃鍚浘鏍嘆touchstart浜嬩欢锛岃嚜浠巋x2.8.4鍚庯紝姝ゆ柟娉曞湪寰俊灏忕▼搴忓嚭閿�
+			// 杩欓噷鏀逛负鐩戝惉鐐瑰嚮浜嬩欢锛屾墜鐐瑰嚮娓呴櫎鍥炬爣鏃讹紝鍚屾椂涔熷彂鐢熶簡@blur浜嬩欢锛屽鑷村浘鏍囨秷澶辫�屾棤娉曠偣鍑伙紝杩欓噷鍋氫竴涓欢鏃�
+			setTimeout(() => {
+				this.focused = false;
+			}, 100)
+			this.show = false;
+			this.$emit('blur', this.keyword);
+		},
+		// 鐐瑰嚮鎼滅储妗嗭紝鍙湁disabled=true鏃舵墠鍙戝嚭浜嬩欢锛屽洜涓虹姝簡杈撳叆锛屾剰鍛崇潃鏄兂璺宠浆鐪熸鐨勬悳绱㈤〉
+		clickHandler() {
+			if(this.disabled) this.$emit('click');
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-search {
+	@include vue-flex;
+	align-items: center;
+	flex: 1;
+}
+
+.u-content {
+	@include vue-flex;
+	align-items: center;
+	padding: 0 18rpx;
+	flex: 1;
+}
+
+.u-clear-icon {
+	@include vue-flex;
+	align-items: center;
+}
+
+.u-input {
+	flex: 1;
+	font-size: 28rpx;
+	line-height: 1;
+	margin: 0 10rpx;
+	color: $u-tips-color;
+}
+
+.u-close-wrap {
+	width: 40rpx;
+	height: 100%;
+	@include vue-flex;
+	align-items: center;
+	justify-content: center;
+	border-radius: 50%;
+}
+
+.u-placeholder-class {
+	color: $u-tips-color;
+}
+
+.u-action {
+	font-size: 28rpx;
+	color: $u-main-color;
+	width: 0;
+	overflow: hidden;
+	transition: all 0.3s;
+	white-space: nowrap;
+	text-align: center;
+}
+
+.u-action-active {
+	width: 80rpx;
+	margin-left: 10rpx;
+}
+</style>
diff --git a/uview-ui/components/u-section/u-section.vue b/uview-ui/components/u-section/u-section.vue
new file mode 100644
index 0000000..02293ce
--- /dev/null
+++ b/uview-ui/components/u-section/u-section.vue
@@ -0,0 +1,154 @@
+<template>
+	<view class="u-section">
+		<view class="u-section__title" :style="{
+			fontWeight: bold ? 'bold' : 'normal',
+			color: color,
+			fontSize: fontSize + 'rpx',
+			paddingLeft: showLine ? (fontSize * 0.7) + 'rpx' : 0
+		}" :class="{
+			'u-section--line': showLine
+		}">
+			<view class="u-section__title__icon-wrap u-flex" :style="[lineStyle]" v-if="showLine">
+				<u-icon top="0" name="column-line" :size="fontSize * 1.25" bold :color="lineColor ? lineColor : color"></u-icon>
+			</view>
+			<text class="u-flex u-section__title__text">{{title}}</text>
+		</view>
+		<view class="u-section__right-info" v-if="right || $slots.right" :style="{
+			color: subColor
+		}" @tap="rightClick"> 
+			<slot name="right" v-if="$slots.right" />
+			<block v-else>
+				{{subTitle}}
+				<view class="u-section__right-info__icon-arrow u-flex" v-if="arrow">
+					<u-icon name="arrow-right" size="24" :color="subColor"></u-icon>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * section 鏌ョ湅鏇村
+	 * @description 璇ョ粍浠朵竴鑸敤浜庡垎绫讳俊鎭湁寰堝锛屼絾鏄檺浜庣瘒骞呭彧鑳藉垪鍑轰竴閮ㄥ垎锛岃鐢ㄦ埛閫氳繃"鏌ョ湅鏇村"鑾峰緱鏇村淇℃伅鐨勫満鏅紝瀹為檯鏁堟灉瑙佹紨绀恒��
+	 * @tutorial https://www.uviewui.com/components/section.html
+	 * @property {String} title 宸﹁竟涓绘爣棰�
+	 * @property {String} sub-title 鍙宠竟鍓爣棰橈紙榛樿鏇村锛�
+	 * @property {Boolean} right 鏄惁鏄剧ず鍙宠竟鐨勫唴瀹癸紙榛樿true锛�
+	 * @property {Boolean} showLine 鏄惁鏄剧ず宸﹁竟鐨勭珫鏉★紙榛樿true锛�
+	 * @property {Boolean} arrow 鏄惁鏄剧ず鍙宠竟绠ご锛堥粯璁rue锛�
+	 * @property {String Number} font-size 涓绘爣棰樼殑瀛椾綋澶у皬锛堥粯璁�28锛�
+	 * @property {Boolean} bold 涓绘爣棰樻槸鍚﹀姞绮楋紙榛樿true锛�
+	 * @property {String} color 涓绘爣棰橀鑹诧紙榛樿#303133锛�
+	 * @event {Function} click 缁勪欢鍙充晶鐨勫唴瀹硅鐐瑰嚮鏃惰Е鍙戯紝鐢ㄤ簬璺宠浆"鏇村"
+	 * @example <u-section title="浠婃棩鐑棬" :right="false"></u-section>
+	 */
+	export default {
+		name: "u-section",
+		props: {
+			// 鏍囬淇℃伅
+			title: {
+				type: String,
+				default: ''
+			},
+			// 鍙宠竟鍓爣棰樺唴瀹�
+			subTitle: {
+				type: String,
+				default: '鏇村'
+			},
+			// 鏄惁鏄剧ず鍙宠竟鐨勫唴瀹�
+			right: {
+				type: Boolean,
+				default: true
+			},
+			fontSize: {
+				type: [Number, String],
+				default: 28
+			},
+			// 涓绘爣棰樻槸鍚﹀姞绮�
+			bold: {
+				type: Boolean,
+				default: true
+			},
+			// 涓绘爣棰樼殑棰滆壊
+			color: {
+				type: String,
+				default: '#303133'
+			},
+			// 鍙宠竟鍓爣棰樼殑棰滆壊
+			subColor: {
+				type: String,
+				default: '#909399'
+			},
+			// 鏄惁鏄剧ず宸﹁竟鐨勭珫鏉�
+			showLine: {
+				type: Boolean,
+				default: true
+			},
+			// 宸﹁竟绔栫嚎鐨勯鑹�
+			lineColor: {
+				type: String,
+				default: ''
+			},
+			// 鏄惁鏄剧ず鍙宠竟绠ご
+			arrow: {
+				type: Boolean,
+				default: true
+			},
+		},
+		computed: {
+			// 宸﹁竟绔栨潯鐨勬牱寮�
+			lineStyle() {
+				// 鐢变簬瀹夊崜鍜宨OS鐨勶紝闇�瑕佺◢寰皟鏁寸粷瀵瑰畾浣嶇殑top鍊硷紝鎵嶈兘璁╁乏杈圭殑绔栫嚎鍜屽彸杈圭殑鏂囧瓧鍨傜洿灞呬腑
+				return {
+					// 鐢变簬绔栫嚎涓哄瓧浣撳浘鏍囷紝鍏锋湁姣斿疄闄呯嚎瀹芥洿瀹界殑瀹藉害锛屾墍浠ヤ篃闇�瑕佹牴鎹瓧浣撴墦涓嬪姩鎬佽皟鏁�
+					left: -(Number(this.fontSize) * 0.9) + 'rpx',
+					top: -(Number(this.fontSize) * (this.$u.os() == 'ios' ? 0.14 : 0.15)) + 'rpx',
+				}
+			}
+		},
+		methods: {
+			rightClick() {
+				this.$emit('click');
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-section {
+		@include vue-flex;
+		justify-content: space-between;
+		align-items: center;
+		width: 100%;
+		
+		&__title {
+			position: relative;
+			font-size: 28rpx;
+			padding-left: 20rpx;
+			@include vue-flex;
+			align-items: center;
+			
+			&__icon-wrap {
+				position: absolute;
+			}
+			
+			&__text {
+				line-height: 1;
+			}
+		}
+		
+		&__right-info {
+			color: $u-tips-color;
+			font-size: 26rpx;
+			@include vue-flex;
+			align-items: center;
+			
+			&__icon-arrow {
+				margin-left: 6rpx;
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-select/u-select.vue b/uview-ui/components/u-select/u-select.vue
new file mode 100644
index 0000000..3a8b0bd
--- /dev/null
+++ b/uview-ui/components/u-select/u-select.vue
@@ -0,0 +1,424 @@
+<template>
+	<view class="u-select">
+		<!-- <view class="u-select__action" :class="{
+			'u-select--border': border
+		}" @tap.stop="selectHandler">
+			<view class="u-select__action__icon" :class="{
+				'u-select__action__icon--reverse': value == true
+			}">
+				<u-icon name="arrow-down-fill" size="26" color="#c0c4cc"></u-icon>
+			</view>
+		</view> -->
+		<u-popup :maskCloseAble="maskCloseAble" mode="bottom" :popup="false" v-model="value" length="auto" :safeAreaInsetBottom="safeAreaInsetBottom" @close="close" :z-index="uZIndex">
+			<view class="u-select">
+				<view class="u-select__header" @touchmove.stop.prevent="">
+					<view
+						class="u-select__header__cancel u-select__header__btn"
+						:style="{ color: cancelColor }"
+						hover-class="u-hover-class"
+						:hover-stay-time="150"
+						@tap="getResult('cancel')"
+					>
+						{{cancelText}}
+					</view>
+					<view class="u-select__header__title">
+						{{title}}
+					</view>
+					<view
+						class="u-select__header__confirm u-select__header__btn"
+						:style="{ color: moving ? cancelColor : confirmColor }"
+						hover-class="u-hover-class"
+						:hover-stay-time="150"
+						@touchmove.stop=""
+						@tap.stop="getResult('confirm')"
+					>
+						{{confirmText}}
+					</view>
+				</view>
+				<view class="u-select__body">
+					<picker-view @change="columnChange" class="u-select__body__picker-view" :value="defaultSelector" @pickstart="pickstart" @pickend="pickend">
+						<picker-view-column v-for="(item, index) in columnData" :key="index">
+							<view class="u-select__body__picker-view__item" v-for="(item1, index1) in item" :key="index1">
+								<view class="u-line-1">{{ item1[labelName] }}</view>
+							</view>
+						</picker-view-column>
+					</picker-view>
+				</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	/**
+	 * select 鍒楅�夋嫨鍣�
+	 * @description 姝ら�夋嫨鍣ㄧ敤浜庡崟鍒楋紝澶氬垪锛屽鍒楄仈鍔ㄧ殑閫夋嫨鍦烘櫙銆�(浠�1.3.0鐗堟湰璧凤紝涓嶅缓璁娇鐢≒icker缁勪欢鐨勫崟鍒楀拰澶氬垪妯″紡锛孲elect缁勪欢鏄笓闂ㄤ负鍒楅�夋嫨鑰屾瀯閫犵殑缁勪欢锛屾洿绠�鍗曟槗鐢ㄣ��)
+	 * @tutorial http://uviewui.com/components/select.html
+	 * @property {String} mode 妯″紡閫夋嫨锛�"single-column"-鍗曞垪妯″紡锛�"mutil-column"-澶氬垪妯″紡锛�"mutil-column-auto"-澶氬垪鑱斿姩妯″紡
+	 * @property {Array} list 鍒楁暟鎹紝鏁扮粍褰㈠紡锛岃瀹樼綉璇存槑
+	 * @property {Boolean} v-model 甯冨皵鍊煎彉閲忥紝鐢ㄤ簬鎺у埗閫夋嫨鍣ㄧ殑寮瑰嚭涓庢敹璧�
+	 * @property {Boolean} safe-area-inset-bottom 鏄惁寮�鍚簳閮ㄥ畨鍏ㄥ尯閫傞厤(榛樿false)
+	 * @property {String} cancel-color 鍙栨秷鎸夐挳鐨勯鑹诧紙榛樿#606266锛�
+	 * @property {String} confirm-color 纭鎸夐挳鐨勯鑹�(榛樿#497bff)
+	 * @property {String} confirm-text 纭鎸夐挳鐨勬枃瀛�
+	 * @property {String} cancel-text 鍙栨秷鎸夐挳鐨勬枃瀛�
+	 * @property {String} default-value 鎻愪緵鐨勯粯璁ら�変腑鐨勪笅鏍囷紝瑙佸畼缃戣鏄�
+	 * @property {Boolean} mask-close-able 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴Picker(榛樿true)
+	 * @property {String Number} z-index 寮瑰嚭鏃剁殑z-index鍊�(榛樿10075)
+	 * @property {String} value-name 鑷畾涔塴ist鏁版嵁鐨剉alue灞炴�у悕 1.3.6
+	 * @property {String} label-name 鑷畾涔塴ist鏁版嵁鐨刲abel灞炴�у悕 1.3.6
+	 * @property {String} child-name 鑷畾涔塴ist鏁版嵁鐨刢hildren灞炴�у悕锛屽彧瀵瑰鍒楄仈鍔ㄦā寮忔湁鏁� 1.3.7
+	 * @event {Function} confirm 鐐瑰嚮纭畾鎸夐挳锛岃繑鍥炲綋鍓嶉�夋嫨鐨勫��
+	 * @example <u-select v-model="show" :list="list"></u-select>
+	 */
+
+export default {
+	props: {
+		// 鍒楁暟鎹�
+		list: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 鏄惁鏄剧ず杈规
+		border: {
+			type: Boolean,
+			default: true
+		},
+		// 閫氳繃鍙屽悜缁戝畾鎺у埗缁勪欢鐨勫脊鍑轰笌鏀惰捣
+		value: {
+			type: Boolean,
+			default: false
+		},
+		// "鍙栨秷"鎸夐挳鐨勯鑹�
+		cancelColor: {
+			type: String,
+			default: '#606266'
+		},
+		// "纭畾"鎸夐挳鐨勯鑹�
+		confirmColor: {
+			type: String,
+			default: '#497bff'
+		},
+		// 寮瑰嚭鐨剒-index鍊�
+		zIndex: {
+			type: [String, Number],
+			default: 0
+		},
+		safeAreaInsetBottom: {
+			type: Boolean,
+			default: false
+		},
+		// 鏄惁鍏佽閫氳繃鐐瑰嚮閬僵鍏抽棴Picker
+		maskCloseAble: {
+			type: Boolean,
+			default: true
+		},
+		// 鎻愪緵鐨勯粯璁ら�変腑鐨勪笅鏍�
+		defaultValue: {
+			type: Array,
+			default() {
+				return [0];
+			}
+		},
+		// 妯″紡閫夋嫨锛宻ingle-column-鍗曞垪锛宮util-column-澶氬垪锛宮util-column-auto-澶氬垪鑱斿姩
+		mode: {
+			type: String,
+			default: 'single-column'
+		},
+		// 鑷畾涔塿alue灞炴�у悕
+		valueName: {
+			type: String,
+			default: 'value'
+		},
+		// 鑷畾涔塴abel灞炴�у悕
+		labelName: {
+			type: String,
+			default: 'label'
+		},
+		// 鑷畾涔夊鍒楄仈鍔ㄦā寮忕殑children灞炴�у悕
+		childName: {
+			type: String,
+			default: 'children'
+		},
+		// 椤堕儴鏍囬
+		title: {
+			type: String,
+			default: ''
+		},
+		// 鍙栨秷鎸夐挳鐨勬枃瀛�
+		cancelText: {
+			type: String,
+			default: '鍙栨秷'
+		},
+		// 纭鎸夐挳鐨勬枃瀛�
+		confirmText: {
+			type: String,
+			default: '纭'
+		}
+	},
+	data() {
+		return {
+			// 鐢ㄤ簬鍒楁敼鍙樻椂锛屼繚瀛樺綋鍓嶇殑绱㈠紩锛屼笅涓�娆″彉鍖栨椂姣旇緝寰楀嚭鏄摢涓�鍒楀彂鐢熶簡鍙樺寲
+			defaultSelector: [0],
+			// picker-view鐨勬暟鎹�
+			columnData: [],
+			// 姣忔闃熷垪鍙戠敓鍙樺寲鏃讹紝淇濆瓨閫夋嫨鐨勭粨鏋�
+			selectValue: [],
+			// 涓婁竴娆″垪鍙樺寲鏃剁殑index
+			lastSelectIndex: [],
+			// 鍒楁暟
+			columnNum: 0,
+			// 鍒楁槸鍚﹁繕鍦ㄦ粦鍔ㄤ腑锛屽井淇″皬绋嬪簭濡傛灉鍦ㄦ粦鍔ㄤ腑灏辩偣纭畾锛岀粨鏋滃彲鑳戒笉鍑嗙‘
+			moving: false
+		};
+	},
+	watch: {
+		// 鍦╯elect寮硅捣鐨勬椂鍊欙紝閲嶆柊鍒濆鍖栨墍鏈夋暟鎹�
+		value: {
+			immediate: true,
+			handler(val) {
+				if(val) setTimeout(() => this.init(), 10);
+			}
+		},
+	},
+	computed: {
+		uZIndex() {
+			// 濡傛灉鐢ㄦ埛鏈変紶閫抸-index鍊硷紝浼樺厛浣跨敤
+			return this.zIndex ? this.zIndex : this.$u.zIndex.popup;
+		},
+	},
+	methods: {
+		// 鏍囪瘑婊戝姩寮�濮嬶紝鍙湁寰俊灏忕▼搴忔墠鏈夎繖鏍风殑浜嬩欢
+		pickstart() {
+			// #ifdef MP-WEIXIN
+			this.moving = true;
+			// #endif
+		},
+		// 鏍囪瘑婊戝姩缁撴潫
+		pickend() {
+			// #ifdef MP-WEIXIN
+			this.moving = false;
+			// #endif
+		},
+		init() {
+			// 濡傛灉娌℃湁鏁版嵁鐨勬椂鍊欏澶勬姤鏈畾涔� ThinkGem
+			if (!this.list || this.list.length == 0){
+				return
+			}
+			this.setColumnNum();
+			this.setDefaultSelector();
+			this.setColumnData();
+			this.setSelectValue();
+		},
+		// 鑾峰彇榛樿閫変腑鍒椾笅鏍�
+		setDefaultSelector() {
+			// 濡傛灉娌℃湁浼犲叆榛樿閫変腑鐨勫�硷紝鐢熸垚闀垮害涓篶olumnNum锛岀敤0濉厖鐨勬暟缁�
+			this.defaultSelector = this.defaultValue.length == this.columnNum ? this.defaultValue : Array(this.columnNum).fill(0);
+			this.lastSelectIndex = this.$u.deepClone(this.defaultSelector);
+		},
+		// 璁$畻鍒楁暟
+		setColumnNum() {
+			// 鍗曞垪鐨勫垪鏁颁负1
+			if(this.mode == 'single-column') this.columnNum = 1;
+			// 澶氬垪鏃讹紝this.list鏁扮粍闀垮害灏辨槸鍒楁暟
+			else if(this.mode == 'mutil-column') this.columnNum = this.list.length;
+			// 澶氬垪鑱斿姩鏃讹紝閫氳繃鍘嗛亶this.list鐨勭涓�涓厓绱狅紝寰楀嚭鏈夊灏戝垪
+			else if(this.mode == 'mutil-column-auto') {
+				let num = 1;
+				let column = this.list;
+				// 鍙鏈夊厓绱犲苟涓旂涓�涓厓绱犳湁children灞炴�э紝缁х画鍘嗛亶
+				while(column[0] && column[0][this.childName]) { // 澧炲姞 column[0] 鍒ゆ柇锛屽鏋滄病鏈夋暟鎹殑鏃跺�欎細鎶� undefined ThinkGem
+					column = column[0] ? column[0][this.childName] : {};
+					num ++;
+				}
+				this.columnNum = num;
+			}
+		},
+		// 鑾峰彇闇�瑕佸睍绀哄湪picker涓殑鍒楁暟鎹�
+		setColumnData() {
+			let data = [];
+			this.selectValue = [];
+			if(this.mode == 'mutil-column-auto') {
+				// 鑾峰緱鎵�鏈夋暟鎹腑鐨勭涓�涓厓绱�
+				let column = this.list[this.defaultSelector.length ? this.defaultSelector[0] : 0];
+				// 閫氳繃寰幆鎵�鏈夌殑鍒楁暟锛屽啀鏍规嵁璁惧畾鍒楃殑鏁扮粍锛屽緱鍑哄綋鍓嶉渶瑕佹覆鏌撶殑鏁翠釜鍒楁暟缁�
+				for (let i = 0; i < this.columnNum; i++) {
+					// 绗竴鍒楅粯璁や负鏁翠釜list鏁扮粍
+					if (i == 0) {
+						data[i] = this.list;
+						column = column[this.childName];
+					} else {
+						// 澶т簬绗竴鍒楁椂锛屽垽鏂槸鍚︽湁榛樿閫変腑鐨勶紝濡傛灉娌℃湁灏辩敤璇ュ垪鐨勭涓�椤�
+						data[i] = column;
+						column = column[this.defaultSelector[i]][this.childName];
+					}
+				}
+			} else if(this.mode == 'single-column') {
+				data[0] = this.list;
+			} else {
+				data = this.list;
+			}
+			this.columnData = data;
+		},
+		// 鑾峰彇榛樿閫変腑鐨勫�硷紝濡傛灉娌℃湁璁剧疆defaultValue锛屽氨榛樿閫変腑姣忓垪鐨勭涓�涓�
+		setSelectValue() {
+			let tmp = null;
+			for(let i = 0; i < this.columnNum; i++) {
+				tmp = this.columnData[i][this.defaultSelector[i]];
+				let data = {
+					value: tmp ? tmp[this.valueName] : null,
+					label: tmp ? tmp[this.labelName] : null
+				};
+				// 鍒ゆ柇鏄惁瀛樺湪棰濆鐨勫弬鏁帮紝濡傛灉瀛樺湪锛屽氨杩斿洖
+				if(tmp && tmp.extra) data.extra = tmp.extra;
+				this.selectValue.push(data)
+			}
+		},
+		// 鍒楅�夐」
+		columnChange(e) {
+			let index = null;
+			let columnIndex = e.detail.value;
+			// 鐢变簬鍚庨潰鏄渶瑕乸ush杩涙暟缁勭殑锛屾墍浠ラ渶瑕佸厛娓呯┖鏁扮粍
+			this.selectValue = [];
+			if(this.mode == 'mutil-column-auto') {
+				// 瀵规瘮鍓嶅悗涓や釜鏁扮粍锛屽鎵惧彉鏇寸殑鏄摢涓�鍒楋紝濡傛灉鏌愪竴涓厓绱犱笉鍚岋紝鍗冲彲鍒ゅ畾璇ュ垪鍙戠敓浜嗗彉鍖�
+				this.lastSelectIndex.map((val, idx) => {
+					if (val != columnIndex[idx]) index = idx;
+				});
+				this.defaultSelector = columnIndex;
+				for (let i = index + 1; i < this.columnNum; i++) {
+					// 褰撳墠鍙樺寲鍒楃殑涓嬩竴鍒楃殑鏁版嵁锛岄渶瑕佽幏鍙栦笂涓�鍒楃殑鏁版嵁锛屽悓鏃堕渶瑕佹寚瀹氭槸涓婁竴鍒楃殑绗嚑涓殑children锛屽啀寰�鍚庣殑
+					// 榛樿鏄槦鍒楃殑绗竴涓负榛樿閫夐」
+					this.columnData[i] = this.columnData[i - 1][i - 1 == index ? columnIndex[index] : 0][this.childName];
+					// 鏀瑰彉鐨勫垪涔嬪悗鐨勬墍鏈夊垪锛岄粯璁ら�変腑绗竴涓�
+					this.defaultSelector[i] = 0;
+				}
+				// 鍦ㄥ巻閬嶇殑杩囩▼涓紝鍙兘鐢变簬涓婁竴姝ヤ慨鏀箃his.columnData锛屽鑷翠骇鐢熻繛閿佸弽搴旓紝绋嬪簭瑙﹀彂columnChange锛屼細鏈夊娆¤皟鐢�
+				// 鍙湁鍦ㄦ渶鍚庝竴娆℃暟鎹ǔ瀹氬悗鐨勭粨鏋滄槸姝g‘鐨勶紝姝ゅ墠鐨勫巻閬嶄腑锛屽彲鑳戒細浜х敓undefined锛屾晠闇�瑕佸垽鏂�
+				columnIndex.map((item, index) => {
+					if (!this.columnData[index]){
+						return; // 濡傛灉鍒楁爲涓嶅浐瀹氾紝浼氭姤绌� ThinkGem
+					}
+					let data = this.columnData[index][columnIndex[index]];
+					let tmp = {
+						value: data ? data[this.valueName] : null,
+						label: data ? data[this.labelName] : null,
+					};
+					// 鍒ゆ柇鏄惁鏈夐渶瑕侀澶栨惡甯︾殑鍙傛暟
+					if(data && data.extra !== undefined) tmp.extra = data.extra;
+					this.selectValue.push(tmp);
+
+				})
+				// 淇濆瓨杩欎竴娆$殑缁撴灉锛岀敤浜庝笅娆″垪鍙戠敓鍙樺寲鏃朵綔姣旇緝
+				this.lastSelectIndex = columnIndex;
+			} else if(this.mode == 'single-column') {
+				let data = this.columnData[0][columnIndex[0]];
+				// 鍒濆榛樿閫変腑鍊�
+				let tmp = {
+					value: data ? data[this.valueName] : null,
+					label: data ? data[this.labelName] : null,
+				};
+				// 鍒ゆ柇鏄惁鏈夐渶瑕侀澶栨惡甯︾殑鍙傛暟
+				if(data && data.extra !== undefined) tmp.extra = data.extra;
+				this.selectValue.push(tmp);
+			} else if(this.mode == 'mutil-column') {
+				// 鍒濆榛樿閫変腑鍊�
+				columnIndex.map((item, index) => {
+					let data = this.columnData[index][columnIndex[index]];
+					// 鍒濆榛樿閫変腑鍊�
+					let tmp = {
+						value: data ? data[this.valueName] : null,
+						label: data ? data[this.labelName] : null,
+					};
+					// 鍒ゆ柇鏄惁鏈夐渶瑕侀澶栨惡甯︾殑鍙傛暟
+					if(data && data.extra !== undefined) tmp.extra = data.extra;
+					this.selectValue.push(tmp);
+				})
+			}
+		},
+		close() {
+			this.$emit('input', false);
+		},
+		// 鐐瑰嚮纭畾鎴栬�呭彇娑�
+		getResult(event = null) {
+			// #ifdef MP-WEIXIN
+			if (this.moving) return;
+			// #endif
+			if (event) this.$emit(event, this.selectValue, this.defaultSelector);
+			this.close();
+		},
+		selectHandler() {
+			this.$emit('click');
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+
+.u-select {
+
+	&__action {
+		position: relative;
+		line-height: $u-form-item-height;
+		height: $u-form-item-height;
+
+		&__icon {
+			position: absolute;
+			right: 20rpx;
+			top: 50%;
+			transition: transform .4s;
+			transform: translateY(-50%);
+			z-index: 1;
+
+			&--reverse {
+				transform: rotate(-180deg) translateY(50%);
+			}
+		}
+	}
+
+	&__hader {
+		&__title {
+			color: $u-content-color;
+		}
+	}
+
+	&--border {
+		border-radius: 6rpx;
+		border-radius: 4px;
+		border: 1px solid $u-form-item-border-color;
+	}
+
+	&__header {
+		@include vue-flex;
+		align-items: center;
+		justify-content: space-between;
+		height: 80rpx;
+		padding: 0 40rpx;
+	}
+
+	&__body {
+		width: 100%;
+		height: 500rpx;
+		overflow: hidden;
+		background-color: #fff;
+
+		&__picker-view {
+			height: 100%;
+			box-sizing: border-box;
+
+			&__item {
+				@include vue-flex;
+				align-items: center;
+				justify-content: center;
+				font-size: 32rpx;
+				color: $u-main-color;
+				padding: 0 8rpx;
+			}
+		}
+	}
+}
+</style>
diff --git a/uview-ui/components/u-skeleton/u-skeleton.vue b/uview-ui/components/u-skeleton/u-skeleton.vue
new file mode 100644
index 0000000..c8cb19e
--- /dev/null
+++ b/uview-ui/components/u-skeleton/u-skeleton.vue
@@ -0,0 +1,199 @@
+<template>
+	<view v-if="loading" :style="{
+		width: windowWinth + 'px', 
+		height: windowHeight + 'px', 
+		backgroundColor: bgColor, 
+		position: 'absolute', 
+		left: left + 'px', 
+		top: top + 'px', 
+		zIndex: 9998, 
+		overflow: 'hidden'
+	}"
+	 @touchmove.stop.prevent>
+		<view v-for="(item, index) in RectNodes" :key="$u.guid()" :class="[animation ? 'skeleton-fade' : '']" :style="{
+			width: item.width + 'px', 
+			height: item.height + 'px', 
+			backgroundColor: elColor, 
+			position: 'absolute', 
+			left: (item.left - left) + 'px', 
+			top: (item.top - top) + 'px'
+		}"></view>
+		<view v-for="(item, index) in circleNodes" :key="$u.guid()" :class="animation ? 'skeleton-fade' : ''" :style="{
+			width: item.width + 'px', 
+			height: item.height + 'px', 
+			backgroundColor: elColor, 
+			borderRadius: item.width/2 + 'px', 
+			position: 'absolute', 
+			left: (item.left - left) + 'px',
+			top: (item.top - top) + 'px'
+		}"></view>
+		<view v-for="(item, index) in filletNodes" :key="$u.guid()" :class="animation ? 'skeleton-fade' : ''" :style="{
+			width: item.width + 'px', 
+			height: item.height + 'px', 
+			backgroundColor: elColor, 
+			borderRadius: borderRadius + 'rpx', 
+			position: 'absolute', 
+			left: (item.left - left) + 'px',
+			top: (item.top - top) + 'px'
+		}"></view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * skeleton 楠ㄦ灦灞�
+	 * @description 楠ㄦ灦灞忎竴鑸敤浜庨〉闈㈠湪璇锋眰杩滅▼鏁版嵁灏氭湭瀹屾垚鏃讹紝椤甸潰鐢ㄧ伆鑹插潡棰勬樉绀烘湰鏉ョ殑椤甸潰缁撴瀯锛岀粰鐢ㄦ埛鏇村ソ鐨勪綋楠屻��
+	 * @tutorial https://www.uviewui.com/components/skeleton.html
+	 * @property {String} el-color 楠ㄦ灦鍧楃姸鍏冪礌鐨勮儗鏅鑹诧紙榛樿#e5e5e5锛�
+	 * @property {String} bg-color 楠ㄦ灦缁勪欢鑳屾櫙棰滆壊锛堥粯璁�#ffffff锛�
+	 * @property {Boolean} animation 楠ㄦ灦鍧楁槸鍚︽樉绀哄姩鐢绘晥鏋滐紙榛樿false锛�
+	 * @property {String Number} border-radius u-skeleton-fillet绫诲悕鍏冪礌锛屽搴旂殑楠ㄦ灦鍧楃殑鍦嗚澶у皬锛屽崟浣峳px锛堥粯璁�10锛�
+	 * @property {Boolean} loading 鏄惁鏄剧ず楠ㄦ灦缁勪欢锛岃姹傚畬鎴愬悗锛屽皢姝ゅ�艰缃负false锛堥粯璁rue锛�
+	 * @example <u-skeleton :loading="true" :animation="true"></u-skeleton>
+	 */
+	export default {
+		name: "u-skeleton",
+		props: {
+			// 闇�瑕佹覆鏌撶殑鍏冪礌鑳屾櫙棰滆壊锛屽崄鍏繘鍒舵垨鑰卹gb绛夐兘鍙互
+			elColor: {
+				type: String,
+				default: '#e5e5e5'
+			},
+			// 鏁翠釜楠ㄦ灦灞忛〉闈㈢殑鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// 鏄惁鏄剧ず鍔犺浇鍔ㄧ敾
+			animation: {
+				type: Boolean,
+				default: false
+			},
+			// 鍦嗚鍊硷紝鍙绫诲悕涓簎-skeleton-fillet鐨勫厓绱犵敓鏁堬紝涓烘暟鍊硷紝涓嶅甫鍗曚綅
+			borderRadius: {
+				type: [String, Number],
+				default: "10"
+			},
+			// 鏄惁鏄剧ず楠ㄦ灦锛宼rue-鏄剧ず锛宖alse-闅愯棌
+			loading: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				windowWinth: 750, // 楠ㄦ灦灞忓搴�
+				windowHeight: 1500, // 楠ㄦ灦灞忛珮搴�
+				filletNodes: [], // 鍦嗚鍏冪礌
+				circleNodes: [], // 鍦嗗舰鍏冪礌
+				RectNodes: [], // 鐭╁舰鍏冪礌
+				top: 0,
+				left: 0,
+			}
+		},
+		methods: {
+			// 鏌ヨ鍚勮妭鐐圭殑淇℃伅
+			selecterQueryInfo() {
+				// 鑾峰彇鏁翠釜鐖剁粍浠跺鍣ㄧ殑楂樺害锛屽綋鍋氶鏋跺睆鐨勯珮搴� 
+				// 鍦ㄥ井淇″皬绋嬪簭涓紝濡傛灉鎶婇鏋跺睆鏀惧叆缁勪欢涓娇鐢ㄧ殑璇濓紝闇�瑕佽皟in(this)涓婁笅鏂囦负鐖剁粍浠舵墠鏈夋晥
+				let query = '';
+				// #ifdef MP-WEIXIN
+				query = uni.createSelectorQuery().in(this.$parent);
+				// #endif
+				// #ifndef MP-WEIXIN
+				query = uni.createSelectorQuery()
+				// #endif
+				query.selectAll('.u-skeleton').boundingClientRect().exec((res) => {
+					this.windowHeight = res[0][0].height;
+					this.windowWinth = res[0][0].width;
+					this.top = res[0][0].bottom - res[0][0].height;
+					this.left = res[0][0].left;
+				});
+				// 鐭╁舰楠ㄦ灦鍏冪礌
+				this.getRectEls();
+				// 鍦嗗舰楠ㄦ灦鍏冪礌
+				this.getCircleEls();
+				// 鍦嗚楠ㄦ灦鍏冪礌
+				this.getFilletEls();
+			},
+			// 鐭╁舰鍏冪礌鍒楄〃
+			getRectEls() {
+				let query = '';
+				// 鍦ㄥ井淇″皬绋嬪簭涓紝濡傛灉鎶婇鏋跺睆鏀惧叆缁勪欢涓娇鐢ㄧ殑璇濓紝闇�瑕佽皟in(this)涓婁笅鏂囦负鐖剁粍浠舵墠鏈夋晥
+				// #ifdef MP-WEIXIN
+				query = uni.createSelectorQuery().in(this.$parent);
+				// #endif
+				// #ifndef MP-WEIXIN
+				query = uni.createSelectorQuery()
+				// #endif
+				query.selectAll('.u-skeleton-rect').boundingClientRect().exec((res) => {
+					this.RectNodes = res[0];
+				});
+			},
+			// 鍦嗚鍏冪礌鍒楄〃
+			getFilletEls() {
+				let query = '';
+				// 鍦ㄥ井淇″皬绋嬪簭涓紝濡傛灉鎶婇鏋跺睆鏀惧叆缁勪欢涓娇鐢ㄧ殑璇濓紝闇�瑕佽皟in(this)涓婁笅鏂囦负鐖剁粍浠舵墠鏈夋晥
+				// #ifdef MP-WEIXIN
+				query = uni.createSelectorQuery().in(this.$parent);
+				// #endif
+				// #ifndef MP-WEIXIN
+				query = uni.createSelectorQuery()
+				// #endif
+				query.selectAll('.u-skeleton-fillet').boundingClientRect().exec((res) => {
+					this.filletNodes = res[0];
+				});
+			},
+			// 鍦嗗舰鍏冪礌鍒楄〃
+			getCircleEls() {
+				let query = '';
+				// 鍦ㄥ井淇″皬绋嬪簭涓紝濡傛灉鎶婇鏋跺睆鏀惧叆缁勪欢涓娇鐢ㄧ殑璇濓紝闇�瑕佽皟in(this)涓婁笅鏂囦负鐖剁粍浠舵墠鏈夋晥
+				// #ifdef MP-WEIXIN
+				query = uni.createSelectorQuery().in(this.$parent);
+				// #endif
+				// #ifndef MP-WEIXIN
+				query = uni.createSelectorQuery()
+				// #endif
+				query.selectAll('.u-skeleton-circle').boundingClientRect().exec((res) => {
+					this.circleNodes = res[0];
+				});
+			}
+		},
+		// 缁勪欢琚寕杞�
+		mounted() {
+			// 鑾峰彇绯荤粺淇℃伅
+			let systemInfo = uni.getSystemInfoSync();
+			this.windowHeight = systemInfo.windowHeight;
+			this.windowWinth = systemInfo.windowWidth;
+			this.selecterQueryInfo();
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.skeleton-fade {
+		width: 100%;
+		height: 100%;
+		background: rgb(194, 207, 214);
+		animation-duration: 1.5s;
+		animation-name: blink;
+		animation-timing-function: ease-in-out;
+		animation-iteration-count: infinite;
+	}
+
+	@keyframes blink {
+		0% {
+			opacity: 1;
+		}
+
+		50% {
+			opacity: 0.4;
+		}
+
+		100% {
+			opacity: 1;
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-slider/u-slider.vue b/uview-ui/components/u-slider/u-slider.vue
new file mode 100644
index 0000000..ae695c4
--- /dev/null
+++ b/uview-ui/components/u-slider/u-slider.vue
@@ -0,0 +1,257 @@
+<template>
+	<view class="u-slider" @tap="onClick" :class="[disabled ? 'u-slider--disabled' : '']" :style="{
+		backgroundColor: inactiveColor
+	}">
+		<view
+			class="u-slider__gap"
+			:style="[
+				barStyle,
+				{
+					height: height + 'rpx',
+					backgroundColor: activeColor
+				}
+			]"
+		>
+			<view class="u-slider__button-wrap" @touchstart="onTouchStart" 
+				@touchmove="onTouchMove" @touchend="onTouchEnd" 
+				@touchcancel="onTouchEnd">
+				<slot v-if="$slots.default  || $slots.$default"/>
+				<view v-else class="u-slider__button" :style="[blockStyle, {
+					height: blockWidth + 'rpx',
+					width: blockWidth + 'rpx',
+					backgroundColor: blockColor
+				}]"></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * slider 婊戝潡閫夋嫨鍣�
+ * @tutorial https://uviewui.com/components/slider.html
+ * @property {Number | String} value 婊戝潡榛樿鍊硷紙榛樿0锛�
+ * @property {Number | String} min 鏈�灏忓�硷紙榛樿0锛�
+ * @property {Number | String} max 鏈�澶у�硷紙榛樿100锛�
+ * @property {Number | String} step 姝ラ暱锛堥粯璁�1锛�
+ * @property {Number | String} blockWidth 婊戝潡瀹藉害锛岄珮绛変簬瀹斤紙30锛�
+ * @property {Number | String} height 婊戝潡鏉¢珮搴︼紝鍗曚綅rpx锛堥粯璁�6锛�
+ * @property {String} inactiveColor 搴曢儴鏉¤儗鏅鑹诧紙榛樿#c0c4cc锛�
+ * @property {String} activeColor 搴曢儴閫夋嫨閮ㄥ垎鐨勮儗鏅鑹诧紙榛樿#497bff锛�
+ * @property {String} blockColor 婊戝潡棰滆壊锛堥粯璁�#ffffff锛�
+ * @property {Object} blockStyle 缁欐粦鍧楄嚜瀹氫箟鏍峰紡锛屽璞″舰寮�
+ * @property {Boolean} disabled 鏄惁绂佺敤婊戝潡(榛樿涓篺alse)
+ * @event {Function} start 婊戝姩瑙﹀彂
+ * @event {Function} moving 姝e湪婊戝姩涓�
+ * @event {Function} end 婊戝姩缁撴潫
+ * @example <u-slider v-model="value" />
+ */
+export default {
+	name: 'u-slider',
+	props: {
+		// 褰撳墠杩涘害鐧惧垎姣斿�硷紝鑼冨洿0-100
+		value: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鏄惁绂佺敤婊戝潡
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 婊戝潡瀹藉害锛岄珮绛変簬瀹斤紝鍗曚綅rpx
+		blockWidth: {
+			type: [Number, String],
+			default: 30
+		},
+		// 鏈�灏忓��
+		min: {
+			type: [Number, String],
+			default: 0
+		},
+		// 鏈�澶у��
+		max: {
+			type: [Number, String],
+			default: 100
+		},
+		// 姝ヨ繘鍊�
+		step: {
+			type: [Number, String],
+			default: 1
+		},
+		// 婊戝潡鏉¢珮搴︼紝鍗曚綅rpx
+		height: {
+			type: [Number, String],
+			default: 6
+		},
+		// 杩涘害鏉$殑婵�娲婚儴鍒嗛鑹�
+		activeColor: {
+			type: String,
+			default: '#497bff'
+		},
+		// 杩涘害鏉$殑鑳屾櫙棰滆壊
+		inactiveColor: {
+			type: String,
+			default: '#c0c4cc'
+		},
+		// 婊戝潡鐨勮儗鏅鑹�
+		blockColor: {
+			type: String,
+			default: '#ffffff'
+		},
+		// 鐢ㄦ埛瀵规粦鍧楃殑鑷畾涔夐鑹�
+		blockStyle: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+	},
+	data() {
+		return {
+			startX: 0,
+			status: 'end',
+			newValue: 0,
+			distanceX: 0,
+			startValue: 0,
+			barStyle: {},
+			sliderRect: {
+				left: 0,
+				width: 0
+			}
+		};
+	},
+	watch: {
+		value(n) {
+			// 鍙湁鍦ㄩ潪婊戝姩鐘舵�佹椂锛屾墠鍙互閫氳繃value鏇存柊婊戝潡鍊硷紝杩欓噷鐩戝惉锛屾槸涓轰簡璁╃敤鎴疯Е鍙�
+			if(this.status == 'end') this.updateValue(this.value, false);
+		}
+	},
+	created() {
+		this.updateValue(this.value, false);
+	},
+	mounted() {
+		// 鑾峰彇婊戝潡鏉$殑灏哄淇℃伅
+		this.$uGetRect('.u-slider').then(rect => {
+			this.sliderRect = rect;
+		});
+	},
+	methods: {
+		onTouchStart(event) {
+			if (this.disabled) return;
+			this.startX = 0;
+			// 瑙︽懜鐐归泦
+			let touches = event.touches[0];
+			// 瑙︽懜鐐瑰埌灞忓箷宸﹁竟鐨勮窛绂�
+			this.startX = touches.clientX;
+			// 姝ゅ鐨則his.value铏戒负props鍊硷紝浣嗘槸閫氳繃$emit('input')杩涜浜嗕慨鏀�
+			this.startValue = this.format(this.value);
+			// 鏍囩ず褰撳墠鐨勭姸鎬佷负寮�濮嬭Е鎽告粦鍔�
+			this.status = 'start';
+		},
+		onTouchMove(event) {
+			if (this.disabled) return;
+			// 杩炵画瑙︽懜鐨勮繃绋嬩細涓�鐩磋Е鍙戞湰鏂规硶锛屼絾鍙湁鎵嬫寚瑙﹀彂涓旂Щ鍔ㄤ簡鎵嶈璁や负鏄嫋鍔ㄤ簡锛屾墠鍙戝嚭浜嬩欢
+			// 瑙︽懜鍚庣涓�娆$Щ鍔ㄥ凡缁忓皢status璁剧疆涓簃oving鐘舵�侊紝鏁呰Е鎽哥浜屾绉诲姩涓嶄細瑙﹀彂鏈簨浠�
+			if (this.status == 'start') this.$emit('start');
+			let touches = event.touches[0];
+			// 婊戝潡鐨勫乏杈逛笉涓�瀹氳窡灞忓箷宸﹁竟鎺ュ¥锛屾墍浠ラ渶瑕佸噺鍘绘渶澶栧眰鐖跺厓绱犵殑宸﹁竟鍊�
+			this.distanceX = touches.clientX - this.sliderRect.left;
+			// 鑾峰緱绉诲姩璺濈瀵规暣涓粦鍧楃殑鐧惧垎姣斿�硷紝姝や负甯︽湁澶氫綅灏忔暟鐨勫�硷紝涓嶈兘鐢ㄦ鏇存柊瑙嗗浘
+			// 鍚﹀垯閫犳垚閫氫俊闃诲锛岄渶瑕佹瘡鏀瑰彉涓�涓猻tep鍊兼椂淇敼涓�娆¤鍥�
+			this.newValue = (this.distanceX / this.sliderRect.width) * 100;
+			this.status = 'moving';
+			// 鍙戝嚭moving浜嬩欢
+			this.$emit('moving');
+			this.updateValue(this.newValue, true);
+		},
+		onTouchEnd() {
+			if (this.disabled) return;
+			if (this.status === 'moving') {
+				this.updateValue(this.newValue, false);
+				this.$emit('end');
+			}
+			this.status = 'end';
+		},
+		updateValue(value, drag) {
+			// 鍘绘帀灏忔暟閮ㄥ垎锛屽悓鏃朵篃鏄step姝ヨ繘鐨勫鐞�
+			const width = this.format(value);
+			// 涓嶅厑璁告粦鍔ㄧ殑鍊艰秴杩噈ax鏈�澶у�硷紝鐧惧垎姣斾篃涓嶈兘瓒呰繃100
+			if(width > this.max || width > 100) return;
+			// 璁剧疆绉诲姩鐨勭櫨鍒嗘瘮鍊�
+			let barStyle = {
+				width: width + '%'
+			};
+			// 绉诲姩鏈熼棿鏃犻渶杩囨浮鍔ㄧ敾
+			if (drag == true) {
+				barStyle.transition = 'none';
+			} else {
+				// 闈炵Щ鍔ㄦ湡闂达紝鍒犳帀瀵硅繃娓′负绌虹殑澹版槑锛岃css涓殑澹版槑璧锋晥
+				delete barStyle.transition;
+			}
+			// 淇敼value鍊�
+			this.$emit('input', width);
+			this.barStyle = barStyle;
+		},
+		format(value) {
+			// 灏嗗皬鏁板彉鎴愭暣鏁帮紝涓轰簡鍑忓皯瀵硅鍥剧殑鏇存柊锛岄�犳垚瑙嗗浘灞備笌閫昏緫灞傜殑闃诲
+			return Math.round(Math.max(this.min, Math.min(value, this.max)) / this.step) * this.step;
+		},
+		onClick(event) {
+			if (this.disabled) return;
+			// 鐩存帴鐐瑰嚮婊戝潡鐨勬儏鍐碉紝璁$畻鏂瑰紡涓巓nTouchMove鏂规硶鐩稿悓
+			const value = ((event.detail.x - this.sliderRect.left) / this.sliderRect.width) * 100;
+			this.updateValue(value, false);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-slider {
+	position: relative;
+	border-radius: 999px;
+	border-radius: 999px;
+	background-color: #ebedf0;
+}
+
+.u-slider:before {
+	position: absolute;
+	right: 0;
+	left: 0;
+	content: '';
+	top: -8px;
+	bottom: -8px;
+	z-index: -1;
+}
+
+.u-slider__gap {
+	position: relative;
+	border-radius: inherit;
+	transition: width 0.2s;
+	transition: width 0.2s;
+	background-color: #1989fa;
+}
+
+.u-slider__button {
+	width: 24px;
+	height: 24px;
+	border-radius: 50%;
+	box-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
+	background-color: #fff;
+	cursor: pointer;
+}
+
+.u-slider__button-wrap {
+	position: absolute;
+	top: 50%;
+	right: 0;
+	transform: translate3d(50%, -50%, 0);
+}
+
+.u-slider--disabled {
+	opacity: 0.5;
+}
+</style>
diff --git a/uview-ui/components/u-steps/u-steps.vue b/uview-ui/components/u-steps/u-steps.vue
new file mode 100644
index 0000000..f12968f
--- /dev/null
+++ b/uview-ui/components/u-steps/u-steps.vue
@@ -0,0 +1,200 @@
+<template>
+	<view class="">
+		<view
+			class="u-steps"
+			:style="{
+				flexDirection: direction
+			}"
+		>
+			<view class="u-steps__item" 
+				:class="['u-steps__item--' + direction]" 
+				v-for="(item, index) in list" :key="index"
+			>
+				<view
+					class="u-steps__item__num"
+					v-if="mode == 'number'"
+					:style="{
+						backgroundColor: current < index ? 'transparent' : activeColor,
+						borderColor: current < index ? unActiveColor : activeColor
+					}"
+				>
+					<text v-if="current < index" :style="{
+						color: current < index ? unActiveColor : activeColor,
+					}">
+						{{ index + 1 }}
+					</text>
+					<u-icon v-else size="22" color="#ffffff" :name="icon"></u-icon>
+				</view>
+				<view class="u-steps__item__dot" v-if="mode == 'dot'" :style="{ 
+					backgroundColor: index <= current ? activeColor : unActiveColor 
+				}"></view>
+				<text class="u-line-1" :style="{ 
+					color: index <= current ? activeColor : unActiveColor,
+				}" :class="['u-steps__item__text--' + direction]">
+					{{ item.name }}
+				</text>
+				<view class="u-steps__item__line" :class="['u-steps__item__line--' + mode]" v-if="index < list.length - 1">
+					<u-line :direction="direction" length="100%" :hair-line="false" :color="unActiveColor"></u-line>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * steps 姝ラ鏉�
+ * @description 璇ョ粍浠朵竴鑸敤浜庡畬鎴愪竴涓换鍔¤鍒嗗嚑涓楠わ紝鏍囪瘑鐩墠澶勪簬绗嚑姝ョ殑鍦烘櫙銆�
+ * @tutorial https://www.uviewui.com/components/steps.html
+ * @property {String} mode 璁剧疆妯″紡锛堥粯璁ot锛�
+ * @property {Array} list 鏁拌酱鏉℃暟鎹紝鏁扮粍銆傚叿浣撹涓婃柟绀轰緥
+ * @property {String} type type涓婚锛堥粯璁rimary锛�
+ * @property {String} direction row-妯悜锛宑olumn-绔栧悜锛堥粯璁ow锛�
+ * @property {Number String} current 璁剧疆褰撳墠澶勪簬绗嚑姝�
+ * @property {String} active-color 宸插畬鎴愭楠ょ殑婵�娲婚鑹诧紝濡傝缃紝type鍊间細澶辨晥
+ * @property {String} un-active-color 鏈縺娲荤殑棰滆壊锛岀敤浜庤〃绀烘湭瀹屾垚姝ラ鐨勯鑹诧紙榛樿#606266锛�
+ * @example <u-steps :list="numList" active-color="#fa3534"></u-steps>
+ */
+export default {
+	name: 'u-steps',
+	props: {
+		// 姝ラ鏉$殑绫诲瀷锛宒ot|number
+		mode: {
+			type: String,
+			default: 'dot'
+		},
+		// 姝ラ鏉$殑鏁版嵁
+		list: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 涓婚绫诲瀷, primary|success|info|warning|error
+		type: {
+			type: String,
+			default: 'primary'
+		},
+		// 褰撳墠鍝竴姝ユ槸婵�娲荤殑
+		current: {
+			type: [Number, String],
+			default: 0
+		},
+		// 婵�娲绘楠ょ殑棰滆壊
+		activeColor: {
+			type: String,
+			default: '#497bff'
+		},
+		// 鏈縺娲荤殑棰滆壊
+		unActiveColor: {
+			type: String,
+			default: '#909399'
+		},
+		// 鑷畾涔夊浘鏍�
+		icon: {
+			type: String,
+			default: 'checkmark'
+		},
+		// step鐨勬帓鍒楁柟鍚戯紝row-妯悜锛宑olumn-绔栧悜
+		direction: {
+			type: String,
+			default: 'row'
+		}
+	},
+	data() {
+		return {};
+	},
+};
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/style.components.scss';
+
+$u-steps-item-number-width: 44rpx;
+$u-steps-item-dot-width: 20rpx;
+
+.u-steps {
+	@include vue-flex;
+	
+	.u-steps__item {
+		flex: 1;
+		text-align: center;
+		position: relative;
+		min-width: 100rpx;
+		font-size: 26rpx;
+		color: #8799a3;
+		@include vue-flex;
+		justify-content: center;
+		flex-direction: column;
+		align-items: center;
+		
+		&--row {
+			@include vue-flex;
+			flex-direction: column;
+			
+			.u-steps__item__line {
+				position: absolute;
+				z-index: 0;
+				left: 75%;
+				width: 50%;
+				
+				&--dot {
+					top: calc(#{$u-steps-item-dot-width} / 2);
+				}
+				
+				&--number {
+					top: calc(#{$u-steps-item-number-width} / 2);
+				}
+			}
+		}
+		
+		&--column {
+			@include vue-flex;
+			flex-direction: row;
+			justify-content: flex-start;
+			min-height: 120rpx;
+			
+			.u-steps__item__line {
+				position: absolute;
+				z-index: 0;
+				height: 50%;
+				top: 75%;
+				
+				&--dot {
+					left: calc(#{$u-steps-item-dot-width} / 2);
+				}
+				
+				&--number {
+					left: calc(#{$u-steps-item-number-width} / 2);
+				}
+			}
+		}
+		
+		&__num {
+			@include vue-flex;
+			align-items: center;
+			justify-content: center;
+			width: $u-steps-item-number-width;
+			height: $u-steps-item-number-width;
+			border: 1px solid #8799a3;
+			border-radius: 50%;
+			overflow: hidden;
+		}
+		
+		&__dot {
+			width: $u-steps-item-dot-width;
+			height: $u-steps-item-dot-width;
+			@include vue-flex;
+			border-radius: 50%;
+		}
+		
+		&__text--row {
+			margin-top: 14rpx;
+		}
+		
+		&__text--column {
+			margin-left: 14rpx;
+		}
+	}
+}
+</style>
diff --git a/uview-ui/components/u-sticky/u-sticky.vue b/uview-ui/components/u-sticky/u-sticky.vue
new file mode 100644
index 0000000..d9bc34c
--- /dev/null
+++ b/uview-ui/components/u-sticky/u-sticky.vue
@@ -0,0 +1,157 @@
+<template>
+	<view class="">
+		<view class="u-sticky-wrap" :class="[elClass]" :style="{
+			height: fixed ? height + 'px' : 'auto',
+			backgroundColor: bgColor
+		}">
+			<view class="u-sticky" :style="{
+				position: fixed ? 'fixed' : 'static',
+				top: stickyTop + 'px',
+				left: left + 'px',
+				width: width == 'auto' ? 'auto' : width + 'px',
+				zIndex: uZIndex
+			}">
+				<slot></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * sticky 鍚搁《
+	 * @description 璇ョ粍浠朵笌CSS涓璸osition: sticky灞炴�у疄鐜扮殑鏁堟灉涓�鑷达紝褰撶粍浠惰揪鍒伴璁剧殑鍒伴《閮ㄨ窛绂绘椂锛� 灏变細鍥哄畾鍦ㄦ寚瀹氫綅缃紝缁勪欢浣嶇疆澶т簬棰勮鐨勯《閮ㄨ窛绂绘椂锛屼細閲嶆柊鎸夌収姝e父鐨勫竷灞�鎺掑垪銆�
+	 * @tutorial https://www.uviewui.com/components/sticky.html
+	 * @property {String Number} offset-top 鍚搁《鏃朵笌椤堕儴鐨勮窛绂伙紝鍗曚綅rpx锛堥粯璁�0锛�
+	 * @property {String Number} index 鑷畾涔夋爣璇嗭紝鐢ㄤ簬鍖哄垎鏄摢涓�涓粍浠�
+	 * @property {Boolean} enable 鏄惁寮�鍚惛椤跺姛鑳斤紙榛樿true锛�
+	 * @property {String} bg-color 缁勪欢鑳屾櫙棰滆壊锛堥粯璁�#ffffff锛�
+	 * @property {String Number} z-index 鍚搁《鏃剁殑z-index鍊硷紙榛樿970锛�
+	 * @property {String Number} h5-nav-height 瀵艰埅鏍忛珮搴︼紝鑷畾涔夊鑸爮鏃�(鏃犲鑸爮鏃堕渶璁剧疆涓�0)锛岄渶瑕佷紶鍏ユ鍊硷紝鍗曚綅px锛堥粯璁�44锛�
+	 * @event {Function} fixed 缁勪欢鍚搁《鏃惰Е鍙�
+	 * @event {Function} unfixed 缁勪欢鍙栨秷鍚搁《鏃惰Е鍙�
+	 * @example <u-sticky offset-top="200"><view>濉炰笅绉嬫潵椋庢櫙寮傦紝琛¢槼闆佸幓鏃犵暀鎰�</view></u-sticky>
+	 */
+	export default {
+		name: "u-sticky",
+		props: {
+			// 鍚搁《瀹瑰櫒鍒伴《閮ㄦ煇涓窛绂荤殑鏃跺�欙紝杩涜鍚搁《锛屽湪H5骞冲彴锛孨avigationBar涓�44px
+			offsetTop: {
+				type: [Number, String],
+				default: 0
+			},
+			//鍒楄〃涓殑绱㈠紩鍊�
+			index: {
+				type: [Number, String],
+				default: ''
+			},
+			// 鏄惁寮�鍚惛椤跺姛鑳�
+			enable: {
+				type: Boolean,
+				default: true
+			},
+			// h5椤堕儴瀵艰埅鏍忕殑楂樺害
+			h5NavHeight: {
+				type: [Number, String],
+				default: 44
+			},
+			// 鍚搁《鍖哄煙鐨勮儗鏅鑹�
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// z-index鍊�
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			}
+		},
+		data() {
+			return {
+				fixed: false,
+				height: 'auto',
+				stickyTop: 0,
+				elClass: this.$u.guid(),
+				left: 0,
+				width: 'auto',
+			};
+		},
+		watch: {
+			offsetTop(val) {
+				this.initObserver();
+			},
+			enable(val) {
+				if (val == false) {
+					this.fixed = false;
+					this.disconnectObserver('contentObserver');
+				} else {
+					this.initObserver();
+				}
+			}
+		},
+		computed: {
+			uZIndex() {
+				return this.zIndex ? this.zIndex : this.$u.zIndex.sticky;
+			}
+		},
+		mounted() {
+			this.initObserver();
+		},
+		methods: {
+			initObserver() {
+				if (!this.enable) return;
+				// #ifdef H5
+				this.stickyTop = this.offsetTop != 0 ? uni.upx2px(this.offsetTop) + this.h5NavHeight : this.h5NavHeight;
+				// #endif
+				// #ifndef H5
+				this.stickyTop = this.offsetTop != 0 ? uni.upx2px(this.offsetTop) : 0;
+				// #endif
+
+				this.disconnectObserver('contentObserver');
+				this.$uGetRect('.' + this.elClass).then((res) => {
+					this.height = res.height;
+					this.left = res.left;
+					this.width = res.width;
+					this.$nextTick(() => {
+						this.observeContent();
+					});
+				});
+			},
+			observeContent() {
+				this.disconnectObserver('contentObserver');
+				const contentObserver = this.createIntersectionObserver({
+					thresholds: [0.95, 0.98, 1]
+				});
+				contentObserver.relativeToViewport({
+					top: -this.stickyTop
+				});
+				contentObserver.observe('.' + this.elClass, res => {
+					if (!this.enable) return;
+					this.setFixed(res.boundingClientRect.top);
+				});
+				this.contentObserver = contentObserver;
+			},
+			setFixed(top) {
+				const fixed = top < this.stickyTop;
+				if (fixed) this.$emit('fixed', this.index);
+				else if(this.fixed) this.$emit('unfixed', this.index);
+				this.fixed = fixed;
+			},
+			disconnectObserver(observerName) {
+				const observer = this[observerName];
+				observer && observer.disconnect();
+			},
+		},
+		beforeDestroy() {
+			this.disconnectObserver('contentObserver');
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	
+	.u-sticky {
+		z-index: 9999999999;
+	}
+</style>
diff --git a/uview-ui/components/u-subsection/u-subsection.vue b/uview-ui/components/u-subsection/u-subsection.vue
new file mode 100644
index 0000000..b8fbd79
--- /dev/null
+++ b/uview-ui/components/u-subsection/u-subsection.vue
@@ -0,0 +1,355 @@
+<template>
+	<view class="u-subsection" :style="[subsectionStyle]">
+		<view class="u-item u-line-1" :style="[itemStyle(index)]" @tap="click(index)" :class="[noBorderRight(index), 'u-item-' + index]"
+		 v-for="(item, index) in listInfo" :key="index">
+			<view :style="[textStyle(index)]" class="u-item-text u-line-1">{{ item.name }}</view>
+		</view>
+		<view class="u-item-bg" :style="[itemBarStyle]"></view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * subsection 鍒嗘鍣�
+	 * @description 璇ュ垎娈靛櫒涓�鑸敤浜庣敤鎴蜂粠鍑犱釜閫夐」涓�夋嫨鏌愪竴涓殑鍦烘櫙
+	 * @tutorial https://www.uviewui.com/components/subsection.html
+	 * @property {Array} list 閫夐」鐨勬暟缁勶紝褰㈠紡瑙佷笂鏂�"鍩烘湰浣跨敤"
+	 * @property {String Number} current 鍒濆鍖栨椂榛樿閫変腑鐨勯�夐」绱㈠紩鍊硷紙榛樿0锛�
+	 * @property {String} active-color 婵�娲绘椂鐨勯鑹诧紝mode涓簊ubsection鏃跺浐瀹氫负鐧借壊锛堥粯璁�#303133锛�
+	 * @property {String} inactive-color 鏈縺娲绘椂瀛椾綋鐨勯鑹诧紝mode涓簊ubsection鏃舵棤鏁堬紙榛樿#606266锛�
+	 * @property {String} mode 妯″紡閫夋嫨锛岃瀹樼綉"妯″紡閫夋嫨"璇存槑锛堥粯璁utton锛�
+	 * @property {String Number} font-size 瀛椾綋澶у皬锛屽崟浣峳px锛堥粯璁�28锛�
+	 * @property {String Number} height 缁勪欢楂樺害锛屽崟浣峳px锛堥粯璁�70锛�
+	 * @property {Boolean} animation 鏄惁寮�鍚姩鐢绘晥鏋滐紝瑙佷笂鏂硅鏄庯紙榛樿true锛�
+	 * @property {Boolean} bold 婵�娲婚�夐」鐨勫瓧浣撴槸鍚﹀姞绮楋紙榛樿true锛�
+	 * @property {String} bg-color 缁勪欢鑳屾櫙棰滆壊锛宮ode涓篵utton鏃舵湁鏁堬紙榛樿#eeeeef锛�
+	 * @property {String} button-color 鎸夐挳鑳屾櫙棰滆壊锛宮ode涓篵utton鏃舵湁鏁堬紙榛樿#ffffff锛�
+	 * @event {Function} change 鍒嗘鍣ㄩ�夐」鍙戠敓鏀瑰彉鏃惰Е鍙�
+	 * @example <u-subsection active-color="#ff9900"></u-subsection>
+	 */
+	export default {
+		name: "u-subsection",
+		props: {
+			// tab鐨勬暟鎹�
+			list: {
+				type: Array,
+				default () {
+					return [];
+				}
+			},
+			// 褰撳墠娲诲姩鐨則ab鐨刬ndex
+			current: {
+				type: [Number, String],
+				default: 0
+			},
+			// 婵�娲荤殑棰滆壊
+			activeColor: {
+				type: String,
+				default: '#303133'
+			},
+			// 鏈縺娲荤殑棰滆壊
+			inactiveColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 妯″紡閫夋嫨锛宮ode=button涓烘寜閽舰寮忥紝mode=subsection鏃朵负鍒嗘妯″紡
+			mode: {
+				type: String,
+				default: 'button'
+			},
+			// 瀛椾綋澶у皬锛屽崟浣峳px
+			fontSize: {
+				type: [Number, String],
+				default: 28
+			},
+			// 鏄惁寮�鍚姩鐢绘晥鏋�
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			// 缁勪欢鐨勯珮搴︼紝鍗曚綅rpx
+			height: {
+				type: [Number, String],
+				default: 70
+			},
+			// 婵�娲籺ab鐨勫瓧浣撴槸鍚﹀姞绮�
+			bold: {
+				type: Boolean,
+				default: true
+			},
+			// mode=button鏃讹紝缁勪欢鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#eeeeef'
+			},
+			// mode = button鏃讹紝婊戝潡鑳屾櫙棰滆壊
+			buttonColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// 鍦ㄥ垏鎹㈠垎娈靛櫒鐨勬椂鍊欙紝鏄惁璁╄澶囬渿涓�涓�
+			vibrateShort: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				listInfo: [],
+				itemBgStyle: {
+					width: 0,
+					left: 0,
+					backgroundColor: '#ffffff',
+					height: '100%',
+					transition: ''
+				},
+				currentIndex: this.current,
+				buttonPadding: 3, // mode = button 鏃讹紝缁勪欢鐨勫唴杈硅窛
+				borderRadius: 5, // 鍦嗚鍊�
+				firstTimeVibrateShort: true // 缁勪欢鍒濆鍖栨椂锛屼細瑙﹀彂current鍙樺寲锛屾鏃朵笉搴旈渿鍔�
+			};
+		},
+		watch: {
+			current: {
+				immediate: true,
+				handler(nVal) {
+					this.currentIndex = nVal;
+					this.changeSectionStatus(nVal);
+				}
+			}
+		},
+		created() {
+			// 灏唋ist鐨勬暟鎹紝浼犲叆listInfo鏁扮粍锛屽洜涓轰笉鑳戒慨鏀筽rops浼犻�掔殑list鍊�
+			// 鍙互鎺ュ彈鐩存帴鏁扮粍褰㈠紡锛屾垨鑰呮暟缁勫厓绱犱负瀵硅薄鐨勫舰寮忥紝濡傦細['绠�浠�', '璇勮'],鎴栬�匸{name: '绠�浠�'}, {name: '璇勮'}]
+			this.listInfo = this.list.map((val, index) => {
+				if (typeof val != 'object') {
+					let obj = {
+						width: 0,
+						name: val
+					};
+					return obj;
+				} else {
+					val.width = 0;
+					return val;
+				}
+			});
+		},
+		computed: {
+			// 璁剧疆mode=subsection鏃讹紝婊戝潡鐗规湁鐨勬牱寮�
+			noBorderRight() {
+				return index => {
+					if (this.mode != 'subsection') return;
+					let classs = '';
+					// 涓嶆樉绀哄彸杈圭殑杈规
+					if (index < this.list.length - 1) classs += ' u-none-border-right';
+					// 鏄剧ず鏁翠釜缁勪欢鐨勫乏鍙宠竟鍦嗚
+					if (index == 0) classs += ' u-item-first';
+					if (index == this.list.length - 1) classs += ' u-item-last';
+					return classs;
+				};
+			},
+			// 鏂囧瓧鐨勬牱寮�
+			textStyle() {
+				return index => {
+					let style = {};
+					// 璁剧疆瀛椾綋棰滆壊
+					if (this.mode == 'subsection') {
+						if (index == this.currentIndex) {
+							style.color = '#ffffff';
+						} else {
+							style.color = this.activeColor;
+						}
+					} else {
+						if (index == this.currentIndex) {
+							style.color = this.activeColor;
+						} else {
+							style.color = this.inactiveColor;
+						}
+					}
+					// 瀛椾綋鍔犵矖
+					if (index == this.currentIndex && this.bold) style.fontWeight = 'bold';
+					// 鏂囧瓧澶у皬
+					style.fontSize = this.fontSize + 'rpx';
+					return style;
+				};
+			},
+			// 姣忎釜鍒嗘鍣╥tem鐨勬牱寮�
+			itemStyle() {
+				return index => {
+					let style = {};
+					if (this.mode == 'subsection') {
+						// 璁剧疆border鐨勬牱寮�
+						style.borderColor = this.activeColor;
+						style.borderWidth = '1px';
+						style.borderStyle = 'solid';
+					}
+					return style;
+				};
+			},
+			// mode=button鏃讹紝澶栧眰view鐨勬牱寮�
+			subsectionStyle() {
+				let style = {};
+				style.height = uni.upx2px(this.height) + 'px';
+				if (this.mode == 'button') {
+					style.backgroundColor = this.bgColor;
+					style.padding = `${this.buttonPadding}px`;
+					style.borderRadius = `${this.borderRadius}px`;
+				}
+				return style;
+			},
+			// 婊戝潡鐨勬牱寮�
+			itemBarStyle() {
+				let style = {};
+				style.backgroundColor = this.activeColor;
+				style.zIndex = 1;
+				if (this.mode == 'button') {
+					style.backgroundColor = this.buttonColor;
+					style.borderRadius = `${this.borderRadius}px`;
+					style.bottom = `${this.buttonPadding}px`;
+					style.height = uni.upx2px(this.height) - this.buttonPadding * 2 + 'px';
+					style.zIndex = 0;
+				}
+				return Object.assign(this.itemBgStyle, style);
+			}
+		},
+		mounted() {
+			setTimeout(() => {
+				this.getTabsInfo();
+			}, 10);
+		},
+		methods: {
+			// 鏀瑰彉婊戝潡鐨勬牱寮�
+			changeSectionStatus(nVal) {
+				if (this.mode == 'subsection') {
+					// 鏍规嵁婊戝潡鍦ㄦ渶宸﹁竟鍜屾渶鍙宠竟鏃讹紝鏄剧ず宸﹁竟鍜屽彸杈圭殑鍦嗚
+					if (nVal == this.list.length - 1) {
+						this.itemBgStyle.borderRadius = `0 ${this.buttonPadding}px ${this.buttonPadding}px 0`;
+					}
+					if (nVal == 0) {
+						this.itemBgStyle.borderRadius = `${this.buttonPadding}px 0 0 ${this.buttonPadding}px`;
+					}
+					if (nVal > 0 && nVal < this.list.length - 1) {
+						this.itemBgStyle.borderRadius = '0';
+					}
+				}
+				// 鏇存柊婊戝潡鐨勪綅缃�
+				setTimeout(() => {
+					this.itemBgLeft();
+				}, 10);
+				if (this.vibrateShort && !this.firstTimeVibrateShort) {
+					// 浣挎墜鏈轰骇鐢熺煭淇冮渿鍔紝寰俊灏忕▼搴忔湁鏁堬紝APP(HX 2.6.8)鍜孒5鏃犳晥
+					// #ifndef H5
+					uni.vibrateShort();
+					// #endif
+				}
+				// 绗竴娆¤繃鍚庯紝璁剧疆firstTimeVibrateShort涓篺alse锛岃鍏朵笅涓�娆″彲浠ラ渿鍔�(濡傛灉鍏佽闇囧姩鐨勮瘽)
+				this.firstTimeVibrateShort = false;
+			},
+			click(index) {
+				// 涓嶅厑璁哥偣鍑诲綋鍓嶆縺娲婚�夐」
+				if (index == this.currentIndex) return;
+				this.currentIndex = index;
+				this.changeSectionStatus(index);
+				this.$emit('change', Number(index));
+			},
+			// 鑾峰彇鍚勪釜tab鐨勮妭鐐逛俊鎭�
+			getTabsInfo() {
+				let view = uni.createSelectorQuery().in(this);
+				for (let i = 0; i < this.list.length; i++) {
+					view.select('.u-item-' + i).boundingClientRect();
+				}
+				view.exec(res => {
+					if (!res.length) {
+						setTimeout(() => {
+							this.getTabsInfo();
+							return;
+						}, 10);
+					}
+					// 灏嗗垎娈靛櫒姣忎釜item鐨勫搴︼紝鏀惧叆listInfo鏁扮粍
+					res.map((val, index) => {
+						this.listInfo[index].width = val.width;
+					});
+					// 鍒濆鍖栨粦鍧楃殑瀹藉害
+					if (this.mode == 'subsection') {
+						this.itemBgStyle.width = this.listInfo[0].width + 'px';
+					} else if (this.mode == 'button') {
+						this.itemBgStyle.width = this.listInfo[0].width + 'px';
+					}
+					// 鍒濆鍖栨粦鍧楃殑浣嶇疆
+					this.itemBgLeft();
+				});
+			},
+			itemBgLeft() {
+				// 鏍规嵁鏄惁寮�鍚姩鐢绘晥鏋滐紝
+				if (this.animation) {
+					this.itemBgStyle.transition = 'all 0.35s';
+				} else {
+					this.itemBgStyle.transition = 'all 0s';
+				}
+				let left = 0;
+				// 璁$畻褰撳墠娲昏穬item鍒扮粍浠跺乏杈圭殑璺濈
+				this.listInfo.map((val, index) => {
+					if (index < this.currentIndex) left += val.width;
+				});
+				// 鏍规嵁mode涓嶅悓妯″紡锛岃绠楁粦鍧楅渶瑕佺Щ鍔ㄧ殑璺濈
+				if (this.mode == 'subsection') {
+					this.itemBgStyle.left = left + 'px';
+				} else if (this.mode == 'button') {
+					this.itemBgStyle.left = left + this.buttonPadding + 'px';
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-subsection {
+		@include vue-flex;
+		align-items: center;
+		overflow: hidden;
+		position: relative;
+	}
+
+	.u-item {
+		flex: 1;
+		text-align: center;
+		font-size: 26rpx;
+		height: 100%;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		color: $u-main-color;
+		padding: 0 6rpx;
+	}
+
+	.u-item-bg {
+		background-color: $u-type-primary;
+		position: absolute;
+		z-index: -1;
+	}
+
+	.u-none-border-right {
+		border-right: none !important;
+	}
+
+	.u-item-first {
+		border-top-left-radius: 8rpx;
+		border-bottom-left-radius: 8rpx;
+	}
+
+	.u-item-last {
+		border-top-right-radius: 8rpx;
+		border-bottom-right-radius: 8rpx;
+	}
+
+	.u-item-text {
+		transition: all 0.35s;
+		color: $u-main-color;
+		@include vue-flex;
+		align-items: center;
+		position: relative;
+		z-index: 3;
+	}
+</style>
diff --git a/uview-ui/components/u-swipe-action/u-swipe-action.vue b/uview-ui/components/u-swipe-action/u-swipe-action.vue
new file mode 100644
index 0000000..d10cf00
--- /dev/null
+++ b/uview-ui/components/u-swipe-action/u-swipe-action.vue
@@ -0,0 +1,257 @@
+<template>
+	<view class="">
+		<movable-area class="u-swipe-action" :style="{ backgroundColor: bgColor }">
+			<movable-view
+				class="u-swipe-view"
+				@change="change"
+				@touchend="touchend"
+				@touchstart="touchstart"
+				direction="horizontal"
+				:disabled="disabled"
+				:x="moveX"
+				:style="{
+					width: movableViewWidth ? movableViewWidth : '100%'
+				}"
+			>
+				<view
+					class="u-swipe-content"
+					@tap.stop="contentClick"
+				>
+					<slot></slot>
+				</view>
+				<view class="u-swipe-del" v-if="showBtn" @tap.stop="btnClick(index)" :style="[btnStyle(item.style)]" v-for="(item, index) in options" :key="index">
+					<view class="u-btn-text">{{ item.text }}</view>
+				</view>
+			</movable-view>
+		</movable-area>
+	</view>
+</template>
+
+<script>
+/**
+ * swipeAction 宸︽粦鍗曞厓鏍�
+ * @description 璇ョ粍浠朵竴鑸敤浜庡乏婊戝敜鍑烘搷浣滆彍鍗曠殑鍦烘櫙锛岀敤鐨勬渶澶氱殑鏄乏婊戝垹闄ゆ搷浣溿��
+ * @tutorial https://www.uviewui.com/components/swipeAction.html
+ * @property {String} bg-color 鏁翠釜缁勪欢鑳屾櫙棰滆壊锛堥粯璁�#ffffff锛�
+ * @property {Array} options 鏁扮粍褰㈠紡锛屽彲浠ラ厤缃儗鏅鑹插拰鏂囧瓧
+ * @property {String Number} index 鏍囪瘑绗︼紝鐐瑰嚮鏃跺�欑敤浜庡尯鍒嗙偣鍑讳簡鍝竴涓紝鐢╲-for寰幆鏃剁殑index鍗冲彲
+ * @property {String Number} btn-width 鎸夐挳瀹藉害锛屽崟浣峳px锛堥粯璁�180锛�
+ * @property {Boolean} disabled 鏄惁绂佹鏌愪釜swipeAction婊戝姩锛堥粯璁alse锛�
+ * @property {Boolean} show 鎵撳紑鎴栬�呭叧闂煇涓粍浠讹紙榛樿false锛�
+ * @event {Function} click 鐐瑰嚮缁勪欢鏃惰Е鍙�
+ * @event {Function} close 缁勪欢瑙﹀彂鍏抽棴鐘舵�佹椂
+ * @event {Function} content-click 鐐瑰嚮鍐呭鏃惰Е鍙�
+ * @event {Function} open 缁勪欢瑙﹀彂鎵撳紑鐘舵�佹椂
+ * @example <u-swipe-action btn-text="鏀惰棌">...</u-swipe-action>
+ */
+export default {
+	name: 'u-swipe-action',
+	props: {
+		// index鍊硷紝鐢ㄤ簬寰楃煡鐐瑰嚮鍒犻櫎鐨勬槸鍝釜鎸夐挳
+		index: {
+			type: [Number, String],
+			default: ''
+		},
+		// 婊戝姩鎸夐挳鐨勫搴︼紝鍗曚綅涓簉px
+		btnWidth: {
+			type: [String, Number],
+			default: 180
+		},
+		// 鏄惁绂佹鏌愪釜action婊戝姩
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 鎵撳紑鎴栬�呭叧闂粍浠�
+		show: {
+			type: Boolean,
+			default: false
+		},
+		// 缁勪欢鑳屾櫙棰滆壊
+		bgColor: {
+			type: String,
+			default: '#ffffff'
+		},
+		// 鏄惁浣挎墜鏈哄彂鐢熺煭淇冮渿鍔紝鐩墠鍙湪iOS鐨勫井淇″皬绋嬪簭鏈夋晥(2020-05-06)
+		vibrateShort: {
+			type: Boolean,
+			default: false
+		},
+		// 鎸夐挳鎿嶄綔鍙傛暟
+		options: {
+			type: Array,
+			default() {
+				return [];
+			}
+		}
+	},
+	watch: {
+		show: {
+			immediate: true,
+			handler(nVal, oVal) {
+				if (nVal) {
+					this.open();
+				} else {
+					this.close();
+				}
+			}
+		}
+	},
+	data() {
+		return {
+			moveX: 0, // movable-view鍏冪礌鍦▁杞翠笂闇�瑕佺Щ鍔ㄧ殑鐩爣绉诲姩璺濈锛岀敤浜庡睍寮�鎴栨敹璧锋粦鍔ㄧ殑鎸夐挳
+			scrollX: 0, // movable-view绉诲姩杩囩▼涓骇鐢熺殑change浜嬩欢涓殑x杞寸Щ鍔ㄥ��
+			status: false, // 婊戝姩鐨勭姸鎬侊紝琛ㄧず褰撳墠鏄睍寮�杩樻槸鍏抽棴鎸夐挳鐨勭姸鎬�
+			movableAreaWidth: 0, // 婊戝姩鍖哄煙
+			elId: this.$u.guid(), // id锛岀敤浜庨�氱煡鍙﹀缁勪欢鍏抽棴鏃剁殑璇嗗埆
+			showBtn: false, // 鍒氬紑濮嬫覆鏌撹鍥炬椂涓嶆樉绀哄彸杈圭殑鎸夐挳锛岄伩鍏嶈鍥鹃棯鍔�
+		};
+	},
+	computed: {
+		movableViewWidth() {
+			return this.movableAreaWidth + this.allBtnWidth + 'px';
+		},
+		innerBtnWidth() {
+			return uni.upx2px(this.btnWidth);
+		},
+		allBtnWidth() {
+			return uni.upx2px(this.btnWidth) * this.options.length;
+		},
+		btnStyle() {
+			return style => {
+				let css = {};
+				style.width = this.btnWidth + 'rpx';
+				return style;
+			};
+		}
+	},
+	mounted() {
+		setTimeout(() => {
+			this.getActionRect();
+		}, 50);
+	},
+	methods: {
+		// 鐐瑰嚮鎸夐挳
+		btnClick(index) {
+			this.status = false;
+			// this.index涓虹偣鍑荤殑鍑犱釜缁勪欢锛宨ndex涓虹偣鍑绘煇涓粍浠剁殑绗嚑涓寜閽�(options鏁扮粍鐨勭储寮�)
+			this.$emit('click', this.index, index);
+		},
+		// movable-view鍏冪礌绉诲姩浜嬩欢
+		change(e) {
+			this.scrollX = e.detail.x;
+		},
+		// 鍏抽棴鎸夐挳鐘舵��
+		close() {
+			this.moveX = 0;
+			this.status = false;
+		},
+		// 鎵撳紑鎸夐挳鐨勭姸鎬�
+		open() {
+			if (this.disabled) return;
+			this.moveX = -this.allBtnWidth;
+			this.status = true;
+		},
+		// 鐢ㄦ埛鎵嬫寚绂诲紑movable-view鍏冪礌锛屽仠姝㈣Е鎽�
+		touchend() {
+			this.moveX = this.scrollX;
+			// 鍋滄瑙︽懜鏃跺�欙紝鍒ゆ柇褰撳墠鏄睍寮�杩樻槸鍏抽棴鐘舵��
+			// 鍏抽棴鐘舵��
+			// 杩欎竴姝ュ緢閲嶈锛岄渶瑕佸厛缁檛his.moveX涓�涓彉鍖栫殑闅忔満鍊硷紝鍚﹀垯鍥犱负鍓嶅悗璁剧疆鐨勪负鍚屼竴涓��
+			// props鍗曞悜鏁版嵁娴佺殑鍘熷洜锛屽鑷磎ovable-view鍏冪礌涓嶄細鍙戠敓鍙樺寲锛屽垏璁帮紝璇﹁鏂囨。锛�
+			// https://uniapp.dcloud.io/use?id=%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98
+			this.$nextTick(function() {
+				if (this.status == false) {
+					// 鍏抽棴鐘舵�佸乏婊戯紝浜х敓鐨剎杞翠綅绉讳负璐熷�硷紝涔熷氨鏄婊戝姩鐨勮窛绂诲ぇ浜庢寜閽殑鍥涘垎涔嬩竴瀹藉害锛岃嚜鍔ㄥ睍寮�鎸夐挳
+					if (this.scrollX <= -this.allBtnWidth / 4) {
+						this.moveX = -this.allBtnWidth; // 鎸夐挳瀹藉害鐨勮礋鍊硷紝鍗充负灞曞紑鐘舵�乵ovable-view鍏冪礌宸︽粦鐨勮窛绂�
+						this.status = true; // 鏍囧織褰撳墠涓哄睍寮�鐘舵��
+						this.emitOpenEvent();
+						// 浜х敓闇囧姩鏁堟灉
+						if (this.vibrateShort) uni.vibrateShort();
+					} else {
+						this.moveX = 0; // 濡傛灉璺濈娌℃湁鎸夐挳瀹藉害鐨勫洓鍒嗕箣涓�锛岃嚜鍔ㄦ敹璧�
+						this.status = false;
+						this.emitCloseEvent();
+					}
+				} else {
+					// 濡傛灉鍦ㄦ墦寮�鐨勭姸鎬佷笅锛屽彸婊戝姩鐨勮窛绂籜杞村亸绉昏秴杩囨寜閽殑鍥涘垎涔嬩竴(璐熷�煎弽杩囨潵鐨勫洓鍒嗕箣涓�)锛岃嚜鍔ㄦ敹璧锋寜閽�
+					if (this.scrollX > (-this.allBtnWidth * 3) / 4) {
+						this.moveX = 0;
+						this.$nextTick(() => {
+							this.moveX = 101;
+						});
+						this.status = false;
+						this.emitCloseEvent();
+					} else {
+						this.moveX = -this.allBtnWidth;
+						this.status = true;
+						this.emitOpenEvent();
+					}
+				}
+			});
+		},
+		emitOpenEvent() {
+			this.$emit('open', this.index);
+		},
+		emitCloseEvent() {
+			this.$emit('close', this.index);
+		},
+		// 寮�濮嬭Е鎽�
+		touchstart() {},
+		getActionRect() {
+			this.$uGetRect('.u-swipe-action').then(res => {
+				this.movableAreaWidth = res.width;
+				// 绛夎鍥炬洿鏂板畬鍚庯紝鍐嶆樉绀哄彸杈圭殑鍙粦鍔ㄦ寜閽紝闃叉杩欎簺鎸夐挳浼�"闂竴涓�"
+				this.$nextTick(() => {
+					this.showBtn = true;
+				})
+			});
+		},
+		// 鐐瑰嚮鍐呭瑙﹀彂浜嬩欢
+		contentClick() {
+			// 鐐瑰嚮鍐呭鏃讹紝濡傛灉褰撳墠涓烘墦寮�鐘舵�侊紝鏀惰捣缁勪欢
+			if (this.status == true) {
+				this.status = 'close';
+				this.moveX = 0;
+			}
+			this.$emit('content-click', this.index);
+		}
+	}
+};
+</script>
+
+<style scoped lang="scss">
+@import "../../libs/css/style.components.scss";
+	
+.u-swipe-action {
+	width: auto;
+	height: initial;
+	position: relative;
+	overflow: hidden;
+}
+
+.u-swipe-view {
+	@include vue-flex;
+	height: initial;
+	position: relative;
+	/* 杩欎竴鍙ュ緢鍏抽敭锛岃鐩栭粯璁ょ殑缁濆瀹氫綅 */
+}
+
+.u-swipe-content {
+	flex: 1;
+}
+
+.u-swipe-del {
+	position: relative;
+	font-size: 30rpx;
+	color: #ffffff;
+}
+
+.u-btn-text {
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+}
+</style>
diff --git a/uview-ui/components/u-swiper/u-swiper.vue b/uview-ui/components/u-swiper/u-swiper.vue
new file mode 100644
index 0000000..b6e7e81
--- /dev/null
+++ b/uview-ui/components/u-swiper/u-swiper.vue
@@ -0,0 +1,340 @@
+<template>
+	<view class="u-swiper-wrap" :style="{
+		borderRadius: `${borderRadius}rpx`
+	}">
+		<swiper :current="elCurrent" @change="change" @animationfinish="animationfinish" :interval="interval" :circular="circular" :duration="duration" :autoplay="autoplay"
+		 :previous-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'" :next-margin="effect3d ? effect3dPreviousMargin + 'rpx' : '0'"
+		 :style="{
+				height: height + 'rpx',
+				backgroundColor: bgColor
+			}">
+			<swiper-item class="u-swiper-item" v-for="(item, index) in list" :key="index">
+				<view class="u-list-image-wrap" @tap.stop.prevent="listClick(index)" :class="[uCurrent != index ? 'u-list-scale' : '']" :style="{
+						borderRadius: `${borderRadius}rpx`,
+						transform: effect3d && uCurrent != index ? 'scaleY(0.9)' : 'scaleY(1)',
+						margin: effect3d && uCurrent != index ? '0 20rpx' : 0,
+					}">
+					<image class="u-swiper-image" :src="item[name] || item" :mode="imgMode"></image>
+					<view v-if="title && item.title" class="u-swiper-title u-line-1" :style="[{
+							'padding-bottom': titlePaddingBottom
+						}, titleStyle]">
+						{{ item.title }}
+					</view>
+				</view>
+			</swiper-item>
+		</swiper>
+		<view class="u-swiper-indicator" :style="{
+				top: indicatorPos == 'topLeft' || indicatorPos == 'topCenter' || indicatorPos == 'topRight' ? '12rpx' : 'auto',
+				bottom: indicatorPos == 'bottomLeft' || indicatorPos == 'bottomCenter' || indicatorPos == 'bottomRight' ? '12rpx' : 'auto',
+				justifyContent: justifyContent,
+				padding: `0 ${effect3d ? '74rpx' : '24rpx'}`
+			}">
+			<block v-if="mode == 'rect'">
+				<view class="u-indicator-item-rect" :class="{ 'u-indicator-item-rect-active': index == uCurrent }" v-for="(item, index) in list"
+				 :key="index"></view>
+			</block>
+			<block v-if="mode == 'dot'">
+				<view class="u-indicator-item-dot" :class="{ 'u-indicator-item-dot-active': index == uCurrent }" v-for="(item, index) in list"
+				 :key="index"></view>
+			</block>
+			<block v-if="mode == 'round'">
+				<view class="u-indicator-item-round" :class="{ 'u-indicator-item-round-active': index == uCurrent }" v-for="(item, index) in list"
+				 :key="index"></view>
+			</block>
+			<block v-if="mode == 'number'">
+				<view class="u-indicator-item-number">{{ uCurrent + 1 }}/{{ list.length }}</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * swiper 杞挱鍥�
+	 * @description 璇ョ粍浠朵竴鑸敤浜庡鑸疆鎾紝骞垮憡灞曠ず绛夊満鏅�,鍙紑绠卞嵆鐢�
+	 * @tutorial https://www.uviewui.com/components/swiper.html
+	 * @property {Array} list 杞挱鍥炬暟鎹紝瑙佸畼缃�"鍩烘湰浣跨敤"璇存槑
+	 * @property {Boolean} title 鏄惁鏄剧ず鏍囬鏂囧瓧锛岄渶瑕侀厤鍚坙ist鍙傛暟锛岃瀹樼綉璇存槑锛堥粯璁alse锛�
+	 * @property {String} mode 鎸囩ず鍣ㄦā寮忥紝瑙佸畼缃戣鏄庯紙榛樿round锛�
+	 * @property {String Number} height 杞挱鍥剧粍浠堕珮搴︼紝鍗曚綅rpx锛堥粯璁�250锛�
+	 * @property {String} indicator-pos 鎸囩ず鍣ㄧ殑浣嶇疆锛堥粯璁ottomCenter锛�
+	 * @property {Boolean} effect3d 鏄惁寮�鍚�3D鏁堟灉锛堥粯璁alse锛�
+	 * @property {Boolean} autoplay 鏄惁鑷姩鎾斁锛堥粯璁rue锛�
+	 * @property {String Number} interval 鑷姩杞挱鏃堕棿闂撮殧锛屽崟浣峬s锛堥粯璁�2500锛�
+	 * @property {Boolean} circular 鏄惁琛旀帴鎾斁锛岃瀹樼綉璇存槑锛堥粯璁rue锛�
+	 * @property {String} bg-color 鑳屾櫙棰滆壊锛堥粯璁�#f3f4f6锛�
+	 * @property {String Number} border-radius 杞挱鍥惧渾瑙掑�硷紝鍗曚綅rpx锛堥粯璁�8锛�
+	 * @property {Object} title-style 鑷畾涔夋爣棰樻牱寮�
+	 * @property {String Number} effect3d-previous-margin mode = true妯″紡鐨勬儏鍐典笅锛屾縺娲婚」涓庡墠鍚庨」涔嬮棿鐨勮窛绂伙紝鍗曚綅rpx锛堥粯璁�50锛�
+	 * @property {String} img-mode 鍥剧墖鐨勮鍓ā寮忥紝璇﹁image缁勪欢瑁佸壀妯″紡锛堥粯璁spectFill锛�
+	 * @event {Function} click 鐐瑰嚮杞挱鍥炬椂瑙﹀彂
+	 * @example <u-swiper :list="list" mode="dot" indicator-pos="bottomRight"></u-swiper>
+	 */
+	export default {
+		name: "u-swiper",
+		props: {
+			// 杞挱鍥剧殑鏁版嵁,鏍煎紡濡傦細[{image: 'xxxx', title: 'xxxx'}锛寋image: 'yyyy', title: 'yyyy'}]锛屽叾涓璽itle瀛楁鍙��
+			list: {
+				type: Array,
+				default () {
+					return [];
+				}
+			},
+			// 鏄惁鏄剧ずtitle鏍囬
+			title: {
+				type: Boolean,
+				default: false
+			},
+			// 鐢ㄦ埛鑷畾涔夌殑鎸囩ず鍣ㄧ殑鏍峰紡
+			indicator: {
+				type: Object,
+				default () {
+					return {};
+				}
+			},
+			// 鍦嗚鍊�
+			borderRadius: {
+				type: [Number, String],
+				default: 8
+			},
+			// 闅斿涔呰嚜鍔ㄥ垏鎹�
+			interval: {
+				type: [String, Number],
+				default: 3000
+			},
+			// 鎸囩ず鍣ㄧ殑妯″紡锛宺ect|dot|number|round
+			mode: {
+				type: String,
+				default: 'round'
+			},
+			// list鐨勯珮搴︼紝鍗曚綅rpx
+			height: {
+				type: [Number, String],
+				default: 250
+			},
+			// 鎸囩ず鍣ㄧ殑浣嶇疆锛宼opLeft|topCenter|topRight|bottomLeft|bottomCenter|bottomRight
+			indicatorPos: {
+				type: String,
+				default: 'bottomCenter'
+			},
+			// 鏄惁寮�鍚缉鏀炬晥鏋�
+			effect3d: {
+				type: Boolean,
+				default: false
+			},
+			// 3D妯″紡鐨勬儏鍐典笅锛屾縺娲籭tem涓庡墠鍚巌tem涔嬮棿鐨勮窛绂伙紝鍗曚綅rpx
+			effect3dPreviousMargin: {
+				type: [Number, String],
+				default: 50
+			},
+			// 鏄惁鑷姩鎾斁
+			autoplay: {
+				type: Boolean,
+				default: true
+			},
+			// 鑷姩杞挱鏃堕棿闂撮殧锛屽崟浣峬s
+			duration: {
+				type: [Number, String],
+				default: 500
+			},
+			// 鏄惁琛旀帴婊戝姩锛屽嵆鍒版渶鍚庝竴寮犳椂鎺ョ潃婊戝姩锛屾槸鍚﹁嚜鍔ㄥ垏鎹㈠埌绗竴寮�
+			circular: {
+				type: Boolean,
+				default: true
+			},
+			// 鍥剧墖鐨勮鍓ā寮� 
+			imgMode: {
+				type: String,
+				default: 'aspectFill'
+			},
+			// 浠巐ist鏁扮粍涓鍙栫殑鍥剧墖鐨勫睘鎬у悕
+			name: {
+				type: String,
+				default: 'image'
+			},
+			// 鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#f3f4f6'
+			},
+			// 鍒濆鍖栨椂锛岄粯璁ゆ樉绀虹鍑犻」
+			current: {
+				type: [Number, String],
+				default: 0
+			},
+			// 鏍囬鐨勬牱寮忥紝瀵硅薄褰㈠紡
+			titleStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			}
+		},
+		watch: {
+			// 濡傛灉澶栭儴鐨刲ist鍙戠敓鍙樺寲锛屽垽鏂暱搴︽槸鍚﹁淇敼锛屽鏋滃墠鍚庨暱搴︿笉涓�鑷达紝閲嶇疆uCurrent鍊硷紝閬垮厤婧㈠嚭
+			list(nVal, oVal) {
+				if(nVal.length !== oVal.length) this.uCurrent = 0;
+			},
+			// 鐩戝惉澶栭儴current鐨勫彉鍖栵紝瀹炴椂淇敼鍐呴儴渚濊禆浜庢娴媢Current鍊硷紝濡傛灉鏇存柊浜哻urrent锛岃�屼笉鏄洿鏂皍Current锛�
+			// 灏变細閿欎贡锛屽洜涓烘寚绀哄櫒鏄緷璧栦簬uCurrent鐨�
+			current(n) {
+				this.uCurrent = n;
+			}
+		},
+		data() {
+			return {
+				uCurrent: this.current // 褰撳墠娲昏穬鐨剆wiper-item鐨刬ndex
+			};
+		},
+		computed: {
+			justifyContent() {
+				if (this.indicatorPos == 'topLeft' || this.indicatorPos == 'bottomLeft') return 'flex-start';
+				if (this.indicatorPos == 'topCenter' || this.indicatorPos == 'bottomCenter') return 'center';
+				if (this.indicatorPos == 'topRight' || this.indicatorPos == 'bottomRight') return 'flex-end';
+			},
+			titlePaddingBottom() {
+				let tmp = 0;
+				if (this.mode == 'none') return '12rpx';
+				if (['bottomLeft', 'bottomCenter', 'bottomRight'].indexOf(this.indicatorPos) >= 0 && this.mode == 'number') {
+					tmp = '60rpx';
+				} else if (['bottomLeft', 'bottomCenter', 'bottomRight'].indexOf(this.indicatorPos) >= 0 && this.mode != 'number') {
+					tmp = '40rpx';
+				} else {
+					tmp = '12rpx';
+				}
+				return tmp;
+			},
+			// 鍥犱负uni鐨剆wiper缁勪欢鐨刢urrent鍙傛暟鍙帴鍙桸umber绫诲瀷锛岃繖閲屽仛涓�涓浆鎹�
+			elCurrent() {
+				return Number(this.current);
+			}
+		},
+		methods: {
+			listClick(index) {
+				this.$emit('click', index);
+			},
+			change(e) {
+				let current = e.detail.current;
+				this.uCurrent = current;
+				// 鍙戝嚭change浜嬩欢锛岃〃绀哄綋鍓嶈嚜鍔ㄥ垏鎹㈢殑index锛屼粠0寮�濮�
+				this.$emit('change', current);
+			},
+			// 澶存潯灏忕▼搴忎笉鏀寔animationfinish浜嬩欢锛屾敼鐢眂hange浜嬩欢
+			// 鏆備笉鐩戝惉姝や簨浠讹紝鍥犱负涓嶅啀缁檚wiper缁戝畾uCurrent灞炴��
+			animationfinish(e) {
+				// #ifndef MP-TOUTIAO
+				// this.uCurrent = e.detail.current;
+				// #endif
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-swiper-wrap {
+		position: relative;
+		overflow: hidden;
+		transform: translateY(0);
+	}
+
+	.u-swiper-image {
+		width: 100%;
+		will-change: transform;
+		height: 100%;
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		/* #ifdef H5 */
+		pointer-events: none;
+		/* #endif */
+	}
+
+	.u-swiper-indicator {
+		padding: 0 24rpx;
+		position: absolute;
+		@include vue-flex;
+		width: 100%;
+		z-index: 1;
+	}
+
+	.u-indicator-item-rect {
+		width: 26rpx;
+		height: 8rpx;
+		margin: 0 6rpx;
+		transition: all 0.5s;
+		background-color: rgba(0, 0, 0, 0.3);
+	}
+
+	.u-indicator-item-rect-active {
+		background-color: rgba(255, 255, 255, 0.8);
+	}
+
+	.u-indicator-item-dot {
+		width: 14rpx;
+		height: 14rpx;
+		margin: 0 6rpx;
+		border-radius: 20rpx;
+		transition: all 0.5s;
+		background-color: rgba(0, 0, 0, 0.3);
+	}
+
+	.u-indicator-item-dot-active {
+		background-color: rgba(255, 255, 255, 0.8);
+	}
+
+	.u-indicator-item-round {
+		width: 14rpx;
+		height: 14rpx;
+		margin: 0 6rpx;
+		border-radius: 20rpx;
+		transition: all 0.5s;
+		background-color: rgba(0, 0, 0, 0.3);
+	}
+
+	.u-indicator-item-round-active {
+		width: 34rpx;
+		background-color: rgba(255, 255, 255, 0.8);
+	}
+
+	.u-indicator-item-number {
+		padding: 6rpx 16rpx;
+		line-height: 1;
+		background-color: rgba(0, 0, 0, 0.3);
+		border-radius: 100rpx;
+		font-size: 26rpx;
+		color: rgba(255, 255, 255, 0.8);
+	}
+
+	.u-list-scale {
+		transform-origin: center center;
+	}
+
+	.u-list-image-wrap {
+		width: 100%;
+		height: 100%;
+		flex: 1;
+		transition: all 0.5s;
+		overflow: hidden;
+		box-sizing: content-box;
+		position: relative;
+	}
+
+	.u-swiper-title {
+		position: absolute;
+		background-color: rgba(0, 0, 0, 0.3);
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		font-size: 28rpx;
+		padding: 12rpx 24rpx;
+		color: rgba(255, 255, 255, 0.9);
+	}
+
+	.u-swiper-item {
+		@include vue-flex;
+		overflow: hidden;
+		align-items: center;
+	}
+</style>
diff --git a/uview-ui/components/u-switch/u-switch.vue b/uview-ui/components/u-switch/u-switch.vue
new file mode 100644
index 0000000..6cb58d3
--- /dev/null
+++ b/uview-ui/components/u-switch/u-switch.vue
@@ -0,0 +1,163 @@
+<template>
+	<view class="u-switch" :class="[value == true ? 'u-switch--on' : '', disabled ? 'u-switch--disabled' : '']" @tap="onClick"
+	 :style="[switchStyle]">
+		<view class="u-switch__node node-class" :style="{
+			width: $u.addUnit(this.size),
+			height: $u.addUnit(this.size)
+		}">
+			<u-loading :show="loading" class="u-switch__loading" :size="size * 0.6" :color="loadingColor" />
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * switch 寮�鍏抽�夋嫨鍣�
+	 * @description 閫夋嫨寮�鍏充竴鑸敤浜庡彧鏈変袱涓�夋嫨锛屼笖鍙兘閫夊叾涓�鐨勫満鏅��
+	 * @tutorial https://www.uviewui.com/components/switch.html
+	 * @property {Boolean} loading 鏄惁澶勪簬鍔犺浇涓紙榛樿false锛�
+	 * @property {Boolean} disabled 鏄惁绂佺敤锛堥粯璁alse锛�
+	 * @property {String Number} size 寮�鍏冲昂瀵革紝鍗曚綅rpx锛堥粯璁�50锛�
+	 * @property {String} active-color 鎵撳紑鏃剁殑鑳屾櫙鑹诧紙榛樿#497bff锛�
+	 * @property {Boolean} inactive-color 鍏抽棴鏃剁殑鑳屾櫙鑹诧紙榛樿#ffffff锛�
+	 * @property {Boolean | Number | String} active-value 鎵撳紑閫夋嫨鍣ㄦ椂閫氳繃change浜嬩欢鍙戝嚭鐨勫�硷紙榛樿true锛�
+	 * @property {Boolean | Number | String} inactive-value 鍏抽棴閫夋嫨鍣ㄦ椂閫氳繃change浜嬩欢鍙戝嚭鐨勫�硷紙榛樿false锛�
+	 * @event {Function} change 鍦╯witch鎵撳紑鎴栧叧闂椂瑙﹀彂
+	 * @example <u-switch v-model="checked" active-color="red" inactive-color="#eee"></u-switch>
+	 */
+	export default {
+		name: "u-switch",
+		props: {
+			// 鏄惁涓哄姞杞戒腑鐘舵��
+			loading: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁涓虹鐢ㄨ濉�
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// 寮�鍏冲昂瀵革紝鍗曚綅rpx
+			size: {
+				type: [Number, String],
+				default: 50
+			},
+			// 鎵撳紑鏃剁殑鑳屾櫙棰滆壊
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鍏抽棴鏃剁殑鑳屾櫙棰滆壊
+			inactiveColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// 閫氳繃v-model鍙屽悜缁戝畾鐨勫��
+			value: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁浣挎墜鏈哄彂鐢熺煭淇冮渿鍔紝鐩墠鍙湪iOS鐨勫井淇″皬绋嬪簭鏈夋晥(2020-05-06)
+			vibrateShort: {
+				type: Boolean,
+				default: false
+			},
+			// 鎵撳紑閫夋嫨鍣ㄦ椂鐨勫��
+			activeValue: {
+				type: [Number, String, Boolean],
+				default: true
+			},
+			// 鍏抽棴閫夋嫨鍣ㄦ椂鐨勫��
+			inactiveValue: {
+				type: [Number, String, Boolean],
+				default: false
+			},
+		},
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			switchStyle() {
+				let style = {};
+				style.fontSize = this.size + 'rpx';
+				style.backgroundColor = this.value ? this.activeColor : this.inactiveColor;
+				return style;
+			},
+			loadingColor() {
+				return this.value ? this.activeColor : null;
+			}
+		},
+		methods: {
+			onClick() {
+				if (!this.disabled && !this.loading) {
+					// 浣挎墜鏈轰骇鐢熺煭淇冮渿鍔紝寰俊灏忕▼搴忔湁鏁堬紝APP(HX 2.6.8)鍜孒5鏃犳晥
+					if(this.vibrateShort) uni.vibrateShort();
+					this.$emit('input', !this.value);
+					// 鏀惧埌涓嬩竴涓敓鍛藉懆鏈燂紝鍥犱负鍙屽悜缁戝畾鐨剉alue淇敼鐖剁粍浠剁姸鎬侀渶瑕佹椂闂达紝涓旀槸寮傛鐨�
+					this.$nextTick(() => {
+						this.$emit('change', this.value ? this.activeValue : this.inactiveValue);
+					})
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-switch {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: inline-block;
+		/* #endif */
+		box-sizing: initial;
+		width: 2em;
+		height: 1em;
+		background-color: #fff;
+		border: 1px solid rgba(0, 0, 0, 0.1);
+		border-radius: 1em;
+		transition: background-color 0.3s;
+		font-size: 50rpx;
+	}
+
+	.u-switch__node {
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		border-radius: 100%;
+		z-index: 1;
+		background-color: #fff;
+		background-color: #fff;
+		box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);
+		box-shadow: 0 3px 1px 0 rgba(0, 0, 0, 0.05), 0 2px 2px 0 rgba(0, 0, 0, 0.1), 0 3px 3px 0 rgba(0, 0, 0, 0.05);
+		transition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);
+		transition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05), -webkit-transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05);
+		transition: transform cubic-bezier(0.3, 1.05, 0.4, 1.05);
+		transition: transform 0.3s cubic-bezier(0.3, 1.05, 0.4, 1.05)
+	}
+
+	.u-switch__loading {
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.u-switch--on {
+		background-color: #1989fa;
+	}
+
+	.u-switch--on .u-switch__node {
+		transform: translateX(100%);
+	}
+
+	.u-switch--disabled {
+		opacity: 0.4;
+	}
+</style>
diff --git a/uview-ui/components/u-tabbar/u-tabbar.vue b/uview-ui/components/u-tabbar/u-tabbar.vue
new file mode 100644
index 0000000..2e1b6a2
--- /dev/null
+++ b/uview-ui/components/u-tabbar/u-tabbar.vue
@@ -0,0 +1,330 @@
+<template>
+	<view v-if="show" class="u-tabbar" @touchmove.stop.prevent="() => {}">
+		<view class="u-tabbar__content safe-area-inset-bottom" :style="{
+			height: $u.addUnit(height),
+			backgroundColor: bgColor,
+		}" :class="{
+			'u-border-top': borderTop
+		}">
+			<view class="u-tabbar__content__item" v-for="(item, index) in list" :key="index" :class="{
+				'u-tabbar__content__circle': midButton &&item.midButton
+			}" @tap.stop="clickHandler(index)" :style="{
+				backgroundColor: bgColor
+			}">
+				<view :class="[
+					midButton && item.midButton ? 'u-tabbar__content__circle__button' : 'u-tabbar__content__item__button'
+				]">
+					<u-icon
+						:size="midButton && item.midButton ? midButtonSize : iconSize"
+						:name="elIconPath(index)"
+						img-mode="scaleToFill"
+						:color="elColor(index)"
+						:custom-prefix="item.customIcon ? 'custom-icon' : 'uicon'"
+					></u-icon>
+					<u-badge :count="item.count" :is-dot="item.isDot"
+						v-if="item.count || item.isDot"
+						:offset="[-2, getOffsetRight(item.count, item.isDot)]"
+					></u-badge>
+				</view>
+				<view class="u-tabbar__content__item__text" :style="{
+					color: elColor(index)
+				}">
+					<text class="u-line-1">{{item.text}}</text>
+				</view>
+			</view>
+			<view v-if="midButton" class="u-tabbar__content__circle__border" :class="{
+				'u-border': borderTop,
+			}" :style="{
+				backgroundColor: bgColor,
+				left: midButtonLeft
+			}">
+			</view>
+		</view>
+		<!-- 杩欓噷鍔犱笂涓�涓�48rpx鐨勯珮搴�,鏄负浜嗗楂樻湁鍑歌捣鎸夐挳鏃剁殑闃插闄烽珮搴�(涔熷嵆鎸夐挳鍑稿嚭鏉ラ儴鍒嗙殑楂樺害) -->
+		<view class="u-fixed-placeholder safe-area-inset-bottom" :style="{
+				height: `calc(${$u.addUnit(height)} + ${midButton ? 48 : 0}rpx)`,
+			}"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			// 鏄剧ず涓庡惁
+			show: {
+				type: Boolean,
+				default: true
+			},
+			// 閫氳繃v-model缁戝畾current鍊�
+			value: {
+				type: [String, Number],
+				default: 0
+			},
+			// 鏁翠釜tabbar鐨勮儗鏅鑹�
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// tabbar鐨勯珮搴︼紝榛樿50px锛屽崟浣嶄换鎰忥紝濡傛灉涓烘暟鍊硷紝鍒欎负rpx鍗曚綅
+			height: {
+				type: [String, Number],
+				default: '50px'
+			},
+			// 闈炲嚫璧峰浘鏍囩殑澶у皬锛屽崟浣嶄换鎰忥紝鏁板�奸粯璁px
+			iconSize: {
+				type: [String, Number],
+				default: 40
+			},
+			// 鍑歌捣鐨勫浘鏍囩殑澶у皬锛屽崟浣嶄换鎰忥紝鏁板�奸粯璁px
+			midButtonSize: {
+				type: [String, Number],
+				default: 90
+			},
+			// 婵�娲绘椂鐨勬紨绀猴紝鍖呮嫭瀛椾綋鍥炬爣锛屾彁绀烘枃瀛楃瓑鐨勬紨绀�
+			activeColor: {
+				type: String,
+				default: '#303133'
+			},
+			// 鏈縺娲绘椂鐨勯鑹�
+			inactiveColor: {
+				type: String,
+				default: '#606266'
+			},
+			// 鏄惁鏄剧ず涓儴鐨勫嚫璧锋寜閽�
+			midButton: {
+				type: Boolean,
+				default: false
+			},
+			// 閰嶇疆鍙傛暟
+			list: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			// 鍒囨崲鍓嶇殑鍥炶皟
+			beforeSwitch: {
+				type: Function,
+				default: null
+			},
+			// 鏄惁鏄剧ず椤堕儴鐨勬í绾�
+			borderTop: {
+				type: Boolean,
+				default: true
+			},
+			// 鏄惁闅愯棌鍘熺敓tabbar
+			hideTabBar: {
+				type: Boolean,
+				default: true
+			},
+		},
+		data() {
+			return {
+				// 鐢变簬瀹夊崜澶彍浜嗭紝閫氳繃css灞呬腑鍑歌捣鎸夐挳鐨勫灞傚厓绱犳湁璇樊锛屾晠閫氳繃js璁$畻灏嗗叾灞呬腑
+				midButtonLeft: '50%',
+				pageUrl: '', // 褰撳墠椤甸潰URL
+			}
+		},
+		created() {
+			// 鏄惁闅愯棌鍘熺敓tabbar
+			if(this.hideTabBar) uni.hideTabBar();
+			// 鑾峰彇寮曞叆浜唘-tabbar椤甸潰鐨勮矾鐢卞湴鍧�锛岃鍦板潃娌℃湁璺緞鍓嶉潰鐨�"/"
+			let pages = getCurrentPages();
+			// 椤甸潰鏍堜腑鐨勬渶鍚庝竴涓嵆涓洪」涓哄綋鍓嶉〉闈紝route灞炴�т负椤甸潰璺緞
+			this.pageUrl = pages[pages.length - 1].route;
+		},
+		computed: {
+			elIconPath() {
+				return (index) => {
+					// 鍘嗛亶u-tabbar鐨勬瘡涓�椤筰tem鏃讹紝鍒ゆ柇鏄惁浼犲叆浜唒agePath鍙傛暟锛屽鏋滀紶鍏ヤ簡
+					// 鍜宒ata涓殑pageUrl鍙傛暟瀵规瘮锛屽鏋滅浉绛夛紝鍗冲彲鍒ゆ柇褰撳墠鐨刬tem瀵瑰簲褰撳墠鐨則abbar椤甸潰锛岃缃珮浜浘鏍�
+					// 閲囩敤杩欎釜鏂规硶锛屽彲浠ユ棤闇�浣跨敤v-model缁戝畾鐨剉alue鍊�
+					let pagePath = this.list[index].pagePath;
+					// 濡傛灉瀹氫箟浜唒agePath灞炴�э紝鎰忓懗鐫�浣跨敤绯荤粺鑷甫tabbar鏂规锛屽惁鍒欎娇鐢ㄤ竴涓〉闈㈢敤鍑犱釜缁勪欢妯℃嫙tabbar椤甸潰鐨勬柟妗�
+					// 杩欎袱涓柟妗堝澶勭悊tabbar item鐨勬縺娲讳笌鍚︽柟寮忎笉涓�鏍�
+					if(pagePath) {
+						if(pagePath == this.pageUrl || pagePath == '/' + this.pageUrl) {
+							return this.list[index].selectedIconPath;
+						} else {
+							return this.list[index].iconPath;
+						}
+					} else {
+						// 鏅�氭柟妗堜腑锛岀储寮曠瓑浜巚-model鍊兼椂锛屽嵆涓烘縺娲婚」
+						return index == this.value ? this.list[index].selectedIconPath : this.list[index].iconPath
+					}
+				}
+			},
+			elColor() {
+				return (index) => {
+					// 鍒ゆ柇鏂规硶鍚岀悊浜巈lIconPath
+					let pagePath = this.list[index].pagePath;
+					if(pagePath) {
+						if(pagePath == this.pageUrl || pagePath == '/' + this.pageUrl) return this.activeColor;
+						else return this.inactiveColor;
+					} else {
+						return index == this.value ? this.activeColor : this.inactiveColor;
+					}
+				}
+			}
+		},
+		mounted() {
+			this.midButton && this.getMidButtonLeft();
+		},
+		methods: {
+			async clickHandler(index) {
+				if(this.beforeSwitch && typeof(this.beforeSwitch) === 'function') {
+					// 鎵ц鍥炶皟锛屽悓鏃朵紶鍏ョ储寮曞綋浣滃弬鏁�
+					// 鍦ㄥ井淇★紝鏀粯瀹濈瓑鐜(H5姝e父)锛屼細瀵艰嚧鐖剁粍浠跺畾涔夌殑customBack()鍑芥暟浣撲腑鐨則his鍙樻垚瀛愮粍浠剁殑this
+					// 閫氳繃bind()鏂规硶锛岀粦瀹氱埗缁勪欢鐨則his锛岃this.customBack()鐨則his涓虹埗缁勪欢鐨勪笂涓嬫枃
+					let beforeSwitch = this.beforeSwitch.bind(this.$u.$parent.call(this))(index);
+					// 鍒ゆ柇鏄惁杩斿洖浜唒romise
+					if (!!beforeSwitch && typeof beforeSwitch.then === 'function') {
+						await beforeSwitch.then(res => {
+							// promise杩斿洖鎴愬姛锛�
+							this.switchTab(index);
+						}).catch(err => {
+
+						})
+					} else if(beforeSwitch === true) {
+						// 濡傛灉杩斿洖true
+						this.switchTab(index);
+					}
+				} else {
+					this.switchTab(index);
+				}
+			},
+			// 鍒囨崲tab
+			switchTab(index) {
+				// 鍙戝嚭浜嬩欢鍜屼慨鏀箆-model缁戝畾鐨勫��
+				this.$emit('change', index);
+				// 濡傛灉鏈夐厤缃畃agePath灞炴�э紝浣跨敤uni.switchTab杩涜璺宠浆
+				if(this.list[index].pagePath) {
+					uni.switchTab({
+						url: this.list[index].pagePath
+					})
+				} else {
+					// 濡傛灉閰嶇疆浜唒apgePath灞炴�э紝灏嗕笉浼氬弻鍚戠粦瀹歷-model浼犲叆鐨剉alue鍊�
+					// 鍥犱负杩欎釜妯″紡涓嬶紝涓嶅啀闇�瑕乿-model缁戝畾鐨剉alue鍊间簡锛岃�屾槸閫氳繃getCurrentPages()閫傞厤
+					this.$emit('input', index);
+				}
+			},
+			// 璁$畻瑙掓爣鐨剅ight鍊�
+			getOffsetRight(count, isDot) {
+				// 鐐圭被鍨嬶紝count澶т簬9(涓や綅鏁�)锛屽垎鍒缃笉鍚岀殑right鍊硷紝閬垮厤浣嶇疆澶尋
+				if(isDot) {
+					return -20;
+				} else if(count > 9) {
+					return -40;
+				} else {
+					return -30;
+				}
+			},
+			// 鑾峰彇鍑歌捣鎸夐挳澶栧眰鍏冪礌鐨刲eft鍊硷紝璁╁叾姘村钩灞呬腑
+			getMidButtonLeft() {
+				let windowWidth = this.$u.sys().windowWidth;
+				// 鐢变簬瀹夊崜涓璫ss璁$畻left: 50%鐨勭粨鏋滀笉鍑嗙‘锛屾晠鐢╦s璁$畻
+				this.midButtonLeft = (windowWidth / 2) + 'px';
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+	.u-fixed-placeholder {
+		/* #ifndef APP-NVUE */
+		box-sizing: content-box;
+		/* #endif */
+	}
+
+	.u-tabbar {
+
+		&__content {
+			@include vue-flex;
+			align-items: center;
+			position: relative;
+			position: fixed;
+			bottom: 0;
+			left: 0;
+			width: 100%;
+			z-index: 998;
+			/* #ifndef APP-NVUE */
+			box-sizing: content-box;
+			/* #endif */
+
+			&__circle__border {
+				border-radius: 100%;
+				width: 110rpx;
+				height: 110rpx;
+				top: -48rpx;
+				position: absolute;
+				z-index: 4;
+				background-color: #ffffff;
+				// 鐢变簬瀹夊崜鐨勬棤鑳斤紝瀵艰嚧鍙湁3涓猼abbar item鏃讹紝姝ss璁$畻鏂瑰紡鏈夎宸�
+				// 鏁呬娇鐢╦s璁$畻鐨勫舰寮忔潵瀹氫綅锛屾澶勪笉娉ㄩ噴锛屾槸鍥犱负js璁$畻鏈夊欢鍚庯紝閬垮厤鍑虹幇浣嶇疆闂姩
+				left: 50%;
+				transform: translateX(-50%);
+
+				&:after {
+					border-radius: 100px;
+				}
+			}
+
+			&__item {
+				flex: 1;
+				justify-content: center;
+				height: 100%;
+				padding: 12rpx 0;
+				@include vue-flex;
+				flex-direction: column;
+				align-items: center;
+				position: relative;
+
+				&__button {
+					position: absolute;
+					top: 14rpx;
+					left: 50%;
+					transform: translateX(-50%);
+				}
+
+				&__text {
+					color: $u-content-color;
+					font-size: 26rpx;
+					line-height: 28rpx;
+					position: absolute;
+					bottom: 14rpx;
+					left: 50%;
+					transform: translateX(-50%);
+					width: 100%;
+					text-align: center;
+				}
+			}
+
+			&__circle {
+				position: relative;
+				@include vue-flex;
+				flex-direction: column;
+				justify-content: space-between;
+				z-index: 10;
+				/* #ifndef APP-NVUE */
+				height: calc(100% - 1px);
+				/* #endif */
+
+				&__button {
+					width: 90rpx;
+					height: 90rpx;
+					border-radius: 100%;
+					@include vue-flex;
+					justify-content: center;
+					align-items: center;
+					position: absolute;
+					background-color: #ffffff;
+					top: -40rpx;
+					left: 50%;
+					z-index: 6;
+					transform: translateX(-50%);
+				}
+			}
+		}
+	}
+</style>
diff --git a/uview-ui/components/u-table/u-table.vue b/uview-ui/components/u-table/u-table.vue
new file mode 100644
index 0000000..79df16f
--- /dev/null
+++ b/uview-ui/components/u-table/u-table.vue
@@ -0,0 +1,84 @@
+<template>
+	<view class="u-table" :style="[tableStyle]">
+		<slot />
+	</view>
+</template>
+
+<script>
+	/**
+	 * table 琛ㄦ牸
+	 * @description 琛ㄦ牸缁勪欢涓�鑸敤浜庡睍绀哄ぇ閲忕粨鏋勫寲鏁版嵁鐨勫満鏅�
+	 * @tutorial https://www.uviewui.com/components/table.html
+	 * @property {String} border-color 琛ㄦ牸杈规鐨勯鑹诧紙榛樿#e4e7ed锛�
+	 * @property {String} bg-color 琛ㄦ牸鐨勮儗鏅鑹诧紙榛樿#ffffff锛�
+	 * @property {String} align 鍗曞厓鏍肩殑鍐呭瀵归綈鏂瑰紡锛屼綔鐢ㄧ被浼糲ss鐨則ext-align锛堥粯璁enter锛�
+	 * @property {String} padding 鍗曞厓鏍肩殑鍐呰竟璺濓紝鍚宑ss鐨刾adding鍐欐硶锛堥粯璁�10rpx 0锛�
+	 * @property {String Number} font-size 鍗曞厓鏍煎瓧浣撳ぇ灏忥紝鍗曚綅rpx锛堥粯璁�28锛�
+	 * @property {String} color 鍗曞厓鏍煎瓧浣撻鑹诧紙榛樿#606266锛�
+	 * @property {Object} th-style th鍗曞厓鏍肩殑鏍峰紡锛屽璞″舰寮�(灏唗h鎵�闇�鍙傛暟鏀惧湪table缁勪欢锛屾槸涓轰簡閬垮厤姣忎竴涓猼h缁勪欢瑕佸啓涓�閬嶏級
+	 * @event {Function} click 鐐瑰嚮缁勪欢鏃惰Е鍙�
+	 * @event {Function} close 鐐瑰嚮鍏抽棴鎸夐挳鏃惰Е鍙�
+	 * @example <u-table></u-table>
+	 */
+	export default {
+		name: "u-table",
+		props: {
+			borderColor: {
+				type: String,
+				default: '#e4e7ed'
+			},
+			align: {
+				type: String,
+				default: 'center'
+			},
+			// td鐨勫唴杈硅窛
+			padding: {
+				type: String,
+				default: '10rpx 6rpx'
+			},
+			// 瀛椾綋澶у皬
+			fontSize: {
+				type: [String, Number],
+				default: 28
+			},
+			// 瀛椾綋棰滆壊
+			color: {
+				type: String,
+				default: '#606266'
+			},
+			// th鐨勮嚜瀹氫箟鏍峰紡
+			thStyle: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			// table鐨勮儗鏅鑹�
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			}
+		},
+		data() {
+			return {}
+		},
+		computed: {
+			tableStyle() {
+				let style = {};
+				style.borderLeft = `solid 1px ${this.borderColor}`;
+				style.borderTop = `solid 1px ${this.borderColor}`;
+				style.backgroundColor = this.bgColor;;
+				return style;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-table {
+		width: 100%;
+		box-sizing: border-box;
+	}
+</style>
diff --git a/uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue b/uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue
new file mode 100644
index 0000000..6b88a85
--- /dev/null
+++ b/uview-ui/components/u-tabs-swiper/u-tabs-swiper.vue
@@ -0,0 +1,488 @@
+<template>
+	<view class="u-tabs" :style="{
+			zIndex: zIndex,
+			background: bgColor
+		}">
+		<scroll-view scroll-x class="u-scroll-view" :scroll-left="scrollLeft" scroll-with-animation :style="{ zIndex: zIndex + 1 }">
+			<view class="u-tabs-scroll-box" :class="{'u-tabs-scorll-flex': !isScroll}">
+				<view class="u-tabs-item" :style="[tabItemStyle(index)]"
+				 v-for="(item, index) in getTabs" :key="index" :class="[preId + index]" @tap="emit(index)">
+					<u-badge :count="item[count] || item['count'] || 0" :offset="offset" size="mini"></u-badge>
+					{{ item[name] || item['name']}}
+				</view>
+				<view v-if="showBar" class="u-scroll-bar" :style="[tabBarStyle]"></view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	import colorGradient from '../../libs/function/colorGradient';
+	let color = colorGradient;
+	const { windowWidth } = uni.getSystemInfoSync();
+	const preId = 'UEl_';
+
+	/**
+	 * tabsSwiper 鍏ㄥ睆閫夐」鍗�
+	 * @description 璇ョ粍浠跺唴閮ㄥ疄鐜颁富瑕佷緷鎵樹簬uniapp鐨剆croll-view鍜宻wiper缁勪欢锛屼富瑕佺壒鑹叉槸鍒囨崲杩囩▼涓紝tabsSwiper鏂囧瓧鐨勯鑹插彲浠ユ笎鍙橈紝搴曢儴婊戝潡鍙互 璺熼殢寮忔粦鍔紝娲诲姩tab婊氬姩灞呬腑绛夈�傚簲鐢ㄥ満鏅彲浠ョ敤浜庨渶瑕佸乏鍙冲垏鎹㈤〉闈紝姣斿鍟嗗煄鐨勮鍗曚腑蹇�(寰呮敹璐�-寰呬粯娆�-寰呰瘎浠�-宸查��璐�)绛夊簲鐢ㄥ満鏅��
+	 * @tutorial https://www.uviewui.com/components/tabsSwiper.html
+	 * @property {Boolean} is-scroll tabs鏄惁鍙互宸﹀彸鎷栧姩锛堥粯璁rue锛�
+	 * @property {Array} list 鏍囩鏁扮粍锛屽厓绱犱负瀵硅薄锛屽[{name: '鎺ㄨ崘'}]
+	 * @property {String Number} current 鎸囧畾鍝釜tab涓烘縺娲荤姸鎬侊紙榛樿0锛�
+	 * @property {String Number} height 瀵艰埅鏍忕殑楂樺害锛屽崟浣峳px锛堥粯璁�80锛�
+	 * @property {String Number} font-size tab鏂囧瓧澶у皬锛屽崟浣峳px锛堥粯璁�30锛�
+	 * @property {String Number} swiper-width tabs缁勪欢澶栭儴swiper鐨勫搴︼紝榛樿涓哄睆骞曞搴︼紝鍗曚綅rpx锛堥粯璁�750锛�
+	 * @property {String} active-color 婊戝潡鍜屾縺娲籺ab鏂囧瓧鐨勯鑹诧紙榛樿#497bff锛�
+	 * @property {String} inactive-color tabs鏂囧瓧棰滆壊锛堥粯璁�#303133锛�
+	 * @property {String Number} bar-width 婊戝潡瀹藉害锛屽崟浣峳px锛堥粯璁�40锛�
+	 * @property {String Number} bar-height 婊戝潡楂樺害锛屽崟浣峳px锛堥粯璁�6锛�
+	 * @property {Object} bar-style 搴曢儴婊戝潡鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} active-item-style 娲诲姩tabs item鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Boolean} show-bar 鏄惁鏄剧ず搴曢儴鐨勬粦鍧楋紙榛樿true锛�
+	 * @property {String Number} gutter 鍗曚釜tab鏍囩鐨勫乏鍙冲唴杈硅窛涔嬪拰锛屽崟浣峳px锛堥粯璁�40锛�
+	 * @property {String} bg-color tabs瀵艰埅鏍忕殑鑳屾櫙棰滆壊锛堥粯璁�#ffffff锛�
+	 * @property {String} name 缁勪欢鍐呴儴璇诲彇鐨刲ist鍙傛暟涓殑灞炴�у悕锛岃瀹樼綉璇存槑锛堥粯璁ame锛�
+	 * @property {String} count 缁勪欢鍐呴儴璇诲彇鐨刲ist鍙傛暟涓殑灞炴�у悕锛坆adge寰芥爣鏁帮級锛屽悓name灞炴�х殑浣跨敤锛岃瀹樼綉璇存槑锛堥粯璁ount锛�
+	 * @property {Array} offset 璁剧疆badge寰芥爣鏁扮殑浣嶇疆鍋忕Щ锛屾牸寮忎负 [x, y]锛屼篃鍗宠缃殑涓簍op鍜宺ight鐨勫�硷紝鍗曚綅rpx锛堥粯璁5, 20]锛�
+	 * @property {Boolean} bold 婵�娲婚�夐」鐨勫瓧浣撴槸鍚﹀姞绮楋紙榛樿true锛�
+	 * @event {Function} change 鐐瑰嚮鏍囩鏃惰Е鍙�
+	 * @example <u-tabs-swiper ref="tabs" :list="list" :is-scroll="false"></u-tabs-swiper>
+	 */
+	export default {
+		name: "u-tabs-swiper",
+		props: {
+			// 瀵艰埅鑿滃崟鏄惁闇�瑕佹粴鍔紝濡傚彧鏈�2鎴栬��3涓殑鏃跺�欙紝灏变笉闇�瑕佹粴鍔ㄤ簡锛屾鏃朵娇鐢╢lex骞冲垎tab鐨勫搴�
+			isScroll: {
+				type: Boolean,
+				default: true
+			},
+			//闇�寰幆鐨勬爣绛惧垪琛�
+			list: {
+				type: Array,
+				default () {
+					return [];
+				}
+			},
+			// 褰撳墠娲诲姩tab鐨勭储寮�
+			current: {
+				type: [Number, String],
+				default: 0
+			},
+			// 瀵艰埅鏍忕殑楂樺害鍜岃楂橈紝鍗曚綅rpx
+			height: {
+				type: [Number, String],
+				default: 80
+			},
+			// 瀛椾綋澶у皬锛屽崟浣峳px
+			fontSize: {
+				type: [Number, String],
+				default: 30
+			},
+			// 杩囨浮鍔ㄧ敾鏃堕暱, 鍗曚綅s
+			// duration: {
+			// 	type: [Number, String],
+			// 	default: 0.5
+			// },
+			swiperWidth: {
+				//line3鐢熸晥, 澶栭儴swiper鐨勫搴�, 鍗曚綅rpx
+				type: [String, Number],
+				default: 750
+			},
+			// 閫変腑椤圭殑涓婚棰滆壊
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鏈�変腑椤圭殑棰滆壊
+			inactiveColor: {
+				type: String,
+				default: '#303133'
+			},
+			// 鑿滃崟搴曢儴绉诲姩鐨刡ar鐨勫搴︼紝鍗曚綅rpx
+			barWidth: {
+				type: [Number, String],
+				default: 40
+			},
+			// 绉诲姩bar鐨勯珮搴�
+			barHeight: {
+				type: [Number, String],
+				default: 6
+			},
+			// 鍗曚釜tab鐨勫乏鎴栧彸鍐呰竟璺濓紙鍚勫崰涓�鍗婏級锛屽崟浣峳px
+			gutter: {
+				type: [Number, String],
+				default: 40
+			},
+			// 濡傛灉鏄粷瀵瑰畾浣嶏紝娣诲姞z-index鍊�
+			zIndex: {
+				type: [Number, String],
+				default: 1
+			},
+			// 瀵艰埅鏍忕殑鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			//婊氬姩鑷充腑蹇冪洰鏍囩被鍨�
+			autoCenterMode: {
+				type: String,
+				default: 'window'
+			},
+			// 璇诲彇浼犲叆鐨勬暟缁勫璞$殑灞炴��(tab鍚嶇О)
+			name: {
+				type: String,
+				default: 'name'
+			},
+			// 璇诲彇浼犲叆鐨勬暟缁勫璞$殑灞炴��(寰芥爣鏁�)
+			count: {
+				type: String,
+				default: 'count'
+			},
+			// 寰芥爣鏁颁綅缃亸绉�
+			offset: {
+				type: Array,
+				default: () => {
+					return [5, 20]
+				}
+			},
+			// 娲诲姩tab瀛椾綋鏄惁鍔犵矖
+			bold: {
+				type: Boolean,
+				default: true
+			},
+			// 褰撳墠娲诲姩tab item鐨勬牱寮�
+			activeItemStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			},
+			// 鏄惁鏄剧ず搴曢儴鐨勬粦鍧�
+			showBar: {
+				type: Boolean,
+				default: true
+			},
+			// 搴曢儴婊戝潡鐨勮嚜瀹氫箟鏍峰紡
+			barStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			}
+		},
+		data() {
+			return {
+				scrollLeft: 0, // 婊氬姩scroll-view鐨勫乏杈规粴鍔ㄨ窛绂�
+				tabQueryInfo: [], // 瀛樻斁瀵箃ab鑿滃崟鏌ヨ鍚庣殑鑺傜偣淇℃伅
+				windowWidth: 0, // 灞忓箷瀹藉害锛屽崟浣嶄负px
+				//scrollBarLeft: 0, // 绉诲姩bar闇�瑕侀�氳繃translateX()绉诲姩鐨勮窛绂�
+				animationFinishCurrent: this.current,
+				componentsWidth: 0,
+				line3AddDx: 0,
+				line3Dx: 0,
+				preId,
+				sW: 0,
+				tabsInfo: [],
+				colorGradientArr: [],
+				colorStep: 100 // 涓や釜棰滆壊涔嬮棿鐨勬笎鍙樼瓑鍒�
+			};
+		},
+		computed: {
+			// 鑾峰彇褰撳墠娲昏穬鐨刢urrent鍊�
+			getCurrent() {
+				const current = Number(this.current);
+				// 鍒ゆ柇鏄惁瓒呭嚭杈圭晫
+				if (current > this.getTabs.length - 1) {
+					return this.getTabs.length - 1;
+				}
+				if (current < 0) return 0;
+				return current;
+			},
+			getTabs() {
+				return this.list;
+			},
+			// 婊戝潡闇�瑕佺Щ鍔ㄧ殑璺濈
+			scrollBarLeft() {
+				return Number(this.line3Dx) + Number(this.line3AddDx);
+			},
+			// 婊戝潡鐨勫搴﹁浆涓簆x鍗曚綅
+			barWidthPx() {
+				return uni.upx2px(this.barWidth);
+			},
+			// tab鐨勬牱寮�
+			tabItemStyle() {
+				return (index) => {
+					let style = {
+						height: this.height + 'rpx',
+						lineHeight: this.height + 'rpx',
+						padding: `0 ${this.gutter / 2}rpx`,
+						color: this.tabsInfo.length > 0 ? (this.tabsInfo[index] ? this.tabsInfo[index].color : this.activeColor) : this.inactiveColor,
+						fontSize: this.fontSize + 'rpx',
+						zIndex: this.zIndex + 2,
+						fontWeight: (index == this.getCurrent && this.bold) ? 'bold' : 'normal'
+					};
+					if(index == this.getCurrent) {
+						// 缁欓�変腑鐨則ab item娣诲姞澶栭儴鑷畾涔夌殑鏍峰紡
+						style = Object.assign(style, this.activeItemStyle);
+					}
+					return style;
+				}
+			},
+			// 搴曢儴婊戝潡鐨勬牱寮�
+			tabBarStyle() {
+				let style = {
+					width: this.barWidthPx + 'px',
+					height: this.barHeight + 'rpx',
+					borderRadius: '100px',
+					backgroundColor: this.activeColor,
+					left: this.scrollBarLeft + 'px'
+				};
+				return Object.assign(style, this.barStyle);
+			}
+		},
+		watch: {
+			current(n, o) {
+				this.change(n);
+				this.setFinishCurrent(n);
+			},
+			list() {
+				this.$nextTick(() => {
+					this.init();
+				})
+			}
+		},
+		mounted() {
+			this.init();
+		},
+		methods: {
+			async init() {
+				this.countPx();
+				await this.getTabsInfo();
+				this.countLine3Dx();
+				this.getQuery(() => {
+					this.setScrollViewToCenter();
+				});
+				// 棰滆壊娓愬彉杩囩▼鏁扮粍
+				this.colorGradientArr = color.colorGradient(this.inactiveColor, this.activeColor, this.colorStep);
+			},
+			// 鑾峰彇鍚勪釜tab鐨勮妭鐐逛俊鎭�
+			getTabsInfo() {
+				return new Promise((resolve, reject) => {
+					let view = uni.createSelectorQuery().in(this);
+					for (let i = 0; i < this.list.length; i++) {
+						view.select('.' + preId + i).boundingClientRect();
+					}
+					view.exec(res => {
+						const arr = [];
+						for (let i = 0; i < res.length; i++) {
+							// 缁欐瘡涓猼ab娣诲姞鍏舵枃瀛楅鑹插睘鎬�
+							res[i].color = this.inactiveColor;
+							// 褰撳墠tab鐩存帴璧嬩簣activeColor
+							if (i == this.getCurrent) res[i].color = this.activeColor;
+							arr.push(res[i]);
+						}
+						this.tabsInfo = arr;
+						resolve();
+					});
+				})
+			},
+			// 褰搒wiper婊戝姩缁撴潫锛岃绠楁粦鍧楁渶缁堣鍋滅暀鐨勪綅缃�
+			countLine3Dx() {
+				const tab = this.tabsInfo[this.animationFinishCurrent];
+				// 璁╂粦鍧椾腑蹇冪偣鍜屽綋鍓峵ab涓績閲嶅悎
+				if (tab) this.line3Dx = tab.left + tab.width / 2 - this.barWidthPx / 2 - this.tabsInfo[0].left;
+			},
+			countPx() {
+				// swiper瀹藉害鐢眗px杞负px鍗曚綅锛屽洜涓篸x绛夛紝閮芥槸px鍗曚綅
+				this.sW = uni.upx2px(Number(this.swiperWidth));
+			},
+			emit(index) {
+				this.$emit('change', index);
+			},
+			change() {
+				this.setScrollViewToCenter();
+			},
+			getQuery(cb) {
+				try {
+					let view = uni.createSelectorQuery().in(this).select('.u-tabs');
+					view.fields({
+							size: true
+						},
+						data => {
+							if (data) {
+								this.componentsWidth = data.width;
+								if (cb && typeof cb === 'function') cb(data);
+							} else {
+								this.getQuery(cb);
+							}
+						}
+					).exec();
+				} catch (e) {
+					this.componentsWidth = windowWidth;
+				}
+			},
+			// 鎶婃椿鍔╰ab绉诲姩鍒板睆骞曚腑蹇冪偣
+			setScrollViewToCenter() {
+				let tab;
+				tab = this.tabsInfo[this.animationFinishCurrent];
+				if (tab) {
+					let tabCenter = tab.left + tab.width / 2;
+					let fatherWidth;
+					// 娲诲姩tab绉诲姩鍒颁腑蹇冩椂锛屼互灞忓箷杩樻槸tab缁勪欢涓哄搴︿负鍩哄噯
+					if (this.autoCenterMode === 'window') {
+						fatherWidth = windowWidth;
+					} else {
+						fatherWidth = this.componentsWidth;
+					}
+					this.scrollLeft = tabCenter - fatherWidth / 2;
+				}
+			},
+			setDx(dx) {
+				let nextTabIndex = dx > 0 ? this.animationFinishCurrent + 1 : this.animationFinishCurrent - 1;
+				// 鍒ゆ柇绱㈠紩鏄惁瓒呭嚭杈圭晫
+				nextTabIndex = nextTabIndex <= 0 ? 0 : nextTabIndex;
+				nextTabIndex = nextTabIndex >= this.list.length ? this.list.length - 1 : nextTabIndex;
+				const tab = this.tabsInfo[nextTabIndex];
+				// 褰撳墠tab涓績鐐箈杞村潗鏍�
+				let nowTab = this.tabsInfo[this.animationFinishCurrent];
+				let nowTabX = nowTab.left + nowTab.width / 2;
+				// 涓嬩竴涓猼ab
+				let nextTab = this.tabsInfo[nextTabIndex];
+				let nextTabX = nextTab.left + nextTab.width / 2;
+				// 涓や釜tab涔嬮棿鐨勮窛绂伙紝鍥犱负涓嬩竴涓猼ab鍙兘鍦ㄥ綋鍓峵ab鐨勫乏杈规垨鑰呭彸杈癸紝鍙栫粷瀵瑰�煎嵆鍙�
+				let distanceX = Math.abs(nextTabX - nowTabX);
+				this.line3AddDx = (dx / this.sW) * distanceX;
+				this.setTabColor(this.animationFinishCurrent, nextTabIndex, dx);
+			},
+			// 璁剧疆tab鐨勯鑹�
+			setTabColor(nowTabIndex, nextTabIndex, dx) {
+				let colorIndex = Math.abs(Math.ceil((dx / this.sW) * 100));
+				let colorLength = this.colorGradientArr.length;
+				// 澶勭悊瓒呭嚭绱㈠紩杈圭晫鐨勬儏鍐�
+				colorIndex = colorIndex >= colorLength ? colorLength - 1 : colorIndex <= 0 ? 0 : colorIndex;
+				// 璁剧疆涓嬩竴涓猼ab鐨勯鑹�
+				this.tabsInfo[nextTabIndex].color = this.colorGradientArr[colorIndex];
+				// 璁剧疆褰撳墠tab鐨勯鑹�
+				this.tabsInfo[nowTabIndex].color = this.colorGradientArr[colorLength - 1 - colorIndex];
+			},
+			// swiper缁撴潫婊戝姩
+			setFinishCurrent(current) {
+				// 濡傛灉婊戝姩鐨勭储寮曚笉涓�鑷达紝淇敼tab棰滆壊鍙樺寲锛屽洜涓哄彲鑳戒細鏈夌洿鎺ョ偣鍑籺ab鐨勬儏鍐�
+				this.tabsInfo.map((val, index) => {
+					if (current == index) val.color = this.activeColor;
+					else val.color = this.inactiveColor;
+					return val;
+				});
+				this.line3AddDx = 0;
+				this.animationFinishCurrent = current;
+				this.countLine3Dx();
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	@import "../../libs/css/style.components.scss";
+
+	view,
+	scroll-view {
+		box-sizing: border-box;
+	}
+
+	.u-tabs {
+		width: 100%;
+		transition-property: background-color, color;
+	}
+
+	/* #ifndef APP-NVUE */
+	::-webkit-scrollbar,
+	::-webkit-scrollbar,
+	::-webkit-scrollbar {
+		display: none;
+		width: 0 !important;
+		height: 0 !important;
+		-webkit-appearance: none;
+		background: transparent;
+	}
+	/* #endif */
+
+	/* #ifdef H5 */
+	// 閫氳繃鏍峰紡绌块�忥紝闅愯棌H5涓嬶紝scroll-view涓嬬殑婊氬姩鏉�
+	scroll-view ::v-deep ::-webkit-scrollbar {
+		display: none;
+		width: 0 !important;
+		height: 0 !important;
+		-webkit-appearance: none;
+		background: transparent;
+	}
+
+	/* #endif */
+
+	.u-scroll-view {
+		width: 100%;
+		white-space: nowrap;
+		position: relative;
+	}
+
+	.u-tabs-scroll-box {
+		position: relative;
+	}
+
+	.u-tabs-scorll-flex {
+		@include vue-flex;
+		justify-content: space-between;
+	}
+
+	.u-tabs-scorll-flex .u-tabs-item {
+		flex: 1;
+	}
+
+	.u-tabs-item {
+		position: relative;
+		display: inline-block;
+		text-align: center;
+		transition-property: background-color, color, font-weight;
+	}
+
+	.content {
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.boxStyle {
+		pointer-events: none;
+		position: absolute;
+		transition-property: all;
+	}
+
+	.boxStyle2 {
+		pointer-events: none;
+		position: absolute;
+		bottom: 0;
+		transition-property: all;
+		transform: translateY(-100%);
+	}
+
+	.itemBackgroundBox {
+		pointer-events: none;
+		position: absolute;
+		top: 0;
+		transition-property: left, background-color;
+		@include vue-flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.itemBackground {
+		height: 100%;
+		width: 100%;
+		transition-property: all;
+	}
+
+	.u-scroll-bar {
+		position: absolute;
+		bottom: 4rpx;
+	}
+</style>
diff --git a/uview-ui/components/u-tabs/u-tabs.vue b/uview-ui/components/u-tabs/u-tabs.vue
new file mode 100644
index 0000000..8762e98
--- /dev/null
+++ b/uview-ui/components/u-tabs/u-tabs.vue
@@ -0,0 +1,369 @@
+<template>
+	<view class="u-tabs" :style="{
+		background: bgColor
+	}">
+		<!-- $u.getRect()瀵圭粍浠舵牴鑺傜偣鏃犳晥锛屽洜涓哄啓浜�.in(this)锛屾晠杩欓噷鑾峰彇鍐呭眰鎺ョ偣灏哄 -->
+		<view :id="id">
+			<scroll-view scroll-x class="u-scroll-view" :scroll-left="scrollLeft" scroll-with-animation>
+				<view class="u-scroll-box" :class="{'u-tabs-scorll-flex': !isScroll}">
+					<view class="u-tab-item u-line-1" :id="'u-tab-item-' + index" v-for="(item, index) in list" :key="index" @tap="clickTab(index)"
+					 :style="[tabItemStyle(index)]">
+						<u-badge :count="item[count] || item['count'] || 0" :offset="offset" size="mini"></u-badge>
+						{{ item[name] || item['name']}}
+					</view>
+					<view v-if="showBar" class="u-tab-bar" :style="[tabBarStyle]"></view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * tabs 鏍囩
+	 * @description 璇ョ粍浠讹紝鏄竴涓猼abs鏍囩缁勪欢锛屽湪鏍囩澶氱殑鏃跺�欙紝鍙互閰嶇疆涓哄乏鍙虫粦鍔紝鏍囩灏戠殑鏃跺�欙紝鍙互绂佹婊戝姩銆� 璇ョ粍浠剁殑涓�涓壒鐐规槸閰嶇疆涓烘粴鍔ㄦā寮忔椂锛屾縺娲荤殑tab浼氳嚜鍔ㄧЩ鍔ㄥ埌缁勪欢鐨勪腑闂翠綅缃��
+	 * @tutorial https://www.uviewui.com/components/tabs.html
+	 * @property {Boolean} is-scroll tabs鏄惁鍙互宸﹀彸鎷栧姩锛堥粯璁rue锛�
+	 * @property {Array} list 鏍囩鏁扮粍锛屽厓绱犱负瀵硅薄锛屽[{name: '鎺ㄨ崘'}]
+	 * @property {String Number} current 鎸囧畾鍝釜tab涓烘縺娲荤姸鎬侊紙榛樿0锛�
+	 * @property {String Number} height 瀵艰埅鏍忕殑楂樺害锛屽崟浣峳px锛堥粯璁�80锛�
+	 * @property {String Number} font-size tab鏂囧瓧澶у皬锛屽崟浣峳px锛堥粯璁�30锛�
+	 * @property {String Number} duration 婊戝潡绉诲姩涓�娆℃墍闇�鐨勬椂闂达紝鍗曚綅绉掞紙榛樿0.5锛�
+	 * @property {String} active-color 婊戝潡鍜屾縺娲籺ab鏂囧瓧鐨勯鑹诧紙榛樿#497bff锛�
+	 * @property {String} inactive-color tabs鏂囧瓧棰滆壊锛堥粯璁�#303133锛�
+	 * @property {String Number} bar-width 婊戝潡瀹藉害锛屽崟浣峳px锛堥粯璁�40锛�
+	 * @property {Object} active-item-style 娲诲姩tabs item鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Object} bar-style 搴曢儴婊戝潡鐨勬牱寮忥紝瀵硅薄褰㈠紡
+	 * @property {Boolean} show-bar 鏄惁鏄剧ず搴曢儴鐨勬粦鍧楋紙榛樿true锛�
+	 * @property {String Number} bar-height 婊戝潡楂樺害锛屽崟浣峳px锛堥粯璁�6锛�
+	 * @property {String Number} item-width 鏍囩鐨勫搴︼紙榛樿auto锛�
+	 * @property {String Number} gutter 鍗曚釜tab鏍囩鐨勫乏鍙冲唴杈硅窛涔嬪拰锛屽崟浣峳px锛堥粯璁�40锛�
+	 * @property {String} bg-color tabs瀵艰埅鏍忕殑鑳屾櫙棰滆壊锛堥粯璁�#ffffff锛�
+	 * @property {String} name 缁勪欢鍐呴儴璇诲彇鐨刲ist鍙傛暟涓殑灞炴�у悕锛坱ab鍚嶇О锛夛紝瑙佸畼缃戣鏄庯紙榛樿name锛�
+	 * @property {String} count 缁勪欢鍐呴儴璇诲彇鐨刲ist鍙傛暟涓殑灞炴�у悕锛坆adge寰芥爣鏁帮級锛屽悓name灞炴�х殑浣跨敤锛岃瀹樼綉璇存槑锛堥粯璁ount锛�
+	 * @property {Array} offset 璁剧疆badge寰芥爣鏁扮殑浣嶇疆鍋忕Щ锛屾牸寮忎负 [x, y]锛屼篃鍗宠缃殑涓簍op鍜宺ight鐨勫�硷紝鍗曚綅rpx锛堥粯璁5, 20]锛�
+	 * @property {Boolean} bold 婵�娲婚�夐」鐨勫瓧浣撴槸鍚﹀姞绮楋紙榛樿true锛�
+	 * @event {Function} change 鐐瑰嚮鏍囩鏃惰Е鍙�
+	 * @example <u-tabs ref="tabs" :list="list" :is-scroll="false"></u-tabs>
+	 */
+	export default {
+		name: "u-tabs",
+		props: {
+			// 瀵艰埅鑿滃崟鏄惁闇�瑕佹粴鍔紝濡傚彧鏈�2鎴栬��3涓殑鏃跺�欙紝灏变笉闇�瑕佹粴鍔ㄤ簡锛屾鏃朵娇鐢╢lex骞冲垎tab鐨勫搴�
+			isScroll: {
+				type: Boolean,
+				default: true
+			},
+			//闇�寰幆鐨勬爣绛惧垪琛�
+			list: {
+				type: Array,
+				default () {
+					return [];
+				}
+			},
+			// 褰撳墠娲诲姩tab鐨勭储寮�
+			current: {
+				type: [Number, String],
+				default: 0
+			},
+			// 瀵艰埅鏍忕殑楂樺害鍜岃楂�
+			height: {
+				type: [String, Number],
+				default: 80
+			},
+			// 瀛椾綋澶у皬
+			fontSize: {
+				type: [String, Number],
+				default: 30
+			},
+			// 杩囨浮鍔ㄧ敾鏃堕暱, 鍗曚綅ms
+			duration: {
+				type: [String, Number],
+				default: 0.5
+			},
+			// 閫変腑椤圭殑涓婚棰滆壊
+			activeColor: {
+				type: String,
+				default: '#497bff'
+			},
+			// 鏈�変腑椤圭殑棰滆壊
+			inactiveColor: {
+				type: String,
+				default: '#303133'
+			},
+			// 鑿滃崟搴曢儴绉诲姩鐨刡ar鐨勫搴︼紝鍗曚綅rpx
+			barWidth: {
+				type: [String, Number],
+				default: 40
+			},
+			// 绉诲姩bar鐨勯珮搴�
+			barHeight: {
+				type: [String, Number],
+				default: 6
+			},
+			// 鍗曚釜tab鐨勫乏鎴栨湁鍐呰竟璺濓紙宸﹀彸鐩稿悓锛�
+			gutter: {
+				type: [String, Number],
+				default: 30
+			},
+			// 瀵艰埅鏍忕殑鑳屾櫙棰滆壊
+			bgColor: {
+				type: String,
+				default: '#ffffff'
+			},
+			// 璇诲彇浼犲叆鐨勬暟缁勫璞$殑灞炴��(tab鍚嶇О)
+			name: {
+				type: String,
+				default: 'name'
+			},
+			// 璇诲彇浼犲叆鐨勬暟缁勫璞$殑灞炴��(寰芥爣鏁�)
+			count: {
+				type: String,
+				default: 'count'
+			},
+			// 寰芥爣鏁颁綅缃亸绉�
+			offset: {
+				type: Array,
+				default: () => {
+					return [5, 20]
+				}
+			},
+			// 娲诲姩tab瀛椾綋鏄惁鍔犵矖
+			bold: {
+				type: Boolean,
+				default: true
+			},
+			// 褰撳墠娲诲姩tab item鐨勬牱寮�
+			activeItemStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			},
+			// 鏄惁鏄剧ず搴曢儴鐨勬粦鍧�
+			showBar: {
+				type: Boolean,
+				default: true
+			},
+			// 搴曢儴婊戝潡鐨勮嚜瀹氫箟鏍峰紡
+			barStyle: {
+				type: Object,
+				default() {
+					return {}
+				}
+			},
+			// 鏍囩鐨勫搴�
+			itemWidth: {
+				type: [Number, String],
+				default: 'auto'
+			}
+		},
+		data() {
+			return {
+				scrollLeft: 0, // 婊氬姩scroll-view鐨勫乏杈规粴鍔ㄨ窛绂�
+				tabQueryInfo: [], // 瀛樻斁瀵箃ab鑿滃崟鏌ヨ鍚庣殑鑺傜偣淇℃伅
+				componentWidth: 0, // 灞忓箷瀹藉害锛屽崟浣嶄负px
+				scrollBarLeft: 0, // 绉诲姩bar闇�瑕侀�氳繃translateX()绉诲姩鐨勮窛绂�
+				parentLeft: 0, // 鐖跺厓绱�(tabs缁勪欢)鍒板睆骞曞乏杈圭殑璺濈
+				id: this.$u.guid(), // id鍊�
+				currentIndex: this.current,
+				barFirstTimeMove: true, // 婊戝潡绗竴娆$Щ鍔ㄦ椂(椤甸潰鍒氱敓鎴愭椂)锛屾棤闇�鍔ㄧ敾锛屽惁鍒欑粰浜烘�紓鐨勬劅瑙�
+			};
+		},
+		watch: {
+			// 鐩戝惉tab鐨勫彉鍖栵紝閲嶆柊璁$畻tab鑿滃崟鐨勫竷灞�淇℃伅锛屽洜涓哄疄闄呬娇鐢ㄤ腑鑿滃崟鍙兘鏄�氳繃
+			// 鍚庡彴鑾峰彇鐨勶紙濡傛柊闂籥pp椤堕儴鐨勮彍鍗曪級锛岃幏鍙栬繑鍥為渶瑕佷竴瀹氭椂闂达紝鎵�浠ist鍙樺寲鏃讹紝閲嶆柊鑾峰彇甯冨眬淇℃伅
+			list(n, o) {
+				// list鍙樺姩鏃讹紝閲嶅埗鍐呴儴绱㈠紩锛屽惁鍒欏彲鑳藉鑷磋秴鍑烘暟缁勮竟鐣岀殑鎯呭喌
+				if(n.length !== o.length) this.currentIndex = 0;
+				// 鐢�$nextTick绛夊緟瑙嗗浘鏇存柊瀹屾瘯鍚庡啀璁$畻tab鐨勫眬閮ㄤ俊鎭紝鍚﹀垯鍙兘鍥犱负tab杩樻病鐢熸垚灏辫幏鍙栵紝灏变細鏈夐棶棰�
+				this.$nextTick(() => {
+					this.init();
+				});
+			},
+			current: {
+				immediate: true,
+				handler(nVal, oVal) {
+					// 瑙嗗浘鏇存柊鍚庡啀鎵ц绉诲姩鎿嶄綔
+					this.$nextTick(() => {
+						this.currentIndex = nVal;
+						this.scrollByIndex();
+					});
+				}
+			},
+		},
+		computed: {
+			// 绉诲姩bar鐨勬牱寮�
+			tabBarStyle() {
+				let style = {
+					width: this.barWidth + 'rpx',
+					transform: `translate(${this.scrollBarLeft}px, -100%)`,
+					// 婊戝潡鍦ㄩ〉闈㈡覆鏌撳悗绗竴娆℃粦鍔ㄦ椂锛屾棤闇�鍔ㄧ敾鏁堟灉
+					'transition-duration': `${this.barFirstTimeMove ? 0 : this.duration }s`,
+					'background-color': this.activeColor,
+					height: this.barHeight + 'rpx',
+					opacity: this.barFirstTimeMove ? 0 : 1,
+					// 璁剧疆涓�涓緢澶х殑鍊硷紝瀹冧細鑷姩鍙栬兘鐢ㄧ殑鏈�澶у�硷紝涓嶇敤楂樺害鐨勪竴鍗婏紝鏄洜涓洪珮搴﹀彲鑳芥槸鍗曟暟锛屼細鏈夊皬鏁板嚭鐜�
+					'border-radius': `${this.barHeight / 2}px`
+				};
+				Object.assign(style, this.barStyle);
+				return style;
+			},
+			// tab鐨勬牱寮�
+			tabItemStyle() {
+				return (index) => {
+					let style = {
+						height: this.height + 'rpx',
+						'line-height': this.height + 'rpx',
+						'font-size': this.fontSize + 'rpx',
+						'transition-duration': `${this.duration}s`,
+						padding: this.isScroll ? `0 ${this.gutter}rpx` : '',
+						flex: this.isScroll ? 'auto' : '1',
+						width: this.$u.addUnit(this.itemWidth)
+					};
+					// 瀛椾綋鍔犵矖
+					if (index == this.currentIndex && this.bold) style.fontWeight = 'bold';
+					if (index == this.currentIndex) {
+						style.color = this.activeColor;
+						// 缁欓�変腑鐨則ab item娣诲姞澶栭儴鑷畾涔夌殑鏍峰紡
+						style = Object.assign(style, this.activeItemStyle);
+					} else {
+						style.color = this.inactiveColor;
+					}
+					return style;
+				}
+			}
+		},
+		methods: {
+			// 璁剧疆涓�涓猧nit鏂规硶锛屾柟渚垮澶勮皟鐢�
+			async init() {
+				// 鑾峰彇tabs缁勪欢鐨勫昂瀵镐俊鎭�
+				let tabRect = await this.$uGetRect('#' + this.id);
+				// tabs缁勪欢璺濈灞忓箷宸﹁竟鐨勫搴�
+				this.parentLeft = tabRect.left;
+				// tabs缁勪欢鐨勫搴�
+				this.componentWidth = tabRect.width;
+				this.getTabRect();
+			},
+			// 鐐瑰嚮鏌愪竴涓猼ab鑿滃崟
+			clickTab(index) {
+				// 鐐瑰嚮褰撳墠娲诲姩tab锛屼笉瑙﹀彂浜嬩欢
+				if(index == this.currentIndex) return ;
+				// 鍙戦�佷簨浠剁粰鐖剁粍浠�
+				this.$emit('change', index);
+			},
+			// 鏌ヨtab鐨勫竷灞�淇℃伅
+			getTabRect() {
+				// 鍒涘缓鑺傜偣鏌ヨ
+				let query = uni.createSelectorQuery().in(this);
+				// 鍘嗛亶鎵�鏈塼ab锛岃繖閲屾槸鎵ц浜嗘煡璇紝鏈�缁堜娇鐢╡xec()浼氫竴娆℃�ц繑鍥炴煡璇㈢殑鏁扮粍缁撴灉
+				for (let i = 0; i < this.list.length; i++) {
+					// 鍙size鍜宺ect涓や釜鍙傛暟
+					query.select(`#u-tab-item-${i}`).fields({
+						size: true,
+						rect: true
+					});
+				}
+				// 鎵ц鏌ヨ锛屼竴娆℃�ц幏鍙栧涓粨鏋�
+				query.exec(
+					function(res) {
+						this.tabQueryInfo = res;
+						// 鍒濆鍖栨粴鍔ㄦ潯鍜岀Щ鍔╞ar鐨勪綅缃�
+						this.scrollByIndex();
+					}.bind(this)
+				);
+			},
+			// 婊氬姩scroll-view锛岃娲诲姩鐨則ab澶勪簬灞忓箷鐨勪腑闂翠綅缃�
+			scrollByIndex() {
+				// 褰撳墠娲诲姩tab鐨勫竷灞�淇℃伅锛屾湁tab鑿滃崟鐨剋idth鍜宭eft(涓哄厓绱犲乏杈圭晫鍒扮埗鍏冪礌宸﹁竟鐣岀殑璺濈)绛変俊鎭�
+				let tabInfo = this.tabQueryInfo[this.currentIndex];
+				if (!tabInfo) return;
+				// 娲诲姩tab鐨勫搴�
+				let tabWidth = tabInfo.width;
+				// 娲诲姩item鐨勫乏杈瑰埌tabs缁勪欢宸﹁竟鐨勮窛绂伙紝鐢╥tem鐨刲eft鍑忓幓tabs鐨刲eft
+				let offsetLeft = tabInfo.left - this.parentLeft;
+				// 灏嗘椿鍔ㄧ殑tabs-item绉诲姩鍒板睆骞曟涓棿锛屽疄闄呬笂鏄scroll-view鐨勭Щ鍔�
+				let scrollLeft = offsetLeft - (this.componentWidth - tabWidth) / 2;
+				this.scrollLeft = scrollLeft < 0 ? 0 : scrollLeft;
+				// 褰撳墠娲诲姩item鐨勪腑鐐圭偣鍒板乏杈圭殑璺濈鍑忓幓婊戝潡瀹藉害鐨勪竴鍗婏紝鍗冲彲寰楀埌婊戝潡鎵�闇�鐨勭Щ鍔ㄨ窛绂�
+				let left = tabInfo.left + tabInfo.width / 2 - this.parentLeft;
+				// 璁$畻褰撳墠娲昏穬item鍒扮粍浠跺乏杈圭殑璺濈
+				this.scrollBarLeft = left - uni.upx2px(this.barWidth) / 2;
+				// 绗竴娆$Щ鍔ㄦ粦鍧楃殑鏃跺�欙紝barFirstTimeMove涓簍rue锛屾斁鍒板欢鏃朵腑灏嗗叾璁剧疆false
+				// 寤舵椂鏄洜涓簊crollBarLeft浣滅敤浜巆omputed璁$畻鏃讹紝闇�瑕佷竴涓繃绋嬮渶锛屽惁鍒欏鑷村嚭閿�
+				if(this.barFirstTimeMove == true) {
+					setTimeout(() => {
+						this.barFirstTimeMove = false;
+					}, 100)
+				}
+			}
+		},
+		mounted() {
+			this.init();
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	view,
+	scroll-view {
+		box-sizing: border-box;
+	}
+
+	/* #ifndef APP-NVUE */
+	::-webkit-scrollbar,
+	::-webkit-scrollbar,
+	::-webkit-scrollbar {
+		display: none;
+		width: 0 !important;
+		height: 0 !important;
+		-webkit-appearance: none;
+		background: transparent;
+	}
+	/* #endif */
+
+	.u-scroll-box {
+		position: relative;
+		/* #ifdef MP-TOUTIAO */
+		white-space: nowrap;
+		/* #endif */
+	}
+
+	/* #ifdef H5 */
+	// 閫氳繃鏍峰紡绌块�忥紝闅愯棌H5涓嬶紝scroll-view涓嬬殑婊氬姩鏉�
+	scroll-view ::v-deep ::-webkit-scrollbar {
+		display: none;
+		width: 0 !important;
+		height: 0 !important;
+		-webkit-appearance: none;
+		background: transparent;
+	}
+	/* #endif */
+
+	.u-scroll-view {
+		width: 100%;
+		white-space: nowrap;
+		position: relative;
+	}
+
+	.u-tab-item {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: inline-block;
+		/* #endif */
+		text-align: center;
+		transition-property: background-color, color;
+	}
+
+	.u-tab-bar {
+		position: absolute;
+		bottom: 0;
+	}
+
+	.u-tabs-scorll-flex {
+		@include vue-flex;
+		justify-content: space-between;
+	}
+</style>
diff --git a/uview-ui/components/u-tag/u-tag.vue b/uview-ui/components/u-tag/u-tag.vue
new file mode 100644
index 0000000..90ec3f4
--- /dev/null
+++ b/uview-ui/components/u-tag/u-tag.vue
@@ -0,0 +1,294 @@
+<template>
+	<view v-if="show" :class="[
+		disabled ? 'u-disabled' : '',
+		'u-size-' + size,
+		'u-shape-' + shape,
+		'u-mode-' + mode + '-' + type
+	]"
+	 class="u-tag" :style="[customStyle]" @tap="clickTag">
+		{{text}}
+		<view class="u-icon-wrap" @tap.stop>
+			<u-icon @click="close" size="22" v-if="closeable" :color="closeIconColor" 
+			name="close" class="u-close-icon" :style="[iconStyle]"></u-icon>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * tag 鎻愮ず
+	 * @description 璇ョ粍浠朵竴鑸敤浜庢爣璁板拰閫夋嫨
+	 * @tutorial https://www.uviewui.com/components/tag.html
+	 * @property {String} type 涓婚绫诲瀷锛堥粯璁rimary锛�
+	 * @property {String} size 鏍囩澶у皬锛堥粯璁efault锛�
+	 * @property {String} shape 鏍囩褰㈢姸锛堥粯璁quare锛�
+	 * @property {String} text 鏍囩鐨勬枃瀛楀唴瀹�
+	 * @property {String} bg-color 鑷畾涔夋爣绛剧殑鑳屾櫙棰滆壊
+	 * @property {String} border-color 鏍囩鐨勮竟妗嗛鑹�
+	 * @property {String} close-color 鍏抽棴鎸夐挳鐨勯鑹�
+	 * @property {String Number} index 鐐瑰嚮鏍囩鏃讹紝浼氶�氳繃click浜嬩欢杩斿洖璇ュ��
+	 * @property {String} mode 妯″紡閫夋嫨锛岃瀹樼綉璇存槑锛堥粯璁ight锛�
+	 * @property {Boolean} closeable 鏄惁鍙叧闂紝璁剧疆涓簍rue锛屾枃瀛楀彸杈逛細鍑虹幇涓�涓叧闂浘鏍囷紙榛樿false锛�
+	 * @property {Boolean} show 鏍囩鏄剧ず涓庡惁锛堥粯璁rue锛�
+	 * @event {Function} click 鐐瑰嚮鏍囩瑙﹀彂
+	 * @event {Function} close closeable涓簍rue鏃讹紝鐐瑰嚮鏍囩鍏抽棴鎸夐挳瑙﹀彂
+	 * @example <u-tag text="闆湀澶�" type="success" />
+	 */
+	export default {
+		name: 'u-tag',
+		// 鏄惁绂佺敤杩欎釜鏍囩锛岀鐢ㄧ殑璇濓紝浼氬睆钄界偣鍑讳簨浠�
+		props: {
+			// 鏍囩绫诲瀷info銆乸rimary銆乻uccess銆亀arning銆乪rror
+			type: {
+				type: String,
+				default: 'primary'
+			},
+			disabled: {
+				type: [Boolean, String],
+				default: false
+			},
+			// 鏍囩鐨勫ぇ灏忥紝鍒嗕负default锛堥粯璁わ級锛宮ini锛堣緝灏忥級
+			size: {
+				type: String,
+				default: 'default'
+			},
+			// tag鐨勫舰鐘讹紝circle锛堜袱杈瑰崐鍦嗗舰锛�, square锛堟柟褰紝甯﹀渾瑙掞級锛宑ircleLeft锛堝乏杈规槸鍗婂渾锛夛紝circleRight锛堝彸杈规槸鍗婂渾锛�
+			shape: {
+				type: String,
+				default: 'square'
+			},
+			// 鏍囩鏂囧瓧
+			text: {
+				type: [String, Number],
+				default: ''
+			},
+			// 鑳屾櫙棰滆壊锛岄粯璁や负绌哄瓧绗︿覆锛屽嵆涓嶅鐞�
+			bgColor: {
+				type: String,
+				default: ''
+			},
+			// 鏍囩瀛椾綋棰滆壊锛岄粯璁や负绌哄瓧绗︿覆锛屽嵆涓嶅鐞�
+			color: {
+				type: String,
+				default: ''
+			},
+			// 闀傜┖褰㈠紡鏍囩鐨勮竟妗嗛鑹�
+			borderColor: {
+				type: String,
+				default: ''
+			},
+			// 鍏抽棴鎸夐挳鍥炬爣鐨勯鑹�
+			closeColor: {
+				type: String,
+				default: ''
+			},
+			// 鐐瑰嚮鏃惰繑鍥炵殑绱㈠紩鍊硷紝鐢ㄤ簬鍖哄垎渚嬮亶鐨勬暟缁勫摢涓厓绱犺鐐瑰嚮浜�
+			index: {
+				type: [Number, String],
+				default: ''
+			},
+			// 妯″紡閫夋嫨锛宒ark|light|plain
+			mode: {
+				type: String,
+				default: 'light'
+			},
+			// 鏄惁鍙叧闂�
+			closeable: {
+				type: Boolean,
+				default: false
+			},
+			// 鏄惁鏄剧ず
+			show: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				
+			}
+		},
+		computed: {
+			customStyle() {
+				let style = {};
+				// 鏂囧瓧棰滆壊锛堝鏋滄湁姝ゅ�硷紝浼氳鐩杢ype鍊肩殑棰滆壊锛�
+				if(this.color) style.color = this.color;
+				// tag鐨勮儗鏅鑹诧紙濡傛灉鏈夋鍊硷紝浼氳鐩杢ype鍊肩殑棰滆壊锛�
+				if(this.bgColor) style.backgroundColor = this.bgColor;
+				// 濡傛灉鏄晜绌哄瀷tag锛屾病鏈変紶閫掕竟妗嗛鑹诧紙borderColor锛夌殑璇濓紝浣跨敤鏂囧瓧鐨勯鑹诧紙color灞炴�э級
+				if(this.mode == 'plain' && this.color && !this.borderColor) style.borderColor = this.color;
+				else style.borderColor = this.borderColor;
+				return style;
+			},
+			iconStyle() {
+				if(!this.closeable) return ;
+				let style = {};
+				if(this.size == 'mini') style.fontSize = '20rpx';
+				else style.fontSize = '22rpx';
+				if(this.mode == 'plain' || this.mode == 'light') style.color = this.type;
+				else if(this.mode == 'dark')  style.color = "#ffffff";
+				if(this.closeColor) style.color = this.closeColor;
+				return style;
+			},
+			// 鍏抽棴鍥炬爣鐨勯鑹�
+			closeIconColor() {
+				// 濡傛灉瀹氫箟浜嗗叧闂浘鏍囩殑棰滆壊锛屽氨鐢ㄦ鍊硷紝鍚﹀垯鐢ㄥ瓧浣撻鑹茬殑鍊�
+				// 濡傛灉涓婇潰鐨勪簩鑰呴兘娌℃湁锛屽鏋滄槸dark娣辫壊妯″紡锛屽浘鏍囧氨涓虹櫧鑹�
+				// 鏈�鍚庡鏋滀笂闈㈢殑涓夎�呴兘涓嶅悎閫傦紝灏辫繑鍥瀟ype鍊肩粰鍥炬爣鑾峰彇棰滆壊
+				let color = '';
+				if(this.closeColor) return this.closeColor;
+				else if(this.color) return this.color;
+				else if(this.mode == 'dark') return '#ffffff';
+				else return this.type;
+			}
+		},
+		methods: {
+			// 鏍囩琚偣鍑�
+			clickTag() {
+				// 濡傛灉鏄痙isabled鐘舵�侊紝涓嶅彂閫佺偣鍑讳簨浠�
+				if(this.disabled) return ;
+				this.$emit('click', this.index);
+			},
+			// 鐐瑰嚮鏍囩鍏抽棴鎸夐挳
+			close() {
+				this.$emit('close', this.index);
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-tag {
+		box-sizing: border-box;
+		align-items: center;
+		border-radius: 6rpx;
+		/* #ifndef APP-NVUE */
+		display: inline-block;
+		/* #endif */
+		line-height: 1;
+	}
+	
+	.u-size-default {
+		font-size: 22rpx;
+		padding: 12rpx 22rpx;
+	}
+	
+	.u-size-mini {
+		font-size: 20rpx;
+		padding: 6rpx 12rpx;
+	}
+
+	.u-mode-light-primary {
+		background-color: $u-type-primary-light;
+		color: $u-type-primary;
+		border: 1px solid $u-type-primary-disabled;
+	}
+	
+	.u-mode-light-success {
+		background-color: $u-type-success-light;
+		color: $u-type-success;
+		border: 1px solid $u-type-success-disabled;
+	}
+	
+	.u-mode-light-error {
+		background-color: $u-type-error-light;
+		color: $u-type-error;
+		border: 1px solid $u-type-error-disabled;
+	}
+	
+	.u-mode-light-warning {
+		background-color: $u-type-warning-light;
+		color: $u-type-warning;
+		border: 1px solid $u-type-warning-disabled;
+	}
+	
+	.u-mode-light-info {
+		background-color: $u-type-info-light;
+		color: $u-type-info;
+		border: 1px solid $u-type-info-disabled;
+	}
+	
+	.u-mode-dark-primary {
+		background-color: $u-type-primary;
+		color: #FFFFFF;
+	}
+	
+	.u-mode-dark-success {
+		background-color: $u-type-success;
+		color: #FFFFFF;
+	}
+	
+	.u-mode-dark-error {
+		background-color: $u-type-error;
+		color: #FFFFFF;
+	}
+	
+	.u-mode-dark-warning {
+		background-color: $u-type-warning;
+		color: #FFFFFF;
+	}
+	
+	.u-mode-dark-info {
+		background-color: $u-type-info;
+		color: #FFFFFF;
+	}
+	
+	.u-mode-plain-primary {
+		background-color: #FFFFFF;
+		color: $u-type-primary;
+		border: 1px solid $u-type-primary;
+	}
+	
+	.u-mode-plain-success {
+		background-color: #FFFFFF;
+		color: $u-type-success;
+		border: 1px solid $u-type-success;
+	}
+	
+	.u-mode-plain-error {
+		background-color: #FFFFFF;
+		color: $u-type-error;
+		border: 1px solid $u-type-error;
+	}
+	
+	.u-mode-plain-warning {
+		background-color: #FFFFFF;
+		color: $u-type-warning;
+		border: 1px solid $u-type-warning;
+	}
+	
+	.u-mode-plain-info {
+		background-color: #FFFFFF;
+		color: $u-type-info;
+		border: 1px solid $u-type-info;
+	}
+	
+	.u-disabled {
+		opacity: 0.55;
+	}
+
+	.u-shape-circle {
+		border-radius: 100rpx;
+	}
+	
+	.u-shape-circleRight {
+		border-radius:  0 100rpx 100rpx 0;
+	}
+
+	.u-shape-circleLeft {
+		border-radius: 100rpx 0 0 100rpx;
+	}
+	
+	.u-close-icon {
+		margin-left: 14rpx;
+		font-size: 22rpx;
+		color: $u-type-success;
+	}
+	
+	.u-icon-wrap {
+		display: inline-flex;
+		transform: scale(0.86);
+	}
+</style>
diff --git a/uview-ui/components/u-td/u-td.vue b/uview-ui/components/u-td/u-td.vue
new file mode 100644
index 0000000..b00ad8b
--- /dev/null
+++ b/uview-ui/components/u-td/u-td.vue
@@ -0,0 +1,66 @@
+<template>
+	<view class="u-td" :style="[tdStyle]">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	/**
+	 * td td鍗曞厓鏍�
+	 * @description 琛ㄦ牸缁勪欢涓�鑸敤浜庡睍绀哄ぇ閲忕粨鏋勫寲鏁版嵁鐨勫満鏅紙鎼厤u-table浣跨敤锛�
+	 * @tutorial https://www.uviewui.com/components/table.html#td-props
+	 * @property {String Number} width 鍗曞厓鏍煎搴︾櫨鍒嗘瘮鎴栬�呭叿浣撳甫鍗曚綅鐨勫�硷紝濡�30%锛� 200rpx绛夛紝涓�鑸娇鐢ㄧ櫨鍒嗘瘮锛屽崟鍏冩牸瀹藉害榛樿涓哄潎鍒唗r鐨勯暱搴︼紙榛樿auto锛�
+	 * @example <u-td>浜屽勾绾�</u-td>
+	 */
+	export default {
+		name: "u-td",
+		props: {
+			// 瀹藉害锛岀櫨鍒嗘瘮鎴栬�呭叿浣撳甫鍗曚綅鐨勫�硷紝濡�30%锛� 200rpx绛夛紝涓�鑸娇鐢ㄧ櫨鍒嗘瘮
+			width: {
+				type: [Number, String],
+				default: 'auto'
+			}
+		},
+		data() {
+			return {
+				tdStyle: {
+					
+				}
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			this.parent = this.$u.$parent.call(this, 'u-table');
+			if (this.parent) {
+				// 灏嗙埗缁勪欢鐨勭浉鍏冲弬鏁帮紝鍚堝苟鍒版湰缁勪欢
+				let style = {};
+				if (this.width != "auto") style.flex = `0 0 ${this.width}`;
+				style.textAlign = this.parent.align;
+				style.fontSize = this.parent.fontSize + 'rpx';
+				style.padding = this.parent.padding;
+				style.borderBottom = `solid 1px ${this.parent.borderColor}`;
+				style.borderRight = `solid 1px ${this.parent.borderColor}`;
+				style.color = this.parent.color;
+				this.tdStyle = style;
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-td {
+		@include vue-flex;
+		flex-direction: column;
+		flex: 1;
+		justify-content: center;
+		font-size: 28rpx;
+		color: $u-content-color;
+		align-self: stretch;
+		box-sizing: border-box;
+		height: 100%;
+	}
+</style>
diff --git a/uview-ui/components/u-th/u-th.vue b/uview-ui/components/u-th/u-th.vue
new file mode 100644
index 0000000..9fe5a16
--- /dev/null
+++ b/uview-ui/components/u-th/u-th.vue
@@ -0,0 +1,62 @@
+<template>
+	<view class="u-th" :style="[thStyle]">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	/**
+	 * th th鍗曞厓鏍�
+	 * @description 琛ㄦ牸缁勪欢涓�鑸敤浜庡睍绀哄ぇ閲忕粨鏋勫寲鏁版嵁鐨勫満鏅紙鎼厤u-table浣跨敤锛�
+	 * @tutorial https://www.uviewui.com/components/table.html#td-props
+	 * @property {String Number} width 鏍囬鍗曞厓鏍煎搴︾櫨鍒嗘瘮鎴栬�呭叿浣撳甫鍗曚綅鐨勫�硷紝濡�30%锛�200rpx绛夛紝涓�鑸娇鐢ㄧ櫨鍒嗘瘮锛屽崟鍏冩牸瀹藉害榛樿涓哄潎鍒唗r鐨勯暱搴�
+	 * @example 鏆傛棤绀轰緥
+	 */
+	export default {
+		name: "u-th",
+		props: {
+			// 瀹藉害锛岀櫨鍒嗘瘮鎴栬�呭叿浣撳甫鍗曚綅鐨勫�硷紝濡�30%锛� 200rpx绛夛紝涓�鑸娇鐢ㄧ櫨鍒嗘瘮
+			width: {
+				type: [Number, String],
+				default: ''
+			}
+		},
+		data() {
+			return {
+				thStyle: {}
+			}
+		},
+		created() {
+			this.parent = false;
+		},
+		mounted() {
+			this.parent = this.$u.$parent.call(this, 'u-table');
+			if (this.parent) {
+				// 灏嗙埗缁勪欢鐨勭浉鍏冲弬鏁帮紝鍚堝苟鍒版湰缁勪欢
+				let style = {};
+				if (this.width) style.flex = `0 0 ${this.width}`;
+				style.textAlign = this.parent.align;
+				style.padding = this.parent.padding;
+				style.borderBottom = `solid 1px ${this.parent.borderColor}`;
+				style.borderRight = `solid 1px ${this.parent.borderColor}`;
+				Object.assign(style, this.parent.style);
+				this.thStyle = style;
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+
+	.u-th {
+		@include vue-flex;
+		flex-direction: column;
+		flex: 1;
+		justify-content: center;
+		font-size: 28rpx;
+		color: $u-main-color;
+		font-weight: bold;
+		background-color: rgb(245, 246, 248);
+	}
+</style>
diff --git a/uview-ui/components/u-time-line-item/u-time-line-item.vue b/uview-ui/components/u-time-line-item/u-time-line-item.vue
new file mode 100644
index 0000000..be86fdc
--- /dev/null
+++ b/uview-ui/components/u-time-line-item/u-time-line-item.vue
@@ -0,0 +1,83 @@
+<template>
+	<view class="u-time-axis-item">
+		<slot name="content" />
+		<view class="u-time-axis-node" :style="[nodeStyle]">
+			<slot name="node">
+				<view class="u-dot">
+				</view>
+			</slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * timeLineItem 鏃堕棿杞碔tem
+	 * @description 鏃堕棿杞寸粍浠朵竴鑸敤浜庣墿娴佷俊鎭睍绀猴紝鍚勭璺熸椂闂寸浉鍏崇殑璁板綍绛夊満鏅��(鎼厤u-time-line浣跨敤)
+	 * @tutorial https://www.uviewui.com/components/timeLine.html
+	 * @property {String} bg-color 宸﹁竟鑺傜偣鐨勮儗鏅鑹诧紝涓�鑸�氳繃slot鍐呭鑷畾涔夎儗鏅鑹插嵆鍙紙榛樿#ffffff锛�
+	 * @property {String Number} node-top 鑺傜偣宸﹁竟鍥炬爣缁濆瀹氫綅鐨則op鍊硷紝鍗曚綅rpx
+	 * @example <u-time-line-item node-top="2">...</u-time-line-item>
+	 */
+	export default {
+		name: "u-time-line-item",
+		props: {
+			// 鑺傜偣鐨勮儗鏅鑹�
+			bgColor: {
+				type: String,
+				default: "#ffffff"
+			},
+			// 鑺傜偣宸﹁竟鍥炬爣缁濆瀹氫綅鐨則op鍊�
+			nodeTop: {
+				type: [String, Number],
+				default: ""
+			}
+		},
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			nodeStyle() {
+				let style = {
+					backgroundColor: this.bgColor,
+				};
+				if (this.nodeTop != "") style.top = this.nodeTop + 'rpx';
+				return style;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-time-axis-item {
+		@include vue-flex;
+		flex-direction: column;
+		width: 100%;
+		position: relative;
+		margin-bottom: 32rpx;
+	}
+
+	.u-time-axis-node {
+		position: absolute;
+		top: 12rpx;
+		left: -40rpx;
+		transform-origin: 0;
+		transform: translateX(-50%);
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		z-index: 1;
+		font-size: 24rpx;
+	}
+
+	.u-dot {
+		height: 16rpx;
+		width: 16rpx;
+		border-radius: 100rpx;
+		background: #ddd;
+	}
+</style>
diff --git a/uview-ui/components/u-time-line/u-time-line.vue b/uview-ui/components/u-time-line/u-time-line.vue
new file mode 100644
index 0000000..f3c7587
--- /dev/null
+++ b/uview-ui/components/u-time-line/u-time-line.vue
@@ -0,0 +1,43 @@
+<template>
+	<view class="u-time-axis">
+		<slot />
+	</view>
+</template>
+
+<script>
+	/**
+	 * timeLine 鏃堕棿杞�
+	 * @description 鏃堕棿杞寸粍浠朵竴鑸敤浜庣墿娴佷俊鎭睍绀猴紝鍚勭璺熸椂闂寸浉鍏崇殑璁板綍绛夊満鏅��
+	 * @tutorial https://www.uviewui.com/components/timeLine.html
+	 * @example <u-time-line></u-time-line>
+	 */
+	export default {
+		name: "u-time-line",
+		data() {
+			return {
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-time-axis {
+		padding-left: 40rpx;
+		position: relative;
+	}
+
+	.u-time-axis::before {
+		content: " ";
+		position: absolute;
+		left: 0;
+		top: 12rpx;
+		width: 1px;
+		bottom: 0;
+		border-left: 1px solid #ddd;
+		transform-origin: 0 0;
+		transform: scaleX(0.5);
+	}
+</style>
diff --git a/uview-ui/components/u-toast/u-toast.vue b/uview-ui/components/u-toast/u-toast.vue
new file mode 100644
index 0000000..a2209a5
--- /dev/null
+++ b/uview-ui/components/u-toast/u-toast.vue
@@ -0,0 +1,220 @@
+<template>
+	<view class="u-toast" :class="[isShow ? 'u-show' : '', 'u-type-' + tmpConfig.type, 'u-position-' + tmpConfig.position]" :style="{
+		zIndex: uZIndex
+	}">
+		<view class="u-icon-wrap">
+			<u-icon v-if="tmpConfig.icon" class="u-icon" :name="iconName" :size="30" :color="tmpConfig.type"></u-icon>
+		</view>
+		<text class="u-text">{{tmpConfig.title}}</text>
+	</view>
+</template>
+
+<script>
+	/**
+	 * toast 娑堟伅鎻愮ず
+	 * @description 姝ょ粍浠惰〃鐜板舰寮忕被浼紆ni鐨剈ni.showToastAPI锛屼絾涔熸湁涓嶅悓鐨勫湴鏂广��
+	 * @tutorial https://www.uviewui.com/components/toast.html
+	 * @property {String} z-index toast灞曠ず鏃剁殑z-index鍊�
+	 * @event {Function} show 鏄剧ずtoast锛屽闇�涓�杩涘叆椤甸潰灏辨樉绀簍oast锛岃鍦╫nReady鐢熷懡鍛ㄦ湡璋冪敤
+	 * @example <u-toast ref="uToast" />
+	 */
+	export default {
+		name: "u-toast",
+		props: {
+			// z-index鍊�
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			},
+		},
+		data() {
+			return {
+				isShow: false,
+				timer: null, // 瀹氭椂鍣�
+				config: {
+					params: {}, // URL璺宠浆鐨勫弬鏁帮紝瀵硅薄
+					title: '', // 鏄剧ず鏂囨湰
+					type: '', // 涓婚绫诲瀷锛宲rimary锛宻uccess锛宔rror锛寃arning锛宐lack
+					duration: 2000, // 鏄剧ず鐨勬椂闂达紝姣
+					isTab: false, // 鏄惁璺宠浆tab椤甸潰
+					url: '', // toast娑堝け鍚庢槸鍚﹁烦杞〉闈紝鏈夊垯璺宠浆锛屼紭鍏堢骇楂樹簬back鍙傛暟
+					icon: true, // 鏄剧ず鐨勫浘鏍�
+					position: 'center', // toast鍑虹幇鐨勪綅缃�
+					callback: null, // 鎵ц瀹屽悗鐨勫洖璋冨嚱鏁�
+					back: false, // 缁撴潫toast鏄惁鑷姩杩斿洖涓婁竴椤�
+				},
+				tmpConfig: {}, // 灏嗙敤鎴烽厤缃拰鍐呯疆閰嶇疆鍚堝苟鍚庣殑涓存椂閰嶇疆鍙橀噺
+			};
+		},
+		computed: {
+			iconName() {
+				// 鍙湁涓嶄负none锛屽苟涓攖ype涓篹rror|warning|succes|info鏃跺�欙紝鎵嶆樉绀哄浘鏍�
+				if (['error', 'warning', 'success', 'info'].indexOf(this.tmpConfig.type) >= 0 && this.tmpConfig.icon) {
+					let icon = this.$u.type2icon(this.tmpConfig.type);
+					return icon;
+				}
+			},
+			uZIndex() {
+				// 鏄剧ずtoast鏃跺�欙紝濡傛灉鐢ㄦ埛鏈変紶閫抸-index鍊硷紝鏈夐檺浣跨敤
+				return this.isShow ? (this.zIndex ? this.zIndex : this.$u.zIndex.toast) : '999999';
+			}
+		},
+		methods: {
+			// 鏄剧ずtoast缁勪欢锛岀敱鐖剁粍浠堕�氳繃this.$refs.xxx.show(options)褰㈠紡璋冪敤
+			show(options) {
+				// 涓嶉檷缁撴灉鍚堝苟鍒皌his.config鍙橀噺锛岄伩鍏嶅娆℃潯鐢╱-toast锛屽墠鍚庣殑閰嶇疆閫犳垚娣疯
+				this.tmpConfig = this.$u.deepMerge(this.config, options);
+				if (this.timer) {
+					// 娓呴櫎瀹氭椂鍣�
+					clearTimeout(this.timer);
+					this.timer = null;
+				}
+				this.isShow = true;
+				this.timer = setTimeout(() => {
+					// 鍊掕鏃剁粨鏉燂紝娓呴櫎瀹氭椂鍣紝闅愯棌toast缁勪欢
+					this.isShow = false;
+					clearTimeout(this.timer);
+					this.timer = null;
+					// 鍒ゆ柇鏄惁瀛樺湪callback鏂规硶锛屽鏋滃瓨鍦ㄥ氨鎵ц
+					typeof(this.tmpConfig.callback) === 'function' && this.tmpConfig.callback();
+					this.timeEnd();
+				}, this.tmpConfig.duration);
+			},
+			// 闅愯棌toast缁勪欢锛岀敱鐖剁粍浠堕�氳繃this.$refs.xxx.hide()褰㈠紡璋冪敤
+			hide() {
+				this.isShow = false;
+				if (this.timer) {
+					// 娓呴櫎瀹氭椂鍣�
+					clearTimeout(this.timer);
+					this.timer = null;
+				}
+			},
+			// 鍊掕鏃剁粨鏉熶箣鍚庯紝杩涜鐨勪竴浜涙搷浣�
+			timeEnd() {
+				// 濡傛灉甯︽湁url鍊硷紝鏍规嵁isTab涓簍rue鎴栬�協alse杩涜璺宠浆
+				if (this.tmpConfig.url) {
+					// 濡傛灉url娌℃湁"/"寮�澶达紝娣诲姞涓婏紝鍥犱负uni鐨勮矾鐢辫烦杞渶瑕�"/"寮�澶�
+					if (this.tmpConfig.url[0] != '/') this.tmpConfig.url = '/' + this.tmpConfig.url;
+					// 鍒ゆ柇鏄惁鏈変紶閫掓樉寮忕殑鍙傛暟
+					if (Object.keys(this.tmpConfig.params).length) {
+						// 鍒ゆ柇鐢ㄦ埛浼犻�掔殑url涓紝鏄惁甯︽湁鍙傛暟
+						// 浣跨敤姝e垯鍖归厤锛屼富瑕佷緷鎹槸鍒ゆ柇鏄惁鏈�"/","?","="绛夛紝濡傗��/page/index/index?name=mary"
+						// 濡傛灉鏈塸arams鍙傛暟锛岃浆鎹㈠悗鏃犻渶甯︿笂"?"
+						let query = '';
+						if (/.*\/.*\?.*=.*/.test(this.tmpConfig.url)) {
+							// object瀵硅薄杞负get绫诲瀷鐨勫弬鏁�
+							query = this.$u.queryParams(this.tmpConfig.params, false);
+							this.tmpConfig.url = this.tmpConfig.url + "&" + query;
+						} else {
+							query = this.$u.queryParams(this.tmpConfig.params);
+							this.tmpConfig.url += query;
+						}
+					}
+					// 濡傛灉鏄烦杞瑃ab椤甸潰锛屽氨浣跨敤uni.switchTab
+					if (this.tmpConfig.isTab) {
+						uni.switchTab({
+							url: this.tmpConfig.url
+						});
+					} else {
+						uni.navigateTo({
+							url: this.tmpConfig.url
+						});
+					}
+				} else if(this.tmpConfig.back) {
+					// 鍥為��鍒颁笂涓�椤�
+					this.$u.route({
+						type: 'back'
+					})
+				}
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-toast {
+		position: fixed;
+		z-index: -1;
+		transition: opacity 0.3s;
+		text-align: center;
+		color: #fff;
+		border-radius: 8rpx;
+		background: #585858;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 28rpx;
+		opacity: 0;
+		pointer-events: none;
+		padding: 18rpx 40rpx;
+	}
+
+	.u-toast.u-show {
+		opacity: 1;
+	}
+
+	.u-icon {
+		margin-right: 10rpx;
+		@include vue-flex;
+		align-items: center;
+		line-height: normal;
+	}
+
+	.u-position-center {
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%,-50%);
+		/* #ifndef APP-NVUE */
+		max-width: 70%;
+		/* #endif */
+	}
+
+	.u-position-top {
+		left: 50%;
+		top: 20%;
+		transform: translate(-50%,-50%);
+	}
+
+	.u-position-bottom {
+		left: 50%;
+		bottom: 20%;
+		transform: translate(-50%,-50%);
+	}
+
+	.u-type-primary {
+		color: $u-type-primary;
+		background-color: $u-type-primary-light;
+		border: 1px solid rgb(215, 234, 254);
+	}
+
+	.u-type-success {
+		color: $u-type-success;
+		background-color: $u-type-success-light;
+		border: 1px solid #BEF5C8;
+	}
+
+	.u-type-error {
+		color: $u-type-error;
+		background-color: $u-type-error-light;
+		border: 1px solid #fde2e2;
+	}
+
+	.u-type-warning {
+		color: $u-type-warning;
+		background-color: $u-type-warning-light;
+		border: 1px solid #faecd8;
+	}
+
+	.u-type-info {
+		color: $u-type-info;
+		background-color: $u-type-info-light;
+		border: 1px solid #ebeef5;
+	}
+
+	.u-type-default {
+		color: #fff;
+		background-color: #585858;
+	}
+</style>
diff --git a/uview-ui/components/u-top-tips/u-top-tips.vue b/uview-ui/components/u-top-tips/u-top-tips.vue
new file mode 100644
index 0000000..98d58df
--- /dev/null
+++ b/uview-ui/components/u-top-tips/u-top-tips.vue
@@ -0,0 +1,121 @@
+<template>
+	<view class="u-tips" :class="['u-' + type, isShow ? 'u-tip-show' : '']" :style="{
+		top: navbarHeight + 'px',
+		zIndex: uZIndex
+	}">{{ title }}</view>
+</template>
+
+<script>
+	/**
+	 * topTips 椤堕儴鎻愮ず
+	 * @description 璇ョ粍浠朵竴鑸敤浜庨〉闈㈤《閮ㄥ悜涓嬫粦鍑轰竴涓彁绀猴紝灏斿悗鑷姩鏀惰捣鐨勫満鏅��
+	 * @tutorial https://www.uviewui.com/components/topTips.html
+	 * @property {String Number} navbar-height 瀵艰埅鏍忛珮搴�(鍖呭惈鐘舵�佹爮楂樺害鍦ㄥ唴)锛屽崟浣峆X
+	 * @property {String Number} z-index z-index鍊硷紙榛樿975锛�
+	 * @example <u-top-tips ref="uTips"></u-top-tips>
+	 */
+	export default {
+		name: "u-top-tips",
+		props: {
+			// 瀵艰埅鏍忛珮搴︼紝鐢ㄤ簬鎻愮ず鐨勫垵濮嬪寲
+			navbarHeight: {
+				type: [Number, String],
+				// #ifndef H5
+				default: 0,
+				// #endif
+				// #ifdef H5
+				default: 44,
+				// #endif
+			},
+			// z-index鍊�
+			zIndex: {
+				type: [Number, String],
+				default: ''
+			}
+		},
+		data() {
+			return {
+				timer: null, // 瀹氭椂鍣�
+				isShow: false, // 鏄惁鏄剧ず娑堟伅缁勪欢
+				title: '', // 缁勪欢涓樉绀虹殑娑堟伅鍐呭
+				type: 'primary', // 娑堟伅鐨勭被鍨嬶紙棰滆壊涓嶅悓锛夛紝primary锛宻uccess锛宔rror锛寃arning锛宨nfo
+				duration: 2000, // 缁勪欢鏄剧ず鐨勬椂闂达紝鍗曚綅涓烘绉�
+			};
+		},
+		computed: {
+			uZIndex() {
+				return this.zIndex ? this.zIndex : this.$u.zIndex.topTips;
+			}
+		},
+		methods: {
+			show(config = {}) {
+				// 鍏堟竻闄ゅ畾鏃跺櫒锛堝彲鑳芥槸涓婁竴娆″畾涔夌殑锛岄渶瑕佹竻闄や簡鍐嶅紑濮嬫柊鐨勶級
+				clearTimeout(this.timer);
+				// 鏃堕棿锛屽唴瀹癸紝绫诲瀷涓婚(type)绛夊弬鏁�
+				if (config.duration) this.duration = config.duration;
+				if (config.type) this.type = config.type;
+				this.title = config.title;
+				this.isShow = true;
+				// 鍊掕鏃�
+				this.timer = setTimeout(() => {
+					this.isShow = false;
+					clearTimeout(this.timer);
+					this.timer = null;
+				}, this.duration);
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	view {
+		box-sizing: border-box;
+	}
+
+	// 椤堕儴寮瑰嚭绫诲瀷鏍峰紡
+	.u-tips {
+		width: 100%;
+		position: fixed;
+		z-index: 1;
+		padding: 20rpx 30rpx;
+		color: #FFFFFF;
+		font-size: 28rpx;
+		left: 0;
+		right: 0;
+		@include vue-flex;
+		align-items: center;
+		justify-content: center;
+		opacity: 0;
+		// 姝ゅ涓烘渶鏍稿績鐐癸紝translateY(-100%)鎰忓懗鐫�灏嗗叾浠嶻杞撮殣钘忥紙闅愯棌鍒伴《閮�(h5)鎴栬�呰瀵艰埅鏍�(app)涓嬮潰锛�
+		transform: translateY(-100%);
+		transition: all 0.35s linear;
+	}
+
+	.u-tip-show {
+		transform: translateY(0);
+		opacity: 1;
+		z-index: 99;
+	}
+
+	.u-primary {
+		background: $u-type-primary;
+	}
+
+	.u-success {
+		background: $u-type-success;
+	}
+
+	.u-warning {
+		background: $u-type-warning;
+	}
+
+	.u-error {
+		background: $u-type-error;
+	}
+
+	.u-info {
+		background: $u-type-info;
+	}
+</style>
diff --git a/uview-ui/components/u-tr/u-tr.vue b/uview-ui/components/u-tr/u-tr.vue
new file mode 100644
index 0000000..06aed4a
--- /dev/null
+++ b/uview-ui/components/u-tr/u-tr.vue
@@ -0,0 +1,25 @@
+<template>
+	<view class="u-tr">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	/**
+	 * tr 琛ㄦ牸琛屾爣绛�
+	 * @description 琛ㄦ牸缁勪欢涓�鑸敤浜庡睍绀哄ぇ閲忕粨鏋勫寲鏁版嵁鐨勫満鏅紙鎼厤<u-table>浣跨敤锛�
+	 * @tutorial https://www.uviewui.com/components/table.html
+	 * @example <u-tr></u-tr>
+	 */
+	export default {
+		name: "u-tr",
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-tr {
+		@include vue-flex;
+	}
+</style>
diff --git a/uview-ui/components/u-upload/u-upload.vue b/uview-ui/components/u-upload/u-upload.vue
new file mode 100644
index 0000000..e58bb65
--- /dev/null
+++ b/uview-ui/components/u-upload/u-upload.vue
@@ -0,0 +1,660 @@
+<template>
+	<view class="u-upload" v-if="!disabled">
+		<view
+			v-if="showUploadList"
+			class="u-list-item u-preview-wrap"
+			v-for="(item, index) in lists"
+			:key="index"
+			:style="{
+				width: $u.addUnit(width),
+				height: $u.addUnit(height)
+			}"
+		>
+			<view
+				v-if="deletable"
+				class="u-delete-icon"
+				@tap.stop="deleteItem(index)"
+				:style="{
+					background: delBgColor
+				}"
+			>
+				<u-icon class="u-icon" :name="delIcon" size="20" :color="delColor"></u-icon>
+			</view>
+			<u-line-progress
+				v-if="showProgress && item.progress > 0 && !item.error"
+				:show-percent="false"
+				height="16"
+				class="u-progress"
+				:percent="item.progress"
+			></u-line-progress>
+			<view @tap.stop="retry(index)" v-if="item.error" class="u-error-btn">鐐瑰嚮閲嶈瘯</view>
+			<image @tap.stop="doPreviewImage(item.url || item.path, index)" class="u-preview-image" v-if="!item.isImage" :src="item.url || item.path" :mode="imageMode"></image>
+		</view>
+		<slot name="file" :file="lists"></slot>
+		<view style="display: inline-block;" @tap="selectFile" v-if="maxCount > lists.length">
+			<slot name="addBtn"></slot>
+			<view
+				v-if="!customBtn"
+				class="u-list-item u-add-wrap"
+				hover-class="u-add-wrap__hover"
+				hover-stay-time="150"
+				:style="{
+					width: $u.addUnit(width),
+					height: $u.addUnit(height)
+				}"
+			>
+				<u-icon name="plus" class="u-add-btn" size="40"></u-icon>
+				<view class="u-add-tips">{{ uploadText }}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+/**
+ * upload 鍥剧墖涓婁紶
+ * @description 璇ョ粍浠剁敤浜庝笂浼犲浘鐗囧満鏅�
+ * @tutorial https://www.uviewui.com/components/upload.html
+ * @property {String} action 鏈嶅姟鍣ㄤ笂浼犲湴鍧�
+ * @property {String Number} max-count 鏈�澶ч�夋嫨鍥剧墖鐨勬暟閲忥紙榛樿99锛�
+ * @property {Boolean} custom-btn 濡傛灉闇�瑕佽嚜瀹氫箟閫夋嫨鍥剧墖鐨勬寜閽紝璁剧疆涓簍rue锛堥粯璁alse锛�
+ * @property {Boolean} show-progress 鏄惁鏄剧ず杩涘害鏉★紙榛樿true锛�
+ * @property {Boolean} disabled 鏄惁鍚敤(鏄剧ず/绉讳粨)缁勪欢锛堥粯璁alse锛�
+ * @property {String} image-mode 棰勮鍥剧墖绛夋樉绀烘ā寮忥紝鍙�夊�间负uni鐨刬mage鐨刴ode灞炴�у�硷紙榛樿aspectFill锛�
+ * @property {String} del-icon 鍙充笂瑙掑垹闄ゅ浘鏍囧悕绉帮紝鍙兘涓簎View鍐呯疆鍥炬爣
+ * @property {String} del-bg-color 鍙充笂瑙掑叧闂寜閽殑鑳屾櫙棰滆壊
+ * @property {String | Number} index 鍦ㄥ悇涓洖璋冧簨浠朵腑鐨勬渶鍚庝竴涓弬鏁拌繑鍥烇紝鐢ㄤ簬鍖哄埆鏄摢涓�涓粍浠剁殑浜嬩欢
+ * @property {String} del-color 鍙充笂瑙掑叧闂寜閽浘鏍囩殑棰滆壊
+ * @property {Object} header 涓婁紶鎼哄甫鐨勫ご淇℃伅锛屽璞″舰寮�
+ * @property {Object} form-data 涓婁紶棰濆鎼哄甫鐨勫弬鏁�
+ * @property {String} name 涓婁紶鏂囦欢鐨勫瓧娈靛悕锛屼緵鍚庣鑾峰彇浣跨敤锛堥粯璁ile锛�
+ * @property {Array<String>} size-type original 鍘熷浘锛宑ompressed 鍘嬬缉鍥撅紝榛樿浜岃�呴兘鏈夛紙榛樿['original', 'compressed']锛�
+ * @property {Array<String>} source-type 閫夋嫨鍥剧墖鐨勬潵婧愶紝album-浠庣浉鍐岄�夊浘锛宑amera-浣跨敤鐩告満锛岄粯璁や簩鑰呴兘鏈夛紙榛樿['album', 'camera']锛�
+ * @property {Boolean} preview-full-image	鏄惁鍙互閫氳繃uni.previewImage棰勮宸查�夋嫨鐨勫浘鐗囷紙榛樿true锛�
+ * @property {Boolean} multiple	鏄惁寮�鍚浘鐗囧閫夛紝閮ㄥ垎瀹夊崜鏈哄瀷涓嶆敮鎸侊紙榛樿true锛�
+ * @property {Boolean} deletable 鏄惁鏄剧ず鍒犻櫎鍥剧墖鐨勬寜閽紙榛樿true锛�
+ * @property {String Number} max-size 閫夋嫨鍗曚釜鏂囦欢鐨勬渶澶уぇ灏忥紝鍗曚綅B(byte)锛岄粯璁や笉闄愬埗锛堥粯璁umber.MAX_VALUE锛�
+ * @property {Array<Object>} file-list 榛樿鏄剧ず鐨勫浘鐗囧垪琛紝鏁扮粍鍏冪礌涓哄璞★紝蹇呴』鎻愪緵url灞炴��
+ * @property {Boolean} upload-text 閫夋嫨鍥剧墖鎸夐挳鐨勬彁绀烘枃瀛楋紙榛樿鈥滈�夋嫨鍥剧墖鈥濓級
+ * @property {Boolean} auto-upload 閫夋嫨瀹屽浘鐗囨槸鍚﹁嚜鍔ㄤ笂浼狅紝瑙佷笂鏂硅鏄庯紙榛樿true锛�
+ * @property {Boolean} show-tips 鐗规畩鎯呭喌涓嬫槸鍚﹁嚜鍔ㄦ彁绀簍oast锛岃涓婃柟璇存槑锛堥粯璁rue锛�
+ * @property {Boolean} show-upload-list 鏄惁鏄剧ず缁勪欢鍐呴儴鐨勫浘鐗囬瑙堬紙榛樿true锛�
+ * @event {Function} on-oversize 鍥剧墖澶у皬瓒呭嚭鏈�澶у厑璁稿ぇ灏�
+ * @event {Function} on-preview 鍏ㄥ睆棰勮鍥剧墖鏃惰Е鍙�
+ * @event {Function} on-remove 绉婚櫎鍥剧墖鏃惰Е鍙�
+ * @event {Function} on-success 鍥剧墖涓婁紶鎴愬姛鏃惰Е鍙�
+ * @event {Function} on-change 鍥剧墖涓婁紶鍚庯紝鏃犺鎴愬姛鎴栬�呭け璐ラ兘浼氳Е鍙�
+ * @event {Function} on-error 鍥剧墖涓婁紶澶辫触鏃惰Е鍙�
+ * @event {Function} on-progress 鍥剧墖涓婁紶杩囩▼涓殑杩涘害鍙樺寲杩囩▼瑙﹀彂
+ * @event {Function} on-uploaded 鎵�鏈夊浘鐗囦笂浼犲畬姣曡Е鍙�
+ * @event {Function} on-choose-complete 姣忔閫夋嫨鍥剧墖鍚庤Е鍙戯紝鍙槸璁╁閮ㄥ彲浠ュ緱鐭ユ瘡娆¢�夋嫨鍚庯紝鍐呴儴鐨勬枃浠跺垪琛�
+ * @example <u-upload :action="action" :file-list="fileList" ></u-upload>
+ */
+export default {
+	name: 'u-upload',
+	props: {
+		//鏄惁鏄剧ず缁勪欢鑷甫鐨勫浘鐗囬瑙堝姛鑳�
+		showUploadList: {
+			type: Boolean,
+			default: true
+		},
+		// 鍚庣鍦板潃
+		action: {
+			type: String,
+			default: ''
+		},
+		// 鏈�澶т笂浼犳暟閲�
+		maxCount: {
+			type: [String, Number],
+			default: 52
+		},
+		//  鏄惁鏄剧ず杩涘害鏉�
+		showProgress: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鍚敤
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+		// 棰勮涓婁紶鐨勫浘鐗囨椂鐨勮鍓ā寮忥紝鍜宨mage缁勪欢mode灞炴�т竴鑷�
+		imageMode: {
+			type: String,
+			default: 'aspectFill'
+		},
+		// 澶撮儴淇℃伅
+		header: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 棰濆鎼哄甫鐨勫弬鏁�
+		formData: {
+			type: Object,
+			default() {
+				return {};
+			}
+		},
+		// 涓婁紶鐨勬枃浠跺瓧娈靛悕
+		name: {
+			type: String,
+			default: 'file'
+		},
+		// 鎵�閫夌殑鍥剧墖鐨勫昂瀵�, 鍙�夊�间负original compressed
+		sizeType: {
+			type: Array,
+			default() {
+				return ['original', 'compressed'];
+			}
+		},
+		sourceType: {
+			type: Array,
+			default() {
+				return ['album', 'camera'];
+			}
+		},
+		// 鏄惁鍦ㄧ偣鍑婚瑙堝浘鍚庡睍绀哄叏灞忓浘鐗囬瑙�
+		previewFullImage: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁寮�鍚浘鐗囧閫夛紝閮ㄥ垎瀹夊崜鏈哄瀷涓嶆敮鎸�
+		multiple: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁灞曠ず鍒犻櫎鎸夐挳
+		deletable: {
+			type: Boolean,
+			default: true
+		},
+		// 鏂囦欢澶у皬闄愬埗锛屽崟浣嶄负byte
+		maxSize: {
+			type: [String, Number],
+			default: Number.MAX_VALUE
+		},
+		// 鏄剧ず宸蹭笂浼犵殑鏂囦欢鍒楄〃
+		fileList: {
+			type: Array,
+			default() {
+				return [];
+			}
+		},
+		// 涓婁紶鍖哄煙鐨勬彁绀烘枃瀛�
+		uploadText: {
+			type: String,
+			default: '閫夋嫨鍥剧墖'
+		},
+		// 鏄惁鑷姩涓婁紶
+		autoUpload: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁鏄剧ずtoast娑堟伅鎻愮ず
+		showTips: {
+			type: Boolean,
+			default: true
+		},
+		// 鏄惁閫氳繃slot鑷畾涔変紶鍏ラ�夋嫨鍥炬爣鐨勬寜閽�
+		customBtn: {
+			type: Boolean,
+			default: false
+		},
+		// 鍐呴儴棰勮鍥剧墖鍖哄煙鍜岄�夋嫨鍥剧墖鎸夐挳鐨勫尯鍩熷搴�
+		width: {
+			type: [String, Number],
+			default: 200
+		},
+		// 鍐呴儴棰勮鍥剧墖鍖哄煙鍜岄�夋嫨鍥剧墖鎸夐挳鐨勫尯鍩熼珮搴�
+		height: {
+			type: [String, Number],
+			default: 200
+		},
+		// 鍙充笂瑙掑叧闂寜閽殑鑳屾櫙棰滆壊
+		delBgColor: {
+			type: String,
+			default: '#fa3534'
+		},
+		// 鍙充笂瑙掑叧闂寜閽殑鍙夊彿鍥炬爣鐨勯鑹�
+		delColor: {
+			type: String,
+			default: '#ffffff'
+		},
+		// 鍙充笂瑙掑垹闄ゅ浘鏍囧悕绉帮紝鍙兘涓簎View鍐呯疆鍥炬爣
+		delIcon: {
+			type: String,
+			default: 'close'
+		},
+		// 濡傛灉涓婁紶鍚庣殑杩斿洖鍊间负json瀛楃涓诧紝鏄惁鑷姩杞琷son
+		toJson: {
+			type: Boolean,
+			default: true
+		},
+		// 涓婁紶鍓嶇殑閽╁瓙锛屾瘡涓枃浠朵笂浼犲墠閮戒細鎵ц
+		beforeUpload: {
+			type: Function,
+			default: null
+		},
+		// 绉婚櫎鏂囦欢鍓嶇殑閽╁瓙
+		beforeRemove: {
+			type: Function,
+			default: null
+		},
+		// 鍏佽涓婁紶鐨勫浘鐗囧悗缂�
+		limitType:{
+			type: Array,
+			default() {
+				// 鏀粯瀹濆皬绋嬪簭鐪熸満閫夋嫨鍥剧墖鐨勫悗缂�涓�"image"
+				// https://opendocs.alipay.com/mini/api/media-image
+				return ['png', 'jpg', 'jpeg', 'webp', 'gif', 'image'];
+			}
+		},
+		// 鍦ㄥ悇涓洖璋冧簨浠朵腑鐨勬渶鍚庝竴涓弬鏁拌繑鍥烇紝鐢ㄤ簬鍖哄埆鏄摢涓�涓粍浠剁殑浜嬩欢
+		index: {
+			type: [Number, String],
+			default: ''
+		}
+	},
+	mounted() {},
+	data() {
+		return {
+			lists: [],
+			isInCount: true,
+			uploading: false
+		};
+	},
+	watch: {
+		fileList: {
+			immediate: true,
+			handler(val) {
+				val.map(value => {
+					// 棣栧厛妫�鏌ュ唴閮ㄦ槸鍚﹀凡缁忔坊鍔犺繃杩欏紶鍥剧墖锛屽洜涓哄閮ㄧ粦瀹氫簡涓�涓璞$粰fileList鐨勮瘽(瀵硅薄寮曠敤)锛岃繘琛屼慨鏀瑰閮╢ileList
+					// 鏃讹紝浼氳Е鍙憌atch锛屽鑷撮噸鏂版妸鍘熸潵鐨勫浘鐗囧啀娆℃坊鍔犲埌this.lists
+					// 鏁扮粍鐨剆ome鏂规硶鎰忔�濇槸锛屽彧瑕佹暟缁勫厓绱犳湁浠绘剰涓�涓厓绱犳潯浠剁鍚堬紝灏辫繑鍥瀟rue锛岃�屽彟涓�涓暟缁勭殑every鏂规硶鐨勬剰鎬濇槸鏁扮粍鎵�鏈夊厓绱犻兘绗﹀悎鏉′欢鎵嶈繑鍥瀟rue
+					let tmp = this.lists.some(val => {
+						return val.url == value.url;
+					})
+					// 濡傛灉鍐呴儴娌℃湁杩欎釜鍥剧墖(tmp涓篺alse)锛屽垯娣诲姞鍒板唴閮�
+					!tmp && this.lists.push({ url: value.url, error: false, progress: 100 });
+				});
+			}
+		},
+		// 鐩戝惉lists鐨勫彉鍖栵紝鍙戝嚭浜嬩欢
+		lists(n) {
+			this.$emit('on-list-change', n, this.index);
+		}
+	},
+	methods: {
+		// 娓呴櫎鍒楄〃
+		clear() {
+			this.lists = [];
+		},
+		// 閲嶆柊涓婁紶闃熷垪涓笂浼犲け璐ョ殑鎵�鏈夋枃浠�
+		reUpload() {
+			this.uploadFile();
+		},
+		// 閫夋嫨鍥剧墖
+		selectFile() {
+			if (this.disabled) return;
+			const { name = '', maxCount, multiple, maxSize, sizeType, lists, camera, compressed, maxDuration, sourceType } = this;
+			let chooseFile = null;
+			const newMaxCount = maxCount - lists.length;
+			// 璁剧疆涓哄彧閫夋嫨鍥剧墖鐨勬椂鍊欎娇鐢� chooseImage 鏉ュ疄鐜�
+			chooseFile = new Promise((resolve, reject) => {
+				uni.chooseImage({
+					count: multiple ? (newMaxCount > 9 ? 9 : newMaxCount) : 1,
+					sourceType: sourceType,
+					sizeType,
+					success: resolve,
+					fail: reject
+				});
+			});
+			chooseFile
+				.then(res => {
+					let file = null;
+					let listOldLength = this.lists.length;
+					res.tempFiles.map((val, index) => {
+						// 妫�鏌ユ枃浠跺悗缂�鏄惁鍏佽锛屽鏋滀笉鍦╰his.limitType鍐咃紝灏变細杩斿洖false
+						if(!this.checkFileExt(val)) return ;
+						
+						// 濡傛灉鏄潪澶氶�夛紝index澶т簬绛変簬1鎴栬�呰秴鍑烘渶澶ч檺鍒舵暟閲忔椂锛屼笉澶勭悊
+						if (!multiple && index >= 1) return;
+						if (val.size > maxSize) {
+							this.$emit('on-oversize', val, this.lists, this.index);
+							this.showToast('瓒呭嚭鍏佽鐨勬枃浠跺ぇ灏�');
+						} else {
+							if (maxCount <= lists.length) {
+								this.$emit('on-exceed', val, this.lists, this.index);
+								this.showToast('瓒呭嚭鏈�澶у厑璁哥殑鏂囦欢涓暟');
+								return;
+							}
+							lists.push({
+								url: val.path,
+								progress: 0,
+								error: false,
+								file: val
+							});
+						}
+					});
+					// 姣忔鍥剧墖閫夋嫨瀹岋紝鎶涘嚭涓�涓簨浠讹紝骞跺皢褰撳墠鍐呴儴閫夋嫨鐨勫浘鐗囨暟缁勬姏鍑哄幓
+					this.$emit('on-choose-complete', this.lists, this.index);
+					if (this.autoUpload) this.uploadFile(listOldLength);
+				})
+				.catch(error => {
+					this.$emit('on-choose-fail', error);
+				});
+		},
+		// 鎻愮ず鐢ㄦ埛娑堟伅
+		showToast(message, force = false) {
+			if (this.showTips || force) {
+				uni.showToast({
+					title: message,
+					icon: 'none'
+				});
+			}
+		},
+		// 璇ユ柟娉曚緵鐢ㄦ埛閫氳繃ref璋冪敤锛屾墜鍔ㄤ笂浼�
+		upload() {
+			this.uploadFile();
+		},
+		// 瀵瑰け璐ョ殑鍥剧墖閲嶆柊涓婁紶
+		retry(index) {
+			this.lists[index].progress = 0;
+			this.lists[index].error = false;
+			this.lists[index].response = null;
+			uni.showLoading({
+				title: '閲嶆柊涓婁紶'
+			});
+			this.uploadFile(index);
+		},
+		// 涓婁紶鍥剧墖
+		async uploadFile(index = 0) {
+			if (this.disabled) return;
+			if (this.uploading) return;
+			// 鍏ㄩ儴涓婁紶瀹屾垚
+			if (index >= this.lists.length) {
+				this.$emit('on-uploaded', this.lists, this.index);
+				return;
+			}
+			// 妫�鏌ユ槸鍚︽槸宸蹭笂浼犳垨鑰呮鍦ㄤ笂浼犱腑
+			if (this.lists[index].progress == 100) {
+				if (this.autoUpload == false) this.uploadFile(index + 1);
+				return;
+			}
+			// 鎵цbefore-upload閽╁瓙
+			if(this.beforeUpload && typeof(this.beforeUpload) === 'function') {
+				// 鎵ц鍥炶皟锛屽悓鏃朵紶鍏ョ储寮曞拰鏂囦欢鍒楄〃褰撲綔鍙傛暟
+				// 鍦ㄥ井淇★紝鏀粯瀹濈瓑鐜(H5姝e父)锛屼細瀵艰嚧鐖剁粍浠跺畾涔夌殑customBack()鍑芥暟浣撲腑鐨則his鍙樻垚瀛愮粍浠剁殑this
+				// 閫氳繃bind()鏂规硶锛岀粦瀹氱埗缁勪欢鐨則his锛岃this.customBack()鐨則his涓虹埗缁勪欢鐨勪笂涓嬫枃
+				// 鍥犱负upload缁勪欢鍙兘浼氳宓屽鍦ㄥ叾浠栫粍浠跺唴锛屾瘮濡倁-form锛岃繖鏃秚his.$parent鍏跺疄涓簎-form鐨則his锛�
+				// 闈為〉闈㈢殑this锛屾墍浠ヨ繖閲岄渶瑕佸線涓婂巻閬嶏紝涓�鐩村鎵惧埌鏈�椤剁鐨�$parent锛岃繖閲岀敤浜唗his.$u.$parent.call(this)
+				// 鏄庣櫧鎰忔�濆嵆鍙紝鏃犻渶绾犵粨this.$u.$parent.call(this)鐨勭粏鑺�
+				let beforeResponse = this.beforeUpload.bind(this.$u.$parent.call(this))(index, this.lists);
+				// 鍒ゆ柇鏄惁杩斿洖浜唒romise
+				if (!!beforeResponse && typeof beforeResponse.then === 'function') {
+					let error = false;
+					await beforeResponse.then(res => {
+						// promise杩斿洖鎴愬姛锛屼笉杩涜鍔ㄤ綔锛岀户缁笂浼�
+					}).catch(err => {
+						// 杩涘叆catch鍥炶皟鐨勮瘽锛岀户缁笅涓�寮�
+						// return this.uploadFile(index + 1);
+						// 鍦� cache 涓� return 鍙槸杩斿洖鏈柟娉曪紝骞朵笉鏄繑鍥� uploadFile 鏂规硶锛岄渶瑕佸湪澶栧眰杩涜杩斿洖 ThinkGem
+						error = true;
+					})
+					if (error){
+						return this.uploadFile(index + 1);
+					}
+				} else if(beforeResponse === false) {
+					// 濡傛灉杩斿洖false锛岀户缁笅涓�寮犲浘鐗囩殑涓婁紶
+					return this.uploadFile(index + 1);
+				} else {
+					// 姝ゅ涓鸿繑鍥�"true"鐨勬儏褰紝杩欓噷涓嶅啓浠g爜锛屽氨璺宠繃姝ゅ锛岀户缁墽琛屽綋鍓嶇殑涓婁紶閫昏緫
+				}
+			}
+			// 妫�鏌ヤ笂浼犲湴鍧�
+			if (!this.action) {
+				this.showToast('璇烽厤缃笂浼犲湴鍧�', true);
+				return;
+			}
+			this.lists[index].error = false;
+			this.uploading = true;
+			// 鍒涘缓涓婁紶瀵硅薄
+			const task = uni.uploadFile({
+				url: this.action,
+				filePath: this.lists[index].url,
+				name: this.name,
+				formData: this.formData,
+				header: this.header,
+				success: res => {
+					// 鍒ゆ柇鏄惁json瀛楃涓诧紝灏嗗叾杞负json鏍煎紡
+					let data = this.toJson && this.$u.test.jsonString(res.data) ? JSON.parse(res.data) : res.data;
+					if (![200, 201, 204].includes(res.statusCode)) {
+						this.uploadError(index, data);
+					} else {
+						// 涓婁紶鎴愬姛
+						this.lists[index].response = data;
+						this.lists[index].progress = 100;
+						this.lists[index].error = false;
+						this.$emit('on-success', data, index, this.lists, this.index);
+					}
+				},
+				fail: e => {
+					this.uploadError(index, e);
+				},
+				complete: res => {
+					uni.hideLoading();
+					this.uploading = false;
+					this.uploadFile(index + 1);
+					this.$emit('on-change', res, index, this.lists, this.index);
+				}
+			});
+			task.onProgressUpdate(res => {
+				if (res.progress > 0) {
+					this.lists[index].progress = res.progress;
+					this.$emit('on-progress', res, index, this.lists, this.index);
+				}
+			});
+		},
+		// 涓婁紶澶辫触
+		uploadError(index, err) {
+			this.lists[index].progress = 0;
+			this.lists[index].error = true;
+			this.lists[index].response = null;
+			this.$emit('on-error', err, index, this.lists, this.index);
+			this.showToast('涓婁紶澶辫触锛岃閲嶈瘯');
+		},
+		// 鍒犻櫎涓�涓浘鐗�
+		deleteItem(index) {
+			uni.showModal({
+				title: '鎻愮ず',
+				content: '鎮ㄧ‘瀹氳鍒犻櫎姝ら」鍚楋紵',
+				success: async (res) => {
+					if (res.confirm) {
+						// 鍏堟鏌ユ槸鍚︽湁瀹氫箟before-remove绉婚櫎鍓嶉挬瀛�
+						// 鎵цbefore-remove閽╁瓙
+						if(this.beforeRemove && typeof(this.beforeRemove) === 'function') {
+							// 姝ゅ閽╁瓙鎵ц 鍘熺悊鍚宐efore-remove鍙傛暟锛岃涓婃柟娉ㄩ噴
+							let beforeResponse = this.beforeRemove.bind(this.$u.$parent.call(this))(index, this.lists);
+							// 鍒ゆ柇鏄惁杩斿洖浜唒romise
+							if (!!beforeResponse && typeof beforeResponse.then === 'function') {
+								await beforeResponse.then(res => {
+									// promise杩斿洖鎴愬姛锛屼笉杩涜鍔ㄤ綔锛岀户缁笂浼�
+									this.handlerDeleteItem(index);
+								}).catch(err => {
+									// 濡傛灉杩涘叆promise鐨剅eject锛岀粓姝㈠垹闄ゆ搷浣�
+									this.showToast('宸茬粓姝㈢Щ闄�');
+								})
+							} else if(beforeResponse === false) {
+								// 杩斿洖false锛岀粓姝㈠垹闄�
+								this.showToast('宸茬粓姝㈢Щ闄�');
+							} else {
+								// 濡傛灉杩斿洖true锛屾墽琛屽垹闄ゆ搷浣�
+								this.handlerDeleteItem(index);
+							}
+						} else {
+							// 濡傛灉涓嶅瓨鍦╞efore-remove閽╁瓙锛�
+							this.handlerDeleteItem(index);
+						}
+					}
+				}
+			});
+		},
+		// 鎵ц绉婚櫎鍥剧墖鐨勫姩浣滐紝涓婃柟浠g爜鍙槸鍒ゆ柇鏄惁鍙互绉婚櫎
+		handlerDeleteItem(index) {
+			// 濡傛灉鏂囦欢姝e湪涓婁紶涓紝缁堟涓婁紶浠诲姟锛岃繘搴﹀湪0 < progress < 100鍒欐剰鍛崇潃姝e湪涓婁紶
+			if (this.lists[index].process < 100 && this.lists[index].process > 0) {
+				typeof this.lists[index].uploadTask != 'undefined' && this.lists[index].uploadTask.abort();
+			}
+			this.lists.splice(index, 1);
+			this.$forceUpdate();
+			this.$emit('on-remove', index, this.lists, this.index);
+			this.showToast('绉婚櫎鎴愬姛');
+		},
+		// 鐢ㄦ埛閫氳繃ref鎵嬪姩鐨勫舰寮忥紝绉婚櫎涓�寮犲浘鐗�
+		remove(index) {
+			// 鍒ゆ柇绱㈠紩鐨勫悎娉曡寖鍥�
+			if (index >= 0 && index < this.lists.length) {
+				this.lists.splice(index, 1);
+				this.$emit('on-list-change', this.lists, this.index);
+			}
+		},
+		// 棰勮鍥剧墖
+		doPreviewImage(url, index) {
+			if (!this.previewFullImage) return;
+			const images = this.lists.map(item => item.url || item.path);
+			uni.previewImage({
+				urls: images,
+				current: url,
+				success: () => {
+					this.$emit('on-preview', url, this.lists, this.index);
+				},
+				fail: () => {
+					uni.showToast({
+						title: '棰勮鍥剧墖澶辫触',
+						icon: 'none'
+					});
+				}
+			});
+		},
+		// 鍒ゆ柇鏂囦欢鍚庣紑鏄惁鍏佽
+		checkFileExt(file) {
+			// 妫�鏌ユ槸鍚﹀湪鍏佽鐨勫悗缂�涓�
+			let noArrowExt = false;
+			// 鑾峰彇鍚庣紑鍚�
+			let fileExt = '';
+			const reg = /.+\./;
+			// 濡傛灉鏄疕5锛岄渶瑕佷粠name涓垽鏂�
+			// #ifdef H5
+			fileExt = file.name.replace(reg, "").toLowerCase();
+			// #endif
+			// 闈濰5锛岄渶瑕佷粠path涓鍙栧悗缂�
+			// #ifndef H5
+			fileExt = file.path.replace(reg, "").toLowerCase();
+			// #endif
+			// 浣跨敤鏁扮粍鐨剆ome鏂规硶锛屽彧瑕佺鍚坙imitType涓殑涓�涓紝灏辫繑鍥瀟rue
+			noArrowExt = this.limitType.some(ext => {
+				// 杞负灏忓啓
+				return ext.toLowerCase() === fileExt;
+			})
+			if(!noArrowExt) this.showToast(`涓嶅厑璁搁�夋嫨${fileExt}鏍煎紡鐨勬枃浠禶);
+			return noArrowExt;
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/style.components.scss';
+
+.u-upload {
+	@include vue-flex;
+	flex-wrap: wrap;
+	align-items: center;
+}
+
+.u-list-item {
+	width: 200rpx;
+	height: 200rpx;
+	overflow: hidden;
+	margin: 10rpx;
+	background: rgb(244, 245, 246);
+	position: relative;
+	border-radius: 10rpx;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	align-items: center;
+	justify-content: center;
+}
+
+.u-preview-wrap {
+	border: 1px solid rgb(235, 236, 238);
+}
+
+.u-add-wrap {
+	flex-direction: column;
+	color: $u-content-color;
+	font-size: 26rpx;
+}
+
+.u-add-tips {
+	margin-top: 20rpx;
+	line-height: 40rpx;
+}
+
+.u-add-wrap__hover {
+	background-color: rgb(235, 236, 238);
+}
+
+.u-preview-image {
+	display: block;
+	width: 100%;
+	height: 100%;
+	border-radius: 10rpx;
+}
+
+.u-delete-icon {
+	position: absolute;
+	top: 10rpx;
+	right: 10rpx;
+	z-index: 10;
+	background-color: $u-type-error;
+	border-radius: 100rpx;
+	width: 44rpx;
+	height: 44rpx;
+	@include vue-flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.u-icon {
+	@include vue-flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.u-progress {
+	position: absolute;
+	bottom: 10rpx;
+	left: 8rpx;
+	right: 8rpx;
+	z-index: 9;
+	width: auto;
+}
+
+.u-error-btn {
+	color: #ffffff;
+	background-color: $u-type-error;
+	font-size: 20rpx;
+	padding: 4px 0;
+	text-align: center;
+	position: absolute;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	z-index: 9;
+	line-height: 1;
+}
+</style>
diff --git a/uview-ui/components/u-verification-code/u-verification-code.vue b/uview-ui/components/u-verification-code/u-verification-code.vue
new file mode 100644
index 0000000..b3079f4
--- /dev/null
+++ b/uview-ui/components/u-verification-code/u-verification-code.vue
@@ -0,0 +1,164 @@
+<template>
+	<view class="u-code-wrap">
+		<!-- 姝ょ粍浠跺姛鑳界敱js瀹屾垚锛屾棤闇�鍐檋tml閫昏緫 -->
+	</view>
+</template>
+
+<script>
+	/**
+	 * verificationCode 楠岃瘉鐮佽緭鍏ユ
+	 * @description 鑰冭檻鍒扮敤鎴峰疄闄呭彂閫侀獙璇佺爜鐨勫満鏅紝鍙兘鏄竴涓寜閽紝涔熷彲鑳芥槸涓�娈垫枃瀛楋紝鎻愮ず璇悇鏈変笉鍚岋紝鎵�浠ユ湰缁勪欢 涓嶆彁渚涚晫闈㈡樉绀猴紝鍙彁渚涙彁绀鸿锛岀敱鐢ㄦ埛灏嗘彁绀鸿宓屽叆鍒板叿浣撶殑鍦烘櫙
+	 * @tutorial https://www.uviewui.com/components/verificationCode.html
+	 * @property {Number String} seconds 鍊掕鏃舵墍闇�鐨勭鏁帮紙榛樿60锛�
+	 * @property {String} start-text 寮�濮嬪墠鐨勬彁绀鸿锛岃瀹樼綉璇存槑锛堥粯璁よ幏鍙栭獙璇佺爜锛�
+	 * @property {String} change-text 鍊掕鏃舵湡闂寸殑鎻愮ず璇紝蹇呴』甯︽湁瀛楁瘝"x"锛岃瀹樼綉璇存槑锛堥粯璁绉掗噸鏂拌幏鍙栵級
+	 * @property {String} end-text 鍊掕缁撴潫鐨勬彁绀鸿锛岃瀹樼綉璇存槑锛堥粯璁ら噸鏂拌幏鍙栵級
+	 * @property {Boolean} keep-running 鏄惁鍦℉5鍒锋柊鎴栧悇绔繑鍥炲啀杩涘叆鏃剁户缁�掕鏃讹紙榛樿false锛�
+	 * @event {Function} change 鍊掕鏃舵湡闂达紝姣忕瑙﹀彂涓�娆�
+	 * @event {Function} start 寮�濮嬪�掕鏃惰Е鍙�
+	 * @event {Function} end 缁撴潫鍊掕鏃惰Е鍙�
+	 * @example <u-verification-code :seconds="seconds" @end="end" @start="start" ref="uCode" 
+	 */
+	export default {
+		name: "u-verification-code",
+		props: {
+			// 鍊掕鏃舵�荤鏁�
+			seconds: {
+				type: [String, Number],
+				default: 60
+			},
+			// 灏氭湭寮�濮嬫椂鎻愮ず
+			startText: {
+				type: String,
+				default: '鑾峰彇楠岃瘉鐮�'
+			},
+			// 姝e湪鍊掕鏃朵腑鐨勬彁绀�
+			changeText: {
+				type: String,
+				default: 'X绉掗噸鏂拌幏鍙�'
+			},
+			// 鍊掕鏃剁粨鏉熸椂鐨勬彁绀�
+			endText: {
+				type: String,
+				default: '閲嶆柊鑾峰彇'
+			},
+			// 鏄惁鍦℉5鍒锋柊鎴栧悇绔繑鍥炲啀杩涘叆鏃剁户缁�掕鏃�
+			keepRunning: {
+				type: Boolean,
+				default: false
+			},
+			// 涓轰簡鍖哄垎澶氫釜椤甸潰锛屾垨鑰呬竴涓〉闈㈠涓�掕鏃剁粍浠舵湰鍦板瓨鍌ㄧ殑缁х画鍊掕鏃跺彉浜�
+			uniqueKey: {
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				secNum: this.seconds,
+				timer: null,
+				canGetCode: true, // 鏄惁鍙互鎵ц楠岃瘉鐮佹搷浣�
+			}
+		},
+		mounted() {
+			this.checkKeepRunning();
+		},
+		watch: {
+			seconds: {
+				immediate: true,
+				handler(n) {
+					this.secNum = n;
+				}
+			}
+		},
+		methods: {
+			checkKeepRunning() {
+				// 鑾峰彇涓婁竴娆¢��鍑洪〉闈�(H5杩樺寘鎷埛鏂�)鏃剁殑鏃堕棿鎴筹紝濡傛灉娌℃湁涓婃鐨勪繚瀛橈紝姝ゅ�煎彲鑳戒负绌�
+				let lastTimestamp = Number(uni.getStorageSync(this.uniqueKey + '_$uCountDownTimestamp'));
+				if(!lastTimestamp) return this.changeEvent(this.startText);
+				// 褰撳墠绉掔殑鏃堕棿鎴�
+				let nowTimestamp = Math.floor((+ new Date()) / 1000);
+				// 鍒ゆ柇褰撳墠鐨勬椂闂存埑锛屾槸鍚﹀皬浜庝笂涓�娆$殑鏈鎸夎瀹氱粨鏉燂紝鍗存彁鍓嶇粨鏉熺殑鏃堕棿鎴�
+				if(this.keepRunning && lastTimestamp && lastTimestamp > nowTimestamp) {
+					// 鍓╀綑灏氭湭鎵ц瀹岀殑鍊掕绉掓暟
+					this.secNum = lastTimestamp - nowTimestamp;
+					// 娓呴櫎鏈湴淇濆瓨鐨勫彉閲�
+					uni.removeStorageSync(this.uniqueKey + '_$uCountDownTimestamp');
+					// 寮�濮嬪�掕鏃�
+					this.start();
+				} else {
+					// 濡傛灉涓嶅瓨鍦ㄩ渶瑕佺户缁笂涓�娆$殑鍊掕鏃讹紝鎵ц姝e父鐨勯�昏緫
+					this.changeEvent(this.startText);
+				}
+			},
+			// 寮�濮嬪�掕鏃�
+			start() {
+				// 闃叉蹇�熺偣鍑昏幏鍙栭獙璇佺爜鐨勬寜閽�屽鑷村唴閮ㄤ骇鐢熷涓畾鏃跺櫒瀵艰嚧娣蜂贡
+				if(this.timer) {
+					clearInterval(this.timer);
+					this.timer = null;
+				}
+				this.$emit('start');
+				this.canGetCode = false;
+				// 杩欓噷鏀捐繖鍙ワ紝鏄负浜嗕竴寮�濮嬫椂灏辨彁绀猴紝鍚﹀垯瑕佺瓑setInterval鐨�1绉掑悗鎵嶄細鏈夋彁绀�
+				this.changeEvent(this.changeText.replace(/x|X/, this.secNum));
+				this.setTimeToStorage();
+				this.timer = setInterval(() => {
+					if (--this.secNum) {
+						// 鐢ㄥ綋鍓嶅�掕鏃剁殑绉掓暟鏇挎崲鎻愮ず瀛楃涓蹭腑鐨�"x"瀛楁瘝
+						this.changeEvent(this.changeText.replace(/x|X/, this.secNum));
+					} else {
+						clearInterval(this.timer);
+						this.timer = null;
+						this.changeEvent(this.endText);
+						this.secNum = this.seconds;
+						this.$emit('end');
+						this.canGetCode = true;
+					}
+				}, 1000);
+			},
+			// 閲嶇疆锛屽彲浠ヨ鐢ㄦ埛鍐嶆鑾峰彇楠岃瘉鐮�
+			reset() {
+				this.canGetCode = true;
+				clearInterval(this.timer);
+				this.secNum = this.seconds;
+				this.changeEvent(this.endText);
+			},
+			changeEvent(text) {
+				this.$emit('change', text);
+			},
+			// 淇濆瓨鏃堕棿鎴筹紝涓轰簡闃叉鍊掕鏃跺皻鏈粨鏉燂紝H5鍒锋柊鎴栬�呭悇绔殑鍙充笂瑙掕繑鍥炰笂涓�椤靛啀杩涙潵
+			setTimeToStorage() {
+				if(!this.keepRunning || !this.timer) return;
+				// 璁板綍褰撳墠鐨勬椂闂存埑锛屼负浜嗕笅娆¤繘鍏ラ〉闈紝濡傛灉杩樺湪鍊掕鏃跺唴鐨勮瘽锛岀户缁�掕鏃�
+				// 鍊掕鏃跺皻鏈粨鏉燂紝缁撴灉澶т簬0锛涘�掕鏃跺凡缁忓紑濮嬶紝灏变細灏忎簬鍒濆鍊硷紝濡傛灉绛変簬鍒濆鍊硷紝璇存槑娌℃湁寮�濮嬪�掕鏃讹紝鏃犻渶澶勭悊
+				if(this.secNum > 0 && this.secNum <= this.seconds) {
+					// 鑾峰彇褰撳墠鏃堕棿鎴�(+ new Date()涓虹壒娈婂啓娉�)锛岄櫎浠�1000鍙樻垚绉掞紝鍐嶅幓闄ゅ皬鏁伴儴鍒�
+					let nowTimestamp = Math.floor((+ new Date()) / 1000);
+					// 灏嗘湰璇ョ粨鏉熸椂鍊欑殑鏃堕棿鎴充繚瀛樿捣鏉� => 褰撳墠鏃堕棿鎴� + 鍓╀綑鐨勭鏁�
+					uni.setStorage({
+						key: this.uniqueKey + '_$uCountDownTimestamp',
+						data: nowTimestamp + Number(this.secNum)
+					})
+				}
+			}
+		},
+		// 缁勪欢閿�姣佺殑鏃跺�欙紝娓呴櫎瀹氭椂鍣紝鍚﹀垯瀹氭椂鍣ㄤ細缁х画瀛樺湪锛岀郴缁熶笉浼氳嚜鍔ㄦ竻闄�
+		beforeDestroy() {
+			this.setTimeToStorage();
+			clearTimeout(this.timer);
+			this.timer = null;
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/style.components.scss";
+	
+	.u-code-wrap {
+		width: 0;
+		height: 0;
+		position: fixed;
+		z-index: -1;
+	}
+</style>
diff --git a/uview-ui/components/u-waterfall/u-waterfall.vue b/uview-ui/components/u-waterfall/u-waterfall.vue
new file mode 100644
index 0000000..31964b7
--- /dev/null
+++ b/uview-ui/components/u-waterfall/u-waterfall.vue
@@ -0,0 +1,176 @@
+<template>
+	<view class="u-waterfall">
+		<view id="u-left-column" class="u-column"><slot name="left" :leftList="leftList"></slot></view>
+		<view id="u-right-column" class="u-column"><slot name="right" :rightList="rightList"></slot></view>
+	</view>
+</template>
+
+<script>
+/**
+ * waterfall 鐎戝竷娴�
+ * @description 杩欐槸涓�涓�戝竷娴佸舰寮忕殑缁勪欢锛屽唴瀹瑰垎涓哄乏鍙充袱鍒楋紝缁撳悎uView鐨勬噿鍔犺浇缁勪欢鏁堟灉鏇翠匠銆傜浉杈冧簬鏌愪簺鍙槸濂囧伓鏁板乏鍙冲垎鍒紝鎴栬�呮病鏈夊埄鐢╲ue浣滅敤鍩熸彃妲界殑鍋氭硶锛寀View鐨勭�戝竷娴佸疄鐜颁簡鐪熸鐨� 缁勪欢鍖栵紝鎼厤LazyLoad 鎳掑姞杞藉拰loadMore 鍔犺浇鏇村缁勪欢锛岃鎮ㄥ紑绠卞嵆鐢紝鐪煎墠涓�浜��
+ * @tutorial https://www.uviewui.com/components/waterfall.html
+ * @property {Array} flow-list 鐢ㄤ簬娓叉煋鐨勬暟鎹�
+ * @property {String Number} add-time 鍗曟潯鏁版嵁娣诲姞鍒伴槦鍒楃殑鏃堕棿闂撮殧锛屽崟浣峬s锛岃涓婃柟娉ㄦ剰浜嬮」璇存槑锛堥粯璁�200锛�
+ * @example <u-waterfall :flowList="flowList"></u-waterfall>
+ */
+export default {
+	name: "u-waterfall",
+	props: {
+		value: {
+			// 鐎戝竷娴佹暟鎹�
+			type: Array,
+			required: true,
+			default: function() {
+				return [];
+			}
+		},
+		// 姣忔鍚戠粨鏋勬彃鍏ユ暟鎹殑鏃堕棿闂撮殧锛岄棿闅旇秺闀匡紝瓒婅兘淇濊瘉涓ゅ垪楂樺害鐩歌繎锛屼絾鏄鐢ㄦ埛浣撻獙瓒婁笉濂�
+		// 鍗曚綅ms
+		addTime: {
+			type: [Number, String],
+			default: 200
+		},
+		// id鍊硷紝鐢ㄤ簬娓呴櫎鏌愪竴鏉℃暟鎹椂锛屾牴鎹idKey鍚嶇О鎵惧埌骞剁Щ闄わ紝濡傛暟鎹负{idx: 22, name: 'lisa'}
+		// 閭d箞璇ユ妸idKey璁剧疆涓篿dx
+		idKey: {
+			type: String,
+			default: 'id'
+		}
+	},
+	data() {
+		return {
+			leftList: [],
+			rightList: [],
+			tempList: [],
+			children: []
+		}
+	},
+	watch: {
+		copyFlowList(nVal, oVal) {
+			// 鍙栧樊鍊硷紝鍗宠繖涓�娆℃暟缁勫彉鍖栨柊澧炵殑閮ㄥ垎
+			let startIndex = Array.isArray(oVal) && oVal.length > 0 ? oVal.length : 0;
+			// 鎷兼帴涓婂師鏈夋暟鎹�
+			this.tempList = this.tempList.concat(this.cloneData(nVal.slice(startIndex)));
+			this.splitData();
+		}
+	},
+	mounted() {
+		this.tempList = this.cloneData(this.copyFlowList);
+		this.splitData();
+	},
+	computed: {
+		// 鐮村潖flowList鍙橀噺鐨勫紩鐢紝鍚﹀垯watch鐨勭粨鏋滄柊鏃у�兼槸涓�鏍风殑
+		copyFlowList() {
+			return this.cloneData(this.value);
+		}
+	},
+	methods: {
+		async splitData() {
+			if (!this.tempList.length) return;
+			let leftRect = await this.$uGetRect('#u-left-column');
+			let rightRect = await this.$uGetRect('#u-right-column');
+			// 濡傛灉宸﹁竟灏忎簬鎴栫瓑浜庡彸杈癸紝灏辨坊鍔犲埌宸﹁竟锛屽惁鍒欐坊鍔犲埌鍙宠竟
+			let item = this.tempList[0];
+			// 瑙e喅澶氭蹇�熶笂鎷夊悗锛屽彲鑳芥暟鎹細涔辩殑闂锛屽洜涓虹粡杩囦笂闈㈢殑涓や釜await鑺傜偣鏌ヨ闃诲涓�瀹氭椂闂达紝鍔犱笂鍚庨潰鐨勫畾鏃跺櫒骞叉壈
+			// 鏁扮粍鍙兘鍙樻垚[]锛屽鑷存item鍊煎彲鑳戒负undefined
+			if(!item) return ;
+			if (leftRect.height < rightRect.height) {
+				this.leftList.push(item);
+			} else if (leftRect.height > rightRect.height) {
+				this.rightList.push(item);
+			} else {
+				// 杩欓噷鏄负浜嗕繚璇佺涓�鍜岀浜屽紶娣诲姞鏃讹紝宸﹀彸閮借兘鏈夊唴瀹�
+				// 鍥犱负娣诲姞绗竴寮狅紝瀹為檯闃熷垪鐨勯珮搴﹀彲鑳借繕鏄�0锛岃繖鏃堕渶瑕佹牴鎹槦鍒楀厓绱犻暱搴﹀垽鏂笅涓�涓鏀惧摢杈�
+				if (this.leftList.length <= this.rightList.length) {
+					this.leftList.push(item);
+				} else {
+					this.rightList.push(item);
+				}
+			}
+			// 绉婚櫎涓存椂鍒楄〃鐨勭涓�椤�
+			this.tempList.splice(0, 1);
+			// 濡傛灉涓存椂鏁扮粍杩樻湁鏁版嵁锛岀户缁惊鐜�
+			if (this.tempList.length) {
+				setTimeout(() => {
+					this.splitData();
+				}, this.addTime)
+			}
+		},
+		// 澶嶅埗鑰屼笉鏄紩鐢ㄥ璞″拰鏁扮粍
+		cloneData(data) {
+			return JSON.parse(JSON.stringify(data));
+		},
+		// 娓呯┖鏁版嵁鍒楄〃
+		clear() {
+			this.leftList = [];
+			this.rightList = [];
+			// 鍚屾椂娓呴櫎鐖剁粍浠跺垪琛ㄤ腑鐨勬暟鎹�
+			this.$emit('input', []);
+			this.tempList = [];
+		},
+		// 娓呴櫎鏌愪竴鏉℃寚瀹氱殑鏁版嵁锛屾牴鎹甶d瀹炵幇
+		remove(id) {
+			// 濡傛灉findIndex鎵句笉鍒板悎閫傜殑鏉′欢锛屽氨浼氳繑鍥�-1
+			let index = -1;
+			index = this.leftList.findIndex(val => val[this.idKey] == id);
+			if(index != -1) {
+				// 濡傛灉index涓嶇瓑浜�-1锛岃鏄庡凡缁忔壘鍒颁簡瑕佹壘鐨刬d锛屾牴鎹甶ndex绱㈠紩鍒犻櫎杩欎竴鏉℃暟鎹�
+				this.leftList.splice(index, 1);
+			} else {
+				// 鍚岀悊浜庝笂鏂归潰鐨勬柟娉�
+				index = this.rightList.findIndex(val => val[this.idKey] == id);
+				if(index != -1) this.rightList.splice(index, 1);
+			}
+			// 鍚屾椂娓呴櫎鐖剁粍浠剁殑鏁版嵁涓殑瀵瑰簲id鐨勬潯鐩�
+			index = this.value.findIndex(val => val[this.idKey] == id);
+			if(index != -1) this.$emit('input', this.value.splice(index, 1));
+		},
+		// 淇敼鏌愭潯鏁版嵁鐨勬煇涓睘鎬�
+		modify(id, key, value) {
+			// 濡傛灉findIndex鎵句笉鍒板悎閫傜殑鏉′欢锛屽氨浼氳繑鍥�-1
+			let index = -1;
+			index = this.leftList.findIndex(val => val[this.idKey] == id);
+			if(index != -1) {
+				// 濡傛灉index涓嶇瓑浜�-1锛岃鏄庡凡缁忔壘鍒颁簡瑕佹壘鐨刬d锛屼慨鏀瑰搴攌ey鐨勫��
+				this.leftList[index][key] = value;
+			} else {
+				// 鍚岀悊浜庝笂鏂归潰鐨勬柟娉�
+				index = this.rightList.findIndex(val => val[this.idKey] == id);
+				if(index != -1) this.rightList[index][key] = value;
+			}
+			// 淇敼鐖剁粍浠剁殑鏁版嵁涓殑瀵瑰簲id鐨勬潯鐩�
+			index = this.value.findIndex(val => val[this.idKey] == id);
+			if(index != -1) {
+				// 棣栧厛澶嶅埗涓�浠絭alue鐨勬暟鎹�
+				let data = this.cloneData(this.value);
+				// 淇敼瀵瑰簲绱㈠紩鐨刱ey灞炴�х殑鍊间负value
+				data[index][key] = value;
+				// 淇敼鐖剁粍浠堕�氳繃v-model缁戝畾鐨勫彉閲忕殑鍊�
+				this.$emit('input', data);
+			}
+		}
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+@import "../../libs/css/style.components.scss";
+
+.u-waterfall {
+	@include vue-flex;
+	flex-direction: row;
+	align-items: flex-start;
+}
+
+.u-column {
+	@include vue-flex;
+	flex: 1;
+	flex-direction: column;
+	height: auto;
+}
+
+.u-image {
+	width: 100%;
+}
+</style>
diff --git a/uview-ui/iconfont.css b/uview-ui/iconfont.css
new file mode 100644
index 0000000..836c718
--- /dev/null
+++ b/uview-ui/iconfont.css
@@ -0,0 +1,910 @@
+/* #ifdef APP-PLUS */
+@font-face {
+	font-family: "uicon-iconfont";
+	font-weight: normal;
+	font-style: normal;
+	font-display: auto;
+	src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAGQYAAsAAAAAw2gAAGPEAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCdAAqCv3SB/XABNgIkA4ZoC4M2AAQgBYRtB5cNG+OfdYacxwEA9eYzEqHbAaXC+ZFZWS8oKTr7/09LKmNsu7DdEEVL04JkStgZyOKZ/ILQ2JzQooY+O2mlDm88cwprtIUJRYoVp8q1MEe1Ow/WIUjUNfnNH9HJV5m92kW8dnj/3pEhB8aSgR+4kj24yOevPzf/ix2t5Ij79FHJAsd5EFJ2EoByUZPNHtWZ1VUw8TCKNsPzc+v9/WVQI8dGjhpsRMkSRg/YRimMGiDhCBkIyggFLMAzAAsVA/BOjAJUrBMVFTk9PQUPK0D0ro1REM/4bck0GjGLMBKwOzEqMDrm/+DNvwEAhTsoAAkoYGpB7e4LMInq4Z7d2/lSHmrkiVCowgFOGC/4BjLdjqZBMK9fkWmEJpgKgx8EK9nAPEPOk30pNCLq0BlSKNLexDrvFnL/EBcKlB/2YPqlzm92rMBKbxWxIXacD0TdMTTllTdfbtWnkEtVgBUaVkW6e6oqLSvgq84luVauJUGaMQg240CPmETe+8e/tZabTzHZvWtZycoqHH//BQBFFJvYg6cSCAPK0P/lViVvbmTWIzDi0N0rLjdoVkyOXJIrXJMg1hJIpYJpuwL9q2rensSOdFq7rfav29kR3LEgWD1R08h27tjxMauRWqk1yAqQxIEnxwk/k9Xvp4mNJ5uJLShAeP9ebatUY0naCgW0UITh59azOqqoboMT35k+wU5MV6BC/qWqJ5UnA9vtHQlfnOYXH0EGqAuWT9o/uCI/R6qH5JFb21r+/3mKC2j3fzlyPaQSlCkmTghdBueFPOIgIuD/pjV7uSVUtRJH3r1Qi793yiERbvfPn1kmfye50j+ht+xRakKdXWpRyFaEW2p3vgqDx5kmUV5C/ceN8zDBBaE/Jw+cu0rV+oKmNmRq88X0i/W3q7b+l373+kzPkBYGICUCkGiCVIIo+wTKgQBlF0E6BXIjpfPl9IoRIB0I0nsFUA6kfAHcKG6W9/JrN1/Mz5Ce9/jc+327ryVoKss14vz/aVtEFGJxKA6zw9isAcvQsULlmCICMkSMr7y8H5v/3H7HKsRIsIE7JNR0v68Ola+NidPXgYK7d4y5/kTrx1YiH3ACHY721PpPEwB52aopNP+2724kpHhSAITxv1FDjHzpgDzZMsCCoCevzA4ZdNuGwWaub2JsOr5/+GfTAhbIQEXxzM4jWww363cwcBfD37CDtobhdX241wMioCayVW4+bY0NiYeueRB+9rkNjZPR3SzDmPy+DZuAipEDJ95srvX1+/VHZ73km/Ct/p2utNSVpqu82hqCBAuZNq+8ATmVfJVWWHeYbwS/04tPTM/uwnx5/WrZyVW5K5oTo3NVqPm14m2BMjTemmu9rddzuzLfe3tb7nMPuIeaD4waumN34v8dT1ljigt5jIEn4Cl4Bp6D5ra9AG3NcPfedF1NNsxLUJuXzqNjHXsFxnkN7h/femLnVG/A/n11YXjrmqOdt2C8CXIrtGdHJTfBu2Cm98D7IK87oI0PwYGTB7d/BKbooLKD+cRp72PwCfgUPJjtMzDN5ocTVRGvs6Za+Bx8Ab4ErbS26yswyKFJmhmlgAJ7RxhpsHpyne6mux7O9NRLF7310VdL/fQ3QBlk9lgsrTBPIVaoHNDQMdRZoDhTZtCYLJhDgOkttEgOhiVZjcuWr1i5qiSi1jWlrF23fsPGoarqPdJQmPaAzQefgK8sZ8+dH+jCxUuXr1y9dv3GzVu37zTWRAX+AgQKEixEKFdcbtx5AINyGjgWYHT9vvZfIDCqgylAED4WAqOAYHwChMSnQCh8BoTG50AYfAGExVaEw53C40sgAnYgIs4mEt4TGe+LgrOIij2IhtOIjiOJga+ATLA2kCnWATLD7TLH47LACcTEE7LE10BWOJGs8Q2QDT6QLZ6UHe4QC0/JHveIjTOIg2+BHPCgHPGAnLAukDNGALlgPSBX3Ccuzic37Eju+A7IAyeRJ04mL4wE4uF48sZc+eBu8bESkADfA/niByA/nEP++BEoAD8BBWI0UBB+BgrG9hSCX4BC8ZAW4WmF4WEJcZdE+BVIjNNJgp1JipWBZHhG4RgDFIFdSI6dKBK/AUXhd6Bo/AEUgw8Vi/MoDn8CxeNMUuA2JeAjJeIUSsIqQErsSirsRmrMoWRsTSn4CygVfwOl4R+gdGxLi7EdLcG9ysC/QJmPNw0eURZOpWxsSTk4lnIxDigPx5EW9yv/nFXgqND5XUthfaAiHEXFeFYl2JNKsRctw96kw3Mqwz5Ujn2pArtTJfaj5difqnAA6bENVeNAqsFBtAIHUy2WBarDeKCVWA5oFaYC1WNJIAMuoAZcSI2YANSEpYCaMRFoNVYEWoNJQC2YDNSKhYDacBGtxcW0DgsDrcciQBuwKNBGDAdqxxJAHVgcqBOLAW3CYKAfMARoM86lLbiEtuJS2oZhQD24TNtxuXZgKFAvrtAeXKk+XKX9uFoHcI0O4lodwtJA/RgLNIDrNIjrNYRlgI7iBh3DjTqDm3QWN2sYt2gUR9AvWBXoBR7VOzxmPozNgflIbAHMx82tPbwZJFOzvJzMNDmb6fIyM8Q3M5VgDlereV4PzAv63byo53AICxLwkgUqvGyBel5RqXlVOvOays3rWmHeUK15Uw3mLa0289Ri3labeUdrzbv6yczSFTNb/8MKwIAcGwADKmwIDOTORsozG0trNlG+2VQVZjNVmtVUY1bXCrOG1pk1tcEfawH4D2DQdYP/N20SmD0zvuG/kuhhSdB/fz0IEhYaHmrTyNGHgpHDaUQyEvylEiPhpvAsgAdcUqDhBAzjoxDBamWWHEXLRUk3zQIxJnRqcWaNC1AmhIpAAVyaA7hpHlAPTAEsEAikPkuF4ArAbE4NKENRV7oFAztaGpkyLioJfbF3cbQNo6FblBgH+xgUe1gRDVZjE0h+jmFKOA1ZH2aGqUo1CNuTLdrewl6g5gToj+dRS0ckZ5JyNwz5Vguh2Wa0tKjj/kJ0Pi8Q8yPlTocrnq4hEa3FCDocKYsubQ9jkix6OMlKQVSKzZhMfyUP+hh8LpsQPaxNgRhujI5YpMtinZ4414eSNeBbw1Ls6Gp2amgIjjunapxZgSPKLKeXY1BBiz3kxFjZLCmGrd20fav4lvWoCFiF0i7H/rBPPxcbTXmpffcEi0en9a4TrZ3b29250myHaYrEbXJ2IQIbKp61FYJT8MxSGdedJsFuVe2162qscnZbu93dHb9dtt/tHxOSmhwU4liXKB6sThZdbqZB68SUGFIUHO9hC4V931S2mW42m7B+S/EEgYKUJasluMCKgWG0syNq01mLLImeKX+CQedh0gE8PQ1oajBrg1UqguHfLBI4fLvEHTNqQ01rZq/1J39onmem5XFG2PmFXDN/f7C8Zl/Cq6X+CZJlshonJDsrE/AIu0EMC9sGlTQsLrgq4vVMLdh5NKgO4rC/QGaKWGIacOw8l5RuOgcchkMH1+90IOa/2N+azrACjLEvwNZsit0UF7BcoRWCbK67FLt24V0TPbgcxG39QNk1uUNKGPRZcS7Y7J5ktZljwx4ATLywmxph7hHqvPNfk+GdpPwQNMgQwXQYO54MZiiwuRQE2xAwOQgOAqGgE/RQl5+FfF7eDYfm2jFIhuuoz9XThdADbICBfGs1rTkfbCtCEhxC5FEhFdA8I68xxB3fDFU9JZjRqUMNKcPlXD7pCm4sIH8q20pngJRErVfT2Iahf+8X8Lvg3AOBsOtwuevJxeXm2SYvAbmlbDkExXPQNDIWTadUAEa98rqioP2RNAsLylBYAMEHqJgBVgaLpgzMHbjbBA2L39wEpEXjzCY7s00W1LgT1EwRxSjjxoJ/oFoKjHPON5aDfedhXl8dmckO1uIN10j1HFmyxd2SFOnC0Vh9kVKwrAGJr0OuGlYpYquJrxYtQ2mlzzGVcVCL8swKGkTQ64kagF8j100W718Q8VopCopjK6C4i689URK20A+IJnQuzXMmR52pWYXM9Hpi04bbbujXXkyI4rNVaAWkKSDXORDJu/7z0pirFs1kEmQzXpT6cfjEUGba5thBeu5/cVtb3kINXO93sNeGlXdWDqW8Hfe6osCwCoqrx2W+Y7uOkVA5lLKlGFBqiITEw/FVPIzO4oLVG5FIN0RNBuV1nGh7JMPZTXV5Ho4HjtjKUErsFtxU6QAwTFvFtdCrDy/vjtdR1yFyq7L59XcVnfG+Rx8fNugzG5n4hSR8dfVxQtOPLXnV3U7typyHRy8KvUrEizAGooABJbOhIKbfJpjGMVh3UtTP7zGK1rIRZfTb3Lsw1r2mC4I6QtKc6cFxOj0gJi8doJz3ht3QfkJJ1wL/kAGhczPEyF41Y2VGn1I5pc51d/6ovdWl/R++PzjbHq1PH8agTYWXvDKFjYlQtx/giou9Kijc3D51Ry9CZgqZoq2SRhVnwZlZRRRgBmkvlgBUl9aIk4EYz0Ld31USbuBrAuX2cHRLqLkvaB/EQt/dhAhuSvI+lWsRSEvUWC1eFNI9VBWo8ByVBbcPhCMpx9csfloGoIYWdabz1qC15pKm5GcSYKDyBZPDbdrU6okbWL/G04cmkqLK7na4JW3mTtSQ1lp4KzldOg7Q+7J3YEJwv/wuuru5bNkSevbx0X4pjyaLxzTIFpb2bTClTaYAK5VDU4gwIQ0oaMJgscXpMtSQPWSJnFlqSYHUQjHGOGRKUH8O36cNr9+SoNKjs5XxSJ5Ky+n2FS3j8cepyIBkSzCnH/K07s6pmXizamV/7UUOgEJDBqRBqHOygXBIIVHwVooRWC7qBIzPMuxeDuU5bMWvt3V8Ap51RNVMI+ghOGnGhok7t75QDbfX+hlVr7KXA93sSUUvdVq8g4hMktX8uiXrkdWyjmawkwnROjZ/yWSORHT1kZOeOU918lDEm08fmk5fQovOZw48n6lB0JwiejPCVQHNy+Yi3nStRNdRYsk3/KCdyzDOBPdT3RcSEWTnMhc1KtuAJeNCExCwxbvSEd+EWSLpqAokpBRDybILw0GWJ5WICLUxnrU3v70ZJFQ6snWeJKejBykXDXRK7poBRMxK96reuvm9SPI/uFVG+LeyL1wIiFdJFAobVU4sITsEjSkVvZSt9hFPFAmCMGfPWo+WrkRm1j/ICLuKrhjPMQCAxQTKRWMjcRloQoArUYtA9LrztibHkNO7kgft3xgnNF1DGixWcOCk/e6DuVeL37stucRVKA/8tjsTiaXlZu7soX8nyS/8SmuVRmdrVllccLKGEN7vqCrtcczv14jfmVyQykAf3ig1GTo1M8FzhXwRSOzZwpns4LloG9+SyHQgpVxK5LcGVeV6pUQuJDV6UqZP5MkoIO0/JAKD/mzgNHlCvngeFWPrYIiGTcW9SEAwPFJGZ6TF+fgrVBZjsLkB8oTbAUODXA/7t+eKQiDtdeVpWOCq06nj9NZEmQio7UC7ockeAm2JYyQQaaNj8MbMoZqyT4S40BUhJ5uwQyw3OepOW1Q2rITt1Hg3eCuYEDuDTlIiEoYSMSjSVHju3rK8Uj2/kPfI72reEEn5D77TsyRz46rb4Fwc49qev2NsROWSHfmmHx37briuXDtZPWbFaIaLrcdcUJnH1U2G8dkk24tVhjReHe3rCwhsStxxo6p1qZ5LW+u1kvD+DTsrFg4DdfyQCrTDuzdHOz6DNoWyqXOoncD8KLT+C8pNiqE0DdeyTpqd6z2CJn5jBu8mzsXQA4U0spwOkrV6VaYE3+8guIKg0kAD1yJoh6/vRtCpKHpfFxKlhjI5PlM5Nk6lDuQUPIkNdEWaXk/i9tdWDppsyTsM9t29y+sA7BtYHER5q2gbOYvRtmZjbLgnghKmHeSXKhrKGznO7v1Eg7jmvq4svo1Wl0/E20tH9qGyx5eeVJtr275eqrjRPVcplxx1P7Cq5W7s0FP/lsU8hM3qRNNylTBTwnbYbc0a5+ldB5M8UxzyV0VQ2r2Wg4zfxR3GBMGon5T36dCTMsX4GiqF/2wXk3OhUJR6gtdB19zBwOF5L7zh/8rK8dSB8rJGolYqjTme+17uQDY7tl/rLMiR+mJwqEUbS09a55yo2r4QRFC27tgamxxwCXrHW2OjKwwyZhwJVkQHojOMhCbV+OtExBzqWz144bIAwPXJWSDl9V/AT3gt/FvV9DLpa4kkcYPK75GNRA1aDiHjMMPATTRifViXHA909in81q1XvX+wfHiN61JXFECEqzYQEfv/HDFYFFItyUjz4zKqm7ovloZwWPTQH71LMd61qsNBMTe7JemSwyHp4larXRNCn7NMfu4U+NORlgAJjug7eX/XAHRQQxoCfDGwzf5gri3/qvYmu7pPq5YEDVaz+2trZMgC7pVtVTd2HRgFfPM2kY25Ll6SOc3Q2RIFUZaVzcL54q+Ozo4NM1XwLvi2osPGiWJUn9QSdlnqyZgbcO9yM4yiNIMijGdQ2zBUHF4UV6om7EWCKS5wS/J3xb8d+SONy9jOLvu2JoP60VwkMQN07ZQ5qqpMcd+CE4QRPn+dX0mvvNZkpVdfQfhPev1V0Z36wWachYYQ3eRmvw0y5MasO0b1iibPof8wcWiEbOXhB4XAP4S+B49q+gJmXzNGTQqCDxbw5WD66y/fHrPfyuT7YW7l8KdnE4Ps4t73zz+61KxOMOujxFj2aTTFe7gnp7kgABgVsD10CvwGqmAErcCqtHZWG+BT5s+IIwhUDu4iJAp4v4qLHTwU5tngUJrx4C5XWBI23qzM6zIhlfuU7P1CPqfrZ+QDVmmC4NoKNzL1OD2aSWC06s0Wn0fqZSMduphiyNC+okatppSEAPWk8qD+oix8EYiCJd+LNRAbStUos1rq14goRTgeVh4i0l4+RWmMVWQEJEhBtL4II0We6UBxmCHgYSS+LBCQU8pQbV3TwVaX+wVBsQ+CD091vUEfaANTl4fgzGu/c4rlFhh5y2Q07snSbzpu5QJgNLSolAGsz6U/0ZOhppppp0fLAwFMVBlmnVJFptBgpmVKGECEzg3aOPJmH1hIpGl91Lks8E+gcjD64gSTrluWWAARj6UXHhQnDNuB7keTt0mgXKCeVVsHBa0uFyMaKifSUUCyd020gBEpAb6cmV5IqOJ6xtw4G2jPFbVgdh94xis61hMVglUA7TV5Les9yNoiyN47XnFo5mqwv2Lglp5uzMELnNQ8kG3j/b3t+IjFV9cFIGsHsutjg6YbFMqPW13VdIxED5cwOv8Em0DAIUcRoon26OQP923iA49DobDctXYKxcR3AKUJsEnfYIiAn4NKPVZ25AZ2olE50nWtLWP/kn+rSQF84pbKtRCV+d0BLBrgJWuQ4Rh168LgfjctiRyqQ1nj+noGt/yUwhg5HkeEy4dwIc7Cvlm6ytQZ8L0D7/xRjz0whoJnHH5CH3tndWVoqNwmaLzQysMQvA+24yGzYD4ZwCbfT+thJ8klKI0fJlDw1RwxKDKWLUZCNoPssMf0o2Ws2PfiDG3cvgcILQ38kCGuiVAMWNZtfhAopddem+UJQj4OntsYGkIChGZlSC/o/UnkTV3yEDKDJBvAqAyZDcg7JPlmB3z/NuQx0bF3Ifcg98jZltCjGDAGpPw4QEwRwfgSJYvjatCyzG8y1NlMxL4o5HikxKOlh1VYlTzj9mnkl9RBc4ahQtI0wyMFXYJMc0Pge/jcwBPdRCLc+aJU3CWaqstAufCIeomrsJ1AFGY6/mwHPahHVh/xmfX2SZhV6gYEJhinHPjs/DwX2d77BhWFhvFvVr4jSuh3oin6ljQRfvjP+b/SlEj5odhpCCi4ehNhzBhLdLnKEP7BjR+Zhd/Y2SFIcV1rgKJwye1srRKZ5bHOxzNG2hgGxC+/0+P80WKyfY+qQZdbpRXue1R2KxSl2i00ZKA6kHU43MWiqyeAPwoAVbMwHnjk+CI3aPO5jrmHJGp++vAeWjEqU/aSkkip4n42UurvLMWqP+J+riFu6uxlpQlxxlpQGH9ZjptOKfaG0P9VeAyeGC+iqds18Q30QM2KhCXhHrokaLjPkmX8OKlSFU1D81hxS/d3AKcw3Ap0SgT6j9kX6AoW0VZCUSnE4w+jhJSm5m5EMFCP4V/I8RHzC0F+INjYCIVklYlSuUqNclnUOgtEmcoeWhwgldjKqhRP+plqNmICWyZufBov1/ZAsZQGuZP+nhwDvPJMeX8cwuo6oJfX6hV2FD9941s1rBQ6n7DAdI15y6+X74vQHtP5ytb3r8nJtZmaC5EcaBSLaANCXkwDKznaqFDKRwdl7b/Pu6So1X090akA1oTr0bEENqZmibeYBhvSUtw2gilHjQyl2Q/cuv6S4630xlYF8z9rkB+ZTDEvphEaVKZmMiwayg4SIHlhApIxEVX4q1ESoY0xg7pnKHauYTLwYkOFumLLuB/Iu8D5SIa+wZToNxJPGONdZEoLIv1xLjIJNo4K0wOHhjVjcmxHSsnOjO44yPwj5lpLOwJpINT8kWjT4WNwePOXADWeUepOyYP9ByhwoN7FZsU2vYcAGo3sJjEbT06dnVOKBwADocztZ50ekLFu25iQ5Ey6luygQRVUSxkZPZCg0hgd0l7xc+zFjiS+I5iWDIKxL7EIhwrcS5BLGgwiGJcPxj4e5h42pMjDLM8WQ5Te9YVf2TORuKL1oBck8gYY9kPWfPh55ynVii+ZI6T8vOnXgUQWJAINiPj1rkcDLdj7xI8xVSJI/NNdT6bR+QZO/q6sRMc7x+CifRr9ksSc57WoDOisla8Sm+VicLG9W/Wjn2SSQInxS52bIq7igDSTqCiS6g6VHv9GSh+Lb9KFgt3EbcE5lf6pSRWuDNsnzVFrsLoectCnXeOq4X3Wtd37AxxkO2o6QBGAhR09CkBMpESSRyN0OsDQBsIWCXWU5qDWewgqIxXQDp7q5uc6oYaeCF6zpjBCUZKGSLikTk1DZNb3f2khif0PTQCePvgV5Ap88EtMcUnEsBjxRbl4VX78/181nbbsAnR9pO7l1ns+4dY09vyk6xNJ8uOKcyT8X3j38KQ3OMgMhBqudT8NtadUCaoOwAiFAmttJC2uOHkMFtcGzl2JFqHtf7iaR6Ee1CBYFfz4TmjoWh1NwhNxWnKAdyozJ3DJvXD0O5jvA/UbJ7O2zR7j/Ma8zXWelB8Hxu9VnIEZ8K3Qp7FU0K03UoNmpzm2V9ewkctSvh8tvztZHP1WcN9gTxJMBBXiiieN5HX0qAX3WdJmM+Cg+LXLLHUMM9J4NZU0EKDQ5y3ZSXaKnUwHeVGVcW+O6GuWtgWa68FueXHPdCv1btld9de9DVs237UXFSFPu7C2uY2a5BZpyXzPt+HE/PDojq2sfzO5V6+zitZovjspcwG10LYGLRyDsUXeFKi3MbWuv1jnV1mTymNokNXj5kyegqNFKpKiAH2bwMAB+jQLxqlREBxqBU4rQuZO7Nw3IsBTeyICjSb2xEpzCKXOuH9doTUNshIBYRghJGAQprcbSgwtnlWe1jEiDCSUW7pbG/4lNn6P9a9b2B+ROjE61602C3dJuEmRBMAmafG96cuBzIpBn8bcs5OHfJulnFHMDqImCr8FPE019EJolMQNWebj+MZgdaooJdzqmaYUAxj8EVvi4gte1c/Pv0BmhKSZeipETqYs0wgMutcyaWGzQcNoCoU0I4zxFoTcm/dmQXdCSIOJGWzxZSV8PjSjyUnaC8qWLmSJG4Rrg5K/v3gz4kHcDkl5eHvGMDncEPfowxkgQqQT5mJ/PE27QqW1cQlV2Fg5L7h8VwqMyUIgZJS9nxfNewC06r/osk+IKyHWbu2QEc0ix2rrUW/m2ClM92zwr67lWnsuOEjI2RPNKgLrK9gIobDYqVy/rKxMn98GQTE/vv6tTo88CuGgHf0dlTVnXmwN+tijuS1roWz7DLDkRm3HOZxzM52Vc2nizruHB4UWrp0ZOwDgEu0h/skNdMNDwAx12D+iIWCajOMqiQYOwJNJhmAnBcO9wKkZQBWKPr+1bM5cOYHENjJ22vnLstPaVCU0g7lPud7tFppO5waQFjnIpfszDqTOuSTivW5XkerIsnjSvaGjIitzG892JwZ3cgO6i8c81IBKRWncjRQluGbU024NcCuNUqXf5gWbskkW28kBD971BIf2baAQbAJ5SjmXJqvLg48Ojg4gw8UbbsDOnfTgMw8rt8JmrjRpbeXyCoBWbe/7gBdPk243O1n1bNRaYwQ8y5GcMNYtBBL8FO/9T4Y7nXJebV/NIp4I+52EjYDu0B6l4gMPvKaq+LhSuMUdxE35PjcwYumtF0mKqNyHpjR4uglKPRtvex4WWLGMvJkqC6j48dwwjyWAxsGtiBLMEW3OOiWbKpZuVqTy27tLYK02PZluf9ZmJmDR3F2c4EjQVKwm75MPbusDCmQm3+JIN8OZqN238yGmXxqt2zvX+uMfHWQCSXNvSIMg2qnlU2htZUhlD6DuC4Q2cSGl6eOaT7Xj0cD2XdgHt5/7PGH4j8HFE73l/JZ9miWbCWm8//5Hnrd03uczmEBhI5O9/f27WdLYMMXGlvUbOToh11ztPEsX7zDLTQz7XO0H7+ygAm2xwzomNvZQQ5EgPXfbmD7+yZOfjR+UV8kWINsavhmQ1qMvbClbh57CRndTbytt/t+IlUM2cxsPPBrw83rbYUIveu0shyQDbG37gEOgv/NUZB7SrdcNOiIz/vTx4zP/i8+OqiKV01kK39MSzxiz/74i4ByvAwlB4LQM96HxCa2tJ2Z7P9y742U3IKkc3JyHDolnzESo9pSEqfOAbgMYPEq+sVD8goApBR5iZ0Th/0rQ+Qo1KhI9XzWQmhG6YnYJwBt4gtvZX35E/AbsTJHWAssmANx4d5Xlm8xN1Oxx+sLOq8sxlBgoPgvxUzDKB5+jKJV4nr8LCxaX6N7DpJ7h1MnITu+rLh5sas1ZDVppROoChQ5qt/Hm5sW1XXAypIkk2TCykwqBn9wWYXIGXau7W9ZVwu2scKr0o7Hg1a09J8+jVJBwFNn2OyucEj9xMXjT6WZezTSwCafUbTTd3eFgiFmVp+5FAU04C5BqkjAj2hYfuSG2C4WsQCHdQbNzcONmiGDe2twRmcbcVzlPOz2dvavXsFmBBFeBiDhmt7K2qiAKw8RoEJkh5f+V7NpApcnTYxo7Crs00VRPIx8i6V0gS52b1mne6MdttBzpvGZt72dkoMM6jByHgkDoBMIjj4Z5Zm6bsfOJfWOAbH5h/oqz8M54SQVoec3oIrBY+4qRfAJtZWIuFKTquOcAZby3OmKSTaKXOVvq9/ydsQP0nXBwpuSuAFupbqX/WLHUB0qjAyLZ+3pnbFJTSvtAMypOJ6nEElyeYDwlxg+CjU7fDVP6UuoPjczP6D1oOkVQVV5Z+nkepPSpr6Dn2/XtCE1msNbJSw3XyNsdqapYfZ4vy9VKgcB6xBXZTqQAivsJ54wxQJM7AF37VIPoUG9eU2rYQKui0A9zMaHShvtQ3m1TZUmfDPRoi3E988P9DmqjwV99YIg1NAMpHVJSLTe/Wp3dx6bajzhJ73ogv5IbLRDB9BhWRhYcRZGv3JYJDZyVSQNltW43IxhA11edZyGx7mm3fFdYxlR28lkgdRfM+5krv+JkWTUZ5bPzT+fMzUpr5pTK5PwapRXTeY/Q/8SPV/ZVrr4srVAreTIBbZdOrtKNiyEvvB+nDtkOfGm6zp+Exdfqoc5PI3k82P8i9VXhqm6V0XHMDRXVD1Ah/Mb+J/Q+qr2sjbqFvTq9ubph3Lt7qgpxw8wKPRi634f1obUcLKtmojKN87Bf50JkTFTaHJJ2EH8KDP4QlYHWc3o/YUPU2tlbLPjynfqo2tXMxdak1elHslskjmEkcQpRKbRlpdsnq9nTv7/MhttLe9VNOo/3b3u7XhvFYosW7f5zq/POMv8lTeLGL1RhroJoCYuw8DYXZ9a8hWwlH4OGW6WHB1+0PVKrgoZ/zAMjL0kFL2Y5n4izhSr5Iymmt8Hoqc7rZ5Tbob25k02c7b52ekb4PuEGv6xLK5bpQCqLkleLY+jqARs5k4LZN+LSBXssJ1usPp6RIEhIORUb9MdwA9xX2xpoOygT85EpSjkIBlFTl/s2P+cXPo33ihjerxjDfHR4Jy9fu9WQZ3ycya1spDKvpZ9wRLveYw1tFTzFMyzKYOogdg/v7Dwn2p84aI+Cb8g99hCqeTvo3k5PvDI8r3aTIiVXp5f2GUZS2+NBY9PU6nxTU9eotMgEhxlZ5PjA63QmoxikRzf41DSVFk9fSmmehDlHVWbTb2LGP5gRBTT2v0aEAWgSe9eh+SMaZ+eIsDF7NWdV6kqKoqajB7l4Lh0n2tqJx2RhXJktGpwVe7nNFq7aWJG1TAgEAoCjnrjAbas5Be8myuMRoPeFUhvpjc8pT9ux1lvqMb091AUsR3QeZNElBVzA+c2Zoe0ErjJlQqTQ+UDVo7aNIdIH54RtD+SgpjY4xpcJFo57Jnw+WDrUUAoNT7X8Djp9Jm+wCCHoDou0AJ5sjTncGxpshtfeEQhbL7SZeZUYT3ZfUkwSxHG5NAEGZQJNSIu7X9edFp8MoypP63hmS+WK7hMjD2JnK+QpKop9K+vNnWVoGNJrZuTNBOljPj9qj1Y84j0jAwuZYRjsGlpskyg+4DFbQrV0YIW0n9h7EQKucYF1FqjI1EKVDaBc7W2+mxopdX6QggduaFp11N2ek0uLImtCzfN/oyKGo//jLb4yZ3L4GDxsIkaklZNawo7uPizPiQqZunpon9N9BQ8QQPvVyQUXKYvSF1tNddo0b+2sz36gII1HakljwleeKESuApdIZvh7Si+vTlIynk9hJ7s91KqNTFaaaJ0VKsNAR+xkFJLMQ5bT6Og4rrNp19Rtrc4Z5ZnuWLbayzdZwJ3RqpXG7OEP0XJdTUCwHMrMr9TZuj87Xu3FjPJgeqT/nmijEZM/VnHS7W7Mi0rGvQZkNJmai+k8ExO7VnFuwyDpLqtamIdtiXxlmdIi00knRnaUtD9jbVKdV9qVOuKO0vItsodgR5wE7tz8lERgZXAWw4ov9LwsYee8h9Qmw8agNWL/K+9dQaXICLvqeQlUJTKKXFOE26e35d2oAKcDhynz4ZGb8v42CzZ/uEExKjPtyOsDfitDG/RLKcaN02KoyG44hg/K6hPthImDmpZAAZzA7XNE5hDKpFiuTK3pz1cD522bnaC0Kn6NytNzO+ZnpQ+teWCYWwNHq2dJiqlWqRrYJS1XXrIqt5FqlE6x+Bt+zVAU3EVz3x0CKA6XgN60oz/NTuA6QguEU3Y55pOune6iiINsj1Gz4QzZnMX3i8638sCvlpyAJ0+5HXPn3Fa2gqim7z1p9a+ZW4+0Ifgem+94lP5jLC7N40cdLHBONWWKfa6bZ3HekdhIQuHeHRT6JQIemMa06RoNKb5NFaTG+QGlulwI0bpIdEBKm51cFBvApVFkL+t/nzuqgUlo+RYkGoSHTUsr78N+AqJyqpmNXxsVe3se2z6nxjUclUGLz7N08URhKOXiPiNZvdCIsN6IwN3t6HJRJ+ZddcZcpfw/Z7+e39h4Hrk8m2TP4sU/mFaadJpUmf6wCjfLnsSv2m5a5Says0rHQ2uXrR1f1rhMkMiK1etjWQr7IUOFbi0rlq04yo5PWa6aqTazjz8akgzvmpraCRNlFN7VV/IcYHQ8hpybQwZ7TAG2Ixl+3fDNmzDYbgXoIz8g/7djLuZwfRqiLO0oBeS11RatK0gZqOYj3pSGODUmgrSi1aJ6LWkfcYWegD1dUihYG1U/9M1Eu2aoXt0+RDYlDx1cOLuD8pxQbt67d2ir1kS7bQgEl78wMcEeoq18l7AVIbWVnnVca3vErGhEMylma3fn9DTk5GmxtvIrL0xNwPGbLRlZtLpOKA9Rvm1beWMRHSEK5X3djyxaRguj26mb0dLLXJEPReflRTcW6mVQNG8JBH5+SvZ9+huFmm3nt7AG19t7utRN2IY4fRpeS9TQ5NeSVgS2Sw5u24qtofgtwBQxhfI7AGSGu0ya5pRvqOJO6Vr0SYyjA08AQnweopDQTgiFIreGtZIbvPciUZTrBT6Tg1QVlU+SzprOSknZzDMDVclSUo+BAVYtawBcowws1C4MULQUWar65YKUJaO+pKpYSspQi8gEK1WZeWzcgJ3KbiDum/RjsXExCAnc/oB3Vz2+dGyQSLTmhSimzavNZ8w+U/NpJvnUz0MjxGriyFCoJXESmpr6Bn6cXTi3czvP2gY9Y7aU7HSMMG82T6CJ+p2hntwb2gu6O6FQVE7uxEOIQlG6krcdJiMax/rGjPkBYYHUR1ogWI0ELQfeRMrbI7ZH3tq9cdp7I+NxXzF38d8yua+lHxImOFyKSdXGHDduBuJKZ9I33JkzFTUS+zrRkvUI4CcYEx2PINpqHmbcITGzy5LydrcNh7vf0A6Fqnw7TDriOnAwI0zl08HoiLo1iIPrQtW+3ubxHXgAMxapvNNMkVcaU1fGYlpJrZjyzMRAKE56nXz8UJFbNEWaVjzwb0A3ogW6zFf9lDFK/6tMnQAdj+HrRrp9Y4A2H4px48gHHwGalhZPywPR/23ljHG2/hcN8mi5N+xjIa0WisV9wLl92/uniwcz6wQLHSnPop5/PfL9h0dCl3o/4hOzJ0S/cSfgOwW/eRPm87yDgEy3ok2CSZoVvQbeFOcJ9Ez8BokYI3sUQ5wftgOTY+yLdwEQrbkXghK6Z/v0NLxz2N0oJTdgET2+2xBd8ERggt0bTmk4InjUOaz18UAKfwlZE0ted4017LEMrPAsHdak/Gvs8IiCFa/aI9fsVpC/xq9KDGm32aTlHzUyulU10Ya+FiluOS/W3SGWHi8JTqOksPhinGVyjPix7ZfMPZurc/7FQw3AqFb4Hi4cknrFrQUJyE1PLh+EFSWa0J26dHDVJkTYwCtBdFyd2AWUV8iq3WPMAUT0n8ZHLRzmjsDbGH4EwiUgBMOur7HP1RwWbissVHdfhbQalHLsyROWd335Ku3tieMbeP9JPjXBXSjpkWfLGYbg8Z863zQvz0t42OaF5h8fsJ3Xa5eX/x1p4VyAaFuL0CLy167NjwCirc2tq0VkyWXnWKggH8SB2IKCWCgOyi+Aeq7z80F6U23VGibHqqu2vM2q7UBnN7Zrz1aCVq+7rDjMNSVLEIN4mjWNhDpEopOPCt8OIBCDsnpWY2DxZgKV+A0Pg8gF2PIbgSaelQc2deICBqUw/B5BY73jAfgVfNahIrC5I5wACO+IRuJ17IdI30y793zAgcDJWdwx+DurjzcPH8Mt9Iv6F3C74Xme08Xao5PYBuT0EespGu+ILes7vBvHGqH0k481ZXiIktxFpTriArGPCIi6Uve33iaCEbkj1EuljZIELAFJ6UoCTEByVRFLgYgqG8/cEhD5EfJqC4ipX5xBQ4sFzaI1Qs7PXBqfMmqawFQAC4V/79qf4ANJfy7vUwEfiZNhUQD2MglqWGSFutx2g0Oiujy/qOAYFrlgbmCfN+oipCXQpk2IEkTpps4Sgg7HUClUsmlTySLfFB9Ber4gLYXvmwiVlEDBJuDFKkLH7EkgK9va2p7USHXxrCXRxqSTk1UmN5LiyliDgSxIk42ZkrQB/LLaALWUFxmWLQmKc91K+G7+nZAe+MXgc8MXscC4wg9X872rodycVD2bzmWlrGIWRh6kYMmnu+OVzH2XZ6nVdH+2rWoSCspWRf27hMuF3IL9924hMBuatFXb+0MF1IpPDE4ERuxbnn+w1aOkxDt2UF/mixVHFJnuAksLwhLzF6WwN8B+gE8P8VqPkeru6wSYDoxAl81qHcDwz0AdcDfvPq8bvoBU4TxDkL2QXl02supoUTG+CeF/YivwHb346D83uAqUtjO616w3jB2GKSrChNmHkalolBpV4c434vytEq0TnXRQgwWlHLe3g4sTm0udKH5RGyt2JWzCUcotCtv0+BmTGXxnbkWx+l552nS6Qz/28zVilb5jOtEb0rWfgZvuP+5/wJLtyrYE/3PxwMqey8bzu4ZtdyQOjDxb7XUY/2cGP/1IrpFiEeJ4fQztH+j00f5R9qNd+xAKOR0pED7Jp/pvBLW+3pU+agU0TFFPDoPYiGxXb9/lFkLo7tLVEidvt3CH/WB4Uk3+u0AUbUjpDRUGggFKOKsLWFX7iJAPHKPDLcug4bvJNgNAI7YBPn84pYmY222rBtQkm3kRzKim86G0mhXpEPcBDpyW/KPox2bTdERNDZTeQUBZA0qD0mtq0kNdpc4uEfGGKtP1k0ppBwlj/DbyY0rrLnj/l83lWUb0eecL+Ci4g9o7HbZ93uVvl6fB9dp/XO4Ghx5/yoi643QHFw1bUTumPXcA/6x9mKi7V0Ji7r7XOanZWNIHkw4EI/q289a0Z1cWx0zNu/zjfDeE/IVnSLkB7wD4T5iVHXZ0kqDB5umEBhVWQ5zdkx4WWSMJDA6UkWgkIcme7ATbJVv9Tra3opFnSfZjwrl9fJZMs4KjWYzqTegYzYpGEkRHdlmyDd0x8svYxfTBtkVG8snvk5NClpCBC8sDAlGtJWQBb6qYzZJI6ClF+hCLptDvrrMWPFKoM6Z/z6aY8o3G/Z9qDAenv/LCI1qv+eq1CUmY9N4Hpo9704Aws+MjPDWUaUe2sYbwrIzeu+bfqclgPwZ2icXmAN/nU8CQPzNkyM4wg03HzhgcO35kHWB67NnB3NYb3ukrh2oEFwypgcNBNT4B8mvxl2i1LrXUiyxqq7lMkS78IJRKhD9QpWCALCQXpHYwG5x+M/fPqtj14GGPlcCqn0YrpYdG639ne95011bQSAenMEQfy27Ft0m3pQ+zKz+/zbItFq0LbO2cOkB4iqhorwz7l2NAhqneL7KfXt4iBR77DjNMb/KShSPciUN/TPnc7f8bAiGfK3+wqA2vFWdWPIOLgQdanhHdt4ZXL3wcYeXbHa7xwVna4DF12E5vN4KWqsPXhLzE9dv6+2FCooAkCLfISW7bXyaXoxMw2mGR93EHvC86GNL1K26aJSBHzfqZn4GwmI7tpvRT+ynd3BujyP+/IM8hR798GQX2vwcA4Zh3kohgzGSISrpJog6ZjAFinxvmkCa8LMVQFlNGoo4xxsK/Qj6GVkx0a/Rozq0Rf0k5VywN+yomsx/7iqXu0qZAyUQJwsqq8sqS5wN82e66j5jfMR95RovfLYwjQMd4XryhCGxltNJ96jBGLyOmLrkuzUmdD7UFsbV5ykPsd1rmJYP9dM/STHbaz0NcI0uL/BwZU2bxQ98tyMyL10FIzf0s8JfQWhrgLKFvqxC++bFxLRSu6SMzVPZRs3xZ5pwsnCUxJfrKqv/nAClIT4ekmBmvGYyfS3ZMTJaLpqPArUbGzgRmjCAU5wniDuIJC8WaZ+XzdrIbzh3OPFhUr1B8cgfulIQEociuLyyIvtkFvKgHRShKSKC0vgD+px7+Y0vY4ffa99Vmm92IjPM80S7UBZsjdWSUX7GNjZuihllpDPKZp9L1UDxRWv27OigIcXScpqXRHXXceOkAkd1YBvO46In1W0k/XvqRtPXmOvD49xGWnjVSXz/I1rKHt012e4qgHi9hOfWuwZltLoCTxmi57VUFRIiRp4VNuHrfXIfwno3x8WnWc/Kpkvh40HshGqUT9gYpto4YuoFx74Je+KO1y1rQU15SQkwXC7gHpqnSfYryoqhd2DTCSnt/LkvN4/qziKtQysa2LepgZ0dut96aHevKAd60x9fSoRitNkbxgWdmTDqioru7AixCEYzpGja62EnqxPZfshjNng5ldDMW56WbdLEWs7pMTHdb+UrmcN9GMXWR8SdtKGYXU38mvMbuHK4FFgzUkx6LPTzTPWgdj3RPEFK+2VGqeKiQOg5AH/q2AX+M5QVpg9RY/cQR3ARO8fSNULCypgPJwgJRXLJZQeOhAvOCMcgXA/wuLTwsKsQMjhG4W6aF14m5njUcLDDNF8flm+WvO5ZiOoH/8NB+l2nWsvwZ/d+mpjZqwIJtk6HKSijY5A6wHTeBj0BvK+Hk/JB8oGEG6t0175Q4pXpADYT4iQHVVcOolINMDRQByTMz5RBRQvDWIjI1eut/HzCoDL+7p29ilNd5lZJKDlQeUDRyaheWIOpqoSUU6uocFuqEN1+7RG2ArycsCd0bumQ8oeFP8z0LTHMgEgHfhTlzYQ8IhOyqZ6tBHq2Dpn2xFXApnU1ivuv19jgJ7OftldQlte5RHqSjeWsnqWAbISE/o9Yt2p20h6Y16ChtnenQbwLZL0lyzsK58qS/FOfLGErAoJTkeDtsQEdn7xzFv8yzVggVYNmdUoLQB8yekhOIvqMfvTs0kP8FzAOPpfGfuM64fLfnz7kOz+c57I8ucy7z3pzvhicuH+1Wh2SGeZSa6ZRKnWmpe1hmCJRYXLz8tXAACbdfuNCOIEo0W0cOCMGyAFoTobXGuoFkXecuMhcyQ5aTJZ70aZlsmu4paHu8EjJF5nXu1iTrhprWJgLN+Pw5W2Qlw03gSTitBSY/I/zS9QckIQYI1/R4zx/juBkRvI/H+FZGzHYtjoSfwMmsROyBQY0GPF+L2pd6NIOwxj0JM+kqCveuR7QpQQS/MSe/wT8CWO/b0xiw3Pmagc3Yh6/5BSG7FNzkHLjcOSNX7BjdEBuNm8GZG27i4iBNZu8CbGZ1qcmZ4gDnpqCcDBffIClu5m5rJMsr/HNOVLMg+XVcyC9NmIDlLvVFLtgbOHPcCJZy5/LHLNLSYw6YO6NntgUh/ZPgJGWxLgkZBy3NQ8fipjU6fhPnECkWisWRyPRYdbWcqTtjpoJhEghOqKoxucm7xBsxIeBm8J/xMziC6TDv0tg0q7FRSqOi5hhBjLmylSoB5l5oyG2EfBPHZMTEwZ/ibJIjbr+HHDSZgk3NOKefjfTm+N6BXry5NMK7aYKhAd703FbzlTrisXJjlmneyupq2lzFt9nUxcp48oGKzdW/9NIOtha3prmSzT2KPVDf+lYjKUX1dpgutiH0/efLTWRz8eOZk4HxwaBqNc1UIYrbO4ohorRCFKt4RljNoXGAD+ww7AGgBkoVV839zQEdL6lUlb0qvKXJ7GVOSZL9kclIxGylmcSseRJGJgdK93e3oaqvF7KAfWr1DZMa4D+FqLhMMz7VRLLf5JRQwjs1fpJ9jl4OUf6S/Wdp1hIbWr9+uYhuPwnq/z1M5AGVjAOHjvh8Qg0aGV8/RiNupYlE1KXUsKFtJdLGWD1h3QskGmlLikhbCnSLdLQL3WE9SyOhIPn7GtS8YqliHlXzPkie273YbKnZBwj4id9s9LPKe7MTA6Aeb0YaADU0BX57HsbxK43KZsF6iyqNt/M4twFnOSQSU6liMSTHPk6Pd02Rtha6VaFbrXxuijD9MVbuWDAX1vK4q9LQ0eSsWDTZGtI6uYh6a4dhCF9xJmyJbfR7V7nzQG8/3O3cDcsR9M0RzRGCFUA00vXUA1S9QxWkqrx/uPJ3cx6yMGL66XqHfOgq5fvsEroe6rcwWvSDKgc9uPrpO+UqlG+zrV9nNO+HFOwXrtL0DvpHeLqe3o826g7Rv5L0KwtqmUAA+ZhehbQLQuYrao9O8Yj6iiQ8wO4zJVeTTfdDlD7hm+Evy37gWe64hLr6eVfu+qwa+0tzL4VXOFey2wBndhIoxFW+uUNGAxO+E3NriRQmhVSbS5SR64Zy+fVD8+GfndiWnVuNBpqWmJjomBYLqkWrRtM2ZMRw8zF4bg55/AIuc9wWGBuEYQP8Y5y1yzhJ/huLHzC5T+3+hOJF67n5rr/EqZTKjsHG7szkbRrNiAEzHBkdE9OiAejqrKzWcnHZ9et984gfCUgChZBXSwRMQKifAY8kGIm5glUhQAPg86lSM8smJ5LZFA2ZaTOz5jBtGLKvzAlt0bRDvDlMN8bb6+Dx8i9ohZ9IgcZX1AY3gCDDuhzLeLS/CK0gZB8/aBhtITVhH4UhtPixHoIQICKPWD7k/12ZAC3nfvX57j9UTlzuDwTlmwqytv1KxtRKMV0acpayIDuKlqJpxQCfzmLlpD05GsteSaaTokk0szRMF8Ye04rhalB7faeuzBerPm3+go7zFcah8TlrA1cFrVqRg3+s/YTouC99n0qfT7JJzfWgW43TzST6uw3Qnv/yr+W9ft+k2aCc+54LEpXf/IayiXn+gK9bcqJD7S3TnBKofUkLBtP8saKfSeNe559NPTvvNU66Wmy5n74d0XMACBAtRYV7ny5Hi5duA3lsLe2nhXnKT7Q8dh5tjKaVf1CmyPOfhJ/myULK/MIUTc1WgSkyjSwk0SaFkzQSIEgo0w7DDk+MqZ2cGx2dR/7HmCacBhxn1qHHtDZweDh69ybk2f1vuJIDYmGMXLA41SIt8dmrcRIhGgq3jghPbf9X+e7dTUwnbRURkapRdPfaTXpKGhYr901PwwBjo5DA9+P7+7fFDbuC1otjtnkDeXYka6VSLIyQeqtSzVPD7j0YJRLCIZGlo3mV/hLpqTKJTLLeslUu9clShY8fX8C4XjGx0qry8gl2N3s0MytK7u93bfwmp5UDWLD7CeTCR+RJ5ImFhRMwu7KwgDwBVGE91dU9QpWxABzSuWics5yvRkZHyX92znLKdNUdBIWIjrEL1C/0aghAegc9nVVNFwAz7IHzMZEnFz6eQOLrv3TAY2OIDmOhA+bMhbZlPrUaTZ2PwIy8RacxszPN8v+VMpS4faM0RHKh94m+1BL1HBgDhiIkH8I5loZpudEoTIF3VH0p98ck2Kjmg+3tYmvqfecsU5Zplm7r99WxJASYV1ifcpSiTqH4ilMavtMpZ59pyqnL+hr1lMbH+ZQTX3NKwc9JSB9RU1785CmFD/oUUiqcS+qod6azj14oRZ5C+zwGMxAULiTxuEJMIyZMw/al4GOahVnNIc3ZVU9Bs/w/vcwVDEVa0RTNIofNwvroFPy+MF3H5K3jpbx0YLzn5kbXO7TQ3YAbvcVBT18zFPIINEBFIAEkBFAAPbdvkgJMFQ8G1ANQNU0J6HoIqAGkH+3nEvYFmQftM98bbB68t952EKBHBweqXQ0CPx3D/Nb088S6G9Zr/rpRMcxqR6xOWI7UpjKdft7drbG6ubbQwulXzG9fYVfEP1D3f7f3XQ9mgoC9RyZ+Ls9EGm58Zb/W5AMni0Ic5ZoTMzWsdMLq5uuP/93+7/rOLtou4HN4Y122tIEid24irpySjkxDLqbMsQWGIvd+mu0O52RIN8ktvpf9km2Az3G7rCQct8i9h07Sh+pJE9AsvafI3SBgz3nVotJQtXmHU2xSzMEZd+PpBF2ALgFVKrPLybWbA+Gu7DnbuiWNrLMtT0QChTPLFDeXAZg9972k02Mu4fIMlzpUuEtY9Qi41KHGXsKpOi4Z8nCXMHrSi35El4hziVqkw8wxCPg8NidEb0Y97CDODM793cd8QzR1NyWW6b8ulisGZ4gdqIdvXKft9jniFHEOBF9sY77ZLETPyZCKnUrrnlhPWT9Zt8LS9Q2COLcdgm+tgyA63sJ8wHb41CmRaZjeJeAGdfTWrT//FKCCsD3Y4xjpx8tbt4cp9HNfnTdi5adPD9h+PTDol/p699eOzvT8jz5UKOf48d9+A189CJtf13DxTjZktli7G4dPtiZXe12EHcvepi+2XJxe8QbheJGXn9w2fNLd6L5NQ3zSu2UwjXXBn9Ky+ryVcrOqX6J9OYq2wwA/u9GBtH3gqycas2Y58Ow36UsslzAOFxYktzIerQMWLG6Fb/U6NppxwrFALE8RAjKf/Jk0dcxpyZ7SPISi/H5xXnJpivSZzKf07ktmR+0KutikRsHC24lQ2ZEI1K4xKHFGNnTgRPff61yds33/tpeaYznhZpzm23uB/544JpTs0875JGYuUy+anU1elClhfuJ4twM1a+JNkXLUz92CWbSrvhxUAPlfb4si2C7x9x9KLAsW2QRGV0XGYMesGZ2WnQz6qiDU0Tcf9clWqrZsDYBWIrbtgBoo1rLEQj42NmK84EbutXjbXwAE+Asmq1hdzt2MVYxu566OdNQo9Y+87u61kKy7rm6bGJzs7laH0UdN56df1tXWpqXU1AQHGr+drfj+vZVgqAVGoSei20nT3qnL/Y6HgvV9xmHQYXrz0s3TzKOZ7wqW+/MksC1sxwzyhvDWk+XeTVXet6dZYyXdgd2HtwlzvS4eW7AXO8fuoT0+0DXwHhOOg0h7t4swRaVaVtrdNeMw4jDz5ODBcNnAwC2nAadpD2Sq+ln6yoIsVmRkmz0+Qps14bgd5g9FRFIszd8r1ezlBGtySX9k2+AWYRLALF0qZ9ZFfUmuRKrF3ORAJSsqMlDby8sdZ0D9PbDGEelg7ZOkqQzCMsN8Hn96bXyX6ma2bA5tZjBDzy0zm3RbGqMaeyrrVZMOpE2cScM01oCdNrxZ4yOUstdvOX4MINgbNXrvFkOlWDaPNh2kyjvavWEDVe+gp9Jy2vdCT9Cm/y5MWbN7ABiLs7DaRG1SXmLecVeyXEQVEHhRFmCg+lANzvsBWLDbzmX1if87EFs5OhYQnpD61DnJ4HpQB0Jhv/xHOeXnj5pwn0D5+5lNu8+YSe+KGfdpdEml2gGiIoXsKO2mtVmCyTrtrspuW/5R+Z8/rLIyUYmsxq1EKhMrPh6YZveAQob9HJ7JGFV8OWN7JuRRRre2783laqH1tbPUjDMZatNr1kK1iWWa8839FvvRVfCSa4YpK8OYQUmlpUkQ9a8XBeGBRtkCw1ViJysslLEc93pTlMbAvOVx8VRE4rJi22+z82TUJ7H4E6r/hyz5qvup6dvdRc67dzkWH/x2a6n7VWt7fyo8RVtvMKQHIT118MUbEJywb/JQhcMvYgx/Ch63vtWDN1XLA1KgaF+m8j37nYUy0i/F0FPnfzyrm3EKlepW0Tp7Lb81Bf6xf15ZPP7X+MkW0qvuzfzI/gzypNuH1maz6XbMhJ3a0CvLLYDF8iujxat267qYt5ld6+wiOIg1utu6NQ4EP22o7w8wgH/wlRw/woqbFD5lt/O2NItc6G06zL2t3D4Q9opLnHPRaMFPt2xvs1i3rY/cFmDQlcPJJLY1m/yWDBqSfY5wxO3HAXcCBOls+/rKXavFcN/jR32wCI8eBYG+R4+diatdnfv6ZlwmXHidexAr+vpWIGoRjSI8BFoLCIsA1NMubBpG6ZkB3c+KKTNr5dKKzzvmOkrKxIPmm+2Bv8LcxvlwL8cLcRz++BF5Anlc6HFAuBw+Dp9w0zMd0JudN5+b+eleaFK57qvsK8+/x28bhYPQ1i5sD5ykdovtMehiMU4J/CNJAsDOfZ473HxQ7CFSU6rfSoOz/rFa5pFpgROJfM6T7YhCsFAoZFCXhocGicbSWEvMavxyDhx1DHDvcaQKCgSo+vCCLH5EiUkaDXmcgXCcRTEEpU9UapIsNjmDFflQIirV+IhEqRssUEZpcMuDrMV4FTNhiWsiiMXUmCcRoW1DFK94W7UgJbS/MfEqmnPIh1/Lio0V3LZqkOBouwWN3Fgg2CG4M4p2j963lx3PdGZHyUEExiQfeCZ5tCrcXzhmbWVsa1y9c3VTV5NOs7QgJQaw4EXn4C9XVphzEAwguUdwxblIYh5Rsljib/FECKKWeDKPQSQlLh2EHn33g5WVSaIOefSon0KJJpZW+1b9OvpeHGRWZ/tPOw7/d+ezMvYwLYrVSEiHkiSICATtpstrQQRKgxD+0YpVQbGIKiqLfklgUhYFNQKeG97qw/2RjaAijwVpYK+0ulq2Lw3UVV3LCSGW244tAbuk0wlJYc9tq107Xx3bgWDUMHkVhYJkACBX5IEIX6sjK3giqgq9m9i0Ad3EQIL/ikqiMdX0NtMtOYxlKBQGi+SbVVY0xm1JPimkmZjBVjvK8+39vmIQEkLvJlqY4Q7G3tfXwZUORE17Gc1VUCXnkF+/TgLp/NfJwXxlzt+RX78qLn07daanjbSqabVpWfOmpxQW9s/zv8fFpaR+W5+5dqBt7HXzGmEpWDXJOmhLgXXC0e+x8clpk0s2GtRbY1Zm+NZn/5TCwf554WNs90XXZawbaJ18cAcvWwkmLaXmzqPfYuNT0sb4tlQHsNl9kSs9A1XPippcSTkeL1Bn2ER/CHRdlEGvR0XZrbx7nCKIz1BH2wR+0Hk1dlF3L2WtnMT7X8p55LdvI8KeTwj6+A3tEZGrOboFj+ITYFcFFakgKJBUhStM4KPwW4Y0OSd97w7vPY4x3YUgyOBwZfpZO8+S0mGZExbeZYo+sXf4ki9Yv6gGlcL9Od3te8lZOxO7RO6sIZ69jr69eaCbTeJSTCjXS74HR//MRaXUuF33xyP+RVKLkRVt26oRekQ/VVAVxVTkvwi8/3XwdENna7A2YdVSILOm5njt8QUVB4TJaqPMEIzSza7cBM6iHu2GUumi4MSActweJS4KGb2xvIxYjt2TRJbkhvLUiEm9wwSYerW4dOqMkhkWTlXfAKFnzqwPBW7mK9bYJe+5f+xyivslMDUesTgUBPfpo4I2jOh/Kc5zb9c4pWR3FHs0STySSzYNFXs1JCxe1BDVLl0Iqfsf21ZBrym4evbflJ7x//KvAeFeh6gton2prl60Ufj//5GjRAlBP5L/oPxxBSrqS0cm4n0ynggX1XheH/Gv5kKQIA6FxbrkZT34YgqJdleWqoGr70I45433roakHZ/X5bq8Nl1lsAOuFrIG7q4Lz56/2oMX9HZeT7YUymmpjzeiQSKuIMlPWxWahE7C5if5h08gCEeAabz9YIm1kB0RZVe9zg50mWz6uzGP3g8iofjA7M2OsdPBK+QJYHR+XWBUn8aFudhf0JtZ4+sJDNiEgL+n6i+JkIl0koiUFf4jL/WvGL77Qgqh1iSaOWOR+NSUvzNvpy/Lb42ag31rbGalZogm6/ufelcvP7YY4+uEWLmfaig44Xsib9HcucigNxO6IwlHSq6sfTn2uzHz848W6W89IxHO75bZuARsikpPMmugZUEyWt3Kv4BXIvrbjTs/Lt73nfZb4hmbs4m/2fuX8LrNeOJZKgDz6uPOhinde7f3vC9uX8Ld1/m7pKgESSnJ3udnkUIXR9drarbfpQzzolPQ6cOFi4hCwXTYUupSR4nFQOeQl4ansdBoGP+favRy1f52iJfGigLRKKxO7hxNp6alOOMAQBRXW1TzGD635ol0qM/c2Uyfcci9ABVnGhnV8cyvPGsdldgCQtjbTKvGNu/O/LBdaqNr7dQxKA7Fr0BfypUq2/g8t/jUu0oEJEnI/pbHpCOc02UXX1a6iMwSft24gX4oGHEEMRizUAOjbNTuoUFeIts0Ak0AaU6ILGO9UdsGdzeDnpE84EAyuEV4iGvjVFg1MtcBRqj4dlSW0EIILkEL9iJns/s6iGGfkcjrhMAdkOxJDrMMs/po+bEzkGS0JEj7YSov7p5mzTNVS+KdzaQ/ecV6QUpDiQZSgVWp1PBeQiJUrIVimdoOmQL3lElNgoqXQBFQeHFGEhQHLctAhKPdJOqTuFv0WzjSN/q3tbgZ+sxcnDn6HBh0oX4yzz25shZqhc5sh6uAWFLyiJVdFni/0IY628FBlPR0+KdTlU4qp6tO9+4qGClccSLaASScs3u1bqPQoZ7ViBxEbk+zHqHDrknhmStMFmWWZJI4TPYYNZGZtIfIZ/oMscgpAsR/+Yh8Yj4pKiYhBJ595/cOltWtJ/VlQfNyHcFsPbLahGbbEH7C9kQg+iSDyIs8a3s2/AcIit61li094fOjpMrUUQmyN/BkY9+34X8CUwEu5Iemjrb7Xw7zi7eetU+MKa0kMc23yO1WR8LpYL2nV7rzavi3JAQHUVtV+47zLukaZwuSwSez4jiP449a32nSlV7O2mF3XyNVr2kQsTtle2OGyq6H/U8vb5qEj+aQG/8stRvxCHfqAIWKk3YIaKe7NSJtC6w+joEZSd/5MdbmUSZxJfst9oWn3E+AyiE59qDtXcSFFEby+8CgtHgRC1++J9rx5Acr2ckdJ2k3Wisb6/Ci37QVYsuo8qiOColn9OLQEvO3v4KccbYrs5JJTJYeQb79Cz5LlLOOIPm3nWISQO4NikVREVlAmZ/7Wvd99UUk9eSfB3R7nAoQtV1pJBwQeZT+fOIu8uPZw4/a7RuOIDZmeSES4RoV1ISY6ol79I5TcB5EDXmSPb2QXkD/8IY9UZ5Q8lKwBLXl3qSfi5nFP1tehfhVnvHMulrCLLlqCQRwGm+Zv9lFM88YT0+0J+H/8KgHCB5oi8QJRr9PQSl3oTFF9B8+JmtPSoWZaJ0pppQjO8MuFW+0F8dUfVG+X2DgcfmdJZqbMy9MifT5x+J3jqb3HLPZG8T2Sw/ay0obnUa2SHf1ZhFi/lOJvqbkoY6E91IVsz/t7EXysSPDMRF96F9x8dlSojRN6tPJ2KmRchR2D9FFcBrYyWKJpe+RTEK0WUxNSXlClCOr0PQH7xfp0cR/GL+yRGgSWo8qRuej8S72kgdKCwWxjpXIYJeaRSZGH5hVKslk52ZZoa1qQGVzr5fv9+MN8Bv7JybmAljWuqeU/qCSk5HgvYw0HhPzpPofJ9N2ClKqSZYCQfkvLKSU0m7q9E+1Q1XYPxD0TxhloFBJb0WMu3NiRUEJzJOxJE05iB9DVLPxfqhAs0dHvlv1cm4WosQxJzkuYTDcSuMaZTcxiNhRokgAnd6/QHxIY+oX8PCPfK+dfv415j6ThHxFwkVY+T0RYRUfv9ZCjIi0ER4alNlo2ONV8YnTjgMOt+MTpEucQDA998QaXQRTG19GS2e1LL/xAuum4huoPaSY9M3czdZPuWlRVE9rvJSoDtIG5QWpcNZShu1nh8+2js52xk8Na6AufoWVU2GzlzvoSnjauw+xDFHbaMvRcziDds6HTGcSDjl/Gl7kanHNjZkMbx2VGib0j5PNunZNBpWW6yP8xwr20fba2gJ8MjAJ/pZpjulJblmMYDlE0fZuKwbbCosLeznaXgozJqazU8/E4Y4UOD6Z0R/J7+t5SUa0BRcJZ3e/upw2WdpNN6eaMroBC44YQwKAHKMAQLAdl6YY523STj2W73wv4UQR6fk7U2f6t35Gn5mFbXXuMiHHJz94kRl+68eQPIxcIsOzB56YgHuIGgSENxnp16zVNvvJ61jbJmpYJl3OrdisTH3rDl5XBBR0GN/OUE3tdnVUyB9nkKCA0yJ9F1mYAKdf7EVM3GK7k8Clt+Bu+aQnbEidEbLcVzO6ES+wge6D+v6x4U0ZfBaZeZv/QHK+ZMOk+9071AuSV4LbSFmvbjndGhi4IIYqMe00IJFLYhjAnq10HZjd6mcQNAiwWbm5Wdi+xuC3ZRZaN/JXx2g10KTNL5PbX8orLR3hOVPr758I8dz0vH9S8alpk2mBxvqJLdUh1b85wFivhioqoDalrihXI4iScLMKdX4FU0vMyxfkqxlTC5T1UESGJhxSLzIyIXkWVUl2XEL1g9KAjOKYSVZSNz8BH2dnPwJ8OCfAx1btDlB9DTVQxDyNpPBV9pmdnpv8m4N8aj2dSkOQh8DsrE/OIg/xlEJn5P3IN4Eh9Hlf8jvQ1QRHNQX2we8KrAJ3w5Mn4DVAObgb5ieRERhr7jIkqrJzb3VrDCgP8qogcLRY5K6Fu1euEneRu6DwUVT/gVP8oqVSUrvP0o/yYKf1hgcU9IzHzBMz33N6g/XOB7bxXGBE74enp+H9RArBdvxqSBaNwjfdA9ceSFfWqUhqyDrAosLIE0bzwHsukrvf2t4xIQNjlEHYOLf3GcM8kBprtVgY8tTCBHPBHVmYtehnAO7J33feME/ObjwTcI1VSTtOXc649mxAh6KhaSgd/8NMeN/58H1PqlWh7QfkhdUKhdZNW9VAq59nJ2ayE+YZ5UPG5ieGLwgvWfqMeA4hnaXAS0D64/VP4Az46fXzlgeU7TqKhdqCottOebCVPOqpW+VZNtKiAeatAsf0AjUVtJpB5g3LJFL5T1cEVW6LOTDXT4T1HIYwoeeegoCpI7VBkf2qPHAMfv8BeRQ+9uHDMWQbdHer5wp0YlOWU8bOjIzf/l////XMOX5k/ZGdSq9LLf32cW7svA9T+BOXp0SCE6gm4F/e2WmvCSQQ5NZyoL2mU2hEvoKNwnmhEX6FNFoFYbDzWMwrjO6aaxVRPuyaDlMf1LiLNB5Z2eirRXJvN57Q1dvbRcB3g+DsSlFstJYbGA+kLv89evRfthYPArXc2Gi3vEC/ZDsgiEtNjJEtT0rcvdxk+e7E0VqMLDVREAfskv0CJxDV0Wbm/VBSWakS6l0SuHu3x3uV0PZZCCWZ90ebIavAH2bMXkdOzZJpZJJJop07gMHoTMNDa3QadN4ANT1IXujcQbSmqyvO06ALoZQn6UAQHWthcWvo7NPiQOANuxe6/ecfAnTgq9Id18inBm0n9xXdUL795Rgthsa0i0NafFtKW3JrSiswfnqYUE8k+7eh+vHlIP+gy3kiF4gZgYO0cGO05V42OR470YmIIkWS4IYJC3I8fVOMZSNDTcNbhEMu3svvRflF3lO3sQhnQmqTxhjLTWxSvMVTZnh0OKJzwmKxYO+Ntmw0UUM45muuqI0rgxYvBjKiHJNB4dwpCBLd2d7/vtpd7HwwGahBQ45V3M/J1+IxtSFbDWmATFi3snlTcEoDmGj0K/JIve+R4lc80dAApXT6Zz0U7wM5niBwyuuzmdoJ5I17HYvfil4Ydd6xZ3nhzUhRXa9X8n1eBxCiGq4Q6kR9S7ALa8C9tZ4rp5XL4TDiOvV6s2bvu6YW4Usq/mqQtad6bkJGF2VEgyhQnIGMdlXellqw3XLdbSiSnqACDfhfC4pygv3jl2EUWU7Z5Sr7BjVobYSb4qweBco5Gon2Edl+uuRelEViS/o8033sVxTFaAixLLHccd1OqwiXLBkHFNbbJSV9+iQRO3bv8M78j+gBb+NKxvnP66z3dCTnu+9NPRDBcagFYrj/zse9VmVP4oirI65UldJPJy/pjCuzDswGx5KE8a13LSMb4gELFpw/3/cdDm3ue9rs9YcQG5eF9o5j/bW85meBIv2yrKmrgJFRDmKj/71FEvuNyV1kNvU2XVJOhx9JeAsbDWIzywsYtFCrMnRgR4vXgafQFuT5L1/AyRzW4n88VodlNFMxE7emj6Z2OLICvlTCXkeiYzayPYU1TFlldFSvwwoJpxiNCIct47/ulqY02wkDi0zUzdpERBa3hIkxvVNuT4x8WddxnDnpehx5w3tZnHe4k8OiIbgaQvRaZpXvFbY+clAu/9BQ3fChHMiBd6L9N5ks1x/I/d9X8arei10Oeumu5szXAZYBjmnA2Ppgyw0beON8QuQX1A2FhYIcJrCQCau9rECHlbWJVdak66SjBvE8M+4zOvhb8GHRx7ErBLXb4QvnkO2003ivoRu2N8ZwXndNZPuFc+0fXp1+j61FFLe3FweL6Ag67IrTHxaRG2uwFKdPWQHFVtWvtrln1dgDNQ0IKO/09Dygq9iG8PQwaXNu5Xl4wHtxoofnjUJvMM8CUoO5+SaFcfGFJvnc4FQMFKvVLhnntSHgNceOtyDWII4fD0eMbhYIKBvhcIY/HXJOmDF1PmQ3uAh6aTMm72rEjyzm9RoFN2GZfk7gJwAB3qfbry08C4o9PsuI5jBgcaBJIELC4OBHR3SwvpBD7l5baDf/6PkR1Ml1RGe2exURbo5/lu/sZZuFa5uD757fzdsXrnnuuxdMjma88fN7kxbkEJDqb2Ybxv9jvDan+FPSoEJ6Vd91vxtUvW4E+HfsNidP7lbjBf+KedWetu621YE8MewEeq/+vu/b0xEt6pb7LZR2mJGajgZ880M8dHJ6qLfn1yDwmcnqZqB7kPfPCYXHIdP4Wy9NUT3EEzEW+xHtC5v2//eFuP/+cmQMJh8+AcMRGGTUJf1+EEJraIWzYZTy28MnLXTmM0p59PB2msXoxx+QZ/a/sfmppxX3bO7x4/ZN1RIoNRWIgUQlCcR7JUAsPRXub7ei0JjaaEEAPZb6xHHCaYZCnXMadXpCpd52GjmfZAfNKVZ9Wzn1Ll1qoq0cQ9FwYtlxbBAtdSzqivCaw8BMBkJTX6+BiFJGaBgRmMJv/OPH54+g9U1ifWKkDkVvYGsDpDHUZ6KHnRcghOqIpvsRbqeHDEOn3SLuX+2r53bf0kPwzHLA8pnAw/K+W/x37KsI1BmcAXcGFTGg5NJbqAPUFvp9cLuswQpS7DY5vbnmBRnSW/TfHuN/pccFjFNuXIbeoYXBBVxGi4OewXVr2BJTgMYujWZdSLFdcvvKtnskeosEXFcjTVeq6Eu+qwchPd2N2wIGBieAQOm4u1eV351Q2CXjB6538pt+8r7K+FGW0nuvMCLberVjobosnB5tO6XczM+/2dOPVlWNsrvZEgDCbpoIuMl64muBMJySwfDlpkOuMP7PH7Hkhvn7z49Nr+2/Kv6PU+uHKKMC1IbzDvF4wJtmeQNelneWgP4AfAehBwDRttmfKeMXWwkqjRa/v6KvlqA0qL9e7LhO0QgHkM3IAS7dGB4Fxnoh/vKBzXOU8PH0BcwRysSN4VSzBmS+h3RIYgbmHNh92aEh2FgFHMdt45NfPc+QzZx42S7u+HzPHa6wUJhXovcfwLBqprtqB+rrhx/kmEe+/UeqQsn4amxu6iK3bbGRu+gboMLmrgKqUiEk8sBCc7thYDTZoyi5f3BBiFRxaAJNQWl6fVqwUMcAEUtE2fq9y2ipaRQVBedH8CyalvoD/dzNU7rYJv3xFNCYR9qtzzFgfNe+br8WOazfcXN3e+YwuYcOkG3VjYBfo25c4lLhWu1a4SIZN6y6yxkLK9pRiw6WRII4U9olMS5GHcRV4w6iJL3gtLfqHNQxOjjV5L5jP5zS4EhiK59Kd3gsCwVRwqbzZ6cCrG/84pP3JMwH3+EqXL5ft5ufT5VSEQd19GPf1iGsTTDYD9tqbV+DpaCfJWX1gPcYQV9jXDNeYNJkSaCfu7UZeTyXKJM5Kj7v95RTx7adFzaBKAmf2NeVrq6fDozm2TJIRgFve6TlFE2xxUax1S4ZE8u3UHJUca5ptACpF2WSW6nNC9eG52krT37myC675DZRZD050lb+DtSXBmnb/tgkywk+pJYDnCDe7sUkBnnInJUO3sJuFvU7LmOTQhfwB14sj7MX2Y/h8UZ5ebQskjUX6xFFUD+5ruQ/+TLIHQevZRVhbh23tJNNQ6+Y5tas+VoNjfJNMGuKDMx4cmtXA/YB24+Ku2qZdO8BHJD2rvaSxt/1E6r3c5cnZc88z0GrIFcJJ4GyKV5UnjEk7vFKfwsmufbwtoWZx9POTTKL5MtcSt4bYErIwSTE132kTybxbnbkRZ/3EI6TFMOC9ER02QiGMXEORLBhQeAgc6Q7QvnpnmnMygBXW07yRzEmTAcEnFKbqtc8lg2chHiu/5Pfl/rOutLrOMCVPRU66TZpu9CcHnngXBFblDLXHHWg+0p4XfQmYCAlCNLoFDiebubEjhsv9ej0MJxSwiREhAseHjNwg/i4gwN+0jnazisISAG9z3IgHHMsDD7cdJIvxDfdsR3P1s6iwzLZdz2N9jDwMO2KDy0Q7HSlFY6ECOfD3JkOloDUOkubJog37g66+MsbMenqid3syX1B4RNmDtAbmvmRVf1j2rkTQqbEDyU+68sS/RTqzIZTvugF+jl6uTZ23OlVG23l5M5hJNQ0mYl82yJMY6iAzpPMuCSqv22TiATxbX/R4nMCbW9NphE60LzL6BJvP+4yThA/R+oLCrmzZIg/Q/n+7n04JNXuNnXRjfrwkhQ5ZmpB0MQqAQ70uIpnxmygIA/09gE8c9LGMWbc5xE5xJEiaU6FZJCe2lzPRKNLjRIi1kdgKG3D/pvXgUiiUzzOxXX0DdH2Nsp/+Me2qce4uY0+IWK0ae5ANY0O94H6zSIUL7fj+m7j4ZekpofyJkmqhNiSHrR9NoxBcKklxJsR7yeR1dFD1ysfVbZRtuKvYVn6jQl2Pa1u4/1qD2QkiHdLcRWV9PXxjKQt8+sGSDomSomslSIOGPqIA/R5PtYImrcaC3Y0iGlMH3P1itsQka2VCWv2OtBAfKBfMD0E8VyEj3bzY8Dob+6OvpD/mzAUwDd1HPiKBDzz8kduCCA1fmybvXKohuz/E7Xt/NqLQ3wwQ/GJ6MjbD9Do8Mj+K0bH8wE4mkBmaP/YBVywiwD4mnkfeGYTGUDe3UnARwxaUNT3bdOUSL2KAEvg2M/AsPEjLAcn67r7ORAI/Jywwvy83LR6fT4MUw0BZUcBqlsx8CFUl3wEsgs+jOo9B+l+56OY+c9HowbYx1MHBpNDAqcwolpIQAsxbL+gi7VUsXU6bfqD/Sg0blfiZ/7HmLomvKQy0fWfaBgibOZ7f12aQhKr4WNwbCjFgov9gtej6PK3p/QWrY1H5vpwggZoIYbtFr6ssrX01tcp9sD/YD8KDcZOly/7H2PqJx5eHp9T+D75lmqnuhjneX9dUE0hjWWr58gHqoZSLDi92i94PQqH6m9PuytLaflH+ZH6qYGvfbvcNibL/0LBFGXZ2nkmeVe3x+vzA4gw+ZUMfVGhU1UqbazzQRjFSZrlRVnVTdv1wzjNy7rtx3ndz/v9AAjBP1aHn/mLxLONifSzNllxvCBKb2KWp2q68Twxettxf3b0AxSEUZykWV6UVd20XT+M07ys236c1/283w+AEIygGE6QFM2wHC+Ikqy8soeqG8/i3R3bcT0/CKM4SbO8KKu6abt+GKd5+YOw7u72h+PpfLne8AQiiUyh0ugMJovN4fL4AqFI7Pml25LJtbSv7tJB/tBMwRuzudgO1ByO07HlupMvSmhRD/15p/Xy3EgK4ySTuOEMGwFlnmxMMQiWMqEVQcaeaaMJkGXLsC7RmyVxI7Z6MM1fTrQoy++ic8ieSqsOSV/d8CmXp100JloyZFxpCH8cCFF9tPrMeIutGbpuo/tkB4J3Wl6oZ5jlk+ZsTNCcGr39RuF9xv7h1nxmweX15K+vJLegUOlwrvAZpqJ9aMKNd9OSb0O8UwvCKXhWWTKu+6c4Xjc79AOLJibjVAsaLlxwPNufYt4Re7a3FFttkQ2GsFyK6WbGWnMkFEBjBFBjm7AurDwns6iciBeuZOLjrlWpFu/gQ5vLXLxETJ/2LucldX+WyrJkeb5I48Nh8+ibQwqTj8ioOX1Sw4e6pLSiHJJIR7GdGrTnl93FqqwZSvFCOc6jMR6N5dRztiZcBXI4EOWu5pTdETV8r4xYPcYOqZ0M1Iz6PB8yFWBZcrN216hjIKir58345V60wkPuUoEinHFzwO7eDs2JsCdpqjIpZJ3zAr9r1TVRWbjEECDR7iMFSxH1k8bLJxVEHZgyUgCZBj6JAsu4Fawee5s5HT6ZfECmdIqKegsoOglC/0zJQAAFo07pPAWouhaIFniwH2U7ErVzgYyBSKpwE/LGq2t3rEQDYlJfXeokwGbtRWMagrd5S3FMmtEvfPV0RttXVhP00QgyNZWmULkKPDVwgXrMGUa6Nqdh0qBCyjYstQkmtAAjAXvZgIZJBi7b7v2FhBKtExYJ5a4Hu+d1oxRq/iK2eki0oPeEj1OWneh3JryGGVrlvdqOpOqOwGz6+CWn3u/T/a3IJ3FBevI1zIBdukX8BL4ds1y7rUtSRbnjDP1etwvSN1HUdbC5r8ddUqyiwiFBmxNv9RpmfXt10aJDAFX5oH5CNdHabugdixB1rUtLYdnmKXwcTy3yTOLZGQJzetKitZgpIPjoLzMF1Ton0NRLyhu6dNyiQUuG6GMlWO60RaOWzTX67usKiuFECGN5oxXp5rRsZAG14Eyuzsqi0lcsIXbhZXfE6EcNZIbQMe0oYAQgasNMBz3b7BUkHTFTg0RHoQhMlFZGGU/ejdeMfwpLflT1HFiEd7znbVfdav94mdP3O1MIyQDLftKTl4cVRG0qHVMl62E/A27D/FIprv6AhPMnZyCtkyiY2+6pcPhsG04nYIZDR726wQ2tPPykY/qi72XWgLJd/QA7GNW5ClDzf93Ax5/xDwF6LH+Ojcb7g0HTgZkhDLg1su2qLt5SbLB98Sv0n7jS8XkU1BIX6/wZHi1U+twvu9VQ3N3+DwAAAA==') format('woff2');
+}
+
+/* #endif */
+
+/* 鏀粯瀹濓紝鐧惧害锛屽ご鏉″皬绋嬪簭鐩墠璇诲彇澶х殑鏈湴瀛椾綋鏂囦欢锛屽鑷存棤娉曟樉绀哄浘鏍囷紝鏁呯敤鍦ㄧ嚎鍔犺浇鐨勬柟寮�-2020-05-12 */
+/* #ifndef APP-PLUS */
+@font-face {
+	font-family: "uicon-iconfont";
+	src: url('//at.alicdn.com/t/font_1529455_k4s6di1d1.eot?t=1596960292384');
+	/* IE9 */
+	src: url('//at.alicdn.com/t/font_1529455_k4s6di1d1.eot?t=1596960292384#iefix') format('embedded-opentype'),
+		/* IE6-IE8 */
+		url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAGQYAAsAAAAAw2gAAGPEAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCdAAqCv3SB/XABNgIkA4ZoC4M2AAQgBYRtB5cNG+OfdYacxwEA9eYzEqHbAaXC+ZFZWS8oKTr7/09LKmNsu7DdEEVL04JkStgZyOKZ/ILQ2JzQooY+O2mlDm88cwprtIUJRYoVp8q1MEe1Ow/WIUjUNfnNH9HJV5m92kW8dnj/3pEhB8aSgR+4kj24yOevPzf/ix2t5Ij79FHJAsd5EFJ2EoByUZPNHtWZ1VUw8TCKNsPzc+v9/WVQI8dGjhpsRMkSRg/YRimMGiDhCBkIyggFLMAzAAsVA/BOjAJUrBMVFTk9PQUPK0D0ro1REM/4bck0GjGLMBKwOzEqMDrm/+DNvwEAhTsoAAkoYGpB7e4LMInq4Z7d2/lSHmrkiVCowgFOGC/4BjLdjqZBMK9fkWmEJpgKgx8EK9nAPEPOk30pNCLq0BlSKNLexDrvFnL/EBcKlB/2YPqlzm92rMBKbxWxIXacD0TdMTTllTdfbtWnkEtVgBUaVkW6e6oqLSvgq84luVauJUGaMQg240CPmETe+8e/tZabTzHZvWtZycoqHH//BQBFFJvYg6cSCAPK0P/lViVvbmTWIzDi0N0rLjdoVkyOXJIrXJMg1hJIpYJpuwL9q2rensSOdFq7rfav29kR3LEgWD1R08h27tjxMauRWqk1yAqQxIEnxwk/k9Xvp4mNJ5uJLShAeP9ebatUY0naCgW0UITh59azOqqoboMT35k+wU5MV6BC/qWqJ5UnA9vtHQlfnOYXH0EGqAuWT9o/uCI/R6qH5JFb21r+/3mKC2j3fzlyPaQSlCkmTghdBueFPOIgIuD/pjV7uSVUtRJH3r1Qi793yiERbvfPn1kmfye50j+ht+xRakKdXWpRyFaEW2p3vgqDx5kmUV5C/ceN8zDBBaE/Jw+cu0rV+oKmNmRq88X0i/W3q7b+l373+kzPkBYGICUCkGiCVIIo+wTKgQBlF0E6BXIjpfPl9IoRIB0I0nsFUA6kfAHcKG6W9/JrN1/Mz5Ce9/jc+327ryVoKss14vz/aVtEFGJxKA6zw9isAcvQsULlmCICMkSMr7y8H5v/3H7HKsRIsIE7JNR0v68Ola+NidPXgYK7d4y5/kTrx1YiH3ACHY721PpPEwB52aopNP+2724kpHhSAITxv1FDjHzpgDzZMsCCoCevzA4ZdNuGwWaub2JsOr5/+GfTAhbIQEXxzM4jWww363cwcBfD37CDtobhdX241wMioCayVW4+bY0NiYeueRB+9rkNjZPR3SzDmPy+DZuAipEDJ95srvX1+/VHZ73km/Ct/p2utNSVpqu82hqCBAuZNq+8ATmVfJVWWHeYbwS/04tPTM/uwnx5/WrZyVW5K5oTo3NVqPm14m2BMjTemmu9rddzuzLfe3tb7nMPuIeaD4waumN34v8dT1ljigt5jIEn4Cl4Bp6D5ra9AG3NcPfedF1NNsxLUJuXzqNjHXsFxnkN7h/femLnVG/A/n11YXjrmqOdt2C8CXIrtGdHJTfBu2Cm98D7IK87oI0PwYGTB7d/BKbooLKD+cRp72PwCfgUPJjtMzDN5ocTVRGvs6Za+Bx8Ab4ErbS26yswyKFJmhmlgAJ7RxhpsHpyne6mux7O9NRLF7310VdL/fQ3QBlk9lgsrTBPIVaoHNDQMdRZoDhTZtCYLJhDgOkttEgOhiVZjcuWr1i5qiSi1jWlrF23fsPGoarqPdJQmPaAzQefgK8sZ8+dH+jCxUuXr1y9dv3GzVu37zTWRAX+AgQKEixEKFdcbtx5AINyGjgWYHT9vvZfIDCqgylAED4WAqOAYHwChMSnQCh8BoTG50AYfAGExVaEw53C40sgAnYgIs4mEt4TGe+LgrOIij2IhtOIjiOJga+ATLA2kCnWATLD7TLH47LACcTEE7LE10BWOJGs8Q2QDT6QLZ6UHe4QC0/JHveIjTOIg2+BHPCgHPGAnLAukDNGALlgPSBX3Ccuzic37Eju+A7IAyeRJ04mL4wE4uF48sZc+eBu8bESkADfA/niByA/nEP++BEoAD8BBWI0UBB+BgrG9hSCX4BC8ZAW4WmF4WEJcZdE+BVIjNNJgp1JipWBZHhG4RgDFIFdSI6dKBK/AUXhd6Bo/AEUgw8Vi/MoDn8CxeNMUuA2JeAjJeIUSsIqQErsSirsRmrMoWRsTSn4CygVfwOl4R+gdGxLi7EdLcG9ysC/QJmPNw0eURZOpWxsSTk4lnIxDigPx5EW9yv/nFXgqND5XUthfaAiHEXFeFYl2JNKsRctw96kw3Mqwz5Ujn2pArtTJfaj5difqnAA6bENVeNAqsFBtAIHUy2WBarDeKCVWA5oFaYC1WNJIAMuoAZcSI2YANSEpYCaMRFoNVYEWoNJQC2YDNSKhYDacBGtxcW0DgsDrcciQBuwKNBGDAdqxxJAHVgcqBOLAW3CYKAfMARoM86lLbiEtuJS2oZhQD24TNtxuXZgKFAvrtAeXKk+XKX9uFoHcI0O4lodwtJA/RgLNIDrNIjrNYRlgI7iBh3DjTqDm3QWN2sYt2gUR9AvWBXoBR7VOzxmPozNgflIbAHMx82tPbwZJFOzvJzMNDmb6fIyM8Q3M5VgDlereV4PzAv63byo53AICxLwkgUqvGyBel5RqXlVOvOays3rWmHeUK15Uw3mLa0289Ri3labeUdrzbv6yczSFTNb/8MKwIAcGwADKmwIDOTORsozG0trNlG+2VQVZjNVmtVUY1bXCrOG1pk1tcEfawH4D2DQdYP/N20SmD0zvuG/kuhhSdB/fz0IEhYaHmrTyNGHgpHDaUQyEvylEiPhpvAsgAdcUqDhBAzjoxDBamWWHEXLRUk3zQIxJnRqcWaNC1AmhIpAAVyaA7hpHlAPTAEsEAikPkuF4ArAbE4NKENRV7oFAztaGpkyLioJfbF3cbQNo6FblBgH+xgUe1gRDVZjE0h+jmFKOA1ZH2aGqUo1CNuTLdrewl6g5gToj+dRS0ckZ5JyNwz5Vguh2Wa0tKjj/kJ0Pi8Q8yPlTocrnq4hEa3FCDocKYsubQ9jkix6OMlKQVSKzZhMfyUP+hh8LpsQPaxNgRhujI5YpMtinZ4414eSNeBbw1Ls6Gp2amgIjjunapxZgSPKLKeXY1BBiz3kxFjZLCmGrd20fav4lvWoCFiF0i7H/rBPPxcbTXmpffcEi0en9a4TrZ3b29250myHaYrEbXJ2IQIbKp61FYJT8MxSGdedJsFuVe2162qscnZbu93dHb9dtt/tHxOSmhwU4liXKB6sThZdbqZB68SUGFIUHO9hC4V931S2mW42m7B+S/EEgYKUJasluMCKgWG0syNq01mLLImeKX+CQedh0gE8PQ1oajBrg1UqguHfLBI4fLvEHTNqQ01rZq/1J39onmem5XFG2PmFXDN/f7C8Zl/Cq6X+CZJlshonJDsrE/AIu0EMC9sGlTQsLrgq4vVMLdh5NKgO4rC/QGaKWGIacOw8l5RuOgcchkMH1+90IOa/2N+azrACjLEvwNZsit0UF7BcoRWCbK67FLt24V0TPbgcxG39QNk1uUNKGPRZcS7Y7J5ktZljwx4ATLywmxph7hHqvPNfk+GdpPwQNMgQwXQYO54MZiiwuRQE2xAwOQgOAqGgE/RQl5+FfF7eDYfm2jFIhuuoz9XThdADbICBfGs1rTkfbCtCEhxC5FEhFdA8I68xxB3fDFU9JZjRqUMNKcPlXD7pCm4sIH8q20pngJRErVfT2Iahf+8X8Lvg3AOBsOtwuevJxeXm2SYvAbmlbDkExXPQNDIWTadUAEa98rqioP2RNAsLylBYAMEHqJgBVgaLpgzMHbjbBA2L39wEpEXjzCY7s00W1LgT1EwRxSjjxoJ/oFoKjHPON5aDfedhXl8dmckO1uIN10j1HFmyxd2SFOnC0Vh9kVKwrAGJr0OuGlYpYquJrxYtQ2mlzzGVcVCL8swKGkTQ64kagF8j100W718Q8VopCopjK6C4i689URK20A+IJnQuzXMmR52pWYXM9Hpi04bbbujXXkyI4rNVaAWkKSDXORDJu/7z0pirFs1kEmQzXpT6cfjEUGba5thBeu5/cVtb3kINXO93sNeGlXdWDqW8Hfe6osCwCoqrx2W+Y7uOkVA5lLKlGFBqiITEw/FVPIzO4oLVG5FIN0RNBuV1nGh7JMPZTXV5Ho4HjtjKUErsFtxU6QAwTFvFtdCrDy/vjtdR1yFyq7L59XcVnfG+Rx8fNugzG5n4hSR8dfVxQtOPLXnV3U7typyHRy8KvUrEizAGooABJbOhIKbfJpjGMVh3UtTP7zGK1rIRZfTb3Lsw1r2mC4I6QtKc6cFxOj0gJi8doJz3ht3QfkJJ1wL/kAGhczPEyF41Y2VGn1I5pc51d/6ovdWl/R++PzjbHq1PH8agTYWXvDKFjYlQtx/giou9Kijc3D51Ry9CZgqZoq2SRhVnwZlZRRRgBmkvlgBUl9aIk4EYz0Ld31USbuBrAuX2cHRLqLkvaB/EQt/dhAhuSvI+lWsRSEvUWC1eFNI9VBWo8ByVBbcPhCMpx9csfloGoIYWdabz1qC15pKm5GcSYKDyBZPDbdrU6okbWL/G04cmkqLK7na4JW3mTtSQ1lp4KzldOg7Q+7J3YEJwv/wuuru5bNkSevbx0X4pjyaLxzTIFpb2bTClTaYAK5VDU4gwIQ0oaMJgscXpMtSQPWSJnFlqSYHUQjHGOGRKUH8O36cNr9+SoNKjs5XxSJ5Ky+n2FS3j8cepyIBkSzCnH/K07s6pmXizamV/7UUOgEJDBqRBqHOygXBIIVHwVooRWC7qBIzPMuxeDuU5bMWvt3V8Ap51RNVMI+ghOGnGhok7t75QDbfX+hlVr7KXA93sSUUvdVq8g4hMktX8uiXrkdWyjmawkwnROjZ/yWSORHT1kZOeOU918lDEm08fmk5fQovOZw48n6lB0JwiejPCVQHNy+Yi3nStRNdRYsk3/KCdyzDOBPdT3RcSEWTnMhc1KtuAJeNCExCwxbvSEd+EWSLpqAokpBRDybILw0GWJ5WICLUxnrU3v70ZJFQ6snWeJKejBykXDXRK7poBRMxK96reuvm9SPI/uFVG+LeyL1wIiFdJFAobVU4sITsEjSkVvZSt9hFPFAmCMGfPWo+WrkRm1j/ICLuKrhjPMQCAxQTKRWMjcRloQoArUYtA9LrztibHkNO7kgft3xgnNF1DGixWcOCk/e6DuVeL37stucRVKA/8tjsTiaXlZu7soX8nyS/8SmuVRmdrVllccLKGEN7vqCrtcczv14jfmVyQykAf3ig1GTo1M8FzhXwRSOzZwpns4LloG9+SyHQgpVxK5LcGVeV6pUQuJDV6UqZP5MkoIO0/JAKD/mzgNHlCvngeFWPrYIiGTcW9SEAwPFJGZ6TF+fgrVBZjsLkB8oTbAUODXA/7t+eKQiDtdeVpWOCq06nj9NZEmQio7UC7ockeAm2JYyQQaaNj8MbMoZqyT4S40BUhJ5uwQyw3OepOW1Q2rITt1Hg3eCuYEDuDTlIiEoYSMSjSVHju3rK8Uj2/kPfI72reEEn5D77TsyRz46rb4Fwc49qev2NsROWSHfmmHx37briuXDtZPWbFaIaLrcdcUJnH1U2G8dkk24tVhjReHe3rCwhsStxxo6p1qZ5LW+u1kvD+DTsrFg4DdfyQCrTDuzdHOz6DNoWyqXOoncD8KLT+C8pNiqE0DdeyTpqd6z2CJn5jBu8mzsXQA4U0spwOkrV6VaYE3+8guIKg0kAD1yJoh6/vRtCpKHpfFxKlhjI5PlM5Nk6lDuQUPIkNdEWaXk/i9tdWDppsyTsM9t29y+sA7BtYHER5q2gbOYvRtmZjbLgnghKmHeSXKhrKGznO7v1Eg7jmvq4svo1Wl0/E20tH9qGyx5eeVJtr275eqrjRPVcplxx1P7Cq5W7s0FP/lsU8hM3qRNNylTBTwnbYbc0a5+ldB5M8UxzyV0VQ2r2Wg4zfxR3GBMGon5T36dCTMsX4GiqF/2wXk3OhUJR6gtdB19zBwOF5L7zh/8rK8dSB8rJGolYqjTme+17uQDY7tl/rLMiR+mJwqEUbS09a55yo2r4QRFC27tgamxxwCXrHW2OjKwwyZhwJVkQHojOMhCbV+OtExBzqWz144bIAwPXJWSDl9V/AT3gt/FvV9DLpa4kkcYPK75GNRA1aDiHjMMPATTRifViXHA909in81q1XvX+wfHiN61JXFECEqzYQEfv/HDFYFFItyUjz4zKqm7ovloZwWPTQH71LMd61qsNBMTe7JemSwyHp4larXRNCn7NMfu4U+NORlgAJjug7eX/XAHRQQxoCfDGwzf5gri3/qvYmu7pPq5YEDVaz+2trZMgC7pVtVTd2HRgFfPM2kY25Ll6SOc3Q2RIFUZaVzcL54q+Ozo4NM1XwLvi2osPGiWJUn9QSdlnqyZgbcO9yM4yiNIMijGdQ2zBUHF4UV6om7EWCKS5wS/J3xb8d+SONy9jOLvu2JoP60VwkMQN07ZQ5qqpMcd+CE4QRPn+dX0mvvNZkpVdfQfhPev1V0Z36wWachYYQ3eRmvw0y5MasO0b1iibPof8wcWiEbOXhB4XAP4S+B49q+gJmXzNGTQqCDxbw5WD66y/fHrPfyuT7YW7l8KdnE4Ps4t73zz+61KxOMOujxFj2aTTFe7gnp7kgABgVsD10CvwGqmAErcCqtHZWG+BT5s+IIwhUDu4iJAp4v4qLHTwU5tngUJrx4C5XWBI23qzM6zIhlfuU7P1CPqfrZ+QDVmmC4NoKNzL1OD2aSWC06s0Wn0fqZSMduphiyNC+okatppSEAPWk8qD+oix8EYiCJd+LNRAbStUos1rq14goRTgeVh4i0l4+RWmMVWQEJEhBtL4II0We6UBxmCHgYSS+LBCQU8pQbV3TwVaX+wVBsQ+CD091vUEfaANTl4fgzGu/c4rlFhh5y2Q07snSbzpu5QJgNLSolAGsz6U/0ZOhppppp0fLAwFMVBlmnVJFptBgpmVKGECEzg3aOPJmH1hIpGl91Lks8E+gcjD64gSTrluWWAARj6UXHhQnDNuB7keTt0mgXKCeVVsHBa0uFyMaKifSUUCyd020gBEpAb6cmV5IqOJ6xtw4G2jPFbVgdh94xis61hMVglUA7TV5Les9yNoiyN47XnFo5mqwv2Lglp5uzMELnNQ8kG3j/b3t+IjFV9cFIGsHsutjg6YbFMqPW13VdIxED5cwOv8Em0DAIUcRoon26OQP923iA49DobDctXYKxcR3AKUJsEnfYIiAn4NKPVZ25AZ2olE50nWtLWP/kn+rSQF84pbKtRCV+d0BLBrgJWuQ4Rh168LgfjctiRyqQ1nj+noGt/yUwhg5HkeEy4dwIc7Cvlm6ytQZ8L0D7/xRjz0whoJnHH5CH3tndWVoqNwmaLzQysMQvA+24yGzYD4ZwCbfT+thJ8klKI0fJlDw1RwxKDKWLUZCNoPssMf0o2Ws2PfiDG3cvgcILQ38kCGuiVAMWNZtfhAopddem+UJQj4OntsYGkIChGZlSC/o/UnkTV3yEDKDJBvAqAyZDcg7JPlmB3z/NuQx0bF3Ifcg98jZltCjGDAGpPw4QEwRwfgSJYvjatCyzG8y1NlMxL4o5HikxKOlh1VYlTzj9mnkl9RBc4ahQtI0wyMFXYJMc0Pge/jcwBPdRCLc+aJU3CWaqstAufCIeomrsJ1AFGY6/mwHPahHVh/xmfX2SZhV6gYEJhinHPjs/DwX2d77BhWFhvFvVr4jSuh3oin6ljQRfvjP+b/SlEj5odhpCCi4ehNhzBhLdLnKEP7BjR+Zhd/Y2SFIcV1rgKJwye1srRKZ5bHOxzNG2hgGxC+/0+P80WKyfY+qQZdbpRXue1R2KxSl2i00ZKA6kHU43MWiqyeAPwoAVbMwHnjk+CI3aPO5jrmHJGp++vAeWjEqU/aSkkip4n42UurvLMWqP+J+riFu6uxlpQlxxlpQGH9ZjptOKfaG0P9VeAyeGC+iqds18Q30QM2KhCXhHrokaLjPkmX8OKlSFU1D81hxS/d3AKcw3Ap0SgT6j9kX6AoW0VZCUSnE4w+jhJSm5m5EMFCP4V/I8RHzC0F+INjYCIVklYlSuUqNclnUOgtEmcoeWhwgldjKqhRP+plqNmICWyZufBov1/ZAsZQGuZP+nhwDvPJMeX8cwuo6oJfX6hV2FD9941s1rBQ6n7DAdI15y6+X74vQHtP5ytb3r8nJtZmaC5EcaBSLaANCXkwDKznaqFDKRwdl7b/Pu6So1X090akA1oTr0bEENqZmibeYBhvSUtw2gilHjQyl2Q/cuv6S4630xlYF8z9rkB+ZTDEvphEaVKZmMiwayg4SIHlhApIxEVX4q1ESoY0xg7pnKHauYTLwYkOFumLLuB/Iu8D5SIa+wZToNxJPGONdZEoLIv1xLjIJNo4K0wOHhjVjcmxHSsnOjO44yPwj5lpLOwJpINT8kWjT4WNwePOXADWeUepOyYP9ByhwoN7FZsU2vYcAGo3sJjEbT06dnVOKBwADocztZ50ekLFu25iQ5Ey6luygQRVUSxkZPZCg0hgd0l7xc+zFjiS+I5iWDIKxL7EIhwrcS5BLGgwiGJcPxj4e5h42pMjDLM8WQ5Te9YVf2TORuKL1oBck8gYY9kPWfPh55ynVii+ZI6T8vOnXgUQWJAINiPj1rkcDLdj7xI8xVSJI/NNdT6bR+QZO/q6sRMc7x+CifRr9ksSc57WoDOisla8Sm+VicLG9W/Wjn2SSQInxS52bIq7igDSTqCiS6g6VHv9GSh+Lb9KFgt3EbcE5lf6pSRWuDNsnzVFrsLoectCnXeOq4X3Wtd37AxxkO2o6QBGAhR09CkBMpESSRyN0OsDQBsIWCXWU5qDWewgqIxXQDp7q5uc6oYaeCF6zpjBCUZKGSLikTk1DZNb3f2khif0PTQCePvgV5Ap88EtMcUnEsBjxRbl4VX78/181nbbsAnR9pO7l1ns+4dY09vyk6xNJ8uOKcyT8X3j38KQ3OMgMhBqudT8NtadUCaoOwAiFAmttJC2uOHkMFtcGzl2JFqHtf7iaR6Ee1CBYFfz4TmjoWh1NwhNxWnKAdyozJ3DJvXD0O5jvA/UbJ7O2zR7j/Ma8zXWelB8Hxu9VnIEZ8K3Qp7FU0K03UoNmpzm2V9ewkctSvh8tvztZHP1WcN9gTxJMBBXiiieN5HX0qAX3WdJmM+Cg+LXLLHUMM9J4NZU0EKDQ5y3ZSXaKnUwHeVGVcW+O6GuWtgWa68FueXHPdCv1btld9de9DVs237UXFSFPu7C2uY2a5BZpyXzPt+HE/PDojq2sfzO5V6+zitZovjspcwG10LYGLRyDsUXeFKi3MbWuv1jnV1mTymNokNXj5kyegqNFKpKiAH2bwMAB+jQLxqlREBxqBU4rQuZO7Nw3IsBTeyICjSb2xEpzCKXOuH9doTUNshIBYRghJGAQprcbSgwtnlWe1jEiDCSUW7pbG/4lNn6P9a9b2B+ROjE61602C3dJuEmRBMAmafG96cuBzIpBn8bcs5OHfJulnFHMDqImCr8FPE019EJolMQNWebj+MZgdaooJdzqmaYUAxj8EVvi4gte1c/Pv0BmhKSZeipETqYs0wgMutcyaWGzQcNoCoU0I4zxFoTcm/dmQXdCSIOJGWzxZSV8PjSjyUnaC8qWLmSJG4Rrg5K/v3gz4kHcDkl5eHvGMDncEPfowxkgQqQT5mJ/PE27QqW1cQlV2Fg5L7h8VwqMyUIgZJS9nxfNewC06r/osk+IKyHWbu2QEc0ix2rrUW/m2ClM92zwr67lWnsuOEjI2RPNKgLrK9gIobDYqVy/rKxMn98GQTE/vv6tTo88CuGgHf0dlTVnXmwN+tijuS1roWz7DLDkRm3HOZxzM52Vc2nizruHB4UWrp0ZOwDgEu0h/skNdMNDwAx12D+iIWCajOMqiQYOwJNJhmAnBcO9wKkZQBWKPr+1bM5cOYHENjJ22vnLstPaVCU0g7lPud7tFppO5waQFjnIpfszDqTOuSTivW5XkerIsnjSvaGjIitzG892JwZ3cgO6i8c81IBKRWncjRQluGbU024NcCuNUqXf5gWbskkW28kBD971BIf2baAQbAJ5SjmXJqvLg48Ojg4gw8UbbsDOnfTgMw8rt8JmrjRpbeXyCoBWbe/7gBdPk243O1n1bNRaYwQ8y5GcMNYtBBL8FO/9T4Y7nXJebV/NIp4I+52EjYDu0B6l4gMPvKaq+LhSuMUdxE35PjcwYumtF0mKqNyHpjR4uglKPRtvex4WWLGMvJkqC6j48dwwjyWAxsGtiBLMEW3OOiWbKpZuVqTy27tLYK02PZluf9ZmJmDR3F2c4EjQVKwm75MPbusDCmQm3+JIN8OZqN238yGmXxqt2zvX+uMfHWQCSXNvSIMg2qnlU2htZUhlD6DuC4Q2cSGl6eOaT7Xj0cD2XdgHt5/7PGH4j8HFE73l/JZ9miWbCWm8//5Hnrd03uczmEBhI5O9/f27WdLYMMXGlvUbOToh11ztPEsX7zDLTQz7XO0H7+ygAm2xwzomNvZQQ5EgPXfbmD7+yZOfjR+UV8kWINsavhmQ1qMvbClbh57CRndTbytt/t+IlUM2cxsPPBrw83rbYUIveu0shyQDbG37gEOgv/NUZB7SrdcNOiIz/vTx4zP/i8+OqiKV01kK39MSzxiz/74i4ByvAwlB4LQM96HxCa2tJ2Z7P9y742U3IKkc3JyHDolnzESo9pSEqfOAbgMYPEq+sVD8goApBR5iZ0Th/0rQ+Qo1KhI9XzWQmhG6YnYJwBt4gtvZX35E/AbsTJHWAssmANx4d5Xlm8xN1Oxx+sLOq8sxlBgoPgvxUzDKB5+jKJV4nr8LCxaX6N7DpJ7h1MnITu+rLh5sas1ZDVppROoChQ5qt/Hm5sW1XXAypIkk2TCykwqBn9wWYXIGXau7W9ZVwu2scKr0o7Hg1a09J8+jVJBwFNn2OyucEj9xMXjT6WZezTSwCafUbTTd3eFgiFmVp+5FAU04C5BqkjAj2hYfuSG2C4WsQCHdQbNzcONmiGDe2twRmcbcVzlPOz2dvavXsFmBBFeBiDhmt7K2qiAKw8RoEJkh5f+V7NpApcnTYxo7Crs00VRPIx8i6V0gS52b1mne6MdttBzpvGZt72dkoMM6jByHgkDoBMIjj4Z5Zm6bsfOJfWOAbH5h/oqz8M54SQVoec3oIrBY+4qRfAJtZWIuFKTquOcAZby3OmKSTaKXOVvq9/ydsQP0nXBwpuSuAFupbqX/WLHUB0qjAyLZ+3pnbFJTSvtAMypOJ6nEElyeYDwlxg+CjU7fDVP6UuoPjczP6D1oOkVQVV5Z+nkepPSpr6Dn2/XtCE1msNbJSw3XyNsdqapYfZ4vy9VKgcB6xBXZTqQAivsJ54wxQJM7AF37VIPoUG9eU2rYQKui0A9zMaHShvtQ3m1TZUmfDPRoi3E988P9DmqjwV99YIg1NAMpHVJSLTe/Wp3dx6bajzhJ73ogv5IbLRDB9BhWRhYcRZGv3JYJDZyVSQNltW43IxhA11edZyGx7mm3fFdYxlR28lkgdRfM+5krv+JkWTUZ5bPzT+fMzUpr5pTK5PwapRXTeY/Q/8SPV/ZVrr4srVAreTIBbZdOrtKNiyEvvB+nDtkOfGm6zp+Exdfqoc5PI3k82P8i9VXhqm6V0XHMDRXVD1Ah/Mb+J/Q+qr2sjbqFvTq9ubph3Lt7qgpxw8wKPRi634f1obUcLKtmojKN87Bf50JkTFTaHJJ2EH8KDP4QlYHWc3o/YUPU2tlbLPjynfqo2tXMxdak1elHslskjmEkcQpRKbRlpdsnq9nTv7/MhttLe9VNOo/3b3u7XhvFYosW7f5zq/POMv8lTeLGL1RhroJoCYuw8DYXZ9a8hWwlH4OGW6WHB1+0PVKrgoZ/zAMjL0kFL2Y5n4izhSr5Iymmt8Hoqc7rZ5Tbob25k02c7b52ekb4PuEGv6xLK5bpQCqLkleLY+jqARs5k4LZN+LSBXssJ1usPp6RIEhIORUb9MdwA9xX2xpoOygT85EpSjkIBlFTl/s2P+cXPo33ihjerxjDfHR4Jy9fu9WQZ3ycya1spDKvpZ9wRLveYw1tFTzFMyzKYOogdg/v7Dwn2p84aI+Cb8g99hCqeTvo3k5PvDI8r3aTIiVXp5f2GUZS2+NBY9PU6nxTU9eotMgEhxlZ5PjA63QmoxikRzf41DSVFk9fSmmehDlHVWbTb2LGP5gRBTT2v0aEAWgSe9eh+SMaZ+eIsDF7NWdV6kqKoqajB7l4Lh0n2tqJx2RhXJktGpwVe7nNFq7aWJG1TAgEAoCjnrjAbas5Be8myuMRoPeFUhvpjc8pT9ux1lvqMb091AUsR3QeZNElBVzA+c2Zoe0ErjJlQqTQ+UDVo7aNIdIH54RtD+SgpjY4xpcJFo57Jnw+WDrUUAoNT7X8Djp9Jm+wCCHoDou0AJ5sjTncGxpshtfeEQhbL7SZeZUYT3ZfUkwSxHG5NAEGZQJNSIu7X9edFp8MoypP63hmS+WK7hMjD2JnK+QpKop9K+vNnWVoGNJrZuTNBOljPj9qj1Y84j0jAwuZYRjsGlpskyg+4DFbQrV0YIW0n9h7EQKucYF1FqjI1EKVDaBc7W2+mxopdX6QggduaFp11N2ek0uLImtCzfN/oyKGo//jLb4yZ3L4GDxsIkaklZNawo7uPizPiQqZunpon9N9BQ8QQPvVyQUXKYvSF1tNddo0b+2sz36gII1HakljwleeKESuApdIZvh7Si+vTlIynk9hJ7s91KqNTFaaaJ0VKsNAR+xkFJLMQ5bT6Og4rrNp19Rtrc4Z5ZnuWLbayzdZwJ3RqpXG7OEP0XJdTUCwHMrMr9TZuj87Xu3FjPJgeqT/nmijEZM/VnHS7W7Mi0rGvQZkNJmai+k8ExO7VnFuwyDpLqtamIdtiXxlmdIi00knRnaUtD9jbVKdV9qVOuKO0vItsodgR5wE7tz8lERgZXAWw4ov9LwsYee8h9Qmw8agNWL/K+9dQaXICLvqeQlUJTKKXFOE26e35d2oAKcDhynz4ZGb8v42CzZ/uEExKjPtyOsDfitDG/RLKcaN02KoyG44hg/K6hPthImDmpZAAZzA7XNE5hDKpFiuTK3pz1cD522bnaC0Kn6NytNzO+ZnpQ+teWCYWwNHq2dJiqlWqRrYJS1XXrIqt5FqlE6x+Bt+zVAU3EVz3x0CKA6XgN60oz/NTuA6QguEU3Y55pOune6iiINsj1Gz4QzZnMX3i8638sCvlpyAJ0+5HXPn3Fa2gqim7z1p9a+ZW4+0Ifgem+94lP5jLC7N40cdLHBONWWKfa6bZ3HekdhIQuHeHRT6JQIemMa06RoNKb5NFaTG+QGlulwI0bpIdEBKm51cFBvApVFkL+t/nzuqgUlo+RYkGoSHTUsr78N+AqJyqpmNXxsVe3se2z6nxjUclUGLz7N08URhKOXiPiNZvdCIsN6IwN3t6HJRJ+ZddcZcpfw/Z7+e39h4Hrk8m2TP4sU/mFaadJpUmf6wCjfLnsSv2m5a5Says0rHQ2uXrR1f1rhMkMiK1etjWQr7IUOFbi0rlq04yo5PWa6aqTazjz8akgzvmpraCRNlFN7VV/IcYHQ8hpybQwZ7TAG2Ixl+3fDNmzDYbgXoIz8g/7djLuZwfRqiLO0oBeS11RatK0gZqOYj3pSGODUmgrSi1aJ6LWkfcYWegD1dUihYG1U/9M1Eu2aoXt0+RDYlDx1cOLuD8pxQbt67d2ir1kS7bQgEl78wMcEeoq18l7AVIbWVnnVca3vErGhEMylma3fn9DTk5GmxtvIrL0xNwPGbLRlZtLpOKA9Rvm1beWMRHSEK5X3djyxaRguj26mb0dLLXJEPReflRTcW6mVQNG8JBH5+SvZ9+huFmm3nt7AG19t7utRN2IY4fRpeS9TQ5NeSVgS2Sw5u24qtofgtwBQxhfI7AGSGu0ya5pRvqOJO6Vr0SYyjA08AQnweopDQTgiFIreGtZIbvPciUZTrBT6Tg1QVlU+SzprOSknZzDMDVclSUo+BAVYtawBcowws1C4MULQUWar65YKUJaO+pKpYSspQi8gEK1WZeWzcgJ3KbiDum/RjsXExCAnc/oB3Vz2+dGyQSLTmhSimzavNZ8w+U/NpJvnUz0MjxGriyFCoJXESmpr6Bn6cXTi3czvP2gY9Y7aU7HSMMG82T6CJ+p2hntwb2gu6O6FQVE7uxEOIQlG6krcdJiMax/rGjPkBYYHUR1ogWI0ELQfeRMrbI7ZH3tq9cdp7I+NxXzF38d8yua+lHxImOFyKSdXGHDduBuJKZ9I33JkzFTUS+zrRkvUI4CcYEx2PINpqHmbcITGzy5LydrcNh7vf0A6Fqnw7TDriOnAwI0zl08HoiLo1iIPrQtW+3ubxHXgAMxapvNNMkVcaU1fGYlpJrZjyzMRAKE56nXz8UJFbNEWaVjzwb0A3ogW6zFf9lDFK/6tMnQAdj+HrRrp9Y4A2H4px48gHHwGalhZPywPR/23ljHG2/hcN8mi5N+xjIa0WisV9wLl92/uniwcz6wQLHSnPop5/PfL9h0dCl3o/4hOzJ0S/cSfgOwW/eRPm87yDgEy3ok2CSZoVvQbeFOcJ9Ez8BokYI3sUQ5wftgOTY+yLdwEQrbkXghK6Z/v0NLxz2N0oJTdgET2+2xBd8ERggt0bTmk4InjUOaz18UAKfwlZE0ted4017LEMrPAsHdak/Gvs8IiCFa/aI9fsVpC/xq9KDGm32aTlHzUyulU10Ya+FiluOS/W3SGWHi8JTqOksPhinGVyjPix7ZfMPZurc/7FQw3AqFb4Hi4cknrFrQUJyE1PLh+EFSWa0J26dHDVJkTYwCtBdFyd2AWUV8iq3WPMAUT0n8ZHLRzmjsDbGH4EwiUgBMOur7HP1RwWbissVHdfhbQalHLsyROWd335Ku3tieMbeP9JPjXBXSjpkWfLGYbg8Z863zQvz0t42OaF5h8fsJ3Xa5eX/x1p4VyAaFuL0CLy167NjwCirc2tq0VkyWXnWKggH8SB2IKCWCgOyi+Aeq7z80F6U23VGibHqqu2vM2q7UBnN7Zrz1aCVq+7rDjMNSVLEIN4mjWNhDpEopOPCt8OIBCDsnpWY2DxZgKV+A0Pg8gF2PIbgSaelQc2deICBqUw/B5BY73jAfgVfNahIrC5I5wACO+IRuJ17IdI30y793zAgcDJWdwx+DurjzcPH8Mt9Iv6F3C74Xme08Xao5PYBuT0EespGu+ILes7vBvHGqH0k481ZXiIktxFpTriArGPCIi6Uve33iaCEbkj1EuljZIELAFJ6UoCTEByVRFLgYgqG8/cEhD5EfJqC4ipX5xBQ4sFzaI1Qs7PXBqfMmqawFQAC4V/79qf4ANJfy7vUwEfiZNhUQD2MglqWGSFutx2g0Oiujy/qOAYFrlgbmCfN+oipCXQpk2IEkTpps4Sgg7HUClUsmlTySLfFB9Ber4gLYXvmwiVlEDBJuDFKkLH7EkgK9va2p7USHXxrCXRxqSTk1UmN5LiyliDgSxIk42ZkrQB/LLaALWUFxmWLQmKc91K+G7+nZAe+MXgc8MXscC4wg9X872rodycVD2bzmWlrGIWRh6kYMmnu+OVzH2XZ6nVdH+2rWoSCspWRf27hMuF3IL9924hMBuatFXb+0MF1IpPDE4ERuxbnn+w1aOkxDt2UF/mixVHFJnuAksLwhLzF6WwN8B+gE8P8VqPkeru6wSYDoxAl81qHcDwz0AdcDfvPq8bvoBU4TxDkL2QXl02supoUTG+CeF/YivwHb346D83uAqUtjO616w3jB2GKSrChNmHkalolBpV4c434vytEq0TnXRQgwWlHLe3g4sTm0udKH5RGyt2JWzCUcotCtv0+BmTGXxnbkWx+l552nS6Qz/28zVilb5jOtEb0rWfgZvuP+5/wJLtyrYE/3PxwMqey8bzu4ZtdyQOjDxb7XUY/2cGP/1IrpFiEeJ4fQztH+j00f5R9qNd+xAKOR0pED7Jp/pvBLW+3pU+agU0TFFPDoPYiGxXb9/lFkLo7tLVEidvt3CH/WB4Uk3+u0AUbUjpDRUGggFKOKsLWFX7iJAPHKPDLcug4bvJNgNAI7YBPn84pYmY222rBtQkm3kRzKim86G0mhXpEPcBDpyW/KPox2bTdERNDZTeQUBZA0qD0mtq0kNdpc4uEfGGKtP1k0ppBwlj/DbyY0rrLnj/l83lWUb0eecL+Ci4g9o7HbZ93uVvl6fB9dp/XO4Ghx5/yoi643QHFw1bUTumPXcA/6x9mKi7V0Ji7r7XOanZWNIHkw4EI/q289a0Z1cWx0zNu/zjfDeE/IVnSLkB7wD4T5iVHXZ0kqDB5umEBhVWQ5zdkx4WWSMJDA6UkWgkIcme7ATbJVv9Tra3opFnSfZjwrl9fJZMs4KjWYzqTegYzYpGEkRHdlmyDd0x8svYxfTBtkVG8snvk5NClpCBC8sDAlGtJWQBb6qYzZJI6ClF+hCLptDvrrMWPFKoM6Z/z6aY8o3G/Z9qDAenv/LCI1qv+eq1CUmY9N4Hpo9704Aws+MjPDWUaUe2sYbwrIzeu+bfqclgPwZ2icXmAN/nU8CQPzNkyM4wg03HzhgcO35kHWB67NnB3NYb3ukrh2oEFwypgcNBNT4B8mvxl2i1LrXUiyxqq7lMkS78IJRKhD9QpWCALCQXpHYwG5x+M/fPqtj14GGPlcCqn0YrpYdG639ne95011bQSAenMEQfy27Ft0m3pQ+zKz+/zbItFq0LbO2cOkB4iqhorwz7l2NAhqneL7KfXt4iBR77DjNMb/KShSPciUN/TPnc7f8bAiGfK3+wqA2vFWdWPIOLgQdanhHdt4ZXL3wcYeXbHa7xwVna4DF12E5vN4KWqsPXhLzE9dv6+2FCooAkCLfISW7bXyaXoxMw2mGR93EHvC86GNL1K26aJSBHzfqZn4GwmI7tpvRT+ynd3BujyP+/IM8hR798GQX2vwcA4Zh3kohgzGSISrpJog6ZjAFinxvmkCa8LMVQFlNGoo4xxsK/Qj6GVkx0a/Rozq0Rf0k5VywN+yomsx/7iqXu0qZAyUQJwsqq8sqS5wN82e66j5jfMR95RovfLYwjQMd4XryhCGxltNJ96jBGLyOmLrkuzUmdD7UFsbV5ykPsd1rmJYP9dM/STHbaz0NcI0uL/BwZU2bxQ98tyMyL10FIzf0s8JfQWhrgLKFvqxC++bFxLRSu6SMzVPZRs3xZ5pwsnCUxJfrKqv/nAClIT4ekmBmvGYyfS3ZMTJaLpqPArUbGzgRmjCAU5wniDuIJC8WaZ+XzdrIbzh3OPFhUr1B8cgfulIQEociuLyyIvtkFvKgHRShKSKC0vgD+px7+Y0vY4ffa99Vmm92IjPM80S7UBZsjdWSUX7GNjZuihllpDPKZp9L1UDxRWv27OigIcXScpqXRHXXceOkAkd1YBvO46In1W0k/XvqRtPXmOvD49xGWnjVSXz/I1rKHt012e4qgHi9hOfWuwZltLoCTxmi57VUFRIiRp4VNuHrfXIfwno3x8WnWc/Kpkvh40HshGqUT9gYpto4YuoFx74Je+KO1y1rQU15SQkwXC7gHpqnSfYryoqhd2DTCSnt/LkvN4/qziKtQysa2LepgZ0dut96aHevKAd60x9fSoRitNkbxgWdmTDqioru7AixCEYzpGja62EnqxPZfshjNng5ldDMW56WbdLEWs7pMTHdb+UrmcN9GMXWR8SdtKGYXU38mvMbuHK4FFgzUkx6LPTzTPWgdj3RPEFK+2VGqeKiQOg5AH/q2AX+M5QVpg9RY/cQR3ARO8fSNULCypgPJwgJRXLJZQeOhAvOCMcgXA/wuLTwsKsQMjhG4W6aF14m5njUcLDDNF8flm+WvO5ZiOoH/8NB+l2nWsvwZ/d+mpjZqwIJtk6HKSijY5A6wHTeBj0BvK+Hk/JB8oGEG6t0175Q4pXpADYT4iQHVVcOolINMDRQByTMz5RBRQvDWIjI1eut/HzCoDL+7p29ilNd5lZJKDlQeUDRyaheWIOpqoSUU6uocFuqEN1+7RG2ArycsCd0bumQ8oeFP8z0LTHMgEgHfhTlzYQ8IhOyqZ6tBHq2Dpn2xFXApnU1ivuv19jgJ7OftldQlte5RHqSjeWsnqWAbISE/o9Yt2p20h6Y16ChtnenQbwLZL0lyzsK58qS/FOfLGErAoJTkeDtsQEdn7xzFv8yzVggVYNmdUoLQB8yekhOIvqMfvTs0kP8FzAOPpfGfuM64fLfnz7kOz+c57I8ucy7z3pzvhicuH+1Wh2SGeZSa6ZRKnWmpe1hmCJRYXLz8tXAACbdfuNCOIEo0W0cOCMGyAFoTobXGuoFkXecuMhcyQ5aTJZ70aZlsmu4paHu8EjJF5nXu1iTrhprWJgLN+Pw5W2Qlw03gSTitBSY/I/zS9QckIQYI1/R4zx/juBkRvI/H+FZGzHYtjoSfwMmsROyBQY0GPF+L2pd6NIOwxj0JM+kqCveuR7QpQQS/MSe/wT8CWO/b0xiw3Pmagc3Yh6/5BSG7FNzkHLjcOSNX7BjdEBuNm8GZG27i4iBNZu8CbGZ1qcmZ4gDnpqCcDBffIClu5m5rJMsr/HNOVLMg+XVcyC9NmIDlLvVFLtgbOHPcCJZy5/LHLNLSYw6YO6NntgUh/ZPgJGWxLgkZBy3NQ8fipjU6fhPnECkWisWRyPRYdbWcqTtjpoJhEghOqKoxucm7xBsxIeBm8J/xMziC6TDv0tg0q7FRSqOi5hhBjLmylSoB5l5oyG2EfBPHZMTEwZ/ibJIjbr+HHDSZgk3NOKefjfTm+N6BXry5NMK7aYKhAd703FbzlTrisXJjlmneyupq2lzFt9nUxcp48oGKzdW/9NIOtha3prmSzT2KPVDf+lYjKUX1dpgutiH0/efLTWRz8eOZk4HxwaBqNc1UIYrbO4ohorRCFKt4RljNoXGAD+ww7AGgBkoVV839zQEdL6lUlb0qvKXJ7GVOSZL9kclIxGylmcSseRJGJgdK93e3oaqvF7KAfWr1DZMa4D+FqLhMMz7VRLLf5JRQwjs1fpJ9jl4OUf6S/Wdp1hIbWr9+uYhuPwnq/z1M5AGVjAOHjvh8Qg0aGV8/RiNupYlE1KXUsKFtJdLGWD1h3QskGmlLikhbCnSLdLQL3WE9SyOhIPn7GtS8YqliHlXzPkie273YbKnZBwj4id9s9LPKe7MTA6Aeb0YaADU0BX57HsbxK43KZsF6iyqNt/M4twFnOSQSU6liMSTHPk6Pd02Rtha6VaFbrXxuijD9MVbuWDAX1vK4q9LQ0eSsWDTZGtI6uYh6a4dhCF9xJmyJbfR7V7nzQG8/3O3cDcsR9M0RzRGCFUA00vXUA1S9QxWkqrx/uPJ3cx6yMGL66XqHfOgq5fvsEroe6rcwWvSDKgc9uPrpO+UqlG+zrV9nNO+HFOwXrtL0DvpHeLqe3o826g7Rv5L0KwtqmUAA+ZhehbQLQuYrao9O8Yj6iiQ8wO4zJVeTTfdDlD7hm+Evy37gWe64hLr6eVfu+qwa+0tzL4VXOFey2wBndhIoxFW+uUNGAxO+E3NriRQmhVSbS5SR64Zy+fVD8+GfndiWnVuNBpqWmJjomBYLqkWrRtM2ZMRw8zF4bg55/AIuc9wWGBuEYQP8Y5y1yzhJ/huLHzC5T+3+hOJF67n5rr/EqZTKjsHG7szkbRrNiAEzHBkdE9OiAejqrKzWcnHZ9et984gfCUgChZBXSwRMQKifAY8kGIm5glUhQAPg86lSM8smJ5LZFA2ZaTOz5jBtGLKvzAlt0bRDvDlMN8bb6+Dx8i9ohZ9IgcZX1AY3gCDDuhzLeLS/CK0gZB8/aBhtITVhH4UhtPixHoIQICKPWD7k/12ZAC3nfvX57j9UTlzuDwTlmwqytv1KxtRKMV0acpayIDuKlqJpxQCfzmLlpD05GsteSaaTokk0szRMF8Ye04rhalB7faeuzBerPm3+go7zFcah8TlrA1cFrVqRg3+s/YTouC99n0qfT7JJzfWgW43TzST6uw3Qnv/yr+W9ft+k2aCc+54LEpXf/IayiXn+gK9bcqJD7S3TnBKofUkLBtP8saKfSeNe559NPTvvNU66Wmy5n74d0XMACBAtRYV7ny5Hi5duA3lsLe2nhXnKT7Q8dh5tjKaVf1CmyPOfhJ/myULK/MIUTc1WgSkyjSwk0SaFkzQSIEgo0w7DDk+MqZ2cGx2dR/7HmCacBhxn1qHHtDZweDh69ybk2f1vuJIDYmGMXLA41SIt8dmrcRIhGgq3jghPbf9X+e7dTUwnbRURkapRdPfaTXpKGhYr901PwwBjo5DA9+P7+7fFDbuC1otjtnkDeXYka6VSLIyQeqtSzVPD7j0YJRLCIZGlo3mV/hLpqTKJTLLeslUu9clShY8fX8C4XjGx0qry8gl2N3s0MytK7u93bfwmp5UDWLD7CeTCR+RJ5ImFhRMwu7KwgDwBVGE91dU9QpWxABzSuWics5yvRkZHyX92znLKdNUdBIWIjrEL1C/0aghAegc9nVVNFwAz7IHzMZEnFz6eQOLrv3TAY2OIDmOhA+bMhbZlPrUaTZ2PwIy8RacxszPN8v+VMpS4faM0RHKh94m+1BL1HBgDhiIkH8I5loZpudEoTIF3VH0p98ck2Kjmg+3tYmvqfecsU5Zplm7r99WxJASYV1ifcpSiTqH4ilMavtMpZ59pyqnL+hr1lMbH+ZQTX3NKwc9JSB9RU1785CmFD/oUUiqcS+qod6azj14oRZ5C+zwGMxAULiTxuEJMIyZMw/al4GOahVnNIc3ZVU9Bs/w/vcwVDEVa0RTNIofNwvroFPy+MF3H5K3jpbx0YLzn5kbXO7TQ3YAbvcVBT18zFPIINEBFIAEkBFAAPbdvkgJMFQ8G1ANQNU0J6HoIqAGkH+3nEvYFmQftM98bbB68t952EKBHBweqXQ0CPx3D/Nb088S6G9Zr/rpRMcxqR6xOWI7UpjKdft7drbG6ubbQwulXzG9fYVfEP1D3f7f3XQ9mgoC9RyZ+Ls9EGm58Zb/W5AMni0Ic5ZoTMzWsdMLq5uuP/93+7/rOLtou4HN4Y122tIEid24irpySjkxDLqbMsQWGIvd+mu0O52RIN8ktvpf9km2Az3G7rCQct8i9h07Sh+pJE9AsvafI3SBgz3nVotJQtXmHU2xSzMEZd+PpBF2ALgFVKrPLybWbA+Gu7DnbuiWNrLMtT0QChTPLFDeXAZg9972k02Mu4fIMlzpUuEtY9Qi41KHGXsKpOi4Z8nCXMHrSi35El4hziVqkw8wxCPg8NidEb0Y97CDODM793cd8QzR1NyWW6b8ulisGZ4gdqIdvXKft9jniFHEOBF9sY77ZLETPyZCKnUrrnlhPWT9Zt8LS9Q2COLcdgm+tgyA63sJ8wHb41CmRaZjeJeAGdfTWrT//FKCCsD3Y4xjpx8tbt4cp9HNfnTdi5adPD9h+PTDol/p699eOzvT8jz5UKOf48d9+A189CJtf13DxTjZktli7G4dPtiZXe12EHcvepi+2XJxe8QbheJGXn9w2fNLd6L5NQ3zSu2UwjXXBn9Ky+ryVcrOqX6J9OYq2wwA/u9GBtH3gqycas2Y58Ow36UsslzAOFxYktzIerQMWLG6Fb/U6NppxwrFALE8RAjKf/Jk0dcxpyZ7SPISi/H5xXnJpivSZzKf07ktmR+0KutikRsHC24lQ2ZEI1K4xKHFGNnTgRPff61yds33/tpeaYznhZpzm23uB/544JpTs0875JGYuUy+anU1elClhfuJ4twM1a+JNkXLUz92CWbSrvhxUAPlfb4si2C7x9x9KLAsW2QRGV0XGYMesGZ2WnQz6qiDU0Tcf9clWqrZsDYBWIrbtgBoo1rLEQj42NmK84EbutXjbXwAE+Asmq1hdzt2MVYxu566OdNQo9Y+87u61kKy7rm6bGJzs7laH0UdN56df1tXWpqXU1AQHGr+drfj+vZVgqAVGoSei20nT3qnL/Y6HgvV9xmHQYXrz0s3TzKOZ7wqW+/MksC1sxwzyhvDWk+XeTVXet6dZYyXdgd2HtwlzvS4eW7AXO8fuoT0+0DXwHhOOg0h7t4swRaVaVtrdNeMw4jDz5ODBcNnAwC2nAadpD2Sq+ln6yoIsVmRkmz0+Qps14bgd5g9FRFIszd8r1ezlBGtySX9k2+AWYRLALF0qZ9ZFfUmuRKrF3ORAJSsqMlDby8sdZ0D9PbDGEelg7ZOkqQzCMsN8Hn96bXyX6ma2bA5tZjBDzy0zm3RbGqMaeyrrVZMOpE2cScM01oCdNrxZ4yOUstdvOX4MINgbNXrvFkOlWDaPNh2kyjvavWEDVe+gp9Jy2vdCT9Cm/y5MWbN7ABiLs7DaRG1SXmLecVeyXEQVEHhRFmCg+lANzvsBWLDbzmX1if87EFs5OhYQnpD61DnJ4HpQB0Jhv/xHOeXnj5pwn0D5+5lNu8+YSe+KGfdpdEml2gGiIoXsKO2mtVmCyTrtrspuW/5R+Z8/rLIyUYmsxq1EKhMrPh6YZveAQob9HJ7JGFV8OWN7JuRRRre2783laqH1tbPUjDMZatNr1kK1iWWa8839FvvRVfCSa4YpK8OYQUmlpUkQ9a8XBeGBRtkCw1ViJysslLEc93pTlMbAvOVx8VRE4rJi22+z82TUJ7H4E6r/hyz5qvup6dvdRc67dzkWH/x2a6n7VWt7fyo8RVtvMKQHIT118MUbEJywb/JQhcMvYgx/Ch63vtWDN1XLA1KgaF+m8j37nYUy0i/F0FPnfzyrm3EKlepW0Tp7Lb81Bf6xf15ZPP7X+MkW0qvuzfzI/gzypNuH1maz6XbMhJ3a0CvLLYDF8iujxat267qYt5ld6+wiOIg1utu6NQ4EP22o7w8wgH/wlRw/woqbFD5lt/O2NItc6G06zL2t3D4Q9opLnHPRaMFPt2xvs1i3rY/cFmDQlcPJJLY1m/yWDBqSfY5wxO3HAXcCBOls+/rKXavFcN/jR32wCI8eBYG+R4+diatdnfv6ZlwmXHidexAr+vpWIGoRjSI8BFoLCIsA1NMubBpG6ZkB3c+KKTNr5dKKzzvmOkrKxIPmm+2Bv8LcxvlwL8cLcRz++BF5Anlc6HFAuBw+Dp9w0zMd0JudN5+b+eleaFK57qvsK8+/x28bhYPQ1i5sD5ykdovtMehiMU4J/CNJAsDOfZ473HxQ7CFSU6rfSoOz/rFa5pFpgROJfM6T7YhCsFAoZFCXhocGicbSWEvMavxyDhx1DHDvcaQKCgSo+vCCLH5EiUkaDXmcgXCcRTEEpU9UapIsNjmDFflQIirV+IhEqRssUEZpcMuDrMV4FTNhiWsiiMXUmCcRoW1DFK94W7UgJbS/MfEqmnPIh1/Lio0V3LZqkOBouwWN3Fgg2CG4M4p2j963lx3PdGZHyUEExiQfeCZ5tCrcXzhmbWVsa1y9c3VTV5NOs7QgJQaw4EXn4C9XVphzEAwguUdwxblIYh5Rsljib/FECKKWeDKPQSQlLh2EHn33g5WVSaIOefSon0KJJpZW+1b9OvpeHGRWZ/tPOw7/d+ezMvYwLYrVSEiHkiSICATtpstrQQRKgxD+0YpVQbGIKiqLfklgUhYFNQKeG97qw/2RjaAijwVpYK+0ulq2Lw3UVV3LCSGW244tAbuk0wlJYc9tq107Xx3bgWDUMHkVhYJkACBX5IEIX6sjK3giqgq9m9i0Ad3EQIL/ikqiMdX0NtMtOYxlKBQGi+SbVVY0xm1JPimkmZjBVjvK8+39vmIQEkLvJlqY4Q7G3tfXwZUORE17Gc1VUCXnkF+/TgLp/NfJwXxlzt+RX78qLn07daanjbSqabVpWfOmpxQW9s/zv8fFpaR+W5+5dqBt7HXzGmEpWDXJOmhLgXXC0e+x8clpk0s2GtRbY1Zm+NZn/5TCwf554WNs90XXZawbaJ18cAcvWwkmLaXmzqPfYuNT0sb4tlQHsNl9kSs9A1XPippcSTkeL1Bn2ER/CHRdlEGvR0XZrbx7nCKIz1BH2wR+0Hk1dlF3L2WtnMT7X8p55LdvI8KeTwj6+A3tEZGrOboFj+ITYFcFFakgKJBUhStM4KPwW4Y0OSd97w7vPY4x3YUgyOBwZfpZO8+S0mGZExbeZYo+sXf4ki9Yv6gGlcL9Od3te8lZOxO7RO6sIZ69jr69eaCbTeJSTCjXS74HR//MRaXUuF33xyP+RVKLkRVt26oRekQ/VVAVxVTkvwi8/3XwdENna7A2YdVSILOm5njt8QUVB4TJaqPMEIzSza7cBM6iHu2GUumi4MSActweJS4KGb2xvIxYjt2TRJbkhvLUiEm9wwSYerW4dOqMkhkWTlXfAKFnzqwPBW7mK9bYJe+5f+xyivslMDUesTgUBPfpo4I2jOh/Kc5zb9c4pWR3FHs0STySSzYNFXs1JCxe1BDVLl0Iqfsf21ZBrym4evbflJ7x//KvAeFeh6gton2prl60Ufj//5GjRAlBP5L/oPxxBSrqS0cm4n0ynggX1XheH/Gv5kKQIA6FxbrkZT34YgqJdleWqoGr70I45433roakHZ/X5bq8Nl1lsAOuFrIG7q4Lz56/2oMX9HZeT7YUymmpjzeiQSKuIMlPWxWahE7C5if5h08gCEeAabz9YIm1kB0RZVe9zg50mWz6uzGP3g8iofjA7M2OsdPBK+QJYHR+XWBUn8aFudhf0JtZ4+sJDNiEgL+n6i+JkIl0koiUFf4jL/WvGL77Qgqh1iSaOWOR+NSUvzNvpy/Lb42ag31rbGalZogm6/ufelcvP7YY4+uEWLmfaig44Xsib9HcucigNxO6IwlHSq6sfTn2uzHz848W6W89IxHO75bZuARsikpPMmugZUEyWt3Kv4BXIvrbjTs/Lt73nfZb4hmbs4m/2fuX8LrNeOJZKgDz6uPOhinde7f3vC9uX8Ld1/m7pKgESSnJ3udnkUIXR9drarbfpQzzolPQ6cOFi4hCwXTYUupSR4nFQOeQl4ansdBoGP+favRy1f52iJfGigLRKKxO7hxNp6alOOMAQBRXW1TzGD635ol0qM/c2Uyfcci9ABVnGhnV8cyvPGsdldgCQtjbTKvGNu/O/LBdaqNr7dQxKA7Fr0BfypUq2/g8t/jUu0oEJEnI/pbHpCOc02UXX1a6iMwSft24gX4oGHEEMRizUAOjbNTuoUFeIts0Ak0AaU6ILGO9UdsGdzeDnpE84EAyuEV4iGvjVFg1MtcBRqj4dlSW0EIILkEL9iJns/s6iGGfkcjrhMAdkOxJDrMMs/po+bEzkGS0JEj7YSov7p5mzTNVS+KdzaQ/ecV6QUpDiQZSgVWp1PBeQiJUrIVimdoOmQL3lElNgoqXQBFQeHFGEhQHLctAhKPdJOqTuFv0WzjSN/q3tbgZ+sxcnDn6HBh0oX4yzz25shZqhc5sh6uAWFLyiJVdFni/0IY628FBlPR0+KdTlU4qp6tO9+4qGClccSLaASScs3u1bqPQoZ7ViBxEbk+zHqHDrknhmStMFmWWZJI4TPYYNZGZtIfIZ/oMscgpAsR/+Yh8Yj4pKiYhBJ595/cOltWtJ/VlQfNyHcFsPbLahGbbEH7C9kQg+iSDyIs8a3s2/AcIit61li094fOjpMrUUQmyN/BkY9+34X8CUwEu5Iemjrb7Xw7zi7eetU+MKa0kMc23yO1WR8LpYL2nV7rzavi3JAQHUVtV+47zLukaZwuSwSez4jiP449a32nSlV7O2mF3XyNVr2kQsTtle2OGyq6H/U8vb5qEj+aQG/8stRvxCHfqAIWKk3YIaKe7NSJtC6w+joEZSd/5MdbmUSZxJfst9oWn3E+AyiE59qDtXcSFFEby+8CgtHgRC1++J9rx5Acr2ckdJ2k3Wisb6/Ci37QVYsuo8qiOColn9OLQEvO3v4KccbYrs5JJTJYeQb79Cz5LlLOOIPm3nWISQO4NikVREVlAmZ/7Wvd99UUk9eSfB3R7nAoQtV1pJBwQeZT+fOIu8uPZw4/a7RuOIDZmeSES4RoV1ISY6ol79I5TcB5EDXmSPb2QXkD/8IY9UZ5Q8lKwBLXl3qSfi5nFP1tehfhVnvHMulrCLLlqCQRwGm+Zv9lFM88YT0+0J+H/8KgHCB5oi8QJRr9PQSl3oTFF9B8+JmtPSoWZaJ0pppQjO8MuFW+0F8dUfVG+X2DgcfmdJZqbMy9MifT5x+J3jqb3HLPZG8T2Sw/ay0obnUa2SHf1ZhFi/lOJvqbkoY6E91IVsz/t7EXysSPDMRF96F9x8dlSojRN6tPJ2KmRchR2D9FFcBrYyWKJpe+RTEK0WUxNSXlClCOr0PQH7xfp0cR/GL+yRGgSWo8qRuej8S72kgdKCwWxjpXIYJeaRSZGH5hVKslk52ZZoa1qQGVzr5fv9+MN8Bv7JybmAljWuqeU/qCSk5HgvYw0HhPzpPofJ9N2ClKqSZYCQfkvLKSU0m7q9E+1Q1XYPxD0TxhloFBJb0WMu3NiRUEJzJOxJE05iB9DVLPxfqhAs0dHvlv1cm4WosQxJzkuYTDcSuMaZTcxiNhRokgAnd6/QHxIY+oX8PCPfK+dfv415j6ThHxFwkVY+T0RYRUfv9ZCjIi0ER4alNlo2ONV8YnTjgMOt+MTpEucQDA998QaXQRTG19GS2e1LL/xAuum4huoPaSY9M3czdZPuWlRVE9rvJSoDtIG5QWpcNZShu1nh8+2js52xk8Na6AufoWVU2GzlzvoSnjauw+xDFHbaMvRcziDds6HTGcSDjl/Gl7kanHNjZkMbx2VGib0j5PNunZNBpWW6yP8xwr20fba2gJ8MjAJ/pZpjulJblmMYDlE0fZuKwbbCosLeznaXgozJqazU8/E4Y4UOD6Z0R/J7+t5SUa0BRcJZ3e/upw2WdpNN6eaMroBC44YQwKAHKMAQLAdl6YY523STj2W73wv4UQR6fk7U2f6t35Gn5mFbXXuMiHHJz94kRl+68eQPIxcIsOzB56YgHuIGgSENxnp16zVNvvJ61jbJmpYJl3OrdisTH3rDl5XBBR0GN/OUE3tdnVUyB9nkKCA0yJ9F1mYAKdf7EVM3GK7k8Clt+Bu+aQnbEidEbLcVzO6ES+wge6D+v6x4U0ZfBaZeZv/QHK+ZMOk+9071AuSV4LbSFmvbjndGhi4IIYqMe00IJFLYhjAnq10HZjd6mcQNAiwWbm5Wdi+xuC3ZRZaN/JXx2g10KTNL5PbX8orLR3hOVPr758I8dz0vH9S8alpk2mBxvqJLdUh1b85wFivhioqoDalrihXI4iScLMKdX4FU0vMyxfkqxlTC5T1UESGJhxSLzIyIXkWVUl2XEL1g9KAjOKYSVZSNz8BH2dnPwJ8OCfAx1btDlB9DTVQxDyNpPBV9pmdnpv8m4N8aj2dSkOQh8DsrE/OIg/xlEJn5P3IN4Eh9Hlf8jvQ1QRHNQX2we8KrAJ3w5Mn4DVAObgb5ieRERhr7jIkqrJzb3VrDCgP8qogcLRY5K6Fu1euEneRu6DwUVT/gVP8oqVSUrvP0o/yYKf1hgcU9IzHzBMz33N6g/XOB7bxXGBE74enp+H9RArBdvxqSBaNwjfdA9ceSFfWqUhqyDrAosLIE0bzwHsukrvf2t4xIQNjlEHYOLf3GcM8kBprtVgY8tTCBHPBHVmYtehnAO7J33feME/ObjwTcI1VSTtOXc649mxAh6KhaSgd/8NMeN/58H1PqlWh7QfkhdUKhdZNW9VAq59nJ2ayE+YZ5UPG5ieGLwgvWfqMeA4hnaXAS0D64/VP4Az46fXzlgeU7TqKhdqCottOebCVPOqpW+VZNtKiAeatAsf0AjUVtJpB5g3LJFL5T1cEVW6LOTDXT4T1HIYwoeeegoCpI7VBkf2qPHAMfv8BeRQ+9uHDMWQbdHer5wp0YlOWU8bOjIzf/l////XMOX5k/ZGdSq9LLf32cW7svA9T+BOXp0SCE6gm4F/e2WmvCSQQ5NZyoL2mU2hEvoKNwnmhEX6FNFoFYbDzWMwrjO6aaxVRPuyaDlMf1LiLNB5Z2eirRXJvN57Q1dvbRcB3g+DsSlFstJYbGA+kLv89evRfthYPArXc2Gi3vEC/ZDsgiEtNjJEtT0rcvdxk+e7E0VqMLDVREAfskv0CJxDV0Wbm/VBSWakS6l0SuHu3x3uV0PZZCCWZ90ebIavAH2bMXkdOzZJpZJJJop07gMHoTMNDa3QadN4ANT1IXujcQbSmqyvO06ALoZQn6UAQHWthcWvo7NPiQOANuxe6/ecfAnTgq9Id18inBm0n9xXdUL795Rgthsa0i0NafFtKW3JrSiswfnqYUE8k+7eh+vHlIP+gy3kiF4gZgYO0cGO05V42OR470YmIIkWS4IYJC3I8fVOMZSNDTcNbhEMu3svvRflF3lO3sQhnQmqTxhjLTWxSvMVTZnh0OKJzwmKxYO+Ntmw0UUM45muuqI0rgxYvBjKiHJNB4dwpCBLd2d7/vtpd7HwwGahBQ45V3M/J1+IxtSFbDWmATFi3snlTcEoDmGj0K/JIve+R4lc80dAApXT6Zz0U7wM5niBwyuuzmdoJ5I17HYvfil4Ydd6xZ3nhzUhRXa9X8n1eBxCiGq4Q6kR9S7ALa8C9tZ4rp5XL4TDiOvV6s2bvu6YW4Usq/mqQtad6bkJGF2VEgyhQnIGMdlXellqw3XLdbSiSnqACDfhfC4pygv3jl2EUWU7Z5Sr7BjVobYSb4qweBco5Gon2Edl+uuRelEViS/o8033sVxTFaAixLLHccd1OqwiXLBkHFNbbJSV9+iQRO3bv8M78j+gBb+NKxvnP66z3dCTnu+9NPRDBcagFYrj/zse9VmVP4oirI65UldJPJy/pjCuzDswGx5KE8a13LSMb4gELFpw/3/cdDm3ue9rs9YcQG5eF9o5j/bW85meBIv2yrKmrgJFRDmKj/71FEvuNyV1kNvU2XVJOhx9JeAsbDWIzywsYtFCrMnRgR4vXgafQFuT5L1/AyRzW4n88VodlNFMxE7emj6Z2OLICvlTCXkeiYzayPYU1TFlldFSvwwoJpxiNCIct47/ulqY02wkDi0zUzdpERBa3hIkxvVNuT4x8WddxnDnpehx5w3tZnHe4k8OiIbgaQvRaZpXvFbY+clAu/9BQ3fChHMiBd6L9N5ks1x/I/d9X8arei10Oeumu5szXAZYBjmnA2Ppgyw0beON8QuQX1A2FhYIcJrCQCau9rECHlbWJVdak66SjBvE8M+4zOvhb8GHRx7ErBLXb4QvnkO2003ivoRu2N8ZwXndNZPuFc+0fXp1+j61FFLe3FweL6Ag67IrTHxaRG2uwFKdPWQHFVtWvtrln1dgDNQ0IKO/09Dygq9iG8PQwaXNu5Xl4wHtxoofnjUJvMM8CUoO5+SaFcfGFJvnc4FQMFKvVLhnntSHgNceOtyDWII4fD0eMbhYIKBvhcIY/HXJOmDF1PmQ3uAh6aTMm72rEjyzm9RoFN2GZfk7gJwAB3qfbry08C4o9PsuI5jBgcaBJIELC4OBHR3SwvpBD7l5baDf/6PkR1Ml1RGe2exURbo5/lu/sZZuFa5uD757fzdsXrnnuuxdMjma88fN7kxbkEJDqb2Ybxv9jvDan+FPSoEJ6Vd91vxtUvW4E+HfsNidP7lbjBf+KedWetu621YE8MewEeq/+vu/b0xEt6pb7LZR2mJGajgZ880M8dHJ6qLfn1yDwmcnqZqB7kPfPCYXHIdP4Wy9NUT3EEzEW+xHtC5v2//eFuP/+cmQMJh8+AcMRGGTUJf1+EEJraIWzYZTy28MnLXTmM0p59PB2msXoxx+QZ/a/sfmppxX3bO7x4/ZN1RIoNRWIgUQlCcR7JUAsPRXub7ei0JjaaEEAPZb6xHHCaYZCnXMadXpCpd52GjmfZAfNKVZ9Wzn1Ll1qoq0cQ9FwYtlxbBAtdSzqivCaw8BMBkJTX6+BiFJGaBgRmMJv/OPH54+g9U1ifWKkDkVvYGsDpDHUZ6KHnRcghOqIpvsRbqeHDEOn3SLuX+2r53bf0kPwzHLA8pnAw/K+W/x37KsI1BmcAXcGFTGg5NJbqAPUFvp9cLuswQpS7DY5vbnmBRnSW/TfHuN/pccFjFNuXIbeoYXBBVxGi4OewXVr2BJTgMYujWZdSLFdcvvKtnskeosEXFcjTVeq6Eu+qwchPd2N2wIGBieAQOm4u1eV351Q2CXjB6538pt+8r7K+FGW0nuvMCLberVjobosnB5tO6XczM+/2dOPVlWNsrvZEgDCbpoIuMl64muBMJySwfDlpkOuMP7PH7Hkhvn7z49Nr+2/Kv6PU+uHKKMC1IbzDvF4wJtmeQNelneWgP4AfAehBwDRttmfKeMXWwkqjRa/v6KvlqA0qL9e7LhO0QgHkM3IAS7dGB4Fxnoh/vKBzXOU8PH0BcwRysSN4VSzBmS+h3RIYgbmHNh92aEh2FgFHMdt45NfPc+QzZx42S7u+HzPHa6wUJhXovcfwLBqprtqB+rrhx/kmEe+/UeqQsn4amxu6iK3bbGRu+gboMLmrgKqUiEk8sBCc7thYDTZoyi5f3BBiFRxaAJNQWl6fVqwUMcAEUtE2fq9y2ipaRQVBedH8CyalvoD/dzNU7rYJv3xFNCYR9qtzzFgfNe+br8WOazfcXN3e+YwuYcOkG3VjYBfo25c4lLhWu1a4SIZN6y6yxkLK9pRiw6WRII4U9olMS5GHcRV4w6iJL3gtLfqHNQxOjjV5L5jP5zS4EhiK59Kd3gsCwVRwqbzZ6cCrG/84pP3JMwH3+EqXL5ft5ufT5VSEQd19GPf1iGsTTDYD9tqbV+DpaCfJWX1gPcYQV9jXDNeYNJkSaCfu7UZeTyXKJM5Kj7v95RTx7adFzaBKAmf2NeVrq6fDozm2TJIRgFve6TlFE2xxUax1S4ZE8u3UHJUca5ptACpF2WSW6nNC9eG52krT37myC675DZRZD050lb+DtSXBmnb/tgkywk+pJYDnCDe7sUkBnnInJUO3sJuFvU7LmOTQhfwB14sj7MX2Y/h8UZ5ebQskjUX6xFFUD+5ruQ/+TLIHQevZRVhbh23tJNNQ6+Y5tas+VoNjfJNMGuKDMx4cmtXA/YB24+Ku2qZdO8BHJD2rvaSxt/1E6r3c5cnZc88z0GrIFcJJ4GyKV5UnjEk7vFKfwsmufbwtoWZx9POTTKL5MtcSt4bYErIwSTE132kTybxbnbkRZ/3EI6TFMOC9ER02QiGMXEORLBhQeAgc6Q7QvnpnmnMygBXW07yRzEmTAcEnFKbqtc8lg2chHiu/5Pfl/rOutLrOMCVPRU66TZpu9CcHnngXBFblDLXHHWg+0p4XfQmYCAlCNLoFDiebubEjhsv9ej0MJxSwiREhAseHjNwg/i4gwN+0jnazisISAG9z3IgHHMsDD7cdJIvxDfdsR3P1s6iwzLZdz2N9jDwMO2KDy0Q7HSlFY6ECOfD3JkOloDUOkubJog37g66+MsbMenqid3syX1B4RNmDtAbmvmRVf1j2rkTQqbEDyU+68sS/RTqzIZTvugF+jl6uTZ23OlVG23l5M5hJNQ0mYl82yJMY6iAzpPMuCSqv22TiATxbX/R4nMCbW9NphE60LzL6BJvP+4yThA/R+oLCrmzZIg/Q/n+7n04JNXuNnXRjfrwkhQ5ZmpB0MQqAQ70uIpnxmygIA/09gE8c9LGMWbc5xE5xJEiaU6FZJCe2lzPRKNLjRIi1kdgKG3D/pvXgUiiUzzOxXX0DdH2Nsp/+Me2qce4uY0+IWK0ae5ANY0O94H6zSIUL7fj+m7j4ZekpofyJkmqhNiSHrR9NoxBcKklxJsR7yeR1dFD1ysfVbZRtuKvYVn6jQl2Pa1u4/1qD2QkiHdLcRWV9PXxjKQt8+sGSDomSomslSIOGPqIA/R5PtYImrcaC3Y0iGlMH3P1itsQka2VCWv2OtBAfKBfMD0E8VyEj3bzY8Dob+6OvpD/mzAUwDd1HPiKBDzz8kduCCA1fmybvXKohuz/E7Xt/NqLQ3wwQ/GJ6MjbD9Do8Mj+K0bH8wE4mkBmaP/YBVywiwD4mnkfeGYTGUDe3UnARwxaUNT3bdOUSL2KAEvg2M/AsPEjLAcn67r7ORAI/Jywwvy83LR6fT4MUw0BZUcBqlsx8CFUl3wEsgs+jOo9B+l+56OY+c9HowbYx1MHBpNDAqcwolpIQAsxbL+gi7VUsXU6bfqD/Sg0blfiZ/7HmLomvKQy0fWfaBgibOZ7f12aQhKr4WNwbCjFgov9gtej6PK3p/QWrY1H5vpwggZoIYbtFr6ssrX01tcp9sD/YD8KDcZOly/7H2PqJx5eHp9T+D75lmqnuhjneX9dUE0hjWWr58gHqoZSLDi92i94PQqH6m9PuytLaflH+ZH6qYGvfbvcNibL/0LBFGXZ2nkmeVe3x+vzA4gw+ZUMfVGhU1UqbazzQRjFSZrlRVnVTdv1wzjNy7rtx3ndz/v9AAjBP1aHn/mLxLONifSzNllxvCBKb2KWp2q68Twxettxf3b0AxSEUZykWV6UVd20XT+M07ys236c1/283w+AEIygGE6QFM2wHC+Ikqy8soeqG8/i3R3bcT0/CKM4SbO8KKu6abt+GKd5+YOw7u72h+PpfLne8AQiiUyh0ugMJovN4fL4AqFI7Pml25LJtbSv7tJB/tBMwRuzudgO1ByO07HlupMvSmhRD/15p/Xy3EgK4ySTuOEMGwFlnmxMMQiWMqEVQcaeaaMJkGXLsC7RmyVxI7Z6MM1fTrQoy++ic8ieSqsOSV/d8CmXp100JloyZFxpCH8cCFF9tPrMeIutGbpuo/tkB4J3Wl6oZ5jlk+ZsTNCcGr39RuF9xv7h1nxmweX15K+vJLegUOlwrvAZpqJ9aMKNd9OSb0O8UwvCKXhWWTKu+6c4Xjc79AOLJibjVAsaLlxwPNufYt4Re7a3FFttkQ2GsFyK6WbGWnMkFEBjBFBjm7AurDwns6iciBeuZOLjrlWpFu/gQ5vLXLxETJ/2LucldX+WyrJkeb5I48Nh8+ibQwqTj8ioOX1Sw4e6pLSiHJJIR7GdGrTnl93FqqwZSvFCOc6jMR6N5dRztiZcBXI4EOWu5pTdETV8r4xYPcYOqZ0M1Iz6PB8yFWBZcrN216hjIKir58345V60wkPuUoEinHFzwO7eDs2JsCdpqjIpZJ3zAr9r1TVRWbjEECDR7iMFSxH1k8bLJxVEHZgyUgCZBj6JAsu4Fawee5s5HT6ZfECmdIqKegsoOglC/0zJQAAFo07pPAWouhaIFniwH2U7ErVzgYyBSKpwE/LGq2t3rEQDYlJfXeokwGbtRWMagrd5S3FMmtEvfPV0RttXVhP00QgyNZWmULkKPDVwgXrMGUa6Nqdh0qBCyjYstQkmtAAjAXvZgIZJBi7b7v2FhBKtExYJ5a4Hu+d1oxRq/iK2eki0oPeEj1OWneh3JryGGVrlvdqOpOqOwGz6+CWn3u/T/a3IJ3FBevI1zIBdukX8BL4ds1y7rUtSRbnjDP1etwvSN1HUdbC5r8ddUqyiwiFBmxNv9RpmfXt10aJDAFX5oH5CNdHabugdixB1rUtLYdnmKXwcTy3yTOLZGQJzetKitZgpIPjoLzMF1Ton0NRLyhu6dNyiQUuG6GMlWO60RaOWzTX67usKiuFECGN5oxXp5rRsZAG14Eyuzsqi0lcsIXbhZXfE6EcNZIbQMe0oYAQgasNMBz3b7BUkHTFTg0RHoQhMlFZGGU/ejdeMfwpLflT1HFiEd7znbVfdav94mdP3O1MIyQDLftKTl4cVRG0qHVMl62E/A27D/FIprv6AhPMnZyCtkyiY2+6pcPhsG04nYIZDR726wQ2tPPykY/qi72XWgLJd/QA7GNW5ClDzf93Ax5/xDwF6LH+Ojcb7g0HTgZkhDLg1su2qLt5SbLB98Sv0n7jS8XkU1BIX6/wZHi1U+twvu9VQ3N3+DwAAAA==') format('woff2'),
+		url('//at.alicdn.com/t/font_1529455_k4s6di1d1.woff?t=1596960292384') format('woff'),
+		url('//at.alicdn.com/t/font_1529455_k4s6di1d1.ttf?t=1596960292384') format('truetype'),
+		/* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+		url('//at.alicdn.com/t/font_1529455_k4s6di1d1.svg?t=1596960292384#iconfont') format('svg');
+}
+
+/* #endif */
+
+.u-iconfont {
+	position: relative;
+	display: flex;
+	font: normal normal normal 14px/1 "uicon-iconfont";
+	font-size: inherit;
+	text-rendering: auto;
+	-webkit-font-smoothing: antialiased;
+	-moz-osx-font-smoothing: grayscale;
+}
+
+.u-iconfont::before {
+	display: flex;
+	align-items: center;
+}
+
+.uicon-en:before {
+	content: "\e70a";
+}
+
+.uicon-zh:before {
+	content: "\e692";
+}
+
+.uicon-level:before {
+	content: "\e693";
+}
+
+.uicon-woman:before {
+	content: "\e69c";
+}
+
+.uicon-man:before {
+	content: "\e697";
+}
+
+.uicon-column-line:before {
+	content: "\e68e";
+}
+
+.uicon-empty-page:before {
+	content: "\e627";
+}
+
+.uicon-empty-data:before {
+	content: "\e62f";
+}
+
+.uicon-empty-car:before {
+	content: "\e602";
+}
+
+.uicon-empty-order:before {
+	content: "\e639";
+}
+
+.uicon-empty-address:before {
+	content: "\e646";
+}
+
+.uicon-empty-message:before {
+	content: "\e6a9";
+}
+
+.uicon-empty-search:before {
+	content: "\e664";
+}
+
+.uicon-empty-favor:before {
+	content: "\e67c";
+}
+
+.uicon-empty-coupon:before {
+	content: "\e682";
+}
+
+.uicon-empty-history:before {
+	content: "\e684";
+}
+
+.uicon-empty-permission:before {
+	content: "\e686";
+}
+
+.uicon-empty-news:before {
+	content: "\e687";
+}
+
+.uicon-empty-wifi:before {
+	content: "\e688";
+}
+
+.uicon-empty-list:before {
+	content: "\e68b";
+}
+
+.uicon-arrow-left-double:before {
+	content: "\e68c";
+}
+
+.uicon-arrow-right-double:before {
+	content: "\e68d";
+}
+
+.uicon-red-packet:before {
+	content: "\e691";
+}
+
+.uicon-red-packet-fill:before {
+	content: "\e690";
+}
+
+.uicon-order:before {
+	content: "\e68f";
+}
+
+.uicon-nav-back-arrow:before {
+	content: "\e67f";
+}
+
+.uicon-nav-back:before {
+	content: "\e683";
+}
+
+.uicon-checkbox-mark:before {
+	content: "\e6a8";
+}
+
+.uicon-arrow-up-fill:before {
+	content: "\e6b0";
+}
+
+.uicon-arrow-down-fill:before {
+	content: "\e600";
+}
+
+.uicon-backspace:before {
+	content: "\e67b";
+}
+
+.uicon-android-circle-fill:before {
+	content: "\e67e";
+}
+
+.uicon-android-fill:before {
+	content: "\e67d";
+}
+
+.uicon-question:before {
+	content: "\e715";
+}
+
+.uicon-pause:before {
+	content: "\e8fa";
+}
+
+.uicon-close:before {
+	content: "\e685";
+}
+
+.uicon-volume-up:before {
+	content: "\e633";
+}
+
+.uicon-volume-off:before {
+	content: "\e644";
+}
+
+.uicon-info:before {
+	content: "\e653";
+}
+
+.uicon-error:before {
+	content: "\e6d3";
+}
+
+.uicon-lock-opened-fill:before {
+	content: "\e974";
+}
+
+.uicon-lock-fill:before {
+	content: "\e979";
+}
+
+.uicon-lock:before {
+	content: "\e97a";
+}
+
+.uicon-photo-fill:before {
+	content: "\e98b";
+}
+
+.uicon-photo:before {
+	content: "\e98d";
+}
+
+.uicon-account-fill:before {
+	content: "\e614";
+}
+
+.uicon-minus-people-fill:before {
+	content: "\e615";
+}
+
+.uicon-plus-people-fill:before {
+	content: "\e626";
+}
+
+.uicon-account:before {
+	content: "\e628";
+}
+
+.uicon-thumb-down-fill:before {
+	content: "\e726";
+}
+
+.uicon-thumb-down:before {
+	content: "\e727";
+}
+
+.uicon-thumb-up-fill:before {
+	content: "\e72f";
+}
+
+.uicon-thumb-up:before {
+	content: "\e733";
+}
+
+.uicon-person-delete-fill:before {
+	content: "\e66a";
+}
+
+.uicon-cut:before {
+	content: "\e948";
+}
+
+.uicon-fingerprint:before {
+	content: "\e955";
+}
+
+.uicon-home-fill:before {
+	content: "\e964";
+}
+
+.uicon-home:before {
+	content: "\e965";
+}
+
+.uicon-hourglass-half-fill:before {
+	content: "\e966";
+}
+
+.uicon-hourglass:before {
+	content: "\e967";
+}
+
+.uicon-lock-open:before {
+	content: "\e973";
+}
+
+.uicon-integral-fill:before {
+	content: "\e703";
+}
+
+.uicon-integral:before {
+	content: "\e704";
+}
+
+.uicon-coupon:before {
+	content: "\e8ae";
+}
+
+.uicon-coupon-fill:before {
+	content: "\e8c4";
+}
+
+.uicon-kefu-ermai:before {
+	content: "\e656";
+}
+
+.uicon-scan:before {
+	content: "\e662";
+}
+
+.uicon-rmb:before {
+	content: "\e608";
+}
+
+.uicon-rmb-circle-fill:before {
+	content: "\e657";
+}
+
+.uicon-rmb-circle:before {
+	content: "\e677";
+}
+
+.uicon-gift:before {
+	content: "\e65b";
+}
+
+.uicon-gift-fill:before {
+	content: "\e65c";
+}
+
+.uicon-bookmark-fill:before {
+	content: "\e63b";
+}
+
+.uicon-zhuanfa:before {
+	content: "\e60b";
+}
+
+.uicon-eye-off-outline:before {
+	content: "\e62b";
+}
+
+.uicon-eye-off:before {
+	content: "\e648";
+}
+
+.uicon-pause-circle:before {
+	content: "\e643";
+}
+
+.uicon-play-circle:before {
+	content: "\e647";
+}
+
+.uicon-pause-circle-fill:before {
+	content: "\e654";
+}
+
+.uicon-play-circle-fill:before {
+	content: "\e655";
+}
+
+.uicon-grid:before {
+	content: "\e673";
+}
+
+.uicon-play-right:before {
+	content: "\e610";
+}
+
+.uicon-play-left:before {
+	content: "\e66d";
+}
+
+.uicon-calendar:before {
+	content: "\e66e";
+}
+
+.uicon-rewind-right:before {
+	content: "\e66f";
+}
+
+.uicon-rewind-left:before {
+	content: "\e671";
+}
+
+.uicon-skip-forward-right:before {
+	content: "\e672";
+}
+
+.uicon-skip-back-left:before {
+	content: "\e674";
+}
+
+.uicon-play-left-fill:before {
+	content: "\e675";
+}
+
+.uicon-play-right-fill:before {
+	content: "\e676";
+}
+
+.uicon-grid-fill:before {
+	content: "\e678";
+}
+
+.uicon-rewind-left-fill:before {
+	content: "\e679";
+}
+
+.uicon-rewind-right-fill:before {
+	content: "\e67a";
+}
+
+.uicon-pushpin:before {
+	content: "\e7e3";
+}
+
+.uicon-star:before {
+	content: "\e65f";
+}
+
+.uicon-star-fill:before {
+	content: "\e669";
+}
+
+.uicon-server-fill:before {
+	content: "\e751";
+}
+
+.uicon-server-man:before {
+	content: "\e6bc";
+}
+
+.uicon-edit-pen:before {
+	content: "\e612";
+}
+
+.uicon-edit-pen-fill:before {
+	content: "\e66b";
+}
+
+.uicon-wifi:before {
+	content: "\e667";
+}
+
+.uicon-wifi-off:before {
+	content: "\e668";
+}
+
+.uicon-file-text:before {
+	content: "\e663";
+}
+
+.uicon-file-text-fill:before {
+	content: "\e665";
+}
+
+.uicon-more-dot-fill:before {
+	content: "\e630";
+}
+
+.uicon-minus:before {
+	content: "\e618";
+}
+
+.uicon-minus-circle:before {
+	content: "\e61b";
+}
+
+.uicon-plus:before {
+	content: "\e62d";
+}
+
+.uicon-plus-circle:before {
+	content: "\e62e";
+}
+
+.uicon-minus-circle-fill:before {
+	content: "\e652";
+}
+
+.uicon-plus-circle-fill:before {
+	content: "\e661";
+}
+
+.uicon-email:before {
+	content: "\e611";
+}
+
+.uicon-email-fill:before {
+	content: "\e642";
+}
+
+.uicon-phone:before {
+	content: "\e622";
+}
+
+.uicon-phone-fill:before {
+	content: "\e64f";
+}
+
+.uicon-clock:before {
+	content: "\e60f";
+}
+
+.uicon-car:before {
+	content: "\e60c";
+}
+
+.uicon-car-fill:before {
+	content: "\e636";
+}
+
+.uicon-warning:before {
+	content: "\e694";
+}
+
+.uicon-warning-fill:before {
+	content: "\e64d";
+}
+
+.uicon-search:before {
+	content: "\e62a";
+}
+
+.uicon-baidu-circle-fill:before {
+	content: "\e680";
+}
+
+.uicon-baidu:before {
+	content: "\e681";
+}
+
+.uicon-facebook:before {
+	content: "\e689";
+}
+
+.uicon-facebook-circle-fill:before {
+	content: "\e68a";
+}
+
+.uicon-qzone:before {
+	content: "\e695";
+}
+
+.uicon-qzone-circle-fill:before {
+	content: "\e696";
+}
+
+.uicon-moments-circel-fill:before {
+	content: "\e69a";
+}
+
+.uicon-moments:before {
+	content: "\e69b";
+}
+
+.uicon-qq-circle-fill:before {
+	content: "\e6a0";
+}
+
+.uicon-qq-fill:before {
+	content: "\e6a1";
+}
+
+.uicon-weibo:before {
+	content: "\e6a4";
+}
+
+.uicon-weibo-circle-fill:before {
+	content: "\e6a5";
+}
+
+.uicon-taobao:before {
+	content: "\e6a6";
+}
+
+.uicon-taobao-circle-fill:before {
+	content: "\e6a7";
+}
+
+.uicon-twitter:before {
+	content: "\e6aa";
+}
+
+.uicon-twitter-circle-fill:before {
+	content: "\e6ab";
+}
+
+.uicon-weixin-circle-fill:before {
+	content: "\e6b1";
+}
+
+.uicon-weixin-fill:before {
+	content: "\e6b2";
+}
+
+.uicon-zhifubao-circle-fill:before {
+	content: "\e6b8";
+}
+
+.uicon-zhifubao:before {
+	content: "\e6b9";
+}
+
+.uicon-zhihu:before {
+	content: "\e6ba";
+}
+
+.uicon-zhihu-circle-fill:before {
+	content: "\e709";
+}
+
+.uicon-list:before {
+	content: "\e650";
+}
+
+.uicon-list-dot:before {
+	content: "\e616";
+}
+
+.uicon-setting:before {
+	content: "\e61f";
+}
+
+.uicon-bell:before {
+	content: "\e609";
+}
+
+.uicon-bell-fill:before {
+	content: "\e640";
+}
+
+.uicon-attach:before {
+	content: "\e632";
+}
+
+.uicon-shopping-cart:before {
+	content: "\e621";
+}
+
+.uicon-shopping-cart-fill:before {
+	content: "\e65d";
+}
+
+.uicon-tags:before {
+	content: "\e629";
+}
+
+.uicon-share:before {
+	content: "\e631";
+}
+
+.uicon-question-circle-fill:before {
+	content: "\e666";
+}
+
+.uicon-question-circle:before {
+	content: "\e625";
+}
+
+.uicon-error-circle:before {
+	content: "\e624";
+}
+
+.uicon-checkmark-circle:before {
+	content: "\e63d";
+}
+
+.uicon-close-circle:before {
+	content: "\e63f";
+}
+
+.uicon-info-circle:before {
+	content: "\e660";
+}
+
+.uicon-md-person-add:before {
+	content: "\e6e4";
+}
+
+.uicon-md-person-fill:before {
+	content: "\e6ea";
+}
+
+.uicon-bag-fill:before {
+	content: "\e617";
+}
+
+.uicon-bag:before {
+	content: "\e619";
+}
+
+.uicon-chat-fill:before {
+	content: "\e61e";
+}
+
+.uicon-chat:before {
+	content: "\e620";
+}
+
+.uicon-more-circle:before {
+	content: "\e63e";
+}
+
+.uicon-more-circle-fill:before {
+	content: "\e645";
+}
+
+.uicon-volume:before {
+	content: "\e66c";
+}
+
+.uicon-volume-fill:before {
+	content: "\e670";
+}
+
+.uicon-reload:before {
+	content: "\e788";
+}
+
+.uicon-camera:before {
+	content: "\e7d7";
+}
+
+.uicon-heart:before {
+	content: "\e7df";
+}
+
+.uicon-heart-fill:before {
+	content: "\e851";
+}
+
+.uicon-minus-square-fill:before {
+	content: "\e855";
+}
+
+.uicon-plus-square-fill:before {
+	content: "\e856";
+}
+
+.uicon-pushpin-fill:before {
+	content: "\e86e";
+}
+
+.uicon-camera-fill:before {
+	content: "\e870";
+}
+
+.uicon-setting-fill:before {
+	content: "\e872";
+}
+
+.uicon-google:before {
+	content: "\e87a";
+}
+
+.uicon-ie:before {
+	content: "\e87b";
+}
+
+.uicon-apple-fill:before {
+	content: "\e881";
+}
+
+.uicon-chrome-circle-fill:before {
+	content: "\e885";
+}
+
+.uicon-github-circle-fill:before {
+	content: "\e887";
+}
+
+.uicon-IE-circle-fill:before {
+	content: "\e889";
+}
+
+.uicon-google-circle-fill:before {
+	content: "\e88a";
+}
+
+.uicon-arrow-down:before {
+	content: "\e60d";
+}
+
+.uicon-arrow-left:before {
+	content: "\e60e";
+}
+
+.uicon-map:before {
+	content: "\e61d";
+}
+
+.uicon-man-add-fill:before {
+	content: "\e64c";
+}
+
+.uicon-tags-fill:before {
+	content: "\e651";
+}
+
+.uicon-arrow-leftward:before {
+	content: "\e601";
+}
+
+.uicon-arrow-rightward:before {
+	content: "\e603";
+}
+
+.uicon-arrow-downward:before {
+	content: "\e604";
+}
+
+.uicon-arrow-right:before {
+	content: "\e605";
+}
+
+.uicon-arrow-up:before {
+	content: "\e606";
+}
+
+.uicon-arrow-upward:before {
+	content: "\e607";
+}
+
+.uicon-bookmark:before {
+	content: "\e60a";
+}
+
+.uicon-eye:before {
+	content: "\e613";
+}
+
+.uicon-man-delete:before {
+	content: "\e61a";
+}
+
+.uicon-man-add:before {
+	content: "\e61c";
+}
+
+.uicon-trash:before {
+	content: "\e623";
+}
+
+.uicon-error-circle-fill:before {
+	content: "\e62c";
+}
+
+.uicon-calendar-fill:before {
+	content: "\e634";
+}
+
+.uicon-checkmark-circle-fill:before {
+	content: "\e635";
+}
+
+.uicon-close-circle-fill:before {
+	content: "\e637";
+}
+
+.uicon-clock-fill:before {
+	content: "\e638";
+}
+
+.uicon-checkmark:before {
+	content: "\e63a";
+}
+
+.uicon-download:before {
+	content: "\e63c";
+}
+
+.uicon-eye-fill:before {
+	content: "\e641";
+}
+
+.uicon-mic-off:before {
+	content: "\e649";
+}
+
+.uicon-mic:before {
+	content: "\e64a";
+}
+
+.uicon-info-circle-fill:before {
+	content: "\e64b";
+}
+
+.uicon-map-fill:before {
+	content: "\e64e";
+}
+
+.uicon-trash-fill:before {
+	content: "\e658";
+}
+
+.uicon-volume-off-fill:before {
+	content: "\e659";
+}
+
+.uicon-volume-up-fill:before {
+	content: "\e65a";
+}
+
+.uicon-share-fill:before {
+	content: "\e65e";
+}
diff --git a/uview-ui/index.js b/uview-ui/index.js
new file mode 100644
index 0000000..d38a3bf
--- /dev/null
+++ b/uview-ui/index.js
@@ -0,0 +1,141 @@
+// 寮曞叆鍏ㄥ眬mixin
+import mixin from './libs/mixin/mixin.js'
+// 寮曞叆鍏充簬鏄惁mixin闆嗘垚灏忕▼搴忓垎浜殑閰嶇疆
+// import wxshare from './libs/mixin/mpShare.js'
+// 鍏ㄥ眬鎸傝浇寮曞叆http鐩稿叧璇锋眰鎷︽埅鎻掍欢
+import http from './libs/request'
+
+function wranning(str) {
+	// 寮�鍙戠幆澧冭繘琛屼俊鎭緭鍑�,涓昏鏄竴浜涙姤閿欎俊鎭�
+	// 杩欎釜鐜鐨勬潵鐢辨槸鍦ㄧ▼搴忕紪鍐欐椂鍊�,鐐瑰嚮hx缂栬緫鍣ㄨ繍琛岃皟璇曚唬鐮佺殑鏃跺��,璇﹁:
+	// 	https://uniapp.dcloud.io/frame?id=%e5%bc%80%e5%8f%91%e7%8e%af%e5%a2%83%e5%92%8c%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83
+	if (process.env.NODE_ENV === 'development') {
+		console.warn(str)
+	}
+}
+
+// 灏濊瘯鍒ゆ柇鍦ㄦ牴鐩綍鐨�/store涓槸鍚︽湁$u.mixin.js锛屾鏂囦欢uView榛樿涓洪渶瑕佹寕鍦ㄥ埌鍏ㄥ眬鐨剉uex鐨剆tate鍙橀噺
+// HX2.6.11鐗堟湰,鏀惧埌try涓�,鎺у埗鍙颁緷鐒朵細璀﹀憡,鏆傛椂涓嶇敤姝ゆ柟寮忥紝
+// let vuexStore = {};
+// try {
+// 	vuexStore = require("@/store/$u.mixin.js");
+// } catch (e) {
+// 	//TODO handle the exception
+// }
+
+// post绫诲瀷瀵硅薄鍙傛暟杞负get绫诲瀷url鍙傛暟
+import queryParams from './libs/function/queryParams.js'
+// 璺敱灏佽
+import route from './libs/function/route.js'
+// 鏃堕棿鏍煎紡鍖�
+import timeFormat from './libs/function/timeFormat.js'
+// 鏃堕棿鎴虫牸寮忓寲,杩斿洖澶氫箙涔嬪墠
+import timeFrom from './libs/function/timeFrom.js'
+// 棰滆壊娓愬彉鐩稿叧,colorGradient-棰滆壊娓愬彉,hexToRgb-鍗佸叚杩涘埗棰滆壊杞瑀gb棰滆壊,rgbToHex-rgb杞崄鍏繘鍒�
+import colorGradient from './libs/function/colorGradient.js'
+// 鐢熸垚鍏ㄥ眬鍞竴guid瀛楃涓�
+import guid from './libs/function/guid.js'
+// 涓婚鐩稿叧棰滆壊,info|success|warning|primary|default|error,姝ら鑹插凡鍦╱view.scss涓畾涔�,浣嗘槸涓簀s涓篃鑳戒娇鐢�,鏁呬篃瀹氫箟涓�浠�
+import color from './libs/function/color.js'
+// 鏍规嵁type鑾峰彇鍥炬爣鍚嶇О
+import type2icon from './libs/function/type2icon.js'
+// 鎵撲贡鏁扮粍鐨勯『搴�
+import randomArray from './libs/function/randomArray.js'
+// 瀵硅薄鍜屾暟缁勭殑娣卞害鍏嬮殕
+import deepClone from './libs/function/deepClone.js'
+// 瀵硅薄娣卞害鎷疯礉
+import deepMerge from './libs/function/deepMerge.js'
+// 娣诲姞鍗曚綅
+import addUnit from './libs/function/addUnit.js'
+
+// 瑙勫垯妫�楠�
+import test from './libs/function/test.js'
+// 闅忔満鏁�
+import random from './libs/function/random.js'
+// 鍘婚櫎绌烘牸
+import trim from './libs/function/trim.js'
+// toast鎻愮ず锛屽uni.showToast鐨勫皝瑁�
+import toast from './libs/function/toast.js'
+// 鑾峰彇鐖剁粍浠跺弬鏁�
+import getParent from './libs/function/getParent.js'
+// 鑾峰彇鏁翠釜鐖剁粍浠�
+import $parent from './libs/function/$parent.js'
+// 鑾峰彇sys()鍜宱s()宸ュ叿鏂规硶
+// 鑾峰彇璁惧淇℃伅锛屾寕杞藉埌$u鐨剆ys()(system鐨勭缉鍐�)灞炴�т腑锛�
+// 鍚屾椂鎶婂畨鍗撳拰ios骞冲彴鐨勫悕绉�"ios"鍜�"android"鎸傚埌$u.os()涓紝鏂逛究鍙栫敤
+import {sys, os} from './libs/function/sys.js'
+// 闃叉姈鏂规硶
+import debounce from './libs/function/debounce.js'
+// 鑺傛祦鏂规硶
+import throttle from './libs/function/throttle.js'
+
+
+// 閰嶇疆淇℃伅
+import config from './libs/config/config.js'
+// 鍚勪釜闇�瑕乫ixed鐨勫湴鏂圭殑z-index閰嶇疆鏂囦欢
+import zIndex from './libs/config/zIndex.js'
+
+const $u = {
+	queryParams: queryParams,
+	route: route,
+	timeFormat: timeFormat,
+	date: timeFormat, // 鍙﹀悕date
+	timeFrom,
+	colorGradient: colorGradient.colorGradient,
+	colorToRgba: colorGradient.colorToRgba,
+	guid,
+	color,
+	sys,
+	os,
+	type2icon,
+	randomArray,
+	wranning,
+	get: http.get,
+	post: http.post,
+	put: http.put,
+	'delete': http.delete,
+	hexToRgb: colorGradient.hexToRgb,
+	rgbToHex: colorGradient.rgbToHex,
+	test,
+	random,
+	deepClone,
+	deepMerge,
+	getParent,
+	$parent,
+	addUnit,
+	trim,
+	type: ['primary', 'success', 'error', 'warning', 'info'],
+	http,
+	toast,
+	config, // uView閰嶇疆淇℃伅鐩稿叧锛屾瘮濡傜増鏈彿
+	zIndex,
+	debounce,
+	throttle,
+}
+
+// $u鎸傝浇鍒皍ni瀵硅薄涓�
+uni.$u = $u
+
+const install = Vue => {
+	Vue.mixin(mixin) 
+	if (Vue.prototype.openShare) {
+		Vue.mixin(mpShare);
+	}
+	// Vue.mixin(vuexStore);
+	// 鏃堕棿鏍煎紡鍖栵紝鍚屾椂涓や釜鍚嶇О锛宒ate鍜宼imeFormat
+	Vue.filter('timeFormat', (timestamp, format) => {
+		return timeFormat(timestamp, format)
+	})
+	Vue.filter('date', (timestamp, format) => {
+		return timeFormat(timestamp, format)
+	})
+	// 灏嗗涔呬互鍓嶇殑鏂规硶锛屾敞鍏ュ埌鍏ㄥ眬杩囨护鍣�
+	Vue.filter('timeFrom', (timestamp, format) => {
+		return timeFrom(timestamp, format)
+	})
+	Vue.prototype.$u = $u
+}
+
+export default {
+	install
+}
\ No newline at end of file
diff --git a/uview-ui/index.scss b/uview-ui/index.scss
new file mode 100644
index 0000000..84daa72
--- /dev/null
+++ b/uview-ui/index.scss
@@ -0,0 +1,23 @@
+// 寮曞叆鍏叡鍩虹绫�
+@import "./libs/css/common.scss";
+@import "./libs/css/color.scss";
+
+// 闈瀗vue鐨勬牱寮�
+/* #ifndef APP-NVUE */
+@import "./libs/css/style.vue.scss";
+/* #endif */
+
+// nvue鐨勭壒鏈夋牱寮�
+/* #ifdef APP-NVUE */
+@import "./libs/css/style.nvue.scss";
+/* #endif */
+
+// 灏忕▼搴忕壒鏈夌殑鏍峰紡
+/* #ifdef MP */
+@import "./libs/css/style.mp.scss";
+/* #endif */
+
+// H5鐗规湁鐨勬牱寮�
+/* #ifdef H5 */
+@import "./libs/css/style.h5.scss";
+/* #endif */
\ No newline at end of file
diff --git a/uview-ui/libs/config/config.js b/uview-ui/libs/config/config.js
new file mode 100644
index 0000000..ac3c65e
--- /dev/null
+++ b/uview-ui/libs/config/config.js
@@ -0,0 +1,15 @@
+// 姝ょ増鏈彂甯冧簬2020-12-17
+let version = '1.8.3';
+
+export default {
+	v: version,
+	version: version,
+	// 涓婚鍚嶇О
+	type: [
+		'primary',
+		'success',
+		'info',
+		'error',
+		'warning'
+	]
+}
\ No newline at end of file
diff --git a/uview-ui/libs/config/zIndex.js b/uview-ui/libs/config/zIndex.js
new file mode 100644
index 0000000..d60e5bd
--- /dev/null
+++ b/uview-ui/libs/config/zIndex.js
@@ -0,0 +1,20 @@
+// uniapp鍦℉5涓悇API鐨剒-index鍊煎涓嬶細
+/**
+ * actionsheet: 999
+ * modal: 999
+ * navigate: 998
+ * tabbar: 998
+ * toast: 999
+ */
+
+export default {
+	toast: 10090,
+	noNetwork: 10080,
+	// popup鍖呭惈popup锛宎ctionsheet锛宬eyboard锛宲icker鐨勫��
+	popup: 10075,
+	mask: 10070,
+	navbar: 980,
+	topTips: 975,
+	sticky: 970,
+	indexListSticky: 965,
+}
\ No newline at end of file
diff --git a/uview-ui/libs/css/color.scss b/uview-ui/libs/css/color.scss
new file mode 100644
index 0000000..279bc40
--- /dev/null
+++ b/uview-ui/libs/css/color.scss
@@ -0,0 +1,155 @@
+.u-type-primary-light {
+	color: $u-type-primary-light;
+}
+
+.u-type-warning-light {
+	color: $u-type-warning-light;
+}
+
+.u-type-success-light {
+	color: $u-type-success-light;
+}
+
+.u-type-error-light {
+	color: $u-type-error-light;
+}
+
+.u-type-info-light {
+	color: $u-type-info-light;
+}
+
+.u-type-primary-light-bg {
+	background-color: $u-type-primary-light;
+}
+
+.u-type-warning-light-bg {
+	background-color: $u-type-warning-light;
+}
+
+.u-type-success-light-bg {
+	background-color: $u-type-success-light;
+}
+
+.u-type-error-light-bg {
+	background-color: $u-type-error-light;
+}
+
+.u-type-info-light-bg {
+	background-color: $u-type-info-light;
+}
+
+.u-type-primary-dark {
+	color: $u-type-primary-dark;
+}
+
+.u-type-warning-dark {
+	color: $u-type-warning-dark;
+}
+
+.u-type-success-dark {
+	color: $u-type-success-dark;
+}
+
+.u-type-error-dark {
+	color: $u-type-error-dark;
+}
+
+.u-type-info-dark {
+	color: $u-type-info-dark;
+}
+
+.u-type-primary-dark-bg {
+	background-color: $u-type-primary-dark;
+}
+
+.u-type-warning-dark-bg {
+	background-color: $u-type-warning-dark;
+}
+
+.u-type-success-dark-bg {
+	background-color: $u-type-success-dark;
+}
+
+.u-type-error-dark-bg {
+	background-color: $u-type-error-dark;
+}
+
+.u-type-info-dark-bg {
+	background-color: $u-type-info-dark;
+}
+
+.u-type-primary-disabled {
+	color: $u-type-primary-disabled;
+}
+
+.u-type-warning-disabled {
+	color: $u-type-warning-disabled;
+}
+
+.u-type-success-disabled {
+	color: $u-type-success-disabled;
+}
+
+.u-type-error-disabled {
+	color: $u-type-error-disabled;
+}
+
+.u-type-info-disabled {
+	color: $u-type-info-disabled;
+}
+
+.u-type-primary {
+	color: $u-type-primary;
+}
+
+.u-type-warning {
+	color: $u-type-warning;
+}
+
+.u-type-success {
+	color: $u-type-success;
+}
+
+.u-type-error {
+	color: $u-type-error;
+}
+
+.u-type-info {
+	color: $u-type-info;
+}
+
+.u-type-primary-bg {
+	background-color: $u-type-primary;
+}
+
+.u-type-warning-bg {
+	background-color: $u-type-warning;
+}
+
+.u-type-success-bg {
+	background-color: $u-type-success;
+}
+
+.u-type-error-bg {
+	background-color: $u-type-error;
+}
+
+.u-type-info-bg {
+	background-color: $u-type-info;
+}
+
+.u-main-color {
+	color: $u-main-color;
+}
+
+.u-content-color {
+	color: $u-content-color;
+}
+
+.u-tips-color {
+	color: $u-tips-color;
+}
+
+.u-light-color {
+	color: $u-light-color;
+}
diff --git a/uview-ui/libs/css/common.scss b/uview-ui/libs/css/common.scss
new file mode 100644
index 0000000..12f39d5
--- /dev/null
+++ b/uview-ui/libs/css/common.scss
@@ -0,0 +1,177 @@
+.u-relative,
+.u-rela {
+	position: relative;
+}
+
+.u-absolute,
+.u-abso {
+	position: absolute;
+}
+
+// nvue涓嶈兘鐢ㄦ爣绛惧懡鍚嶆牱寮忥紝涓嶈兘鏀惧湪寰俊缁勪欢涓紝鍚﹀垯寰俊寮�鍙戝伐鍏蜂細鎶ヨ鍛婏紝鏃犳硶浣跨敤鏍囩鍚嶅綋鍋氶�夋嫨鍣�
+/* #ifndef APP-NVUE */
+image {
+	display: inline-block;
+}
+
+// 鍦╳eex锛屼篃鍗硁vue涓紝鎵�鏈夊厓绱犻粯璁や负border-box
+view,
+text {
+	box-sizing: border-box;
+}
+/* #endif */
+
+.u-font-xs {
+	font-size: 22rpx;
+}
+
+.u-font-sm {
+	font-size: 26rpx;
+}
+
+.u-font-md {
+	font-size: 28rpx;
+}
+
+.u-font-lg {
+	font-size: 30rpx;
+}
+
+.u-font-xl {
+	font-size: 34rpx;
+}
+
+.u-flex {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	align-items: center;
+}
+
+.u-flex-wrap {
+	flex-wrap: wrap;
+}
+
+.u-flex-nowrap {
+	flex-wrap: nowrap;
+}
+
+.u-col-center {
+	align-items: center;
+}
+
+.u-col-top {
+	align-items: flex-start;
+}
+
+.u-col-bottom {
+	align-items: flex-end;
+}
+
+.u-row-center {
+	justify-content: center;
+}
+
+.u-row-left {
+	justify-content: flex-start;
+}
+
+.u-row-right {
+	justify-content: flex-end;
+}
+
+.u-row-between {
+	justify-content: space-between;
+}
+
+.u-row-around {
+	justify-content: space-around;
+}
+
+.u-text-left {
+	text-align: left;
+}
+
+.u-text-center {
+	text-align: center;
+}
+
+.u-text-right {
+	text-align: right;
+}
+
+.u-flex-col {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+}
+
+// 瀹氫箟flex绛夊垎
+@for $i from 0 through 12 {
+	.u-flex-#{$i} {
+		flex: $i;
+	}
+}
+
+// 瀹氫箟瀛椾綋(px)鍗曚綅锛屽皬浜�20閮戒负px鍗曚綅瀛椾綋
+@for $i from 9 to 20 {
+	.u-font-#{$i} {
+		font-size: $i + px;
+	}
+}
+
+// 瀹氫箟瀛椾綋(rpx)鍗曚綅锛屽ぇ浜庢垨绛変簬20鐨勯兘涓簉px鍗曚綅瀛椾綋
+@for $i from 20 through 40 {
+	.u-font-#{$i} {
+		font-size: $i + rpx;
+	}
+}
+
+// 瀹氫箟鍐呭杈硅窛锛屽巻閬�1-80
+@for $i from 0 through 80 {
+	// 鍙鍙屾暟鍜岃兘琚�5闄ゅ敖鐨勬暟
+	@if $i % 2 == 0 or $i % 5 == 0 {
+		// 寰楀嚭锛歶-margin-30鎴栬�卽-m-30
+		.u-margin-#{$i}, .u-m-#{$i} {
+			margin: $i + rpx!important;
+		}
+		
+		// 寰楀嚭锛歶-padding-30鎴栬�卽-p-30
+		.u-padding-#{$i}, .u-p-#{$i} {
+			padding: $i + rpx!important;
+		}
+		
+		@each $short, $long in l left, t top, r right, b bottom {
+			// 缂╁啓鐗堬紝缁撴灉濡傦細 u-m-l-30
+			// 瀹氫箟澶栬竟璺�
+			.u-m-#{$short}-#{$i} {
+				margin-#{$long}: $i + rpx!important;
+			}
+			
+			// 瀹氫箟鍐呰竟璺�
+			.u-p-#{$short}-#{$i} {
+				padding-#{$long}: $i + rpx!important;
+			}
+			
+			// 瀹屾暣鐗堬紝缁撴灉濡傦細u-margin-left-30
+			// 瀹氫箟澶栬竟璺�
+			.u-margin-#{$long}-#{$i} {
+				margin-#{$long}: $i + rpx!important;
+			}
+			
+			// 瀹氫箟鍐呰竟璺�
+			.u-padding-#{$long}-#{$i} {
+				padding-#{$long}: $i + rpx!important;
+			}
+		}
+	}
+}
+
+// 閲嶇疆nvue鐨勯粯璁ゅ叧浜巉lex鐨勬牱寮�
+.u-reset-nvue {
+	flex-direction: row;
+	align-items: center;
+}
+
diff --git a/uview-ui/libs/css/style.components.scss b/uview-ui/libs/css/style.components.scss
new file mode 100644
index 0000000..6835876
--- /dev/null
+++ b/uview-ui/libs/css/style.components.scss
@@ -0,0 +1,7 @@
+// 瀹氫箟娣峰叆鎸囦护锛岀敤浜庡湪闈瀗vue鐜涓嬬殑flex瀹氫箟锛屽洜涓簄vue娌℃湁display灞炴�э紝浼氭姤閿�
+@mixin vue-flex($direction: row) {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	flex-direction: $direction;
+	/* #endif */
+}
\ No newline at end of file
diff --git a/uview-ui/libs/css/style.h5.scss b/uview-ui/libs/css/style.h5.scss
new file mode 100644
index 0000000..62839eb
--- /dev/null
+++ b/uview-ui/libs/css/style.h5.scss
@@ -0,0 +1,8 @@
+/* H5鐨勬椂鍊欙紝闅愯棌婊氬姩鏉� */
+::-webkit-scrollbar {
+	display: none;  
+	width: 0 !important;  
+	height: 0 !important;  
+	-webkit-appearance: none;  
+	background: transparent;  
+}
diff --git a/uview-ui/libs/css/style.mp.scss b/uview-ui/libs/css/style.mp.scss
new file mode 100644
index 0000000..ca1d3e0
--- /dev/null
+++ b/uview-ui/libs/css/style.mp.scss
@@ -0,0 +1,72 @@
+/* start--寰俊灏忕▼搴忕紪璇戝悗椤甸潰鏈夌粍浠跺悕鐨勫厓绱狅紝鐗瑰埆澶勭悊--start */
+/* #ifdef MP-WEIXIN || MP-QQ */
+u-td, u-th {
+	flex: 1;
+	align-self: stretch;
+}
+
+.u-td {
+	height: 100%;
+}
+
+u-icon {
+	display: inline-flex;
+	align-items: center;
+}
+
+// 鍚勫灏忕▼搴忓鏍肩粍浠跺灞傝缃负100%锛岄伩鍏嶅彈鍒扮埗鍏冪礌display: flex;鐨勫奖鍝�
+u-grid {
+	width: 100%;
+	flex: 0 0 100%;
+}
+
+// 閬垮厤灏忕▼搴忕嚎鏉$粍浠跺洜涓虹埗缁勪欢display: flex;鑰屽け鏁�
+u-line {
+	flex: 1;
+}
+
+u-switch {
+	display: inline-flex;
+	align-items: center;
+}
+
+u-dropdown {
+	flex: 1;
+}
+/* #endif */
+/* end-寰俊灏忕▼搴忕紪璇戝悗椤甸潰鏈夌粍浠跺悕鐨勫厓绱狅紝鐗瑰埆澶勭悊--end */
+
+
+/* #ifdef MP-QQ || MP-TOUTIAO */
+// 闇�瑕佸仛杩欎竴鍒囬澶栫殑鍏煎锛岄兘鏄洜涓篢X鐨勬棤鑳�
+u-icon {
+	line-height: 0;
+}
+/* #endif */
+
+/* start--澶存潯灏忕▼搴忕紪璇戝悗椤甸潰鏈夌粍浠跺悕鐨勫厓绱狅紝鐗瑰埆澶勭悊--start */
+// 鐢变簬澶存潯灏忕▼搴忎笉鏀寔鐩存帴缁勪欢鍚嶅舰寮忓啓鏍峰紡锛岀洰鍓嶅彧鑳藉湪鍐欑粍浠剁殑鏃跺�欑粰缁勪欢鍔犱笂瀵瑰簲鐨勭被鍚�
+/* #ifdef MP-TOUTIAO */
+.u-td, .u-th, .u-tr {
+	flex: 1;
+	align-self: stretch;
+}
+
+.u-row, .u-col {
+	flex: 1;
+	align-self: stretch;
+}
+
+// 閬垮厤灏忕▼搴忕嚎鏉$粍浠跺洜涓虹埗缁勪欢display: flex;鑰屽け鏁�
+.u-line {
+	flex: 1;
+}
+
+.u-dropdown {
+	flex: 1;
+}
+/* #endif */
+/* end-澶存潯灏忕▼搴忕紪璇戝悗椤甸潰鏈夌粍浠跺悕鐨勫厓绱狅紝鐗瑰埆澶勭悊--end */
+
+
+
diff --git a/uview-ui/libs/css/style.nvue.scss b/uview-ui/libs/css/style.nvue.scss
new file mode 100644
index 0000000..4a6192a
--- /dev/null
+++ b/uview-ui/libs/css/style.nvue.scss
@@ -0,0 +1,3 @@
+.nvue {
+	font-size: 24rpx;
+}
\ No newline at end of file
diff --git a/uview-ui/libs/css/style.vue.scss b/uview-ui/libs/css/style.vue.scss
new file mode 100644
index 0000000..1ab3707
--- /dev/null
+++ b/uview-ui/libs/css/style.vue.scss
@@ -0,0 +1,175 @@
+page {
+	color: $u-main-color;
+	font-size: 28rpx;
+}
+
+/* start--鍘婚櫎webkit鐨勯粯璁ゆ牱寮�--start */
+.u-fix-ios-appearance {
+	-webkit-appearance:none;
+}
+/* end--鍘婚櫎webkit鐨勯粯璁ゆ牱寮�--end */
+
+/* start--icon鍥炬爣澶栧眰濂椾竴涓獀iew锛岃鍏惰揪鍒版洿濂界殑鍨傜洿灞呬腑鐨勬晥鏋�--start */
+.u-icon-wrap {
+	display: flex;
+	align-items: center;
+}
+/* end-icon鍥炬爣澶栧眰濂椾竴涓獀iew锛岃鍏惰揪鍒版洿濂界殑鍨傜洿灞呬腑鐨勬晥鏋�--end */
+
+/* start--iPhoneX搴曢儴瀹夊叏鍖哄畾涔�--start */
+.safe-area-inset-bottom {
+  padding-bottom: 0;  
+  padding-bottom: constant(safe-area-inset-bottom);  
+  padding-bottom: env(safe-area-inset-bottom);  
+} 
+/* end-iPhoneX搴曢儴瀹夊叏鍖哄畾涔�--end */
+
+/* start--鍚勭hover鐐瑰嚮鍙嶉鐩稿叧鐨勭被鍚�-start */
+.u-hover-class {
+	// background-color: #f7f8f9!important;
+	opacity: 0.6;
+}
+
+.u-cell-hover {
+	background-color: #f7f8f9!important;
+}
+/* end--鍚勭hover鐐瑰嚮鍙嶉鐩稿叧鐨勭被鍚�--end */
+
+/* start--鏂囨湰琛屾暟闄愬埗--start */
+.u-line-1 {
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+}
+
+.u-line-2 {
+    -webkit-line-clamp: 2;
+}
+
+.u-line-3 {
+    -webkit-line-clamp: 3;
+}
+
+.u-line-4 {
+    -webkit-line-clamp: 4;
+}
+
+.u-line-5 {
+    -webkit-line-clamp: 5;
+}
+
+.u-line-2, .u-line-3, .u-line-4, .u-line-5 {
+    overflow: hidden;
+	word-break: break-all;
+    text-overflow: ellipsis; 
+    display: -webkit-box; // 寮规�т几缂╃洅
+    -webkit-box-orient: vertical; // 璁剧疆浼哥缉鐩掑瓙鍏冪礌鎺掑垪鏂瑰紡
+}
+
+/* end--鏂囨湰琛屾暟闄愬埗--end */
+
+
+/* start--Retina 灞忓箷涓嬬殑 1px 杈规--start */
+.u-border,
+.u-border-bottom,
+.u-border-left,
+.u-border-right,
+.u-border-top,
+.u-border-top-bottom {
+	position: relative
+}
+
+.u-border-bottom:after,
+.u-border-left:after,
+.u-border-right:after,
+.u-border-top-bottom:after,
+.u-border-top:after,
+.u-border:after {
+	/* #ifndef APP-NVUE */
+	content: ' ';
+	/* #endif */
+	position: absolute;
+	left: 0;
+	top: 0;
+	pointer-events: none;
+	box-sizing: border-box;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	// 澶氬姞0.1%锛岃兘瑙e喅鏈夋椂鍊欒竟妗嗙己澶辩殑闂
+	width: 199.8%;
+	height: 199.7%;
+	transform: scale(0.5, 0.5);
+	border: 0 solid $u-border-color;
+	z-index: 2;
+}
+
+.u-border-top:after {
+	border-top-width: 1px
+}
+
+.u-border-left:after {
+	border-left-width: 1px
+}
+
+.u-border-right:after {
+	border-right-width: 1px
+}
+
+.u-border-bottom:after {
+	border-bottom-width: 1px
+}
+
+.u-border-top-bottom:after {
+	border-width: 1px 0
+}
+
+.u-border:after {
+	border-width: 1px
+}
+/* end--Retina 灞忓箷涓嬬殑 1px 杈规--end */
+
+
+/* start--clearfix--start */
+.u-clearfix:after,
+.clearfix:after {
+	/* #ifndef APP-NVUE */
+	content: '';
+	/* #endif */
+	display: table;
+	clear: both
+}
+/* end--clearfix--end */
+
+/* start--楂樻柉妯$硦tabbar搴曢儴澶勭悊--start */
+.u-blur-effect-inset {
+	width: 750rpx;  
+	height: var(--window-bottom);   
+	background-color: #FFFFFF;  
+}
+/* end--楂樻柉妯$硦tabbar搴曢儴澶勭悊--end */
+
+/* start--鎻愬崌H5绔痷ni.toast()鐨勫眰绾э紝閬垮厤琚玼View鐨刴odal绛夐伄鐩�--start */
+/* #ifdef H5 */
+uni-toast {
+    z-index: 10090;
+}
+uni-toast .uni-toast {
+   z-index: 10090;
+}
+/* #endif */
+/* end--鎻愬崌H5绔痷ni.toast()鐨勫眰绾э紝閬垮厤琚玼View鐨刴odal绛夐伄鐩�--end */
+
+/* start--鍘婚櫎button鐨勬墍鏈夐粯璁ゆ牱寮�--start */
+.u-reset-button {
+	padding: 0;
+	font-size: inherit;
+	line-height: inherit;
+	background-color: transparent;
+	color: inherit;
+}
+
+.u-reset-button::after {
+   border: none;
+}
+/* end--鍘婚櫎button鐨勬墍鏈夐粯璁ゆ牱寮�--end */
+
diff --git a/uview-ui/libs/function/$parent.js b/uview-ui/libs/function/$parent.js
new file mode 100644
index 0000000..80515c4
--- /dev/null
+++ b/uview-ui/libs/function/$parent.js
@@ -0,0 +1,18 @@
+// 鑾峰彇鐖剁粍浠剁殑鍙傛暟锛屽洜涓烘敮浠樺疂灏忕▼搴忎笉鏀寔provide/inject鐨勫啓娉�
+// this.$parent鍦ㄩ潪H5涓紝鍙互鍑嗙‘鑾峰彇鍒扮埗缁勪欢锛屼絾鏄湪H5涓紝闇�瑕佸娆his.$parent.$parent.xxx
+// 杩欓噷榛樿鍊肩瓑浜巙ndefined鏈夊畠鐨勫惈涔夛紝鍥犱负鏈�椤跺眰鍏冪礌(缁勪欢)鐨�$parent灏辨槸undefined锛屾剰鍛崇潃涓嶄紶name
+// 鍊�(榛樿涓簎ndefined)锛屽氨鏄煡鎵炬渶椤跺眰鐨�$parent
+export default function $parent(name = undefined) {
+	let parent = this.$parent;
+	// 閫氳繃while鍘嗛亶锛岃繖閲屼富瑕佹槸涓轰簡H5闇�瑕佸灞傝В鏋愮殑闂
+	while (parent) {
+		// 鐖剁粍浠�
+		if (parent.$options && parent.$options.name !== name) {
+			// 濡傛灉缁勪欢鐨刵ame涓嶇浉绛夛紝缁х画涓婁竴绾у鎵�
+			parent = parent.$parent;
+		} else {
+			return parent;
+		}
+	}
+	return false;
+}
\ No newline at end of file
diff --git a/uview-ui/libs/function/addUnit.js b/uview-ui/libs/function/addUnit.js
new file mode 100644
index 0000000..247fae2
--- /dev/null
+++ b/uview-ui/libs/function/addUnit.js
@@ -0,0 +1,8 @@
+import validation from './test.js';
+
+// 娣诲姞鍗曚綅锛屽鏋滄湁rpx锛�%锛宲x绛夊崟浣嶇粨灏炬垨鑰呭�间负auto锛岀洿鎺ヨ繑鍥烇紝鍚﹀垯鍔犱笂rpx鍗曚綅缁撳熬
+export default function addUnit(value = 'auto', unit = 'rpx') {
+    value = String(value);
+	// 鐢╱View鍐呯疆楠岃瘉瑙勫垯涓殑number鍒ゆ柇鏄惁涓烘暟鍊�
+    return validation.number(value) ? `${value}${unit}` : value;
+}
\ No newline at end of file
diff --git a/uview-ui/libs/function/bem.js b/uview-ui/libs/function/bem.js
new file mode 100644
index 0000000..05d1a36
--- /dev/null
+++ b/uview-ui/libs/function/bem.js
@@ -0,0 +1,5 @@
+function bem(name, conf) {
+  
+}
+
+module.exports.bem = bem;
diff --git a/uview-ui/libs/function/color.js b/uview-ui/libs/function/color.js
new file mode 100644
index 0000000..8c61428
--- /dev/null
+++ b/uview-ui/libs/function/color.js
@@ -0,0 +1,37 @@
+// 涓轰簡璁╃敤鎴疯兘澶熻嚜瀹氫箟涓婚锛屼細閫愭寮冪敤姝ゆ枃浠讹紝鍚勯鑹查�氳繃css鎻愪緵
+// 涓轰簡缁欐煇浜涚壒娈婂満鏅娇鐢ㄥ拰鍚戝悗鍏煎锛屾棤闇�鍒犻櫎姝ゆ枃浠�(2020-06-20)
+let color = {
+	primary: "#497bff",
+	primaryDark: "#2b85e4",
+	primaryDisabled: "#a0cfff",
+	primaryLight: "#ecf5ff",
+	bgColor: "#f3f4f6",
+	
+	info: "#909399",
+	infoDark: "#82848a",
+	infoDisabled: "#c8c9cc",
+	infoLight: "#f4f4f5",
+	
+	warning: "#ff9900",
+	warningDark: "#f29100",
+	warningDisabled: "#fcbd71",
+	warningLight: "#fdf6ec",
+	
+	error: "#fa3534",
+	errorDark: "#dd6161",
+	errorDisabled: "#fab6b6",
+	errorLight: "#fef0f0",
+	
+	success: "#19be6b",
+	successDark: "#18b566",
+	successDisabled: "#71d5a1",
+	successLight: "#dbf1e1",
+	
+	mainColor: "#303133",
+	contentColor: "#606266",
+	tipsColor: "#909399",
+	lightColor: "#c0c4cc",
+	borderColor: "#e4e7ed"
+}
+
+export default color;
\ No newline at end of file
diff --git a/uview-ui/libs/function/colorGradient.js b/uview-ui/libs/function/colorGradient.js
new file mode 100644
index 0000000..eca30a2
--- /dev/null
+++ b/uview-ui/libs/function/colorGradient.js
@@ -0,0 +1,134 @@
+/**
+ * 姹備袱涓鑹蹭箣闂寸殑娓愬彉鍊�
+ * @param {string} startColor 寮�濮嬬殑棰滆壊
+ * @param {string} endColor 缁撴潫鐨勯鑹�
+ * @param {number} step 棰滆壊绛夊垎鐨勪唤棰�
+ * */
+function colorGradient(startColor = 'rgb(0, 0, 0)', endColor = 'rgb(255, 255, 255)', step = 10) {
+	let startRGB = hexToRgb(startColor, false); //杞崲涓簉gb鏁扮粍妯″紡
+	let startR = startRGB[0];
+	let startG = startRGB[1];
+	let startB = startRGB[2];
+
+	let endRGB = hexToRgb(endColor, false);
+	let endR = endRGB[0];
+	let endG = endRGB[1];
+	let endB = endRGB[2];
+
+	let sR = (endR - startR) / step; //鎬诲樊鍊�
+	let sG = (endG - startG) / step;
+	let sB = (endB - startB) / step;
+	let colorArr = [];
+	for (let i = 0; i < step; i++) {
+		//璁$畻姣忎竴姝ョ殑hex鍊� 
+		let hex = rgbToHex('rgb(' + Math.round((sR * i + startR)) + ',' + Math.round((sG * i + startG)) + ',' + Math.round((sB *
+			i + startB)) + ')');
+		colorArr.push(hex);
+	}
+	return colorArr;
+}
+
+// 灏唄ex琛ㄧず鏂瑰紡杞崲涓簉gb琛ㄧず鏂瑰紡(杩欓噷杩斿洖rgb鏁扮粍妯″紡)
+function hexToRgb(sColor, str = true) {
+	let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+	sColor = sColor.toLowerCase();
+	if (sColor && reg.test(sColor)) {
+		if (sColor.length === 4) {
+			let sColorNew = "#";
+			for (let i = 1; i < 4; i += 1) {
+				sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
+			}
+			sColor = sColorNew;
+		}
+		//澶勭悊鍏綅鐨勯鑹插��
+		let sColorChange = [];
+		for (let i = 1; i < 7; i += 2) {
+			sColorChange.push(parseInt("0x" + sColor.slice(i, i + 2)));
+		}
+		if(!str) {
+			return sColorChange;
+		} else {
+			return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`;
+		}
+	} else if (/^(rgb|RGB)/.test(sColor)) {
+		let arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",")
+		return arr.map(val => Number(val));
+	} else {
+		return sColor;
+	}
+};
+
+// 灏唕gb琛ㄧず鏂瑰紡杞崲涓篽ex琛ㄧず鏂瑰紡
+function rgbToHex(rgb) {
+	let _this = rgb;
+	let reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
+	if (/^(rgb|RGB)/.test(_this)) {
+		let aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
+		let strHex = "#";
+		for (let i = 0; i < aColor.length; i++) {
+			let hex = Number(aColor[i]).toString(16);
+			hex = String(hex).length == 1 ? 0 + '' + hex : hex; // 淇濊瘉姣忎釜rgb鐨勫�间负2浣�
+			if (hex === "0") {
+				hex += hex;
+			}
+			strHex += hex;
+		}
+		if (strHex.length !== 7) {
+			strHex = _this;
+		}
+		return strHex;
+	} else if (reg.test(_this)) {
+		let aNum = _this.replace(/#/, "").split("");
+		if (aNum.length === 6) {
+			return _this;
+		} else if (aNum.length === 3) {
+			let numHex = "#";
+			for (let i = 0; i < aNum.length; i += 1) {
+				numHex += (aNum[i] + aNum[i]);
+			}
+			return numHex;
+		}
+	} else {
+		return _this;
+	}
+}
+
+
+/**
+* JS棰滆壊鍗佸叚杩涘埗杞崲涓簉gb鎴杛gba,杩斿洖鐨勬牸寮忎负 rgba锛�255锛�255锛�255锛�0.5锛夊瓧绗︿覆
+* sHex涓轰紶鍏ョ殑鍗佸叚杩涘埗鐨勮壊鍊�
+* alpha涓簉gba鐨勯�忔槑搴�
+*/
+function colorToRgba(color, alpha = 0.3) {
+	color = rgbToHex(color)
+	// 鍗佸叚杩涘埗棰滆壊鍊肩殑姝e垯琛ㄨ揪寮�
+	var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/
+	/* 16杩涘埗棰滆壊杞负RGB鏍煎紡 */
+	let sColor = color.toLowerCase()
+	if (sColor && reg.test(sColor)) {
+		if (sColor.length === 4) {
+			var sColorNew = '#'
+			for (let i = 1; i < 4; i += 1) {
+				sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1))
+			}
+			sColor = sColorNew
+		}
+		// 澶勭悊鍏綅鐨勯鑹插��
+		var sColorChange = []
+		for (let i = 1; i < 7; i += 2) {
+			sColorChange.push(parseInt('0x' + sColor.slice(i, i + 2)))
+		}
+		// return sColorChange.join(',')
+		return 'rgba(' + sColorChange.join(',') + ',' + alpha + ')'
+	} 
+	else {
+		return sColor
+	}
+}
+
+export default {
+	colorGradient,
+	hexToRgb,
+	rgbToHex,
+	colorToRgba
+}
\ No newline at end of file
diff --git a/uview-ui/libs/function/debounce.js b/uview-ui/libs/function/debounce.js
new file mode 100644
index 0000000..4f1027b
--- /dev/null
+++ b/uview-ui/libs/function/debounce.js
@@ -0,0 +1,29 @@
+let timeout = null;
+
+/**
+ * 闃叉姈鍘熺悊锛氫竴瀹氭椂闂村唴锛屽彧鏈夋渶鍚庝竴娆℃搷浣滐紝鍐嶈繃wait姣鍚庢墠鎵ц鍑芥暟
+ * 
+ * @param {Function} func 瑕佹墽琛岀殑鍥炶皟鍑芥暟 
+ * @param {Number} wait 寤舵椂鐨勬椂闂�
+ * @param {Boolean} immediate 鏄惁绔嬪嵆鎵ц 
+ * @return null
+ */
+function debounce(func, wait = 500, immediate = false) {
+	// 娓呴櫎瀹氭椂鍣�
+	if (timeout !== null) clearTimeout(timeout);
+	// 绔嬪嵆鎵ц锛屾绫绘儏鍐典竴鑸敤涓嶅埌
+	if (immediate) {
+		var callNow = !timeout;
+		timeout = setTimeout(function() {
+			timeout = null;
+		}, wait);
+		if (callNow) typeof func === 'function' && func();
+	} else {
+		// 璁剧疆瀹氭椂鍣紝褰撴渶鍚庝竴娆℃搷浣滃悗锛宼imeout涓嶄細鍐嶈娓呴櫎锛屾墍浠ュ湪寤舵椂wait姣鍚庢墽琛宖unc鍥炶皟鏂规硶
+		timeout = setTimeout(function() {
+			typeof func === 'function' && func();
+		}, wait);
+	}
+}
+
+export default debounce
diff --git a/uview-ui/libs/function/deepClone.js b/uview-ui/libs/function/deepClone.js
new file mode 100644
index 0000000..3db999a
--- /dev/null
+++ b/uview-ui/libs/function/deepClone.js
@@ -0,0 +1,23 @@
+// 鍒ゆ柇arr鏄惁涓轰竴涓暟缁勶紝杩斿洖涓�涓猙ool鍊�
+function isArray (arr) {
+    return Object.prototype.toString.call(arr) === '[object Array]';
+}
+
+// 娣卞害鍏嬮殕
+function deepClone (obj) {
+	// 瀵瑰父瑙佺殑鈥滈潪鈥濆�硷紝鐩存帴杩斿洖鍘熸潵鍊�
+	if([null, undefined, NaN, false].includes(obj)) return obj;
+    if(typeof obj !== "object" && typeof obj !== 'function') {
+		//鍘熷绫诲瀷鐩存帴杩斿洖
+        return obj;
+    }
+    var o = isArray(obj) ? [] : {};
+    for(let i in obj) {
+        if(obj.hasOwnProperty(i)){
+            o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
+        }
+    }
+    return o;
+}
+
+export default deepClone;
diff --git a/uview-ui/libs/function/deepMerge.js b/uview-ui/libs/function/deepMerge.js
new file mode 100644
index 0000000..81d2d18
--- /dev/null
+++ b/uview-ui/libs/function/deepMerge.js
@@ -0,0 +1,30 @@
+import deepClone from "./deepClone";
+
+// JS瀵硅薄娣卞害鍚堝苟
+function deepMerge(target = {}, source = {}) {
+	target = deepClone(target);
+	if (typeof target !== 'object' || typeof source !== 'object') return false;
+	for (var prop in source) {
+		if (!source.hasOwnProperty(prop)) continue;
+		if (prop in target) {
+			if (typeof target[prop] !== 'object') {
+				target[prop] = source[prop];
+			} else {
+				if (typeof source[prop] !== 'object') {
+					target[prop] = source[prop];
+				} else {
+					if (target[prop].concat && source[prop].concat) {
+						target[prop] = target[prop].concat(source[prop]);
+					} else {
+						target[prop] = deepMerge(target[prop], source[prop]);
+					}
+				}
+			}
+		} else {
+			target[prop] = source[prop];
+		}
+	}
+	return target;
+}
+
+export default deepMerge;
\ No newline at end of file
diff --git a/uview-ui/libs/function/getParent.js b/uview-ui/libs/function/getParent.js
new file mode 100644
index 0000000..9cb45c4
--- /dev/null
+++ b/uview-ui/libs/function/getParent.js
@@ -0,0 +1,47 @@
+// 鑾峰彇鐖剁粍浠剁殑鍙傛暟锛屽洜涓烘敮浠樺疂灏忕▼搴忎笉鏀寔provide/inject鐨勫啓娉�
+// this.$parent鍦ㄩ潪H5涓紝鍙互鍑嗙‘鑾峰彇鍒扮埗缁勪欢锛屼絾鏄湪H5涓紝闇�瑕佸娆his.$parent.$parent.xxx
+export default function getParent(name, keys) {
+	let parent = this.$parent;
+	// 閫氳繃while鍘嗛亶锛岃繖閲屼富瑕佹槸涓轰簡H5闇�瑕佸灞傝В鏋愮殑闂
+	while (parent) {
+		// 鐖剁粍浠�
+		if (parent.$options.name !== name) {
+			// 濡傛灉缁勪欢鐨刵ame涓嶇浉绛夛紝缁х画涓婁竴绾у鎵�
+			parent = parent.$parent;
+		} else {
+			let data = {};
+			// 鍒ゆ柇keys鏄惁鏁扮粍锛屽鏋滀紶杩囨潵鐨勬槸涓�涓暟缁勶紝閭d箞鐩存帴浣跨敤鏁扮粍鍏冪礌鍊煎綋鍋氶敭鍊煎幓鐖剁粍浠跺鎵�
+			if(Array.isArray(keys)) {
+				keys.map(val => {
+					data[val] = parent[val] ? parent[val] : '';
+				})
+			} else {
+				// 鍘嗛亶浼犺繃鏉ョ殑瀵硅薄鍙傛暟
+				for(let i in keys) {
+					// 濡傛灉瀛愮粍浠舵湁姝ゅ�煎垯鐢紝鏃犳鍊煎垯鐢ㄧ埗缁勪欢鐨勫��
+					// 鍒ゆ柇鏄惁绌烘暟缁勶紝濡傛灉鏄紝鍒欑敤鐖剁粍浠剁殑鍊硷紝鍚﹀垯鐢ㄥ瓙缁勪欢鐨勫��
+					if(Array.isArray(keys[i])) {
+						if(keys[i].length) {
+							data[i] = keys[i];
+						} else {
+							data[i] = parent[i];
+						}
+					} else if(keys[i].constructor === Object) {
+						// 鍒ゆ柇鏄惁瀵硅薄锛屽鏋滄槸瀵硅薄锛屼笖鏈夊睘鎬э紝閭d箞浣跨敤瀛愮粍浠剁殑鍊硷紝鍚﹀垯浣跨敤鐖剁粍浠剁殑鍊�
+						if(Object.keys(keys[i]).length) {
+							data[i] = keys[i];
+						} else {
+							data[i] = parent[i];
+						}
+					} else {
+						// 鍙瀛愮粍浠舵湁浼犲�硷紝鍗充娇鏄痜alse鍊硷紝涔熸槸鈥滀紶鍊尖�濅簡锛屼篃闇�瑕佽鐩栫埗缁勪欢鐨勫悓鍚嶅弬鏁�
+						data[i] = (keys[i] || keys[i] === false) ? keys[i] : parent[i];
+					}
+				}
+			}
+			return data;
+		}
+	}
+
+	return {};
+}
\ No newline at end of file
diff --git a/uview-ui/libs/function/guid.js b/uview-ui/libs/function/guid.js
new file mode 100644
index 0000000..8497664
--- /dev/null
+++ b/uview-ui/libs/function/guid.js
@@ -0,0 +1,41 @@
+/**
+ * 鏈畻娉曟潵婧愪簬绠�涔﹀紑婧愪唬鐮侊紝璇﹁锛歨ttps://www.jianshu.com/p/fdbf293d0a85
+ * 鍏ㄥ眬鍞竴鏍囪瘑绗︼紙uuid锛孏lobally Unique Identifier锛�,涔熺О浣� uuid(Universally Unique IDentifier) 
+ * 涓�鑸敤浜庡涓粍浠朵箣闂�,缁欏畠涓�涓敮涓�鐨勬爣璇嗙,鎴栬�卾-for寰幆鐨勬椂鍊�,濡傛灉浣跨敤鏁扮粍鐨刬ndex鍙兘浼氬鑷存洿鏂板垪琛ㄥ嚭鐜伴棶棰�
+ * 鏈�鍙兘鐨勬儏鍐垫槸宸︽粦鍒犻櫎item鎴栬�呭鏌愭潯淇℃伅娴�"涓嶅枩娆�"骞跺幓鎺夊畠鐨勬椂鍊�,浼氬鑷寸粍浠跺唴鐨勬暟鎹彲鑳藉嚭鐜伴敊涔�
+ * v-for鐨勬椂鍊�,鎺ㄨ崘浣跨敤鍚庣杩斿洖鐨刬d鑰屼笉鏄惊鐜殑index
+ * @param {Number} len uuid鐨勯暱搴�
+ * @param {Boolean} firstU 灏嗚繑鍥炵殑棣栧瓧姣嶇疆涓�"u"
+ * @param {Nubmer} radix 鐢熸垚uuid鐨勫熀鏁�(鎰忓懗鐫�杩斿洖鐨勫瓧绗︿覆閮芥槸杩欎釜鍩烘暟),2-浜岃繘鍒�,8-鍏繘鍒�,10-鍗佽繘鍒�,16-鍗佸叚杩涘埗
+ */
+function guid(len = 32, firstU = true, radix = null) {
+	let chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
+	let uuid = [];
+	radix = radix || chars.length;
+
+	if (len) {
+		// 濡傛灉鎸囧畾uuid闀垮害,鍙槸鍙栭殢鏈虹殑瀛楃,0|x涓轰綅杩愮畻,鑳藉幓鎺墄鐨勫皬鏁颁綅,杩斿洖鏁存暟浣�
+		for (let i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];
+	} else {
+		let r;
+		// rfc4122鏍囧噯瑕佹眰杩斿洖鐨剈uid涓�,鏌愪簺浣嶄负鍥哄畾鐨勫瓧绗�
+		uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
+		uuid[14] = '4';
+
+		for (let i = 0; i < 36; i++) {
+			if (!uuid[i]) {
+				r = 0 | Math.random() * 16;
+				uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
+			}
+		}
+	}
+	// 绉婚櫎绗竴涓瓧绗�,骞剁敤u鏇夸唬,鍥犱负绗竴涓瓧绗︿负鏁板�兼椂,璇uuid涓嶈兘鐢ㄤ綔id鎴栬�卌lass
+	if (firstU) {
+		uuid.shift();
+		return 'u' + uuid.join('');
+	} else {
+		return uuid.join('');
+	}
+}
+
+export default guid;
diff --git a/uview-ui/libs/function/md5.js b/uview-ui/libs/function/md5.js
new file mode 100644
index 0000000..8d541a1
--- /dev/null
+++ b/uview-ui/libs/function/md5.js
@@ -0,0 +1,385 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0;   /* hex output format. 0 - lowercase; 1 - uppercase        */
+var b64pad  = "";  /* base-64 pad character. "=" for strict RFC compliance   */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+function hex_md5(s)    { return rstr2hex(rstr_md5(str2rstr_utf8(s))); }
+function b64_md5(s)    { return rstr2b64(rstr_md5(str2rstr_utf8(s))); }
+function any_md5(s, e) { return rstr2any(rstr_md5(str2rstr_utf8(s)), e); }
+function hex_hmac_md5(k, d)
+  { return rstr2hex(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
+function b64_hmac_md5(k, d)
+  { return rstr2b64(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d))); }
+function any_hmac_md5(k, d, e)
+  { return rstr2any(rstr_hmac_md5(str2rstr_utf8(k), str2rstr_utf8(d)), e); }
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test()
+{
+  return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of a raw string
+ */
+function rstr_md5(s)
+{
+  return binl2rstr(binl_md5(rstr2binl(s), s.length * 8));
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data (raw strings)
+ */
+function rstr_hmac_md5(key, data)
+{
+  var bkey = rstr2binl(key);
+  if(bkey.length > 16) bkey = binl_md5(bkey, key.length * 8);
+
+  var ipad = Array(16), opad = Array(16);
+  for(var i = 0; i < 16; i++)
+  {
+    ipad[i] = bkey[i] ^ 0x36363636;
+    opad[i] = bkey[i] ^ 0x5C5C5C5C;
+  }
+
+  var hash = binl_md5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+  return binl2rstr(binl_md5(opad.concat(hash), 512 + 128));
+}
+
+/*
+ * Convert a raw string to a hex string
+ */
+function rstr2hex(input)
+{
+  try { hexcase } catch(e) { hexcase=0; }
+  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+  var output = "";
+  var x;
+  for(var i = 0; i < input.length; i++)
+  {
+    x = input.charCodeAt(i);
+    output += hex_tab.charAt((x >>> 4) & 0x0F)
+           +  hex_tab.charAt( x        & 0x0F);
+  }
+  return output;
+}
+
+/*
+ * Convert a raw string to a base-64 string
+ */
+function rstr2b64(input)
+{
+  try { b64pad } catch(e) { b64pad=''; }
+  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+  var output = "";
+  var len = input.length;
+  for(var i = 0; i < len; i += 3)
+  {
+    var triplet = (input.charCodeAt(i) << 16)
+                | (i + 1 < len ? input.charCodeAt(i+1) << 8 : 0)
+                | (i + 2 < len ? input.charCodeAt(i+2)      : 0);
+    for(var j = 0; j < 4; j++)
+    {
+      if(i * 8 + j * 6 > input.length * 8) output += b64pad;
+      else output += tab.charAt((triplet >>> 6*(3-j)) & 0x3F);
+    }
+  }
+  return output;
+}
+
+/*
+ * Convert a raw string to an arbitrary string encoding
+ */
+function rstr2any(input, encoding)
+{
+  var divisor = encoding.length;
+  var i, j, q, x, quotient;
+
+  /* Convert to an array of 16-bit big-endian values, forming the dividend */
+  var dividend = Array(Math.ceil(input.length / 2));
+  for(i = 0; i < dividend.length; i++)
+  {
+    dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
+  }
+
+  /*
+   * Repeatedly perform a long division. The binary array forms the dividend,
+   * the length of the encoding is the divisor. Once computed, the quotient
+   * forms the dividend for the next step. All remainders are stored for later
+   * use.
+   */
+  var full_length = Math.ceil(input.length * 8 /
+                                    (Math.log(encoding.length) / Math.log(2)));
+  var remainders = Array(full_length);
+  for(j = 0; j < full_length; j++)
+  {
+    quotient = Array();
+    x = 0;
+    for(i = 0; i < dividend.length; i++)
+    {
+      x = (x << 16) + dividend[i];
+      q = Math.floor(x / divisor);
+      x -= q * divisor;
+      if(quotient.length > 0 || q > 0)
+        quotient[quotient.length] = q;
+    }
+    remainders[j] = x;
+    dividend = quotient;
+  }
+
+  /* Convert the remainders to the output string */
+  var output = "";
+  for(i = remainders.length - 1; i >= 0; i--)
+    output += encoding.charAt(remainders[i]);
+
+  return output;
+}
+
+/*
+ * Encode a string as utf-8.
+ * For efficiency, this assumes the input is valid utf-16.
+ */
+function str2rstr_utf8(input)
+{
+  var output = "";
+  var i = -1;
+  var x, y;
+
+  while(++i < input.length)
+  {
+    /* Decode utf-16 surrogate pairs */
+    x = input.charCodeAt(i);
+    y = i + 1 < input.length ? input.charCodeAt(i + 1) : 0;
+    if(0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF)
+    {
+      x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
+      i++;
+    }
+
+    /* Encode output as utf-8 */
+    if(x <= 0x7F)
+      output += String.fromCharCode(x);
+    else if(x <= 0x7FF)
+      output += String.fromCharCode(0xC0 | ((x >>> 6 ) & 0x1F),
+                                    0x80 | ( x         & 0x3F));
+    else if(x <= 0xFFFF)
+      output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
+                                    0x80 | ((x >>> 6 ) & 0x3F),
+                                    0x80 | ( x         & 0x3F));
+    else if(x <= 0x1FFFFF)
+      output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
+                                    0x80 | ((x >>> 12) & 0x3F),
+                                    0x80 | ((x >>> 6 ) & 0x3F),
+                                    0x80 | ( x         & 0x3F));
+  }
+  return output;
+}
+
+/*
+ * Encode a string as utf-16
+ */
+function str2rstr_utf16le(input)
+{
+  var output = "";
+  for(var i = 0; i < input.length; i++)
+    output += String.fromCharCode( input.charCodeAt(i)        & 0xFF,
+                                  (input.charCodeAt(i) >>> 8) & 0xFF);
+  return output;
+}
+
+function str2rstr_utf16be(input)
+{
+  var output = "";
+  for(var i = 0; i < input.length; i++)
+    output += String.fromCharCode((input.charCodeAt(i) >>> 8) & 0xFF,
+                                   input.charCodeAt(i)        & 0xFF);
+  return output;
+}
+
+/*
+ * Convert a raw string to an array of little-endian words
+ * Characters >255 have their high-byte silently ignored.
+ */
+function rstr2binl(input)
+{
+  var output = Array(input.length >> 2);
+  for(var i = 0; i < output.length; i++)
+    output[i] = 0;
+  for(var i = 0; i < input.length * 8; i += 8)
+    output[i>>5] |= (input.charCodeAt(i / 8) & 0xFF) << (i%32);
+  return output;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2rstr(input)
+{
+  var output = "";
+  for(var i = 0; i < input.length * 32; i += 8)
+    output += String.fromCharCode((input[i>>5] >>> (i % 32)) & 0xFF);
+  return output;
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length.
+ */
+function binl_md5(x, len)
+{
+  /* append padding */
+  x[len >> 5] |= 0x80 << ((len) % 32);
+  x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+  var a =  1732584193;
+  var b = -271733879;
+  var c = -1732584194;
+  var d =  271733878;
+
+  for(var i = 0; i < x.length; i += 16)
+  {
+    var olda = a;
+    var oldb = b;
+    var oldc = c;
+    var oldd = d;
+
+    a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+    d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+    c = md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
+    b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+    a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+    d = md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
+    c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+    b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+    a = md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
+    d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+    c = md5_ff(c, d, a, b, x[i+10], 17, -42063);
+    b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+    a = md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
+    d = md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+    c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+    b = md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
+
+    a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+    d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+    c = md5_gg(c, d, a, b, x[i+11], 14,  643717713);
+    b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+    a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+    d = md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
+    c = md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+    b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+    a = md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
+    d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+    c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+    b = md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
+    a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+    d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+    c = md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
+    b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+    a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+    d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+    c = md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
+    b = md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+    a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+    d = md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
+    c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+    b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+    a = md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
+    d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+    c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+    b = md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
+    a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+    d = md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+    c = md5_hh(c, d, a, b, x[i+15], 16,  530742520);
+    b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+    a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+    d = md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
+    c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+    b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+    a = md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
+    d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+    c = md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+    b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+    a = md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
+    d = md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+    c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+    b = md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
+    a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+    d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+    c = md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
+    b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+    a = safe_add(a, olda);
+    b = safe_add(b, oldb);
+    c = safe_add(c, oldc);
+    d = safe_add(d, oldd);
+  }
+  return Array(a, b, c, d);
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t)
+{
+  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
+}
+function md5_ff(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+function md5_gg(a, b, c, d, x, s, t)
+{
+  return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+function md5_hh(a, b, c, d, x, s, t)
+{
+  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+function md5_ii(a, b, c, d, x, s, t)
+{
+  return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y)
+{
+  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+  return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt)
+{
+  return (num << cnt) | (num >>> (32 - cnt));
+}
+
+module.exports = {
+	md5 : function(str){
+		return hex_md5(str);
+	}
+}
\ No newline at end of file
diff --git a/uview-ui/libs/function/queryParams.js b/uview-ui/libs/function/queryParams.js
new file mode 100644
index 0000000..81c7e5e
--- /dev/null
+++ b/uview-ui/libs/function/queryParams.js
@@ -0,0 +1,58 @@
+/**
+ * 瀵硅薄杞瑄rl鍙傛暟
+ * @param {*} data,瀵硅薄
+ * @param {*} isPrefix,鏄惁鑷姩鍔犱笂"?"
+ */
+function queryParams(data = {}, isPrefix = true, arrayFormat = 'brackets') {
+	let prefix = isPrefix ? '?' : ''
+	let _result = []
+	if (['indices', 'brackets', 'repeat', 'comma'].indexOf(arrayFormat) == -1) arrayFormat = 'brackets';
+	for (let key in data) {
+		let value = data[key]
+		// 鍘绘帀涓虹┖鐨勫弬鏁�
+		if (['', undefined, null].indexOf(value) >= 0) {
+			continue;
+		}
+		// 濡傛灉鍊间负鏁扮粍锛屽彟琛屽鐞�
+		if (value.constructor === Array) {
+			// e.g. {ids: [1, 2, 3]}
+			switch (arrayFormat) {
+				case 'indices':
+					// 缁撴灉: ids[0]=1&ids[1]=2&ids[2]=3
+					for (let i = 0; i < value.length; i++) {
+						_result.push(key + '[' + i + ']=' + value[i])
+					}
+					break;
+				case 'brackets':
+					// 缁撴灉: ids[]=1&ids[]=2&ids[]=3
+					value.forEach(_value => {
+						_result.push(key + '[]=' + _value)
+					})
+					break;
+				case 'repeat':
+					// 缁撴灉: ids=1&ids=2&ids=3
+					value.forEach(_value => {
+						_result.push(key + '=' + _value)
+					})
+					break;
+				case 'comma':
+					// 缁撴灉: ids=1,2,3
+					let commaStr = "";
+					value.forEach(_value => {
+						commaStr += (commaStr ? "," : "") + _value;
+					})
+					_result.push(key + '=' + commaStr)
+					break;
+				default:
+					value.forEach(_value => {
+						_result.push(key + '[]=' + _value)
+					})
+			}
+		} else {
+			_result.push(key + '=' + value)
+		}
+	}
+	return _result.length ? prefix + _result.join('&') : ''
+}
+
+export default queryParams;
diff --git a/uview-ui/libs/function/random.js b/uview-ui/libs/function/random.js
new file mode 100644
index 0000000..e155279
--- /dev/null
+++ b/uview-ui/libs/function/random.js
@@ -0,0 +1,10 @@
+function random(min, max) {
+	if (min >= 0 && max > 0 && max >= min) {
+		let gab = max - min + 1;
+		return Math.floor(Math.random() * gab + min);
+	} else {
+		return 0;
+	}
+}
+
+export default random;
diff --git a/uview-ui/libs/function/randomArray.js b/uview-ui/libs/function/randomArray.js
new file mode 100644
index 0000000..590a048
--- /dev/null
+++ b/uview-ui/libs/function/randomArray.js
@@ -0,0 +1,7 @@
+// 鎵撲贡鏁扮粍
+function randomArray(array = []) {
+	// 鍘熺悊鏄痵ort鎺掑簭,Math.random()浜х敓0<= x < 1涔嬮棿鐨勬暟,浼氬鑷磝-0.05澶т簬鎴栬�呭皬浜�0
+	return array.sort(() => Math.random() - 0.5);
+}
+
+export default randomArray
diff --git a/uview-ui/libs/function/route.js b/uview-ui/libs/function/route.js
new file mode 100644
index 0000000..28a81b7
--- /dev/null
+++ b/uview-ui/libs/function/route.js
@@ -0,0 +1,122 @@
+/**
+ * 璺敱璺宠浆鏂规硶锛岃鏂规硶鐩稿浜庣洿鎺ヤ娇鐢╱ni.xxx鐨勫ソ澶勬槸浣跨敤鏇村姞绠�鍗曞揩鎹�
+ * 骞朵笖甯︽湁璺敱鎷︽埅鍔熻兘
+ */
+
+class Router {
+	constructor() {
+		// 鍘熷灞炴�у畾涔�
+		this.config = {
+			type: 'navigateTo',
+			url: '',
+			delta: 1, // navigateBack椤甸潰鍚庨��鏃�,鍥為��鐨勫眰鏁�
+			params: {}, // 浼犻�掔殑鍙傛暟
+			animationType: 'pop-in', // 绐楀彛鍔ㄧ敾,鍙湪APP鏈夋晥
+			animationDuration: 300, // 绐楀彛鍔ㄧ敾鎸佺画鏃堕棿,鍗曚綅姣,鍙湪APP鏈夋晥
+			intercept: false, // 鏄惁闇�瑕佹嫤鎴�
+		}
+		// 鍥犱负route鏂规硶鏄渶瑕佸澶栬祴鍊肩粰鍙﹀鐨勫璞′娇鐢紝鍚屾椂route鍐呴儴鏈変娇鐢╰his锛屼細瀵艰嚧route澶卞幓涓婁笅鏂�
+		// 杩欓噷鍦ㄦ瀯閫犲嚱鏁颁腑杩涜this缁戝畾
+		this.route = this.route.bind(this)
+	}
+
+	// 鍒ゆ柇url鍓嶉潰鏄惁鏈�"/"锛屽鏋滄病鏈夊垯鍔犱笂锛屽惁鍒欐棤娉曡烦杞�
+	addRootPath(url) {
+		return url[0] === '/' ? url : `/${url}`
+	}
+
+	// 鏁村悎璺敱鍙傛暟
+	mixinParam(url, params) {
+		url = url && this.addRootPath(url)
+		
+		// 浣跨敤姝e垯鍖归厤锛屼富瑕佷緷鎹槸鍒ゆ柇鏄惁鏈�"/","?","="绛夛紝濡傗��/page/index/index?name=mary"
+		// 濡傛灉鏈塽rl涓湁get鍙傛暟锛岃浆鎹㈠悗鏃犻渶甯︿笂"?"
+		let query = ''
+		if (/.*\/.*\?.*=.*/.test(url)) {
+			// object瀵硅薄杞负get绫诲瀷鐨勫弬鏁�
+			query = uni.$u.queryParams(params, false);
+			// 鍥犱负宸叉湁get鍙傛暟,鎵�浠ュ悗闈㈡嫾鎺ョ殑鍙傛暟闇�瑕佸甫涓�"&"闅斿紑
+			return url += "&" + query
+		} else {
+			// 鐩存帴鎷兼帴鍙傛暟锛屽洜涓烘澶剈rl涓病鏈夊悗闈㈢殑query鍙傛暟锛屼篃灏辨病鏈�"?/&"涔嬬被鐨勭鍙�
+			query = uni.$u.queryParams(params);
+			return url += query
+		}
+	}
+
+	// 瀵瑰鐨勬柟娉曞悕绉�
+	async route(options = {}, params = {}) {
+		// 鍚堝苟鐢ㄦ埛鐨勯厤缃拰鍐呴儴鐨勯粯璁ら厤缃�
+		let mergeConfig = {}
+
+		if (typeof options === 'string') {
+			// 濡傛灉options涓哄瓧绗︿覆锛屽垯涓簉oute(url, params)鐨勫舰寮�
+			mergeConfig.url = this.mixinParam(options, params)
+			mergeConfig.type = 'navigateTo'
+		} else {
+			mergeConfig = uni.$u.deepClone(options, this.config)
+			// 鍚﹀垯姝e父浣跨敤mergeConfig涓殑url鍜宲arams杩涜鎷兼帴
+			mergeConfig.url = this.mixinParam(options.url, options.params)
+		}
+		
+		if(params.intercept) {
+			this.config.intercept = params.intercept
+		}
+		// params鍙傛暟涔熷甫缁欐嫤鎴櫒
+		mergeConfig.params = params
+		// 鍚堝苟鍐呭閮ㄥ弬鏁�
+		mergeConfig = uni.$u.deepMerge(this.config, mergeConfig)
+		// 鍒ゆ柇鐢ㄦ埛鏄惁瀹氫箟浜嗘嫤鎴櫒
+		if (typeof uni.$u.routeIntercept === 'function') {
+			// 瀹氫竴涓猵romise锛屾牴鎹敤鎴锋墽琛宺esolve(true)鎴栬�卹esolve(false)鏉ュ喅瀹氭槸鍚﹁繘琛岃矾鐢辫烦杞�
+			const isNext = await new Promise((resolve, reject) => {
+				uni.$u.routeIntercept(mergeConfig, resolve)
+			})
+			// 濡傛灉isNext涓簍rue锛屽垯鎵ц璺敱璺宠浆
+			isNext && this.openPage(mergeConfig)
+		} else {
+			this.openPage(mergeConfig)
+		}
+	}
+
+	// 鎵ц璺敱璺宠浆
+	openPage(config) {
+		// 瑙f瀯鍙傛暟
+		const {
+			url,
+			type,
+			delta,
+			animationType,
+			animationDuration
+		} = config
+		if (config.type == 'navigateTo' || config.type == 'to') {
+			uni.navigateTo({
+				url,
+				animationType,
+				animationDuration
+			});
+		}
+		if (config.type == 'redirectTo' || config.type == 'redirect') {
+			uni.redirectTo({
+				url
+			});
+		}
+		if (config.type == 'switchTab' || config.type == 'tab') {
+			uni.switchTab({
+				url
+			});
+		}
+		if (config.type == 'reLaunch' || config.type == 'launch') {
+			uni.reLaunch({
+				url
+			});
+		}
+		if (config.type == 'navigateBack' || config.type == 'back') {
+			uni.navigateBack({
+				delta
+			});
+		}
+	}
+}
+
+export default (new Router()).route
\ No newline at end of file
diff --git a/uview-ui/libs/function/sys.js b/uview-ui/libs/function/sys.js
new file mode 100644
index 0000000..00f6a28
--- /dev/null
+++ b/uview-ui/libs/function/sys.js
@@ -0,0 +1,9 @@
+export function os() {
+	return uni.getSystemInfoSync().platform;
+};
+
+export function sys() {
+	return uni.getSystemInfoSync();
+}
+
+
diff --git a/uview-ui/libs/function/test.js b/uview-ui/libs/function/test.js
new file mode 100644
index 0000000..fd25e18
--- /dev/null
+++ b/uview-ui/libs/function/test.js
@@ -0,0 +1,232 @@
+/**
+ * 楠岃瘉鐢靛瓙閭鏍煎紡
+ */
+function email(value) {
+	return /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/.test(value);
+}
+
+/**
+ * 楠岃瘉鎵嬫満鏍煎紡
+ */
+function mobile(value) {
+	return /^1[3-9]\d{9}$/.test(value)
+}
+
+/**
+ * 楠岃瘉URL鏍煎紡
+ */
+function url(value) {
+	return /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?/.test(value)
+}
+
+/**
+ * 楠岃瘉鏃ユ湡鏍煎紡
+ */
+function date(value) {
+	return !/Invalid|NaN/.test(new Date(value).toString())
+}
+
+/**
+ * 楠岃瘉ISO绫诲瀷鐨勬棩鏈熸牸寮�
+ */
+function dateISO(value) {
+	return /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(value)
+}
+
+/**
+ * 楠岃瘉鍗佽繘鍒舵暟瀛�
+ */
+function number(value) {
+	return /^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value)
+}
+
+/**
+ * 楠岃瘉鏁存暟
+ */
+function digits(value) {
+	return /^\d+$/.test(value)
+}
+
+/**
+ * 楠岃瘉韬唤璇佸彿鐮�
+ */
+function idCard(value) {
+	return /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/.test(
+		value)
+}
+
+/**
+ * 鏄惁杞︾墝鍙�
+ */
+function carNo(value) {
+	// 鏂拌兘婧愯溅鐗�
+	const xreg = /^[浜触娌笣鍐�璞簯杈介粦婀樼殩椴佹柊鑻忔禉璧i剛妗傜敇鏅嬭挋闄曞悏闂借吹绮ら潚钘忓窛瀹佺惣浣块A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
+	// 鏃ц溅鐗�
+	const creg = /^[浜触娌笣鍐�璞簯杈介粦婀樼殩椴佹柊鑻忔禉璧i剛妗傜敇鏅嬭挋闄曞悏闂借吹绮ら潚钘忓窛瀹佺惣浣块A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9鎸傚璀︽腐婢砞{1}$/;
+	if (value.length === 7) {
+		return creg.test(value);
+	} else if (value.length === 8) {
+		return xreg.test(value);
+	} else {
+		return false;
+	}
+}
+
+/**
+ * 閲戦,鍙厑璁�2浣嶅皬鏁�
+ */
+function amount(value) {
+	//閲戦锛屽彧鍏佽淇濈暀涓や綅灏忔暟
+	return /^[1-9]\d*(,\d{3})*(\.\d{1,2})?$|^0\.\d{1,2}$/.test(value);
+}
+
+/**
+ * 涓枃
+ */
+function chinese(value) {
+	let reg = /^[\u4e00-\u9fa5]+$/gi;
+	return reg.test(value);
+}
+
+/**
+ * 鍙兘杈撳叆瀛楁瘝
+ */
+function letter(value) {
+	return /^[a-zA-Z]*$/.test(value);
+}
+
+/**
+ * 鍙兘鏄瓧姣嶆垨鑰呮暟瀛�
+ */
+function enOrNum(value) {
+	//鑻辨枃鎴栬�呮暟瀛�
+	let reg = /^[0-9a-zA-Z]*$/g;
+	return reg.test(value);
+}
+
+/**
+ * 楠岃瘉鏄惁鍖呭惈鏌愪釜鍊�
+ */
+function contains(value, param) {
+	return value.indexOf(param) >= 0
+}
+
+/**
+ * 楠岃瘉涓�涓�艰寖鍥碵min, max]
+ */
+function range(value, param) {
+	return value >= param[0] && value <= param[1]
+}
+
+/**
+ * 楠岃瘉涓�涓暱搴﹁寖鍥碵min, max]
+ */
+function rangeLength(value, param) {
+	return value.length >= param[0] && value.length <= param[1]
+}
+
+/**
+ * 鏄惁鍥哄畾鐢佃瘽
+ */
+function landline(value) {
+	let reg = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/;
+	return reg.test(value);
+}
+
+/**
+ * 鍒ゆ柇鏄惁涓虹┖
+ */
+function empty(value) {
+	switch (typeof value) {
+		case 'undefined':
+			return true;
+		case 'string':
+			if (value.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g, '').length == 0) return true;
+			break;
+		case 'boolean':
+			if (!value) return true;
+			break;
+		case 'number':
+			if (0 === value || isNaN(value)) return true;
+			break;
+		case 'object':
+			if (null === value || value.length === 0) return true;
+			for (var i in value) {
+				return false;
+			}
+			return true;
+	}
+	return false;
+}
+
+/**
+ * 鏄惁json瀛楃涓�
+ */
+function jsonString(value) {
+	if (typeof value == 'string') {
+		try {
+			var obj = JSON.parse(value);
+			if (typeof obj == 'object' && obj) {
+				return true;
+			} else {
+				return false;
+			}
+		} catch (e) {
+			return false;
+		}
+	}
+	return false;
+}
+
+
+/**
+ * 鏄惁鏁扮粍
+ */
+function array(value) {
+	if (typeof Array.isArray === "function") {
+		return Array.isArray(value);
+	} else {
+		return Object.prototype.toString.call(value) === "[object Array]";
+	}
+}
+
+/**
+ * 鏄惁瀵硅薄
+ */
+function object(value) {
+	return Object.prototype.toString.call(value) === '[object Object]';
+}
+
+/**
+ * 鏄惁鐭俊楠岃瘉鐮�
+ */
+function code(value, len = 6) {
+	return new RegExp(`^\\d{${len}}$`).test(value);
+}
+
+
+export default {
+	email,
+	mobile,
+	url,
+	date,
+	dateISO,
+	number,
+	digits,
+	idCard,
+	carNo,
+	amount,
+	chinese,
+	letter,
+	enOrNum,
+	contains,
+	range,
+	rangeLength,
+	empty,
+	isEmpty: empty,
+	jsonString,
+	landline,
+	object,
+	array,
+	code
+}
diff --git a/uview-ui/libs/function/throttle.js b/uview-ui/libs/function/throttle.js
new file mode 100644
index 0000000..ad830b2
--- /dev/null
+++ b/uview-ui/libs/function/throttle.js
@@ -0,0 +1,32 @@
+let timer, flag;
+/**
+ * 鑺傛祦鍘熺悊锛氬湪涓�瀹氭椂闂村唴锛屽彧鑳借Е鍙戜竴娆�
+ * 
+ * @param {Function} func 瑕佹墽琛岀殑鍥炶皟鍑芥暟 
+ * @param {Number} wait 寤舵椂鐨勬椂闂�
+ * @param {Boolean} immediate 鏄惁绔嬪嵆鎵ц
+ * @return null
+ */
+function throttle(func, wait = 500, immediate = true) {
+	if (immediate) {
+		if (!flag) {
+			flag = true;
+			// 濡傛灉鏄珛鍗虫墽琛岋紝鍒欏湪wait姣鍐呭紑濮嬫椂鎵ц
+			typeof func === 'function' && func();
+			timer = setTimeout(() => {
+				flag = false;
+			}, wait);
+		}
+	} else {
+		if (!flag) {
+			flag = true
+			// 濡傛灉鏄潪绔嬪嵆鎵ц锛屽垯鍦╳ait姣鍐呯殑缁撴潫澶勬墽琛�
+			timer = setTimeout(() => {
+				flag = false
+				typeof func === 'function' && func();
+			}, wait);
+		}
+		
+	}
+};
+export default throttle
diff --git a/uview-ui/libs/function/timeFormat.js b/uview-ui/libs/function/timeFormat.js
new file mode 100644
index 0000000..0372f2f
--- /dev/null
+++ b/uview-ui/libs/function/timeFormat.js
@@ -0,0 +1,51 @@
+// padStart 鐨� polyfill锛屽洜涓烘煇浜涙満鍨嬫垨鎯呭喌锛岃繕鏃犳硶鏀寔es7鐨刾adStart锛屾瘮濡傜數鑴戠増鐨勫井淇″皬绋嬪簭
+// 鎵�浠ヨ繖閲屽仛涓�涓吋瀹筽olyfill鐨勫吋瀹瑰鐞�
+if (!String.prototype.padStart) {
+	// 涓轰簡鏂逛究琛ㄧず杩欓噷 fillString 鐢ㄤ簡ES6 鐨勯粯璁ゅ弬鏁帮紝涓嶅奖鍝嶇悊瑙�
+	String.prototype.padStart = function(maxLength, fillString = ' ') {
+		if (Object.prototype.toString.call(fillString) !== "[object String]") throw new TypeError(
+			'fillString must be String')
+		let str = this
+		// 杩斿洖 String(str) 杩欓噷鏄负浜嗕娇杩斿洖鐨勫�兼槸瀛楃涓插瓧闈㈤噺锛屽湪鎺у埗鍙颁腑鏇寸鍚堢洿瑙�
+		if (str.length >= maxLength) return String(str)
+
+		let fillLength = maxLength - str.length,
+			times = Math.ceil(fillLength / fillString.length)
+		while (times >>= 1) {
+			fillString += fillString
+			if (times === 1) {
+				fillString += fillString
+			}
+		}
+		return fillString.slice(0, fillLength) + str;
+	}
+}
+
+// 鍏朵粬鏇村鏄牸寮忓寲鏈夊涓�:
+// yyyy:mm:dd|yyyy:mm|yyyy骞磎m鏈坉d鏃yyyy骞磎m鏈坉d鏃� hh鏃禡M鍒嗙瓑,鍙嚜瀹氫箟缁勫悎
+function timeFormat(dateTime = null, fmt = 'yyyy-mm-dd') {
+	// 濡傛灉涓簄ull,鍒欐牸寮忓寲褰撳墠鏃堕棿
+	if (!dateTime) dateTime = Number(new Date());
+	// 濡傛灉dateTime闀垮害涓�10鎴栬��13锛屽垯涓虹鍜屾绉掔殑鏃堕棿鎴筹紝濡傛灉瓒呰繃13浣嶏紝鍒欎负鍏朵粬鐨勬椂闂存牸寮�
+	if (dateTime.toString().length == 10) dateTime *= 1000;
+	let date = new Date(dateTime);
+	let ret;
+	let opt = {
+		"y+": date.getFullYear().toString(), // 骞�
+		"m+": (date.getMonth() + 1).toString(), // 鏈�
+		"d+": date.getDate().toString(), // 鏃�
+		"h+": date.getHours().toString(), // 鏃�
+		"M+": date.getMinutes().toString(), // 鍒�
+		"s+": date.getSeconds().toString() // 绉�
+		// 鏈夊叾浠栨牸寮忓寲瀛楃闇�姹傚彲浠ョ户缁坊鍔狅紝蹇呴』杞寲鎴愬瓧绗︿覆
+	};
+	for (let k in opt) {
+		ret = new RegExp("(" + k + ")").exec(fmt);
+		if (ret) {
+			fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
+		};
+	};
+	return fmt;
+}
+
+export default timeFormat
diff --git a/uview-ui/libs/function/timeFrom.js b/uview-ui/libs/function/timeFrom.js
new file mode 100644
index 0000000..68cd990
--- /dev/null
+++ b/uview-ui/libs/function/timeFrom.js
@@ -0,0 +1,47 @@
+import timeFormat from '../../libs/function/timeFormat.js';
+
+/**
+ * 鏃堕棿鎴宠浆涓哄涔呬箣鍓�
+ * @param String timestamp 鏃堕棿鎴�
+ * @param String | Boolean format 濡傛灉涓烘椂闂存牸寮忓瓧绗︿覆锛岃秴鍑轰竴瀹氭椂闂磋寖鍥达紝杩斿洖鍥哄畾鐨勬椂闂存牸寮忥紱
+ * 濡傛灉涓哄竷灏斿�糵alse锛屾棤璁轰粈涔堟椂闂达紝閮借繑鍥炲涔呬互鍓嶇殑鏍煎紡
+ */
+function timeFrom(dateTime = null, format = 'yyyy-mm-dd') {
+	// 濡傛灉涓簄ull,鍒欐牸寮忓寲褰撳墠鏃堕棿
+	if (!dateTime) dateTime = Number(new Date());
+	// 濡傛灉dateTime闀垮害涓�10鎴栬��13锛屽垯涓虹鍜屾绉掔殑鏃堕棿鎴筹紝濡傛灉瓒呰繃13浣嶏紝鍒欎负鍏朵粬鐨勬椂闂存牸寮�
+	if (dateTime.toString().length == 10) dateTime *= 1000;
+	let timestamp = + new Date(Number(dateTime));
+
+	let timer = (Number(new Date()) - timestamp) / 1000;
+	// 濡傛灉灏忎簬5鍒嗛挓,鍒欒繑鍥�"鍒氬垰",鍏朵粬浠ユ绫绘帹
+	let tips = '';
+	switch (true) {
+		case timer < 300:
+			tips = '鍒氬垰';
+			break;
+		case timer >= 300 && timer < 3600:
+			tips = parseInt(timer / 60) + '鍒嗛挓鍓�';
+			break;
+		case timer >= 3600 && timer < 86400:
+			tips = parseInt(timer / 3600) + '灏忔椂鍓�';
+			break;
+		case timer >= 86400 && timer < 2592000:
+			tips = parseInt(timer / 86400) + '澶╁墠';
+			break;
+		default:
+			// 濡傛灉format涓篺alse锛屽垯鏃犺浠�涔堟椂闂存埑锛岄兘鏄剧ずxx涔嬪墠
+			if(format === false) {
+				if(timer >= 2592000 && timer < 365 * 86400) {
+					tips = parseInt(timer / (86400 * 30)) + '涓湀鍓�';
+				} else {
+					tips = parseInt(timer / (86400 * 365)) + '骞村墠';
+				}
+			} else {
+				tips = timeFormat(timestamp, format);
+			}
+	}
+	return tips;
+}
+
+export default timeFrom;
diff --git a/uview-ui/libs/function/toast.js b/uview-ui/libs/function/toast.js
new file mode 100644
index 0000000..91afa73
--- /dev/null
+++ b/uview-ui/libs/function/toast.js
@@ -0,0 +1,9 @@
+function toast(title, duration = 1500) {
+	uni.showToast({
+		title: title,
+		icon: 'none',
+		duration: duration
+	})
+}
+
+export default toast
diff --git a/uview-ui/libs/function/trim.js b/uview-ui/libs/function/trim.js
new file mode 100644
index 0000000..72adc37
--- /dev/null
+++ b/uview-ui/libs/function/trim.js
@@ -0,0 +1,15 @@
+function trim(str, pos = 'both') {
+	if (pos == 'both') {
+		return str.replace(/^\s+|\s+$/g, "");
+	} else if (pos == "left") {
+		return str.replace(/^\s*/, '');
+	} else if (pos == 'right') {
+		return str.replace(/(\s*$)/g, "");
+	} else if (pos == 'all') {
+		return str.replace(/\s+/g, "");
+	} else {
+		return str;
+	}
+}
+
+export default trim
diff --git a/uview-ui/libs/function/type2icon.js b/uview-ui/libs/function/type2icon.js
new file mode 100644
index 0000000..23cb40e
--- /dev/null
+++ b/uview-ui/libs/function/type2icon.js
@@ -0,0 +1,35 @@
+/**
+ * 鏍规嵁涓婚type鍊�,鑾峰彇瀵瑰簲鐨勫浘鏍�
+ * @param String type 涓婚鍚嶇О,primary|info|error|warning|success
+ * @param String fill 鏄惁浣跨敤fill濉厖瀹炰綋鐨勫浘鏍�  
+ */
+function type2icon(type = 'success', fill = false) {
+	// 濡傛灉闈為缃��,榛樿涓簊uccess
+	if (['primary', 'info', 'error', 'warning', 'success'].indexOf(type) == -1) type = 'success';
+	let iconName = '';
+	// 鐩墠(2019-12-12),info鍜宲rimary浣跨敤鍚屼竴涓浘鏍�
+	switch (type) {
+		case 'primary':
+			iconName = 'info-circle';
+			break;
+		case 'info':
+			iconName = 'info-circle';
+			break;
+		case 'error':
+			iconName = 'close-circle';
+			break;
+		case 'warning':
+			iconName = 'error-circle';
+			break;
+		case 'success':
+			iconName = 'checkmark-circle';
+			break;
+		default:
+			iconName = 'checkmark-circle';
+	}
+	// 鏄惁鏄疄浣撶被鍨�,鍔犱笂-fill,鍦╥con缁勪欢搴撲腑,瀹炰綋鐨勭被鍚嶆槸鍚庨潰鍔�-fill鐨�
+	if (fill) iconName += '-fill';
+	return iconName;
+}
+
+export default type2icon
diff --git a/uview-ui/libs/mixin/mixin.js b/uview-ui/libs/mixin/mixin.js
new file mode 100644
index 0000000..e388986
--- /dev/null
+++ b/uview-ui/libs/mixin/mixin.js
@@ -0,0 +1,64 @@
+module.exports = {
+	data() {
+		return {}
+	},
+	onLoad() {
+		// getRect鎸傝浇鍒�$u涓婏紝鍥犱负杩欐柟娉曢渶瑕佷娇鐢╥n(this)锛屾墍浠ユ棤娉曟妸瀹冪嫭绔嬫垚涓�涓崟鐙殑鏂囦欢瀵煎嚭
+		this.$u.getRect = this.$uGetRect
+	},
+	methods: {
+		// 鏌ヨ鑺傜偣淇℃伅
+		// 鐩墠姝ゆ柟娉曞湪鏀粯瀹濆皬绋嬪簭涓棤娉曡幏鍙栫粍浠惰窡鎺ョ偣鐨勫昂瀵革紝涓烘敮浠樺疂鐨刡ug(2020-07-21)
+		// 瑙e喅鍔炴硶涓哄湪缁勪欢鏍归儴鍐嶅涓�涓病鏈変换浣曚綔鐢ㄧ殑view鍏冪礌
+		$uGetRect(selector, all) {
+			return new Promise(resolve => {
+				uni.createSelectorQuery().
+				in(this)[all ? 'selectAll' : 'select'](selector)
+					.boundingClientRect(rect => {
+						if (all && Array.isArray(rect) && rect.length) {
+							resolve(rect)
+						}
+						if (!all && rect) {
+							resolve(rect)
+						}
+					})
+					.exec()
+			})
+		},
+		getParentData(parentName = '') {
+			// 閬垮厤鍦╟reated涓幓瀹氫箟parent鍙橀噺
+			if(!this.parent) this.parent = false;
+			// 杩欓噷鐨勬湰璐ㄥ師鐞嗘槸锛岄�氳繃鑾峰彇鐖剁粍浠跺疄渚�(涔熷嵆u-radio-group鐨則his)
+			// 灏嗙埗缁勪欢this涓搴旂殑鍙傛暟锛岃祴鍊肩粰鏈粍浠�(u-radio鐨則his)鐨刾arentData瀵硅薄涓搴旂殑灞炴��
+			// 涔嬫墍浠ラ渶瑕佽繖涔堝仛锛屾槸鍥犱负鎵�鏈夌涓紝澶存潯灏忕▼搴忎笉鏀寔閫氳繃this.parent.xxx鍘荤洃鍚埗缁勪欢鍙傛暟鐨勫彉鍖�
+			this.parent = this.$u.$parent.call(this, parentName);
+			if(this.parent) {
+				// 鍘嗛亶parentData涓殑灞炴�э紝灏唒arent涓殑鍚屽悕灞炴�ц祴鍊肩粰parentData
+				Object.keys(this.parentData).map(key => {
+					this.parentData[key] = this.parent[key];
+				});
+			}
+		},
+		// 闃绘浜嬩欢鍐掓场
+		preventEvent(e) {
+			e && e.stopPropagation && e.stopPropagation()
+		}
+	},
+	onReachBottom() {
+		uni.$emit('uOnReachBottom')
+	},
+	beforeDestroy() {
+		// 鍒ゆ柇褰撳墠椤甸潰鏄惁瀛樺湪parent鍜宑hldren锛屼竴鑸湪checkbox鍜宑heckbox-group鐖跺瓙鑱斿姩鐨勫満鏅細鏈夋鎯呭喌
+		// 缁勪欢閿�姣佹椂锛岀Щ闄ゅ瓙缁勪欢鍦ㄧ埗缁勪欢children鏁扮粍涓殑瀹炰緥锛岄噴鏀捐祫婧愶紝閬垮厤鏁版嵁娣蜂贡
+		if(this.parent && uni.$u.test.array(this.parent.children)) {
+			// 缁勪欢閿�姣佹椂锛岀Щ闄ょ埗缁勪欢涓殑children鏁扮粍涓搴旂殑瀹炰緥
+			const childrenList = this.parent.children
+			childrenList.map((child, index) => {
+				// 濡傛灉鐩哥瓑锛屽垯绉婚櫎
+				if(child === this) {
+					childrenList.splice(index, 1)
+				}
+			})
+		}
+	}
+}
diff --git a/uview-ui/libs/mixin/mpShare.js b/uview-ui/libs/mixin/mpShare.js
new file mode 100644
index 0000000..057d369
--- /dev/null
+++ b/uview-ui/libs/mixin/mpShare.js
@@ -0,0 +1,18 @@
+module.exports = {
+	onLoad() {
+		// 璁剧疆榛樿鐨勮浆鍙戝弬鏁�
+		this.$u.mpShare = {
+			title: '', // 榛樿涓哄皬绋嬪簭鍚嶇О
+			path: '', // 榛樿涓哄綋鍓嶉〉闈㈣矾寰�
+			imageUrl: '' // 榛樿涓哄綋鍓嶉〉闈㈢殑鎴浘
+		}
+	},
+	onShareAppMessage() {
+		return this.$u.mpShare
+	},
+	// #ifdef MP-WEIXIN
+	onShareTimeline() {
+		return this.$u.mpShare
+	}
+	// #endif
+}
diff --git a/uview-ui/libs/request/index.js b/uview-ui/libs/request/index.js
new file mode 100644
index 0000000..ca31670
--- /dev/null
+++ b/uview-ui/libs/request/index.js
@@ -0,0 +1,172 @@
+import deepMerge from "../function/deepMerge";
+import validate from "../function/test";
+class Request {
+	// 璁剧疆鍏ㄥ眬榛樿閰嶇疆
+	setConfig(customConfig) {
+		// 娣卞害鍚堝苟瀵硅薄锛屽惁鍒欎細閫犳垚瀵硅薄娣卞眰灞炴�т涪澶�
+		this.config = deepMerge(this.config, customConfig);
+	}
+
+	// 涓昏璇锋眰閮ㄥ垎
+	request(options = {}) {
+		// 妫�鏌ヨ姹傛嫤鎴�
+		if (this.interceptor.request && typeof this.interceptor.request === 'function') {
+			let tmpConfig = {};
+			let interceptorRequest = this.interceptor.request(options);
+			if (interceptorRequest === false) {
+				// 杩斿洖涓�涓浜巔ending鐘舵�佷腑鐨凱romise锛屾潵鍙栨秷鍘焢romise锛岄伩鍏嶈繘鍏hen()鍥炶皟
+				return new Promise(()=>{});
+			}
+			this.options = interceptorRequest;
+		}
+		options.sslVerify=false
+		options.dataType = options.dataType || this.config.dataType;
+		options.responseType = options.responseType || this.config.responseType;
+		options.url = options.url || '';
+		options.params = options.params || {};
+		options.header = Object.assign({}, this.config.header, options.header);
+		options.method = options.method || this.config.method;
+
+		return new Promise((resolve, reject) => {
+			options.complete = (response) => {
+				// 璇锋眰杩斿洖鍚庯紝闅愯棌loading(濡傛灉璇锋眰杩斿洖蹇殑璇濓紝鍙兘浼氭病鏈塴oading)
+				uni.hideLoading();
+				// 娓呴櫎瀹氭椂鍣紝濡傛灉璇锋眰鍥炴潵浜嗭紝灏辨棤闇�loading
+				clearTimeout(this.config.timer);
+				this.config.timer = null;
+				// 鍒ゆ柇鐢ㄦ埛瀵规嫤鎴繑鍥炴暟鎹殑瑕佹眰锛屽鏋渙riginalData涓簍rue锛岃繑鍥炴墍鏈夌殑鏁版嵁(response)鍒版嫤鎴櫒锛屽惁鍒欏彧杩斿洖response.data
+				if(this.config.originalData) {
+					// 鍒ゆ柇鏄惁瀛樺湪鎷︽埅鍣�
+					if (this.interceptor.response && typeof this.interceptor.response === 'function') {
+						let resInterceptors = this.interceptor.response(response, options); // 澧炲姞璇锋眰閫夐」锛屾柟渚垮悗缁鐞� ThinkGem
+						// 濡傛灉鎷︽埅鍣ㄤ笉杩斿洖false锛屽氨灏嗘嫤鎴櫒杩斿洖鐨勫唴瀹圭粰this.$u.post鐨則hen鍥炶皟
+						if (resInterceptors !== false) {
+							resolve(resInterceptors);
+						} else {
+							// 濡傛灉鎷︽埅鍣ㄨ繑鍥瀎alse锛屾剰鍛崇潃鎷︽埅鍣ㄥ畾涔夎�呰涓鸿繑鍥炴湁闂锛岀洿鎺ユ帴鍏atch鍥炶皟
+							reject(response);
+						}
+					} else {
+						// 濡傛灉瑕佹眰杩斿洖鍘熷鏁版嵁锛屽氨绠楁病鏈夋嫤鎴櫒锛屼篃杩斿洖鏈�鍘熷鐨勬暟鎹�
+						resolve(response);
+					}
+				} else {
+					if (response.statusCode == 200) {
+						if (this.interceptor.response && typeof this.interceptor.response === 'function') {
+							let resInterceptors = this.interceptor.response(response.data, options); // 澧炲姞璇锋眰閫夐」锛屾柟渚垮悗缁鐞� ThinkGem
+							if (resInterceptors !== false) {
+								resolve(resInterceptors);
+							} else {
+								reject(response.data);
+							}
+						} else {
+							// 濡傛灉涓嶆槸杩斿洖鍘熷鏁版嵁(originalData=false)锛屼笖娌℃湁鎷︽埅鍣ㄧ殑鎯呭喌涓嬶紝杩斿洖绾暟鎹粰then鍥炶皟
+							resolve(response.data);
+						}
+					} else {
+						// 涓嶈繑鍥炲師濮嬫暟鎹殑鎯呭喌涓嬶紝鏈嶅姟鍣ㄧ姸鎬佺爜涓嶄负200锛宮odal寮规鎻愮ず
+						// if(response.errMsg) {
+						// 	uni.showModal({
+						// 		title: response.errMsg
+						// 	});
+						// }
+						reject(response)
+					}
+				}
+			}
+
+			// 鍒ゆ柇鐢ㄦ埛浼犻�掔殑URL鏄惁/寮�澶�,濡傛灉涓嶆槸,鍔犱笂/锛岃繖閲屼娇鐢ㄤ簡uView鐨則est.js楠岃瘉搴撶殑url()鏂规硶
+			options.url = validate.url(options.url) ? options.url : (this.config.baseUrl + (options.url.indexOf('/') == 0 ?
+				options.url : '/' + options.url));
+
+			// 鏄惁鏄剧ずloading
+			// 鍔犱竴涓槸鍚﹀凡鏈塼imer瀹氭椂鍣ㄧ殑鍒ゆ柇锛屽惁鍒欐湁涓や釜鍚屾椂璇锋眰鐨勬椂鍊欙紝鍚庤�呬細娓呴櫎鍓嶈�呯殑瀹氭椂鍣╥d
+			// 鑰屾病鏈夋竻闄ゅ墠鑰呯殑瀹氭椂鍣紝瀵艰嚧鍓嶈�呰秴鏃讹紝涓�鐩存樉绀簂oading
+			if(this.config.showLoading && !this.config.timer) {
+				this.config.timer = setTimeout(() => {
+					uni.showLoading({
+						title: this.config.loadingText,
+						mask: this.config.loadingMask
+					})
+					this.config.timer = null;
+				}, this.config.loadingTime);
+			}
+			uni.request(options);
+		})
+		// .catch(res => {
+		// 	// 濡傛灉杩斿洖reject()锛屼笉璁╁叾杩涘叆this.$u.post().then().catch()鍚庨潰鐨刢atct()
+		// 	// 鍥犱负寰堝浜洪兘浼氬繕浜嗗啓鍚庨潰鐨刢atch()锛屽鑷存姤閿欐崟鑾蜂笉鍒癱atch
+		// 	return new Promise(()=>{});
+		// })
+	}
+
+	constructor() {
+		this.config = {
+			baseUrl: '', // 璇锋眰鐨勬牴鍩熷悕
+			// 榛樿鐨勮姹傚ご
+			header: {
+				//'content-type': 'application/x-www-form-urlencoded'
+			},
+			method: 'POST',
+			// 璁剧疆涓簀son锛岃繑鍥炲悗uni.request浼氬鏁版嵁杩涜涓�娆SON.parse
+			dataType: 'json',
+			// 姝ゅ弬鏁版棤闇�澶勭悊锛屽洜涓�5+鍜屾敮浠樺疂灏忕▼搴忎笉鏀寔锛岄粯璁や负text鍗冲彲
+			responseType: 'text',
+			showLoading: true, // 鏄惁鏄剧ず璇锋眰涓殑loading
+			loadingText: '璇锋眰涓�...',
+			loadingTime: 800, // 鍦ㄦ鏃堕棿鍐咃紝璇锋眰杩樻病鍥炴潵鐨勮瘽锛屽氨鏄剧ず鍔犺浇涓姩鐢伙紝鍗曚綅ms
+			timer: null, // 瀹氭椂鍣�
+			originalData: false, // 鏄惁鍦ㄦ嫤鎴櫒涓繑鍥炴湇鍔$鐨勫師濮嬫暟鎹紝瑙佹枃妗h鏄�
+			loadingMask: true, // 灞曠ずloading鐨勬椂鍊欙紝鏄惁缁欎竴涓�忔槑鐨勮挋灞傦紝闃叉瑙︽懜绌块��
+		}
+
+		// 鎷︽埅鍣�
+		this.interceptor = {
+			// 璇锋眰鍓嶇殑鎷︽埅
+			request: null,
+			// 璇锋眰鍚庣殑鎷︽埅
+			response: null
+		}
+
+		// get璇锋眰
+		this.get = (url, data = {}, header = {}) => {
+			return this.request({
+				method: 'GET',
+				url,
+				header,
+				data
+			})
+		}
+
+		// post璇锋眰
+		this.post = (url, data = {}, header = {}) => {
+			return this.request({
+				url,
+				method: 'POST',
+				header,
+				data
+			})
+		}
+
+		// put璇锋眰锛屼笉鏀寔鏀粯瀹濆皬绋嬪簭(HX2.6.15)
+		this.put = (url, data = {}, header = {}) => {
+			return this.request({
+				url,
+				method: 'PUT',
+				header:{'Content-type': 'application/json;charset=UTF-8'},
+				data
+			})
+		}
+
+		// delete璇锋眰锛屼笉鏀寔鏀粯瀹濆拰澶存潯灏忕▼搴�(HX2.6.15)
+		this.delete = (url, data = {}, header = {}) => {
+			return this.request({
+				url,
+				method: 'DELETE',
+				header,
+				data
+			})
+		}
+	}
+}
+export default new Request
diff --git a/uview-ui/libs/store/index.js b/uview-ui/libs/store/index.js
new file mode 100644
index 0000000..a5927b3
--- /dev/null
+++ b/uview-ui/libs/store/index.js
@@ -0,0 +1,19 @@
+// 鏆傛椂涓嶇敤vuex妯″潡鏂瑰紡瀹炵幇锛屽皢璇ユ柟娉曠洿鎺ユ斁鍏ュ埌/store/index.js涓�
+const module = {
+	actions: {
+		$uStore({rootState}, params) {
+			let nameArr = params.name.split('.');
+			if(nameArr.length >= 2) {
+				let obj = rootState[nameArr[0]];
+				for(let i = 1; i < nameArr.length - 1; i ++) {
+					obj = obj[nameArr[i]];
+				}
+				obj[nameArr[nameArr.length - 1]] = params.value;
+			} else {
+				rootState[params.name] = params.value;
+			}
+		}
+	}
+}
+
+export default module
\ No newline at end of file
diff --git a/uview-ui/libs/util/area.js b/uview-ui/libs/util/area.js
new file mode 100644
index 0000000..0d602e9
--- /dev/null
+++ b/uview-ui/libs/util/area.js
@@ -0,0 +1 @@
+var areaData=[[[{"label":"涓滃煄鍖�","value":"110101"},{"label":"瑗垮煄鍖�","value":"110102"},{"label":"鏈濋槼鍖�","value":"110105"},{"label":"涓板彴鍖�","value":"110106"},{"label":"鐭虫櫙灞卞尯","value":"110107"},{"label":"娴锋穩鍖�","value":"110108"},{"label":"闂ㄥご娌熷尯","value":"110109"},{"label":"鎴垮北鍖�","value":"110111"},{"label":"閫氬窞鍖�","value":"110112"},{"label":"椤轰箟鍖�","value":"110113"},{"label":"鏄屽钩鍖�","value":"110114"},{"label":"澶у叴鍖�","value":"110115"},{"label":"鎬�鏌斿尯","value":"110116"},{"label":"骞宠胺鍖�","value":"110117"},{"label":"瀵嗕簯鍖�","value":"110118"},{"label":"寤跺簡鍖�","value":"110119"}]],[[{"label":"鍜屽钩鍖�","value":"120101"},{"label":"娌充笢鍖�","value":"120102"},{"label":"娌宠タ鍖�","value":"120103"},{"label":"鍗楀紑鍖�","value":"120104"},{"label":"娌冲寳鍖�","value":"120105"},{"label":"绾㈡ˉ鍖�","value":"120106"},{"label":"涓滀附鍖�","value":"120110"},{"label":"瑗块潚鍖�","value":"120111"},{"label":"娲ュ崡鍖�","value":"120112"},{"label":"鍖楄景鍖�","value":"120113"},{"label":"姝︽竻鍖�","value":"120114"},{"label":"瀹濆澔鍖�","value":"120115"},{"label":"婊ㄦ捣鏂板尯","value":"120116"},{"label":"瀹佹渤鍖�","value":"120117"},{"label":"闈欐捣鍖�","value":"120118"},{"label":"钃熷窞鍖�","value":"120119"}]],[[{"label":"闀垮畨鍖�","value":"130102"},{"label":"妗ヨタ鍖�","value":"130104"},{"label":"鏂板崕鍖�","value":"130105"},{"label":"浜曢檳鐭垮尯","value":"130107"},{"label":"瑁曞崕鍖�","value":"130108"},{"label":"钘佸煄鍖�","value":"130109"},{"label":"楣挎硥鍖�","value":"130110"},{"label":"鏍惧煄鍖�","value":"130111"},{"label":"浜曢檳鍘�","value":"130121"},{"label":"姝e畾鍘�","value":"130123"},{"label":"琛屽攼鍘�","value":"130125"},{"label":"鐏靛鍘�","value":"130126"},{"label":"楂橀倯鍘�","value":"130127"},{"label":"娣辨辰鍘�","value":"130128"},{"label":"璧炵殗鍘�","value":"130129"},{"label":"鏃犳瀬鍘�","value":"130130"},{"label":"骞冲北鍘�","value":"130131"},{"label":"鍏冩皬鍘�","value":"130132"},{"label":"璧靛幙","value":"130133"},{"label":"鐭冲搴勯珮鏂版妧鏈骇涓氬紑鍙戝尯","value":"130171"},{"label":"鐭冲搴勫惊鐜寲宸ュ洯鍖�","value":"130172"},{"label":"杈涢泦甯�","value":"130181"},{"label":"鏅嬪窞甯�","value":"130183"},{"label":"鏂颁箰甯�","value":"130184"}],[{"label":"璺崡鍖�","value":"130202"},{"label":"璺寳鍖�","value":"130203"},{"label":"鍙ゅ喍鍖�","value":"130204"},{"label":"寮�骞冲尯","value":"130205"},{"label":"涓板崡鍖�","value":"130207"},{"label":"涓版鼎鍖�","value":"130208"},{"label":"鏇瑰鐢稿尯","value":"130209"},{"label":"婊﹀幙","value":"130223"},{"label":"婊﹀崡鍘�","value":"130224"},{"label":"涔愪涵鍘�","value":"130225"},{"label":"杩佽タ鍘�","value":"130227"},{"label":"鐜夌敯鍘�","value":"130229"},{"label":"鍞愬北甯傝姦鍙扮粡娴庢妧鏈紑鍙戝尯","value":"130271"},{"label":"鍞愬北甯傛眽娌界鐞嗗尯","value":"130272"},{"label":"鍞愬北楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"130273"},{"label":"娌冲寳鍞愬北娴锋腐缁忔祹寮�鍙戝尯","value":"130274"},{"label":"閬靛寲甯�","value":"130281"},{"label":"杩佸畨甯�","value":"130283"}],[{"label":"娴锋腐鍖�","value":"130302"},{"label":"灞辨捣鍏冲尯","value":"130303"},{"label":"鍖楁埓娌冲尯","value":"130304"},{"label":"鎶氬畞鍖�","value":"130306"},{"label":"闈掗緳婊℃棌鑷不鍘�","value":"130321"},{"label":"鏄岄粠鍘�","value":"130322"},{"label":"鍗㈤緳鍘�","value":"130324"},{"label":"绉︾殗宀涘競缁忔祹鎶�鏈紑鍙戝尯","value":"130371"},{"label":"鍖楁埓娌虫柊鍖�","value":"130372"}],[{"label":"閭北鍖�","value":"130402"},{"label":"涓涘彴鍖�","value":"130403"},{"label":"澶嶅叴鍖�","value":"130404"},{"label":"宄板嘲鐭垮尯","value":"130406"},{"label":"鑲ヤ埂鍖�","value":"130407"},{"label":"姘稿勾鍖�","value":"130408"},{"label":"涓存汲鍘�","value":"130423"},{"label":"鎴愬畨鍘�","value":"130424"},{"label":"澶у悕鍘�","value":"130425"},{"label":"娑夊幙","value":"130426"},{"label":"纾佸幙","value":"130427"},{"label":"閭卞幙","value":"130430"},{"label":"楦℃辰鍘�","value":"130431"},{"label":"骞垮钩鍘�","value":"130432"},{"label":"棣嗛櫠鍘�","value":"130433"},{"label":"榄忓幙","value":"130434"},{"label":"鏇插懆鍘�","value":"130435"},{"label":"閭兏缁忔祹鎶�鏈紑鍙戝尯","value":"130471"},{"label":"閭兏鍐�鍗楁柊鍖�","value":"130473"},{"label":"姝﹀畨甯�","value":"130481"}],[{"label":"妗ヤ笢鍖�","value":"130502"},{"label":"妗ヨタ鍖�","value":"130503"},{"label":"閭㈠彴鍘�","value":"130521"},{"label":"涓村煄鍘�","value":"130522"},{"label":"鍐呬笜鍘�","value":"130523"},{"label":"鏌忎埂鍘�","value":"130524"},{"label":"闅嗗哀鍘�","value":"130525"},{"label":"浠诲幙","value":"130526"},{"label":"鍗楀拰鍘�","value":"130527"},{"label":"瀹佹檵鍘�","value":"130528"},{"label":"宸ㄩ箍鍘�","value":"130529"},{"label":"鏂版渤鍘�","value":"130530"},{"label":"骞垮畻鍘�","value":"130531"},{"label":"骞充埂鍘�","value":"130532"},{"label":"濞佸幙","value":"130533"},{"label":"娓呮渤鍘�","value":"130534"},{"label":"涓磋タ鍘�","value":"130535"},{"label":"娌冲寳閭㈠彴缁忔祹寮�鍙戝尯","value":"130571"},{"label":"鍗楀甯�","value":"130581"},{"label":"娌欐渤甯�","value":"130582"}],[{"label":"绔炵鍖�","value":"130602"},{"label":"鑾叉睜鍖�","value":"130606"},{"label":"婊″煄鍖�","value":"130607"},{"label":"娓呰嫅鍖�","value":"130608"},{"label":"寰愭按鍖�","value":"130609"},{"label":"娑炴按鍘�","value":"130623"},{"label":"闃滃钩鍘�","value":"130624"},{"label":"瀹氬叴鍘�","value":"130626"},{"label":"鍞愬幙","value":"130627"},{"label":"楂橀槼鍘�","value":"130628"},{"label":"瀹瑰煄鍘�","value":"130629"},{"label":"娑炴簮鍘�","value":"130630"},{"label":"鏈涢兘鍘�","value":"130631"},{"label":"瀹夋柊鍘�","value":"130632"},{"label":"鏄撳幙","value":"130633"},{"label":"鏇查槼鍘�","value":"130634"},{"label":"锠″幙","value":"130635"},{"label":"椤哄钩鍘�","value":"130636"},{"label":"鍗氶噹鍘�","value":"130637"},{"label":"闆勫幙","value":"130638"},{"label":"淇濆畾楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"130671"},{"label":"淇濆畾鐧芥矡鏂板煄","value":"130672"},{"label":"娑垮窞甯�","value":"130681"},{"label":"瀹氬窞甯�","value":"130682"},{"label":"瀹夊浗甯�","value":"130683"},{"label":"楂樼搴楀競","value":"130684"}],[{"label":"妗ヤ笢鍖�","value":"130702"},{"label":"妗ヨタ鍖�","value":"130703"},{"label":"瀹e寲鍖�","value":"130705"},{"label":"涓嬭姳鍥尯","value":"130706"},{"label":"涓囧叏鍖�","value":"130708"},{"label":"宕囩ぜ鍖�","value":"130709"},{"label":"寮犲寳鍘�","value":"130722"},{"label":"搴蜂繚鍘�","value":"130723"},{"label":"娌芥簮鍘�","value":"130724"},{"label":"灏氫箟鍘�","value":"130725"},{"label":"钄氬幙","value":"130726"},{"label":"闃冲師鍘�","value":"130727"},{"label":"鎬�瀹夊幙","value":"130728"},{"label":"鎬�鏉ュ幙","value":"130730"},{"label":"娑块箍鍘�","value":"130731"},{"label":"璧ゅ煄鍘�","value":"130732"},{"label":"寮犲鍙e競楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"130771"},{"label":"寮犲鍙e競瀵熷寳绠$悊鍖�","value":"130772"},{"label":"寮犲鍙e競濉炲寳绠$悊鍖�","value":"130773"}],[{"label":"鍙屾ˉ鍖�","value":"130802"},{"label":"鍙屾沪鍖�","value":"130803"},{"label":"楣版墜钀ュ瓙鐭垮尯","value":"130804"},{"label":"鎵垮痉鍘�","value":"130821"},{"label":"鍏撮殕鍘�","value":"130822"},{"label":"婊﹀钩鍘�","value":"130824"},{"label":"闅嗗寲鍘�","value":"130825"},{"label":"涓板畞婊℃棌鑷不鍘�","value":"130826"},{"label":"瀹藉煄婊℃棌鑷不鍘�","value":"130827"},{"label":"鍥村満婊℃棌钂欏彜鏃忚嚜娌诲幙","value":"130828"},{"label":"鎵垮痉楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"130871"},{"label":"骞虫硥甯�","value":"130881"}],[{"label":"鏂板崕鍖�","value":"130902"},{"label":"杩愭渤鍖�","value":"130903"},{"label":"娌у幙","value":"130921"},{"label":"闈掑幙","value":"130922"},{"label":"涓滃厜鍘�","value":"130923"},{"label":"娴峰叴鍘�","value":"130924"},{"label":"鐩愬北鍘�","value":"130925"},{"label":"鑲冨畞鍘�","value":"130926"},{"label":"鍗楃毊鍘�","value":"130927"},{"label":"鍚存ˉ鍘�","value":"130928"},{"label":"鐚幙","value":"130929"},{"label":"瀛熸潙鍥炴棌鑷不鍘�","value":"130930"},{"label":"娌冲寳娌у窞缁忔祹寮�鍙戝尯","value":"130971"},{"label":"娌у窞楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"130972"},{"label":"娌у窞娓ゆ捣鏂板尯","value":"130973"},{"label":"娉婂ご甯�","value":"130981"},{"label":"浠讳笜甯�","value":"130982"},{"label":"榛勯獏甯�","value":"130983"},{"label":"娌抽棿甯�","value":"130984"}],[{"label":"瀹夋鍖�","value":"131002"},{"label":"骞块槼鍖�","value":"131003"},{"label":"鍥哄畨鍘�","value":"131022"},{"label":"姘告竻鍘�","value":"131023"},{"label":"棣欐渤鍘�","value":"131024"},{"label":"澶у煄鍘�","value":"131025"},{"label":"鏂囧畨鍘�","value":"131026"},{"label":"澶у巶鍥炴棌鑷不鍘�","value":"131028"},{"label":"寤婂潑缁忔祹鎶�鏈紑鍙戝尯","value":"131071"},{"label":"闇稿窞甯�","value":"131081"},{"label":"涓夋渤甯�","value":"131082"}],[{"label":"妗冨煄鍖�","value":"131102"},{"label":"鍐�宸炲尯","value":"131103"},{"label":"鏋e己鍘�","value":"131121"},{"label":"姝﹂倯鍘�","value":"131122"},{"label":"姝﹀己鍘�","value":"131123"},{"label":"楗堕槼鍘�","value":"131124"},{"label":"瀹夊钩鍘�","value":"131125"},{"label":"鏁呭煄鍘�","value":"131126"},{"label":"鏅幙","value":"131127"},{"label":"闃滃煄鍘�","value":"131128"},{"label":"娌冲寳琛℃按缁忔祹寮�鍙戝尯","value":"131171"},{"label":"琛℃按婊ㄦ箹鏂板尯","value":"131172"},{"label":"娣卞窞甯�","value":"131182"}]],[[{"label":"灏忓簵鍖�","value":"140105"},{"label":"杩庢辰鍖�","value":"140106"},{"label":"鏉忚姳宀尯","value":"140107"},{"label":"灏栬崏鍧尯","value":"140108"},{"label":"涓囨煆鏋楀尯","value":"140109"},{"label":"鏅嬫簮鍖�","value":"140110"},{"label":"娓呭緪鍘�","value":"140121"},{"label":"闃虫洸鍘�","value":"140122"},{"label":"濞勭儲鍘�","value":"140123"},{"label":"灞辫タ杞瀷缁煎悎鏀归潻绀鸿寖鍖�","value":"140171"},{"label":"鍙や氦甯�","value":"140181"}],[{"label":"鍩庡尯","value":"140202"},{"label":"鐭垮尯","value":"140203"},{"label":"鍗楅儕鍖�","value":"140211"},{"label":"鏂拌崳鍖�","value":"140212"},{"label":"闃抽珮鍘�","value":"140221"},{"label":"澶╅晣鍘�","value":"140222"},{"label":"骞跨伒鍘�","value":"140223"},{"label":"鐏典笜鍘�","value":"140224"},{"label":"娴戞簮鍘�","value":"140225"},{"label":"宸︿簯鍘�","value":"140226"},{"label":"澶у悓鍘�","value":"140227"},{"label":"灞辫タ澶у悓缁忔祹寮�鍙戝尯","value":"140271"}],[{"label":"鍩庡尯","value":"140302"},{"label":"鐭垮尯","value":"140303"},{"label":"閮婂尯","value":"140311"},{"label":"骞冲畾鍘�","value":"140321"},{"label":"鐩傚幙","value":"140322"},{"label":"灞辫タ闃虫硥缁忔祹寮�鍙戝尯","value":"140371"}],[{"label":"鍩庡尯","value":"140402"},{"label":"閮婂尯","value":"140411"},{"label":"闀挎不鍘�","value":"140421"},{"label":"瑗勫灒鍘�","value":"140423"},{"label":"灞暀鍘�","value":"140424"},{"label":"骞抽『鍘�","value":"140425"},{"label":"榛庡煄鍘�","value":"140426"},{"label":"澹跺叧鍘�","value":"140427"},{"label":"闀垮瓙鍘�","value":"140428"},{"label":"姝︿埂鍘�","value":"140429"},{"label":"娌佸幙","value":"140430"},{"label":"娌佹簮鍘�","value":"140431"},{"label":"灞辫タ闀挎不楂樻柊鎶�鏈骇涓氬洯鍖�","value":"140471"},{"label":"娼炲煄甯�","value":"140481"}],[{"label":"鍩庡尯","value":"140502"},{"label":"娌佹按鍘�","value":"140521"},{"label":"闃冲煄鍘�","value":"140522"},{"label":"闄靛窛鍘�","value":"140524"},{"label":"娉藉窞鍘�","value":"140525"},{"label":"楂樺钩甯�","value":"140581"}],[{"label":"鏈斿煄鍖�","value":"140602"},{"label":"骞抽瞾鍖�","value":"140603"},{"label":"灞遍槾鍘�","value":"140621"},{"label":"搴斿幙","value":"140622"},{"label":"鍙崇帀鍘�","value":"140623"},{"label":"鎬�浠佸幙","value":"140624"},{"label":"灞辫タ鏈斿窞缁忔祹寮�鍙戝尯","value":"140671"}],[{"label":"姒嗘鍖�","value":"140702"},{"label":"姒嗙ぞ鍘�","value":"140721"},{"label":"宸︽潈鍘�","value":"140722"},{"label":"鍜岄『鍘�","value":"140723"},{"label":"鏄旈槼鍘�","value":"140724"},{"label":"瀵块槼鍘�","value":"140725"},{"label":"澶胺鍘�","value":"140726"},{"label":"绁佸幙","value":"140727"},{"label":"骞抽仴鍘�","value":"140728"},{"label":"鐏电煶鍘�","value":"140729"},{"label":"浠嬩紤甯�","value":"140781"}],[{"label":"鐩愭箹鍖�","value":"140802"},{"label":"涓寸寳鍘�","value":"140821"},{"label":"涓囪崳鍘�","value":"140822"},{"label":"闂诲枩鍘�","value":"140823"},{"label":"绋峰北鍘�","value":"140824"},{"label":"鏂扮粵鍘�","value":"140825"},{"label":"缁涘幙","value":"140826"},{"label":"鍨f洸鍘�","value":"140827"},{"label":"澶忓幙","value":"140828"},{"label":"骞抽檰鍘�","value":"140829"},{"label":"鑺煄鍘�","value":"140830"},{"label":"姘告祹甯�","value":"140881"},{"label":"娌虫触甯�","value":"140882"}],[{"label":"蹇诲簻鍖�","value":"140902"},{"label":"瀹氳鍘�","value":"140921"},{"label":"浜斿彴鍘�","value":"140922"},{"label":"浠e幙","value":"140923"},{"label":"绻佸硻鍘�","value":"140924"},{"label":"瀹佹鍘�","value":"140925"},{"label":"闈欎箰鍘�","value":"140926"},{"label":"绁炴睜鍘�","value":"140927"},{"label":"浜斿鍘�","value":"140928"},{"label":"宀㈠矚鍘�","value":"140929"},{"label":"娌虫洸鍘�","value":"140930"},{"label":"淇濆痉鍘�","value":"140931"},{"label":"鍋忓叧鍘�","value":"140932"},{"label":"浜斿彴灞遍鏅悕鑳滃尯","value":"140971"},{"label":"鍘熷钩甯�","value":"140981"}],[{"label":"灏ч兘鍖�","value":"141002"},{"label":"鏇叉矁鍘�","value":"141021"},{"label":"缈煎煄鍘�","value":"141022"},{"label":"瑗勬本鍘�","value":"141023"},{"label":"娲礊鍘�","value":"141024"},{"label":"鍙ゅ幙","value":"141025"},{"label":"瀹夋辰鍘�","value":"141026"},{"label":"娴北鍘�","value":"141027"},{"label":"鍚夊幙","value":"141028"},{"label":"涔″畞鍘�","value":"141029"},{"label":"澶у畞鍘�","value":"141030"},{"label":"闅板幙","value":"141031"},{"label":"姘稿拰鍘�","value":"141032"},{"label":"钂插幙","value":"141033"},{"label":"姹捐タ鍘�","value":"141034"},{"label":"渚┈甯�","value":"141081"},{"label":"闇嶅窞甯�","value":"141082"}],[{"label":"绂荤煶鍖�","value":"141102"},{"label":"鏂囨按鍘�","value":"141121"},{"label":"浜ゅ煄鍘�","value":"141122"},{"label":"鍏村幙","value":"141123"},{"label":"涓村幙","value":"141124"},{"label":"鏌虫灄鍘�","value":"141125"},{"label":"鐭虫ゼ鍘�","value":"141126"},{"label":"宀氬幙","value":"141127"},{"label":"鏂瑰北鍘�","value":"141128"},{"label":"涓槼鍘�","value":"141129"},{"label":"浜ゅ彛鍘�","value":"141130"},{"label":"瀛濅箟甯�","value":"141181"},{"label":"姹鹃槼甯�","value":"141182"}]],[[{"label":"鏂板煄鍖�","value":"150102"},{"label":"鍥炴皯鍖�","value":"150103"},{"label":"鐜夋硥鍖�","value":"150104"},{"label":"璧涚綍鍖�","value":"150105"},{"label":"鍦熼粯鐗瑰乏鏃�","value":"150121"},{"label":"鎵樺厠鎵樺幙","value":"150122"},{"label":"鍜屾灄鏍煎皵鍘�","value":"150123"},{"label":"娓呮按娌冲幙","value":"150124"},{"label":"姝﹀窛鍘�","value":"150125"},{"label":"鍛煎拰娴╃壒閲戞捣宸ヤ笟鍥尯","value":"150171"},{"label":"鍛煎拰娴╃壒缁忔祹鎶�鏈紑鍙戝尯","value":"150172"}],[{"label":"涓滄渤鍖�","value":"150202"},{"label":"鏄嗛兘浠戝尯","value":"150203"},{"label":"闈掑北鍖�","value":"150204"},{"label":"鐭虫嫄鍖�","value":"150205"},{"label":"鐧戒簯閯傚崥鐭垮尯","value":"150206"},{"label":"涔濆師鍖�","value":"150207"},{"label":"鍦熼粯鐗瑰彸鏃�","value":"150221"},{"label":"鍥洪槼鍘�","value":"150222"},{"label":"杈惧皵缃曡寕鏄庡畨鑱斿悎鏃�","value":"150223"},{"label":"鍖呭ご绋�鍦熼珮鏂版妧鏈骇涓氬紑鍙戝尯","value":"150271"}],[{"label":"娴峰媰婀惧尯","value":"150302"},{"label":"娴峰崡鍖�","value":"150303"},{"label":"涔岃揪鍖�","value":"150304"}],[{"label":"绾㈠北鍖�","value":"150402"},{"label":"鍏冨疂灞卞尯","value":"150403"},{"label":"鏉惧北鍖�","value":"150404"},{"label":"闃块瞾绉戝皵娌佹棗","value":"150421"},{"label":"宸存灄宸︽棗","value":"150422"},{"label":"宸存灄鍙虫棗","value":"150423"},{"label":"鏋楄タ鍘�","value":"150424"},{"label":"鍏嬩粈鍏嬭吘鏃�","value":"150425"},{"label":"缈佺墰鐗规棗","value":"150426"},{"label":"鍠�鍠囨瞾鏃�","value":"150428"},{"label":"瀹佸煄鍘�","value":"150429"},{"label":"鏁栨眽鏃�","value":"150430"}],[{"label":"绉戝皵娌佸尯","value":"150502"},{"label":"绉戝皵娌佸乏缈间腑鏃�","value":"150521"},{"label":"绉戝皵娌佸乏缈煎悗鏃�","value":"150522"},{"label":"寮�椴佸幙","value":"150523"},{"label":"搴撲鸡鏃�","value":"150524"},{"label":"濂堟浖鏃�","value":"150525"},{"label":"鎵庨瞾鐗规棗","value":"150526"},{"label":"閫氳窘缁忔祹鎶�鏈紑鍙戝尯","value":"150571"},{"label":"闇嶆灄閮嫆甯�","value":"150581"}],[{"label":"涓滆儨鍖�","value":"150602"},{"label":"搴峰反浠�鍖�","value":"150603"},{"label":"杈炬媺鐗规棗","value":"150621"},{"label":"鍑嗘牸灏旀棗","value":"150622"},{"label":"閯傛墭鍏嬪墠鏃�","value":"150623"},{"label":"閯傛墭鍏嬫棗","value":"150624"},{"label":"鏉敠鏃�","value":"150625"},{"label":"涔屽鏃�","value":"150626"},{"label":"浼婇噾闇嶆礇鏃�","value":"150627"}],[{"label":"娴锋媺灏斿尯","value":"150702"},{"label":"鎵庤祲璇哄皵鍖�","value":"150703"},{"label":"闃胯崳鏃�","value":"150721"},{"label":"鑾姏杈剧摝杈炬枴灏旀棌鑷不鏃�","value":"150722"},{"label":"閯備鸡鏄ヨ嚜娌绘棗","value":"150723"},{"label":"閯傛俯鍏嬫棌鑷不鏃�","value":"150724"},{"label":"闄堝反灏旇檸鏃�","value":"150725"},{"label":"鏂板反灏旇檸宸︽棗","value":"150726"},{"label":"鏂板反灏旇檸鍙虫棗","value":"150727"},{"label":"婊℃床閲屽競","value":"150781"},{"label":"鐗欏厠鐭冲競","value":"150782"},{"label":"鎵庡叞灞競","value":"150783"},{"label":"棰濆皵鍙ょ撼甯�","value":"150784"},{"label":"鏍规渤甯�","value":"150785"}],[{"label":"涓存渤鍖�","value":"150802"},{"label":"浜斿師鍘�","value":"150821"},{"label":"纾村彛鍘�","value":"150822"},{"label":"涔屾媺鐗瑰墠鏃�","value":"150823"},{"label":"涔屾媺鐗逛腑鏃�","value":"150824"},{"label":"涔屾媺鐗瑰悗鏃�","value":"150825"},{"label":"鏉敠鍚庢棗","value":"150826"}],[{"label":"闆嗗畞鍖�","value":"150902"},{"label":"鍗撹祫鍘�","value":"150921"},{"label":"鍖栧痉鍘�","value":"150922"},{"label":"鍟嗛兘鍘�","value":"150923"},{"label":"鍏村拰鍘�","value":"150924"},{"label":"鍑夊煄鍘�","value":"150925"},{"label":"瀵熷搱灏斿彸缈煎墠鏃�","value":"150926"},{"label":"瀵熷搱灏斿彸缈间腑鏃�","value":"150927"},{"label":"瀵熷搱灏斿彸缈煎悗鏃�","value":"150928"},{"label":"鍥涘瓙鐜嬫棗","value":"150929"},{"label":"涓伴晣甯�","value":"150981"}],[{"label":"涔屽叞娴╃壒甯�","value":"152201"},{"label":"闃垮皵灞卞競","value":"152202"},{"label":"绉戝皵娌佸彸缈煎墠鏃�","value":"152221"},{"label":"绉戝皵娌佸彸缈间腑鏃�","value":"152222"},{"label":"鎵庤祲鐗规棗","value":"152223"},{"label":"绐佹硥鍘�","value":"152224"}],[{"label":"浜岃繛娴╃壒甯�","value":"152501"},{"label":"閿℃灄娴╃壒甯�","value":"152502"},{"label":"闃垮反鍢庢棗","value":"152522"},{"label":"鑻忓凹鐗瑰乏鏃�","value":"152523"},{"label":"鑻忓凹鐗瑰彸鏃�","value":"152524"},{"label":"涓滀箤鐝犵﹩娌佹棗","value":"152525"},{"label":"瑗夸箤鐝犵﹩娌佹棗","value":"152526"},{"label":"澶粏瀵烘棗","value":"152527"},{"label":"闀堕粍鏃�","value":"152528"},{"label":"姝i暥鐧芥棗","value":"152529"},{"label":"姝h摑鏃�","value":"152530"},{"label":"澶氫鸡鍘�","value":"152531"},{"label":"涔屾媺鐩栫濮斾細","value":"152571"}],[{"label":"闃挎媺鍠勫乏鏃�","value":"152921"},{"label":"闃挎媺鍠勫彸鏃�","value":"152922"},{"label":"棰濇祹绾虫棗","value":"152923"},{"label":"鍐呰挋鍙ら樋鎷夊杽缁忔祹寮�鍙戝尯","value":"152971"}]],[[{"label":"鍜屽钩鍖�","value":"210102"},{"label":"娌堟渤鍖�","value":"210103"},{"label":"澶т笢鍖�","value":"210104"},{"label":"鐨囧鍖�","value":"210105"},{"label":"閾佽タ鍖�","value":"210106"},{"label":"鑻忓灞尯","value":"210111"},{"label":"娴戝崡鍖�","value":"210112"},{"label":"娌堝寳鏂板尯","value":"210113"},{"label":"浜庢椽鍖�","value":"210114"},{"label":"杈戒腑鍖�","value":"210115"},{"label":"搴峰钩鍘�","value":"210123"},{"label":"娉曞簱鍘�","value":"210124"},{"label":"鏂版皯甯�","value":"210181"}],[{"label":"涓北鍖�","value":"210202"},{"label":"瑗垮矖鍖�","value":"210203"},{"label":"娌欐渤鍙e尯","value":"210204"},{"label":"鐢樹簳瀛愬尯","value":"210211"},{"label":"鏃呴『鍙e尯","value":"210212"},{"label":"閲戝窞鍖�","value":"210213"},{"label":"鏅叞搴楀尯","value":"210214"},{"label":"闀挎捣鍘�","value":"210224"},{"label":"鐡︽埧搴楀競","value":"210281"},{"label":"搴勬渤甯�","value":"210283"}],[{"label":"閾佷笢鍖�","value":"210302"},{"label":"閾佽タ鍖�","value":"210303"},{"label":"绔嬪北鍖�","value":"210304"},{"label":"鍗冨北鍖�","value":"210311"},{"label":"鍙板畨鍘�","value":"210321"},{"label":"宀博婊℃棌鑷不鍘�","value":"210323"},{"label":"娴峰煄甯�","value":"210381"}],[{"label":"鏂版姎鍖�","value":"210402"},{"label":"涓滄床鍖�","value":"210403"},{"label":"鏈涜姳鍖�","value":"210404"},{"label":"椤哄煄鍖�","value":"210411"},{"label":"鎶氶『鍘�","value":"210421"},{"label":"鏂板婊℃棌鑷不鍘�","value":"210422"},{"label":"娓呭師婊℃棌鑷不鍘�","value":"210423"}],[{"label":"骞冲北鍖�","value":"210502"},{"label":"婧箹鍖�","value":"210503"},{"label":"鏄庡北鍖�","value":"210504"},{"label":"鍗楄姮鍖�","value":"210505"},{"label":"鏈邯婊℃棌鑷不鍘�","value":"210521"},{"label":"妗撲粊婊℃棌鑷不鍘�","value":"210522"}],[{"label":"鍏冨疂鍖�","value":"210602"},{"label":"鎸叴鍖�","value":"210603"},{"label":"鎸畨鍖�","value":"210604"},{"label":"瀹界敻婊℃棌鑷不鍘�","value":"210624"},{"label":"涓滄腐甯�","value":"210681"},{"label":"鍑ゅ煄甯�","value":"210682"}],[{"label":"鍙ゅ鍖�","value":"210702"},{"label":"鍑屾渤鍖�","value":"210703"},{"label":"澶拰鍖�","value":"210711"},{"label":"榛戝北鍘�","value":"210726"},{"label":"涔夊幙","value":"210727"},{"label":"鍑屾捣甯�","value":"210781"},{"label":"鍖楅晣甯�","value":"210782"}],[{"label":"绔欏墠鍖�","value":"210802"},{"label":"瑗垮競鍖�","value":"210803"},{"label":"椴呴奔鍦堝尯","value":"210804"},{"label":"鑰佽竟鍖�","value":"210811"},{"label":"鐩栧窞甯�","value":"210881"},{"label":"澶х煶妗ュ競","value":"210882"}],[{"label":"娴峰窞鍖�","value":"210902"},{"label":"鏂伴偙鍖�","value":"210903"},{"label":"澶钩鍖�","value":"210904"},{"label":"娓呮渤闂ㄥ尯","value":"210905"},{"label":"缁嗘渤鍖�","value":"210911"},{"label":"闃滄柊钂欏彜鏃忚嚜娌诲幙","value":"210921"},{"label":"褰版鍘�","value":"210922"}],[{"label":"鐧藉鍖�","value":"211002"},{"label":"鏂囧湥鍖�","value":"211003"},{"label":"瀹忎紵鍖�","value":"211004"},{"label":"寮撻暱宀尯","value":"211005"},{"label":"澶瓙娌冲尯","value":"211011"},{"label":"杈介槼鍘�","value":"211021"},{"label":"鐏甯�","value":"211081"}],[{"label":"鍙屽彴瀛愬尯","value":"211102"},{"label":"鍏撮殕鍙板尯","value":"211103"},{"label":"澶ф醇鍖�","value":"211104"},{"label":"鐩樺北鍘�","value":"211122"}],[{"label":"閾跺窞鍖�","value":"211202"},{"label":"娓呮渤鍖�","value":"211204"},{"label":"閾佸箔鍘�","value":"211221"},{"label":"瑗夸赴鍘�","value":"211223"},{"label":"鏄屽浘鍘�","value":"211224"},{"label":"璋冨叺灞卞競","value":"211281"},{"label":"寮�鍘熷競","value":"211282"}],[{"label":"鍙屽鍖�","value":"211302"},{"label":"榫欏煄鍖�","value":"211303"},{"label":"鏈濋槼鍘�","value":"211321"},{"label":"寤哄钩鍘�","value":"211322"},{"label":"鍠�鍠囨瞾宸︾考钂欏彜鏃忚嚜娌诲幙","value":"211324"},{"label":"鍖楃エ甯�","value":"211381"},{"label":"鍑屾簮甯�","value":"211382"}],[{"label":"杩炲北鍖�","value":"211402"},{"label":"榫欐腐鍖�","value":"211403"},{"label":"鍗楃エ鍖�","value":"211404"},{"label":"缁ヤ腑鍘�","value":"211421"},{"label":"寤烘槍鍘�","value":"211422"},{"label":"鍏村煄甯�","value":"211481"}]],[[{"label":"鍗楀叧鍖�","value":"220102"},{"label":"瀹藉煄鍖�","value":"220103"},{"label":"鏈濋槼鍖�","value":"220104"},{"label":"浜岄亾鍖�","value":"220105"},{"label":"缁垮洯鍖�","value":"220106"},{"label":"鍙岄槼鍖�","value":"220112"},{"label":"涔濆彴鍖�","value":"220113"},{"label":"鍐滃畨鍘�","value":"220122"},{"label":"闀挎槬缁忔祹鎶�鏈紑鍙戝尯","value":"220171"},{"label":"闀挎槬鍑�鏈堥珮鏂版妧鏈骇涓氬紑鍙戝尯","value":"220172"},{"label":"闀挎槬楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"220173"},{"label":"闀挎槬姹借溅缁忔祹鎶�鏈紑鍙戝尯","value":"220174"},{"label":"姒嗘爲甯�","value":"220182"},{"label":"寰锋儬甯�","value":"220183"}],[{"label":"鏄岄倯鍖�","value":"220202"},{"label":"榫欐江鍖�","value":"220203"},{"label":"鑸硅惀鍖�","value":"220204"},{"label":"涓版弧鍖�","value":"220211"},{"label":"姘稿悏鍘�","value":"220221"},{"label":"鍚夋灄缁忔祹寮�鍙戝尯","value":"220271"},{"label":"鍚夋灄楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"220272"},{"label":"鍚夋灄涓浗鏂板姞鍧¢鍝佸尯","value":"220273"},{"label":"铔熸渤甯�","value":"220281"},{"label":"妗︾敻甯�","value":"220282"},{"label":"鑸掑叞甯�","value":"220283"},{"label":"纾愮煶甯�","value":"220284"}],[{"label":"閾佽タ鍖�","value":"220302"},{"label":"閾佷笢鍖�","value":"220303"},{"label":"姊ㄦ爲鍘�","value":"220322"},{"label":"浼婇�氭弧鏃忚嚜娌诲幙","value":"220323"},{"label":"鍏富宀競","value":"220381"},{"label":"鍙岃窘甯�","value":"220382"}],[{"label":"榫欏北鍖�","value":"220402"},{"label":"瑗垮畨鍖�","value":"220403"},{"label":"涓滀赴鍘�","value":"220421"},{"label":"涓滆窘鍘�","value":"220422"}],[{"label":"涓滄槍鍖�","value":"220502"},{"label":"浜岄亾姹熷尯","value":"220503"},{"label":"閫氬寲鍘�","value":"220521"},{"label":"杈夊崡鍘�","value":"220523"},{"label":"鏌虫渤鍘�","value":"220524"},{"label":"姊呮渤鍙e競","value":"220581"},{"label":"闆嗗畨甯�","value":"220582"}],[{"label":"娴戞睙鍖�","value":"220602"},{"label":"姹熸簮鍖�","value":"220605"},{"label":"鎶氭澗鍘�","value":"220621"},{"label":"闈栧畤鍘�","value":"220622"},{"label":"闀跨櫧鏈濋矞鏃忚嚜娌诲幙","value":"220623"},{"label":"涓存睙甯�","value":"220681"}],[{"label":"瀹佹睙鍖�","value":"220702"},{"label":"鍓嶉儹灏旂綏鏂挋鍙ゆ棌鑷不鍘�","value":"220721"},{"label":"闀垮箔鍘�","value":"220722"},{"label":"涔惧畨鍘�","value":"220723"},{"label":"鍚夋灄鏉惧師缁忔祹寮�鍙戝尯","value":"220771"},{"label":"鎵朵綑甯�","value":"220781"}],[{"label":"娲寳鍖�","value":"220802"},{"label":"闀囪祲鍘�","value":"220821"},{"label":"閫氭鍘�","value":"220822"},{"label":"鍚夋灄鐧藉煄缁忔祹寮�鍙戝尯","value":"220871"},{"label":"娲崡甯�","value":"220881"},{"label":"澶у畨甯�","value":"220882"}],[{"label":"寤跺悏甯�","value":"222401"},{"label":"鍥句滑甯�","value":"222402"},{"label":"鏁﹀寲甯�","value":"222403"},{"label":"鐝叉槬甯�","value":"222404"},{"label":"榫欎簳甯�","value":"222405"},{"label":"鍜岄緳甯�","value":"222406"},{"label":"姹竻鍘�","value":"222424"},{"label":"瀹夊浘鍘�","value":"222426"}]],[[{"label":"閬撻噷鍖�","value":"230102"},{"label":"鍗楀矖鍖�","value":"230103"},{"label":"閬撳鍖�","value":"230104"},{"label":"骞虫埧鍖�","value":"230108"},{"label":"鏉惧寳鍖�","value":"230109"},{"label":"棣欏潑鍖�","value":"230110"},{"label":"鍛煎叞鍖�","value":"230111"},{"label":"闃垮煄鍖�","value":"230112"},{"label":"鍙屽煄鍖�","value":"230113"},{"label":"渚濆叞鍘�","value":"230123"},{"label":"鏂规鍘�","value":"230124"},{"label":"瀹惧幙","value":"230125"},{"label":"宸村溅鍘�","value":"230126"},{"label":"鏈ㄥ叞鍘�","value":"230127"},{"label":"閫氭渤鍘�","value":"230128"},{"label":"寤跺鍘�","value":"230129"},{"label":"灏氬織甯�","value":"230183"},{"label":"浜斿父甯�","value":"230184"}],[{"label":"榫欐矙鍖�","value":"230202"},{"label":"寤哄崕鍖�","value":"230203"},{"label":"閾侀攱鍖�","value":"230204"},{"label":"鏄傛槀婧尯","value":"230205"},{"label":"瀵屾媺灏斿熀鍖�","value":"230206"},{"label":"纰惧瓙灞卞尯","value":"230207"},{"label":"姊呴噷鏂揪鏂″皵鏃忓尯","value":"230208"},{"label":"榫欐睙鍘�","value":"230221"},{"label":"渚濆畨鍘�","value":"230223"},{"label":"娉版潵鍘�","value":"230224"},{"label":"鐢樺崡鍘�","value":"230225"},{"label":"瀵岃鍘�","value":"230227"},{"label":"鍏嬪北鍘�","value":"230229"},{"label":"鍏嬩笢鍘�","value":"230230"},{"label":"鎷滄硥鍘�","value":"230231"},{"label":"璁锋渤甯�","value":"230281"}],[{"label":"楦″啝鍖�","value":"230302"},{"label":"鎭掑北鍖�","value":"230303"},{"label":"婊撮亾鍖�","value":"230304"},{"label":"姊ㄦ爲鍖�","value":"230305"},{"label":"鍩庡瓙娌冲尯","value":"230306"},{"label":"楹诲北鍖�","value":"230307"},{"label":"楦′笢鍘�","value":"230321"},{"label":"铏庢灄甯�","value":"230381"},{"label":"瀵嗗北甯�","value":"230382"}],[{"label":"鍚戦槼鍖�","value":"230402"},{"label":"宸ュ啘鍖�","value":"230403"},{"label":"鍗楀北鍖�","value":"230404"},{"label":"鍏村畨鍖�","value":"230405"},{"label":"涓滃北鍖�","value":"230406"},{"label":"鍏村北鍖�","value":"230407"},{"label":"钀濆寳鍘�","value":"230421"},{"label":"缁ユ花鍘�","value":"230422"}],[{"label":"灏栧北鍖�","value":"230502"},{"label":"宀笢鍖�","value":"230503"},{"label":"鍥涙柟鍙板尯","value":"230505"},{"label":"瀹濆北鍖�","value":"230506"},{"label":"闆嗚搐鍘�","value":"230521"},{"label":"鍙嬭皧鍘�","value":"230522"},{"label":"瀹濇竻鍘�","value":"230523"},{"label":"楗舵渤鍘�","value":"230524"}],[{"label":"钀ㄥ皵鍥惧尯","value":"230602"},{"label":"榫欏嚖鍖�","value":"230603"},{"label":"璁╄儭璺尯","value":"230604"},{"label":"绾㈠矖鍖�","value":"230605"},{"label":"澶у悓鍖�","value":"230606"},{"label":"鑲囧窞鍘�","value":"230621"},{"label":"鑲囨簮鍘�","value":"230622"},{"label":"鏋楃敻鍘�","value":"230623"},{"label":"鏉滃皵浼壒钂欏彜鏃忚嚜娌诲幙","value":"230624"},{"label":"澶у簡楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"230671"}],[{"label":"浼婃槬鍖�","value":"230702"},{"label":"鍗楀矓鍖�","value":"230703"},{"label":"鍙嬪ソ鍖�","value":"230704"},{"label":"瑗挎灄鍖�","value":"230705"},{"label":"缈犲肠鍖�","value":"230706"},{"label":"鏂伴潚鍖�","value":"230707"},{"label":"缇庢邯鍖�","value":"230708"},{"label":"閲戝北灞尯","value":"230709"},{"label":"浜旇惀鍖�","value":"230710"},{"label":"涔岄┈娌冲尯","value":"230711"},{"label":"姹ゆ椇娌冲尯","value":"230712"},{"label":"甯﹀箔鍖�","value":"230713"},{"label":"涔屼紛宀尯","value":"230714"},{"label":"绾㈡槦鍖�","value":"230715"},{"label":"涓婄敇宀尯","value":"230716"},{"label":"鍢夎崼鍘�","value":"230722"},{"label":"閾佸姏甯�","value":"230781"}],[{"label":"鍚戦槼鍖�","value":"230803"},{"label":"鍓嶈繘鍖�","value":"230804"},{"label":"涓滈鍖�","value":"230805"},{"label":"閮婂尯","value":"230811"},{"label":"妗﹀崡鍘�","value":"230822"},{"label":"妗﹀窛鍘�","value":"230826"},{"label":"姹ゅ師鍘�","value":"230828"},{"label":"鍚屾睙甯�","value":"230881"},{"label":"瀵岄敠甯�","value":"230882"},{"label":"鎶氳繙甯�","value":"230883"}],[{"label":"鏂板叴鍖�","value":"230902"},{"label":"妗冨北鍖�","value":"230903"},{"label":"鑼勫瓙娌冲尯","value":"230904"},{"label":"鍕冨埄鍘�","value":"230921"}],[{"label":"涓滃畨鍖�","value":"231002"},{"label":"闃虫槑鍖�","value":"231003"},{"label":"鐖辨皯鍖�","value":"231004"},{"label":"瑗垮畨鍖�","value":"231005"},{"label":"鏋楀彛鍘�","value":"231025"},{"label":"鐗′腹姹熺粡娴庢妧鏈紑鍙戝尯","value":"231071"},{"label":"缁ヨ姮娌冲競","value":"231081"},{"label":"娴锋灄甯�","value":"231083"},{"label":"瀹佸畨甯�","value":"231084"},{"label":"绌嗘1甯�","value":"231085"},{"label":"涓滃畞甯�","value":"231086"}],[{"label":"鐖辫緣鍖�","value":"231102"},{"label":"瀚╂睙鍘�","value":"231121"},{"label":"閫婂厠鍘�","value":"231123"},{"label":"瀛欏惔鍘�","value":"231124"},{"label":"鍖楀畨甯�","value":"231181"},{"label":"浜斿ぇ杩炴睜甯�","value":"231182"}],[{"label":"鍖楁灄鍖�","value":"231202"},{"label":"鏈涘鍘�","value":"231221"},{"label":"鍏拌タ鍘�","value":"231222"},{"label":"闈掑唸鍘�","value":"231223"},{"label":"搴嗗畨鍘�","value":"231224"},{"label":"鏄庢按鍘�","value":"231225"},{"label":"缁ユ1鍘�","value":"231226"},{"label":"瀹夎揪甯�","value":"231281"},{"label":"鑲囦笢甯�","value":"231282"},{"label":"娴蜂鸡甯�","value":"231283"}],[{"label":"鍔犳牸杈惧鍖�","value":"232701"},{"label":"鏉惧箔鍖�","value":"232702"},{"label":"鏂版灄鍖�","value":"232703"},{"label":"鍛间腑鍖�","value":"232704"},{"label":"鍛肩帥鍘�","value":"232721"},{"label":"濉旀渤鍘�","value":"232722"},{"label":"婕犳渤鍘�","value":"232723"}]],[[{"label":"榛勬郸鍖�","value":"310101"},{"label":"寰愭眹鍖�","value":"310104"},{"label":"闀垮畞鍖�","value":"310105"},{"label":"闈欏畨鍖�","value":"310106"},{"label":"鏅檧鍖�","value":"310107"},{"label":"铏瑰彛鍖�","value":"310109"},{"label":"鏉ㄦ郸鍖�","value":"310110"},{"label":"闂佃鍖�","value":"310112"},{"label":"瀹濆北鍖�","value":"310113"},{"label":"鍢夊畾鍖�","value":"310114"},{"label":"娴︿笢鏂板尯","value":"310115"},{"label":"閲戝北鍖�","value":"310116"},{"label":"鏉炬睙鍖�","value":"310117"},{"label":"闈掓郸鍖�","value":"310118"},{"label":"濂夎搐鍖�","value":"310120"},{"label":"宕囨槑鍖�","value":"310151"}]],[[{"label":"鐜勬鍖�","value":"320102"},{"label":"绉︽樊鍖�","value":"320104"},{"label":"寤洪偤鍖�","value":"320105"},{"label":"榧撴ゼ鍖�","value":"320106"},{"label":"娴﹀彛鍖�","value":"320111"},{"label":"鏍栭湠鍖�","value":"320113"},{"label":"闆ㄨ姳鍙板尯","value":"320114"},{"label":"姹熷畞鍖�","value":"320115"},{"label":"鍏悎鍖�","value":"320116"},{"label":"婧ф按鍖�","value":"320117"},{"label":"楂樻烦鍖�","value":"320118"}],[{"label":"閿″北鍖�","value":"320205"},{"label":"鎯犲北鍖�","value":"320206"},{"label":"婊ㄦ箹鍖�","value":"320211"},{"label":"姊佹邯鍖�","value":"320213"},{"label":"鏂板惔鍖�","value":"320214"},{"label":"姹熼槾甯�","value":"320281"},{"label":"瀹滃叴甯�","value":"320282"}],[{"label":"榧撴ゼ鍖�","value":"320302"},{"label":"浜戦緳鍖�","value":"320303"},{"label":"璐炬豹鍖�","value":"320305"},{"label":"娉夊北鍖�","value":"320311"},{"label":"閾滃北鍖�","value":"320312"},{"label":"涓板幙","value":"320321"},{"label":"娌涘幙","value":"320322"},{"label":"鐫㈠畞鍘�","value":"320324"},{"label":"寰愬窞缁忔祹鎶�鏈紑鍙戝尯","value":"320371"},{"label":"鏂版矀甯�","value":"320381"},{"label":"閭冲窞甯�","value":"320382"}],[{"label":"澶╁畞鍖�","value":"320402"},{"label":"閽熸ゼ鍖�","value":"320404"},{"label":"鏂板寳鍖�","value":"320411"},{"label":"姝﹁繘鍖�","value":"320412"},{"label":"閲戝潧鍖�","value":"320413"},{"label":"婧ч槼甯�","value":"320481"}],[{"label":"铏庝笜鍖�","value":"320505"},{"label":"鍚翠腑鍖�","value":"320506"},{"label":"鐩稿煄鍖�","value":"320507"},{"label":"濮戣嫃鍖�","value":"320508"},{"label":"鍚存睙鍖�","value":"320509"},{"label":"鑻忓窞宸ヤ笟鍥尯","value":"320571"},{"label":"甯哥啛甯�","value":"320581"},{"label":"寮犲娓競","value":"320582"},{"label":"鏄嗗北甯�","value":"320583"},{"label":"澶粨甯�","value":"320585"}],[{"label":"宕囧窛鍖�","value":"320602"},{"label":"娓椄鍖�","value":"320611"},{"label":"閫氬窞鍖�","value":"320612"},{"label":"娴峰畨鍘�","value":"320621"},{"label":"濡備笢鍘�","value":"320623"},{"label":"鍗楅�氱粡娴庢妧鏈紑鍙戝尯","value":"320671"},{"label":"鍚笢甯�","value":"320681"},{"label":"濡傜殝甯�","value":"320682"},{"label":"娴烽棬甯�","value":"320684"}],[{"label":"杩炰簯鍖�","value":"320703"},{"label":"娴峰窞鍖�","value":"320706"},{"label":"璧f鍖�","value":"320707"},{"label":"涓滄捣鍘�","value":"320722"},{"label":"鐏屼簯鍘�","value":"320723"},{"label":"鐏屽崡鍘�","value":"320724"},{"label":"杩炰簯娓粡娴庢妧鏈紑鍙戝尯","value":"320771"},{"label":"杩炰簯娓珮鏂版妧鏈骇涓氬紑鍙戝尯","value":"320772"}],[{"label":"娣畨鍖�","value":"320803"},{"label":"娣槾鍖�","value":"320804"},{"label":"娓呮睙娴﹀尯","value":"320812"},{"label":"娲辰鍖�","value":"320813"},{"label":"娑熸按鍘�","value":"320826"},{"label":"鐩辩湙鍘�","value":"320830"},{"label":"閲戞箹鍘�","value":"320831"},{"label":"娣畨缁忔祹鎶�鏈紑鍙戝尯","value":"320871"}],[{"label":"浜箹鍖�","value":"320902"},{"label":"鐩愰兘鍖�","value":"320903"},{"label":"澶т赴鍖�","value":"320904"},{"label":"鍝嶆按鍘�","value":"320921"},{"label":"婊ㄦ捣鍘�","value":"320922"},{"label":"闃滃畞鍘�","value":"320923"},{"label":"灏勯槼鍘�","value":"320924"},{"label":"寤烘箹鍘�","value":"320925"},{"label":"鐩愬煄缁忔祹鎶�鏈紑鍙戝尯","value":"320971"},{"label":"涓滃彴甯�","value":"320981"}],[{"label":"骞块櫟鍖�","value":"321002"},{"label":"閭楁睙鍖�","value":"321003"},{"label":"姹熼兘鍖�","value":"321012"},{"label":"瀹濆簲鍘�","value":"321023"},{"label":"鎵窞缁忔祹鎶�鏈紑鍙戝尯","value":"321071"},{"label":"浠緛甯�","value":"321081"},{"label":"楂橀偖甯�","value":"321084"}],[{"label":"浜彛鍖�","value":"321102"},{"label":"娑﹀窞鍖�","value":"321111"},{"label":"涓瑰緬鍖�","value":"321112"},{"label":"闀囨睙鏂板尯","value":"321171"},{"label":"涓归槼甯�","value":"321181"},{"label":"鎵腑甯�","value":"321182"},{"label":"鍙ュ甯�","value":"321183"}],[{"label":"娴烽櫟鍖�","value":"321202"},{"label":"楂樻腐鍖�","value":"321203"},{"label":"濮滃牥鍖�","value":"321204"},{"label":"娉板窞鍖昏嵂楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"321271"},{"label":"鍏村寲甯�","value":"321281"},{"label":"闈栨睙甯�","value":"321282"},{"label":"娉板叴甯�","value":"321283"}],[{"label":"瀹垮煄鍖�","value":"321302"},{"label":"瀹胯鲍鍖�","value":"321311"},{"label":"娌槼鍘�","value":"321322"},{"label":"娉楅槼鍘�","value":"321323"},{"label":"娉楁椽鍘�","value":"321324"},{"label":"瀹胯縼缁忔祹鎶�鏈紑鍙戝尯","value":"321371"}]],[[{"label":"涓婂煄鍖�","value":"330102"},{"label":"涓嬪煄鍖�","value":"330103"},{"label":"姹熷共鍖�","value":"330104"},{"label":"鎷卞鍖�","value":"330105"},{"label":"瑗挎箹鍖�","value":"330106"},{"label":"婊ㄦ睙鍖�","value":"330108"},{"label":"钀у北鍖�","value":"330109"},{"label":"浣欐澀鍖�","value":"330110"},{"label":"瀵岄槼鍖�","value":"330111"},{"label":"涓村畨鍖�","value":"330112"},{"label":"妗愬簮鍘�","value":"330122"},{"label":"娣冲畨鍘�","value":"330127"},{"label":"寤哄痉甯�","value":"330182"}],[{"label":"娴锋洐鍖�","value":"330203"},{"label":"姹熷寳鍖�","value":"330205"},{"label":"鍖椾粦鍖�","value":"330206"},{"label":"闀囨捣鍖�","value":"330211"},{"label":"閯炲窞鍖�","value":"330212"},{"label":"濂夊寲鍖�","value":"330213"},{"label":"璞″北鍘�","value":"330225"},{"label":"瀹佹捣鍘�","value":"330226"},{"label":"浣欏甯�","value":"330281"},{"label":"鎱堟邯甯�","value":"330282"}],[{"label":"楣垮煄鍖�","value":"330302"},{"label":"榫欐咕鍖�","value":"330303"},{"label":"鐡捣鍖�","value":"330304"},{"label":"娲炲ご鍖�","value":"330305"},{"label":"姘稿槈鍘�","value":"330324"},{"label":"骞抽槼鍘�","value":"330326"},{"label":"鑻嶅崡鍘�","value":"330327"},{"label":"鏂囨垚鍘�","value":"330328"},{"label":"娉伴『鍘�","value":"330329"},{"label":"娓╁窞缁忔祹鎶�鏈紑鍙戝尯","value":"330371"},{"label":"鐟炲畨甯�","value":"330381"},{"label":"涔愭竻甯�","value":"330382"}],[{"label":"鍗楁箹鍖�","value":"330402"},{"label":"绉�娲插尯","value":"330411"},{"label":"鍢夊杽鍘�","value":"330421"},{"label":"娴风洂鍘�","value":"330424"},{"label":"娴峰畞甯�","value":"330481"},{"label":"骞虫箹甯�","value":"330482"},{"label":"妗愪埂甯�","value":"330483"}],[{"label":"鍚村叴鍖�","value":"330502"},{"label":"鍗楁禂鍖�","value":"330503"},{"label":"寰锋竻鍘�","value":"330521"},{"label":"闀垮叴鍘�","value":"330522"},{"label":"瀹夊悏鍘�","value":"330523"}],[{"label":"瓒婂煄鍖�","value":"330602"},{"label":"鏌ˉ鍖�","value":"330603"},{"label":"涓婅櫈鍖�","value":"330604"},{"label":"鏂版槍鍘�","value":"330624"},{"label":"璇告毃甯�","value":"330681"},{"label":"宓婂窞甯�","value":"330683"}],[{"label":"濠哄煄鍖�","value":"330702"},{"label":"閲戜笢鍖�","value":"330703"},{"label":"姝︿箟鍘�","value":"330723"},{"label":"娴︽睙鍘�","value":"330726"},{"label":"纾愬畨鍘�","value":"330727"},{"label":"鍏版邯甯�","value":"330781"},{"label":"涔変箤甯�","value":"330782"},{"label":"涓滈槼甯�","value":"330783"},{"label":"姘稿悍甯�","value":"330784"}],[{"label":"鏌煄鍖�","value":"330802"},{"label":"琛㈡睙鍖�","value":"330803"},{"label":"甯稿北鍘�","value":"330822"},{"label":"寮�鍖栧幙","value":"330824"},{"label":"榫欐父鍘�","value":"330825"},{"label":"姹熷北甯�","value":"330881"}],[{"label":"瀹氭捣鍖�","value":"330902"},{"label":"鏅檧鍖�","value":"330903"},{"label":"宀卞北鍘�","value":"330921"},{"label":"宓婃硹鍘�","value":"330922"}],[{"label":"妞掓睙鍖�","value":"331002"},{"label":"榛勫博鍖�","value":"331003"},{"label":"璺ˉ鍖�","value":"331004"},{"label":"涓夐棬鍘�","value":"331022"},{"label":"澶╁彴鍘�","value":"331023"},{"label":"浠欏眳鍘�","value":"331024"},{"label":"娓╁箔甯�","value":"331081"},{"label":"涓存捣甯�","value":"331082"},{"label":"鐜夌幆甯�","value":"331083"}],[{"label":"鑾查兘鍖�","value":"331102"},{"label":"闈掔敯鍘�","value":"331121"},{"label":"缂欎簯鍘�","value":"331122"},{"label":"閬傛槍鍘�","value":"331123"},{"label":"鏉鹃槼鍘�","value":"331124"},{"label":"浜戝拰鍘�","value":"331125"},{"label":"搴嗗厓鍘�","value":"331126"},{"label":"鏅畞鐣叉棌鑷不鍘�","value":"331127"},{"label":"榫欐硥甯�","value":"331181"}]],[[{"label":"鐟舵捣鍖�","value":"340102"},{"label":"搴愰槼鍖�","value":"340103"},{"label":"铚�灞卞尯","value":"340104"},{"label":"鍖呮渤鍖�","value":"340111"},{"label":"闀夸赴鍘�","value":"340121"},{"label":"鑲ヤ笢鍘�","value":"340122"},{"label":"鑲ヨタ鍘�","value":"340123"},{"label":"搴愭睙鍘�","value":"340124"},{"label":"鍚堣偉楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"340171"},{"label":"鍚堣偉缁忔祹鎶�鏈紑鍙戝尯","value":"340172"},{"label":"鍚堣偉鏂扮珯楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"340173"},{"label":"宸㈡箹甯�","value":"340181"}],[{"label":"闀滄箹鍖�","value":"340202"},{"label":"寮嬫睙鍖�","value":"340203"},{"label":"楦犳睙鍖�","value":"340207"},{"label":"涓夊北鍖�","value":"340208"},{"label":"鑺滄箹鍘�","value":"340221"},{"label":"绻佹槍鍘�","value":"340222"},{"label":"鍗楅櫟鍘�","value":"340223"},{"label":"鏃犱负鍘�","value":"340225"},{"label":"鑺滄箹缁忔祹鎶�鏈紑鍙戝尯","value":"340271"},{"label":"瀹夊窘鑺滄箹闀挎睙澶фˉ缁忔祹寮�鍙戝尯","value":"340272"}],[{"label":"榫欏瓙婀栧尯","value":"340302"},{"label":"铓屽北鍖�","value":"340303"},{"label":"绂逛細鍖�","value":"340304"},{"label":"娣笂鍖�","value":"340311"},{"label":"鎬�杩滃幙","value":"340321"},{"label":"浜旀渤鍘�","value":"340322"},{"label":"鍥洪晣鍘�","value":"340323"},{"label":"铓屽煚甯傞珮鏂版妧鏈紑鍙戝尯","value":"340371"},{"label":"铓屽煚甯傜粡娴庡紑鍙戝尯","value":"340372"}],[{"label":"澶ч�氬尯","value":"340402"},{"label":"鐢板搴靛尯","value":"340403"},{"label":"璋㈠闆嗗尯","value":"340404"},{"label":"鍏叕灞卞尯","value":"340405"},{"label":"娼橀泦鍖�","value":"340406"},{"label":"鍑ゅ彴鍘�","value":"340421"},{"label":"瀵垮幙","value":"340422"}],[{"label":"鑺卞北鍖�","value":"340503"},{"label":"闆ㄥ北鍖�","value":"340504"},{"label":"鍗氭湜鍖�","value":"340506"},{"label":"褰撴秱鍘�","value":"340521"},{"label":"鍚北鍘�","value":"340522"},{"label":"鍜屽幙","value":"340523"}],[{"label":"鏉滈泦鍖�","value":"340602"},{"label":"鐩稿北鍖�","value":"340603"},{"label":"鐑堝北鍖�","value":"340604"},{"label":"婵夋邯鍘�","value":"340621"}],[{"label":"閾滃畼鍖�","value":"340705"},{"label":"涔夊畨鍖�","value":"340706"},{"label":"閮婂尯","value":"340711"},{"label":"鏋為槼鍘�","value":"340722"}],[{"label":"杩庢睙鍖�","value":"340802"},{"label":"澶ц鍖�","value":"340803"},{"label":"瀹滅鍖�","value":"340811"},{"label":"鎬�瀹佸幙","value":"340822"},{"label":"娼滃北鍘�","value":"340824"},{"label":"澶箹鍘�","value":"340825"},{"label":"瀹挎澗鍘�","value":"340826"},{"label":"鏈涙睙鍘�","value":"340827"},{"label":"宀宠タ鍘�","value":"340828"},{"label":"瀹夊窘瀹夊簡缁忔祹寮�鍙戝尯","value":"340871"},{"label":"妗愬煄甯�","value":"340881"}],[{"label":"灞邯鍖�","value":"341002"},{"label":"榛勫北鍖�","value":"341003"},{"label":"寰藉窞鍖�","value":"341004"},{"label":"姝欏幙","value":"341021"},{"label":"浼戝畞鍘�","value":"341022"},{"label":"榛熷幙","value":"341023"},{"label":"绁侀棬鍘�","value":"341024"}],[{"label":"鐞呯悐鍖�","value":"341102"},{"label":"鍗楄隘鍖�","value":"341103"},{"label":"鏉ュ畨鍘�","value":"341122"},{"label":"鍏ㄦ鍘�","value":"341124"},{"label":"瀹氳繙鍘�","value":"341125"},{"label":"鍑ら槼鍘�","value":"341126"},{"label":"鑻忔粊鐜颁唬浜т笟鍥�","value":"341171"},{"label":"婊佸窞缁忔祹鎶�鏈紑鍙戝尯","value":"341172"},{"label":"澶╅暱甯�","value":"341181"},{"label":"鏄庡厜甯�","value":"341182"}],[{"label":"棰嶅窞鍖�","value":"341202"},{"label":"棰嶄笢鍖�","value":"341203"},{"label":"棰嶆硥鍖�","value":"341204"},{"label":"涓存硥鍘�","value":"341221"},{"label":"澶拰鍘�","value":"341222"},{"label":"闃滃崡鍘�","value":"341225"},{"label":"棰嶄笂鍘�","value":"341226"},{"label":"闃滈槼鍚堣偉鐜颁唬浜т笟鍥尯","value":"341271"},{"label":"闃滈槼缁忔祹鎶�鏈紑鍙戝尯","value":"341272"},{"label":"鐣岄甯�","value":"341282"}],[{"label":"鍩囨ˉ鍖�","value":"341302"},{"label":"鐮�灞卞幙","value":"341321"},{"label":"钀у幙","value":"341322"},{"label":"鐏电挧鍘�","value":"341323"},{"label":"娉楀幙","value":"341324"},{"label":"瀹垮窞椹瀺灞辩幇浠d骇涓氬洯鍖�","value":"341371"},{"label":"瀹垮窞缁忔祹鎶�鏈紑鍙戝尯","value":"341372"}],[{"label":"閲戝畨鍖�","value":"341502"},{"label":"瑁曞畨鍖�","value":"341503"},{"label":"鍙堕泦鍖�","value":"341504"},{"label":"闇嶉偙鍘�","value":"341522"},{"label":"鑸掑煄鍘�","value":"341523"},{"label":"閲戝鍘�","value":"341524"},{"label":"闇嶅北鍘�","value":"341525"}],[{"label":"璋煄鍖�","value":"341602"},{"label":"娑¢槼鍘�","value":"341621"},{"label":"钂欏煄鍘�","value":"341622"},{"label":"鍒╄緵鍘�","value":"341623"}],[{"label":"璐垫睜鍖�","value":"341702"},{"label":"涓滆嚦鍘�","value":"341721"},{"label":"鐭冲彴鍘�","value":"341722"},{"label":"闈掗槼鍘�","value":"341723"}],[{"label":"瀹e窞鍖�","value":"341802"},{"label":"閮庢邯鍘�","value":"341821"},{"label":"骞垮痉鍘�","value":"341822"},{"label":"娉惧幙","value":"341823"},{"label":"缁╂邯鍘�","value":"341824"},{"label":"鏃屽痉鍘�","value":"341825"},{"label":"瀹e煄甯傜粡娴庡紑鍙戝尯","value":"341871"},{"label":"瀹佸浗甯�","value":"341881"}]],[[{"label":"榧撴ゼ鍖�","value":"350102"},{"label":"鍙版睙鍖�","value":"350103"},{"label":"浠撳北鍖�","value":"350104"},{"label":"椹熬鍖�","value":"350105"},{"label":"鏅嬪畨鍖�","value":"350111"},{"label":"闂戒警鍘�","value":"350121"},{"label":"杩炴睙鍘�","value":"350122"},{"label":"缃楁簮鍘�","value":"350123"},{"label":"闂芥竻鍘�","value":"350124"},{"label":"姘告嘲鍘�","value":"350125"},{"label":"骞虫江鍘�","value":"350128"},{"label":"绂忔竻甯�","value":"350181"},{"label":"闀夸箰甯�","value":"350182"}],[{"label":"鎬濇槑鍖�","value":"350203"},{"label":"娴锋钵鍖�","value":"350205"},{"label":"婀栭噷鍖�","value":"350206"},{"label":"闆嗙編鍖�","value":"350211"},{"label":"鍚屽畨鍖�","value":"350212"},{"label":"缈斿畨鍖�","value":"350213"}],[{"label":"鍩庡帰鍖�","value":"350302"},{"label":"娑垫睙鍖�","value":"350303"},{"label":"鑽斿煄鍖�","value":"350304"},{"label":"绉�灞垮尯","value":"350305"},{"label":"浠欐父鍘�","value":"350322"}],[{"label":"姊呭垪鍖�","value":"350402"},{"label":"涓夊厓鍖�","value":"350403"},{"label":"鏄庢邯鍘�","value":"350421"},{"label":"娓呮祦鍘�","value":"350423"},{"label":"瀹佸寲鍘�","value":"350424"},{"label":"澶х敯鍘�","value":"350425"},{"label":"灏ゆ邯鍘�","value":"350426"},{"label":"娌欏幙","value":"350427"},{"label":"灏嗕箰鍘�","value":"350428"},{"label":"娉板畞鍘�","value":"350429"},{"label":"寤哄畞鍘�","value":"350430"},{"label":"姘稿畨甯�","value":"350481"}],[{"label":"椴ゅ煄鍖�","value":"350502"},{"label":"涓版辰鍖�","value":"350503"},{"label":"娲涙睙鍖�","value":"350504"},{"label":"娉夋腐鍖�","value":"350505"},{"label":"鎯犲畨鍘�","value":"350521"},{"label":"瀹夋邯鍘�","value":"350524"},{"label":"姘告槬鍘�","value":"350525"},{"label":"寰峰寲鍘�","value":"350526"},{"label":"閲戦棬鍘�","value":"350527"},{"label":"鐭崇嫯甯�","value":"350581"},{"label":"鏅嬫睙甯�","value":"350582"},{"label":"鍗楀畨甯�","value":"350583"}],[{"label":"鑺楀煄鍖�","value":"350602"},{"label":"榫欐枃鍖�","value":"350603"},{"label":"浜戦渼鍘�","value":"350622"},{"label":"婕虫郸鍘�","value":"350623"},{"label":"璇忓畨鍘�","value":"350624"},{"label":"闀挎嘲鍘�","value":"350625"},{"label":"涓滃北鍘�","value":"350626"},{"label":"鍗楅潠鍘�","value":"350627"},{"label":"骞冲拰鍘�","value":"350628"},{"label":"鍗庡畨鍘�","value":"350629"},{"label":"榫欐捣甯�","value":"350681"}],[{"label":"寤跺钩鍖�","value":"350702"},{"label":"寤洪槼鍖�","value":"350703"},{"label":"椤烘槍鍘�","value":"350721"},{"label":"娴﹀煄鍘�","value":"350722"},{"label":"鍏夋辰鍘�","value":"350723"},{"label":"鏉炬邯鍘�","value":"350724"},{"label":"鏀垮拰鍘�","value":"350725"},{"label":"閭垫甯�","value":"350781"},{"label":"姝﹀し灞卞競","value":"350782"},{"label":"寤虹摨甯�","value":"350783"}],[{"label":"鏂扮綏鍖�","value":"350802"},{"label":"姘稿畾鍖�","value":"350803"},{"label":"闀挎眬鍘�","value":"350821"},{"label":"涓婃澀鍘�","value":"350823"},{"label":"姝﹀钩鍘�","value":"350824"},{"label":"杩炲煄鍘�","value":"350825"},{"label":"婕冲钩甯�","value":"350881"}],[{"label":"钑夊煄鍖�","value":"350902"},{"label":"闇炴郸鍘�","value":"350921"},{"label":"鍙ょ敯鍘�","value":"350922"},{"label":"灞忓崡鍘�","value":"350923"},{"label":"瀵垮畞鍘�","value":"350924"},{"label":"鍛ㄥ畞鍘�","value":"350925"},{"label":"鏌樿崳鍘�","value":"350926"},{"label":"绂忓畨甯�","value":"350981"},{"label":"绂忛紟甯�","value":"350982"}]],[[{"label":"涓滄箹鍖�","value":"360102"},{"label":"瑗挎箹鍖�","value":"360103"},{"label":"闈掍簯璋卞尯","value":"360104"},{"label":"婀鹃噷鍖�","value":"360105"},{"label":"闈掑北婀栧尯","value":"360111"},{"label":"鏂板缓鍖�","value":"360112"},{"label":"鍗楁槍鍘�","value":"360121"},{"label":"瀹変箟鍘�","value":"360123"},{"label":"杩涜搐鍘�","value":"360124"}],[{"label":"鏄屾睙鍖�","value":"360202"},{"label":"鐝犲北鍖�","value":"360203"},{"label":"娴鍘�","value":"360222"},{"label":"涔愬钩甯�","value":"360281"}],[{"label":"瀹夋簮鍖�","value":"360302"},{"label":"婀樹笢鍖�","value":"360313"},{"label":"鑾茶姳鍘�","value":"360321"},{"label":"涓婃牀鍘�","value":"360322"},{"label":"鑺︽邯鍘�","value":"360323"}],[{"label":"婵傛邯鍖�","value":"360402"},{"label":"娴旈槼鍖�","value":"360403"},{"label":"鏌存鍖�","value":"360404"},{"label":"姝﹀畞鍘�","value":"360423"},{"label":"淇按鍘�","value":"360424"},{"label":"姘镐慨鍘�","value":"360425"},{"label":"寰峰畨鍘�","value":"360426"},{"label":"閮芥槍鍘�","value":"360428"},{"label":"婀栧彛鍘�","value":"360429"},{"label":"褰辰鍘�","value":"360430"},{"label":"鐟炴槍甯�","value":"360481"},{"label":"鍏遍潚鍩庡競","value":"360482"},{"label":"搴愬北甯�","value":"360483"}],[{"label":"娓濇按鍖�","value":"360502"},{"label":"鍒嗗疁鍘�","value":"360521"}],[{"label":"鏈堟箹鍖�","value":"360602"},{"label":"浣欐睙鍘�","value":"360622"},{"label":"璐垫邯甯�","value":"360681"}],[{"label":"绔犺础鍖�","value":"360702"},{"label":"鍗楀悍鍖�","value":"360703"},{"label":"璧e幙鍖�","value":"360704"},{"label":"淇′赴鍘�","value":"360722"},{"label":"澶т綑鍘�","value":"360723"},{"label":"涓婄姽鍘�","value":"360724"},{"label":"宕囦箟鍘�","value":"360725"},{"label":"瀹夎繙鍘�","value":"360726"},{"label":"榫欏崡鍘�","value":"360727"},{"label":"瀹氬崡鍘�","value":"360728"},{"label":"鍏ㄥ崡鍘�","value":"360729"},{"label":"瀹侀兘鍘�","value":"360730"},{"label":"浜庨兘鍘�","value":"360731"},{"label":"鍏村浗鍘�","value":"360732"},{"label":"浼氭槍鍘�","value":"360733"},{"label":"瀵讳箤鍘�","value":"360734"},{"label":"鐭冲煄鍘�","value":"360735"},{"label":"鐟為噾甯�","value":"360781"}],[{"label":"鍚夊窞鍖�","value":"360802"},{"label":"闈掑師鍖�","value":"360803"},{"label":"鍚夊畨鍘�","value":"360821"},{"label":"鍚夋按鍘�","value":"360822"},{"label":"宄℃睙鍘�","value":"360823"},{"label":"鏂板共鍘�","value":"360824"},{"label":"姘镐赴鍘�","value":"360825"},{"label":"娉板拰鍘�","value":"360826"},{"label":"閬傚窛鍘�","value":"360827"},{"label":"涓囧畨鍘�","value":"360828"},{"label":"瀹夌鍘�","value":"360829"},{"label":"姘告柊鍘�","value":"360830"},{"label":"浜曞唸灞卞競","value":"360881"}],[{"label":"琚佸窞鍖�","value":"360902"},{"label":"濂夋柊鍘�","value":"360921"},{"label":"涓囪浇鍘�","value":"360922"},{"label":"涓婇珮鍘�","value":"360923"},{"label":"瀹滀赴鍘�","value":"360924"},{"label":"闈栧畨鍘�","value":"360925"},{"label":"閾滈紦鍘�","value":"360926"},{"label":"涓板煄甯�","value":"360981"},{"label":"妯熸爲甯�","value":"360982"},{"label":"楂樺畨甯�","value":"360983"}],[{"label":"涓村窛鍖�","value":"361002"},{"label":"涓滀埂鍖�","value":"361003"},{"label":"鍗楀煄鍘�","value":"361021"},{"label":"榛庡窛鍘�","value":"361022"},{"label":"鍗椾赴鍘�","value":"361023"},{"label":"宕囦粊鍘�","value":"361024"},{"label":"涔愬畨鍘�","value":"361025"},{"label":"瀹滈粍鍘�","value":"361026"},{"label":"閲戞邯鍘�","value":"361027"},{"label":"璧勬邯鍘�","value":"361028"},{"label":"骞挎槍鍘�","value":"361030"}],[{"label":"淇″窞鍖�","value":"361102"},{"label":"骞夸赴鍖�","value":"361103"},{"label":"涓婇ザ鍘�","value":"361121"},{"label":"鐜夊北鍘�","value":"361123"},{"label":"閾呭北鍘�","value":"361124"},{"label":"妯嘲鍘�","value":"361125"},{"label":"寮嬮槼鍘�","value":"361126"},{"label":"浣欏共鍘�","value":"361127"},{"label":"閯遍槼鍘�","value":"361128"},{"label":"涓囧勾鍘�","value":"361129"},{"label":"濠烘簮鍘�","value":"361130"},{"label":"寰峰叴甯�","value":"361181"}]],[[{"label":"鍘嗕笅鍖�","value":"370102"},{"label":"甯備腑鍖�","value":"370103"},{"label":"妲愯崼鍖�","value":"370104"},{"label":"澶╂ˉ鍖�","value":"370105"},{"label":"鍘嗗煄鍖�","value":"370112"},{"label":"闀挎竻鍖�","value":"370113"},{"label":"绔犱笜鍖�","value":"370114"},{"label":"骞抽槾鍘�","value":"370124"},{"label":"娴庨槼鍘�","value":"370125"},{"label":"鍟嗘渤鍘�","value":"370126"},{"label":"娴庡崡楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"370171"}],[{"label":"甯傚崡鍖�","value":"370202"},{"label":"甯傚寳鍖�","value":"370203"},{"label":"榛勫矝鍖�","value":"370211"},{"label":"宕傚北鍖�","value":"370212"},{"label":"鏉庢钵鍖�","value":"370213"},{"label":"鍩庨槼鍖�","value":"370214"},{"label":"鍗冲ⅷ鍖�","value":"370215"},{"label":"闈掑矝楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"370271"},{"label":"鑳跺窞甯�","value":"370281"},{"label":"骞冲害甯�","value":"370283"},{"label":"鑾辫タ甯�","value":"370285"}],[{"label":"娣勫窛鍖�","value":"370302"},{"label":"寮犲簵鍖�","value":"370303"},{"label":"鍗氬北鍖�","value":"370304"},{"label":"涓存穭鍖�","value":"370305"},{"label":"鍛ㄦ潙鍖�","value":"370306"},{"label":"妗撳彴鍘�","value":"370321"},{"label":"楂橀潚鍘�","value":"370322"},{"label":"娌傛簮鍘�","value":"370323"}],[{"label":"甯備腑鍖�","value":"370402"},{"label":"钖涘煄鍖�","value":"370403"},{"label":"宄勫煄鍖�","value":"370404"},{"label":"鍙板効搴勫尯","value":"370405"},{"label":"灞变涵鍖�","value":"370406"},{"label":"婊曞窞甯�","value":"370481"}],[{"label":"涓滆惀鍖�","value":"370502"},{"label":"娌冲彛鍖�","value":"370503"},{"label":"鍨﹀埄鍖�","value":"370505"},{"label":"鍒╂触鍘�","value":"370522"},{"label":"骞块ザ鍘�","value":"370523"},{"label":"涓滆惀缁忔祹鎶�鏈紑鍙戝尯","value":"370571"},{"label":"涓滆惀娓粡娴庡紑鍙戝尯","value":"370572"}],[{"label":"鑺濈綐鍖�","value":"370602"},{"label":"绂忓北鍖�","value":"370611"},{"label":"鐗熷钩鍖�","value":"370612"},{"label":"鑾卞北鍖�","value":"370613"},{"label":"闀垮矝鍘�","value":"370634"},{"label":"鐑熷彴楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"370671"},{"label":"鐑熷彴缁忔祹鎶�鏈紑鍙戝尯","value":"370672"},{"label":"榫欏彛甯�","value":"370681"},{"label":"鑾遍槼甯�","value":"370682"},{"label":"鑾卞窞甯�","value":"370683"},{"label":"钃幈甯�","value":"370684"},{"label":"鎷涜繙甯�","value":"370685"},{"label":"鏍栭湠甯�","value":"370686"},{"label":"娴烽槼甯�","value":"370687"}],[{"label":"娼嶅煄鍖�","value":"370702"},{"label":"瀵掍涵鍖�","value":"370703"},{"label":"鍧婂瓙鍖�","value":"370704"},{"label":"濂庢枃鍖�","value":"370705"},{"label":"涓存湊鍘�","value":"370724"},{"label":"鏄屼箰鍘�","value":"370725"},{"label":"娼嶅潑婊ㄦ捣缁忔祹鎶�鏈紑鍙戝尯","value":"370772"},{"label":"闈掑窞甯�","value":"370781"},{"label":"璇稿煄甯�","value":"370782"},{"label":"瀵垮厜甯�","value":"370783"},{"label":"瀹変笜甯�","value":"370784"},{"label":"楂樺瘑甯�","value":"370785"},{"label":"鏄岄倯甯�","value":"370786"}],[{"label":"浠诲煄鍖�","value":"370811"},{"label":"鍏栧窞鍖�","value":"370812"},{"label":"寰北鍘�","value":"370826"},{"label":"楸煎彴鍘�","value":"370827"},{"label":"閲戜埂鍘�","value":"370828"},{"label":"鍢夌ゥ鍘�","value":"370829"},{"label":"姹朵笂鍘�","value":"370830"},{"label":"娉楁按鍘�","value":"370831"},{"label":"姊佸北鍘�","value":"370832"},{"label":"娴庡畞楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"370871"},{"label":"鏇查槣甯�","value":"370881"},{"label":"閭瑰煄甯�","value":"370883"}],[{"label":"娉板北鍖�","value":"370902"},{"label":"宀卞渤鍖�","value":"370911"},{"label":"瀹侀槼鍘�","value":"370921"},{"label":"涓滃钩鍘�","value":"370923"},{"label":"鏂版嘲甯�","value":"370982"},{"label":"鑲ュ煄甯�","value":"370983"}],[{"label":"鐜繝鍖�","value":"371002"},{"label":"鏂囩櫥鍖�","value":"371003"},{"label":"濞佹捣鐏偓楂樻妧鏈骇涓氬紑鍙戝尯","value":"371071"},{"label":"濞佹捣缁忔祹鎶�鏈紑鍙戝尯","value":"371072"},{"label":"濞佹捣涓存腐缁忔祹鎶�鏈紑鍙戝尯","value":"371073"},{"label":"鑽f垚甯�","value":"371082"},{"label":"涔冲北甯�","value":"371083"}],[{"label":"涓滄腐鍖�","value":"371102"},{"label":"宀氬北鍖�","value":"371103"},{"label":"浜旇幉鍘�","value":"371121"},{"label":"鑾掑幙","value":"371122"},{"label":"鏃ョ収缁忔祹鎶�鏈紑鍙戝尯","value":"371171"},{"label":"鏃ョ収鍥介檯娴锋磱鍩�","value":"371172"}],[{"label":"鑾卞煄鍖�","value":"371202"},{"label":"閽㈠煄鍖�","value":"371203"}],[{"label":"鍏板北鍖�","value":"371302"},{"label":"缃楀簞鍖�","value":"371311"},{"label":"娌充笢鍖�","value":"371312"},{"label":"娌傚崡鍘�","value":"371321"},{"label":"閮煄鍘�","value":"371322"},{"label":"娌傛按鍘�","value":"371323"},{"label":"鍏伴櫟鍘�","value":"371324"},{"label":"璐瑰幙","value":"371325"},{"label":"骞抽倯鍘�","value":"371326"},{"label":"鑾掑崡鍘�","value":"371327"},{"label":"钂欓槾鍘�","value":"371328"},{"label":"涓存箔鍘�","value":"371329"},{"label":"涓存矀楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"371371"},{"label":"涓存矀缁忔祹鎶�鏈紑鍙戝尯","value":"371372"},{"label":"涓存矀涓存腐缁忔祹寮�鍙戝尯","value":"371373"}],[{"label":"寰峰煄鍖�","value":"371402"},{"label":"闄靛煄鍖�","value":"371403"},{"label":"瀹佹触鍘�","value":"371422"},{"label":"搴嗕簯鍘�","value":"371423"},{"label":"涓撮倯鍘�","value":"371424"},{"label":"榻愭渤鍘�","value":"371425"},{"label":"骞冲師鍘�","value":"371426"},{"label":"澶忔触鍘�","value":"371427"},{"label":"姝﹀煄鍘�","value":"371428"},{"label":"寰峰窞缁忔祹鎶�鏈紑鍙戝尯","value":"371471"},{"label":"寰峰窞杩愭渤缁忔祹寮�鍙戝尯","value":"371472"},{"label":"涔愰櫟甯�","value":"371481"},{"label":"绂瑰煄甯�","value":"371482"}],[{"label":"涓滄槍搴滃尯","value":"371502"},{"label":"闃宠胺鍘�","value":"371521"},{"label":"鑾樺幙","value":"371522"},{"label":"鑼屽钩鍘�","value":"371523"},{"label":"涓滈樋鍘�","value":"371524"},{"label":"鍐犲幙","value":"371525"},{"label":"楂樺攼鍘�","value":"371526"},{"label":"涓存竻甯�","value":"371581"}],[{"label":"婊ㄥ煄鍖�","value":"371602"},{"label":"娌惧寲鍖�","value":"371603"},{"label":"鎯犳皯鍘�","value":"371621"},{"label":"闃充俊鍘�","value":"371622"},{"label":"鏃犳#鍘�","value":"371623"},{"label":"鍗氬叴鍘�","value":"371625"},{"label":"閭瑰钩鍘�","value":"371626"}],[{"label":"鐗′腹鍖�","value":"371702"},{"label":"瀹氶櫠鍖�","value":"371703"},{"label":"鏇瑰幙","value":"371721"},{"label":"鍗曞幙","value":"371722"},{"label":"鎴愭鍘�","value":"371723"},{"label":"宸ㄩ噹鍘�","value":"371724"},{"label":"閮撳煄鍘�","value":"371725"},{"label":"閯勫煄鍘�","value":"371726"},{"label":"涓滄槑鍘�","value":"371728"},{"label":"鑿忔辰缁忔祹鎶�鏈紑鍙戝尯","value":"371771"},{"label":"鑿忔辰楂樻柊鎶�鏈紑鍙戝尯","value":"371772"}]],[[{"label":"涓師鍖�","value":"410102"},{"label":"浜屼竷鍖�","value":"410103"},{"label":"绠″煄鍥炴棌鍖�","value":"410104"},{"label":"閲戞按鍖�","value":"410105"},{"label":"涓婅鍖�","value":"410106"},{"label":"鎯犳祹鍖�","value":"410108"},{"label":"涓墴鍘�","value":"410122"},{"label":"閮戝窞缁忔祹鎶�鏈紑鍙戝尯","value":"410171"},{"label":"閮戝窞楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"410172"},{"label":"閮戝窞鑸┖娓粡娴庣患鍚堝疄楠屽尯","value":"410173"},{"label":"宸╀箟甯�","value":"410181"},{"label":"鑽ラ槼甯�","value":"410182"},{"label":"鏂板瘑甯�","value":"410183"},{"label":"鏂伴儜甯�","value":"410184"},{"label":"鐧诲皝甯�","value":"410185"}],[{"label":"榫欎涵鍖�","value":"410202"},{"label":"椤烘渤鍥炴棌鍖�","value":"410203"},{"label":"榧撴ゼ鍖�","value":"410204"},{"label":"绂圭帇鍙板尯","value":"410205"},{"label":"绁ョ鍖�","value":"410212"},{"label":"鏉炲幙","value":"410221"},{"label":"閫氳鍘�","value":"410222"},{"label":"灏夋皬鍘�","value":"410223"},{"label":"鍏拌�冨幙","value":"410225"}],[{"label":"鑰佸煄鍖�","value":"410302"},{"label":"瑗垮伐鍖�","value":"410303"},{"label":"鐎嶆渤鍥炴棌鍖�","value":"410304"},{"label":"娑цタ鍖�","value":"410305"},{"label":"鍚夊埄鍖�","value":"410306"},{"label":"娲涢緳鍖�","value":"410311"},{"label":"瀛熸触鍘�","value":"410322"},{"label":"鏂板畨鍘�","value":"410323"},{"label":"鏍惧窛鍘�","value":"410324"},{"label":"宓╁幙","value":"410325"},{"label":"姹濋槼鍘�","value":"410326"},{"label":"瀹滈槼鍘�","value":"410327"},{"label":"娲涘畞鍘�","value":"410328"},{"label":"浼婂窛鍘�","value":"410329"},{"label":"娲涢槼楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"410371"},{"label":"鍋冨笀甯�","value":"410381"}],[{"label":"鏂板崕鍖�","value":"410402"},{"label":"鍗笢鍖�","value":"410403"},{"label":"鐭抽緳鍖�","value":"410404"},{"label":"婀涙渤鍖�","value":"410411"},{"label":"瀹濅赴鍘�","value":"410421"},{"label":"鍙跺幙","value":"410422"},{"label":"椴佸北鍘�","value":"410423"},{"label":"閮忓幙","value":"410425"},{"label":"骞抽《灞遍珮鏂版妧鏈骇涓氬紑鍙戝尯","value":"410471"},{"label":"骞抽《灞卞競鏂板煄鍖�","value":"410472"},{"label":"鑸為挗甯�","value":"410481"},{"label":"姹濆窞甯�","value":"410482"}],[{"label":"鏂囧嘲鍖�","value":"410502"},{"label":"鍖楀叧鍖�","value":"410503"},{"label":"娈烽兘鍖�","value":"410505"},{"label":"榫欏畨鍖�","value":"410506"},{"label":"瀹夐槼鍘�","value":"410522"},{"label":"姹ら槾鍘�","value":"410523"},{"label":"婊戝幙","value":"410526"},{"label":"鍐呴粍鍘�","value":"410527"},{"label":"瀹夐槼楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"410571"},{"label":"鏋楀窞甯�","value":"410581"}],[{"label":"楣ゅ北鍖�","value":"410602"},{"label":"灞卞煄鍖�","value":"410603"},{"label":"娣囨花鍖�","value":"410611"},{"label":"娴氬幙","value":"410621"},{"label":"娣囧幙","value":"410622"},{"label":"楣ゅ缁忔祹鎶�鏈紑鍙戝尯","value":"410671"}],[{"label":"绾㈡棗鍖�","value":"410702"},{"label":"鍗花鍖�","value":"410703"},{"label":"鍑ゆ硥鍖�","value":"410704"},{"label":"鐗ч噹鍖�","value":"410711"},{"label":"鏂颁埂鍘�","value":"410721"},{"label":"鑾峰槈鍘�","value":"410724"},{"label":"鍘熼槼鍘�","value":"410725"},{"label":"寤舵触鍘�","value":"410726"},{"label":"灏佷笜鍘�","value":"410727"},{"label":"闀垮灒鍘�","value":"410728"},{"label":"鏂颁埂楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"410771"},{"label":"鏂颁埂缁忔祹鎶�鏈紑鍙戝尯","value":"410772"},{"label":"鏂颁埂甯傚钩鍘熷煄涔′竴浣撳寲绀鸿寖鍖�","value":"410773"},{"label":"鍗緣甯�","value":"410781"},{"label":"杈夊幙甯�","value":"410782"}],[{"label":"瑙f斁鍖�","value":"410802"},{"label":"涓珯鍖�","value":"410803"},{"label":"椹潙鍖�","value":"410804"},{"label":"灞遍槼鍖�","value":"410811"},{"label":"淇鍘�","value":"410821"},{"label":"鍗氱埍鍘�","value":"410822"},{"label":"姝﹂櫉鍘�","value":"410823"},{"label":"娓╁幙","value":"410825"},{"label":"鐒︿綔鍩庝埂涓�浣撳寲绀鸿寖鍖�","value":"410871"},{"label":"娌侀槼甯�","value":"410882"},{"label":"瀛熷窞甯�","value":"410883"}],[{"label":"鍗庨緳鍖�","value":"410902"},{"label":"娓呬赴鍘�","value":"410922"},{"label":"鍗椾箰鍘�","value":"410923"},{"label":"鑼冨幙","value":"410926"},{"label":"鍙板墠鍘�","value":"410927"},{"label":"婵槼鍘�","value":"410928"},{"label":"娌冲崡婵槼宸ヤ笟鍥尯","value":"410971"},{"label":"婵槼缁忔祹鎶�鏈紑鍙戝尯","value":"410972"}],[{"label":"榄忛兘鍖�","value":"411002"},{"label":"寤哄畨鍖�","value":"411003"},{"label":"閯㈤櫟鍘�","value":"411024"},{"label":"瑗勫煄鍘�","value":"411025"},{"label":"璁告槍缁忔祹鎶�鏈紑鍙戝尯","value":"411071"},{"label":"绂瑰窞甯�","value":"411081"},{"label":"闀胯憶甯�","value":"411082"}],[{"label":"婧愭眹鍖�","value":"411102"},{"label":"閮惧煄鍖�","value":"411103"},{"label":"鍙櫟鍖�","value":"411104"},{"label":"鑸為槼鍘�","value":"411121"},{"label":"涓撮鍘�","value":"411122"},{"label":"婕渤缁忔祹鎶�鏈紑鍙戝尯","value":"411171"}],[{"label":"婀栨花鍖�","value":"411202"},{"label":"闄曞窞鍖�","value":"411203"},{"label":"娓戞睜鍘�","value":"411221"},{"label":"鍗㈡皬鍘�","value":"411224"},{"label":"娌冲崡涓夐棬宄$粡娴庡紑鍙戝尯","value":"411271"},{"label":"涔夐┈甯�","value":"411281"},{"label":"鐏靛疂甯�","value":"411282"}],[{"label":"瀹涘煄鍖�","value":"411302"},{"label":"鍗ч緳鍖�","value":"411303"},{"label":"鍗楀彫鍘�","value":"411321"},{"label":"鏂瑰煄鍘�","value":"411322"},{"label":"瑗垮场鍘�","value":"411323"},{"label":"闀囧钩鍘�","value":"411324"},{"label":"鍐呬埂鍘�","value":"411325"},{"label":"娣呭窛鍘�","value":"411326"},{"label":"绀炬棗鍘�","value":"411327"},{"label":"鍞愭渤鍘�","value":"411328"},{"label":"鏂伴噹鍘�","value":"411329"},{"label":"妗愭煆鍘�","value":"411330"},{"label":"鍗楅槼楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"411371"},{"label":"鍗楅槼甯傚煄涔′竴浣撳寲绀鸿寖鍖�","value":"411372"},{"label":"閭撳窞甯�","value":"411381"}],[{"label":"姊佸洯鍖�","value":"411402"},{"label":"鐫㈤槼鍖�","value":"411403"},{"label":"姘戞潈鍘�","value":"411421"},{"label":"鐫㈠幙","value":"411422"},{"label":"瀹侀櫟鍘�","value":"411423"},{"label":"鏌樺煄鍘�","value":"411424"},{"label":"铏炲煄鍘�","value":"411425"},{"label":"澶忛倯鍘�","value":"411426"},{"label":"璞笢缁煎悎鐗╂祦浜т笟鑱氶泦鍖�","value":"411471"},{"label":"娌冲崡鍟嗕笜缁忔祹寮�鍙戝尯","value":"411472"},{"label":"姘稿煄甯�","value":"411481"}],[{"label":"娴夋渤鍖�","value":"411502"},{"label":"骞虫ˉ鍖�","value":"411503"},{"label":"缃楀北鍘�","value":"411521"},{"label":"鍏夊北鍘�","value":"411522"},{"label":"鏂板幙","value":"411523"},{"label":"鍟嗗煄鍘�","value":"411524"},{"label":"鍥哄鍘�","value":"411525"},{"label":"娼㈠窛鍘�","value":"411526"},{"label":"娣花鍘�","value":"411527"},{"label":"鎭幙","value":"411528"},{"label":"淇¢槼楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"411571"}],[{"label":"宸濇眹鍖�","value":"411602"},{"label":"鎵舵矡鍘�","value":"411621"},{"label":"瑗垮崕鍘�","value":"411622"},{"label":"鍟嗘按鍘�","value":"411623"},{"label":"娌堜笜鍘�","value":"411624"},{"label":"閮稿煄鍘�","value":"411625"},{"label":"娣槼鍘�","value":"411626"},{"label":"澶悍鍘�","value":"411627"},{"label":"楣块倯鍘�","value":"411628"},{"label":"娌冲崡鍛ㄥ彛缁忔祹寮�鍙戝尯","value":"411671"},{"label":"椤瑰煄甯�","value":"411681"}],[{"label":"椹垮煄鍖�","value":"411702"},{"label":"瑗垮钩鍘�","value":"411721"},{"label":"涓婅敗鍘�","value":"411722"},{"label":"骞宠垎鍘�","value":"411723"},{"label":"姝i槼鍘�","value":"411724"},{"label":"纭北鍘�","value":"411725"},{"label":"娉岄槼鍘�","value":"411726"},{"label":"姹濆崡鍘�","value":"411727"},{"label":"閬傚钩鍘�","value":"411728"},{"label":"鏂拌敗鍘�","value":"411729"},{"label":"娌冲崡椹婚┈搴楃粡娴庡紑鍙戝尯","value":"411771"}],[{"label":"娴庢簮甯�","value":"419001"}]],[[{"label":"姹熷哺鍖�","value":"420102"},{"label":"姹熸眽鍖�","value":"420103"},{"label":"纭氬彛鍖�","value":"420104"},{"label":"姹夐槼鍖�","value":"420105"},{"label":"姝︽槍鍖�","value":"420106"},{"label":"闈掑北鍖�","value":"420107"},{"label":"娲北鍖�","value":"420111"},{"label":"涓滆タ婀栧尯","value":"420112"},{"label":"姹夊崡鍖�","value":"420113"},{"label":"钄$敻鍖�","value":"420114"},{"label":"姹熷鍖�","value":"420115"},{"label":"榛勯檪鍖�","value":"420116"},{"label":"鏂版床鍖�","value":"420117"}],[{"label":"榛勭煶娓尯","value":"420202"},{"label":"瑗垮灞卞尯","value":"420203"},{"label":"涓嬮檰鍖�","value":"420204"},{"label":"閾佸北鍖�","value":"420205"},{"label":"闃虫柊鍘�","value":"420222"},{"label":"澶у喍甯�","value":"420281"}],[{"label":"鑼呯鍖�","value":"420302"},{"label":"寮犳咕鍖�","value":"420303"},{"label":"閮ч槼鍖�","value":"420304"},{"label":"閮цタ鍘�","value":"420322"},{"label":"绔瑰北鍘�","value":"420323"},{"label":"绔规邯鍘�","value":"420324"},{"label":"鎴垮幙","value":"420325"},{"label":"涓规睙鍙e競","value":"420381"}],[{"label":"瑗块櫟鍖�","value":"420502"},{"label":"浼嶅宀楀尯","value":"420503"},{"label":"鐐瑰啗鍖�","value":"420504"},{"label":"鐚囦涵鍖�","value":"420505"},{"label":"澶烽櫟鍖�","value":"420506"},{"label":"杩滃畨鍘�","value":"420525"},{"label":"鍏村北鍘�","value":"420526"},{"label":"绉綊鍘�","value":"420527"},{"label":"闀块槼鍦熷鏃忚嚜娌诲幙","value":"420528"},{"label":"浜斿嘲鍦熷鏃忚嚜娌诲幙","value":"420529"},{"label":"瀹滈兘甯�","value":"420581"},{"label":"褰撻槼甯�","value":"420582"},{"label":"鏋濇睙甯�","value":"420583"}],[{"label":"瑗勫煄鍖�","value":"420602"},{"label":"妯婂煄鍖�","value":"420606"},{"label":"瑗勫窞鍖�","value":"420607"},{"label":"鍗楁汲鍘�","value":"420624"},{"label":"璋峰煄鍘�","value":"420625"},{"label":"淇濆悍鍘�","value":"420626"},{"label":"鑰佹渤鍙e競","value":"420682"},{"label":"鏋i槼甯�","value":"420683"},{"label":"瀹滃煄甯�","value":"420684"}],[{"label":"姊佸瓙婀栧尯","value":"420702"},{"label":"鍗庡鍖�","value":"420703"},{"label":"閯傚煄鍖�","value":"420704"}],[{"label":"涓滃疂鍖�","value":"420802"},{"label":"鎺囧垁鍖�","value":"420804"},{"label":"浜北鍘�","value":"420821"},{"label":"娌欐磱鍘�","value":"420822"},{"label":"閽熺ゥ甯�","value":"420881"}],[{"label":"瀛濆崡鍖�","value":"420902"},{"label":"瀛濇槍鍘�","value":"420921"},{"label":"澶ф偀鍘�","value":"420922"},{"label":"浜戞ⅵ鍘�","value":"420923"},{"label":"搴斿煄甯�","value":"420981"},{"label":"瀹夐檰甯�","value":"420982"},{"label":"姹夊窛甯�","value":"420984"}],[{"label":"娌欏競鍖�","value":"421002"},{"label":"鑽嗗窞鍖�","value":"421003"},{"label":"鍏畨鍘�","value":"421022"},{"label":"鐩戝埄鍘�","value":"421023"},{"label":"姹熼櫟鍘�","value":"421024"},{"label":"鑽嗗窞缁忔祹鎶�鏈紑鍙戝尯","value":"421071"},{"label":"鐭抽甯�","value":"421081"},{"label":"娲箹甯�","value":"421083"},{"label":"鏉炬粙甯�","value":"421087"}],[{"label":"榛勫窞鍖�","value":"421102"},{"label":"鍥㈤鍘�","value":"421121"},{"label":"绾㈠畨鍘�","value":"421122"},{"label":"缃楃敯鍘�","value":"421123"},{"label":"鑻卞北鍘�","value":"421124"},{"label":"娴犳按鍘�","value":"421125"},{"label":"钑叉槬鍘�","value":"421126"},{"label":"榛勬鍘�","value":"421127"},{"label":"榫欐劅婀栫鐞嗗尯","value":"421171"},{"label":"楹诲煄甯�","value":"421181"},{"label":"姝︾┐甯�","value":"421182"}],[{"label":"鍜稿畨鍖�","value":"421202"},{"label":"鍢夐奔鍘�","value":"421221"},{"label":"閫氬煄鍘�","value":"421222"},{"label":"宕囬槼鍘�","value":"421223"},{"label":"閫氬北鍘�","value":"421224"},{"label":"璧ゅ甯�","value":"421281"}],[{"label":"鏇鹃兘鍖�","value":"421303"},{"label":"闅忓幙","value":"421321"},{"label":"骞挎按甯�","value":"421381"}],[{"label":"鎭╂柦甯�","value":"422801"},{"label":"鍒╁窛甯�","value":"422802"},{"label":"寤哄鍘�","value":"422822"},{"label":"宸翠笢鍘�","value":"422823"},{"label":"瀹f仼鍘�","value":"422825"},{"label":"鍜镐赴鍘�","value":"422826"},{"label":"鏉ュ嚖鍘�","value":"422827"},{"label":"楣ゅ嘲鍘�","value":"422828"}],[{"label":"浠欐甯�","value":"429004"},{"label":"娼滄睙甯�","value":"429005"},{"label":"澶╅棬甯�","value":"429006"},{"label":"绁炲啘鏋舵灄鍖�","value":"429021"}]],[[{"label":"鑺欒搲鍖�","value":"430102"},{"label":"澶╁績鍖�","value":"430103"},{"label":"宀抽簱鍖�","value":"430104"},{"label":"寮�绂忓尯","value":"430105"},{"label":"闆ㄨ姳鍖�","value":"430111"},{"label":"鏈涘煄鍖�","value":"430112"},{"label":"闀挎矙鍘�","value":"430121"},{"label":"娴忛槼甯�","value":"430181"},{"label":"瀹佷埂甯�","value":"430182"}],[{"label":"鑽峰鍖�","value":"430202"},{"label":"鑺︽窞鍖�","value":"430203"},{"label":"鐭冲嘲鍖�","value":"430204"},{"label":"澶╁厓鍖�","value":"430211"},{"label":"鏍床鍘�","value":"430221"},{"label":"鏀稿幙","value":"430223"},{"label":"鑼堕櫟鍘�","value":"430224"},{"label":"鐐庨櫟鍘�","value":"430225"},{"label":"浜戦緳绀鸿寖鍖�","value":"430271"},{"label":"閱撮櫟甯�","value":"430281"}],[{"label":"闆ㄦ箹鍖�","value":"430302"},{"label":"宀冲鍖�","value":"430304"},{"label":"婀樻江鍘�","value":"430321"},{"label":"婀栧崡婀樻江楂樻柊鎶�鏈骇涓氬洯鍖�","value":"430371"},{"label":"婀樻江鏄北绀鸿寖鍖�","value":"430372"},{"label":"婀樻江涔濆崕绀鸿寖鍖�","value":"430373"},{"label":"婀樹埂甯�","value":"430381"},{"label":"闊跺北甯�","value":"430382"}],[{"label":"鐝犳櫀鍖�","value":"430405"},{"label":"闆佸嘲鍖�","value":"430406"},{"label":"鐭抽紦鍖�","value":"430407"},{"label":"钂告箻鍖�","value":"430408"},{"label":"鍗楀渤鍖�","value":"430412"},{"label":"琛¢槼鍘�","value":"430421"},{"label":"琛″崡鍘�","value":"430422"},{"label":"琛″北鍘�","value":"430423"},{"label":"琛′笢鍘�","value":"430424"},{"label":"绁佷笢鍘�","value":"430426"},{"label":"琛¢槼缁煎悎淇濈◣鍖�","value":"430471"},{"label":"婀栧崡琛¢槼楂樻柊鎶�鏈骇涓氬洯鍖�","value":"430472"},{"label":"婀栧崡琛¢槼鏉炬湪缁忔祹寮�鍙戝尯","value":"430473"},{"label":"鑰掗槼甯�","value":"430481"},{"label":"甯稿畞甯�","value":"430482"}],[{"label":"鍙屾竻鍖�","value":"430502"},{"label":"澶хゥ鍖�","value":"430503"},{"label":"鍖楀鍖�","value":"430511"},{"label":"閭典笢鍘�","value":"430521"},{"label":"鏂伴偟鍘�","value":"430522"},{"label":"閭甸槼鍘�","value":"430523"},{"label":"闅嗗洖鍘�","value":"430524"},{"label":"娲炲彛鍘�","value":"430525"},{"label":"缁ュ畞鍘�","value":"430527"},{"label":"鏂板畞鍘�","value":"430528"},{"label":"鍩庢鑻楁棌鑷不鍘�","value":"430529"},{"label":"姝﹀唸甯�","value":"430581"}],[{"label":"宀抽槼妤煎尯","value":"430602"},{"label":"浜戞邯鍖�","value":"430603"},{"label":"鍚涘北鍖�","value":"430611"},{"label":"宀抽槼鍘�","value":"430621"},{"label":"鍗庡鍘�","value":"430623"},{"label":"婀橀槾鍘�","value":"430624"},{"label":"骞虫睙鍘�","value":"430626"},{"label":"宀抽槼甯傚眻鍘熺鐞嗗尯","value":"430671"},{"label":"姹ㄧ綏甯�","value":"430681"},{"label":"涓存箻甯�","value":"430682"}],[{"label":"姝﹂櫟鍖�","value":"430702"},{"label":"榧庡煄鍖�","value":"430703"},{"label":"瀹変埂鍘�","value":"430721"},{"label":"姹夊鍘�","value":"430722"},{"label":"婢у幙","value":"430723"},{"label":"涓存晶鍘�","value":"430724"},{"label":"妗冩簮鍘�","value":"430725"},{"label":"鐭抽棬鍘�","value":"430726"},{"label":"甯稿痉甯傝タ娲炲涵绠$悊鍖�","value":"430771"},{"label":"娲ュ競甯�","value":"430781"}],[{"label":"姘稿畾鍖�","value":"430802"},{"label":"姝﹂櫟婧愬尯","value":"430811"},{"label":"鎱堝埄鍘�","value":"430821"},{"label":"妗戞鍘�","value":"430822"}],[{"label":"璧勯槼鍖�","value":"430902"},{"label":"璧北鍖�","value":"430903"},{"label":"鍗楀幙","value":"430921"},{"label":"妗冩睙鍘�","value":"430922"},{"label":"瀹夊寲鍘�","value":"430923"},{"label":"鐩婇槼甯傚ぇ閫氭箹绠$悊鍖�","value":"430971"},{"label":"婀栧崡鐩婇槼楂樻柊鎶�鏈骇涓氬洯鍖�","value":"430972"},{"label":"娌呮睙甯�","value":"430981"}],[{"label":"鍖楁箹鍖�","value":"431002"},{"label":"鑻忎粰鍖�","value":"431003"},{"label":"妗傞槼鍘�","value":"431021"},{"label":"瀹滅珷鍘�","value":"431022"},{"label":"姘稿叴鍘�","value":"431023"},{"label":"鍢夌鍘�","value":"431024"},{"label":"涓存鍘�","value":"431025"},{"label":"姹濆煄鍘�","value":"431026"},{"label":"妗備笢鍘�","value":"431027"},{"label":"瀹変粊鍘�","value":"431028"},{"label":"璧勫叴甯�","value":"431081"}],[{"label":"闆堕櫟鍖�","value":"431102"},{"label":"鍐锋按婊╁尯","value":"431103"},{"label":"绁侀槼鍘�","value":"431121"},{"label":"涓滃畨鍘�","value":"431122"},{"label":"鍙岀墝鍘�","value":"431123"},{"label":"閬撳幙","value":"431124"},{"label":"姹熸案鍘�","value":"431125"},{"label":"瀹佽繙鍘�","value":"431126"},{"label":"钃濆北鍘�","value":"431127"},{"label":"鏂扮敯鍘�","value":"431128"},{"label":"姹熷崕鐟舵棌鑷不鍘�","value":"431129"},{"label":"姘稿窞缁忔祹鎶�鏈紑鍙戝尯","value":"431171"},{"label":"姘稿窞甯傞噾娲炵鐞嗗尯","value":"431172"},{"label":"姘稿窞甯傚洖榫欏湬绠$悊鍖�","value":"431173"}],[{"label":"楣ゅ煄鍖�","value":"431202"},{"label":"涓柟鍘�","value":"431221"},{"label":"娌呴櫟鍘�","value":"431222"},{"label":"杈版邯鍘�","value":"431223"},{"label":"婧嗘郸鍘�","value":"431224"},{"label":"浼氬悓鍘�","value":"431225"},{"label":"楹婚槼鑻楁棌鑷不鍘�","value":"431226"},{"label":"鏂版檭渚楁棌鑷不鍘�","value":"431227"},{"label":"鑺锋睙渚楁棌鑷不鍘�","value":"431228"},{"label":"闈栧窞鑻楁棌渚楁棌鑷不鍘�","value":"431229"},{"label":"閫氶亾渚楁棌鑷不鍘�","value":"431230"},{"label":"鎬�鍖栧競娲睙绠$悊鍖�","value":"431271"},{"label":"娲睙甯�","value":"431281"}],[{"label":"濞勬槦鍖�","value":"431302"},{"label":"鍙屽嘲鍘�","value":"431321"},{"label":"鏂板寲鍘�","value":"431322"},{"label":"鍐锋按姹熷競","value":"431381"},{"label":"娑熸簮甯�","value":"431382"}],[{"label":"鍚夐甯�","value":"433101"},{"label":"娉告邯鍘�","value":"433122"},{"label":"鍑ゅ嚢鍘�","value":"433123"},{"label":"鑺卞灒鍘�","value":"433124"},{"label":"淇濋潠鍘�","value":"433125"},{"label":"鍙や笀鍘�","value":"433126"},{"label":"姘搁『鍘�","value":"433127"},{"label":"榫欏北鍘�","value":"433130"},{"label":"婀栧崡鍚夐缁忔祹寮�鍙戝尯","value":"433172"},{"label":"婀栧崡姘搁『缁忔祹寮�鍙戝尯","value":"433173"}]],[[{"label":"鑽旀咕鍖�","value":"440103"},{"label":"瓒婄鍖�","value":"440104"},{"label":"娴风彔鍖�","value":"440105"},{"label":"澶╂渤鍖�","value":"440106"},{"label":"鐧戒簯鍖�","value":"440111"},{"label":"榛勫煍鍖�","value":"440112"},{"label":"鐣鍖�","value":"440113"},{"label":"鑺遍兘鍖�","value":"440114"},{"label":"鍗楁矙鍖�","value":"440115"},{"label":"浠庡寲鍖�","value":"440117"},{"label":"澧炲煄鍖�","value":"440118"}],[{"label":"姝︽睙鍖�","value":"440203"},{"label":"娴堟睙鍖�","value":"440204"},{"label":"鏇叉睙鍖�","value":"440205"},{"label":"濮嬪叴鍘�","value":"440222"},{"label":"浠佸寲鍘�","value":"440224"},{"label":"缈佹簮鍘�","value":"440229"},{"label":"涔虫簮鐟舵棌鑷不鍘�","value":"440232"},{"label":"鏂颁赴鍘�","value":"440233"},{"label":"涔愭槍甯�","value":"440281"},{"label":"鍗楅泟甯�","value":"440282"}],[{"label":"缃楁箹鍖�","value":"440303"},{"label":"绂忕敯鍖�","value":"440304"},{"label":"鍗楀北鍖�","value":"440305"},{"label":"瀹濆畨鍖�","value":"440306"},{"label":"榫欏矖鍖�","value":"440307"},{"label":"鐩愮敯鍖�","value":"440308"},{"label":"榫欏崕鍖�","value":"440309"},{"label":"鍧北鍖�","value":"440310"}],[{"label":"棣欐床鍖�","value":"440402"},{"label":"鏂楅棬鍖�","value":"440403"},{"label":"閲戞咕鍖�","value":"440404"}],[{"label":"榫欐箹鍖�","value":"440507"},{"label":"閲戝钩鍖�","value":"440511"},{"label":"婵犳睙鍖�","value":"440512"},{"label":"娼槼鍖�","value":"440513"},{"label":"娼崡鍖�","value":"440514"},{"label":"婢勬捣鍖�","value":"440515"},{"label":"鍗楁境鍘�","value":"440523"}],[{"label":"绂呭煄鍖�","value":"440604"},{"label":"鍗楁捣鍖�","value":"440605"},{"label":"椤哄痉鍖�","value":"440606"},{"label":"涓夋按鍖�","value":"440607"},{"label":"楂樻槑鍖�","value":"440608"}],[{"label":"钃睙鍖�","value":"440703"},{"label":"姹熸捣鍖�","value":"440704"},{"label":"鏂颁細鍖�","value":"440705"},{"label":"鍙板北甯�","value":"440781"},{"label":"寮�骞冲競","value":"440783"},{"label":"楣ゅ北甯�","value":"440784"},{"label":"鎭╁钩甯�","value":"440785"}],[{"label":"璧ゅ潕鍖�","value":"440802"},{"label":"闇炲北鍖�","value":"440803"},{"label":"鍧″ご鍖�","value":"440804"},{"label":"楹荤珷鍖�","value":"440811"},{"label":"閬傛邯鍘�","value":"440823"},{"label":"寰愰椈鍘�","value":"440825"},{"label":"寤夋睙甯�","value":"440881"},{"label":"闆峰窞甯�","value":"440882"},{"label":"鍚村窛甯�","value":"440883"}],[{"label":"鑼傚崡鍖�","value":"440902"},{"label":"鐢电櫧鍖�","value":"440904"},{"label":"楂樺窞甯�","value":"440981"},{"label":"鍖栧窞甯�","value":"440982"},{"label":"淇″疁甯�","value":"440983"}],[{"label":"绔窞鍖�","value":"441202"},{"label":"榧庢箹鍖�","value":"441203"},{"label":"楂樿鍖�","value":"441204"},{"label":"骞垮畞鍘�","value":"441223"},{"label":"鎬�闆嗗幙","value":"441224"},{"label":"灏佸紑鍘�","value":"441225"},{"label":"寰峰簡鍘�","value":"441226"},{"label":"鍥涗細甯�","value":"441284"}],[{"label":"鎯犲煄鍖�","value":"441302"},{"label":"鎯犻槼鍖�","value":"441303"},{"label":"鍗氱綏鍘�","value":"441322"},{"label":"鎯犱笢鍘�","value":"441323"},{"label":"榫欓棬鍘�","value":"441324"}],[{"label":"姊呮睙鍖�","value":"441402"},{"label":"姊呭幙鍖�","value":"441403"},{"label":"澶у煍鍘�","value":"441422"},{"label":"涓伴『鍘�","value":"441423"},{"label":"浜斿崕鍘�","value":"441424"},{"label":"骞宠繙鍘�","value":"441426"},{"label":"钑夊箔鍘�","value":"441427"},{"label":"鍏村畞甯�","value":"441481"}],[{"label":"鍩庡尯","value":"441502"},{"label":"娴蜂赴鍘�","value":"441521"},{"label":"闄嗘渤鍘�","value":"441523"},{"label":"闄嗕赴甯�","value":"441581"}],[{"label":"婧愬煄鍖�","value":"441602"},{"label":"绱噾鍘�","value":"441621"},{"label":"榫欏窛鍘�","value":"441622"},{"label":"杩炲钩鍘�","value":"441623"},{"label":"鍜屽钩鍘�","value":"441624"},{"label":"涓滄簮鍘�","value":"441625"}],[{"label":"姹熷煄鍖�","value":"441702"},{"label":"闃充笢鍖�","value":"441704"},{"label":"闃宠タ鍘�","value":"441721"},{"label":"闃虫槬甯�","value":"441781"}],[{"label":"娓呭煄鍖�","value":"441802"},{"label":"娓呮柊鍖�","value":"441803"},{"label":"浣涘唸鍘�","value":"441821"},{"label":"闃冲北鍘�","value":"441823"},{"label":"杩炲北澹棌鐟舵棌鑷不鍘�","value":"441825"},{"label":"杩炲崡鐟舵棌鑷不鍘�","value":"441826"},{"label":"鑻卞痉甯�","value":"441881"},{"label":"杩炲窞甯�","value":"441882"}],[{"label":"涓滆帪甯�","value":"441900"}],[{"label":"涓北甯�","value":"442000"}],[{"label":"婀樻ˉ鍖�","value":"445102"},{"label":"娼畨鍖�","value":"445103"},{"label":"楗跺钩鍘�","value":"445122"}],[{"label":"姒曞煄鍖�","value":"445202"},{"label":"鎻笢鍖�","value":"445203"},{"label":"鎻タ鍘�","value":"445222"},{"label":"鎯犳潵鍘�","value":"445224"},{"label":"鏅畞甯�","value":"445281"}],[{"label":"浜戝煄鍖�","value":"445302"},{"label":"浜戝畨鍖�","value":"445303"},{"label":"鏂板叴鍘�","value":"445321"},{"label":"閮佸崡鍘�","value":"445322"},{"label":"缃楀畾甯�","value":"445381"}]],[[{"label":"鍏村畞鍖�","value":"450102"},{"label":"闈掔鍖�","value":"450103"},{"label":"姹熷崡鍖�","value":"450105"},{"label":"瑗夸埂濉樺尯","value":"450107"},{"label":"鑹簡鍖�","value":"450108"},{"label":"閭曞畞鍖�","value":"450109"},{"label":"姝﹂福鍖�","value":"450110"},{"label":"闅嗗畨鍘�","value":"450123"},{"label":"椹北鍘�","value":"450124"},{"label":"涓婃灄鍘�","value":"450125"},{"label":"瀹鹃槼鍘�","value":"450126"},{"label":"妯幙","value":"450127"}],[{"label":"鍩庝腑鍖�","value":"450202"},{"label":"楸煎嘲鍖�","value":"450203"},{"label":"鏌冲崡鍖�","value":"450204"},{"label":"鏌冲寳鍖�","value":"450205"},{"label":"鏌虫睙鍖�","value":"450206"},{"label":"鏌冲煄鍘�","value":"450222"},{"label":"楣垮鍘�","value":"450223"},{"label":"铻嶅畨鍘�","value":"450224"},{"label":"铻嶆按鑻楁棌鑷不鍘�","value":"450225"},{"label":"涓夋睙渚楁棌鑷不鍘�","value":"450226"}],[{"label":"绉�宄板尯","value":"450302"},{"label":"鍙犲僵鍖�","value":"450303"},{"label":"璞″北鍖�","value":"450304"},{"label":"涓冩槦鍖�","value":"450305"},{"label":"闆佸北鍖�","value":"450311"},{"label":"涓存鍖�","value":"450312"},{"label":"闃虫湐鍘�","value":"450321"},{"label":"鐏靛窛鍘�","value":"450323"},{"label":"鍏ㄥ窞鍘�","value":"450324"},{"label":"鍏村畨鍘�","value":"450325"},{"label":"姘哥鍘�","value":"450326"},{"label":"鐏岄槼鍘�","value":"450327"},{"label":"榫欒儨鍚勬棌鑷不鍘�","value":"450328"},{"label":"璧勬簮鍘�","value":"450329"},{"label":"骞充箰鍘�","value":"450330"},{"label":"鑽旀郸鍘�","value":"450331"},{"label":"鎭煄鐟舵棌鑷不鍘�","value":"450332"}],[{"label":"涓囩鍖�","value":"450403"},{"label":"闀挎床鍖�","value":"450405"},{"label":"榫欏湬鍖�","value":"450406"},{"label":"鑻嶆ⅶ鍘�","value":"450421"},{"label":"钘ゅ幙","value":"450422"},{"label":"钂欏北鍘�","value":"450423"},{"label":"宀戞邯甯�","value":"450481"}],[{"label":"娴峰煄鍖�","value":"450502"},{"label":"閾舵捣鍖�","value":"450503"},{"label":"閾佸北娓尯","value":"450512"},{"label":"鍚堟郸鍘�","value":"450521"}],[{"label":"娓彛鍖�","value":"450602"},{"label":"闃插煄鍖�","value":"450603"},{"label":"涓婃�濆幙","value":"450621"},{"label":"涓滃叴甯�","value":"450681"}],[{"label":"閽﹀崡鍖�","value":"450702"},{"label":"閽﹀寳鍖�","value":"450703"},{"label":"鐏靛北鍘�","value":"450721"},{"label":"娴﹀寳鍘�","value":"450722"}],[{"label":"娓寳鍖�","value":"450802"},{"label":"娓崡鍖�","value":"450803"},{"label":"瑕冨鍖�","value":"450804"},{"label":"骞冲崡鍘�","value":"450821"},{"label":"妗傚钩甯�","value":"450881"}],[{"label":"鐜夊窞鍖�","value":"450902"},{"label":"绂忕坏鍖�","value":"450903"},{"label":"瀹瑰幙","value":"450921"},{"label":"闄嗗窛鍘�","value":"450922"},{"label":"鍗氱櫧鍘�","value":"450923"},{"label":"鍏翠笟鍘�","value":"450924"},{"label":"鍖楁祦甯�","value":"450981"}],[{"label":"鍙虫睙鍖�","value":"451002"},{"label":"鐢伴槼鍘�","value":"451021"},{"label":"鐢颁笢鍘�","value":"451022"},{"label":"骞虫灉鍘�","value":"451023"},{"label":"寰蜂繚鍘�","value":"451024"},{"label":"閭e潯鍘�","value":"451026"},{"label":"鍑屼簯鍘�","value":"451027"},{"label":"涔愪笟鍘�","value":"451028"},{"label":"鐢版灄鍘�","value":"451029"},{"label":"瑗挎灄鍘�","value":"451030"},{"label":"闅嗘灄鍚勬棌鑷不鍘�","value":"451031"},{"label":"闈栬タ甯�","value":"451081"}],[{"label":"鍏鍖�","value":"451102"},{"label":"骞虫鍖�","value":"451103"},{"label":"鏄钩鍘�","value":"451121"},{"label":"閽熷北鍘�","value":"451122"},{"label":"瀵屽窛鐟舵棌鑷不鍘�","value":"451123"}],[{"label":"閲戝煄姹熷尯","value":"451202"},{"label":"瀹滃窞鍖�","value":"451203"},{"label":"鍗椾腹鍘�","value":"451221"},{"label":"澶╁敞鍘�","value":"451222"},{"label":"鍑ゅ北鍘�","value":"451223"},{"label":"涓滃叞鍘�","value":"451224"},{"label":"缃楀煄浠浆鏃忚嚜娌诲幙","value":"451225"},{"label":"鐜睙姣涘崡鏃忚嚜娌诲幙","value":"451226"},{"label":"宸撮┈鐟舵棌鑷不鍘�","value":"451227"},{"label":"閮藉畨鐟舵棌鑷不鍘�","value":"451228"},{"label":"澶у寲鐟舵棌鑷不鍘�","value":"451229"}],[{"label":"鍏村鍖�","value":"451302"},{"label":"蹇诲煄鍘�","value":"451321"},{"label":"璞″窞鍘�","value":"451322"},{"label":"姝﹀鍘�","value":"451323"},{"label":"閲戠鐟舵棌鑷不鍘�","value":"451324"},{"label":"鍚堝北甯�","value":"451381"}],[{"label":"姹熷窞鍖�","value":"451402"},{"label":"鎵剁互鍘�","value":"451421"},{"label":"瀹佹槑鍘�","value":"451422"},{"label":"榫欏窞鍘�","value":"451423"},{"label":"澶ф柊鍘�","value":"451424"},{"label":"澶╃瓑鍘�","value":"451425"},{"label":"鍑ゥ甯�","value":"451481"}]],[[{"label":"绉�鑻卞尯","value":"460105"},{"label":"榫欏崕鍖�","value":"460106"},{"label":"鐞煎北鍖�","value":"460107"},{"label":"缇庡叞鍖�","value":"460108"}],[{"label":"娴锋鍖�","value":"460202"},{"label":"鍚夐槼鍖�","value":"460203"},{"label":"澶╂动鍖�","value":"460204"},{"label":"宕栧窞鍖�","value":"460205"}],[{"label":"瑗挎矙缇ゅ矝","value":"460321"},{"label":"鍗楁矙缇ゅ矝","value":"460322"},{"label":"涓矙缇ゅ矝鐨勫矝绀佸強鍏舵捣鍩�","value":"460323"}],[{"label":"鍎嬪窞甯�","value":"460400"}],[{"label":"浜旀寚灞卞競","value":"469001"},{"label":"鐞兼捣甯�","value":"469002"},{"label":"鏂囨槍甯�","value":"469005"},{"label":"涓囧畞甯�","value":"469006"},{"label":"涓滄柟甯�","value":"469007"},{"label":"瀹氬畨鍘�","value":"469021"},{"label":"灞槍鍘�","value":"469022"},{"label":"婢勮繄鍘�","value":"469023"},{"label":"涓撮珮鍘�","value":"469024"},{"label":"鐧芥矙榛庢棌鑷不鍘�","value":"469025"},{"label":"鏄屾睙榛庢棌鑷不鍘�","value":"469026"},{"label":"涔愪笢榛庢棌鑷不鍘�","value":"469027"},{"label":"闄垫按榛庢棌鑷不鍘�","value":"469028"},{"label":"淇濅涵榛庢棌鑻楁棌鑷不鍘�","value":"469029"},{"label":"鐞间腑榛庢棌鑻楁棌鑷不鍘�","value":"469030"}]],[[{"label":"涓囧窞鍖�","value":"500101"},{"label":"娑櫟鍖�","value":"500102"},{"label":"娓濅腑鍖�","value":"500103"},{"label":"澶ф浮鍙e尯","value":"500104"},{"label":"姹熷寳鍖�","value":"500105"},{"label":"娌欏潽鍧濆尯","value":"500106"},{"label":"涔濋緳鍧″尯","value":"500107"},{"label":"鍗楀哺鍖�","value":"500108"},{"label":"鍖楃鍖�","value":"500109"},{"label":"缍︽睙鍖�","value":"500110"},{"label":"澶ц冻鍖�","value":"500111"},{"label":"娓濆寳鍖�","value":"500112"},{"label":"宸村崡鍖�","value":"500113"},{"label":"榛旀睙鍖�","value":"500114"},{"label":"闀垮鍖�","value":"500115"},{"label":"姹熸触鍖�","value":"500116"},{"label":"鍚堝窛鍖�","value":"500117"},{"label":"姘稿窛鍖�","value":"500118"},{"label":"鍗楀窛鍖�","value":"500119"},{"label":"鐠у北鍖�","value":"500120"},{"label":"閾滄鍖�","value":"500151"},{"label":"娼煎崡鍖�","value":"500152"},{"label":"鑽f槍鍖�","value":"500153"},{"label":"寮�宸炲尯","value":"500154"},{"label":"姊佸钩鍖�","value":"500155"},{"label":"姝﹂殕鍖�","value":"500156"}],[{"label":"鍩庡彛鍘�","value":"500229"},{"label":"涓伴兘鍘�","value":"500230"},{"label":"鍨睙鍘�","value":"500231"},{"label":"蹇犲幙","value":"500233"},{"label":"浜戦槼鍘�","value":"500235"},{"label":"濂夎妭鍘�","value":"500236"},{"label":"宸北鍘�","value":"500237"},{"label":"宸邯鍘�","value":"500238"},{"label":"鐭虫煴鍦熷鏃忚嚜娌诲幙","value":"500240"},{"label":"绉�灞卞湡瀹舵棌鑻楁棌鑷不鍘�","value":"500241"},{"label":"閰夐槼鍦熷鏃忚嫍鏃忚嚜娌诲幙","value":"500242"},{"label":"褰按鑻楁棌鍦熷鏃忚嚜娌诲幙","value":"500243"}]],[[{"label":"閿︽睙鍖�","value":"510104"},{"label":"闈掔緤鍖�","value":"510105"},{"label":"閲戠墰鍖�","value":"510106"},{"label":"姝︿警鍖�","value":"510107"},{"label":"鎴愬崕鍖�","value":"510108"},{"label":"榫欐硥椹垮尯","value":"510112"},{"label":"闈掔櫧姹熷尯","value":"510113"},{"label":"鏂伴兘鍖�","value":"510114"},{"label":"娓╂睙鍖�","value":"510115"},{"label":"鍙屾祦鍖�","value":"510116"},{"label":"閮兘鍖�","value":"510117"},{"label":"閲戝爞鍘�","value":"510121"},{"label":"澶ч倯鍘�","value":"510129"},{"label":"钂叉睙鍘�","value":"510131"},{"label":"鏂版触鍘�","value":"510132"},{"label":"閮芥睙鍫板競","value":"510181"},{"label":"褰窞甯�","value":"510182"},{"label":"閭涘磧甯�","value":"510183"},{"label":"宕囧窞甯�","value":"510184"},{"label":"绠�闃冲競","value":"510185"}],[{"label":"鑷祦浜曞尯","value":"510302"},{"label":"璐′簳鍖�","value":"510303"},{"label":"澶у畨鍖�","value":"510304"},{"label":"娌挎哗鍖�","value":"510311"},{"label":"鑽e幙","value":"510321"},{"label":"瀵岄『鍘�","value":"510322"}],[{"label":"涓滃尯","value":"510402"},{"label":"瑗垮尯","value":"510403"},{"label":"浠佸拰鍖�","value":"510411"},{"label":"绫虫槗鍘�","value":"510421"},{"label":"鐩愯竟鍘�","value":"510422"}],[{"label":"姹熼槼鍖�","value":"510502"},{"label":"绾虫邯鍖�","value":"510503"},{"label":"榫欓┈娼尯","value":"510504"},{"label":"娉稿幙","value":"510521"},{"label":"鍚堟睙鍘�","value":"510522"},{"label":"鍙欐案鍘�","value":"510524"},{"label":"鍙よ敽鍘�","value":"510525"}],[{"label":"鏃岄槼鍖�","value":"510603"},{"label":"缃楁睙鍖�","value":"510604"},{"label":"涓睙鍘�","value":"510623"},{"label":"骞挎眽甯�","value":"510681"},{"label":"浠�閭″競","value":"510682"},{"label":"缁电甯�","value":"510683"}],[{"label":"娑煄鍖�","value":"510703"},{"label":"娓镐粰鍖�","value":"510704"},{"label":"瀹夊窞鍖�","value":"510705"},{"label":"涓夊彴鍘�","value":"510722"},{"label":"鐩愪涵鍘�","value":"510723"},{"label":"姊撴郊鍘�","value":"510725"},{"label":"鍖楀窛缇屾棌鑷不鍘�","value":"510726"},{"label":"骞虫鍘�","value":"510727"},{"label":"姹熸补甯�","value":"510781"}],[{"label":"鍒╁窞鍖�","value":"510802"},{"label":"鏄寲鍖�","value":"510811"},{"label":"鏈濆ぉ鍖�","value":"510812"},{"label":"鏃鸿媿鍘�","value":"510821"},{"label":"闈掑窛鍘�","value":"510822"},{"label":"鍓戦榿鍘�","value":"510823"},{"label":"鑻嶆邯鍘�","value":"510824"}],[{"label":"鑸瑰北鍖�","value":"510903"},{"label":"瀹夊眳鍖�","value":"510904"},{"label":"钃邯鍘�","value":"510921"},{"label":"灏勬椽鍘�","value":"510922"},{"label":"澶ц嫳鍘�","value":"510923"}],[{"label":"甯備腑鍖�","value":"511002"},{"label":"涓滃叴鍖�","value":"511011"},{"label":"濞佽繙鍘�","value":"511024"},{"label":"璧勪腑鍘�","value":"511025"},{"label":"鍐呮睙缁忔祹寮�鍙戝尯","value":"511071"},{"label":"闅嗘槍甯�","value":"511083"}],[{"label":"甯備腑鍖�","value":"511102"},{"label":"娌欐咕鍖�","value":"511111"},{"label":"浜旈�氭ˉ鍖�","value":"511112"},{"label":"閲戝彛娌冲尯","value":"511113"},{"label":"鐘嶄负鍘�","value":"511123"},{"label":"浜曠爺鍘�","value":"511124"},{"label":"澶规睙鍘�","value":"511126"},{"label":"娌愬窛鍘�","value":"511129"},{"label":"宄ㄨ竟褰濇棌鑷不鍘�","value":"511132"},{"label":"椹竟褰濇棌鑷不鍘�","value":"511133"},{"label":"宄ㄧ湁灞卞競","value":"511181"}],[{"label":"椤哄簡鍖�","value":"511302"},{"label":"楂樺潽鍖�","value":"511303"},{"label":"鍢夐櫟鍖�","value":"511304"},{"label":"鍗楅儴鍘�","value":"511321"},{"label":"钀ュ北鍘�","value":"511322"},{"label":"钃畨鍘�","value":"511323"},{"label":"浠檱鍘�","value":"511324"},{"label":"瑗垮厖鍘�","value":"511325"},{"label":"闃嗕腑甯�","value":"511381"}],[{"label":"涓滃潯鍖�","value":"511402"},{"label":"褰北鍖�","value":"511403"},{"label":"浠佸鍘�","value":"511421"},{"label":"娲泤鍘�","value":"511423"},{"label":"涓规1鍘�","value":"511424"},{"label":"闈掔鍘�","value":"511425"}],[{"label":"缈犲睆鍖�","value":"511502"},{"label":"鍗楁邯鍖�","value":"511503"},{"label":"瀹滃鍘�","value":"511521"},{"label":"姹熷畨鍘�","value":"511523"},{"label":"闀垮畞鍘�","value":"511524"},{"label":"楂樺幙","value":"511525"},{"label":"鐝欏幙","value":"511526"},{"label":"绛犺繛鍘�","value":"511527"},{"label":"鍏存枃鍘�","value":"511528"},{"label":"灞忓北鍘�","value":"511529"}],[{"label":"骞垮畨鍖�","value":"511602"},{"label":"鍓嶉攱鍖�","value":"511603"},{"label":"宀虫睜鍘�","value":"511621"},{"label":"姝﹁儨鍘�","value":"511622"},{"label":"閭绘按鍘�","value":"511623"},{"label":"鍗庤摜甯�","value":"511681"}],[{"label":"閫氬窛鍖�","value":"511702"},{"label":"杈惧窛鍖�","value":"511703"},{"label":"瀹f眽鍘�","value":"511722"},{"label":"寮�姹熷幙","value":"511723"},{"label":"澶х鍘�","value":"511724"},{"label":"娓犲幙","value":"511725"},{"label":"杈惧窞缁忔祹寮�鍙戝尯","value":"511771"},{"label":"涓囨簮甯�","value":"511781"}],[{"label":"闆ㄥ煄鍖�","value":"511802"},{"label":"鍚嶅北鍖�","value":"511803"},{"label":"鑽ョ粡鍘�","value":"511822"},{"label":"姹夋簮鍘�","value":"511823"},{"label":"鐭虫鍘�","value":"511824"},{"label":"澶╁叏鍘�","value":"511825"},{"label":"鑺﹀北鍘�","value":"511826"},{"label":"瀹濆叴鍘�","value":"511827"}],[{"label":"宸村窞鍖�","value":"511902"},{"label":"鎭╅槼鍖�","value":"511903"},{"label":"閫氭睙鍘�","value":"511921"},{"label":"鍗楁睙鍘�","value":"511922"},{"label":"骞虫槍鍘�","value":"511923"},{"label":"宸翠腑缁忔祹寮�鍙戝尯","value":"511971"}],[{"label":"闆佹睙鍖�","value":"512002"},{"label":"瀹夊渤鍘�","value":"512021"},{"label":"涔愯嚦鍘�","value":"512022"}],[{"label":"椹皵搴峰競","value":"513201"},{"label":"姹跺窛鍘�","value":"513221"},{"label":"鐞嗗幙","value":"513222"},{"label":"鑼傚幙","value":"513223"},{"label":"鏉炬綐鍘�","value":"513224"},{"label":"涔濆娌熷幙","value":"513225"},{"label":"閲戝窛鍘�","value":"513226"},{"label":"灏忛噾鍘�","value":"513227"},{"label":"榛戞按鍘�","value":"513228"},{"label":"澹ゅ鍘�","value":"513230"},{"label":"闃垮潩鍘�","value":"513231"},{"label":"鑻ュ皵鐩栧幙","value":"513232"},{"label":"绾㈠師鍘�","value":"513233"}],[{"label":"搴峰畾甯�","value":"513301"},{"label":"娉稿畾鍘�","value":"513322"},{"label":"涓瑰反鍘�","value":"513323"},{"label":"涔濋緳鍘�","value":"513324"},{"label":"闆呮睙鍘�","value":"513325"},{"label":"閬撳瓪鍘�","value":"513326"},{"label":"鐐夐湇鍘�","value":"513327"},{"label":"鐢樺瓬鍘�","value":"513328"},{"label":"鏂伴緳鍘�","value":"513329"},{"label":"寰锋牸鍘�","value":"513330"},{"label":"鐧界帀鍘�","value":"513331"},{"label":"鐭虫笭鍘�","value":"513332"},{"label":"鑹茶揪鍘�","value":"513333"},{"label":"鐞嗗鍘�","value":"513334"},{"label":"宸村鍘�","value":"513335"},{"label":"涔″煄鍘�","value":"513336"},{"label":"绋诲煄鍘�","value":"513337"},{"label":"寰楄崳鍘�","value":"513338"}],[{"label":"瑗挎槍甯�","value":"513401"},{"label":"鏈ㄩ噷钘忔棌鑷不鍘�","value":"513422"},{"label":"鐩愭簮鍘�","value":"513423"},{"label":"寰锋槍鍘�","value":"513424"},{"label":"浼氱悊鍘�","value":"513425"},{"label":"浼氫笢鍘�","value":"513426"},{"label":"瀹佸崡鍘�","value":"513427"},{"label":"鏅牸鍘�","value":"513428"},{"label":"甯冩嫋鍘�","value":"513429"},{"label":"閲戦槼鍘�","value":"513430"},{"label":"鏄鍘�","value":"513431"},{"label":"鍠滃痉鍘�","value":"513432"},{"label":"鍐曞畞鍘�","value":"513433"},{"label":"瓒婅タ鍘�","value":"513434"},{"label":"鐢樻礇鍘�","value":"513435"},{"label":"缇庡鍘�","value":"513436"},{"label":"闆锋尝鍘�","value":"513437"}]],[[{"label":"鍗楁槑鍖�","value":"520102"},{"label":"浜戝博鍖�","value":"520103"},{"label":"鑺辨邯鍖�","value":"520111"},{"label":"涔屽綋鍖�","value":"520112"},{"label":"鐧戒簯鍖�","value":"520113"},{"label":"瑙傚北婀栧尯","value":"520115"},{"label":"寮�闃冲幙","value":"520121"},{"label":"鎭兘鍘�","value":"520122"},{"label":"淇枃鍘�","value":"520123"},{"label":"娓呴晣甯�","value":"520181"}],[{"label":"閽熷北鍖�","value":"520201"},{"label":"鍏灊鐗瑰尯","value":"520203"},{"label":"姘村煄鍘�","value":"520221"},{"label":"鐩樺窞甯�","value":"520281"}],[{"label":"绾㈣姳宀楀尯","value":"520302"},{"label":"姹囧窛鍖�","value":"520303"},{"label":"鎾窞鍖�","value":"520304"},{"label":"妗愭鍘�","value":"520322"},{"label":"缁ラ槼鍘�","value":"520323"},{"label":"姝e畨鍘�","value":"520324"},{"label":"閬撶湡浠′浆鏃忚嫍鏃忚嚜娌诲幙","value":"520325"},{"label":"鍔″窛浠′浆鏃忚嫍鏃忚嚜娌诲幙","value":"520326"},{"label":"鍑ゅ唸鍘�","value":"520327"},{"label":"婀勬江鍘�","value":"520328"},{"label":"浣欏簡鍘�","value":"520329"},{"label":"涔犳按鍘�","value":"520330"},{"label":"璧ゆ按甯�","value":"520381"},{"label":"浠佹��甯�","value":"520382"}],[{"label":"瑗跨鍖�","value":"520402"},{"label":"骞冲潩鍖�","value":"520403"},{"label":"鏅畾鍘�","value":"520422"},{"label":"闀囧畞甯冧緷鏃忚嫍鏃忚嚜娌诲幙","value":"520423"},{"label":"鍏冲箔甯冧緷鏃忚嫍鏃忚嚜娌诲幙","value":"520424"},{"label":"绱簯鑻楁棌甯冧緷鏃忚嚜娌诲幙","value":"520425"}],[{"label":"涓冩槦鍏冲尯","value":"520502"},{"label":"澶ф柟鍘�","value":"520521"},{"label":"榛旇タ鍘�","value":"520522"},{"label":"閲戞矙鍘�","value":"520523"},{"label":"缁囬噾鍘�","value":"520524"},{"label":"绾抽泹鍘�","value":"520525"},{"label":"濞佸畞褰濇棌鍥炴棌鑻楁棌鑷不鍘�","value":"520526"},{"label":"璧珷鍘�","value":"520527"}],[{"label":"纰ф睙鍖�","value":"520602"},{"label":"涓囧北鍖�","value":"520603"},{"label":"姹熷彛鍘�","value":"520621"},{"label":"鐜夊睆渚楁棌鑷不鍘�","value":"520622"},{"label":"鐭抽槨鍘�","value":"520623"},{"label":"鎬濆崡鍘�","value":"520624"},{"label":"鍗版睙鍦熷鏃忚嫍鏃忚嚜娌诲幙","value":"520625"},{"label":"寰锋睙鍘�","value":"520626"},{"label":"娌挎渤鍦熷鏃忚嚜娌诲幙","value":"520627"},{"label":"鏉炬鑻楁棌鑷不鍘�","value":"520628"}],[{"label":"鍏翠箟甯�","value":"522301"},{"label":"鍏翠粊鍘�","value":"522322"},{"label":"鏅畨鍘�","value":"522323"},{"label":"鏅撮殕鍘�","value":"522324"},{"label":"璐炰赴鍘�","value":"522325"},{"label":"鏈涜盁鍘�","value":"522326"},{"label":"鍐屼酣鍘�","value":"522327"},{"label":"瀹夐緳鍘�","value":"522328"}],[{"label":"鍑噷甯�","value":"522601"},{"label":"榛勫钩鍘�","value":"522622"},{"label":"鏂界鍘�","value":"522623"},{"label":"涓夌鍘�","value":"522624"},{"label":"闀囪繙鍘�","value":"522625"},{"label":"宀戝珐鍘�","value":"522626"},{"label":"澶╂煴鍘�","value":"522627"},{"label":"閿﹀睆鍘�","value":"522628"},{"label":"鍓戞渤鍘�","value":"522629"},{"label":"鍙版睙鍘�","value":"522630"},{"label":"榛庡钩鍘�","value":"522631"},{"label":"姒曟睙鍘�","value":"522632"},{"label":"浠庢睙鍘�","value":"522633"},{"label":"闆峰北鍘�","value":"522634"},{"label":"楹绘睙鍘�","value":"522635"},{"label":"涓瑰鍘�","value":"522636"}],[{"label":"閮藉寑甯�","value":"522701"},{"label":"绂忔硥甯�","value":"522702"},{"label":"鑽旀尝鍘�","value":"522722"},{"label":"璐靛畾鍘�","value":"522723"},{"label":"鐡畨鍘�","value":"522725"},{"label":"鐙北鍘�","value":"522726"},{"label":"骞冲鍘�","value":"522727"},{"label":"缃楃敻鍘�","value":"522728"},{"label":"闀块『鍘�","value":"522729"},{"label":"榫欓噷鍘�","value":"522730"},{"label":"鎯犳按鍘�","value":"522731"},{"label":"涓夐兘姘存棌鑷不鍘�","value":"522732"}]],[[{"label":"浜斿崕鍖�","value":"530102"},{"label":"鐩橀緳鍖�","value":"530103"},{"label":"瀹樻浮鍖�","value":"530111"},{"label":"瑗垮北鍖�","value":"530112"},{"label":"涓滃窛鍖�","value":"530113"},{"label":"鍛堣础鍖�","value":"530114"},{"label":"鏅嬪畞鍖�","value":"530115"},{"label":"瀵屾皯鍘�","value":"530124"},{"label":"瀹滆壇鍘�","value":"530125"},{"label":"鐭虫灄褰濇棌鑷不鍘�","value":"530126"},{"label":"宓╂槑鍘�","value":"530127"},{"label":"绂勫姖褰濇棌鑻楁棌鑷不鍘�","value":"530128"},{"label":"瀵荤敻鍥炴棌褰濇棌鑷不鍘�","value":"530129"},{"label":"瀹夊畞甯�","value":"530181"}],[{"label":"楹掗簾鍖�","value":"530302"},{"label":"娌剧泭鍖�","value":"530303"},{"label":"椹緳鍘�","value":"530321"},{"label":"闄嗚壇鍘�","value":"530322"},{"label":"甯堝畻鍘�","value":"530323"},{"label":"缃楀钩鍘�","value":"530324"},{"label":"瀵屾簮鍘�","value":"530325"},{"label":"浼氭辰鍘�","value":"530326"},{"label":"瀹e▉甯�","value":"530381"}],[{"label":"绾㈠鍖�","value":"530402"},{"label":"姹熷窛鍖�","value":"530403"},{"label":"婢勬睙鍘�","value":"530422"},{"label":"閫氭捣鍘�","value":"530423"},{"label":"鍗庡畞鍘�","value":"530424"},{"label":"鏄撻棬鍘�","value":"530425"},{"label":"宄ㄥ北褰濇棌鑷不鍘�","value":"530426"},{"label":"鏂板钩褰濇棌鍌f棌鑷不鍘�","value":"530427"},{"label":"鍏冩睙鍝堝凹鏃忓綕鏃忓偅鏃忚嚜娌诲幙","value":"530428"}],[{"label":"闅嗛槼鍖�","value":"530502"},{"label":"鏂界敻鍘�","value":"530521"},{"label":"榫欓櫟鍘�","value":"530523"},{"label":"鏄屽畞鍘�","value":"530524"},{"label":"鑵惧啿甯�","value":"530581"}],[{"label":"鏄槼鍖�","value":"530602"},{"label":"椴佺敻鍘�","value":"530621"},{"label":"宸у鍘�","value":"530622"},{"label":"鐩愭触鍘�","value":"530623"},{"label":"澶у叧鍘�","value":"530624"},{"label":"姘稿杽鍘�","value":"530625"},{"label":"缁ユ睙鍘�","value":"530626"},{"label":"闀囬泟鍘�","value":"530627"},{"label":"褰濊壇鍘�","value":"530628"},{"label":"濞佷俊鍘�","value":"530629"},{"label":"姘村瘜鍘�","value":"530630"}],[{"label":"鍙ゅ煄鍖�","value":"530702"},{"label":"鐜夐緳绾宠タ鏃忚嚜娌诲幙","value":"530721"},{"label":"姘歌儨鍘�","value":"530722"},{"label":"鍗庡潽鍘�","value":"530723"},{"label":"瀹佽挆褰濇棌鑷不鍘�","value":"530724"}],[{"label":"鎬濊寘鍖�","value":"530802"},{"label":"瀹佹幢鍝堝凹鏃忓綕鏃忚嚜娌诲幙","value":"530821"},{"label":"澧ㄦ睙鍝堝凹鏃忚嚜娌诲幙","value":"530822"},{"label":"鏅笢褰濇棌鑷不鍘�","value":"530823"},{"label":"鏅胺鍌f棌褰濇棌鑷不鍘�","value":"530824"},{"label":"闀囨矃褰濇棌鍝堝凹鏃忔媺绁滄棌鑷不鍘�","value":"530825"},{"label":"姹熷煄鍝堝凹鏃忓綕鏃忚嚜娌诲幙","value":"530826"},{"label":"瀛熻繛鍌f棌鎷夌鏃忎饯鏃忚嚜娌诲幙","value":"530827"},{"label":"婢滄钵鎷夌鏃忚嚜娌诲幙","value":"530828"},{"label":"瑗跨洘浣ゆ棌鑷不鍘�","value":"530829"}],[{"label":"涓寸繑鍖�","value":"530902"},{"label":"鍑ゅ簡鍘�","value":"530921"},{"label":"浜戝幙","value":"530922"},{"label":"姘稿痉鍘�","value":"530923"},{"label":"闀囧悍鍘�","value":"530924"},{"label":"鍙屾睙鎷夌鏃忎饯鏃忓竷鏈楁棌鍌f棌鑷不鍘�","value":"530925"},{"label":"鑰块┈鍌f棌浣ゆ棌鑷不鍘�","value":"530926"},{"label":"娌ф簮浣ゆ棌鑷不鍘�","value":"530927"}],[{"label":"妤氶泟甯�","value":"532301"},{"label":"鍙屾煆鍘�","value":"532322"},{"label":"鐗熷畾鍘�","value":"532323"},{"label":"鍗楀崕鍘�","value":"532324"},{"label":"濮氬畨鍘�","value":"532325"},{"label":"澶у鍘�","value":"532326"},{"label":"姘镐粊鍘�","value":"532327"},{"label":"鍏冭皨鍘�","value":"532328"},{"label":"姝﹀畾鍘�","value":"532329"},{"label":"绂勪赴鍘�","value":"532331"}],[{"label":"涓棫甯�","value":"532501"},{"label":"寮�杩滃競","value":"532502"},{"label":"钂欒嚜甯�","value":"532503"},{"label":"寮ュ嫆甯�","value":"532504"},{"label":"灞忚竟鑻楁棌鑷不鍘�","value":"532523"},{"label":"寤烘按鍘�","value":"532524"},{"label":"鐭冲睆鍘�","value":"532525"},{"label":"娉歌タ鍘�","value":"532527"},{"label":"鍏冮槼鍘�","value":"532528"},{"label":"绾㈡渤鍘�","value":"532529"},{"label":"閲戝钩鑻楁棌鐟舵棌鍌f棌鑷不鍘�","value":"532530"},{"label":"缁挎槬鍘�","value":"532531"},{"label":"娌冲彛鐟舵棌鑷不鍘�","value":"532532"}],[{"label":"鏂囧北甯�","value":"532601"},{"label":"鐮氬北鍘�","value":"532622"},{"label":"瑗跨暣鍘�","value":"532623"},{"label":"楹绘牀鍧″幙","value":"532624"},{"label":"椹叧鍘�","value":"532625"},{"label":"涓樺寳鍘�","value":"532626"},{"label":"骞垮崡鍘�","value":"532627"},{"label":"瀵屽畞鍘�","value":"532628"}],[{"label":"鏅椽甯�","value":"532801"},{"label":"鍕愭捣鍘�","value":"532822"},{"label":"鍕愯厞鍘�","value":"532823"}],[{"label":"澶х悊甯�","value":"532901"},{"label":"婕炬繛褰濇棌鑷不鍘�","value":"532922"},{"label":"绁ヤ簯鍘�","value":"532923"},{"label":"瀹惧窛鍘�","value":"532924"},{"label":"寮ユ浮鍘�","value":"532925"},{"label":"鍗楁锭褰濇棌鑷不鍘�","value":"532926"},{"label":"宸嶅北褰濇棌鍥炴棌鑷不鍘�","value":"532927"},{"label":"姘稿钩鍘�","value":"532928"},{"label":"浜戦緳鍘�","value":"532929"},{"label":"娲辨簮鍘�","value":"532930"},{"label":"鍓戝窛鍘�","value":"532931"},{"label":"楣ゅ簡鍘�","value":"532932"}],[{"label":"鐟炰附甯�","value":"533102"},{"label":"鑺掑競","value":"533103"},{"label":"姊佹渤鍘�","value":"533122"},{"label":"鐩堟睙鍘�","value":"533123"},{"label":"闄囧窛鍘�","value":"533124"}],[{"label":"娉告按甯�","value":"533301"},{"label":"绂忚础鍘�","value":"533323"},{"label":"璐″北鐙緳鏃忔�掓棌鑷不鍘�","value":"533324"},{"label":"鍏板潽鐧芥棌鏅背鏃忚嚜娌诲幙","value":"533325"}],[{"label":"棣欐牸閲屾媺甯�","value":"533401"},{"label":"寰烽挦鍘�","value":"533422"},{"label":"缁磋タ鍌堝兂鏃忚嚜娌诲幙","value":"533423"}]],[[{"label":"鍩庡叧鍖�","value":"540102"},{"label":"鍫嗛緳寰峰簡鍖�","value":"540103"},{"label":"鏋楀懆鍘�","value":"540121"},{"label":"褰撻泟鍘�","value":"540122"},{"label":"灏兼湪鍘�","value":"540123"},{"label":"鏇叉按鍘�","value":"540124"},{"label":"杈惧瓬鍘�","value":"540126"},{"label":"澧ㄧ宸ュ崱鍘�","value":"540127"},{"label":"鏍煎皵鏈ㄨ棌闈掑伐涓氬洯鍖�","value":"540171"},{"label":"鎷夎惃缁忔祹鎶�鏈紑鍙戝尯","value":"540172"},{"label":"瑗胯棌鏂囧寲鏃呮父鍒涙剰鍥尯","value":"540173"},{"label":"杈惧瓬宸ヤ笟鍥尯","value":"540174"}],[{"label":"妗戠彔瀛滃尯","value":"540202"},{"label":"鍗楁湪鏋楀幙","value":"540221"},{"label":"姹熷瓬鍘�","value":"540222"},{"label":"瀹氭棩鍘�","value":"540223"},{"label":"钀ㄨ喀鍘�","value":"540224"},{"label":"鎷夊瓬鍘�","value":"540225"},{"label":"鏄備粊鍘�","value":"540226"},{"label":"璋㈤�氶棬鍘�","value":"540227"},{"label":"鐧芥湕鍘�","value":"540228"},{"label":"浠佸竷鍘�","value":"540229"},{"label":"搴烽┈鍘�","value":"540230"},{"label":"瀹氱粨鍘�","value":"540231"},{"label":"浠插反鍘�","value":"540232"},{"label":"浜氫笢鍘�","value":"540233"},{"label":"鍚夐殕鍘�","value":"540234"},{"label":"鑱傛媺鏈ㄥ幙","value":"540235"},{"label":"钀ㄥ槑鍘�","value":"540236"},{"label":"宀楀反鍘�","value":"540237"}],[{"label":"鍗¤嫢鍖�","value":"540302"},{"label":"姹熻揪鍘�","value":"540321"},{"label":"璐¤鍘�","value":"540322"},{"label":"绫讳箤榻愬幙","value":"540323"},{"label":"涓侀潚鍘�","value":"540324"},{"label":"瀵熼泤鍘�","value":"540325"},{"label":"鍏鍘�","value":"540326"},{"label":"宸﹁础鍘�","value":"540327"},{"label":"鑺掑悍鍘�","value":"540328"},{"label":"娲涢殕鍘�","value":"540329"},{"label":"杈瑰潩鍘�","value":"540330"}],[{"label":"宸村疁鍖�","value":"540402"},{"label":"宸ュ竷姹熻揪鍘�","value":"540421"},{"label":"绫虫灄鍘�","value":"540422"},{"label":"澧ㄨ劚鍘�","value":"540423"},{"label":"娉㈠瘑鍘�","value":"540424"},{"label":"瀵熼殔鍘�","value":"540425"},{"label":"鏈楀幙","value":"540426"}],[{"label":"涔冧笢鍖�","value":"540502"},{"label":"鎵庡泭鍘�","value":"540521"},{"label":"璐″槑鍘�","value":"540522"},{"label":"妗戞棩鍘�","value":"540523"},{"label":"鐞肩粨鍘�","value":"540524"},{"label":"鏇叉澗鍘�","value":"540525"},{"label":"鎺編鍘�","value":"540526"},{"label":"娲涙墡鍘�","value":"540527"},{"label":"鍔犳煡鍘�","value":"540528"},{"label":"闅嗗瓙鍘�","value":"540529"},{"label":"閿欓偅鍘�","value":"540530"},{"label":"娴崱瀛愬幙","value":"540531"}],[{"label":"閭f洸鍘�","value":"542421"},{"label":"鍢夐粠鍘�","value":"542422"},{"label":"姣斿鍘�","value":"542423"},{"label":"鑱傝崳鍘�","value":"542424"},{"label":"瀹夊鍘�","value":"542425"},{"label":"鐢虫墡鍘�","value":"542426"},{"label":"绱㈠幙","value":"542427"},{"label":"鐝垐鍘�","value":"542428"},{"label":"宸撮潚鍘�","value":"542429"},{"label":"灏肩帥鍘�","value":"542430"},{"label":"鍙屾箹鍘�","value":"542431"}],[{"label":"鏅叞鍘�","value":"542521"},{"label":"鏈揪鍘�","value":"542522"},{"label":"鍣跺皵鍘�","value":"542523"},{"label":"鏃ュ湡鍘�","value":"542524"},{"label":"闈╁悏鍘�","value":"542525"},{"label":"鏀瑰垯鍘�","value":"542526"},{"label":"鎺嫟鍘�","value":"542527"}]],[[{"label":"鏂板煄鍖�","value":"610102"},{"label":"纰戞灄鍖�","value":"610103"},{"label":"鑾叉箹鍖�","value":"610104"},{"label":"鐏炴ˉ鍖�","value":"610111"},{"label":"鏈ぎ鍖�","value":"610112"},{"label":"闆佸鍖�","value":"610113"},{"label":"闃庤壇鍖�","value":"610114"},{"label":"涓存郊鍖�","value":"610115"},{"label":"闀垮畨鍖�","value":"610116"},{"label":"楂橀櫟鍖�","value":"610117"},{"label":"閯犻倯鍖�","value":"610118"},{"label":"钃濈敯鍘�","value":"610122"},{"label":"鍛ㄨ嚦鍘�","value":"610124"}],[{"label":"鐜嬬泭鍖�","value":"610202"},{"label":"鍗板彴鍖�","value":"610203"},{"label":"鑰�宸炲尯","value":"610204"},{"label":"瀹滃悰鍘�","value":"610222"}],[{"label":"娓花鍖�","value":"610302"},{"label":"閲戝彴鍖�","value":"610303"},{"label":"闄堜粨鍖�","value":"610304"},{"label":"鍑ょ繑鍘�","value":"610322"},{"label":"宀愬北鍘�","value":"610323"},{"label":"鎵堕鍘�","value":"610324"},{"label":"鐪夊幙","value":"610326"},{"label":"闄囧幙","value":"610327"},{"label":"鍗冮槼鍘�","value":"610328"},{"label":"楹熸父鍘�","value":"610329"},{"label":"鍑ゅ幙","value":"610330"},{"label":"澶櫧鍘�","value":"610331"}],[{"label":"绉﹂兘鍖�","value":"610402"},{"label":"鏉ㄩ櫟鍖�","value":"610403"},{"label":"娓煄鍖�","value":"610404"},{"label":"涓夊師鍘�","value":"610422"},{"label":"娉鹃槼鍘�","value":"610423"},{"label":"涔惧幙","value":"610424"},{"label":"绀兼硥鍘�","value":"610425"},{"label":"姘稿鍘�","value":"610426"},{"label":"褰幙","value":"610427"},{"label":"闀挎鍘�","value":"610428"},{"label":"鏃倯鍘�","value":"610429"},{"label":"娣冲寲鍘�","value":"610430"},{"label":"姝﹀姛鍘�","value":"610431"},{"label":"鍏村钩甯�","value":"610481"}],[{"label":"涓存腑鍖�","value":"610502"},{"label":"鍗庡窞鍖�","value":"610503"},{"label":"娼煎叧鍘�","value":"610522"},{"label":"澶ц崝鍘�","value":"610523"},{"label":"鍚堥槼鍘�","value":"610524"},{"label":"婢勫煄鍘�","value":"610525"},{"label":"钂插煄鍘�","value":"610526"},{"label":"鐧芥按鍘�","value":"610527"},{"label":"瀵屽钩鍘�","value":"610528"},{"label":"闊╁煄甯�","value":"610581"},{"label":"鍗庨槾甯�","value":"610582"}],[{"label":"瀹濆鍖�","value":"610602"},{"label":"瀹夊鍖�","value":"610603"},{"label":"寤堕暱鍘�","value":"610621"},{"label":"寤跺窛鍘�","value":"610622"},{"label":"瀛愰暱鍘�","value":"610623"},{"label":"蹇椾腹鍘�","value":"610625"},{"label":"鍚磋捣鍘�","value":"610626"},{"label":"鐢樻硥鍘�","value":"610627"},{"label":"瀵屽幙","value":"610628"},{"label":"娲涘窛鍘�","value":"610629"},{"label":"瀹滃窛鍘�","value":"610630"},{"label":"榛勯緳鍘�","value":"610631"},{"label":"榛勯櫟鍘�","value":"610632"}],[{"label":"姹夊彴鍖�","value":"610702"},{"label":"鍗楅儜鍖�","value":"610703"},{"label":"鍩庡浐鍘�","value":"610722"},{"label":"娲嬪幙","value":"610723"},{"label":"瑗夸埂鍘�","value":"610724"},{"label":"鍕夊幙","value":"610725"},{"label":"瀹佸己鍘�","value":"610726"},{"label":"鐣ラ槼鍘�","value":"610727"},{"label":"闀囧反鍘�","value":"610728"},{"label":"鐣欏潩鍘�","value":"610729"},{"label":"浣涘潽鍘�","value":"610730"}],[{"label":"姒嗛槼鍖�","value":"610802"},{"label":"妯北鍖�","value":"610803"},{"label":"搴滆胺鍘�","value":"610822"},{"label":"闈栬竟鍘�","value":"610824"},{"label":"瀹氳竟鍘�","value":"610825"},{"label":"缁ュ痉鍘�","value":"610826"},{"label":"绫宠剛鍘�","value":"610827"},{"label":"浣冲幙","value":"610828"},{"label":"鍚村牎鍘�","value":"610829"},{"label":"娓呮锭鍘�","value":"610830"},{"label":"瀛愭床鍘�","value":"610831"},{"label":"绁炴湪甯�","value":"610881"}],[{"label":"姹夋花鍖�","value":"610902"},{"label":"姹夐槾鍘�","value":"610921"},{"label":"鐭虫硥鍘�","value":"610922"},{"label":"瀹侀檿鍘�","value":"610923"},{"label":"绱槼鍘�","value":"610924"},{"label":"宀氱殝鍘�","value":"610925"},{"label":"骞冲埄鍘�","value":"610926"},{"label":"闀囧潽鍘�","value":"610927"},{"label":"鏃槼鍘�","value":"610928"},{"label":"鐧芥渤鍘�","value":"610929"}],[{"label":"鍟嗗窞鍖�","value":"611002"},{"label":"娲涘崡鍘�","value":"611021"},{"label":"涓瑰嚖鍘�","value":"611022"},{"label":"鍟嗗崡鍘�","value":"611023"},{"label":"灞遍槼鍘�","value":"611024"},{"label":"闀囧畨鍘�","value":"611025"},{"label":"鏌炴按鍘�","value":"611026"}]],[[{"label":"鍩庡叧鍖�","value":"620102"},{"label":"涓冮噷娌冲尯","value":"620103"},{"label":"瑗垮浐鍖�","value":"620104"},{"label":"瀹夊畞鍖�","value":"620105"},{"label":"绾㈠彜鍖�","value":"620111"},{"label":"姘哥櫥鍘�","value":"620121"},{"label":"鐨嬪叞鍘�","value":"620122"},{"label":"姒嗕腑鍘�","value":"620123"},{"label":"鍏板窞鏂板尯","value":"620171"}],[{"label":"鍢夊唱鍏冲競","value":"620201"}],[{"label":"閲戝窛鍖�","value":"620302"},{"label":"姘告槍鍘�","value":"620321"}],[{"label":"鐧介摱鍖�","value":"620402"},{"label":"骞冲窛鍖�","value":"620403"},{"label":"闈栬繙鍘�","value":"620421"},{"label":"浼氬畞鍘�","value":"620422"},{"label":"鏅嘲鍘�","value":"620423"}],[{"label":"绉﹀窞鍖�","value":"620502"},{"label":"楹︾Н鍖�","value":"620503"},{"label":"娓呮按鍘�","value":"620521"},{"label":"绉﹀畨鍘�","value":"620522"},{"label":"鐢樿胺鍘�","value":"620523"},{"label":"姝﹀北鍘�","value":"620524"},{"label":"寮犲宸濆洖鏃忚嚜娌诲幙","value":"620525"}],[{"label":"鍑夊窞鍖�","value":"620602"},{"label":"姘戝嫟鍘�","value":"620621"},{"label":"鍙ゆ氮鍘�","value":"620622"},{"label":"澶╃钘忔棌鑷不鍘�","value":"620623"}],[{"label":"鐢樺窞鍖�","value":"620702"},{"label":"鑲冨崡瑁曞浐鏃忚嚜娌诲幙","value":"620721"},{"label":"姘戜箰鍘�","value":"620722"},{"label":"涓存辰鍘�","value":"620723"},{"label":"楂樺彴鍘�","value":"620724"},{"label":"灞变腹鍘�","value":"620725"}],[{"label":"宕嗗硳鍖�","value":"620802"},{"label":"娉惧窛鍘�","value":"620821"},{"label":"鐏靛彴鍘�","value":"620822"},{"label":"宕囦俊鍘�","value":"620823"},{"label":"鍗庝涵鍘�","value":"620824"},{"label":"搴勬氮鍘�","value":"620825"},{"label":"闈欏畞鍘�","value":"620826"},{"label":"骞冲噳宸ヤ笟鍥尯","value":"620871"}],[{"label":"鑲冨窞鍖�","value":"620902"},{"label":"閲戝鍘�","value":"620921"},{"label":"鐡滃窞鍘�","value":"620922"},{"label":"鑲冨寳钂欏彜鏃忚嚜娌诲幙","value":"620923"},{"label":"闃垮厠濉炲搱钀ㄥ厠鏃忚嚜娌诲幙","value":"620924"},{"label":"鐜夐棬甯�","value":"620981"},{"label":"鏁︾厡甯�","value":"620982"}],[{"label":"瑗垮嘲鍖�","value":"621002"},{"label":"搴嗗煄鍘�","value":"621021"},{"label":"鐜幙","value":"621022"},{"label":"鍗庢睜鍘�","value":"621023"},{"label":"鍚堟按鍘�","value":"621024"},{"label":"姝e畞鍘�","value":"621025"},{"label":"瀹佸幙","value":"621026"},{"label":"闀囧師鍘�","value":"621027"}],[{"label":"瀹夊畾鍖�","value":"621102"},{"label":"閫氭腑鍘�","value":"621121"},{"label":"闄囪タ鍘�","value":"621122"},{"label":"娓簮鍘�","value":"621123"},{"label":"涓存串鍘�","value":"621124"},{"label":"婕冲幙","value":"621125"},{"label":"宀峰幙","value":"621126"}],[{"label":"姝﹂兘鍖�","value":"621202"},{"label":"鎴愬幙","value":"621221"},{"label":"鏂囧幙","value":"621222"},{"label":"瀹曟槍鍘�","value":"621223"},{"label":"搴峰幙","value":"621224"},{"label":"瑗垮拰鍘�","value":"621225"},{"label":"绀煎幙","value":"621226"},{"label":"寰藉幙","value":"621227"},{"label":"涓ゅ綋鍘�","value":"621228"}],[{"label":"涓村甯�","value":"622901"},{"label":"涓村鍘�","value":"622921"},{"label":"搴蜂箰鍘�","value":"622922"},{"label":"姘搁潠鍘�","value":"622923"},{"label":"骞挎渤鍘�","value":"622924"},{"label":"鍜屾斂鍘�","value":"622925"},{"label":"涓滀埂鏃忚嚜娌诲幙","value":"622926"},{"label":"绉煶灞变繚瀹夋棌涓滀埂鏃忔拻鎷夋棌鑷不鍘�","value":"622927"}],[{"label":"鍚堜綔甯�","value":"623001"},{"label":"涓存江鍘�","value":"623021"},{"label":"鍗撳凹鍘�","value":"623022"},{"label":"鑸熸洸鍘�","value":"623023"},{"label":"杩儴鍘�","value":"623024"},{"label":"鐜涙洸鍘�","value":"623025"},{"label":"纰屾洸鍘�","value":"623026"},{"label":"澶忔渤鍘�","value":"623027"}]],[[{"label":"鍩庝笢鍖�","value":"630102"},{"label":"鍩庝腑鍖�","value":"630103"},{"label":"鍩庤タ鍖�","value":"630104"},{"label":"鍩庡寳鍖�","value":"630105"},{"label":"澶ч�氬洖鏃忓湡鏃忚嚜娌诲幙","value":"630121"},{"label":"婀熶腑鍘�","value":"630122"},{"label":"婀熸簮鍘�","value":"630123"}],[{"label":"涔愰兘鍖�","value":"630202"},{"label":"骞冲畨鍖�","value":"630203"},{"label":"姘戝拰鍥炴棌鍦熸棌鑷不鍘�","value":"630222"},{"label":"浜掑姪鍦熸棌鑷不鍘�","value":"630223"},{"label":"鍖栭殕鍥炴棌鑷不鍘�","value":"630224"},{"label":"寰寲鎾掓媺鏃忚嚜娌诲幙","value":"630225"}],[{"label":"闂ㄦ簮鍥炴棌鑷不鍘�","value":"632221"},{"label":"绁佽繛鍘�","value":"632222"},{"label":"娴锋檹鍘�","value":"632223"},{"label":"鍒氬療鍘�","value":"632224"}],[{"label":"鍚屼粊鍘�","value":"632321"},{"label":"灏栨墡鍘�","value":"632322"},{"label":"娉藉簱鍘�","value":"632323"},{"label":"娌冲崡钂欏彜鏃忚嚜娌诲幙","value":"632324"}],[{"label":"鍏卞拰鍘�","value":"632521"},{"label":"鍚屽痉鍘�","value":"632522"},{"label":"璐靛痉鍘�","value":"632523"},{"label":"鍏存捣鍘�","value":"632524"},{"label":"璐靛崡鍘�","value":"632525"}],[{"label":"鐜涙瞾鍘�","value":"632621"},{"label":"鐝帥鍘�","value":"632622"},{"label":"鐢樺痉鍘�","value":"632623"},{"label":"杈炬棩鍘�","value":"632624"},{"label":"涔呮不鍘�","value":"632625"},{"label":"鐜涘鍘�","value":"632626"}],[{"label":"鐜夋爲甯�","value":"632701"},{"label":"鏉傚鍘�","value":"632722"},{"label":"绉板鍘�","value":"632723"},{"label":"娌诲鍘�","value":"632724"},{"label":"鍥婅唉鍘�","value":"632725"},{"label":"鏇查夯鑾卞幙","value":"632726"}],[{"label":"鏍煎皵鏈ㄥ競","value":"632801"},{"label":"寰蜂护鍝堝競","value":"632802"},{"label":"涔屽叞鍘�","value":"632821"},{"label":"閮藉叞鍘�","value":"632822"},{"label":"澶╁郴鍘�","value":"632823"},{"label":"澶ф煷鏃﹁鏀垮鍛樹細","value":"632857"},{"label":"鍐锋箹琛屾斂濮斿憳浼�","value":"632858"},{"label":"鑼礀琛屾斂濮斿憳浼�","value":"632859"}]],[[{"label":"鍏村簡鍖�","value":"640104"},{"label":"瑗垮鍖�","value":"640105"},{"label":"閲戝嚖鍖�","value":"640106"},{"label":"姘稿畞鍘�","value":"640121"},{"label":"璐哄叞鍘�","value":"640122"},{"label":"鐏垫甯�","value":"640181"}],[{"label":"澶ф鍙e尯","value":"640202"},{"label":"鎯犲啘鍖�","value":"640205"},{"label":"骞崇綏鍘�","value":"640221"}],[{"label":"鍒╅�氬尯","value":"640302"},{"label":"绾㈠鍫″尯","value":"640303"},{"label":"鐩愭睜鍘�","value":"640323"},{"label":"鍚屽績鍘�","value":"640324"},{"label":"闈掗摐宄″競","value":"640381"}],[{"label":"鍘熷窞鍖�","value":"640402"},{"label":"瑗垮悏鍘�","value":"640422"},{"label":"闅嗗痉鍘�","value":"640423"},{"label":"娉炬簮鍘�","value":"640424"},{"label":"褰槼鍘�","value":"640425"}],[{"label":"娌欏潯澶村尯","value":"640502"},{"label":"涓畞鍘�","value":"640521"},{"label":"娴峰師鍘�","value":"640522"}]],[[{"label":"澶╁北鍖�","value":"650102"},{"label":"娌欎緷宸村厠鍖�","value":"650103"},{"label":"鏂板競鍖�","value":"650104"},{"label":"姘寸(娌熷尯","value":"650105"},{"label":"澶村悲娌冲尯","value":"650106"},{"label":"杈惧潅鍩庡尯","value":"650107"},{"label":"绫充笢鍖�","value":"650109"},{"label":"涔岄瞾鏈ㄩ綈鍘�","value":"650121"},{"label":"涔岄瞾鏈ㄩ綈缁忔祹鎶�鏈紑鍙戝尯","value":"650171"},{"label":"涔岄瞾鏈ㄩ綈楂樻柊鎶�鏈骇涓氬紑鍙戝尯","value":"650172"}],[{"label":"鐙北瀛愬尯","value":"650202"},{"label":"鍏嬫媺鐜涗緷鍖�","value":"650203"},{"label":"鐧界⒈婊╁尯","value":"650204"},{"label":"涔屽皵绂惧尯","value":"650205"}],[{"label":"楂樻槍鍖�","value":"650402"},{"label":"閯杽鍘�","value":"650421"},{"label":"鎵樺厠閫婂幙","value":"650422"}],[{"label":"浼婂窞鍖�","value":"650502"},{"label":"宸撮噷鍧ゅ搱钀ㄥ厠鑷不鍘�","value":"650521"},{"label":"浼婂惥鍘�","value":"650522"}],[{"label":"鏄屽悏甯�","value":"652301"},{"label":"闃滃悍甯�","value":"652302"},{"label":"鍛煎浘澹佸幙","value":"652323"},{"label":"鐜涚撼鏂幙","value":"652324"},{"label":"濂囧彴鍘�","value":"652325"},{"label":"鍚夋湪钀ㄥ皵鍘�","value":"652327"},{"label":"鏈ㄥ瀿鍝堣惃鍏嬭嚜娌诲幙","value":"652328"}],[{"label":"鍗氫箰甯�","value":"652701"},{"label":"闃挎媺灞卞彛甯�","value":"652702"},{"label":"绮炬渤鍘�","value":"652722"},{"label":"娓╂硥鍘�","value":"652723"}],[{"label":"搴撳皵鍕掑競","value":"652801"},{"label":"杞彴鍘�","value":"652822"},{"label":"灏夌妬鍘�","value":"652823"},{"label":"鑻ョ緦鍘�","value":"652824"},{"label":"涓旀湯鍘�","value":"652825"},{"label":"鐒夎�嗗洖鏃忚嚜娌诲幙","value":"652826"},{"label":"鍜岄潤鍘�","value":"652827"},{"label":"鍜岀鍘�","value":"652828"},{"label":"鍗氭箹鍘�","value":"652829"},{"label":"搴撳皵鍕掔粡娴庢妧鏈紑鍙戝尯","value":"652871"}],[{"label":"闃垮厠鑻忓競","value":"652901"},{"label":"娓╁鍘�","value":"652922"},{"label":"搴撹溅鍘�","value":"652923"},{"label":"娌欓泤鍘�","value":"652924"},{"label":"鏂板拰鍘�","value":"652925"},{"label":"鎷滃煄鍘�","value":"652926"},{"label":"涔屼粈鍘�","value":"652927"},{"label":"闃跨摝鎻愬幙","value":"652928"},{"label":"鏌潽鍘�","value":"652929"}],[{"label":"闃垮浘浠�甯�","value":"653001"},{"label":"闃垮厠闄跺幙","value":"653022"},{"label":"闃垮悎濂囧幙","value":"653023"},{"label":"涔屾伆鍘�","value":"653024"}],[{"label":"鍠�浠�甯�","value":"653101"},{"label":"鐤忛檮鍘�","value":"653121"},{"label":"鐤忓嫆鍘�","value":"653122"},{"label":"鑻卞悏娌欏幙","value":"653123"},{"label":"娉芥櫘鍘�","value":"653124"},{"label":"鑾庤溅鍘�","value":"653125"},{"label":"鍙跺煄鍘�","value":"653126"},{"label":"楹︾洊鎻愬幙","value":"653127"},{"label":"宀虫櫘婀栧幙","value":"653128"},{"label":"浼藉笀鍘�","value":"653129"},{"label":"宸存鍘�","value":"653130"},{"label":"濉斾粈搴撳皵骞插鍚夊厠鑷不鍘�","value":"653131"}],[{"label":"鍜岀敯甯�","value":"653201"},{"label":"鍜岀敯鍘�","value":"653221"},{"label":"澧ㄧ帀鍘�","value":"653222"},{"label":"鐨北鍘�","value":"653223"},{"label":"娲涙郸鍘�","value":"653224"},{"label":"绛栧嫆鍘�","value":"653225"},{"label":"浜庣敯鍘�","value":"653226"},{"label":"姘戜赴鍘�","value":"653227"}],[{"label":"浼婂畞甯�","value":"654002"},{"label":"濂庡悲甯�","value":"654003"},{"label":"闇嶅皵鏋滄柉甯�","value":"654004"},{"label":"浼婂畞鍘�","value":"654021"},{"label":"瀵熷竷鏌ュ皵閿′集鑷不鍘�","value":"654022"},{"label":"闇嶅煄鍘�","value":"654023"},{"label":"宸╃暀鍘�","value":"654024"},{"label":"鏂版簮鍘�","value":"654025"},{"label":"鏄嫃鍘�","value":"654026"},{"label":"鐗瑰厠鏂幙","value":"654027"},{"label":"灏煎嫆鍏嬪幙","value":"654028"}],[{"label":"濉斿煄甯�","value":"654201"},{"label":"涔岃嫃甯�","value":"654202"},{"label":"棰濇晱鍘�","value":"654221"},{"label":"娌欐咕鍘�","value":"654223"},{"label":"鎵橀噷鍘�","value":"654224"},{"label":"瑁曟皯鍘�","value":"654225"},{"label":"鍜屽竷鍏嬭禌灏旇挋鍙よ嚜娌诲幙","value":"654226"}],[{"label":"闃垮嫆娉板競","value":"654301"},{"label":"甯冨皵娲ュ幙","value":"654321"},{"label":"瀵岃暣鍘�","value":"654322"},{"label":"绂忔捣鍘�","value":"654323"},{"label":"鍝堝反娌冲幙","value":"654324"},{"label":"闈掓渤鍘�","value":"654325"},{"label":"鍚夋湪涔冨幙","value":"654326"}],[{"label":"鐭虫渤瀛愬競","value":"659001"},{"label":"闃挎媺灏斿競","value":"659002"},{"label":"鍥炬湪鑸掑厠甯�","value":"659003"},{"label":"浜斿娓犲競","value":"659004"},{"label":"閾侀棬鍏冲競","value":"659006"}]],[[{"label":"鍙板寳","value":"660101"}],[{"label":"楂橀泟","value":"660201"}],[{"label":"鍩洪殕","value":"660301"}],[{"label":"鍙颁腑","value":"660401"}],[{"label":"鍙板崡","value":"660501"}],[{"label":"鏂扮","value":"660601"}],[{"label":"鍢変箟","value":"660701"}],[{"label":"瀹滃叞","value":"660801"}],[{"label":"妗冨洯","value":"660901"}],[{"label":"鑻楁牀","value":"661001"}],[{"label":"褰板寲","value":"661101"}],[{"label":"鍗楁姇","value":"661201"}],[{"label":"浜戞灄","value":"661301"}],[{"label":"灞忎笢","value":"661401"}],[{"label":"鍙颁笢","value":"661501"}],[{"label":"鑺辫幉","value":"661601"}],[{"label":"婢庢箹","value":"661701"}]],[[{"label":"棣欐腐宀�","value":"670101"}],[{"label":"涔濋緳","value":"670201"}],[{"label":"鏂扮晫","value":"670301"}]],[[{"label":"婢抽棬鍗婂矝","value":"680101"}],[{"label":"姘逛粩宀�","value":"680201"}],[{"label":"璺幆宀�","value":"680301"}],[{"label":"璺肮鍩�","value":"680401"}]]];export default areaData;
\ No newline at end of file
diff --git a/uview-ui/libs/util/async-validator.js b/uview-ui/libs/util/async-validator.js
new file mode 100644
index 0000000..d7215b9
--- /dev/null
+++ b/uview-ui/libs/util/async-validator.js
@@ -0,0 +1,1356 @@
+function _extends() {
+	_extends = Object.assign || function(target) {
+		for (var i = 1; i < arguments.length; i++) {
+			var source = arguments[i];
+
+			for (var key in source) {
+				if (Object.prototype.hasOwnProperty.call(source, key)) {
+					target[key] = source[key];
+				}
+			}
+		}
+
+		return target;
+	};
+
+	return _extends.apply(this, arguments);
+}
+
+/* eslint no-console:0 */
+var formatRegExp = /%[sdj%]/g;
+var warning = function warning() {}; // don't print warning message when in production env or node runtime
+
+if (typeof process !== 'undefined' && process.env && process.env.NODE_ENV !== 'production' && typeof window !==
+	'undefined' && typeof document !== 'undefined') {
+	warning = function warning(type, errors) {
+		if (typeof console !== 'undefined' && console.warn) {
+			if (errors.every(function(e) {
+					return typeof e === 'string';
+				})) {
+				console.warn(type, errors);
+			}
+		}
+	};
+}
+
+function convertFieldsError(errors) {
+	if (!errors || !errors.length) return null;
+	var fields = {};
+	errors.forEach(function(error) {
+		var field = error.field;
+		fields[field] = fields[field] || [];
+		fields[field].push(error);
+	});
+	return fields;
+}
+
+function format() {
+	for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+		args[_key] = arguments[_key];
+	}
+
+	var i = 1;
+	var f = args[0];
+	var len = args.length;
+
+	if (typeof f === 'function') {
+		return f.apply(null, args.slice(1));
+	}
+
+	if (typeof f === 'string') {
+		var str = String(f).replace(formatRegExp, function(x) {
+			if (x === '%%') {
+				return '%';
+			}
+
+			if (i >= len) {
+				return x;
+			}
+
+			switch (x) {
+				case '%s':
+					return String(args[i++]);
+
+				case '%d':
+					return Number(args[i++]);
+
+				case '%j':
+					try {
+						return JSON.stringify(args[i++]);
+					} catch (_) {
+						return '[Circular]';
+					}
+
+					break;
+
+				default:
+					return x;
+			}
+		});
+
+		for (var arg = args[i]; i < len; arg = args[++i]) {
+			str += " " + arg;
+		}
+
+		return str;
+	}
+
+	return f;
+}
+
+function isNativeStringType(type) {
+	return type === 'string' || type === 'url' || type === 'hex' || type === 'email' || type === 'pattern';
+}
+
+function isEmptyValue(value, type) {
+	if (value === undefined || value === null) {
+		return true;
+	}
+
+	if (type === 'array' && Array.isArray(value) && !value.length) {
+		return true;
+	}
+
+	if (isNativeStringType(type) && typeof value === 'string' && !value) {
+		return true;
+	}
+
+	return false;
+}
+
+function asyncParallelArray(arr, func, callback) {
+	var results = [];
+	var total = 0;
+	var arrLength = arr.length;
+
+	function count(errors) {
+		results.push.apply(results, errors);
+		total++;
+
+		if (total === arrLength) {
+			callback(results);
+		}
+	}
+
+	arr.forEach(function(a) {
+		func(a, count);
+	});
+}
+
+function asyncSerialArray(arr, func, callback) {
+	var index = 0;
+	var arrLength = arr.length;
+
+	function next(errors) {
+		if (errors && errors.length) {
+			callback(errors);
+			return;
+		}
+
+		var original = index;
+		index = index + 1;
+
+		if (original < arrLength) {
+			func(arr[original], next);
+		} else {
+			callback([]);
+		}
+	}
+
+	next([]);
+}
+
+function flattenObjArr(objArr) {
+	var ret = [];
+	Object.keys(objArr).forEach(function(k) {
+		ret.push.apply(ret, objArr[k]);
+	});
+	return ret;
+}
+
+function asyncMap(objArr, option, func, callback) {
+	if (option.first) {
+		var _pending = new Promise(function(resolve, reject) {
+			var next = function next(errors) {
+				callback(errors);
+				return errors.length ? reject({
+					errors: errors,
+					fields: convertFieldsError(errors)
+				}) : resolve();
+			};
+
+			var flattenArr = flattenObjArr(objArr);
+			asyncSerialArray(flattenArr, func, next);
+		});
+
+		_pending["catch"](function(e) {
+			return e;
+		});
+
+		return _pending;
+	}
+
+	var firstFields = option.firstFields || [];
+
+	if (firstFields === true) {
+		firstFields = Object.keys(objArr);
+	}
+
+	var objArrKeys = Object.keys(objArr);
+	var objArrLength = objArrKeys.length;
+	var total = 0;
+	var results = [];
+	var pending = new Promise(function(resolve, reject) {
+		var next = function next(errors) {
+			results.push.apply(results, errors);
+			total++;
+
+			if (total === objArrLength) {
+				callback(results);
+				return results.length ? reject({
+					errors: results,
+					fields: convertFieldsError(results)
+				}) : resolve();
+			}
+		};
+
+		if (!objArrKeys.length) {
+			callback(results);
+			resolve();
+		}
+
+		objArrKeys.forEach(function(key) {
+			var arr = objArr[key];
+
+			if (firstFields.indexOf(key) !== -1) {
+				asyncSerialArray(arr, func, next);
+			} else {
+				asyncParallelArray(arr, func, next);
+			}
+		});
+	});
+	pending["catch"](function(e) {
+		return e;
+	});
+	return pending;
+}
+
+function complementError(rule) {
+	return function(oe) {
+		if (oe && oe.message) {
+			oe.field = oe.field || rule.fullField;
+			return oe;
+		}
+
+		return {
+			message: typeof oe === 'function' ? oe() : oe,
+			field: oe.field || rule.fullField
+		};
+	};
+}
+
+function deepMerge(target, source) {
+	if (source) {
+		for (var s in source) {
+			if (source.hasOwnProperty(s)) {
+				var value = source[s];
+
+				if (typeof value === 'object' && typeof target[s] === 'object') {
+					target[s] = _extends({}, target[s], {}, value);
+				} else {
+					target[s] = value;
+				}
+			}
+		}
+	}
+
+	return target;
+}
+
+/**
+ *  Rule for validating required fields.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function required(rule, value, source, errors, options, type) {
+	if (rule.required && (!source.hasOwnProperty(rule.field) || isEmptyValue(value, type || rule.type))) {
+		errors.push(format(options.messages.required, rule.fullField));
+	}
+}
+
+/**
+ *  Rule for validating whitespace.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function whitespace(rule, value, source, errors, options) {
+	if (/^\s+$/.test(value) || value === '') {
+		errors.push(format(options.messages.whitespace, rule.fullField));
+	}
+}
+
+/* eslint max-len:0 */
+
+var pattern = {
+	// http://emailregex.com/
+	email: /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/,
+	url: new RegExp(
+		"^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$",
+		'i'),
+	hex: /^#?([a-f0-9]{6}|[a-f0-9]{3})$/i
+};
+var types = {
+	integer: function integer(value) {
+		return types.number(value) && parseInt(value, 10) === value;
+	},
+	"float": function float(value) {
+		return types.number(value) && !types.integer(value);
+	},
+	array: function array(value) {
+		return Array.isArray(value);
+	},
+	regexp: function regexp(value) {
+		if (value instanceof RegExp) {
+			return true;
+		}
+
+		try {
+			return !!new RegExp(value);
+		} catch (e) {
+			return false;
+		}
+	},
+	date: function date(value) {
+		return typeof value.getTime === 'function' && typeof value.getMonth === 'function' && typeof value.getYear ===
+			'function';
+	},
+	number: function number(value) {
+		if (isNaN(value)) {
+			return false;
+		}
+
+		// 淇敼婧愮爜锛屽皢瀛楃涓叉暟鍊煎厛杞负鏁板��
+		return typeof +value === 'number';
+	},
+	object: function object(value) {
+		return typeof value === 'object' && !types.array(value);
+	},
+	method: function method(value) {
+		return typeof value === 'function';
+	},
+	email: function email(value) {
+		return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255;
+	},
+	url: function url(value) {
+		return typeof value === 'string' && !!value.match(pattern.url);
+	},
+	hex: function hex(value) {
+		return typeof value === 'string' && !!value.match(pattern.hex);
+	}
+};
+/**
+ *  Rule for validating the type of a value.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function type(rule, value, source, errors, options) {
+	if (rule.required && value === undefined) {
+		required(rule, value, source, errors, options);
+		return;
+	}
+
+	var custom = ['integer', 'float', 'array', 'regexp', 'object', 'method', 'email', 'number', 'date', 'url', 'hex'];
+	var ruleType = rule.type;
+
+	if (custom.indexOf(ruleType) > -1) {
+		if (!types[ruleType](value)) {
+			errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
+		} // straight typeof check
+
+	} else if (ruleType && typeof value !== rule.type) {
+		errors.push(format(options.messages.types[ruleType], rule.fullField, rule.type));
+	}
+}
+
+/**
+ *  Rule for validating minimum and maximum allowed values.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function range(rule, value, source, errors, options) {
+	var len = typeof rule.len === 'number';
+	var min = typeof rule.min === 'number';
+	var max = typeof rule.max === 'number'; // 姝e垯鍖归厤鐮佺偣鑼冨洿浠嶶+010000涓�鐩村埌U+10FFFF鐨勬枃瀛楋紙琛ュ厖骞抽潰Supplementary Plane锛�
+
+	var spRegexp = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+	var val = value;
+	var key = null;
+	var num = typeof value === 'number';
+	var str = typeof value === 'string';
+	var arr = Array.isArray(value);
+
+	if (num) {
+		key = 'number';
+	} else if (str) {
+		key = 'string';
+	} else if (arr) {
+		key = 'array';
+	} // if the value is not of a supported type for range validation
+	// the validation rule rule should use the
+	// type property to also test for a particular type
+
+
+	if (!key) {
+		return false;
+	}
+
+	if (arr) {
+		val = value.length;
+	}
+
+	if (str) {
+		// 澶勭悊鐮佺偣澶т簬U+010000鐨勬枃瀛條ength灞炴�т笉鍑嗙‘鐨刡ug锛屽"馉馉馉".lenght !== 3
+		val = value.replace(spRegexp, '_').length;
+	}
+
+	if (len) {
+		if (val !== rule.len) {
+			errors.push(format(options.messages[key].len, rule.fullField, rule.len));
+		}
+	} else if (min && !max && val < rule.min) {
+		errors.push(format(options.messages[key].min, rule.fullField, rule.min));
+	} else if (max && !min && val > rule.max) {
+		errors.push(format(options.messages[key].max, rule.fullField, rule.max));
+	} else if (min && max && (val < rule.min || val > rule.max)) {
+		errors.push(format(options.messages[key].range, rule.fullField, rule.min, rule.max));
+	}
+}
+
+var ENUM = 'enum';
+/**
+ *  Rule for validating a value exists in an enumerable list.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function enumerable(rule, value, source, errors, options) {
+	rule[ENUM] = Array.isArray(rule[ENUM]) ? rule[ENUM] : [];
+
+	if (rule[ENUM].indexOf(value) === -1) {
+		errors.push(format(options.messages[ENUM], rule.fullField, rule[ENUM].join(', ')));
+	}
+}
+
+/**
+ *  Rule for validating a regular expression pattern.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param source The source object being validated.
+ *  @param errors An array of errors that this rule may add
+ *  validation errors to.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function pattern$1(rule, value, source, errors, options) {
+	if (rule.pattern) {
+		if (rule.pattern instanceof RegExp) {
+			// if a RegExp instance is passed, reset `lastIndex` in case its `global`
+			// flag is accidentally set to `true`, which in a validation scenario
+			// is not necessary and the result might be misleading
+			rule.pattern.lastIndex = 0;
+
+			if (!rule.pattern.test(value)) {
+				errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
+			}
+		} else if (typeof rule.pattern === 'string') {
+			var _pattern = new RegExp(rule.pattern);
+
+			if (!_pattern.test(value)) {
+				errors.push(format(options.messages.pattern.mismatch, rule.fullField, value, rule.pattern));
+			}
+		}
+	}
+}
+
+var rules = {
+	required: required,
+	whitespace: whitespace,
+	type: type,
+	range: range,
+	"enum": enumerable,
+	pattern: pattern$1
+};
+
+/**
+ *  Performs validation for string types.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function string(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value, 'string') && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options, 'string');
+
+		if (!isEmptyValue(value, 'string')) {
+			rules.type(rule, value, source, errors, options);
+			rules.range(rule, value, source, errors, options);
+			rules.pattern(rule, value, source, errors, options);
+
+			if (rule.whitespace === true) {
+				rules.whitespace(rule, value, source, errors, options);
+			}
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates a function.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function method(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules.type(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates a number.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function number(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (value === '') {
+			value = undefined;
+		}
+
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules.type(rule, value, source, errors, options);
+			rules.range(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates a boolean.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function _boolean(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules.type(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates the regular expression type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function regexp(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (!isEmptyValue(value)) {
+			rules.type(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates a number is an integer.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function integer(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules.type(rule, value, source, errors, options);
+			rules.range(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates a number is a floating point number.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function floatFn(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules.type(rule, value, source, errors, options);
+			rules.range(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates an array.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function array(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value, 'array') && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options, 'array');
+
+		if (!isEmptyValue(value, 'array')) {
+			rules.type(rule, value, source, errors, options);
+			rules.range(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates an object.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function object(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules.type(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+var ENUM$1 = 'enum';
+/**
+ *  Validates an enumerable list.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function enumerable$1(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (value !== undefined) {
+			rules[ENUM$1](rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Validates a regular expression pattern.
+ *
+ *  Performs validation when a rule only contains
+ *  a pattern property but is not declared as a string type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function pattern$2(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value, 'string') && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (!isEmptyValue(value, 'string')) {
+			rules.pattern(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+function date(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field); 
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+
+		if (!isEmptyValue(value)) {
+			var dateObject;
+
+			if (typeof value === 'number') {
+				dateObject = new Date(value);
+			} else {
+				dateObject = value;
+			}
+
+			rules.type(rule, dateObject, source, errors, options);
+
+			if (dateObject) {
+				rules.range(rule, dateObject.getTime(), source, errors, options);
+			}
+		}
+	}
+
+	callback(errors);
+}
+
+function required$1(rule, value, callback, source, options) {
+	var errors = [];
+	var type = Array.isArray(value) ? 'array' : typeof value;
+	rules.required(rule, value, source, errors, options, type);
+	callback(errors);
+}
+
+function type$1(rule, value, callback, source, options) {
+	var ruleType = rule.type;
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value, ruleType) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options, ruleType);
+
+		if (!isEmptyValue(value, ruleType)) {
+			rules.type(rule, value, source, errors, options);
+		}
+	}
+
+	callback(errors);
+}
+
+/**
+ *  Performs validation for any type.
+ *
+ *  @param rule The validation rule.
+ *  @param value The value of the field on the source object.
+ *  @param callback The callback function.
+ *  @param source The source object being validated.
+ *  @param options The validation options.
+ *  @param options.messages The validation messages.
+ */
+
+function any(rule, value, callback, source, options) {
+	var errors = [];
+	var validate = rule.required || !rule.required && source.hasOwnProperty(rule.field);
+
+	if (validate) {
+		if (isEmptyValue(value) && !rule.required) {
+			return callback();
+		}
+
+		rules.required(rule, value, source, errors, options);
+	}
+
+	callback(errors);
+}
+
+var validators = {
+	string: string,
+	method: method,
+	number: number,
+	"boolean": _boolean,
+	regexp: regexp,
+	integer: integer,
+	"float": floatFn,
+	array: array,
+	object: object,
+	"enum": enumerable$1,
+	pattern: pattern$2,
+	date: date,
+	url: type$1,
+	hex: type$1,
+	email: type$1,
+	required: required$1,
+	any: any
+};
+
+function newMessages() {
+	return {
+		"default": 'Validation error on field %s',
+		required: '%s is required',
+		"enum": '%s must be one of %s',
+		whitespace: '%s cannot be empty',
+		date: {
+			format: '%s date %s is invalid for format %s',
+			parse: '%s date could not be parsed, %s is invalid ',
+			invalid: '%s date %s is invalid'
+		},
+		types: {
+			string: '%s is not a %s',
+			method: '%s is not a %s (function)',
+			array: '%s is not an %s',
+			object: '%s is not an %s',
+			number: '%s is not a %s',
+			date: '%s is not a %s',
+			"boolean": '%s is not a %s',
+			integer: '%s is not an %s',
+			"float": '%s is not a %s',
+			regexp: '%s is not a valid %s',
+			email: '%s is not a valid %s',
+			url: '%s is not a valid %s',
+			hex: '%s is not a valid %s'
+		},
+		string: {
+			len: '%s must be exactly %s characters',
+			min: '%s must be at least %s characters',
+			max: '%s cannot be longer than %s characters',
+			range: '%s must be between %s and %s characters'
+		},
+		number: {
+			len: '%s must equal %s',
+			min: '%s cannot be less than %s',
+			max: '%s cannot be greater than %s',
+			range: '%s must be between %s and %s'
+		},
+		array: {
+			len: '%s must be exactly %s in length',
+			min: '%s cannot be less than %s in length',
+			max: '%s cannot be greater than %s in length',
+			range: '%s must be between %s and %s in length'
+		},
+		pattern: {
+			mismatch: '%s value %s does not match pattern %s'
+		},
+		clone: function clone() {
+			var cloned = JSON.parse(JSON.stringify(this));
+			cloned.clone = this.clone;
+			return cloned;
+		}
+	};
+}
+var messages = newMessages();
+
+/**
+ *  Encapsulates a validation schema.
+ *
+ *  @param descriptor An object declaring validation rules
+ *  for this schema.
+ */
+
+function Schema(descriptor) {
+	this.rules = null;
+	this._messages = messages;
+	this.define(descriptor);
+}
+
+Schema.prototype = {
+	messages: function messages(_messages) {
+		if (_messages) {
+			this._messages = deepMerge(newMessages(), _messages);
+		}
+
+		return this._messages;
+	},
+	define: function define(rules) {
+		if (!rules) {
+			throw new Error('Cannot configure a schema with no rules');
+		}
+
+		if (typeof rules !== 'object' || Array.isArray(rules)) {
+			throw new Error('Rules must be an object');
+		}
+
+		this.rules = {};
+		var z;
+		var item;
+
+		for (z in rules) {
+			if (rules.hasOwnProperty(z)) {
+				item = rules[z];
+				this.rules[z] = Array.isArray(item) ? item : [item];
+			}
+		}
+	},
+	validate: function validate(source_, o, oc) {
+		var _this = this;
+
+		if (o === void 0) {
+			o = {};
+		}
+
+		if (oc === void 0) {
+			oc = function oc() {};
+		}
+
+		var source = source_;
+		var options = o;
+		var callback = oc;
+
+		if (typeof options === 'function') {
+			callback = options;
+			options = {};
+		}
+
+		if (!this.rules || Object.keys(this.rules).length === 0) {
+			if (callback) {
+				callback();
+			}
+
+			return Promise.resolve();
+		}
+
+		function complete(results) {
+			var i;
+			var errors = [];
+			var fields = {};
+
+			function add(e) {
+				if (Array.isArray(e)) {
+					var _errors;
+
+					errors = (_errors = errors).concat.apply(_errors, e);
+				} else {
+					errors.push(e);
+				}
+			}
+
+			for (i = 0; i < results.length; i++) {
+				add(results[i]);
+			}
+
+			if (!errors.length) {
+				errors = null;
+				fields = null;
+			} else {
+				fields = convertFieldsError(errors);
+			}
+
+			callback(errors, fields);
+		}
+
+		if (options.messages) {
+			var messages$1 = this.messages();
+
+			if (messages$1 === messages) {
+				messages$1 = newMessages();
+			}
+
+			deepMerge(messages$1, options.messages);
+			options.messages = messages$1;
+		} else {
+			options.messages = this.messages();
+		}
+
+		var arr;
+		var value;
+		var series = {};
+		var keys = options.keys || Object.keys(this.rules);
+		keys.forEach(function(z) {
+			arr = _this.rules[z];
+			value = source[z];
+			arr.forEach(function(r) {
+				var rule = r;
+
+				if (typeof rule.transform === 'function') {
+					if (source === source_) {
+						source = _extends({}, source);
+					}
+
+					value = source[z] = rule.transform(value);
+				}
+
+				if (typeof rule === 'function') {
+					rule = {
+						validator: rule
+					};
+				} else {
+					rule = _extends({}, rule);
+				}
+
+				rule.validator = _this.getValidationMethod(rule);
+				rule.field = z;
+				rule.fullField = rule.fullField || z;
+				rule.type = _this.getType(rule);
+
+				if (!rule.validator) {
+					return;
+				}
+
+				series[z] = series[z] || [];
+				series[z].push({
+					rule: rule,
+					value: value,
+					source: source,
+					field: z
+				});
+			});
+		});
+		var errorFields = {};
+		return asyncMap(series, options, function(data, doIt) {
+			var rule = data.rule;
+			var deep = (rule.type === 'object' || rule.type === 'array') && (typeof rule.fields === 'object' || typeof rule.defaultField ===
+				'object');
+			deep = deep && (rule.required || !rule.required && data.value);
+			rule.field = data.field;
+
+			function addFullfield(key, schema) {
+				return _extends({}, schema, {
+					fullField: rule.fullField + "." + key
+				});
+			}
+
+			function cb(e) {
+				if (e === void 0) {
+					e = [];
+				}
+
+				var errors = e;
+
+				if (!Array.isArray(errors)) {
+					errors = [errors];
+				}
+
+				if (!options.suppressWarning && errors.length) {
+					Schema.warning('async-validator:', errors);
+				}
+
+				if (errors.length && rule.message) {
+					errors = [].concat(rule.message);
+				}
+
+				errors = errors.map(complementError(rule));
+
+				if (options.first && errors.length) {
+					errorFields[rule.field] = 1;
+					return doIt(errors);
+				}
+
+				if (!deep) {
+					doIt(errors);
+				} else {
+					// if rule is required but the target object
+					// does not exist fail at the rule level and don't
+					// go deeper
+					if (rule.required && !data.value) {
+						if (rule.message) {
+							errors = [].concat(rule.message).map(complementError(rule));
+						} else if (options.error) {
+							errors = [options.error(rule, format(options.messages.required, rule.field))];
+						} else {
+							errors = [];
+						}
+
+						return doIt(errors);
+					}
+
+					var fieldsSchema = {};
+
+					if (rule.defaultField) {
+						for (var k in data.value) {
+							if (data.value.hasOwnProperty(k)) {
+								fieldsSchema[k] = rule.defaultField;
+							}
+						}
+					}
+
+					fieldsSchema = _extends({}, fieldsSchema, {}, data.rule.fields);
+
+					for (var f in fieldsSchema) {
+						if (fieldsSchema.hasOwnProperty(f)) {
+							var fieldSchema = Array.isArray(fieldsSchema[f]) ? fieldsSchema[f] : [fieldsSchema[f]];
+							fieldsSchema[f] = fieldSchema.map(addFullfield.bind(null, f));
+						}
+					}
+
+					var schema = new Schema(fieldsSchema);
+					schema.messages(options.messages);
+
+					if (data.rule.options) {
+						data.rule.options.messages = options.messages;
+						data.rule.options.error = options.error;
+					}
+
+					schema.validate(data.value, data.rule.options || options, function(errs) {
+						var finalErrors = [];
+
+						if (errors && errors.length) {
+							finalErrors.push.apply(finalErrors, errors);
+						}
+
+						if (errs && errs.length) {
+							finalErrors.push.apply(finalErrors, errs);
+						}
+
+						doIt(finalErrors.length ? finalErrors : null);
+					});
+				}
+			}
+
+			var res;
+
+			if (rule.asyncValidator) {
+				res = rule.asyncValidator(rule, data.value, cb, data.source, options);
+			} else if (rule.validator) {
+				res = rule.validator(rule, data.value, cb, data.source, options);
+
+				if (res === true) {
+					cb();
+				} else if (res === false) {
+					cb(rule.message || rule.field + " fails");
+				} else if (res instanceof Array) {
+					cb(res);
+				} else if (res instanceof Error) {
+					cb(res.message);
+				}
+			}
+
+			if (res && res.then) {
+				res.then(function() {
+					return cb();
+				}, function(e) {
+					return cb(e);
+				});
+			}
+		}, function(results) {
+			complete(results);
+		});
+	},
+	getType: function getType(rule) {
+		if (rule.type === undefined && rule.pattern instanceof RegExp) {
+			rule.type = 'pattern';
+		}
+
+		if (typeof rule.validator !== 'function' && rule.type && !validators.hasOwnProperty(rule.type)) {
+			throw new Error(format('Unknown rule type %s', rule.type));
+		}
+
+		return rule.type || 'string';
+	},
+	getValidationMethod: function getValidationMethod(rule) {
+		if (typeof rule.validator === 'function') {
+			return rule.validator;
+		}
+
+		var keys = Object.keys(rule);
+		var messageIndex = keys.indexOf('message');
+
+		if (messageIndex !== -1) {
+			keys.splice(messageIndex, 1);
+		}
+
+		if (keys.length === 1 && keys[0] === 'required') {
+			return validators.required;
+		}
+
+		return validators[this.getType(rule)] || false;
+	}
+};
+
+Schema.register = function register(type, validator) {
+	if (typeof validator !== 'function') {
+		throw new Error('Cannot register a validator by type, validator is not a function');
+	}
+
+	validators[type] = validator;
+};
+
+Schema.warning = warning;
+Schema.messages = messages;
+
+export default Schema;
+//# sourceMappingURL=index.js.map
diff --git a/uview-ui/libs/util/city.js b/uview-ui/libs/util/city.js
new file mode 100644
index 0000000..94169eb
--- /dev/null
+++ b/uview-ui/libs/util/city.js
@@ -0,0 +1 @@
+var cityData=[[{"label":"甯傝緰鍖�","value":"1101"}],[{"label":"甯傝緰鍖�","value":"1201"}],[{"label":"鐭冲搴勫競","value":"1301"},{"label":"鍞愬北甯�","value":"1302"},{"label":"绉︾殗宀涘競","value":"1303"},{"label":"閭兏甯�","value":"1304"},{"label":"閭㈠彴甯�","value":"1305"},{"label":"淇濆畾甯�","value":"1306"},{"label":"寮犲鍙e競","value":"1307"},{"label":"鎵垮痉甯�","value":"1308"},{"label":"娌у窞甯�","value":"1309"},{"label":"寤婂潑甯�","value":"1310"},{"label":"琛℃按甯�","value":"1311"}],[{"label":"澶師甯�","value":"1401"},{"label":"澶у悓甯�","value":"1402"},{"label":"闃虫硥甯�","value":"1403"},{"label":"闀挎不甯�","value":"1404"},{"label":"鏅嬪煄甯�","value":"1405"},{"label":"鏈斿窞甯�","value":"1406"},{"label":"鏅嬩腑甯�","value":"1407"},{"label":"杩愬煄甯�","value":"1408"},{"label":"蹇诲窞甯�","value":"1409"},{"label":"涓存本甯�","value":"1410"},{"label":"鍚曟甯�","value":"1411"}],[{"label":"鍛煎拰娴╃壒甯�","value":"1501"},{"label":"鍖呭ご甯�","value":"1502"},{"label":"涔屾捣甯�","value":"1503"},{"label":"璧ゅ嘲甯�","value":"1504"},{"label":"閫氳窘甯�","value":"1505"},{"label":"閯傚皵澶氭柉甯�","value":"1506"},{"label":"鍛间鸡璐濆皵甯�","value":"1507"},{"label":"宸村溅娣栧皵甯�","value":"1508"},{"label":"涔屽叞瀵熷竷甯�","value":"1509"},{"label":"鍏村畨鐩�","value":"1522"},{"label":"閿℃灄閮嫆鐩�","value":"1525"},{"label":"闃挎媺鍠勭洘","value":"1529"}],[{"label":"娌堥槼甯�","value":"2101"},{"label":"澶ц繛甯�","value":"2102"},{"label":"闉嶅北甯�","value":"2103"},{"label":"鎶氶『甯�","value":"2104"},{"label":"鏈邯甯�","value":"2105"},{"label":"涓逛笢甯�","value":"2106"},{"label":"閿﹀窞甯�","value":"2107"},{"label":"钀ュ彛甯�","value":"2108"},{"label":"闃滄柊甯�","value":"2109"},{"label":"杈介槼甯�","value":"2110"},{"label":"鐩橀敠甯�","value":"2111"},{"label":"閾佸箔甯�","value":"2112"},{"label":"鏈濋槼甯�","value":"2113"},{"label":"钁姦宀涘競","value":"2114"}],[{"label":"闀挎槬甯�","value":"2201"},{"label":"鍚夋灄甯�","value":"2202"},{"label":"鍥涘钩甯�","value":"2203"},{"label":"杈芥簮甯�","value":"2204"},{"label":"閫氬寲甯�","value":"2205"},{"label":"鐧藉北甯�","value":"2206"},{"label":"鏉惧師甯�","value":"2207"},{"label":"鐧藉煄甯�","value":"2208"},{"label":"寤惰竟鏈濋矞鏃忚嚜娌诲窞","value":"2224"}],[{"label":"鍝堝皵婊ㄥ競","value":"2301"},{"label":"榻愰綈鍝堝皵甯�","value":"2302"},{"label":"楦¤タ甯�","value":"2303"},{"label":"楣ゅ矖甯�","value":"2304"},{"label":"鍙岄腑灞卞競","value":"2305"},{"label":"澶у簡甯�","value":"2306"},{"label":"浼婃槬甯�","value":"2307"},{"label":"浣虫湪鏂競","value":"2308"},{"label":"涓冨彴娌冲競","value":"2309"},{"label":"鐗′腹姹熷競","value":"2310"},{"label":"榛戞渤甯�","value":"2311"},{"label":"缁ュ寲甯�","value":"2312"},{"label":"澶у叴瀹夊箔鍦板尯","value":"2327"}],[{"label":"甯傝緰鍖�","value":"3101"}],[{"label":"鍗椾含甯�","value":"3201"},{"label":"鏃犻敗甯�","value":"3202"},{"label":"寰愬窞甯�","value":"3203"},{"label":"甯稿窞甯�","value":"3204"},{"label":"鑻忓窞甯�","value":"3205"},{"label":"鍗楅�氬競","value":"3206"},{"label":"杩炰簯娓競","value":"3207"},{"label":"娣畨甯�","value":"3208"},{"label":"鐩愬煄甯�","value":"3209"},{"label":"鎵窞甯�","value":"3210"},{"label":"闀囨睙甯�","value":"3211"},{"label":"娉板窞甯�","value":"3212"},{"label":"瀹胯縼甯�","value":"3213"}],[{"label":"鏉窞甯�","value":"3301"},{"label":"瀹佹尝甯�","value":"3302"},{"label":"娓╁窞甯�","value":"3303"},{"label":"鍢夊叴甯�","value":"3304"},{"label":"婀栧窞甯�","value":"3305"},{"label":"缁嶅叴甯�","value":"3306"},{"label":"閲戝崕甯�","value":"3307"},{"label":"琛㈠窞甯�","value":"3308"},{"label":"鑸熷北甯�","value":"3309"},{"label":"鍙板窞甯�","value":"3310"},{"label":"涓芥按甯�","value":"3311"}],[{"label":"鍚堣偉甯�","value":"3401"},{"label":"鑺滄箹甯�","value":"3402"},{"label":"铓屽煚甯�","value":"3403"},{"label":"娣崡甯�","value":"3404"},{"label":"椹瀺灞卞競","value":"3405"},{"label":"娣寳甯�","value":"3406"},{"label":"閾滈櫟甯�","value":"3407"},{"label":"瀹夊簡甯�","value":"3408"},{"label":"榛勫北甯�","value":"3410"},{"label":"婊佸窞甯�","value":"3411"},{"label":"闃滈槼甯�","value":"3412"},{"label":"瀹垮窞甯�","value":"3413"},{"label":"鍏畨甯�","value":"3415"},{"label":"浜冲窞甯�","value":"3416"},{"label":"姹犲窞甯�","value":"3417"},{"label":"瀹e煄甯�","value":"3418"}],[{"label":"绂忓窞甯�","value":"3501"},{"label":"鍘﹂棬甯�","value":"3502"},{"label":"鑾嗙敯甯�","value":"3503"},{"label":"涓夋槑甯�","value":"3504"},{"label":"娉夊窞甯�","value":"3505"},{"label":"婕冲窞甯�","value":"3506"},{"label":"鍗楀钩甯�","value":"3507"},{"label":"榫欏博甯�","value":"3508"},{"label":"瀹佸痉甯�","value":"3509"}],[{"label":"鍗楁槍甯�","value":"3601"},{"label":"鏅痉闀囧競","value":"3602"},{"label":"钀嶄埂甯�","value":"3603"},{"label":"涔濇睙甯�","value":"3604"},{"label":"鏂颁綑甯�","value":"3605"},{"label":"楣版江甯�","value":"3606"},{"label":"璧e窞甯�","value":"3607"},{"label":"鍚夊畨甯�","value":"3608"},{"label":"瀹滄槬甯�","value":"3609"},{"label":"鎶氬窞甯�","value":"3610"},{"label":"涓婇ザ甯�","value":"3611"}],[{"label":"娴庡崡甯�","value":"3701"},{"label":"闈掑矝甯�","value":"3702"},{"label":"娣勫崥甯�","value":"3703"},{"label":"鏋e簞甯�","value":"3704"},{"label":"涓滆惀甯�","value":"3705"},{"label":"鐑熷彴甯�","value":"3706"},{"label":"娼嶅潑甯�","value":"3707"},{"label":"娴庡畞甯�","value":"3708"},{"label":"娉板畨甯�","value":"3709"},{"label":"濞佹捣甯�","value":"3710"},{"label":"鏃ョ収甯�","value":"3711"},{"label":"鑾辫姕甯�","value":"3712"},{"label":"涓存矀甯�","value":"3713"},{"label":"寰峰窞甯�","value":"3714"},{"label":"鑱婂煄甯�","value":"3715"},{"label":"婊ㄥ窞甯�","value":"3716"},{"label":"鑿忔辰甯�","value":"3717"}],[{"label":"閮戝窞甯�","value":"4101"},{"label":"寮�灏佸競","value":"4102"},{"label":"娲涢槼甯�","value":"4103"},{"label":"骞抽《灞卞競","value":"4104"},{"label":"瀹夐槼甯�","value":"4105"},{"label":"楣ゅ甯�","value":"4106"},{"label":"鏂颁埂甯�","value":"4107"},{"label":"鐒︿綔甯�","value":"4108"},{"label":"婵槼甯�","value":"4109"},{"label":"璁告槍甯�","value":"4110"},{"label":"婕渤甯�","value":"4111"},{"label":"涓夐棬宄″競","value":"4112"},{"label":"鍗楅槼甯�","value":"4113"},{"label":"鍟嗕笜甯�","value":"4114"},{"label":"淇¢槼甯�","value":"4115"},{"label":"鍛ㄥ彛甯�","value":"4116"},{"label":"椹婚┈搴楀競","value":"4117"},{"label":"鐪佺洿杈栧幙绾ц鏀垮尯鍒�","value":"4190"}],[{"label":"姝︽眽甯�","value":"4201"},{"label":"榛勭煶甯�","value":"4202"},{"label":"鍗佸牥甯�","value":"4203"},{"label":"瀹滄槍甯�","value":"4205"},{"label":"瑗勯槼甯�","value":"4206"},{"label":"閯傚窞甯�","value":"4207"},{"label":"鑽嗛棬甯�","value":"4208"},{"label":"瀛濇劅甯�","value":"4209"},{"label":"鑽嗗窞甯�","value":"4210"},{"label":"榛勫唸甯�","value":"4211"},{"label":"鍜稿畞甯�","value":"4212"},{"label":"闅忓窞甯�","value":"4213"},{"label":"鎭╂柦鍦熷鏃忚嫍鏃忚嚜娌诲窞","value":"4228"},{"label":"鐪佺洿杈栧幙绾ц鏀垮尯鍒�","value":"4290"}],[{"label":"闀挎矙甯�","value":"4301"},{"label":"鏍床甯�","value":"4302"},{"label":"婀樻江甯�","value":"4303"},{"label":"琛¢槼甯�","value":"4304"},{"label":"閭甸槼甯�","value":"4305"},{"label":"宀抽槼甯�","value":"4306"},{"label":"甯稿痉甯�","value":"4307"},{"label":"寮犲鐣屽競","value":"4308"},{"label":"鐩婇槼甯�","value":"4309"},{"label":"閮村窞甯�","value":"4310"},{"label":"姘稿窞甯�","value":"4311"},{"label":"鎬�鍖栧競","value":"4312"},{"label":"濞勫簳甯�","value":"4313"},{"label":"婀樿タ鍦熷鏃忚嫍鏃忚嚜娌诲窞","value":"4331"}],[{"label":"骞垮窞甯�","value":"4401"},{"label":"闊跺叧甯�","value":"4402"},{"label":"娣卞湷甯�","value":"4403"},{"label":"鐝犳捣甯�","value":"4404"},{"label":"姹曞ご甯�","value":"4405"},{"label":"浣涘北甯�","value":"4406"},{"label":"姹熼棬甯�","value":"4407"},{"label":"婀涙睙甯�","value":"4408"},{"label":"鑼傚悕甯�","value":"4409"},{"label":"鑲囧簡甯�","value":"4412"},{"label":"鎯犲窞甯�","value":"4413"},{"label":"姊呭窞甯�","value":"4414"},{"label":"姹曞熬甯�","value":"4415"},{"label":"娌虫簮甯�","value":"4416"},{"label":"闃虫睙甯�","value":"4417"},{"label":"娓呰繙甯�","value":"4418"},{"label":"涓滆帪甯�","value":"4419"},{"label":"涓北甯�","value":"4420"},{"label":"娼窞甯�","value":"4451"},{"label":"鎻槼甯�","value":"4452"},{"label":"浜戞诞甯�","value":"4453"}],[{"label":"鍗楀畞甯�","value":"4501"},{"label":"鏌冲窞甯�","value":"4502"},{"label":"妗傛灄甯�","value":"4503"},{"label":"姊у窞甯�","value":"4504"},{"label":"鍖楁捣甯�","value":"4505"},{"label":"闃插煄娓競","value":"4506"},{"label":"閽﹀窞甯�","value":"4507"},{"label":"璐垫腐甯�","value":"4508"},{"label":"鐜夋灄甯�","value":"4509"},{"label":"鐧捐壊甯�","value":"4510"},{"label":"璐哄窞甯�","value":"4511"},{"label":"娌虫睜甯�","value":"4512"},{"label":"鏉ュ甯�","value":"4513"},{"label":"宕囧乏甯�","value":"4514"}],[{"label":"娴峰彛甯�","value":"4601"},{"label":"涓変簹甯�","value":"4602"},{"label":"涓夋矙甯�","value":"4603"},{"label":"鍎嬪窞甯�","value":"4604"},{"label":"鐪佺洿杈栧幙绾ц鏀垮尯鍒�","value":"4690"}],[{"label":"甯傝緰鍖�","value":"5001"},{"label":"鍘�","value":"5002"}],[{"label":"鎴愰兘甯�","value":"5101"},{"label":"鑷础甯�","value":"5103"},{"label":"鏀�鏋濊姳甯�","value":"5104"},{"label":"娉稿窞甯�","value":"5105"},{"label":"寰烽槼甯�","value":"5106"},{"label":"缁甸槼甯�","value":"5107"},{"label":"骞垮厓甯�","value":"5108"},{"label":"閬傚畞甯�","value":"5109"},{"label":"鍐呮睙甯�","value":"5110"},{"label":"涔愬北甯�","value":"5111"},{"label":"鍗楀厖甯�","value":"5113"},{"label":"鐪夊北甯�","value":"5114"},{"label":"瀹滃甯�","value":"5115"},{"label":"骞垮畨甯�","value":"5116"},{"label":"杈惧窞甯�","value":"5117"},{"label":"闆呭畨甯�","value":"5118"},{"label":"宸翠腑甯�","value":"5119"},{"label":"璧勯槼甯�","value":"5120"},{"label":"闃垮潩钘忔棌缇屾棌鑷不宸�","value":"5132"},{"label":"鐢樺瓬钘忔棌鑷不宸�","value":"5133"},{"label":"鍑夊北褰濇棌鑷不宸�","value":"5134"}],[{"label":"璐甸槼甯�","value":"5201"},{"label":"鍏洏姘村競","value":"5202"},{"label":"閬典箟甯�","value":"5203"},{"label":"瀹夐『甯�","value":"5204"},{"label":"姣曡妭甯�","value":"5205"},{"label":"閾滀粊甯�","value":"5206"},{"label":"榛旇タ鍗楀竷渚濇棌鑻楁棌鑷不宸�","value":"5223"},{"label":"榛斾笢鍗楄嫍鏃忎緱鏃忚嚜娌诲窞","value":"5226"},{"label":"榛斿崡甯冧緷鏃忚嫍鏃忚嚜娌诲窞","value":"5227"}],[{"label":"鏄嗘槑甯�","value":"5301"},{"label":"鏇查潠甯�","value":"5303"},{"label":"鐜夋邯甯�","value":"5304"},{"label":"淇濆北甯�","value":"5305"},{"label":"鏄�氬競","value":"5306"},{"label":"涓芥睙甯�","value":"5307"},{"label":"鏅幢甯�","value":"5308"},{"label":"涓存钵甯�","value":"5309"},{"label":"妤氶泟褰濇棌鑷不宸�","value":"5323"},{"label":"绾㈡渤鍝堝凹鏃忓綕鏃忚嚜娌诲窞","value":"5325"},{"label":"鏂囧北澹棌鑻楁棌鑷不宸�","value":"5326"},{"label":"瑗垮弻鐗堢撼鍌f棌鑷不宸�","value":"5328"},{"label":"澶х悊鐧芥棌鑷不宸�","value":"5329"},{"label":"寰峰畯鍌f棌鏅鏃忚嚜娌诲窞","value":"5331"},{"label":"鎬掓睙鍌堝兂鏃忚嚜娌诲窞","value":"5333"},{"label":"杩簡钘忔棌鑷不宸�","value":"5334"}],[{"label":"鎷夎惃甯�","value":"5401"},{"label":"鏃ュ杸鍒欏競","value":"5402"},{"label":"鏄岄兘甯�","value":"5403"},{"label":"鏋楄姖甯�","value":"5404"},{"label":"灞卞崡甯�","value":"5405"},{"label":"閭f洸鍦板尯","value":"5424"},{"label":"闃块噷鍦板尯","value":"5425"}],[{"label":"瑗垮畨甯�","value":"6101"},{"label":"閾滃窛甯�","value":"6102"},{"label":"瀹濋浮甯�","value":"6103"},{"label":"鍜搁槼甯�","value":"6104"},{"label":"娓崡甯�","value":"6105"},{"label":"寤跺畨甯�","value":"6106"},{"label":"姹変腑甯�","value":"6107"},{"label":"姒嗘灄甯�","value":"6108"},{"label":"瀹夊悍甯�","value":"6109"},{"label":"鍟嗘礇甯�","value":"6110"}],[{"label":"鍏板窞甯�","value":"6201"},{"label":"鍢夊唱鍏冲競","value":"6202"},{"label":"閲戞槍甯�","value":"6203"},{"label":"鐧介摱甯�","value":"6204"},{"label":"澶╂按甯�","value":"6205"},{"label":"姝﹀▉甯�","value":"6206"},{"label":"寮犳帠甯�","value":"6207"},{"label":"骞冲噳甯�","value":"6208"},{"label":"閰掓硥甯�","value":"6209"},{"label":"搴嗛槼甯�","value":"6210"},{"label":"瀹氳タ甯�","value":"6211"},{"label":"闄囧崡甯�","value":"6212"},{"label":"涓村鍥炴棌鑷不宸�","value":"6229"},{"label":"鐢樺崡钘忔棌鑷不宸�","value":"6230"}],[{"label":"瑗垮畞甯�","value":"6301"},{"label":"娴蜂笢甯�","value":"6302"},{"label":"娴峰寳钘忔棌鑷不宸�","value":"6322"},{"label":"榛勫崡钘忔棌鑷不宸�","value":"6323"},{"label":"娴峰崡钘忔棌鑷不宸�","value":"6325"},{"label":"鏋滄礇钘忔棌鑷不宸�","value":"6326"},{"label":"鐜夋爲钘忔棌鑷不宸�","value":"6327"},{"label":"娴疯タ钂欏彜鏃忚棌鏃忚嚜娌诲窞","value":"6328"}],[{"label":"閾跺窛甯�","value":"6401"},{"label":"鐭冲槾灞卞競","value":"6402"},{"label":"鍚村繝甯�","value":"6403"},{"label":"鍥哄師甯�","value":"6404"},{"label":"涓崼甯�","value":"6405"}],[{"label":"涔岄瞾鏈ㄩ綈甯�","value":"6501"},{"label":"鍏嬫媺鐜涗緷甯�","value":"6502"},{"label":"鍚愰瞾鐣競","value":"6504"},{"label":"鍝堝瘑甯�","value":"6505"},{"label":"鏄屽悏鍥炴棌鑷不宸�","value":"6523"},{"label":"鍗氬皵濉旀媺钂欏彜鑷不宸�","value":"6527"},{"label":"宸撮煶閮钂欏彜鑷不宸�","value":"6528"},{"label":"闃垮厠鑻忓湴鍖�","value":"6529"},{"label":"鍏嬪瓬鍕掕嫃鏌皵鍏嬪瓬鑷不宸�","value":"6530"},{"label":"鍠�浠�鍦板尯","value":"6531"},{"label":"鍜岀敯鍦板尯","value":"6532"},{"label":"浼婄妬鍝堣惃鍏嬭嚜娌诲窞","value":"6540"},{"label":"濉斿煄鍦板尯","value":"6542"},{"label":"闃垮嫆娉板湴鍖�","value":"6543"},{"label":"鑷不鍖虹洿杈栧幙绾ц鏀垮尯鍒�","value":"6590"}],[{"label":"鍙板寳","value":"6601"},{"label":"楂橀泟","value":"6602"},{"label":"鍩洪殕","value":"6603"},{"label":"鍙颁腑","value":"6604"},{"label":"鍙板崡","value":"6605"},{"label":"鏂扮","value":"6606"},{"label":"鍢変箟","value":"6607"},{"label":"瀹滃叞","value":"6608"},{"label":"妗冨洯","value":"6609"},{"label":"鑻楁牀","value":"6610"},{"label":"褰板寲","value":"6611"},{"label":"鍗楁姇","value":"6612"},{"label":"浜戞灄","value":"6613"},{"label":"灞忎笢","value":"6614"},{"label":"鍙颁笢","value":"6615"},{"label":"鑺辫幉","value":"6616"},{"label":"婢庢箹","value":"6617"}],[{"label":"棣欐腐宀�","value":"6701"},{"label":"涔濋緳","value":"6702"},{"label":"鏂扮晫","value":"6703"}],[{"label":"婢抽棬鍗婂矝","value":"6801"},{"label":"姘逛粩宀�","value":"6802"},{"label":"璺幆宀�","value":"6803"},{"label":"璺肮鍩�","value":"6804"}]];export default cityData;
\ No newline at end of file
diff --git a/uview-ui/libs/util/emitter.js b/uview-ui/libs/util/emitter.js
new file mode 100644
index 0000000..228016e
--- /dev/null
+++ b/uview-ui/libs/util/emitter.js
@@ -0,0 +1,51 @@
+/**
+ * 閫掑綊浣跨敤 call 鏂瑰紡this鎸囧悜
+ * @param componentName // 闇�瑕佹壘鐨勭粍浠剁殑鍚嶇О
+ * @param eventName // 浜嬩欢鍚嶇О
+ * @param params // 闇�瑕佷紶閫掔殑鍙傛暟
+ */
+function broadcast(componentName, eventName, params) {
+    // 寰幆瀛愯妭鐐规壘鍒板悕绉颁竴鏍风殑瀛愯妭鐐� 鍚﹀垯 閫掑綊 褰撳墠瀛愯妭鐐�
+    this.$children.map(child=>{
+        if (componentName===child.$options.name) {
+            child.$emit.apply(child,[eventName].concat(params))
+        }else {
+            broadcast.apply(child,[componentName,eventName].concat(params))
+        }
+    })
+}
+export default {
+    methods: {
+        /**
+         * 娲惧彂 (鍚戜笂鏌ユ壘) (涓�涓�)
+         * @param componentName // 闇�瑕佹壘鐨勭粍浠剁殑鍚嶇О
+         * @param eventName // 浜嬩欢鍚嶇О
+         * @param params // 闇�瑕佷紶閫掔殑鍙傛暟
+         */
+        dispatch(componentName, eventName, params) {
+            let parent = this.$parent || this.$root;//$parent 鎵惧埌鏈�杩戠殑鐖惰妭鐐� $root 鏍硅妭鐐�
+            let name = parent.$options.name; // 鑾峰彇褰撳墠缁勪欢瀹炰緥鐨刵ame
+            // 濡傛灉褰撳墠鏈夎妭鐐� && 褰撳墠娌″悕绉� 涓� 褰撳墠鍚嶇О绛変簬闇�瑕佷紶杩涙潵鐨勫悕绉扮殑鏃跺�欏氨鍘绘煡鎵惧綋鍓嶇殑鑺傜偣
+            // 寰幆鍑哄綋鍓嶅悕绉扮殑涓�鏍风殑缁勪欢瀹炰緥
+            while (parent && (!name||name!==componentName)) {
+                parent = parent.$parent;
+                if (parent) {
+                    name = parent.$options.name;
+                }
+            }
+            // 鏈夎妭鐐硅〃绀哄綋鍓嶆壘鍒颁簡name涓�鏍风殑瀹炰緥
+            if (parent) {
+                parent.$emit.apply(parent,[eventName].concat(params))
+            }
+        },
+        /**
+         * 骞挎挱 (鍚戜笅鏌ユ壘) (骞挎挱澶氫釜)
+         * @param componentName // 闇�瑕佹壘鐨勭粍浠剁殑鍚嶇О
+         * @param eventName // 浜嬩欢鍚嶇О
+         * @param params // 闇�瑕佷紶閫掔殑鍙傛暟
+         */
+        broadcast(componentName, eventName, params) {
+            broadcast.call(this,componentName, eventName, params)
+        }
+    }
+}
diff --git a/uview-ui/libs/util/province.js b/uview-ui/libs/util/province.js
new file mode 100644
index 0000000..436b190
--- /dev/null
+++ b/uview-ui/libs/util/province.js
@@ -0,0 +1 @@
+var provinceData=[{"label":"鍖椾含甯�","value":"11"},{"label":"澶╂触甯�","value":"12"},{"label":"娌冲寳鐪�","value":"13"},{"label":"灞辫タ鐪�","value":"14"},{"label":"鍐呰挋鍙よ嚜娌诲尯","value":"15"},{"label":"杈藉畞鐪�","value":"21"},{"label":"鍚夋灄鐪�","value":"22"},{"label":"榛戦緳姹熺渷","value":"23"},{"label":"涓婃捣甯�","value":"31"},{"label":"姹熻嫃鐪�","value":"32"},{"label":"娴欐睙鐪�","value":"33"},{"label":"瀹夊窘鐪�","value":"34"},{"label":"绂忓缓鐪�","value":"35"},{"label":"姹熻タ鐪�","value":"36"},{"label":"灞变笢鐪�","value":"37"},{"label":"娌冲崡鐪�","value":"41"},{"label":"婀栧寳鐪�","value":"42"},{"label":"婀栧崡鐪�","value":"43"},{"label":"骞夸笢鐪�","value":"44"},{"label":"骞胯タ澹棌鑷不鍖�","value":"45"},{"label":"娴峰崡鐪�","value":"46"},{"label":"閲嶅簡甯�","value":"50"},{"label":"鍥涘窛鐪�","value":"51"},{"label":"璐靛窞鐪�","value":"52"},{"label":"浜戝崡鐪�","value":"53"},{"label":"瑗胯棌鑷不鍖�","value":"54"},{"label":"闄曡タ鐪�","value":"61"},{"label":"鐢樿們鐪�","value":"62"},{"label":"闈掓捣鐪�","value":"63"},{"label":"瀹佸鍥炴棌鑷不鍖�","value":"64"},{"label":"鏂扮枂缁村惥灏旇嚜娌诲尯","value":"65"},{"label":"鍙版咕","value":"66"},{"label":"棣欐腐","value":"67"},{"label":"婢抽棬","value":"68"}];export default provinceData;
\ No newline at end of file
diff --git a/uview-ui/package.json b/uview-ui/package.json
new file mode 100644
index 0000000..dc0767c
--- /dev/null
+++ b/uview-ui/package.json
@@ -0,0 +1,39 @@
+{
+	"name": "uview-ui",
+	"version": "1.8.3",
+	"description": "uView UI锛屾槸uni-app鐢熸�佷紭绉�鐨刄I妗嗘灦锛屽叏闈㈢殑缁勪欢鍜屼究鎹风殑宸ュ叿浼氳鎮ㄤ俊鎵嬫媹鏉ワ紝濡傞奔寰楁按",
+	"main": "index.js",
+	"keywords": [
+		"uview",
+		"uView",
+		"uni-app",
+		"uni-app ui",
+		"uniapp",
+		"uviewui",
+		"uview ui",
+		"uviewUI",
+		"uViewui",
+		"uViewUI",
+		"uView UI",
+		"uni ui",
+		"uni UI",
+		"uniapp ui",
+		"ui",
+		"UI妗嗘灦",
+		"uniapp ui妗嗘灦",
+		"uniapp UI"
+	],
+	"scripts": {
+		"test": "echo \"Error: no test specified\" && exit 1"
+	},
+	"repository": {
+		"type": "git",
+		"url": ""
+	},
+	"devDependencies": {
+		"node-sass": "^4.14.0",
+		"sass-loader": "^8.0.2"
+	},
+	"author": "uView",
+	"license": "MIT"
+}
diff --git a/uview-ui/theme.scss b/uview-ui/theme.scss
new file mode 100644
index 0000000..1b21271
--- /dev/null
+++ b/uview-ui/theme.scss
@@ -0,0 +1,38 @@
+// 姝ゆ枃浠朵负uView鐨勪富棰樺彉閲忥紝杩欎簺鍙橀噺鐩墠鍙兘閫氳繃uni.scss寮曞叆鎵嶆湁鏁堬紝鍙﹀鐢变簬
+// uni.scss涓紩鍏ョ殑鏍峰紡浼氬悓鏃舵贩鍏ュ埌鍏ㄥ眬鏍峰紡鏂囦欢鍜屽崟鐙瘡涓�涓〉闈㈢殑鏍峰紡涓紝閫犳垚寰俊绋嬪簭鍖呭お澶э紝
+// 鏁卽ni.scss鍙缓璁斁scss鍙橀噺鍚嶇浉鍏虫牱寮忥紝鍏朵粬鐨勬牱寮忓彲浠ラ�氳繃main.js鎴栬�匒pp.vue寮曞叆
+
+$u-main-color: #303133;
+$u-content-color: #606266;
+$u-tips-color: #909399;
+$u-light-color: #c0c4cc;
+$u-border-color: #e4e7ed;
+$u-bg-color: #f3f4f6;
+
+$u-type-primary: #497bff;
+$u-type-primary-light: #ecf5ff;
+$u-type-primary-disabled: #a0cfff;
+$u-type-primary-dark: #2b85e4;
+
+$u-type-warning: #ff9900;
+$u-type-warning-disabled: #fcbd71;
+$u-type-warning-dark: #f29100;
+$u-type-warning-light: #fdf6ec;
+
+$u-type-success: #19be6b;
+$u-type-success-disabled: #71d5a1;
+$u-type-success-dark: #18b566;
+$u-type-success-light: #dbf1e1;
+
+$u-type-error: #fa3534;
+$u-type-error-disabled: #fab6b6;
+$u-type-error-dark: #dd6161;
+$u-type-error-light: #fef0f0;
+
+$u-type-info: #909399;
+$u-type-info-disabled: #c8c9cc;
+$u-type-info-dark: #82848a;
+$u-type-info-light: #f4f4f5;
+
+$u-form-item-height: 70rpx;
+$u-form-item-border-color: #dcdfe6;
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..7faacd8
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,68 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"call-bind@^1.0.0":
+  "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/call-bind/-/call-bind-1.0.2.tgz"
+  "version" "1.0.2"
+  dependencies:
+    "function-bind" "^1.1.1"
+    "get-intrinsic" "^1.0.2"
+
+"crypto-js@^3.3.0":
+  "integrity" "sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q=="
+  "resolved" "https://registry.npmmirror.com/crypto-js/-/crypto-js-3.3.0.tgz"
+  "version" "3.3.0"
+
+"function-bind@^1.1.1":
+  "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/function-bind/-/function-bind-1.1.1.tgz"
+  "version" "1.1.1"
+
+"get-intrinsic@^1.0.2":
+  "integrity" "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/get-intrinsic/-/get-intrinsic-1.1.1.tgz"
+  "version" "1.1.1"
+  dependencies:
+    "function-bind" "^1.1.1"
+    "has" "^1.0.3"
+    "has-symbols" "^1.0.1"
+
+"has-symbols@^1.0.1":
+  "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/has-symbols/-/has-symbols-1.0.3.tgz"
+  "version" "1.0.3"
+
+"has@^1.0.3":
+  "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/has/-/has-1.0.3.tgz"
+  "version" "1.0.3"
+  dependencies:
+    "function-bind" "^1.1.1"
+
+"object-inspect@^1.9.0":
+  "integrity" "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/object-inspect/-/object-inspect-1.12.2.tgz"
+  "version" "1.12.2"
+
+"qs@^6.9.7":
+  "integrity" "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/qs/-/qs-6.10.5.tgz"
+  "version" "6.10.5"
+  dependencies:
+    "side-channel" "^1.0.4"
+
+"side-channel@^1.0.4":
+  "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/side-channel/-/side-channel-1.0.4.tgz"
+  "version" "1.0.4"
+  dependencies:
+    "call-bind" "^1.0.0"
+    "get-intrinsic" "^1.0.2"
+    "object-inspect" "^1.9.0"
+
+"vue-i18n@^8.20.0":
+  "integrity" "sha512-lWrGm4F25qReJ7XxSnFVb2h3PfW54ldnM4C+YLBGGJ75+Myt/kj4hHSTKqsyDLamvNYpvINMicSOdW+7yuqgIQ=="
+  "resolved" "http://10.1.51.33:8081/repository/group-npm/vue-i18n/-/vue-i18n-8.27.1.tgz"
+  "version" "8.27.1"

--
Gitblit v1.9.3