From e66b80a9a3d2bdc9f00b9a2c35d22950056eed70 Mon Sep 17 00:00:00 2001 From: caill <815519168@qq.com> Date: Mon, 15 Jan 2024 14:04:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E7=85=A7=E7=91=9E=E6=B3=B0=E9=A9=AC?= =?UTF-8?q?=E9=92=A2=E6=89=8B=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + .hbuilderx/launch.json | 20 + App.vue | 25 + README.md | 3 + common/style/layout.css | 370 ++ common/style/mixin.styl | 51 + common/style/reset.css | 43 + common/style/uni.css | 12 + components/NavBar.vue | 62 + components/SearchBox.vue | 138 + components/SearchBox1.vue | 110 + index.html | 20 + main.js | 36 + manifest.json | 117 + package.json | 5 + pages.json | 140 + pages/home/home.vue | 202 + pages/login/login.vue | 190 + pages/login/setup.vue | 82 + pages/login/upgrade.vue | 229 + pages/modules/call-full-mater.vue | 77 + pages/modules/call-mupan.vue | 77 + pages/modules/empty-instore.vue | 77 + pages/modules/equip-inspection.vue | 124 + pages/modules/equip-operate.vue | 115 + pages/modules/forced-rest.vue | 102 + pages/modules/hunnian-carry.vue | 92 + pages/modules/hunnian-operate.vue | 89 + pages/modules/man-group.vue | 134 + pages/modules/package-instore.vue | 111 + pages/modules/pallet-bind.vue | 76 + pages/modules/press-carry.vue | 110 + pages/modules/shelf-check.vue | 142 + pages/modules/sort-schedue.vue | 123 + pages/modules/surplus-mater-instore.vue | 101 + static/iconfont/iconfont.ttf | Bin 0 -> 3480 bytes static/iconfont/iconfont.woff | Bin 0 -> 2260 bytes static/iconfont/iconfont.woff2 | Bin 0 -> 1796 bytes static/image/app_update_close.png | Bin 0 -> 7644 bytes static/image/bg_top.png | Bin 0 -> 30486 bytes static/image/exit.png | Bin 0 -> 1235 bytes static/image/info_bg.png | Bin 0 -> 12101 bytes static/image/login_bg.png | Bin 0 -> 170307 bytes static/image/menu/RF01.png | Bin 0 -> 2595 bytes static/image/menu/RF02.png | Bin 0 -> 2668 bytes static/image/menu/RF03.png | Bin 0 -> 2097 bytes static/image/menu/RF04.png | Bin 0 -> 2249 bytes static/image/menu/RF05.png | Bin 0 -> 3065 bytes static/image/menu/RF06.png | Bin 0 -> 2390 bytes static/image/menu/RF07.png | Bin 0 -> 1970 bytes static/image/menu/RF08.png | Bin 0 -> 2601 bytes static/image/menu/RF09.png | Bin 0 -> 3239 bytes static/image/menu/RF10.png | Bin 0 -> 1599 bytes static/uni.ttf | Bin 0 -> 26164 bytes uni.scss | 76 + uniCloud-aliyun/database/JQL查询.jql | 12 + uni_modules/uni-config-center/changelog.md | 4 + uni_modules/uni-config-center/package.json | 80 + uni_modules/uni-config-center/readme.md | 93 + .../common/uni-config-center/index.js | 1 + .../common/uni-config-center/package.json | 9 + uni_modules/uni-data-select/changelog.md | 16 + .../uni-data-select/uni-data-select.vue | 453 ++ uni_modules/uni-data-select/package.json | 88 + uni_modules/uni-data-select/readme.md | 8 + uni_modules/uni-icons/changelog.md | 22 + .../uni-icons/components/uni-icons/icons.js | 1169 ++++ .../components/uni-icons/uni-icons.vue | 96 + .../uni-icons/components/uni-icons/uni.ttf | Bin 0 -> 26164 bytes .../components/uni-icons/uniicons.css | 663 ++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 86 + uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-id/changelog.md | 111 + uni_modules/uni-id/package.json | 85 + uni_modules/uni-id/readme.md | 33 + .../cloudfunctions/common/uni-id/LICENSE.md | 201 + .../cloudfunctions/common/uni-id/index.js | 1 + .../cloudfunctions/common/uni-id/package.json | 16 + uni_modules/uni-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 399 ++ uni_modules/uni-load-more/package.json | 86 + uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 + uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 + .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 + .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + .../uni-upgrade-center-app/changelog.md | 64 + .../images/app_update_close.png | Bin 0 -> 7644 bytes .../uni-upgrade-center-app/images/bg_top.png | Bin 0 -> 30486 bytes .../uni-upgrade-center-app/package.json | 81 + .../pages/upgrade-popup.vue | 539 ++ uni_modules/uni-upgrade-center-app/readme.md | 126 + .../uniCloud/cloudfunctions/temp.png | Bin 0 -> 7644 bytes .../utils/call-check-version.js | 33 + .../utils/check-update.js | 158 + uni_modules/zxz-uni-data-select/changelog.md | 37 + .../zxz-uni-data-select.vue | 760 +++ uni_modules/zxz-uni-data-select/package.json | 85 + uni_modules/zxz-uni-data-select/readme.md | 26 + utils/CLodopfuncs.js | 1894 ++++++ utils/getData1.js | 99 + utils/getData2.js | 172 + utils/jsencrypt.js | 12 + utils/jsencrypt2.js | 5373 +++++++++++++++++ utils/permission.js | 245 + utils/request.js | 127 + utils/request1.js | 126 + utils/utils.js | 39 + vuex/modules/user.js | 77 + vuex/store.js | 12 + vuex/types.js | 9 + yarn.lock | 8 + 128 files changed, 18114 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 README.md create mode 100644 common/style/layout.css create mode 100644 common/style/mixin.styl create mode 100644 common/style/reset.css create mode 100644 common/style/uni.css create mode 100644 components/NavBar.vue create mode 100644 components/SearchBox.vue create mode 100644 components/SearchBox1.vue create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/home/home.vue create mode 100644 pages/login/login.vue create mode 100644 pages/login/setup.vue create mode 100644 pages/login/upgrade.vue create mode 100644 pages/modules/call-full-mater.vue create mode 100644 pages/modules/call-mupan.vue create mode 100644 pages/modules/empty-instore.vue create mode 100644 pages/modules/equip-inspection.vue create mode 100644 pages/modules/equip-operate.vue create mode 100644 pages/modules/forced-rest.vue create mode 100644 pages/modules/hunnian-carry.vue create mode 100644 pages/modules/hunnian-operate.vue create mode 100644 pages/modules/man-group.vue create mode 100644 pages/modules/package-instore.vue create mode 100644 pages/modules/pallet-bind.vue create mode 100644 pages/modules/press-carry.vue create mode 100644 pages/modules/shelf-check.vue create mode 100644 pages/modules/sort-schedue.vue create mode 100644 pages/modules/surplus-mater-instore.vue create mode 100644 static/iconfont/iconfont.ttf create mode 100644 static/iconfont/iconfont.woff create mode 100644 static/iconfont/iconfont.woff2 create mode 100644 static/image/app_update_close.png create mode 100644 static/image/bg_top.png create mode 100644 static/image/exit.png create mode 100644 static/image/info_bg.png create mode 100644 static/image/login_bg.png create mode 100644 static/image/menu/RF01.png create mode 100644 static/image/menu/RF02.png create mode 100644 static/image/menu/RF03.png create mode 100644 static/image/menu/RF04.png create mode 100644 static/image/menu/RF05.png create mode 100644 static/image/menu/RF06.png create mode 100644 static/image/menu/RF07.png create mode 100644 static/image/menu/RF08.png create mode 100644 static/image/menu/RF09.png create mode 100644 static/image/menu/RF10.png create mode 100644 static/uni.ttf create mode 100644 uni.scss create mode 100644 uniCloud-aliyun/database/JQL查询.jql create mode 100644 uni_modules/uni-config-center/changelog.md create mode 100644 uni_modules/uni-config-center/package.json create mode 100644 uni_modules/uni-config-center/readme.md create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/package.json create mode 100644 uni_modules/uni-data-select/changelog.md create mode 100644 uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue create mode 100644 uni_modules/uni-data-select/package.json create mode 100644 uni_modules/uni-data-select/readme.md create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/icons.js create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni.ttf create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-id/changelog.md create mode 100644 uni_modules/uni-id/package.json create mode 100644 uni_modules/uni-id/readme.md create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json create mode 100644 uni_modules/uni-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/uni-upgrade-center-app/changelog.md create mode 100644 uni_modules/uni-upgrade-center-app/images/app_update_close.png create mode 100644 uni_modules/uni-upgrade-center-app/images/bg_top.png create mode 100644 uni_modules/uni-upgrade-center-app/package.json create mode 100644 uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue create mode 100644 uni_modules/uni-upgrade-center-app/readme.md create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/temp.png create mode 100644 uni_modules/uni-upgrade-center-app/utils/call-check-version.js create mode 100644 uni_modules/uni-upgrade-center-app/utils/check-update.js create mode 100644 uni_modules/zxz-uni-data-select/changelog.md create mode 100644 uni_modules/zxz-uni-data-select/components/zxz-uni-data-select/zxz-uni-data-select.vue create mode 100644 uni_modules/zxz-uni-data-select/package.json create mode 100644 uni_modules/zxz-uni-data-select/readme.md create mode 100644 utils/CLodopfuncs.js create mode 100644 utils/getData1.js create mode 100644 utils/getData2.js create mode 100644 utils/jsencrypt.js create mode 100644 utils/jsencrypt2.js create mode 100644 utils/permission.js create mode 100644 utils/request.js create mode 100644 utils/request1.js create mode 100644 utils/utils.js create mode 100644 vuex/modules/user.js create mode 100644 vuex/store.js create mode 100644 vuex/types.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c45c81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +.project +unpackage/ +.DS_Store \ No newline at end of file diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..a97fd25 --- /dev/null +++ b/.hbuilderx/launch.json @@ -0,0 +1,20 @@ +{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version": "0.0", + "configurations": [{ + "app-plus" : + { + "launchtype" : "local" + }, + "default" : + { + "launchtype" : "local" + }, + "h5" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..3d97b1b --- /dev/null +++ b/App.vue @@ -0,0 +1,25 @@ + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..f7b1e0a --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# 注意事项 ++ 原生APP云打包使用自有证书 ++ 证书别名:testalias \ No newline at end of file diff --git a/common/style/layout.css b/common/style/layout.css new file mode 100644 index 0000000..cac4beb --- /dev/null +++ b/common/style/layout.css @@ -0,0 +1,370 @@ +page { + background-color: #f6f6f6 !important; + min-height: 100% !important; + height: 100% !important; +} +uni-page-body { + background-color: #f6f6f6 !important; + min-height: 100% !important; + height: 100% !important; +} +uni-button:after { + border: none; +} +/** iconfont */ +@font-face { + font-family: 'iconfont'; + src: url('@/static/iconfont/iconfont.woff2?t=1665454521636') format('woff2'), + url('@/static/iconfont/iconfont.woff?t=1665454521636') format('woff'), + url('@/static/iconfont/iconfont.ttf?t=1665454521636') format('truetype'); +} +.iconfont { + font-family: "iconfont" !important; + font-size: 50rpx; + color: #000; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.icon_eye_close { + color: #bbb; +} +.icon_eye_active { + color: #ff6a00; +} +.icon_unchecked { + color: #fff; + width: 32rpx; + height: 32rpx; + background-color: #fff; + font-size: 24rpx; + border: 1rpx solid #bbb; +} +.icon_checked { + color: #ff6a00; + border: 1rpx solid #ff6a00; +} +.icon_back { + font-size: 52rpx; + line-height: 52rpx; + color: #fff; +} +.icon_home { + font-size: 52rpx; + line-height: 52rpx; + color: #fff; +} +.icon_scan { + width: 42rpx; + height: 48rpx; + font-size: 40rpx; + line-height: 48rpx; + color: #323232; + text-align: center; +} +.icon_phone { + width: 48rpx; + height: 48rpx; + font-size: 36rpx; + line-height: 48rpx; + color: #323232; + text-align: center; +} +.icon_del { + width: 46rpx; + height: 48rpx; + font-size: 46rpx; + line-height: 48rpx; + color: #323232; + text-align: center; +} +.icon_search { + width: 48rpx; + height: 48rpx; + font-size: 40rpx; + color: #323232; + line-height: 48rpx; +} +.cancel_icon::before { + content: "\e6dc"; +} +.cancel_icon { + display: block; + width: 100rpx; + height: 100rpx; + font-size: 50rpx; + color: #fff; + line-height: 100rpx; + text-align: center; + background-color: #E9B451; +} + +/** 内容 */ +.zd_container { + width: 100%; + height: 100%; +} +.zd_content { + width: 100%; + height: auto; + padding: 92rpx 15rpx 82rpx 14rpx; +} +.zd_wrapper { + width: 100%; + height: auto; + background-color: #fff; + border-radius: 24rpx; + padding: 14rpx; + margin-bottom: 20rpx; +} +.filter_item { + display: flex; + align-items: center; + width: 100%; + margin-bottom: 10rpx; +} +.filter_item:last-child { + margin-bottom: 0; +} +.filter_label_wraper { + flex: none; + width: 140rpx; + text-align:justify; + text-align-last: justify; + text-justify: inter-ideograph;/*兼容ie*/ +} +.filter_label { + display: block; + width: 140rpx; + line-height: 80rpx; + font-size: 28rpx; + color: #323232; + text-align:justify; + text-align-last: justify; + text-justify: inter-ideograph;/*兼容ie*/ +} +.filter_label_1 { + line-height: 30rpx; +} +.filter_search { + width: 100rpx; + height: 70rpx; + line-height: 70rpx; + font-size: 28rpx; + color: #323232; + text-align: center; + background-color: #fff; + border: 1px solid #ff6a00; + border-radius: 10rpx; + margin-left: 30rpx; +} +.filter_search_disabled { + background-color: #dcdfe6; + border: 1px solid #dcdfe6; + color: #fff; +} +.filter_input_wraper { + /* flex: 1; */ + width: calc(100% - 170rpx); + height: 80rpx; + padding: 5rpx 0; + margin-left: 30rpx; + display: flex; + justify-content: flex-start; + align-items: center; +} +.filter_input_wraper_1 { + height: 30rpx; +} +.filter_input_wraper_inn_text { + line-height: 30rpx; + font-size: 28rpx; + color: #606266; + margin-left: 10rpx; +} +.filter_input { + width: 100%; + height: 70rpx; + line-height: 70rpx; + border: 1px solid #dcdfe6; + background-color: #fff; + padding: 0 15rpx; + font-size: 28rpx; + color: #606266; + border-radius: 10rpx; +} +.filter_textarea { + width: 100%; + height: 210rpx; + line-height: 70rpx; + border: 1px solid #dcdfe6; + background-color: #fff; + padding: 0 15rpx; + font-size: 28rpx; + color: #606266; + border-radius: 10rpx; +} +.filter_input_disabled { + background-color: #eee; +} + +.grid-wraper { + width: 100%; +} +.slide_new { + width: 100%; + height: 100%; + overflow-y: auto; +} +.slide_new table { + table-layout: fixed; + min-width: 100%; + border-collapse: separate; + border-spacing: 0; + border: 0; +} +.slide_new table td, .slide_new table th { + box-sizing: border-box; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + white-space: nowrap; + padding: 0 20rpx; + border-bottom: 10rpx solid #f5f5f5; + text-align: center; +} +.slide_new table td:first-child, .slide_new table th:first-child{ + position: sticky; + left: 0; + z-index: 101; +} +.slide_new table thead tr th { + position: sticky; + top: 0; + background: #d7d7d7; + font-size: 26rpx; + line-height: 98rpx; + color: #696969; + font-weight: bold; + z-index: 100; +} +.slide_new table thead tr th:first-child { + background: #d7d7d7; +} +.slide_new table tbody tr td { + font-size: 28rpx; + line-height: 98rpx; + color: #323232; + background: #fff; +} +.slide_new table tbody tr.checked td { + background-color: #fef6e4; +} + +/** 提交栏 **/ +.submit-bar { + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + align-items: center; + position: fixed; + bottom: 0; + left: 0; + width: 100%; + z-index: 200; + background-color: #fff; + padding-top: 10rpx; + box-shadow: 0 0 20rpx 0 rgba(160,160,160,0.7); +} +.submit-button { + font-size: 30rpx; + line-height: 62rpx; + color: #ff6a00; + text-align: center; + letter-spacing: 1rpx; + padding: 0 22rpx; + background-color: #fff; + border: 1px solid #ff6a00; + margin: 0 40rpx 10rpx 0; + border-radius: 30rpx; +} +.btn-disabled, .submit-button:disabled { + background-color: #c9c9c9; + border: 1px solid #c9c9c9; + color: #fff; +} + +/** 下拉框 */ +.uni-select__selector { + z-index: 300 !important; +} + +/** 弹窗 */ +.msg_wrapper { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + text-align: center; + z-index: 201; + display: flex; + justify-content: center; + align-items: center; +} +.msg_wrapper_1 { + text-align: left; +} + +.msg_box { + width: 90%; + padding: 20rpx; + background-color: #fff; + border-radius: 4px; + border: 1px solid #ebeef5; + box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); + backface-visibility: hidden; +} + +.msg_mask { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: .7; + background: #000; + z-index: 200; +} + +.msg_btns { + width: 100%; + max-width: 300px; + margin: 40rpx auto 0; + display: flex; + justify-content: space-between; + align-items: center; +} +.msg_btn { + border-radius: 10rpx; +} +.msg_btn:disabled { + background-color: #c9c9c9; +} +.uni-select__input-placeholder,.uni-select__selector-empty, .uni-select__selector-item { + font-size: 28rpx !important +} +.sin_input { + width: 150rpx; + font-size: 28rpx; + line-height: 150rpx; + height: 68rpx; + color: #323232; + padding: 0 .1rem; + border: 1px solid #a1a1a1; + border-radius: 3px; +} +.layout-t tr.checked td .sin_input { + color: #8a8a8a; + border: 1px solid #ffffff; +} \ No newline at end of file diff --git a/common/style/mixin.styl b/common/style/mixin.styl new file mode 100644 index 0000000..f564d40 --- /dev/null +++ b/common/style/mixin.styl @@ -0,0 +1,51 @@ +$red = #ff6a00 +$green = #6CBE8B +$yellow = #E9B451 +$blue = #6798ef +$gray = #c9c9c9 +$fc1 = #323232 + +.bgred + background-color: $red !important +.bggreen + background-color: $green !important +.bgyellow + background-color: $yellow !important +.bgblue + background-color: $blue !important +.bggray + background-color: $gray !important + +//宽高 +_wh(w, h) + width: w + height: h + +//字体大小、行高、颜色 +_font(size,height,color=$fc1,weight=normal,align=left) + font-size: size + line-height: height + color: color + font-weight: weight + text-align: align + +//flex 布局和 子元素 对其方式 +_fj(x=space-between,y=center,r=row,n=nowrap) + display: flex + justify-content: x + align-items: y + flex-direction: r + flex-wrap: n + +// 背景图片地址和大小 +_bis(url,w,h=auto,x=center,y=center) + background-position: x y + background-size: w h + background-image: url(url) + background-repeat: no-repeat + +// 定位上下居中 +_ct() + position: absolute + top: 50% + transform: translateY(-50%) \ No newline at end of file diff --git a/common/style/reset.css b/common/style/reset.css new file mode 100644 index 0000000..8355389 --- /dev/null +++ b/common/style/reset.css @@ -0,0 +1,43 @@ +* { + padding: 0; + margin: 0; + list-style: none; + font-style: normal; + text-decoration: none; + border: none; + outline: none; + font-family: uniicons, Arial, "Microsoft Yahei", "Helvetica Neue", Helvetica, sans-serif; + box-sizing: border-box; + -webkit-box-sizing: border-box; + -webkit-tap-highlight-color:transparent; + -webkit-font-smoothing: antialiased; +} + +body, html { + -webkit-user-select: auto; + -ms-user-select: auto; + user-select: auto; +} + +input[type="button"], input[type="submit"], input[type="search"], input[type="reset"], textarea, select{ + -webkit-appearance: none; + appearance: none; +} + +.relative { + position: relative; +} +.hide { + display: none; +} +.vhide { + visibility:hidden; +} +.show { + display: block; +} +.ellipsis{ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} \ No newline at end of file diff --git a/common/style/uni.css b/common/style/uni.css new file mode 100644 index 0000000..c72ebf0 --- /dev/null +++ b/common/style/uni.css @@ -0,0 +1,12 @@ +@font-face { + font-family: uniicons; + font-weight: normal; + font-style: normal; + src: url('~@/static/uni.ttf') format('truetype'); +} +.iconfont{ + font-family: uni; + text-decoration: none; + text-align: center; +} + diff --git a/components/NavBar.vue b/components/NavBar.vue new file mode 100644 index 0000000..a03af93 --- /dev/null +++ b/components/NavBar.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/components/SearchBox.vue b/components/SearchBox.vue new file mode 100644 index 0000000..7525607 --- /dev/null +++ b/components/SearchBox.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/components/SearchBox1.vue b/components/SearchBox1.vue new file mode 100644 index 0000000..63134f7 --- /dev/null +++ b/components/SearchBox1.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..c3ff205 --- /dev/null +++ b/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..1abc647 --- /dev/null +++ b/main.js @@ -0,0 +1,36 @@ +import App from './App' +import Vue from 'vue' + +Vue.config.productionTip = false +App.mpType = 'app' + +Vue.directive('enterNumber', { + inserted: function (el) { + el.addEventListener("keypress",function(e){ + e = e || window.event; + let charcode = typeof e.charCode == 'number' ? e.charCode : e.keyCode; + // if (parseInt(e.target.value) == 0) { + // e.preventDefault(); + // } + parseInt(e.target.value) == 0 && e.preventDefault(); + let re = /\d/; + if(!re.test(String.fromCharCode(charcode)) && charcode > 9 && !e.ctrlKey){ + if(e.preventDefault){ + e.preventDefault(); + }else{ + e.returnValue = false; + } + } + }); + } +}); + +import store from '@/vuex/store.js' + +const app = new Vue({ + ...App, + store +}) + + +app.$mount() \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..bc67f70 --- /dev/null +++ b/manifest.json @@ -0,0 +1,117 @@ +{ + "name" : "华弘", + "appid" : "__UNI__9317F93", + "description" : "华弘手持系统", + "versionName" : "1.0.0", + "versionCode" : 100, + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "compatible" : { + "ignoreVersion" : true + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ] + }, + /* ios打包配置 */ + "ios" : { + "dSYMs" : false + }, + /* SDK配置 */ + "sdkConfigs" : { + "ad" : {} + }, + "icons" : { + "android" : { + "hdpi" : "unpackage/res/icons/72x72.png", + "xhdpi" : "unpackage/res/icons/96x96.png", + "xxhdpi" : "unpackage/res/icons/144x144.png", + "xxxhdpi" : "unpackage/res/icons/192x192.png" + }, + "ios" : { + "appstore" : "unpackage/res/icons/1024x1024.png", + "ipad" : { + "app" : "unpackage/res/icons/76x76.png", + "app@2x" : "unpackage/res/icons/152x152.png", + "notification" : "unpackage/res/icons/20x20.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "proapp@2x" : "unpackage/res/icons/167x167.png", + "settings" : "unpackage/res/icons/29x29.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "spotlight" : "unpackage/res/icons/40x40.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png" + }, + "iphone" : { + "app@2x" : "unpackage/res/icons/120x120.png", + "app@3x" : "unpackage/res/icons/180x180.png", + "notification@2x" : "unpackage/res/icons/40x40.png", + "notification@3x" : "unpackage/res/icons/60x60.png", + "settings@2x" : "unpackage/res/icons/58x58.png", + "settings@3x" : "unpackage/res/icons/87x87.png", + "spotlight@2x" : "unpackage/res/icons/80x80.png", + "spotlight@3x" : "unpackage/res/icons/120x120.png" + } + } + } + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2", + "h5" : { + "router" : { + "base" : "./" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7542a27 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "jsencrypt": "^3.2.1" + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..2329e27 --- /dev/null +++ b/pages.json @@ -0,0 +1,140 @@ +{ + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { + "path" : "pages/login/login", + "style": { + "navigationStyle": "custom" + } + } + ,{ + "path" : "pages/home/home", + "style": { + "navigationStyle": "custom" + } + } + ,{ + "path" : "pages/login/setup", + "style": { + "navigationStyle": "custom" + } + } + ,{ + "path" : "pages/login/upgrade", + "style": { + "navigationStyle": "custom" + } + }, + { + "path" : "pages/modules/equip-inspection", + "style": { + "navigationStyle": "custom" + } + } + ,{ + "path" : "pages/modules/equip-operate", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/pallet-bind", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/sort-schedue", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/man-group", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/hunnian-carry", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/forced-rest", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/surplus-mater-instore", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/package-instore", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/call-full-mater", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/call-mupan", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/empty-instore", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/shelf-check", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/press-carry", + "style": { + "navigationStyle": "custom" + } + + } + ,{ + "path" : "pages/modules/hunnian-operate", + "style": { + "navigationStyle": "custom" + } + + } + ], + "globalStyle": { + // "pageOrientation": "landscape", + "navigationBarTextStyle": "white", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#d7592f", + "backgroundColor": "#ffffff" + }, + "uniIdRouter": {} +} diff --git a/pages/home/home.vue b/pages/home/home.vue new file mode 100644 index 0000000..797bd30 --- /dev/null +++ b/pages/home/home.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/pages/login/login.vue b/pages/login/login.vue new file mode 100644 index 0000000..0477dc8 --- /dev/null +++ b/pages/login/login.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/pages/login/setup.vue b/pages/login/setup.vue new file mode 100644 index 0000000..c196bb1 --- /dev/null +++ b/pages/login/setup.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/pages/login/upgrade.vue b/pages/login/upgrade.vue new file mode 100644 index 0000000..e3273d9 --- /dev/null +++ b/pages/login/upgrade.vue @@ -0,0 +1,229 @@ + + + + + diff --git a/pages/modules/call-full-mater.vue b/pages/modules/call-full-mater.vue new file mode 100644 index 0000000..d9ce7c4 --- /dev/null +++ b/pages/modules/call-full-mater.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/pages/modules/call-mupan.vue b/pages/modules/call-mupan.vue new file mode 100644 index 0000000..9c7e1fa --- /dev/null +++ b/pages/modules/call-mupan.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/pages/modules/empty-instore.vue b/pages/modules/empty-instore.vue new file mode 100644 index 0000000..827a045 --- /dev/null +++ b/pages/modules/empty-instore.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/pages/modules/equip-inspection.vue b/pages/modules/equip-inspection.vue new file mode 100644 index 0000000..1440a6a --- /dev/null +++ b/pages/modules/equip-inspection.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/pages/modules/equip-operate.vue b/pages/modules/equip-operate.vue new file mode 100644 index 0000000..af5a8eb --- /dev/null +++ b/pages/modules/equip-operate.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/pages/modules/forced-rest.vue b/pages/modules/forced-rest.vue new file mode 100644 index 0000000..4c8523a --- /dev/null +++ b/pages/modules/forced-rest.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/pages/modules/hunnian-carry.vue b/pages/modules/hunnian-carry.vue new file mode 100644 index 0000000..04cc8e7 --- /dev/null +++ b/pages/modules/hunnian-carry.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/pages/modules/hunnian-operate.vue b/pages/modules/hunnian-operate.vue new file mode 100644 index 0000000..ac4755a --- /dev/null +++ b/pages/modules/hunnian-operate.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/pages/modules/man-group.vue b/pages/modules/man-group.vue new file mode 100644 index 0000000..ff8d70f --- /dev/null +++ b/pages/modules/man-group.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/pages/modules/package-instore.vue b/pages/modules/package-instore.vue new file mode 100644 index 0000000..b6bc2cf --- /dev/null +++ b/pages/modules/package-instore.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/pages/modules/pallet-bind.vue b/pages/modules/pallet-bind.vue new file mode 100644 index 0000000..ce3e1f3 --- /dev/null +++ b/pages/modules/pallet-bind.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/pages/modules/press-carry.vue b/pages/modules/press-carry.vue new file mode 100644 index 0000000..b02b71b --- /dev/null +++ b/pages/modules/press-carry.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/pages/modules/shelf-check.vue b/pages/modules/shelf-check.vue new file mode 100644 index 0000000..b082d79 --- /dev/null +++ b/pages/modules/shelf-check.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/pages/modules/sort-schedue.vue b/pages/modules/sort-schedue.vue new file mode 100644 index 0000000..0b3f70c --- /dev/null +++ b/pages/modules/sort-schedue.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/pages/modules/surplus-mater-instore.vue b/pages/modules/surplus-mater-instore.vue new file mode 100644 index 0000000..3cdcd7b --- /dev/null +++ b/pages/modules/surplus-mater-instore.vue @@ -0,0 +1,101 @@ + + + + + diff --git a/static/iconfont/iconfont.ttf b/static/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b68f8e9004f95975f077aaef535a6d31e7464d60 GIT binary patch literal 3480 zcmd^BU2NM|6+h?xzhb*~lKCr1W7l?C+sQhA#j&?G>1UDxD(m|B0Ar2gIv=eQdyZS$ zP(e@;8rlSV;9;WE=mrmCYA4`{B9Jl-2?_DgJt5Jmv_Bo5B zoqK)HJ?GqW&pr2?dyfCaMC76sQYdra=<$7#m$xkw@zdZQJ9IRi8$JKUUxI!G^i+AF zRDVu;Wj~SdVRX$_FU-9D!Re2P)KMb6K36H78hCed0x0RQH{|000+(Pqw z5(xBt43MnW$|c9L@hbLj1szx@ov(8rUBr41=*VJeq0;q}(Vr7Juj0JfdTpsW@wJzJ zO611*^lgIe%F6u}dR_$yE!b!x4}jC;fIEG#-F>oi^dIE1Wbb@|w@R_~S%m}8I!MR~ zO=@ydoph6uTqioweUn~a&(JOsfQ~!fbN?!#G#xXG_p;?PRRURR)L6 zGfa7v_*K$y*YAlxV)X~s%pXyXu~U#{8i|$1+H*4#r)afRZrwBeLCP&!fr!-kpb2^4 z|1uy38%&36x3=&PZC&37S8Cmk8QuV2rD@Pz=&%hIoM~NdU1`15y4AXOAHI5sbF+0< zavo`H?v%S_e*$ZaYbrQjg;xxC#{rfVgGV<0-w~V48zVQ&2CuZr){yaNow0^|y{*gE zFynCrIEIX8>n&@@C(ycS4f*m~x2yqgQ|qoZ=C|~H($sFe0nTi97v>iAR5y< zc_60yyCFUt%@szv^Kq|F$3h%vVJGkA=oTK%1^j}>W=BV7mn9fWAI@YBzaYT};h`{o zQ&R!0cT;=C6Vw7zgT=n5dd2Esv1o+6YkRz*koS@^z{>&WC2vSf*-D_PUAMJB6_5F) zqVU`MH+6Tp_ZJ7-dp2+HEeul>D|7TNEe7*g!^p^^GKg`fU_)0&j%BjPM}%Rp!Y+gN&hFefvsW0d zJCCYTUvx_qs;b+w*R7kjfHr4o3y!vI!3@93;!Mg{#0vQ+OV83*;a3kFnlB8;2R71b zByZ%31=;h7xa=`Qm)#c(m_253^Oj7`;`%I^#KZY0%EH(0_jmS3L)rfR?2b%mZtUqo zYD>`X3x-pLXD&WdNQHxbe~%=_4o>XICi{YczGP;{Hwrm%zP7D#2?@nVtHZ4ZLL(xCmdYJi#`_~YWsavG zO>6&|NmbkLn@bwFZjIxdP(2$uKNa7i0q86ia!6fYCkG|aV`)ShAfDfi;{ary zeRjjreB*|t>c$P#qe4GsOdgfru@MNECOj@^eOoBcin|o1CyBOg9OgkCluKOkA%fe#(c70u znCq6{p|R?hY!S#wpQ30342xCd@gVId@}k0^3Y%FhOK@?(%H(yPmDy3#FbG9A3X)ZJ zWYQ0>It+1Crpwwj!x53`Y12U0K5-a^LwFsAnY&WLVemIL61nOyRwc^>SFRY2Upw_T z-;~PUvjGf#f^J){0r*BG2B!m*`AXnpgErf^0)EWKRp3K5uHlO}XX85fV>a$YR3>cP z1&wuhiBp^fX{ui3bhPO#g?T@>f? z{zj$LtelEWUx>_?Yl}0r#pe2aq%wQ9T57D5>+^|9V`;v&7|EtG>#PHn#Y$sc&C zv>a?~!lDR91DY0qP1^QVU`Z8t1Ob$5r=h0|=@iYGyXv$9e_iQ~`>e~S%zG}#4{fW- z@BRPQoGeiMRn}N%gFD!P|92O;mgh>f^Yf*}+0*m-`Lm_P<%&92Tc{Z4=9lKDs})b> nLggg9--P!OHg&pGKBJYZwWW%_R4FyebNW)bw0QW4dE$QnsI>+0 literal 0 HcmV?d00001 diff --git a/static/iconfont/iconfont.woff b/static/iconfont/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..655b9ec46650b60023ac9ab90232d1a13ef0f8f6 GIT binary patch literal 2260 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 U2>e_sb7~9VO{|RT486$z2cgKqd;kCd literal 0 HcmV?d00001 diff --git a/static/image/bg_top.png b/static/image/bg_top.png new file mode 100644 index 0000000000000000000000000000000000000000..015f698cdd8c8caa63486a2bd87f5a96f17df630 GIT binary patch literal 30486 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 literal 0 HcmV?d00001 diff --git a/static/image/exit.png b/static/image/exit.png new file mode 100644 index 0000000000000000000000000000000000000000..fefa052deb0fddcd8447207a4ece9bb88400dfe3 GIT binary patch literal 1235 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m^Cs(B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxOgGuk*h0bFQqR!T z(!$6@N5ROz&`jUJQs2--*TB%qz|zXVPyq^*fVLH-q*(>IxIyg#@@$ndN=gc>^!3Zj z%k|2Q_413-^$jg8E%gnI^o@*kfhu&1EAvVcD|GXUm0>2hq!uR^WfqiV=I1GZOiWD5 zFD$Tv3bSNU;+l1ennz|zM-B0$V)JVzP|XC=H|jx7ncO3BHWAB;NpiyW)Z+ZoqGVvir744~DzI`cN=+=uFAB-e&w+(vKt_H^esM;Afr7I$DAddqG<*}2 zGxI=#nqXbNzE+-j#U+V($*G<$wn{*A^fEJ3tSnrOEKFUU%$*!vjSUT5EgX%UO)O1} zjg3s)T%0W}OkjFl@{>z*Q}aq-dQ%X3EpX}uC5YStpv^9+MVV!(DQ-pixe8#9TV>*Q ziz!a?pn6kqyTuHrUVWfr^g+>!6x}c(U>X83;fWW>fhYgeJYbqH0w(VM>dn~<42+JR zE{-7;x03$+|6k9;%nY z5%*4m34$HMjS*rUl^-N|nB5!i-SX)PZakRIZ#ttJLc5I66c%_tX{BW zY4;SBjg3bgblRVNVscvP#M$wD;tTEx5C66_J+j}K=yKxd_eP6Ohk%AdTco5!crF;| zAIUZ_P;ZK<;q;ej;F;TymcbZspWiFkRm{XEkY}k|Q8cfv9gwkPO#|!Ig*DZ8(9rco|Stc6sN=+rluzQzinACyM`KT%|TU0 qt}ac7Kg~T47?!rN?oeT5;$f%{NphN=^5Q6{nDKP=b6Mw<&;$T1bCxUs literal 0 HcmV?d00001 diff --git a/static/image/info_bg.png b/static/image/info_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7e000c44828d06afb60ce07d9e767193af693b GIT binary patch literal 12101 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 literal 0 HcmV?d00001 diff --git a/static/image/login_bg.png b/static/image/login_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..680a940aba7f2216469b3910dc0855268e1dfec1 GIT binary patch literal 170307 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

8h^^G33F+ZxN@%{&yKS2;nl{XkrI?SA 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 U?z4VAj{pDw07*qoM6N<$f*m?F5dZ)H literal 0 HcmV?d00001 diff --git a/static/image/menu/RF01.png b/static/image/menu/RF01.png new file mode 100644 index 0000000000000000000000000000000000000000..5f06944058382416a6d8195261c0a69b12f1f47f GIT binary patch literal 2595 zcmaJ@cUV)|5(f(?MHU~zQd};H-Gq=p0tp6$Bp_%MF)D(TlnaTZkpx083bLZ2D2Xnx z%0tD%6FagNin53cQ3yq(YE+geC{;iZTy$?x-1o=x-S4||&dizLZ|2OId%l|*u-@0y z$i_%dPtVkE4LJ}RgLUs514z1E@R|V)))GpPWRoCLBBhH!JujAk0RnzJdK4H4(pj>Y zhu|tby_w56v>-_kbsd2z;5pKDK92D`A%xb`Tjd!qq%)&I3BUlOID8^(pri~2a9Bjx zRxH(tDkOny&YA=fxG7;hjhPV5#IsA)20z|+AC3GO3$K{I&@kH1ZF9DkC%qSQz zC(-aVRG|3hjb)LKB?u1Sd4` z^?^arM65_cAlc_@EJ!25*b<45fI>;7Qb(z?qd*jeLgVpxloJMp!5|?Iq*%t6(BqMO zF?^bV42qc|j!?o8@Btkoogs*o5MfZJU$(##exv1!zm^Fq7%HAFM4=s>bX%Hsq*DLC zE06chTPz6#|H=1%5{qdvA&3eD#e!H76FRs^xGt2CKoWs;i9kdX2)NT#3}6c+0x?@4 z1V|)Z)m(vPR63Kx*BO^jp{P`XA73n?^O>L@nFxb;961~o!P$+B^TGMJd3#Z?Xf(ym z3qx|jyEr>zTztqRyqn83mMmb#@<6_18q4|zi~lZG*AP4*6qyW)IB_7$M!Rh5~3DvZAfnf>eQcP%$+D?Wy_7+a@$W>vkA4#o5m zgQM3qTc%oezAsj0Q0c=T0q-tm0vuzX9u<*bna2!Dv`Ex$1pexFb$PvjNjT7wotnmw z-6`1aaqG>{(k1pXoBZqBcF$^iIDFgeR5ye5!|{iw!hP%9&Bzs|ps2t!>$AdB@k*7X z9-6H(R&7;X@qjz8jB62&90a`F%On3v-!+p%8j_RO|K9Jh%6lZJGe4HZEGL&ssTp^0e2c&?Jk!?A>>1H7Cf+TovL z@2}Ap1?p=DCymvp$<{OWlu=mMtM;AJ42AbiD^{vq%=H0j+V-umBM76(Yq425i{oM~2Zpo4RqxM> zAm8+*_Vx=I;c3s740`16xXRTUT2_-RQ$D$DW-gjNikBPbbv!<+nj7iKJ#o<^=6bEs zaTQcbWy%TZ1qT+#rgtp3{19AfUpnt@KF7UcIOPN2R zY&YpaDE2(Fh%?+aCm~|^LBwSCPb0t^1U1~I*H-bz8I^iLze9C*vS)cIem1zD+SyzO zcQDsx`b(85x$q4Ib!ge+nQQ{k|EFQo@OY_MnWgYI*EX*hQ&PQ=T>+z~8=l7<u58#L8j~EZZHWb@*8qy;1t?HM< z8(z=R)H0UFXA~tj2E3G>{z>aoEw=IfNy}VBzZb5KGl@Lxue!Lpy7Kw`G4(o)wZVt07?Q*B4zi-=b%EYdomL1(St+xl`#xWk1%7MYC^pMKc6SVtV z%ul>U+G<}Yp7KW9T+(Zw)q@6yf?jX*G*!n0I-olGI<+&k%d$%i_Rc$#H9Y<(!d9P@ zhaQw34Ti^P-yq)KwDX@bo&59hxx8>Yd?@O%lnVz`z8{8)mbbSZS7iK-n~}V(iP@O{ zFmlxcSKZnh0=6w~y}TSZV=s4q&RW?K-Yk=Cgwb1*4ej|R$Yg|VNf~nf-JL7Et5;{H zQZ?^2eKY$Rw)#GhGOxtlKvRL6aRjk&XO+Uel}~D{I$CRgRcOAA5Z9$Y-pcn5e^9l! zSkV&dlX*mgMOZyWvWrEjwUPfR9)5&`KB-{qR*m6V*Gnc;rrAeDG&d6^HOGfZP_n{` z*f-6G$COoyx})6Dku)-jwjg1ph;!oA?3(Pi!lX%a-jB$PNUAu+Pr8V8&FA^Ih;&0zgFp^%I8_D&KAgL zJWUwQTZ3g!*j#GEReSjKM=)ACi}ny#$_&~Yo)B(4uNk@IUoZYpzNo0%Bc_=3a*1V$ zZFQZ0il&73*;;*PK2BEP-sE5{;QLS1y=6p&&0j4Ai7JMb%f-Nj@^(J2@+RdBCHIHy zeKgzLy|(G>&zeg{68ND|vE8*(iv7y1zn;i2+IdM`+|%P2cCN5?Vk4{I zW9eqfEk>hb=PzmzA@g!R3VXXcfn@zc>t^;jbYX7&ht3b(rn7rjI-@E|4c1k}-}Pph zRPRS?8UiBy?_Lc~oO{{#JaohFYyKjk8=lnjSSO>|(4`;CVQ=n9)Hl!@IA&JYfX#lT P`)%{1tS4Xfj!6C+Uz29* literal 0 HcmV?d00001 diff --git a/static/image/menu/RF02.png b/static/image/menu/RF02.png new file mode 100644 index 0000000000000000000000000000000000000000..15c177a8163ce2d03f84990bc92bdb687a1dd55a GIT binary patch literal 2668 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 literal 0 HcmV?d00001 diff --git a/static/image/menu/RF04.png b/static/image/menu/RF04.png new file mode 100644 index 0000000000000000000000000000000000000000..775f2e8d9c4f1b89be40339c285fb11af636a688 GIT binary patch literal 2249 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 literal 0 HcmV?d00001 diff --git a/static/image/menu/RF06.png b/static/image/menu/RF06.png new file mode 100644 index 0000000000000000000000000000000000000000..30c871f3c82ecc4e9bc9851577dc0b125a22aaa7 GIT binary patch literal 2390 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 V9V^0nj=l!fqMojPF6*2UngAdJA3gv8 literal 0 HcmV?d00001 diff --git a/static/image/menu/RF08.png b/static/image/menu/RF08.png new file mode 100644 index 0000000000000000000000000000000000000000..d2b969bf0ae2f9e84136d31f5490edfcd916f351 GIT binary patch literal 2601 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 w3luO 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 literal 0 HcmV?d00001 diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..a9a742d --- /dev/null +++ b/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color:#333;//基本色 +$uni-text-color-inverse:#fff;//反色 +$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable:#c0c0c0; + +/* 背景颜色 */ +$uni-bg-color:#ffffff; +$uni-bg-color-grey:#f8f8f8; +$uni-bg-color-hover:#f1f1f1;//点击状态颜色 +$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 + +/* 边框颜色 */ +$uni-border-color:#c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm:12px; +$uni-font-size-base:14px; +$uni-font-size-lg:16; + +/* 图片尺寸 */ +$uni-img-size-sm:20px; +$uni-img-size-base:26px; +$uni-img-size-lg:40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2C405A; // 文章标题颜色 +$uni-font-size-title:20px; +$uni-color-subtitle: #555555; // 二级标题颜色 +$uni-font-size-subtitle:26px; +$uni-color-paragraph: #3F536E; // 文章段落颜色 +$uni-font-size-paragraph:15px; diff --git a/uniCloud-aliyun/database/JQL查询.jql b/uniCloud-aliyun/database/JQL查询.jql new file mode 100644 index 0000000..35d21de --- /dev/null +++ b/uniCloud-aliyun/database/JQL查询.jql @@ -0,0 +1,12 @@ +// 本文件用于,使用JQL语法操作项目关联的uniCloud空间的数据库,方便开发调试和远程数据库管理 +// 编写clientDB的js API(也支持常规js语法,比如var),可以对云数据库进行增删改查操作。不支持uniCloud-db组件写法 +// 可以全部运行,也可以选中部分代码运行。点击工具栏上的运行按钮或者按下【F5】键运行代码 +// 如果文档中存在多条JQL语句,只有最后一条语句生效 +// 如果混写了普通js,最后一条语句需是数据库操作语句 +// 此处代码运行不受DB Schema的权限控制,移植代码到实际业务中注意在schema中配好permission +// 不支持clientDB的action +// 数据库查询有最大返回条数限制,详见:https://uniapp.dcloud.net.cn/uniCloud/cf-database.html#limit +// 详细JQL语法,请参考:https://uniapp.dcloud.net.cn/uniCloud/jql.html + +// 下面示例查询uni-id-users表的所有数据 +db.collection('uni-id-users').get(); diff --git a/uni_modules/uni-config-center/changelog.md b/uni_modules/uni-config-center/changelog.md new file mode 100644 index 0000000..4d2eb92 --- /dev/null +++ b/uni_modules/uni-config-center/changelog.md @@ -0,0 +1,4 @@ +## 0.0.2(2021-04-16) +- 修改插件package信息 +## 0.0.1(2021-03-15) +- 初始化项目 diff --git a/uni_modules/uni-config-center/package.json b/uni_modules/uni-config-center/package.json new file mode 100644 index 0000000..d97bd27 --- /dev/null +++ b/uni_modules/uni-config-center/package.json @@ -0,0 +1,80 @@ +{ + "id": "uni-config-center", + "displayName": "uni-config-center", + "version": "0.0.2", + "description": "uniCloud 配置中心", + "keywords": [ + "配置", + "配置中心" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "uniCloud", + "云函数模板" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "directories": { + "example": "../../../scripts/dist" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/uni_modules/uni-config-center/readme.md b/uni_modules/uni-config-center/readme.md new file mode 100644 index 0000000..0bd8ac4 --- /dev/null +++ b/uni_modules/uni-config-center/readme.md @@ -0,0 +1,93 @@ +# 为什么使用uni-config-center + +实际开发中很多插件需要配置文件才可以正常运行,如果每个插件都单独进行配置的话就会产生下面这样的目录结构 + +```bash +cloudfunctions +└─────common 公共模块 + ├─plugin-a // 插件A对应的目录 + │ ├─index.js + │ ├─config.json // plugin-a对应的配置文件 + │ └─other-file.cert // plugin-a依赖的其他文件 + └─plugin-b // plugin-b对应的目录 + ├─index.js + └─config.json // plugin-b对应的配置文件 +``` + +假设插件作者要发布一个项目模板,里面使用了很多需要配置的插件,无论是作者发布还是用户使用都是一个大麻烦。 + +uni-config-center就是用了统一管理这些配置文件的,使用uni-config-center后的目录结构如下 + +```bash +cloudfunctions +└─────common 公共模块 + ├─plugin-a // 插件A对应的目录 + │ └─index.js + ├─plugin-b // plugin-b对应的目录 + │ └─index.js + └─uni-config-center + ├─index.js // config-center入口文件 + ├─plugin-a + │ ├─config.json // plugin-a对应的配置文件 + │ └─other-file.cert // plugin-a依赖的其他文件 + └─plugin-b + └─config.json // plugin-b对应的配置文件 +``` + +使用uni-config-center后的优势 + +- 配置文件统一管理,分离插件主体和配置信息,更新插件更方便 +- 支持对config.json设置schema,插件使用者在HBuilderX内编写config.json文件时会有更好的提示(后续HBuilderX会提供支持) + +# 用法 + +在要使用uni-config-center的公共模块或云函数内引入uni-config-center依赖,请参考:[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common) + +```js +const createConfig = require('uni-config-center') + +const uniIdConfig = createConfig({ + pluginId: 'uni-id', // 插件id + defaultConfig: { // 默认配置 + tokenExpiresIn: 7200, + tokenExpiresThreshold: 600, + }, + customMerge: function(defaultConfig, userConfig) { // 自定义默认配置和用户配置的合并规则,不设置的情况侠会对默认配置和用户配置进行深度合并 + // defaudltConfig 默认配置 + // userConfig 用户配置 + return Object.assign(defaultConfig, userConfig) + } +}) + + +// 以如下配置为例 +// { +// "tokenExpiresIn": 7200, +// "passwordErrorLimit": 6, +// "bindTokenToDevice": false, +// "passwordErrorRetryTime": 3600, +// "app-plus": { +// "tokenExpiresIn": 2592000 +// }, +// "service": { +// "sms": { +// "codeExpiresIn": 300 +// } +// } +// } + +// 获取配置 +uniIdConfig.config() // 获取全部配置,注意:uni-config-center内不存在对应插件目录时会返回空对象 +uniIdConfig.config('tokenExpiresIn') // 指定键值获取配置,返回:7200 +uniIdConfig.config('service.sms.codeExpiresIn') // 指定键值获取配置,返回:300 +uniIdConfig.config('tokenExpiresThreshold', 600) // 指定键值获取配置,如果不存在则取传入的默认值,返回:600 + +// 获取文件绝对路径 +uniIdConfig.resolve('custom-token.js') // 获取uni-config-center/uni-id/custom-token.js文件的路径 + +// 引用文件(require) +uniIDConfig.requireFile('custom-token.js') // 使用require方式引用uni-config-center/uni-id/custom-token.js文件。文件不存在时返回undefined,文件内有其他错误导致require失败时会抛出错误。 + +// 判断是否包含某文件 +uniIDConfig.hasFile('custom-token.js') // 配置目录是否包含某文件,true: 文件存在,false: 文件不存在 +``` \ No newline at end of file diff --git a/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js b/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js new file mode 100644 index 0000000..e14fb3b --- /dev/null +++ b/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js @@ -0,0 +1 @@ +"use strict";var t=require("fs"),r=require("path");function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=e(t),o=e(r),i="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var u=function(t){var r={exports:{}};return t(r,r.exports),r.exports}((function(t,r){var e="__lodash_hash_undefined__",n=9007199254740991,o="[object Arguments]",u="[object Function]",c="[object Object]",a=/^\[object .+?Constructor\]$/,f=/^(?:0|[1-9]\d*)$/,s={};s["[object Float32Array]"]=s["[object Float64Array]"]=s["[object Int8Array]"]=s["[object Int16Array]"]=s["[object Int32Array]"]=s["[object Uint8Array]"]=s["[object Uint8ClampedArray]"]=s["[object Uint16Array]"]=s["[object Uint32Array]"]=!0,s[o]=s["[object Array]"]=s["[object ArrayBuffer]"]=s["[object Boolean]"]=s["[object DataView]"]=s["[object Date]"]=s["[object Error]"]=s[u]=s["[object Map]"]=s["[object Number]"]=s[c]=s["[object RegExp]"]=s["[object Set]"]=s["[object String]"]=s["[object WeakMap]"]=!1;var l="object"==typeof i&&i&&i.Object===Object&&i,h="object"==typeof self&&self&&self.Object===Object&&self,p=l||h||Function("return this")(),_=r&&!r.nodeType&&r,v=_&&t&&!t.nodeType&&t,d=v&&v.exports===_,y=d&&l.process,g=function(){try{var t=v&&v.require&&v.require("util").types;return t||y&&y.binding&&y.binding("util")}catch(t){}}(),b=g&&g.isTypedArray;function j(t,r,e){switch(e.length){case 0:return t.call(r);case 1:return t.call(r,e[0]);case 2:return t.call(r,e[0],e[1]);case 3:return t.call(r,e[0],e[1],e[2])}return t.apply(r,e)}var w,O,m,A=Array.prototype,z=Function.prototype,M=Object.prototype,x=p["__core-js_shared__"],C=z.toString,F=M.hasOwnProperty,U=(w=/[^.]+$/.exec(x&&x.keys&&x.keys.IE_PROTO||""))?"Symbol(src)_1."+w:"",S=M.toString,I=C.call(Object),P=RegExp("^"+C.call(F).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),T=d?p.Buffer:void 0,q=p.Symbol,E=p.Uint8Array,$=T?T.allocUnsafe:void 0,D=(O=Object.getPrototypeOf,m=Object,function(t){return O(m(t))}),k=Object.create,B=M.propertyIsEnumerable,N=A.splice,L=q?q.toStringTag:void 0,R=function(){try{var t=_t(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),G=T?T.isBuffer:void 0,V=Math.max,W=Date.now,H=_t(p,"Map"),J=_t(Object,"create"),K=function(){function t(){}return function(r){if(!Mt(r))return{};if(k)return k(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}();function Q(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},X.prototype.set=function(t,r){var e=this.__data__,n=nt(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this},Y.prototype.clear=function(){this.size=0,this.__data__={hash:new Q,map:new(H||X),string:new Q}},Y.prototype.delete=function(t){var r=pt(this,t).delete(t);return this.size-=r?1:0,r},Y.prototype.get=function(t){return pt(this,t).get(t)},Y.prototype.has=function(t){return pt(this,t).has(t)},Y.prototype.set=function(t,r){var e=pt(this,t),n=e.size;return e.set(t,r),this.size+=e.size==n?0:1,this},Z.prototype.clear=function(){this.__data__=new X,this.size=0},Z.prototype.delete=function(t){var r=this.__data__,e=r.delete(t);return this.size=r.size,e},Z.prototype.get=function(t){return this.__data__.get(t)},Z.prototype.has=function(t){return this.__data__.has(t)},Z.prototype.set=function(t,r){var e=this.__data__;if(e instanceof X){var n=e.__data__;if(!H||n.length<199)return n.push([t,r]),this.size=++e.size,this;e=this.__data__=new Y(n)}return e.set(t,r),this.size=e.size,this};var it,ut=function(t,r,e){for(var n=-1,o=Object(t),i=e(t),u=i.length;u--;){var c=i[it?u:++n];if(!1===r(o[c],c,o))break}return t};function ct(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":L&&L in Object(t)?function(t){var r=F.call(t,L),e=t[L];try{t[L]=void 0;var n=!0}catch(t){}var o=S.call(t);n&&(r?t[L]=e:delete t[L]);return o}(t):function(t){return S.call(t)}(t)}function at(t){return xt(t)&&ct(t)==o}function ft(t){return!(!Mt(t)||function(t){return!!U&&U in t}(t))&&(At(t)?P:a).test(function(t){if(null!=t){try{return C.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t){if(!Mt(t))return function(t){var r=[];if(null!=t)for(var e in Object(t))r.push(e);return r}(t);var r=dt(t),e=[];for(var n in t)("constructor"!=n||!r&&F.call(t,n))&&e.push(n);return e}function lt(t,r,e,n,o){t!==r&&ut(r,(function(i,u){if(o||(o=new Z),Mt(i))!function(t,r,e,n,o,i,u){var a=yt(t,e),f=yt(r,e),s=u.get(f);if(s)return void rt(t,e,s);var l=i?i(a,f,e+"",t,r,u):void 0,h=void 0===l;if(h){var p=wt(f),_=!p&&mt(f),v=!p&&!_&&Ct(f);l=f,p||_||v?wt(a)?l=a:xt(j=a)&&Ot(j)?l=function(t,r){var e=-1,n=t.length;r||(r=Array(n));for(;++e-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(R?function(t,r){return R(t,"toString",{configurable:!0,enumerable:!1,value:(e=r,function(){return e}),writable:!0});var e}:It);function bt(t,r){return t===r||t!=t&&r!=r}var jt=at(function(){return arguments}())?at:function(t){return xt(t)&&F.call(t,"callee")&&!B.call(t,"callee")},wt=Array.isArray;function Ot(t){return null!=t&&zt(t.length)&&!At(t)}var mt=G||function(){return!1};function At(t){if(!Mt(t))return!1;var r=ct(t);return r==u||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}function zt(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=n}function Mt(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function xt(t){return null!=t&&"object"==typeof t}var Ct=b?function(t){return function(r){return t(r)}}(b):function(t){return xt(t)&&zt(t.length)&&!!s[ct(t)]};function Ft(t){return Ot(t)?tt(t,!0):st(t)}var Ut,St=(Ut=function(t,r,e){lt(t,r,e)},ht((function(t,r){var e=-1,n=r.length,o=n>1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=Ut.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!Mt(e))return!1;var n=typeof r;return!!("number"==n?Ot(e)&&vt(r,e.length):"string"==n&&r in e)&&bt(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++ec.call(t,r);class f{constructor({pluginId:t,defaultConfig:r={},customMerge:e,root:n}){this.pluginId=t,this.defaultConfig=r,this.pluginConfigPath=o.default.resolve(n||__dirname,t),this.customMerge=e,this._config=void 0}resolve(t){return o.default.resolve(this.pluginConfigPath,t)}hasFile(t){return n.default.existsSync(this.resolve(t))}requireFile(t){try{return require(this.resolve(t))}catch(t){if("MODULE_NOT_FOUND"===t.code)return;throw t}}_getUserConfig(){return this.requireFile("config.json")}config(t,r){this._config||(this._config=(this.customMerge||u)(this.defaultConfig,this._getUserConfig()));let e=this._config;return t?function(t,r,e){if("number"==typeof r)return t[r];if("symbol"==typeof r)return a(t,r)?t[r]:e;const n="string"!=typeof(o=r)?o:o.split(".").reduce(((t,r)=>(r.split(/\[([^}]+)\]/g).forEach((r=>r&&t.push(r))),t)),[]);var o;let i=t;for(let t=0;t + + {{label + ':'}} + + + + {{current}} + {{typePlaceholder}} + + + + + + + + + + {{emptyTips}} + + + {{formatItemName(item)}} + + + + + + + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 0000000..131c808 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "0.1.6", + "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": { + "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-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "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** +> 代码块: `uDataSelect` + +当选项过多时,使用下拉菜单展示并选择内容 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..6449885 --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,22 @@ +## 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,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.5(2021-05-12) +- 新增 组件示例地址 +## 1.1.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js new file mode 100644 index 0000000..7889936 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/icons.js @@ -0,0 +1,1169 @@ +export default { + "id": "2852637", + "name": "uniui图标库", + "font_family": "uniicons", + "css_prefix_text": "uniui-", + "description": "", + "glyphs": [ + { + "icon_id": "25027049", + "name": "yanse", + "font_class": "color", + "unicode": "e6cf", + "unicode_decimal": 59087 + }, + { + "icon_id": "25027048", + "name": "wallet", + "font_class": "wallet", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "25015720", + "name": "settings-filled", + "font_class": "settings-filled", + "unicode": "e6ce", + "unicode_decimal": 59086 + }, + { + "icon_id": "25015434", + "name": "shimingrenzheng-filled", + "font_class": "auth-filled", + "unicode": "e6cc", + "unicode_decimal": 59084 + }, + { + "icon_id": "24934246", + "name": "shop-filled", + "font_class": "shop-filled", + "unicode": "e6cd", + "unicode_decimal": 59085 + }, + { + "icon_id": "24934159", + "name": "staff-filled-01", + "font_class": "staff-filled", + "unicode": "e6cb", + "unicode_decimal": 59083 + }, + { + "icon_id": "24932461", + "name": "VIP-filled", + "font_class": "vip-filled", + "unicode": "e6c6", + "unicode_decimal": 59078 + }, + { + "icon_id": "24932462", + "name": "plus_circle_fill", + "font_class": "plus-filled", + "unicode": "e6c7", + "unicode_decimal": 59079 + }, + { + "icon_id": "24932463", + "name": "folder_add-filled", + "font_class": "folder-add-filled", + "unicode": "e6c8", + "unicode_decimal": 59080 + }, + { + "icon_id": "24932464", + "name": "yanse-filled", + "font_class": "color-filled", + "unicode": "e6c9", + "unicode_decimal": 59081 + }, + { + "icon_id": "24932465", + "name": "tune-filled", + "font_class": "tune-filled", + "unicode": "e6ca", + "unicode_decimal": 59082 + }, + { + "icon_id": "24932455", + "name": "a-rilidaka-filled", + "font_class": "calendar-filled", + "unicode": "e6c0", + "unicode_decimal": 59072 + }, + { + "icon_id": "24932456", + "name": "notification-filled", + "font_class": "notification-filled", + "unicode": "e6c1", + "unicode_decimal": 59073 + }, + { + "icon_id": "24932457", + "name": "wallet-filled", + "font_class": "wallet-filled", + "unicode": "e6c2", + "unicode_decimal": 59074 + }, + { + "icon_id": "24932458", + "name": "paihangbang-filled", + "font_class": "medal-filled", + "unicode": "e6c3", + "unicode_decimal": 59075 + }, + { + "icon_id": "24932459", + "name": "gift-filled", + "font_class": "gift-filled", + "unicode": "e6c4", + "unicode_decimal": 59076 + }, + { + "icon_id": "24932460", + "name": "fire-filled", + "font_class": "fire-filled", + "unicode": "e6c5", + "unicode_decimal": 59077 + }, + { + "icon_id": "24928001", + "name": "refreshempty", + "font_class": "refreshempty", + "unicode": "e6bf", + "unicode_decimal": 59071 + }, + { + "icon_id": "24926853", + "name": "location-ellipse", + "font_class": "location-filled", + "unicode": "e6af", + "unicode_decimal": 59055 + }, + { + "icon_id": "24926735", + "name": "person-filled", + "font_class": "person-filled", + "unicode": "e69d", + "unicode_decimal": 59037 + }, + { + "icon_id": "24926703", + "name": "personadd-filled", + "font_class": "personadd-filled", + "unicode": "e698", + "unicode_decimal": 59032 + }, + { + "icon_id": "24923351", + "name": "back", + "font_class": "back", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "24923352", + "name": "forward", + "font_class": "forward", + "unicode": "e6ba", + "unicode_decimal": 59066 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrow-right", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923353", + "name": "arrowthinright", + "font_class": "arrowthinright", + "unicode": "e6bb", + "unicode_decimal": 59067 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrow-left", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923354", + "name": "arrowthinleft", + "font_class": "arrowthinleft", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrow-up", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrowthinup", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrow-down", + "unicode": "e6be", + "unicode_decimal": 59070 + },{ + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrowthindown", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "bottom", + "unicode": "e6b8", + "unicode_decimal": 59064 + },{ + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "arrowdown", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "right", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "arrowright", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "top", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "arrowup", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "left", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "arrowleft", + "unicode": "e6b7", + "unicode_decimal": 59063 + }, + { + "icon_id": "24923334", + "name": "eye", + "font_class": "eye", + "unicode": "e651", + "unicode_decimal": 58961 + }, + { + "icon_id": "24923335", + "name": "eye-filled", + "font_class": "eye-filled", + "unicode": "e66a", + "unicode_decimal": 58986 + }, + { + "icon_id": "24923336", + "name": "eye-slash", + "font_class": "eye-slash", + "unicode": "e6b3", + "unicode_decimal": 59059 + }, + { + "icon_id": "24923337", + "name": "eye-slash-filled", + "font_class": "eye-slash-filled", + "unicode": "e6b4", + "unicode_decimal": 59060 + }, + { + "icon_id": "24923305", + "name": "info-filled", + "font_class": "info-filled", + "unicode": "e649", + "unicode_decimal": 58953 + }, + { + "icon_id": "24923299", + "name": "reload-01", + "font_class": "reload", + "unicode": "e6b2", + "unicode_decimal": 59058 + }, + { + "icon_id": "24923195", + "name": "mic_slash_fill", + "font_class": "micoff-filled", + "unicode": "e6b0", + "unicode_decimal": 59056 + }, + { + "icon_id": "24923165", + "name": "map-pin-ellipse", + "font_class": "map-pin-ellipse", + "unicode": "e6ac", + "unicode_decimal": 59052 + }, + { + "icon_id": "24923166", + "name": "map-pin", + "font_class": "map-pin", + "unicode": "e6ad", + "unicode_decimal": 59053 + }, + { + "icon_id": "24923167", + "name": "location", + "font_class": "location", + "unicode": "e6ae", + "unicode_decimal": 59054 + }, + { + "icon_id": "24923064", + "name": "starhalf", + "font_class": "starhalf", + "unicode": "e683", + "unicode_decimal": 59011 + }, + { + "icon_id": "24923065", + "name": "star", + "font_class": "star", + "unicode": "e688", + "unicode_decimal": 59016 + }, + { + "icon_id": "24923066", + "name": "star-filled", + "font_class": "star-filled", + "unicode": "e68f", + "unicode_decimal": 59023 + }, + { + "icon_id": "24899646", + "name": "a-rilidaka", + "font_class": "calendar", + "unicode": "e6a0", + "unicode_decimal": 59040 + }, + { + "icon_id": "24899647", + "name": "fire", + "font_class": "fire", + "unicode": "e6a1", + "unicode_decimal": 59041 + }, + { + "icon_id": "24899648", + "name": "paihangbang", + "font_class": "medal", + "unicode": "e6a2", + "unicode_decimal": 59042 + }, + { + "icon_id": "24899649", + "name": "font", + "font_class": "font", + "unicode": "e6a3", + "unicode_decimal": 59043 + }, + { + "icon_id": "24899650", + "name": "gift", + "font_class": "gift", + "unicode": "e6a4", + "unicode_decimal": 59044 + }, + { + "icon_id": "24899651", + "name": "link", + "font_class": "link", + "unicode": "e6a5", + "unicode_decimal": 59045 + }, + { + "icon_id": "24899652", + "name": "notification", + "font_class": "notification", + "unicode": "e6a6", + "unicode_decimal": 59046 + }, + { + "icon_id": "24899653", + "name": "staff", + "font_class": "staff", + "unicode": "e6a7", + "unicode_decimal": 59047 + }, + { + "icon_id": "24899654", + "name": "VIP", + "font_class": "vip", + "unicode": "e6a8", + "unicode_decimal": 59048 + }, + { + "icon_id": "24899655", + "name": "folder_add", + "font_class": "folder-add", + "unicode": "e6a9", + "unicode_decimal": 59049 + }, + { + "icon_id": "24899656", + "name": "tune", + "font_class": "tune", + "unicode": "e6aa", + "unicode_decimal": 59050 + }, + { + "icon_id": "24899657", + "name": "shimingrenzheng", + "font_class": "auth", + "unicode": "e6ab", + "unicode_decimal": 59051 + }, + { + "icon_id": "24899565", + "name": "person", + "font_class": "person", + "unicode": "e699", + "unicode_decimal": 59033 + }, + { + "icon_id": "24899566", + "name": "email-filled", + "font_class": "email-filled", + "unicode": "e69a", + "unicode_decimal": 59034 + }, + { + "icon_id": "24899567", + "name": "phone-filled", + "font_class": "phone-filled", + "unicode": "e69b", + "unicode_decimal": 59035 + }, + { + "icon_id": "24899568", + "name": "phone", + "font_class": "phone", + "unicode": "e69c", + "unicode_decimal": 59036 + }, + { + "icon_id": "24899570", + "name": "email", + "font_class": "email", + "unicode": "e69e", + "unicode_decimal": 59038 + }, + { + "icon_id": "24899571", + "name": "personadd", + "font_class": "personadd", + "unicode": "e69f", + "unicode_decimal": 59039 + }, + { + "icon_id": "24899558", + "name": "chatboxes-filled", + "font_class": "chatboxes-filled", + "unicode": "e692", + "unicode_decimal": 59026 + }, + { + "icon_id": "24899559", + "name": "contact", + "font_class": "contact", + "unicode": "e693", + "unicode_decimal": 59027 + }, + { + "icon_id": "24899560", + "name": "chatbubble-filled", + "font_class": "chatbubble-filled", + "unicode": "e694", + "unicode_decimal": 59028 + }, + { + "icon_id": "24899561", + "name": "contact-filled", + "font_class": "contact-filled", + "unicode": "e695", + "unicode_decimal": 59029 + }, + { + "icon_id": "24899562", + "name": "chatboxes", + "font_class": "chatboxes", + "unicode": "e696", + "unicode_decimal": 59030 + }, + { + "icon_id": "24899563", + "name": "chatbubble", + "font_class": "chatbubble", + "unicode": "e697", + "unicode_decimal": 59031 + }, + { + "icon_id": "24881290", + "name": "upload-filled", + "font_class": "upload-filled", + "unicode": "e68e", + "unicode_decimal": 59022 + }, + { + "icon_id": "24881292", + "name": "upload", + "font_class": "upload", + "unicode": "e690", + "unicode_decimal": 59024 + }, + { + "icon_id": "24881293", + "name": "weixin", + "font_class": "weixin", + "unicode": "e691", + "unicode_decimal": 59025 + }, + { + "icon_id": "24881274", + "name": "compose", + "font_class": "compose", + "unicode": "e67f", + "unicode_decimal": 59007 + }, + { + "icon_id": "24881275", + "name": "qq", + "font_class": "qq", + "unicode": "e680", + "unicode_decimal": 59008 + }, + { + "icon_id": "24881276", + "name": "download-filled", + "font_class": "download-filled", + "unicode": "e681", + "unicode_decimal": 59009 + }, + { + "icon_id": "24881277", + "name": "pengyouquan", + "font_class": "pyq", + "unicode": "e682", + "unicode_decimal": 59010 + }, + { + "icon_id": "24881279", + "name": "sound", + "font_class": "sound", + "unicode": "e684", + "unicode_decimal": 59012 + }, + { + "icon_id": "24881280", + "name": "trash-filled", + "font_class": "trash-filled", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "24881281", + "name": "sound-filled", + "font_class": "sound-filled", + "unicode": "e686", + "unicode_decimal": 59014 + }, + { + "icon_id": "24881282", + "name": "trash", + "font_class": "trash", + "unicode": "e687", + "unicode_decimal": 59015 + }, + { + "icon_id": "24881284", + "name": "videocam-filled", + "font_class": "videocam-filled", + "unicode": "e689", + "unicode_decimal": 59017 + }, + { + "icon_id": "24881285", + "name": "spinner-cycle", + "font_class": "spinner-cycle", + "unicode": "e68a", + "unicode_decimal": 59018 + }, + { + "icon_id": "24881286", + "name": "weibo", + "font_class": "weibo", + "unicode": "e68b", + "unicode_decimal": 59019 + }, + { + "icon_id": "24881288", + "name": "videocam", + "font_class": "videocam", + "unicode": "e68c", + "unicode_decimal": 59020 + }, + { + "icon_id": "24881289", + "name": "download", + "font_class": "download", + "unicode": "e68d", + "unicode_decimal": 59021 + }, + { + "icon_id": "24879601", + "name": "help", + "font_class": "help", + "unicode": "e679", + "unicode_decimal": 59001 + }, + { + "icon_id": "24879602", + "name": "navigate-filled", + "font_class": "navigate-filled", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "24879603", + "name": "plusempty", + "font_class": "plusempty", + "unicode": "e67b", + "unicode_decimal": 59003 + }, + { + "icon_id": "24879604", + "name": "smallcircle", + "font_class": "smallcircle", + "unicode": "e67c", + "unicode_decimal": 59004 + }, + { + "icon_id": "24879605", + "name": "minus-filled", + "font_class": "minus-filled", + "unicode": "e67d", + "unicode_decimal": 59005 + }, + { + "icon_id": "24879606", + "name": "micoff", + "font_class": "micoff", + "unicode": "e67e", + "unicode_decimal": 59006 + }, + { + "icon_id": "24879588", + "name": "closeempty", + "font_class": "closeempty", + "unicode": "e66c", + "unicode_decimal": 58988 + }, + { + "icon_id": "24879589", + "name": "clear", + "font_class": "clear", + "unicode": "e66d", + "unicode_decimal": 58989 + }, + { + "icon_id": "24879590", + "name": "navigate", + "font_class": "navigate", + "unicode": "e66e", + "unicode_decimal": 58990 + }, + { + "icon_id": "24879591", + "name": "minus", + "font_class": "minus", + "unicode": "e66f", + "unicode_decimal": 58991 + }, + { + "icon_id": "24879592", + "name": "image", + "font_class": "image", + "unicode": "e670", + "unicode_decimal": 58992 + }, + { + "icon_id": "24879593", + "name": "mic", + "font_class": "mic", + "unicode": "e671", + "unicode_decimal": 58993 + }, + { + "icon_id": "24879594", + "name": "paperplane", + "font_class": "paperplane", + "unicode": "e672", + "unicode_decimal": 58994 + }, + { + "icon_id": "24879595", + "name": "close", + "font_class": "close", + "unicode": "e673", + "unicode_decimal": 58995 + }, + { + "icon_id": "24879596", + "name": "help-filled", + "font_class": "help-filled", + "unicode": "e674", + "unicode_decimal": 58996 + }, + { + "icon_id": "24879597", + "name": "plus-filled", + "font_class": "paperplane-filled", + "unicode": "e675", + "unicode_decimal": 58997 + }, + { + "icon_id": "24879598", + "name": "plus", + "font_class": "plus", + "unicode": "e676", + "unicode_decimal": 58998 + }, + { + "icon_id": "24879599", + "name": "mic-filled", + "font_class": "mic-filled", + "unicode": "e677", + "unicode_decimal": 58999 + }, + { + "icon_id": "24879600", + "name": "image-filled", + "font_class": "image-filled", + "unicode": "e678", + "unicode_decimal": 59000 + }, + { + "icon_id": "24855900", + "name": "locked-filled", + "font_class": "locked-filled", + "unicode": "e668", + "unicode_decimal": 58984 + }, + { + "icon_id": "24855901", + "name": "info", + "font_class": "info", + "unicode": "e669", + "unicode_decimal": 58985 + }, + { + "icon_id": "24855903", + "name": "locked", + "font_class": "locked", + "unicode": "e66b", + "unicode_decimal": 58987 + }, + { + "icon_id": "24855884", + "name": "camera-filled", + "font_class": "camera-filled", + "unicode": "e658", + "unicode_decimal": 58968 + }, + { + "icon_id": "24855885", + "name": "chat-filled", + "font_class": "chat-filled", + "unicode": "e659", + "unicode_decimal": 58969 + }, + { + "icon_id": "24855886", + "name": "camera", + "font_class": "camera", + "unicode": "e65a", + "unicode_decimal": 58970 + }, + { + "icon_id": "24855887", + "name": "circle", + "font_class": "circle", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "24855888", + "name": "checkmarkempty", + "font_class": "checkmarkempty", + "unicode": "e65c", + "unicode_decimal": 58972 + }, + { + "icon_id": "24855889", + "name": "chat", + "font_class": "chat", + "unicode": "e65d", + "unicode_decimal": 58973 + }, + { + "icon_id": "24855890", + "name": "circle-filled", + "font_class": "circle-filled", + "unicode": "e65e", + "unicode_decimal": 58974 + }, + { + "icon_id": "24855891", + "name": "flag", + "font_class": "flag", + "unicode": "e65f", + "unicode_decimal": 58975 + }, + { + "icon_id": "24855892", + "name": "flag-filled", + "font_class": "flag-filled", + "unicode": "e660", + "unicode_decimal": 58976 + }, + { + "icon_id": "24855893", + "name": "gear-filled", + "font_class": "gear-filled", + "unicode": "e661", + "unicode_decimal": 58977 + }, + { + "icon_id": "24855894", + "name": "home", + "font_class": "home", + "unicode": "e662", + "unicode_decimal": 58978 + }, + { + "icon_id": "24855895", + "name": "home-filled", + "font_class": "home-filled", + "unicode": "e663", + "unicode_decimal": 58979 + }, + { + "icon_id": "24855896", + "name": "gear", + "font_class": "gear", + "unicode": "e664", + "unicode_decimal": 58980 + }, + { + "icon_id": "24855897", + "name": "smallcircle-filled", + "font_class": "smallcircle-filled", + "unicode": "e665", + "unicode_decimal": 58981 + }, + { + "icon_id": "24855898", + "name": "map-filled", + "font_class": "map-filled", + "unicode": "e666", + "unicode_decimal": 58982 + }, + { + "icon_id": "24855899", + "name": "map", + "font_class": "map", + "unicode": "e667", + "unicode_decimal": 58983 + }, + { + "icon_id": "24855825", + "name": "refresh-filled", + "font_class": "refresh-filled", + "unicode": "e656", + "unicode_decimal": 58966 + }, + { + "icon_id": "24855826", + "name": "refresh", + "font_class": "refresh", + "unicode": "e657", + "unicode_decimal": 58967 + }, + { + "icon_id": "24855808", + "name": "cloud-upload", + "font_class": "cloud-upload", + "unicode": "e645", + "unicode_decimal": 58949 + }, + { + "icon_id": "24855809", + "name": "cloud-download-filled", + "font_class": "cloud-download-filled", + "unicode": "e646", + "unicode_decimal": 58950 + }, + { + "icon_id": "24855810", + "name": "cloud-download", + "font_class": "cloud-download", + "unicode": "e647", + "unicode_decimal": 58951 + }, + { + "icon_id": "24855811", + "name": "cloud-upload-filled", + "font_class": "cloud-upload-filled", + "unicode": "e648", + "unicode_decimal": 58952 + }, + { + "icon_id": "24855813", + "name": "redo", + "font_class": "redo", + "unicode": "e64a", + "unicode_decimal": 58954 + }, + { + "icon_id": "24855814", + "name": "images-filled", + "font_class": "images-filled", + "unicode": "e64b", + "unicode_decimal": 58955 + }, + { + "icon_id": "24855815", + "name": "undo-filled", + "font_class": "undo-filled", + "unicode": "e64c", + "unicode_decimal": 58956 + }, + { + "icon_id": "24855816", + "name": "more", + "font_class": "more", + "unicode": "e64d", + "unicode_decimal": 58957 + }, + { + "icon_id": "24855817", + "name": "more-filled", + "font_class": "more-filled", + "unicode": "e64e", + "unicode_decimal": 58958 + }, + { + "icon_id": "24855818", + "name": "undo", + "font_class": "undo", + "unicode": "e64f", + "unicode_decimal": 58959 + }, + { + "icon_id": "24855819", + "name": "images", + "font_class": "images", + "unicode": "e650", + "unicode_decimal": 58960 + }, + { + "icon_id": "24855821", + "name": "paperclip", + "font_class": "paperclip", + "unicode": "e652", + "unicode_decimal": 58962 + }, + { + "icon_id": "24855822", + "name": "settings", + "font_class": "settings", + "unicode": "e653", + "unicode_decimal": 58963 + }, + { + "icon_id": "24855823", + "name": "search", + "font_class": "search", + "unicode": "e654", + "unicode_decimal": 58964 + }, + { + "icon_id": "24855824", + "name": "redo-filled", + "font_class": "redo-filled", + "unicode": "e655", + "unicode_decimal": 58965 + }, + { + "icon_id": "24841702", + "name": "list", + "font_class": "list", + "unicode": "e644", + "unicode_decimal": 58948 + }, + { + "icon_id": "24841489", + "name": "mail-open-filled", + "font_class": "mail-open-filled", + "unicode": "e63a", + "unicode_decimal": 58938 + }, + { + "icon_id": "24841491", + "name": "hand-thumbsdown-filled", + "font_class": "hand-down-filled", + "unicode": "e63c", + "unicode_decimal": 58940 + }, + { + "icon_id": "24841492", + "name": "hand-thumbsdown", + "font_class": "hand-down", + "unicode": "e63d", + "unicode_decimal": 58941 + }, + { + "icon_id": "24841493", + "name": "hand-thumbsup-filled", + "font_class": "hand-up-filled", + "unicode": "e63e", + "unicode_decimal": 58942 + }, + { + "icon_id": "24841494", + "name": "hand-thumbsup", + "font_class": "hand-up", + "unicode": "e63f", + "unicode_decimal": 58943 + }, + { + "icon_id": "24841496", + "name": "heart-filled", + "font_class": "heart-filled", + "unicode": "e641", + "unicode_decimal": 58945 + }, + { + "icon_id": "24841498", + "name": "mail-open", + "font_class": "mail-open", + "unicode": "e643", + "unicode_decimal": 58947 + }, + { + "icon_id": "24841488", + "name": "heart", + "font_class": "heart", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "24839963", + "name": "loop", + "font_class": "loop", + "unicode": "e633", + "unicode_decimal": 58931 + }, + { + "icon_id": "24839866", + "name": "pulldown", + "font_class": "pulldown", + "unicode": "e632", + "unicode_decimal": 58930 + }, + { + "icon_id": "24813798", + "name": "scan", + "font_class": "scan", + "unicode": "e62a", + "unicode_decimal": 58922 + }, + { + "icon_id": "24813786", + "name": "bars", + "font_class": "bars", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "24813788", + "name": "cart-filled", + "font_class": "cart-filled", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "24813790", + "name": "checkbox", + "font_class": "checkbox", + "unicode": "e62b", + "unicode_decimal": 58923 + }, + { + "icon_id": "24813791", + "name": "checkbox-filled", + "font_class": "checkbox-filled", + "unicode": "e62c", + "unicode_decimal": 58924 + }, + { + "icon_id": "24813794", + "name": "shop", + "font_class": "shop", + "unicode": "e62f", + "unicode_decimal": 58927 + }, + { + "icon_id": "24813795", + "name": "headphones", + "font_class": "headphones", + "unicode": "e630", + "unicode_decimal": 58928 + }, + { + "icon_id": "24813796", + "name": "cart", + "font_class": "cart", + "unicode": "e631", + "unicode_decimal": 58929 + } + ] +} 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..a87f68e --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uni.ttf b/uni_modules/uni-icons/components/uni-icons/uni.ttf new file mode 100644 index 0000000000000000000000000000000000000000..60a1968d08cc6056c70b5402b2effac43c6f96a3 GIT binary patch literal 26164 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 literal 0 HcmV?d00001 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..2f56eab --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -0,0 +1,663 @@ +.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-gift-filled:before { + content: "\e6c4"; +} + +.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-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrowthinright:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrowthinleft:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrowthinup:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthindown:before { + content: "\e6be"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowdown:before { + content: "\e6b8"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-arrowright:before { + content: "\e6b5"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-arrowup:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowleft:before { + content: "\e6b7"; +} + +.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-cart-filled:before { + content: "\e629"; +} + +.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 0000000000000000000000000000000000000000..835f33bc9411461b8b9046b3fec742e921d6ce3a GIT binary patch literal 35760 zcmeFacbp?vl{Q?rN>WLsSXIigCAC7gI!S6tox^m`be^1}CwPJ>yxZ{uSzi{WC_=LI+*Wx!<-H!v})21fuKMZQ#fB2Fs zuEGwU_ZyDmuR3&e_s&PS@Be}0T=(JF$l;w=9Als0-iQ4lE^0cm^YDeWhnK#G<4!$@ z>-QZydhsP6Kl0Pv9Cw|EbP-?YO$@C;`+ zuKnR1zxV)MXnddfv56Dn_-W<%#_jZ^d%1f!hyI(6O8C!lXY}93nl=3f9^gzbYS03Jm0vJ;T)Z1IKntfUtypB#zx`e6wG3 zC5AhB&Me^QdH${3yL1otSUp#NN^cKN_yKnkm%XqxczWUgrT^Oo|6lL`SPy&+DZ_DX z1{?B^82rf|!cpSXHhg1*;kZecHy+MI*MqCu>g9T0eYieaf9edzAC9!tJL|pm0UQ~l zBQN;JaG!_sb8)VT%i=%By_I_#_ZIFh?(N(=xVtf?-^|^~y@`7RcMEqbcN=#*_eSmx z?)BVjxU0EqFm9T;Q`~9pTJAdTdhWH{>+qBtxEr~fxSP3Gb60T(xkKDx?g)33JH{R7 zPH-1465x0fg%5CGeb33>TxSiZCZa24wyO7(&Q z>$wfwMs5?gnVaOMxM^;NYvpFSIc_<(f-7(s&u0CxL#u8VbF$klItIryQ@x|5W z48lm`>dOtnnB(dz48rK+>MISxIOOW948n-y>Z=XH*yQSK48kbo>T3axcUVKK~8Y>od!W-aP?gVL3VKU-3CF5aP>U~L7s5+3k`x~;p%%0f{fwn z`wW7#;p+Phg52Ti2MmG);_4R}1X;w@scs-hC9Y0&13^AJNK#+l4o$3aH zH00`3HxT3^SEssxAR)Or)eQt$$+z7tkWDxWPSHIIBXb!IaW`m$ZxcXZRf;QpmZ#4*d zg{!~KAZQq_ewRVeHC+Ae20`m^^>-Kq{lnGoHVB%CtKVY~bP`v;*C1#ou700E&{JIf zeuJQ~xcWN{g6`t#?=lEljH|!fAm}r${tpI0vvKtY41$j1>hCcK+K#I~Xb|)sSAVZT z(12Y1eFi}na`pEc1g*%`|Ir}mN3Q+>gPp}tAE%avLosrF^GJG z`bQ0dZsqD9GYDFitAE@e=v%J-34@?{x%wv!f)3{DpE3yAn5#cz5cD!v|Fl8S&|Lj9 z20>SI_0JjvtVjlpxwFpV+N5QQ~$g{(D+>a3kE^= zbM-G81S^26f5{-&16=*f2Ej7m>R&MkHUd}wszKz<)E_qpb^}-cnn7g6)t@j3wggxI zxp1QBm2=klxXa|a&TVx+;Qp=WwVt{>D}O~9QXW)O>O0h5db_-@^8Ud$^pPT-1=NS-v_4k2r|_kM*0!vaW9xyNll~`AaKH zuPQxR4wv6t{%QC2?wh**v$DGKU?rS_5?F|crGafkiL7dNk-%Y_E4VmkSn6>Hb;SUukEx3l0# zej=BS$yT%Av8Uc*J`xpdRw>aQ5n{34Scli{%@0hjo|#!%t;CXMOO1~vM@By$$wu(0 z7+*JsbCF0c%-{dHFL+pQI~s3&zjaOf89{d%!`6o3fsCO(`6

PqiNa$~E4XJ#a8s%?nsx`&SiQ7Wz{CE9c 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 literal 0 HcmV?d00001 diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..d1c4e77 --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,86 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "1.3.5", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "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-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** +> 代码块: `uIcons` + +用于展示 icons 图标 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-id/changelog.md b/uni_modules/uni-id/changelog.md new file mode 100644 index 0000000..2f523bb --- /dev/null +++ b/uni_modules/uni-id/changelog.md @@ -0,0 +1,111 @@ +## 3.3.28(2022-07-27) +- 修复 app端微信登录返回的accessToken过期时间(expired)不正确的Bug +## 3.3.27(2022-07-27) +- 短信发送失败、微信登录失败等场景下输出原始错误方便排查错误 +## 3.3.26(2022-07-08) +- 兼容配置放在uni-id下的逻辑,但是仍推荐使用uni-config-center +## 3.3.25(2022-06-30) +- 修复config文件不合法时未抛出具体错误的Bug +## 3.3.24(2022-06-28) +- 修复3.3.12引出的使用多应用配置时报错的Bug +## 3.3.23(2022-06-13) +- 修复上版本引出的部分依赖未找到的Bug +## 3.3.22(2022-06-13) +- 新增 preferedWebPlatform 配置用于解决HBuilderX 3.4.9版本起web端platform不一致的问题 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=prefered-web-platform) +## 3.3.21(2022-05-24) +- 修复createInstance传入clientInfo无效的Bug +## 3.3.20(2022-05-19) +- 调整以下错误码(账号已注册[uni-id-account-exists]、账号不存在[uni-id-account-not-exists]、账号已绑定[uni-id-account-bound]) +## 3.3.19(2022-05-19) +- 修复 addUser 部分情况下会创建出重复账号的Bug +## 3.3.18(2022-05-12) +- 调整绑定、解绑邮箱手机号接口,只要传递code参数就进行验证码校验即使传递的值为undefined +## 3.3.17(2022-05-09) +- register_env内增加os_name字段用于区分注册时的客户端系统类型 +## 3.3.16(2022-05-09) +- 修复 addUser接口添加的用户无法使用密码登录的Bug [详情](https://ask.dcloud.net.cn/question/144670) +## 3.3.15(2022-05-08) +- 修复config文件语法错误时报`this.t is not a function`的Bug 感谢@寒暄 +## 3.3.14(2022-05-08) +- 新增 getWeixinUserInfo接口 用于获取app平台微信登录用户的用户信息 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#get-weixin-user-info) +- 新增 addUser接口 用于手动添加用户 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#add-user) +- 新增 resetPwdBySms接口 用于使用短信验证码重置密码 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#reset-pwd-by-sms) +- 新增 refreshToken接口 用于主动刷新用户token [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#refresh-token) +- 调整 用户注册时记录用户注册环境到 register_env 字段 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#user-table) +- 调整 用户注册时将注册 ip 移至 register_env 内 + +## 3.3.13(2022-03-04) +- createInstance方法支持传递clientInfo [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#create-instance) +- 修复`this.t is not a function`报错 +## 3.3.12(2022-01-15) +- 新增 preferedAppPlatform 配置用于解决uni-app vue2版本vue3版本获取platform不一致的问题 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=prefered-app-platform) +- 修复 checkToken 未返回自定义token内容的Bug +## 3.3.11(2022-01-11) +- 修复用户名密码登录时多个应用出现重复用户名登录报错的Bug +## 3.3.10(2022-01-07) +- 新增 自定义国际化语言支持 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=custom-i8n) +- 修复 一键登录时未校验重复手机号是否已验证的Bug +- 修复 Apple登录时用户邮箱为空时报错的Bug +- 修复 登录接口未传username时错误提示不正确的Bug +## 3.3.9(2021-11-09) +- 去除重复的context.xxx未找到的提示语 +## 3.3.8(2021-10-28) +- 新增 用户账户封禁接口 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=ban-account) +- 新增 用户账户注销接口 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=close-account) +- 修复 未传appid时用户重复注册的Bug +## 3.3.7(2021-10-08) +- 移除部分接口的废弃提示 +## 3.3.6(2021-09-08) +- 修复 邀请码可能重复的Bug +## 3.3.5(2021-08-10) +- 修复版本号错误 +## 3.3.4(2021-08-10) +- 微信、QQ、支付宝登录新增type参数用于指定当前是登录还是注册 +## 3.3.3(2021-08-04) +- 修复使用数组形式的配置文件报错的Bug +## 3.3.2(2021-08-03) +- 修复上3.3.0版本引出的createInstance接口传入配置不生效的Bug 感谢[hmh](https://gitee.com/hmh) +## 3.3.1(2021-07-30) +- 修复 将设置用户允许登录的应用列表时传入空数组报错的Bug +## 3.3.0(2021-07-30) +- 新增 不同端应用配置隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config) +- 新增 不同端用户隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user) + + 此版本升级需要开发者处理一下用户数据,请参考 [补齐用户dcloud_appid字段](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=makeup-dcloud-appid) +- 新增 QQ登录、注册相关功能 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=qq) +- 调整 不再支持绑定手机、邮箱时不填验证码直接绑定 +## 3.2.1(2021-07-09) +- 撤销3.2.0版本所做的调整 +## 3.2.0(2021-07-09) +- 【重要】支持不同端(管理端、用户端等)用户隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user) +- 支持不同端(管理端、用户端等)配置文件隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config) +## 3.1.3(2021-07-08) +- 移除插件内误传的node_modules +## 3.1.2(2021-07-08) +- 修复 微信小程序绑定微信账号时报错的Bug +## 3.1.1(2021-07-01) +- 使用新的错误码规范,兼容旧版 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=errcode) +- 修复微信登录、绑定时未返回用户accessToken的Bug +## 3.1.0(2021-04-19) +- 增加对用户名、邮箱、密码字段的两端去空格 +- 默认忽略用户名、邮箱的大小写 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=case-sensitive) +- 修复 customToken导出async方法报错的Bug +## 3.0.12(2021-04-13) +- 调整bindTokenToDevice默认值为false +## 3.0.11(2021-04-12) +- 修复3.0.7版本引出的多个用户访问时可能出现30201报错的Bug +## 3.0.10(2021-04-08) +- 优化错误提示 +## 3.0.9(2021-04-08) +- bindMobile接口支持通过一键登录的方式绑定 +- 优化错误提示 +## 3.0.8(2021-03-19) +- 修复 3.0.7版本某些情况下生成token报错的Bug +## 3.0.7(2021-03-19) +- 新增 支持uni-config-center,更新uni-id无须再担心配置被覆盖 [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=uni-config-center) +- 新增 自定义token内容,可以缓存角色权限之外的更多信息到客户端 [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=custom-token) +- 新增 支持传入context获取uni-id实例,防止单实例多并发时全局context混乱 [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=create-instance) +## 3.0.6(2021-03-05) +- 新增[uniID.wxBizDataCrypt](https://uniapp.dcloud.io/uniCloud/uni-id?id=%e5%be%ae%e4%bf%a1%e6%95%b0%e6%8d%ae%e8%a7%a3%e5%af%86)方法 +- 优化loginByApple方法,提高接口响应速度 +## 3.0.5(2021-02-03) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-id/package.json b/uni_modules/uni-id/package.json new file mode 100644 index 0000000..144a9f1 --- /dev/null +++ b/uni_modules/uni-id/package.json @@ -0,0 +1,85 @@ +{ + "id": "uni-id", + "displayName": "uni-id", + "version": "3.3.28", + "description": "简单、统一、可扩展的用户中心", + "keywords": [ + "uniid", + "uni-id", + "用户管理", + "用户中心", + "短信验证码" +], + "repository": "https://gitee.com/dcloud/uni-id.git", + "engines": { + "HBuilderX": "^3.1.0" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "", + "type": "unicloud-template-function" + }, + "uni_modules": { + "dependencies": ["uni-config-center"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-id/readme.md b/uni_modules/uni-id/readme.md new file mode 100644 index 0000000..6890121 --- /dev/null +++ b/uni_modules/uni-id/readme.md @@ -0,0 +1,33 @@ +**文档已移至[uni-id文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id)** + +> 一般uni-id升级大版本时为不兼容更新,从低版本迁移到高版本请参考:[uni-id迁移指南](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=migration) + +## 重要升级说明 + +**uni-id 3.x版本,搭配的uniCloud admin版本需大于1.2.10。** + +### 缓存角色权限 + +自`uni-id 3.0.0`起,支持在token内缓存用户的角色权限,默认开启此功能,各登录接口的needPermission参数不再生效。如需关闭请在config内配置`"removePermissionAndRoleFromToken": true`。 + +为什么要缓存角色权限?要知道云数据库是按照读写次数来收取费用的,并且读写数据库会拖慢接口响应速度。未配置`"removePermissionAndRoleFromToken": true`的情况下,可以在调用checkToken接口时不查询数据库获取用户角色权限。 + +详细checkToken流程如下: + +![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/ed45d350-5a4d-11eb-b997-9918a5dda011.jpg) + +可以看出,旧版token(removePermissionAndRoleFromToken为true时生成的)在checkToken时如需返回权限需要进行两次数据库查询。新版token不需要查库即可返回权限信息。 + +**注意** + +- 由于角色权限缓存在token内,可能会存在权限已经更新但是用户token未过期之前依然是旧版角色权限的情况。可以调短一些token过期时间来减少这种情况的影响。 +- admin角色token内不包含permission,如需自行判断用户是否有某个权限,要注意admin角色需要额外判断一下,写法如下 + ```js + const { + role, + permission + } = await uniID.checkToken(event.uniIdToken) + if(role.includes('admin') || permission.includes('your permission id')) { + // 当前角色拥有'your permission id'对应的权限 + } + ``` \ No newline at end of file diff --git a/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md new file mode 100644 index 0000000..29f81d8 --- /dev/null +++ b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js new file mode 100644 index 0000000..5003d30 --- /dev/null +++ b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js @@ -0,0 +1 @@ +"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var t=e(require("crypto")),r=e(require("buffer")),n=e(require("stream")),i=e(require("util"));const o={PARAM_ERROR:{errCode:"param-error"},PARAM_REQUIRED:{errCode:"param-required"},USER_NOT_EXIST:{errCode:"user-not-exist"},ROLE_NOT_EXIST:{errCode:"role-not-exist"},PERMISSION_NOT_EXIST:{errCode:"permission-not-exist"},MULTI_USER_MATCHED:{errCode:"multi-user-matched"},USER_INFO_ERROR:{errCode:"user-info-error"},USER_ACCOUNT_CONFLICT:{errCode:"user-account-conflict"},USER_ACCOUNT_CLOSED:{errCode:"user-account-closed"},ACCOUNT_EXISTS:{errCode:"account-exists"},ACCOUNT_NOT_EXISTS:{errCode:"account-not-exists"},ACCOUNT_BOUND:{errCode:"account-bound"},UNBIND_FAILED:{errCode:"unbind-failed"},INVALID_INVITE_CODE:{errCode:"invalid-invite-code"},SET_INVITE_CODE_FAILED:{errCode:"set-invite-code-failed"},GET_THIRD_PARTY_ACCOUNT_FAILED:{errCode:"get-third-party-account-failed"},GET_THIRD_PARTY_USER_INFO_FAILED:{errCode:"get-third-party-user-info-failed"}},s={0:{errCode:0,errMsg:""},10001:{errCode:"account-banned"},10002:o.USER_NOT_EXIST,10003:o.MULTI_USER_MATCHED,10004:o.USER_INFO_ERROR,10005:o.USER_ACCOUNT_CONFLICT,10006:o.USER_ACCOUNT_CLOSED,10102:{errCode:"password-error"},10103:{errCode:"password-error-exceed-limit"},10201:o.ACCOUNT_EXISTS,10202:o.ACCOUNT_NOT_EXISTS,10203:o.INVALID_INVITE_CODE,10301:o.ACCOUNT_EXISTS,10302:o.ACCOUNT_NOT_EXISTS,10401:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10402:o.ACCOUNT_EXISTS,10403:o.ACCOUNT_NOT_EXISTS,10501:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10502:o.ACCOUNT_EXISTS,10503:o.ACCOUNT_NOT_EXISTS,10601:o.ACCOUNT_EXISTS,10602:o.ACCOUNT_NOT_EXISTS,10701:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10702:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10703:o.ACCOUNT_EXISTS,10704:o.ACCOUNT_NOT_EXISTS,10705:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10706:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10801:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10802:o.ACCOUNT_EXISTS,10803:o.ACCOUNT_NOT_EXISTS,20101:o.PARAM_REQUIRED,20102:o.ACCOUNT_EXISTS,30101:o.PARAM_REQUIRED,30201:{errCode:"check-device-feature-failed"},30202:{errCode:"token-not-exist"},30203:{errCode:"token-expired"},30204:{errCode:"check-token-failed"},40201:o.USER_NOT_EXIST,40202:{errCode:"invalid-old-password"},50101:o.PARAM_REQUIRED,50102:o.PARAM_ERROR,50201:o.PARAM_REQUIRED,50203:o.PARAM_ERROR,50202:{errCode:"invalid-verify-code"},50301:{errCode:"send-sms-code-failed"},60101:o.ACCOUNT_BOUND,60201:o.ACCOUNT_BOUND,60301:o.GET_THIRD_PARTY_ACCOUNT_FAILED,60302:o.ACCOUNT_BOUND,60401:o.GET_THIRD_PARTY_ACCOUNT_FAILED,60402:o.ACCOUNT_BOUND,60501:o.GET_THIRD_PARTY_ACCOUNT_FAILED,60502:o.ACCOUNT_BOUND,70101:o.UNBIND_FAILED,70201:o.UNBIND_FAILED,70301:o.UNBIND_FAILED,70401:o.UNBIND_FAILED,70501:o.UNBIND_FAILED,80301:o.USER_NOT_EXIST,80401:o.SET_INVITE_CODE_FAILED,80402:o.SET_INVITE_CODE_FAILED,80501:o.INVALID_INVITE_CODE,80502:o.USER_NOT_EXIST,80503:{errCode:"modify-invite-code-is-not-allowed"},80601:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80602:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80701:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80702:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80801:{errCode:"decrypt-weixin-data-failed"},80802:{errCode:"decrypt-weixin-data-failed"},80803:{errCode:"invalid-weixin-appid"},80804:o.PARAM_REQUIRED,80805:o.PARAM_REQUIRED,80806:o.PARAM_REQUIRED,80901:o.GET_THIRD_PARTY_USER_INFO_FAILED,90001:{errCode:"database-operation-failed"},90002:o.PARAM_REQUIRED,90003:o.PARAM_ERROR,90004:o.USER_NOT_EXIST,90005:o.ROLE_NOT_EXIST,90006:o.PERMISSION_NOT_EXIST};class a extends Error{constructor(e){super(e.message),this.errMsg=e.message||"",Object.defineProperties(this,{message:{get(){return`errCode: ${e.code||""} | errMsg: `+this.errMsg},set(e){this.errMsg=e}}})}}const c=Object.prototype.toString,u=Object.prototype.hasOwnProperty;function d(e,t){return u.call(e,t)}function p(e){return"[object Object]"===c.call(e)}function l(e){return"function"==typeof e}function f(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}function m(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}const h=/_(\w)/g,g=/[A-Z]/g;function y(e){return e.replace(h,(e,t)=>t?t.toUpperCase():"")}function w(e){return e.replace(g,e=>"_"+e.toLowerCase())}function v(e,t){let r,n;switch(t){case"snake2camel":n=y,r=h;break;case"camel2snake":n=w,r=g}for(const i in e)if(d(e,i)&&r.test(i)){const r=n(i);e[r]=e[i],delete e[i],p(e[r])?e[r]=v(e[r],t):Array.isArray(e[r])&&(e[r]=e[r].map(e=>v(e,t)))}return e}function _(e){return v(e,"snake2camel")}function b(e){return v(e,"camel2snake")}function T(e){return function(e,t="-"){e=e||new Date;const r=[];return r.push(e.getFullYear()),r.push(("00"+(e.getMonth()+1)).substr(-2)),r.push(("00"+e.getDate()).substr(-2)),r.join(t)}(e=e||new Date)+" "+function(e,t=":"){e=e||new Date;const r=[];return r.push(("00"+e.getHours()).substr(-2)),r.push(("00"+e.getMinutes()).substr(-2)),r.push(("00"+e.getSeconds()).substr(-2)),r.join(t)}(e)}function E(){"development"===process.env.NODE_ENV&&console.log(...arguments)}function C(e=6){let t="";for(let r=0;r-1?"&":"?"}access_token=${t.accessToken}`}return`${e}${r}`}class G{constructor(e){this.options=Object.assign({baseUrl:"https://api.weixin.qq.com",timeout:5e3},e)}async _requestWxOpenapi({name:e,url:t,data:r,options:n}){const i={method:"GET",dataType:"json",dataAsQueryString:!0,timeout:this.options.timeout};return await H({name:"auth."+e,url:`${this.options.baseUrl}${K(t,r)}`,data:r,options:n,defaultOptions:i})}async code2Session(e){return await this._requestWxOpenapi({name:"code2Session",url:"/sns/jscode2session",data:{grant_type:"authorization_code",appid:this.options.appId,secret:this.options.secret,js_code:e}})}async getOauthAccessToken(e){const t=await this._requestWxOpenapi({name:"getOauthAccessToken",url:"/sns/oauth2/access_token",data:{grant_type:"authorization_code",appid:this.options.appId,secret:this.options.secret,code:e}});return t.expiresIn&&(t.expired=Date.now()+1e3*t.expiresIn),t}async getUserInfo({accessToken:e,openid:t}={}){const{nickname:r,headimgurl:n}=await this._requestWxOpenapi({name:"getUserInfo",url:"/sns/userinfo",data:{accessToken:e,openid:t,appid:this.options.appId,secret:this.options.secret,scope:"snsapi_userinfo"}});return{nickname:r,avatar:n}}}async function Q({name:e,url:t,data:r,options:n,defaultOptions:i}){let o;n=Object.assign({},i,n,{data:b(Object.assign({},r))});try{o=await uniCloud.httpclient.request(t,n)}catch(t){return function(e,t){throw new a({code:t.code||-2,message:t.message||e+" fail"})}(e,t)}let s=o.data;const c=o.headers["content-type"];if(!Buffer.isBuffer(s)||0!==c.indexOf("text/plain")&&0!==c.indexOf("application/json"))Buffer.isBuffer(s)&&(s={buffer:s,contentType:c});else try{s=JSON.parse(s.toString())}catch(e){s=s.toString()}return _(function(e,t){if(t.ret||t.error){const r=t.ret||t.error||t.errcode||-2,n=t.msg||t.error_description||t.errmsg||e+" fail";throw new a({code:r,message:n})}return delete t.ret,delete t.msg,delete t.error,delete t.error_description,delete t.errcode,delete t.errmsg,{...t,errMsg:e+" ok",errCode:0}}(e,s||{errCode:-2,errMsg:"Request failed"}))}class X{constructor(e){this.options=Object.assign({baseUrl:"https://graph.qq.com",timeout:5e3},e)}async _requestQQOpenapi({name:e,url:t,data:r,options:n}){const i={method:"GET",dataType:"json",dataAsQueryString:!0,timeout:this.options.timeout};var o,s;return await Q({name:"auth."+e,url:(o=this.options.baseUrl,s=t,/^https?:/.test(s)?s:o+s),data:r,options:n,defaultOptions:i})}async getOpenidByToken({accessToken:e}={}){const t=await this._requestQQOpenapi({name:"getOpenidByToken",url:"/oauth2.0/me",data:{accessToken:e,unionid:1,fmt:"json"}});if(t.clientId!==this.options.appId)throw new a({code:"APPID_NOT_MATCH",message:"appid not match"});return{openid:t.openid,unionid:t.unionid}}async code2Session({code:e}={}){return await this._requestQQOpenapi({name:"getOpenidByToken",url:"https://api.q.qq.com/sns/jscode2session",data:{grant_type:"authorization_code",appid:this.options.appId,secret:this.options.secret,js_code:e}})}}const Y={RSA:"RSA-SHA1",RSA2:"RSA-SHA256"};var z={code2Session:{returnValue:{openid:"userId"}}};class W extends class{constructor(e={}){if(!e.appId)throw new Error("appId required");if(!e.privateKey)throw new Error("privateKey required");const t={gateway:"https://openapi.alipay.com/gateway.do",timeout:5e3,charset:"utf-8",version:"1.0",signType:"RSA2",timeOffset:-(new Date).getTimezoneOffset()/60,keyType:"PKCS8"};e.sandbox&&(e.gateway="https://openapi.alipaydev.com/gateway.do"),this.options=Object.assign({},t,e);const r="PKCS8"===this.options.keyType?"PRIVATE KEY":"RSA PRIVATE KEY";this.options.privateKey=this._formatKey(this.options.privateKey,r),this.options.alipayPublicKey&&(this.options.alipayPublicKey=this._formatKey(this.options.alipayPublicKey,"PUBLIC KEY"))}_formatKey(e,t){return`-----BEGIN ${t}-----\n${e}\n-----END ${t}-----`}_formatUrl(e,t){let r=e;const n=["app_id","method","format","charset","sign_type","sign","timestamp","version","notify_url","return_url","auth_token","app_auth_token"];for(const e in t)if(n.indexOf(e)>-1){const n=encodeURIComponent(t[e]);r=`${r}${r.includes("?")?"&":"?"}${e}=${n}`,delete t[e]}return{execParams:t,url:r}}_getSign(e,r){const n=r.bizContent||null;delete r.bizContent;const i=Object.assign({method:e,appId:this.options.appId,charset:this.options.charset,version:this.options.version,signType:this.options.signType,timestamp:T((o=this.options.timeOffset,new Date(Date.now()+6e4*((new Date).getTimezoneOffset()+60*(o||0)))))},r);var o;n&&(i.bizContent=JSON.stringify(b(n)));const s=b(i),a=Object.keys(s).sort().map(e=>{let t=s[e];return"[object String]"!==Array.prototype.toString.call(t)&&(t=JSON.stringify(t)),`${e}=${t}`}).join("&"),c=t.createSign(Y[this.options.signType]).update(a,"utf8").sign(this.options.privateKey,"base64");return Object.assign(s,{sign:c})}async _exec(e,t={},r={}){const n=this._getSign(e,t),{url:i,execParams:o}=this._formatUrl(this.options.gateway,n),{status:s,data:a}=await uniCloud.httpclient.request(i,{method:"POST",data:o,dataType:"text",timeout:this.options.timeout});if(200!==s)throw new Error("request fail");const c=JSON.parse(a),u=e.replace(/\./g,"_")+"_response",d=c[u],p=c.error_response;if(d){if(!r.validateSign||this._checkResponseSign(a,u)){if(!d.code||"10000"===d.code){return{errCode:0,errMsg:d.msg||"",..._(d)}}const e=d.sub_code?`${d.sub_code} ${d.sub_msg}`:""+(d.msg||"unkonwn error");throw new Error(e)}throw new Error("check sign error")}if(p)throw new Error(p.sub_msg||p.msg||"request fail");throw new Error("request fail")}_checkResponseSign(e,r){if(!this.options.alipayPublicKey||""===this.options.alipayPublicKey)return console.warn("options.alipayPublicKey is empty"),!0;if(!e)return!1;const n=this._getSignStr(e,r),i=JSON.parse(e).sign,o=t.createVerify(Y[this.options.signType]);return o.update(n,"utf8"),o.verify(this.options.alipayPublicKey,i,"base64")}_getSignStr(e,t){let r=e.trim();const n=e.indexOf(t+'"'),i=e.lastIndexOf('"sign"');return r=r.substr(n+t.length+1),r=r.substr(0,i),r=r.replace(/^[^{]*{/g,"{"),r=r.replace(/\}([^}]*)$/g,"}"),r}}{constructor(e){super(e),this._protocols=z}async code2Session(e){return await this._exec("alipay.system.oauth.token",{grantType:"authorization_code",code:e})}}function J(e){var t=e[0];return t<"0"||t>"7"?"00"+e:e}function Z(e){var t=e.toString(16);return t.length%2?"0"+t:t}function ee(e){if(e<=127)return Z(e);var t=Z(e);return Z(128+t.length/2)+t}function te(e,t){return e(t={exports:{}},t.exports),t.exports}var re=te((function(e,t){var n=r.Buffer;function i(e,t){for(var r in e)t[r]=e[r]}function o(e,t,r){return n(e,t,r)}n.from&&n.alloc&&n.allocUnsafe&&n.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=o),o.prototype=Object.create(n.prototype),i(n,o),o.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return n(e,t,r)},o.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var i=n(e);return void 0!==t?"string"==typeof r?i.fill(t,r):i.fill(t):i.fill(0),i},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}})),ne=(re.Buffer,re.Buffer);function ie(e){if(this.buffer=null,this.writable=!0,this.readable=!0,!e)return this.buffer=ne.alloc(0),this;if("function"==typeof e.pipe)return this.buffer=ne.alloc(0),e.pipe(this),this;if(e.length||"object"==typeof e)return this.buffer=e,this.writable=!1,process.nextTick(function(){this.emit("end",e),this.readable=!1,this.emit("close")}.bind(this)),this;throw new TypeError("Unexpected data type ("+typeof e+")")}i.inherits(ie,n),ie.prototype.write=function(e){this.buffer=ne.concat([this.buffer,ne.from(e)]),this.emit("data",e)},ie.prototype.end=function(e){e&&this.write(e),this.emit("end",e),this.emit("close"),this.writable=!1,this.readable=!1};var oe=ie,se=r.Buffer,ae=r.SlowBuffer,ce=ue;function ue(e,t){if(!se.isBuffer(e)||!se.isBuffer(t))return!1;if(e.length!==t.length)return!1;for(var r=0,n=0;n=128&&--n,n}var we={derToJose:function(e,t){e=ge(e);var r=me(t),n=r+1,i=e.length,o=0;if(48!==e[o++])throw new Error('Could not find expected "seq"');var s=e[o++];if(129===s&&(s=e[o++]),i-o0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var r=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*r;case"weeks":case"week":case"w":return 6048e5*r;case"days":case"day":case"d":return r*mt;case"hours":case"hour":case"hrs":case"hr":case"h":return r*ft;case"minutes":case"minute":case"mins":case"min":case"m":return r*lt;case"seconds":case"second":case"secs":case"sec":case"s":return r*pt;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}(e);if("number"===r&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=mt)return gt(e,t,mt,"day");if(t>=ft)return gt(e,t,ft,"hour");if(t>=lt)return gt(e,t,lt,"minute");if(t>=pt)return gt(e,t,pt,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=mt)return Math.round(e/mt)+"d";if(t>=ft)return Math.round(e/ft)+"h";if(t>=lt)return Math.round(e/lt)+"m";if(t>=pt)return Math.round(e/pt)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function gt(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}var yt=function(e,t){var r=t||Math.floor(Date.now()/1e3);if("string"==typeof e){var n=ht(e);if(void 0===n)return;return Math.floor(r+n/1e3)}return"number"==typeof e?r+e:void 0},wt=te((function(e,t){var r;t=e.exports=G,r="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments,0);e.unshift("SEMVER"),console.log.apply(console,e)}:function(){},t.SEMVER_SPEC_VERSION="2.0.0";var n=Number.MAX_SAFE_INTEGER||9007199254740991,i=t.re=[],o=t.src=[],s=0,a=s++;o[a]="0|[1-9]\\d*";var c=s++;o[c]="[0-9]+";var u=s++;o[u]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var d=s++;o[d]="("+o[a]+")\\.("+o[a]+")\\.("+o[a]+")";var p=s++;o[p]="("+o[c]+")\\.("+o[c]+")\\.("+o[c]+")";var l=s++;o[l]="(?:"+o[a]+"|"+o[u]+")";var f=s++;o[f]="(?:"+o[c]+"|"+o[u]+")";var m=s++;o[m]="(?:-("+o[l]+"(?:\\."+o[l]+")*))";var h=s++;o[h]="(?:-?("+o[f]+"(?:\\."+o[f]+")*))";var g=s++;o[g]="[0-9A-Za-z-]+";var y=s++;o[y]="(?:\\+("+o[g]+"(?:\\."+o[g]+")*))";var w=s++,v="v?"+o[d]+o[m]+"?"+o[y]+"?";o[w]="^"+v+"$";var _="[v=\\s]*"+o[p]+o[h]+"?"+o[y]+"?",b=s++;o[b]="^"+_+"$";var T=s++;o[T]="((?:<|>)?=?)";var E=s++;o[E]=o[c]+"|x|X|\\*";var C=s++;o[C]=o[a]+"|x|X|\\*";var A=s++;o[A]="[v=\\s]*("+o[C]+")(?:\\.("+o[C]+")(?:\\.("+o[C]+")(?:"+o[m]+")?"+o[y]+"?)?)?";var I=s++;o[I]="[v=\\s]*("+o[E]+")(?:\\.("+o[E]+")(?:\\.("+o[E]+")(?:"+o[h]+")?"+o[y]+"?)?)?";var S=s++;o[S]="^"+o[T]+"\\s*"+o[A]+"$";var x=s++;o[x]="^"+o[T]+"\\s*"+o[I]+"$";var k=s++;o[k]="(?:^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])";var O=s++;o[O]="(?:~>?)";var P=s++;o[P]="(\\s*)"+o[O]+"\\s+",i[P]=new RegExp(o[P],"g");var R=s++;o[R]="^"+o[O]+o[A]+"$";var j=s++;o[j]="^"+o[O]+o[I]+"$";var D=s++;o[D]="(?:\\^)";var q=s++;o[q]="(\\s*)"+o[D]+"\\s+",i[q]=new RegExp(o[q],"g");var N=s++;o[N]="^"+o[D]+o[A]+"$";var U=s++;o[U]="^"+o[D]+o[I]+"$";var L=s++;o[L]="^"+o[T]+"\\s*("+_+")$|^$";var V=s++;o[V]="^"+o[T]+"\\s*("+v+")$|^$";var M=s++;o[M]="(\\s*)"+o[T]+"\\s*("+_+"|"+o[A]+")",i[M]=new RegExp(o[M],"g");var B=s++;o[B]="^\\s*("+o[A]+")\\s+-\\s+("+o[A]+")\\s*$";var F=s++;o[F]="^\\s*("+o[I]+")\\s+-\\s+("+o[I]+")\\s*$";var $=s++;o[$]="(<|>)?=?\\s*\\*";for(var H=0;H<35;H++)r(H,o[H]),i[H]||(i[H]=new RegExp(o[H]));function K(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof G)return e;if("string"!=typeof e)return null;if(e.length>256)return null;if(!(t.loose?i[b]:i[w]).test(e))return null;try{return new G(e,t)}catch(e){return null}}function G(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof G){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof G))return new G(e,t);r("SemVer",e,t),this.options=t,this.loose=!!t.loose;var o=e.trim().match(t.loose?i[b]:i[w]);if(!o)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>n||this.major<0)throw new TypeError("Invalid major version");if(this.minor>n||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>n||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map((function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);-1===r&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},t.inc=function(e,t,r,n){"string"==typeof r&&(n=r,r=void 0);try{return new G(e,r).inc(t,n).version}catch(e){return null}},t.diff=function(e,t){if(J(e,t))return null;var r=K(e),n=K(t),i="";if(r.prerelease.length||n.prerelease.length){i="pre";var o="prerelease"}for(var s in r)if(("major"===s||"minor"===s||"patch"===s)&&r[s]!==n[s])return i+s;return o},t.compareIdentifiers=X;var Q=/^[0-9]+$/;function X(e,t){var r=Q.test(e),n=Q.test(t);return r&&n&&(e=+e,t=+t),e===t?0:r&&!n?-1:n&&!r?1:e0}function W(e,t,r){return Y(e,t,r)<0}function J(e,t,r){return 0===Y(e,t,r)}function Z(e,t,r){return 0!==Y(e,t,r)}function ee(e,t,r){return Y(e,t,r)>=0}function te(e,t,r){return Y(e,t,r)<=0}function re(e,t,r,n){switch(t){case"===":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e===r;case"!==":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e!==r;case"":case"=":case"==":return J(e,r,n);case"!=":return Z(e,r,n);case">":return z(e,r,n);case">=":return ee(e,r,n);case"<":return W(e,r,n);case"<=":return te(e,r,n);default:throw new TypeError("Invalid operator: "+t)}}function ne(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof ne){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof ne))return new ne(e,t);r("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ie?this.value="":this.value=this.operator+this.semver.version,r("comp",this)}t.rcompareIdentifiers=function(e,t){return X(t,e)},t.major=function(e,t){return new G(e,t).major},t.minor=function(e,t){return new G(e,t).minor},t.patch=function(e,t){return new G(e,t).patch},t.compare=Y,t.compareLoose=function(e,t){return Y(e,t,!0)},t.rcompare=function(e,t,r){return Y(t,e,r)},t.sort=function(e,r){return e.sort((function(e,n){return t.compare(e,n,r)}))},t.rsort=function(e,r){return e.sort((function(e,n){return t.rcompare(e,n,r)}))},t.gt=z,t.lt=W,t.eq=J,t.neq=Z,t.gte=ee,t.lte=te,t.cmp=re,t.Comparator=ne;var ie={};function oe(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof oe)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new oe(e.raw,t);if(e instanceof ne)return new oe(e.value,t);if(!(this instanceof oe))return new oe(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map((function(e){return this.parseRange(e.trim())}),this).filter((function(e){return e.length})),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function se(e){return!e||"x"===e.toLowerCase()||"*"===e}function ae(e,t,r,n,i,o,s,a,c,u,d,p,l){return((t=se(r)?"":se(n)?">="+r+".0.0":se(i)?">="+r+"."+n+".0":">="+t)+" "+(a=se(c)?"":se(u)?"<"+(+c+1)+".0.0":se(d)?"<"+c+"."+(+u+1)+".0":p?"<="+c+"."+u+"."+d+"-"+p:"<="+a)).trim()}function ce(e,t,n){for(var i=0;i0){var o=e[i].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}return!0}function ue(e,t,r){try{t=new oe(t,r)}catch(e){return!1}return t.test(e)}function de(e,t,r,n){var i,o,s,a,c;switch(e=new G(e,n),t=new oe(t,n),r){case">":i=z,o=te,s=W,a=">",c=">=";break;case"<":i=W,o=ee,s=z,a="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ue(e,t,n))return!1;for(var u=0;u=0.0.0")),p=p||e,l=l||e,i(e.semver,p.semver,n)?p=e:s(e.semver,l.semver,n)&&(l=e)})),p.operator===a||p.operator===c)return!1;if((!l.operator||l.operator===a)&&o(e,l.semver))return!1;if(l.operator===c&&s(e,l.semver))return!1}return!0}ne.prototype.parse=function(e){var t=this.options.loose?i[L]:i[V],r=e.match(t);if(!r)throw new TypeError("Invalid comparator: "+e);this.operator=r[1],"="===this.operator&&(this.operator=""),r[2]?this.semver=new G(r[2],this.options.loose):this.semver=ie},ne.prototype.toString=function(){return this.value},ne.prototype.test=function(e){return r("Comparator.test",e,this.options.loose),this.semver===ie||("string"==typeof e&&(e=new G(e,this.options)),re(e,this.operator,this.semver,this.options))},ne.prototype.intersects=function(e,t){if(!(e instanceof ne))throw new TypeError("a Comparator is required");var r;if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return r=new oe(e.value,t),ue(this.value,r,t);if(""===e.operator)return r=new oe(this.value,t),ue(e.semver,r,t);var n=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),i=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),o=this.semver.version===e.semver.version,s=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),a=re(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=re(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return n||i||o&&s||a||c},t.Range=oe,oe.prototype.format=function(){return this.range=this.set.map((function(e){return e.join(" ").trim()})).join("||").trim(),this.range},oe.prototype.toString=function(){return this.range},oe.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var n=t?i[F]:i[B];e=e.replace(n,ae),r("hyphen replace",e),e=e.replace(i[M],"$1$2$3"),r("comparator trim",e,i[M]),e=(e=(e=e.replace(i[P],"$1~")).replace(i[q],"$1^")).split(/\s+/).join(" ");var o=t?i[L]:i[V],s=e.split(" ").map((function(e){return function(e,t){return r("comp",e,t),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){r("caret",e,t);var n=t.loose?i[U]:i[N];return e.replace(n,(function(t,n,i,o,s){var a;return r("caret",e,t,n,i,o,s),se(n)?a="":se(i)?a=">="+n+".0.0 <"+(+n+1)+".0.0":se(o)?a="0"===n?">="+n+"."+i+".0 <"+n+"."+(+i+1)+".0":">="+n+"."+i+".0 <"+(+n+1)+".0.0":s?(r("replaceCaret pr",s),a="0"===n?"0"===i?">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+i+"."+(+o+1):">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+(+i+1)+".0":">="+n+"."+i+"."+o+"-"+s+" <"+(+n+1)+".0.0"):(r("no pr"),a="0"===n?"0"===i?">="+n+"."+i+"."+o+" <"+n+"."+i+"."+(+o+1):">="+n+"."+i+"."+o+" <"+n+"."+(+i+1)+".0":">="+n+"."+i+"."+o+" <"+(+n+1)+".0.0"),r("caret return",a),a}))}(e,t)})).join(" ")}(e,t),r("caret",e),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){var n=t.loose?i[j]:i[R];return e.replace(n,(function(t,n,i,o,s){var a;return r("tilde",e,t,n,i,o,s),se(n)?a="":se(i)?a=">="+n+".0.0 <"+(+n+1)+".0.0":se(o)?a=">="+n+"."+i+".0 <"+n+"."+(+i+1)+".0":s?(r("replaceTilde pr",s),a=">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+(+i+1)+".0"):a=">="+n+"."+i+"."+o+" <"+n+"."+(+i+1)+".0",r("tilde return",a),a}))}(e,t)})).join(" ")}(e,t),r("tildes",e),e=function(e,t){return r("replaceXRanges",e,t),e.split(/\s+/).map((function(e){return function(e,t){e=e.trim();var n=t.loose?i[x]:i[S];return e.replace(n,(function(t,n,i,o,s,a){r("xRange",e,t,n,i,o,s,a);var c=se(i),u=c||se(o),d=u||se(s);return"="===n&&d&&(n=""),c?t=">"===n||"<"===n?"<0.0.0":"*":n&&d?(u&&(o=0),s=0,">"===n?(n=">=",u?(i=+i+1,o=0,s=0):(o=+o+1,s=0)):"<="===n&&(n="<",u?i=+i+1:o=+o+1),t=n+i+"."+o+"."+s):u?t=">="+i+".0.0 <"+(+i+1)+".0.0":d&&(t=">="+i+"."+o+".0 <"+i+"."+(+o+1)+".0"),r("xRange return",t),t}))}(e,t)})).join(" ")}(e,t),r("xrange",e),e=function(e,t){return r("replaceStars",e,t),e.trim().replace(i[$],"")}(e,t),r("stars",e),e}(e,this.options)}),this).join(" ").split(/\s+/);return this.options.loose&&(s=s.filter((function(e){return!!e.match(o)}))),s=s.map((function(e){return new ne(e,this.options)}),this)},oe.prototype.intersects=function(e,t){if(!(e instanceof oe))throw new TypeError("a Range is required");return this.set.some((function(r){return r.every((function(r){return e.set.some((function(e){return e.every((function(e){return r.intersects(e,t)}))}))}))}))},t.toComparators=function(e,t){return new oe(e,t).set.map((function(e){return e.map((function(e){return e.value})).join(" ").trim().split(" ")}))},oe.prototype.test=function(e){if(!e)return!1;"string"==typeof e&&(e=new G(e,this.options));for(var t=0;t":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!z(r,t)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}}))}if(r&&e.test(r))return r;return null},t.validRange=function(e,t){try{return new oe(e,t).range||"*"}catch(e){return null}},t.ltr=function(e,t,r){return de(e,t,"<",r)},t.gtr=function(e,t,r){return de(e,t,">",r)},t.outside=de,t.prerelease=function(e,t){var r=K(e,t);return r&&r.prerelease.length?r.prerelease:null},t.intersects=function(e,t,r){return e=new oe(e,r),t=new oe(t,r),e.intersects(t)},t.coerce=function(e){if(e instanceof G)return e;if("string"!=typeof e)return null;var t=e.match(i[k]);if(null==t)return null;return K(t[1]+"."+(t[2]||"0")+"."+(t[3]||"0"))}})),vt=(wt.SEMVER_SPEC_VERSION,wt.re,wt.src,wt.parse,wt.valid,wt.clean,wt.SemVer,wt.inc,wt.diff,wt.compareIdentifiers,wt.rcompareIdentifiers,wt.major,wt.minor,wt.patch,wt.compare,wt.compareLoose,wt.rcompare,wt.sort,wt.rsort,wt.gt,wt.lt,wt.eq,wt.neq,wt.gte,wt.lte,wt.cmp,wt.Comparator,wt.Range,wt.toComparators,wt.satisfies,wt.maxSatisfying,wt.minSatisfying,wt.minVersion,wt.validRange,wt.ltr,wt.gtr,wt.outside,wt.prerelease,wt.intersects,wt.coerce,wt.satisfies(process.version,"^6.12.0 || >=8.0.0")),_t=["RS256","RS384","RS512","ES256","ES384","ES512"],bt=["RS256","RS384","RS512"],Tt=["HS256","HS384","HS512"];vt&&(_t.splice(3,0,"PS256","PS384","PS512"),bt.splice(3,0,"PS256","PS384","PS512"));var Et=/^\s+|\s+$/g,Ct=/^[-+]0x[0-9a-f]+$/i,At=/^0b[01]+$/i,It=/^0o[0-7]+$/i,St=/^(?:0|[1-9]\d*)$/,xt=parseInt;function kt(e){return e!=e}function Ot(e,t){return function(e,t){for(var r=-1,n=e?e.length:0,i=Array(n);++r-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991}(e.length)&&!function(e){var t=Ht(e)?qt.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)}function Ht(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function Kt(e){return!!e&&"object"==typeof e}var Gt=function(e,t,r,n){var i;e=$t(e)?e:(i=e)?Ot(i,function(e){return $t(e)?Vt(e):Mt(e)}(i)):[],r=r&&!n?function(e){var t=function(e){if(!e)return 0===e?e:0;if((e=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||Kt(e)&&"[object Symbol]"==qt.call(e)}(e))return NaN;if(Ht(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Ht(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(Et,"");var r=At.test(e);return r||It.test(e)?xt(e.slice(2),r?2:8):Ct.test(e)?NaN:+e}(e))===1/0||e===-1/0){return 17976931348623157e292*(e<0?-1:1)}return e==e?e:0}(e),r=t%1;return t==t?r?t-r:t:0}(r):0;var o=e.length;return r<0&&(r=Lt(o+r,0)),function(e){return"string"==typeof e||!Ft(e)&&Kt(e)&&"[object String]"==qt.call(e)}(e)?r<=o&&e.indexOf(t,r)>-1:!!o&&function(e,t,r){if(t!=t)return function(e,t,r,n){for(var i=e.length,o=r+(n?1:-1);n?o--:++o-1},Qt=Object.prototype.toString;var Xt=function(e){return!0===e||!1===e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Boolean]"==Qt.call(e)},Yt=/^\s+|\s+$/g,zt=/^[-+]0x[0-9a-f]+$/i,Wt=/^0b[01]+$/i,Jt=/^0o[0-7]+$/i,Zt=parseInt,er=Object.prototype.toString;function tr(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var rr=function(e){return"number"==typeof e&&e==function(e){var t=function(e){if(!e)return 0===e?e:0;if((e=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==er.call(e)}(e))return NaN;if(tr(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=tr(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(Yt,"");var r=Wt.test(e);return r||Jt.test(e)?Zt(e.slice(2),r?2:8):zt.test(e)?NaN:+e}(e))===1/0||e===-1/0){return 17976931348623157e292*(e<0?-1:1)}return e==e?e:0}(e),r=t%1;return t==t?r?t-r:t:0}(e)},nr=Object.prototype.toString;var ir=function(e){return"number"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Number]"==nr.call(e)};var or=Function.prototype,sr=Object.prototype,ar=or.toString,cr=sr.hasOwnProperty,ur=ar.call(Object),dr=sr.toString,pr=function(e,t){return function(r){return e(t(r))}}(Object.getPrototypeOf,Object);var lr=function(e){if(!function(e){return!!e&&"object"==typeof e}(e)||"[object Object]"!=dr.call(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e))return!1;var t=pr(e);if(null===t)return!0;var r=cr.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&ar.call(r)==ur},fr=Object.prototype.toString,mr=Array.isArray;var hr=function(e){return"string"==typeof e||!mr(e)&&function(e){return!!e&&"object"==typeof e}(e)&&"[object String]"==fr.call(e)},gr=/^\s+|\s+$/g,yr=/^[-+]0x[0-9a-f]+$/i,wr=/^0b[01]+$/i,vr=/^0o[0-7]+$/i,_r=parseInt,br=Object.prototype.toString;function Tr(e,t){var r;if("function"!=typeof t)throw new TypeError("Expected a function");return e=function(e){var t=function(e){if(!e)return 0===e?e:0;if((e=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==br.call(e)}(e))return NaN;if(Er(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Er(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(gr,"");var r=wr.test(e);return r||vr.test(e)?_r(e.slice(2),r?2:8):yr.test(e)?NaN:+e}(e))===1/0||e===-1/0){return 17976931348623157e292*(e<0?-1:1)}return e==e?e:0}(e),r=t%1;return t==t?r?t-r:t:0}(e),function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=void 0),r}}function Er(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var Cr=function(e){return Tr(2,e)},Ar=["RS256","RS384","RS512","ES256","ES384","ES512","HS256","HS384","HS512","none"];vt&&Ar.splice(3,0,"PS256","PS384","PS512");var Ir={expiresIn:{isValid:function(e){return rr(e)||hr(e)&&e},message:'"expiresIn" should be a number of seconds or string representing a timespan'},notBefore:{isValid:function(e){return rr(e)||hr(e)&&e},message:'"notBefore" should be a number of seconds or string representing a timespan'},audience:{isValid:function(e){return hr(e)||Array.isArray(e)},message:'"audience" must be a string or array'},algorithm:{isValid:Gt.bind(null,Ar),message:'"algorithm" must be a valid string enum value'},header:{isValid:lr,message:'"header" must be an object'},encoding:{isValid:hr,message:'"encoding" must be a string'},issuer:{isValid:hr,message:'"issuer" must be a string'},subject:{isValid:hr,message:'"subject" must be a string'},jwtid:{isValid:hr,message:'"jwtid" must be a string'},noTimestamp:{isValid:Xt,message:'"noTimestamp" must be a boolean'},keyid:{isValid:hr,message:'"keyid" must be a string'},mutatePayload:{isValid:Xt,message:'"mutatePayload" must be a boolean'}},Sr={iat:{isValid:ir,message:'"iat" should be a number of seconds'},exp:{isValid:ir,message:'"exp" should be a number of seconds'},nbf:{isValid:ir,message:'"nbf" should be a number of seconds'}};function xr(e,t,r,n){if(!lr(r))throw new Error('Expected "'+n+'" to be a plain object.');Object.keys(r).forEach((function(i){var o=e[i];if(o){if(!o.isValid(r[i]))throw new Error(o.message)}else if(!t)throw new Error('"'+i+'" is not allowed in "'+n+'"')}))}var kr={audience:"aud",issuer:"iss",subject:"sub",jwtid:"jti"},Or=["expiresIn","notBefore","noTimestamp","audience","issuer","subject","jwtid"],Pr=function(e,t,r,n){var i;if("function"!=typeof r||n||(n=r,r={}),r||(r={}),r=Object.assign({},r),i=n||function(e,t){if(e)throw e;return t},r.clockTimestamp&&"number"!=typeof r.clockTimestamp)return i(new st("clockTimestamp must be a number"));if(void 0!==r.nonce&&("string"!=typeof r.nonce||""===r.nonce.trim()))return i(new st("nonce must be a non-empty string"));var o=r.clockTimestamp||Math.floor(Date.now()/1e3);if(!e)return i(new st("jwt must be provided"));if("string"!=typeof e)return i(new st("jwt must be a string"));var s,a=e.split(".");if(3!==a.length)return i(new st("jwt malformed"));try{s=it(e,{complete:!0})}catch(e){return i(e)}if(!s)return i(new st("invalid token"));var c,u=s.header;if("function"==typeof t){if(!n)return i(new st("verify must be called asynchronous if secret or public key is provided as a callback"));c=t}else c=function(e,r){return r(null,t)};return c(u,(function(t,n){if(t)return i(new st("error in secret or public key callback: "+t.message));var c,d=""!==a[2].trim();if(!d&&n)return i(new st("jwt signature is required"));if(d&&!n)return i(new st("secret or public key must be provided"));if(d||r.algorithms||(r.algorithms=["none"]),r.algorithms||(r.algorithms=~n.toString().indexOf("BEGIN CERTIFICATE")||~n.toString().indexOf("BEGIN PUBLIC KEY")?_t:~n.toString().indexOf("BEGIN RSA PUBLIC KEY")?bt:Tt),!~r.algorithms.indexOf(s.header.alg))return i(new st("invalid algorithm"));try{c=nt.verify(e,s.header.alg,n)}catch(e){return i(e)}if(!c)return i(new st("invalid signature"));var p=s.payload;if(void 0!==p.nbf&&!r.ignoreNotBefore){if("number"!=typeof p.nbf)return i(new st("invalid nbf value"));if(p.nbf>o+(r.clockTolerance||0))return i(new ct("jwt not active",new Date(1e3*p.nbf)))}if(void 0!==p.exp&&!r.ignoreExpiration){if("number"!=typeof p.exp)return i(new st("invalid exp value"));if(o>=p.exp+(r.clockTolerance||0))return i(new dt("jwt expired",new Date(1e3*p.exp)))}if(r.audience){var l=Array.isArray(r.audience)?r.audience:[r.audience];if(!(Array.isArray(p.aud)?p.aud:[p.aud]).some((function(e){return l.some((function(t){return t instanceof RegExp?t.test(e):t===e}))})))return i(new st("jwt audience invalid. expected: "+l.join(" or ")))}if(r.issuer&&("string"==typeof r.issuer&&p.iss!==r.issuer||Array.isArray(r.issuer)&&-1===r.issuer.indexOf(p.iss)))return i(new st("jwt issuer invalid. expected: "+r.issuer));if(r.subject&&p.sub!==r.subject)return i(new st("jwt subject invalid. expected: "+r.subject));if(r.jwtid&&p.jti!==r.jwtid)return i(new st("jwt jwtid invalid. expected: "+r.jwtid));if(r.nonce&&p.nonce!==r.nonce)return i(new st("jwt nonce invalid. expected: "+r.nonce));if(r.maxAge){if("number"!=typeof p.iat)return i(new st("iat required when maxAge is specified"));var f=yt(r.maxAge,p.iat);if(void 0===f)return i(new st('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));if(o>=f+(r.clockTolerance||0))return i(new dt("maxAge exceeded",new Date(1e3*f)))}if(!0===r.complete){var m=s.signature;return i(null,{header:u,payload:p,signature:m})}return i(null,p)}))},Rr=function(e,t,r,n){"function"==typeof r?(n=r,r={}):r=r||{};var i="object"==typeof e&&!Buffer.isBuffer(e),o=Object.assign({alg:r.algorithm||"HS256",typ:i?"JWT":void 0,kid:r.keyid},r.header);function s(e){if(n)return n(e);throw e}if(!t&&"none"!==r.algorithm)return s(new Error("secretOrPrivateKey must have a value"));if(void 0===e)return s(new Error("payload is required"));if(i){try{!function(e){xr(Sr,!0,e,"payload")}(e)}catch(e){return s(e)}r.mutatePayload||(e=Object.assign({},e))}else{var a=Or.filter((function(e){return void 0!==r[e]}));if(a.length>0)return s(new Error("invalid "+a.join(",")+" option for "+typeof e+" payload"))}if(void 0!==e.exp&&void 0!==r.expiresIn)return s(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));if(void 0!==e.nbf&&void 0!==r.notBefore)return s(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));try{!function(e){xr(Ir,!1,e,"options")}(r)}catch(e){return s(e)}var c=e.iat||Math.floor(Date.now()/1e3);if(r.noTimestamp?delete e.iat:i&&(e.iat=c),void 0!==r.notBefore){try{e.nbf=yt(r.notBefore,c)}catch(e){return s(e)}if(void 0===e.nbf)return s(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}if(void 0!==r.expiresIn&&"object"==typeof e){try{e.exp=yt(r.expiresIn,c)}catch(e){return s(e)}if(void 0===e.exp)return s(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}Object.keys(kr).forEach((function(t){var n=kr[t];if(void 0!==r[t]){if(void 0!==e[n])return s(new Error('Bad "options.'+t+'" option. The payload already has an "'+n+'" property.'));e[n]=r[t]}}));var u=r.encoding||"utf8";if("function"!=typeof n)return nt.sign({header:o,payload:e,secret:t,encoding:u});n=n&&Cr(n),nt.createSign({header:o,privateKey:t,payload:e,encoding:u}).once("error",n).once("done",(function(e){n(null,e)}))};let jr=[];class Dr{constructor(e){this.options=Object.assign({baseUrl:"https://appleid.apple.com",timeout:1e4},e)}async _fetch(e,t){const{baseUrl:r}=this.options;return uniCloud.httpclient.request(r+e,t)}async verifyIdentityToken(e){const t=e.split(".")[0],{kid:r}=JSON.parse(Buffer.from(t,"base64").toString());if(!jr.length)try{jr=await this.getAuthKeys()}catch(e){return{code:10705,msg:e.message}}const n=this.getUsedKey(jr,r);if(!Object.keys(n).length&&!this.fetched)try{jr=await this.getAuthKeys()}catch(e){return{code:10705,msg:e.message}}let i=null;try{i=Pr(e,function(e,t){var r=Buffer.from(e,"base64"),n=Buffer.from(t,"base64"),i=r.toString("hex"),o=n.toString("hex");i=J(i),o=J(o);var s=i.length/2,a=o.length/2,c=ee(s),u=ee(a),d="30"+ee(s+a+c.length/2+u.length/2+2)+"02"+c+i+"02"+u+o;return"-----BEGIN RSA PUBLIC KEY-----\n"+Buffer.from(d,"hex").toString("base64").match(/.{1,64}/g).join("\n")+"\n-----END RSA PUBLIC KEY-----\n"}(n.n,n.e),{algorithms:n.alg})}catch(e){return{code:10705,msg:e.message}}return{code:0,msg:i}}async getAuthKeys(){const{status:e,data:t}=await this._fetch("/auth/keys",{method:"GET",dataType:"json",timeout:this.options.timeout});if(200!==e)throw new Error("request https://appleid.apple.com/auth/keys fail");return t.keys}getUsedKey(e,t){let r={};for(let n=0;nvoid 0===e))return{code:N,messageValues:{param:this.t("dcloud-appid")}};const r=await P.doc(e).get(),n=r&&r.data&&r.data[0];if(!n)return{code:10002};const i=Object.keys(q).reduce((e,t)=>{const r=t,i=function(e,t){return t.split(".").reduce((e,t)=>e&&e[t],e)}(n,t);return i&&e.push({[r]:i}),e},[]);let o;const s={dcloud_appid:Mr.in(t),_id:Mr.neq(n._id)},a={dcloud_appid:Mr.exists(!1),_id:Mr.neq(n._id)};switch(i.length){case 0:return{code:10004};case 1:o=Mr.or([Mr.and([i[0],s]),Mr.and([i[0],a])]);break;default:o=Mr.or([Mr.and([Mr.or(i),s]),Mr.and([Mr.or(i),a])])}const c=await P.where(o).limit(1).get();return c&&c.data&&c.data[0]?{code:10005}:{code:0}}const Fr=uniCloud.database().command;const $r=uniCloud.database();const Hr=uniCloud.database();const Kr=uniCloud.database();async function Gr(e){const t=["apiKey","apiSecret"];for(let r=0,n=t.length;r0){u=a.and(a.or(c),a.or({dcloud_appid:a.in(s)},{dcloud_appid:a.exists(!1)}));if((await P.where(u).limit(1).get()).data.length>0)return{code:10201,messageValues:{type:this.t("username")}}}const d={role:o,nickname:t,dcloud_appid:s,register_date:Date.now()};if(e&&(d.username=e),r){const{passwordHash:e,version:t}=this.encryptPwd(r);d.password=e,t&&(d.password_secret_version=t)}return n&&(d.mobile=n,d.mobile_confirmed=1),i&&(d.email=i,d.email_confirmed=1),{code:0,uid:(await P.add(d)).id}},getUserInfo:async function({uid:e,field:t}){if(!e)return{code:N,messageValues:{param:this.t("user-id")}};let r;if(t&&t.length){const n={};for(let e=0;evoid 0===e.dcloud_appid||e.dcloud_appid.includes(this.context.APPID));if(0===i.length)return{code:10002};if(i.length>1)return{code:10005};const o=i[0]._id;return this.resetPwd({uid:o,password:r})},setAvatar:async function(e){return await P.doc(e.uid).update({avatar:e.avatar}),{code:0,msg:""}},updatePwd:async function(e){const t=await P.doc(e.uid).get();if(t&&t.data&&t.data.length>0){if(0===this._checkPwd(t.data[0],e.oldPassword).code){const{passwordHash:r,version:n}=this.encryptPwd(e.newPassword),i={password:r,token:[]};n&&(i.password_secret_version=n);return E("upRes",await P.doc(t.data[0]._id).update(i)),{code:0,msg:""}}return{code:40202}}return{code:40201}},updateUser:async function(e){const t=e.uid;if(!t)return{code:N,messageValues:{param:this.t("user-id")}};delete e.uid;const{username:r,email:n}=e,{usernameToLowerCase:i,emailToLowerCase:o}=this._getConfig();let s=r&&r.trim(),a=n&&n.trim();return s&&(i&&(s=s.toLowerCase()),e.username=s),a&&(o&&(a=a.toLowerCase()),e.email=a),E("update -> upRes",await P.doc(t).update(e)),{code:0,msg:""}},banAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:B})},unbanAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:M})},closeAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:F})},openAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:M})},_getAlipayApi:function(){const e=this.context.PLATFORM,t=this._getConfig();if(!t.oauth||!t.oauth.alipay)throw new Error(this.t("config-param-require",{param:e+".alipay"}));return["appid","privateKey"].forEach(r=>{if(!t.oauth.alipay[r])throw new Error(this.t("config-param-require",{param:`${e}.alipay.${r}`}))}),Ur({...t.oauth.alipay})},_getValidInviteCode:async function({inviteCode:e}){let t,r=10;e?(r=1,t=e):t=Vr();let n=!1;try{for(;r>0&&!n;){r--;if(0===(await P.where({my_invite_code:t}).get()).data.length){n=!0;break}t=Vr()}t=Vr()}catch(e){}return n?{code:0,inviteCode:t}:e?{code:80401}:{code:80402}},_addUser:async function(e,{needPermission:t,autoSetDcloudAppid:r=!0}={}){const n=this._getConfig(),i={...e,dcloud_appid:r?[this.context.APPID]:[],register_date:Date.now()},o=(await P.add(i)).id;let s;if(n.removePermissionAndRoleFromToken)s=await this.createToken({uid:o,needPermission:t});else{const t=e.role||[];let r;r=0===t.length||t.includes("admin")?[]:await this._getPermissionListByRoleList(t),s=await this.createToken({uid:o,role:t,permission:r})}const{token:a,tokenExpired:c}=s;return await P.doc(o).update({token:[a]}),{token:a,tokenExpired:c,uid:o,type:"register",userInfo:Object.assign({},i,{token:[a]})}},_loginExec:async function(e,t={}){if(e.status===B)return{code:10001};if(e.status===F)return{code:10006};const r=this._getConfig();let n=e.token||[];"string"==typeof n&&(n=[n]);const i=this._getExpiredToken(n);let o;if(n=n.filter(e=>-1===i.indexOf(e)),r.removePermissionAndRoleFromToken){const r=t.needPermission;o=await this.createToken({uid:e._id,needPermission:r})}else{const t=e.role||[];let r;r=0===t.length||t.includes("admin")?[]:await this._getPermissionListByRoleList(t),o=await this.createToken({uid:e._id,role:t,permission:r})}const{token:s,tokenExpired:a}=o;n.push(s),e.token=n;const c={last_login_date:Date.now(),last_login_ip:this.context.CLIENTIP,token:n,...t.extraData};await P.doc(e._id).update(c);const u=Object.assign({},e,c);return{code:0,msg:"",token:s,uid:u._id,username:u.username,type:"login",userInfo:u,tokenExpired:a}},_registerExec:async function(e,{needPermission:t,autoSetDcloudAppid:r=!0}={}){const{my_invite_code:n}=e;if(this._getConfig().autoSetInviteCode||n){const t=await this._getValidInviteCode({inviteCode:n});if(t.code)return t;e.my_invite_code=t.inviteCode}const{PLATFORM:i,appId:o,appid:s,APPID:a,uniPlatform:c,appName:u,appVersion:d,appVersionCode:p,channel:l,clientIP:f,CLIENTIP:m,OS:h,osName:g}=this.context;return e.register_env={appid:o||s||a||"",uni_platform:c||i||"",os_name:g||h||"",app_name:u||"",app_version:d||"",app_version_code:p||"",channel:l?l+"":"",client_ip:f||m||""},{code:0,msg:"",...await this._addUser(e,{needPermission:t,autoSetDcloudAppid:r})}},_getWeixinApi:function(){const e=this.context.PLATFORM,t=this._getConfig();if(!t.oauth||!t.oauth.weixin)throw new Error(this.t("config-param-require",{param:e+".weixin"}));return["appid","appsecret"].forEach(r=>{if(!t.oauth.weixin[r])throw new Error(this.t("config-param-require",{param:`${e}.weixin.${r}`}))}),qr({...t.oauth.weixin})},_getQQApi:function(){const e=this.context.PLATFORM,t=this._getConfig();if(!t.oauth||!t.oauth.qq)throw new Error(this.t("config-param-require",{param:e+".qq"}));return["appid","appsecret"].forEach(r=>{if(!t.oauth.qq[r])throw new Error(this.t("config-param-require",{param:`${e}.qq.${r}`}))}),Nr({...t.oauth.qq})},_getMatchedUser:function(e,t){if(0===e.length)return{code:10002};let r;const n={},i={};for(let r=e.length-1;r>=0;r--){const o=e[r];for(let s=0;s0?{code:10003,messageValues:{target:"用户"}}:{code:0,msg:"",userMatched:r,fieldMatched:s,isFallbackValueMatched:!!s&&i[s]}},_getCurrentAppUser:function(e){const t=this.context.APPID;return e.filter(e=>void 0===e.dcloud_appid||null===e.dcloud_appid||e.dcloud_appid.indexOf(t)>-1||e.dcloud_appid.indexOf(null)>-1)},_checkLoginUserList:function(e){if(e&&1!==e.length)return e[0].status===F?{code:10006}:{code:10005}},setAuthorizedAppLogin:async function({uid:e,dcloudAppidList:t}={}){if("array"!==m(t))return{code:U,messageValues:{param:"dcloudAppidList",reason:this.t("type-array-required",{param:this.t("dcloud-appid-list")})}};if(t&&0!==t.length){const r=await Br.bind(this)({uid:e,dcloudAppidList:t});if(r.code)return r}return await P.doc(e).update({dcloud_appid:Mr.set(t)}),{code:0}},authorizeAppLogin:async function({uid:e,dcloudAppid:t}={}){const r=await Br.bind(this)({uid:e,dcloudAppidList:[t]});return r.code?r:(await P.doc(e).update({dcloud_appid:Mr.push(t)}),{code:0})},forbidAppLogin:async function({uid:e,dcloudAppid:t}={}){return e?(await P.doc(e).update({dcloud_appid:Mr.pull(t)}),{code:0}):{code:N,messageValues:{param:this.t("user-id")}}},acceptInvite:async function({uid:e,inviteCode:t}){const r=await P.where({_id:Fr.neq(e),inviter_uid:Fr.not(Fr.all([e])),my_invite_code:t}).get();if(1!==r.data.length)return{code:80501,msg:"邀请码无效"};const n=[r.data[0]._id].concat(r.data[0].inviter_uid||[]),i=await P.doc(e).field({my_invite_code:!0,inviter_uid:!0}).get();if(0===i.data.length)return{code:80502};if(i.data[0].inviter_uid&&i.data[0].inviter_uid.length>0)return{code:80503,msg:"邀请码不可修改"};const o=Date.now();return await P.doc(e).update({inviter_uid:n,invite_time:o}),await P.where({inviter_uid:e}).update({inviter_uid:Fr.push(n)}),{code:0,msg:""}},getInvitedUser:async function({uid:e,level:t=1,limit:r=20,offset:n=0,needTotal:i=!1}){const o={code:0,msg:"",invitedUser:(await P.where({["inviter_uid."+(t-1)]:e}).field({_id:!0,username:!0,mobile:!0,invite_time:!0}).orderBy("invite_time","desc").skip(n).limit(r).get()).data};if(i){const r=await P.where({["inviter_uid."+(t-1)]:e}).count();o.total=r.total}return o},setUserInviteCode:async function({uid:e,myInviteCode:t}){const r=await this._getValidInviteCode({inviteCode:t});return r.code?r:(await P.doc(e).update({my_invite_code:r.inviteCode}),{code:0,msg:"",myInviteCode:r.inviteCode})},loginByAlipay:async function(e){"string"==typeof e&&(e={code:e});const{needPermission:t,code:r,myInviteCode:n,role:i,type:o}=e,{openid:s}=await this._getAlipayApi().code2Session(r);if(!s)return{code:10501,messageValues:{account:this.t("alipay-account")}};let a=await P.where({ali_openid:s}).get();if(a=this._getCurrentAppUser(a.data),a&&a.length>0){if("register"===o)return{code:10502,messageValues:{type:this.t("alipay-account")}};if(1!==a.length)return{code:10005};const e=a[0],r=await this._loginExec(e,{needPermission:t});if(0!==r.code)return r;const{userInfo:n}=r;return{...r,openid:s,mobileConfirmed:1===n.mobile_confirmed,emailConfirmed:1===n.email_confirmed}}{if("login"===o)return{code:10503,messageValues:{type:this.t("alipay-account")}};const e={ali_openid:s};e.my_invite_code=n,e.role=i;const r=await this._registerExec(e,{needPermission:t});return 0!==r.code?r:{...r,openid:s,mobileConfirmed:!1,emailConfirmed:!1}}},loginByEmail:async function(e){let{email:t,code:r,password:n,myInviteCode:i,type:o,needPermission:s,role:a}=e||{};if(t=t&&t.trim(),!t)return{code:N,messageValues:{param:"邮箱"}};const{emailToLowerCase:c}=this._getConfig();let u=t;c&&(u=t.toLowerCase());const d=await this.verifyCode({email:u,code:r,type:o||"login"});if(0!==d.code)return d;let p={email:t,email_confirmed:1};const l={field:"email",value:t},f=$r.command;u!==t&&(p=f.or(p,{email:u,email_confirmed:1}),l.fallbackValue=u);let m=await P.where(p).get();if(m=this._getCurrentAppUser(m.data),m&&m.length>0){if("register"===o)return{code:10301,messageValues:{type:"邮箱"}};const e=this._getMatchedUser(m,[l]);if(e.code)return e;const{userMatched:t}=e,r=await this._loginExec(t,{needPermission:s});return 0!==r.code?r:{...r,email:u}}{if("login"===o)return{code:10302,messageValues:{type:"邮箱"}};const e={email:u,email_confirmed:1},t=n&&n.trim();if(t){const{passwordHash:r,version:n}=this.encryptPwd(t);e.password=r,n&&(e.password_secret_version=n)}e.my_invite_code=i,e.role=a;const r=await this._registerExec(e,{needPermission:s});return 0!==r.code?r:{...r,email:u}}},loginBySms:async function({mobile:e,code:t,password:r,inviteCode:n,myInviteCode:i,type:o,needPermission:s,role:a}){if(!(e=e&&e.trim()))return{code:N,messageValues:{param:this.t("mobile")}};const c=this._getConfig();if(c.forceInviteCode&&!o)throw new Error(this.t("login-with-invite-type-required"));const u=await this.verifyCode({mobile:e,code:t,type:o||"login"});if(0!==u.code)return u;const d={mobile:e,mobile_confirmed:1};let p=await P.where(d).get();if(p=this._getCurrentAppUser(p.data),p&&p.length>0){if("register"===o)return{code:10201,messageValues:{type:this.t("mobile")}};if(1!==p.length)return{code:10005};const t=p[0],r=await this._loginExec(t,{needPermission:s});return 0!==r.code?r:{...r,mobile:e}}{const t=Date.now();if("login"===o)return{code:10202,messageValues:{type:this.t("mobile")}};const u={mobile:e,mobile_confirmed:1,register_ip:this.context.CLIENTIP,register_date:t},d=r&&r.trim();if(d){const{passwordHash:e,version:t}=this.encryptPwd(d);u.password=e,t&&(u.password_secret_version=t)}if(n){const e=await P.where({my_invite_code:n}).get();if(1!==e.data.length)return{code:10203};u.inviter_uid=[e.data[0]._id].concat(e.data[0].inviter_uid||[]),u.invite_time=t}else if(c.forceInviteCode)return{code:10203};u.my_invite_code=i,u.role=a;const p=await this._registerExec(u,{needPermission:s});return 0!==p.code?p:{...p,mobile:e}}},loginByWeixin:async function(e){"string"==typeof e&&(e={code:e});const{needPermission:t,platform:r,code:n,myInviteCode:i,role:o,type:s}=e,a=r||this.context.PLATFORM,c="mp-weixin"===a,{openid:u,unionid:d,sessionKey:p,accessToken:l,refreshToken:f,expired:m}=await this._getWeixinApi()[c?"code2Session":"getOauthAccessToken"](n);if(!u)return{code:10401,messageValues:{account:"微信openid"}};let h;h=c?{sessionKey:p}:{accessToken:l,refreshToken:f,accessTokenExpired:m};const g=Hr.command,y=[{wx_openid:{[a]:u}}];d&&y.push({wx_unionid:d});let w=await P.where(g.or(...y)).get();if(w=this._getCurrentAppUser(w.data),w&&w.length>0){if("register"===s)return{code:10402,messageValues:{type:this.t("wechat-account")}};if(1!==w.length)return{code:10005};const e=w[0],r={wx_openid:{[a]:u}};d&&(r.wx_unionid=d);const n=await this._loginExec(e,{needPermission:t,extraData:r});if(0!==n.code)return n;const{userInfo:i}=n;return{...n,openid:u,unionid:d,...h,mobileConfirmed:1===i.mobile_confirmed,emailConfirmed:1===i.email_confirmed}}{if("login"===s)return{code:10403,messageValues:{type:this.t("wechat-account")}};const e={wx_openid:{[a]:u},wx_unionid:d};e.my_invite_code=i,e.role=o;const r=await this._registerExec(e,{needPermission:t});return 0!==r.code?r:{...r,openid:u,unionid:d,...h,mobileConfirmed:!1,emailConfirmed:!1}}},loginByQQ:async function({code:e,accessToken:t,myInviteCode:r,needPermission:n,role:i,type:o}={}){const s=this.context.PLATFORM,a="mp-qq"===s,{openid:c,unionid:u,sessionKey:d}=await this._getQQApi()[a?"code2Session":"getOpenidByToken"]({code:e,accessToken:t});if(!c)return{code:10801,messageValues:{account:"qq openid"}};const p={accessToken:t,sessionKey:d},l=Kr.command,f=[{qq_openid:{[s]:c}}];u&&f.push({qq_unionid:u});let m=await P.where(l.or(...f)).get();if(m=this._getCurrentAppUser(m.data),m&&m.length>0){if("register"===o)return{code:10802,messageValues:{type:this.t("qq-account")}};if(1!==m.length)return{code:10005};const e=m[0],t={qq_openid:{[s]:c}};u&&(t.qq_unionid=u);const r=await this._loginExec(e,{needPermission:n,extraData:t});if(0!==r.code)return r;const{userInfo:i}=r;return{...r,openid:c,unionid:u,...p,mobileConfirmed:1===i.mobile_confirmed,emailConfirmed:1===i.email_confirmed}}{if("login"===o)return{code:10803,messageValues:{type:this.t("qq-account")}};const e={qq_openid:{[s]:c},qq_unionid:u};e.my_invite_code=r,e.role=i;const t=await this._registerExec(e);return 0!==t.code?t:{...t,openid:c,unionid:u,...p,mobileConfirmed:!1,emailConfirmed:!1}}},loginByUniverify:async function({openid:e,access_token:t,password:r,inviteCode:n,myInviteCode:i,type:o,needPermission:s,role:a}){const c=this._getConfig(),u=c&&c.service&&c.service.univerify;if(!u)throw new Error(this.t("uni-verify-config-required"));if(c.forceInviteCode&&!o)throw new Error(this.t("login-with-invite-type-required"));const d=await Gr.bind(this)({...u,openid:e,access_token:t});if(0!==d.code)return d;const p=String(d.phoneNumber);let l=await P.where({mobile:p,mobile_confirmed:1}).get();if(l=this._getCurrentAppUser(l.data),l&&l.length>0){if("register"===o)return{code:10601,messageValues:{type:this.t("mobile")}};if(1!==l.length)return{code:10005};const e=l[0],t=await this._loginExec(e,{needPermission:s});return 0!==t.code?t:{...t,mobile:p}}if("login"===o)return{code:10602,messageValues:{type:this.t("mobile")}};const f=Date.now(),m={mobile:p,my_invite_code:i,mobile_confirmed:1,role:a},h=r&&r.trim();if(h){const{passwordHash:e,version:t}=this.encryptPwd(h);m.password=e,t&&(m.password_secret_version=t)}if(n){let e=await P.where({my_invite_code:n}).get();if(1!==e.data.length)return{code:10203};e=e.data[0],m.inviter_uid=[e._id].concat(e.inviter_uid||[]),m.invite_time=f}else if(c.forceInviteCode)return{code:10203};m.my_invite_code=i;const g=await this._registerExec(m,{needPermission:s});return 0!==g.code?g:{...g,mobile:p}},loginByApple:async function({nickName:e,fullName:t,identityToken:r,myInviteCode:n,type:i,needPermission:o,role:s}){const a=this._getConfig(),c=a&&a.oauth&&a.oauth.apple,u=c&&c.bundleId;if(!u)throw new Error(this.t("config-param-require",{param:"(app || app-plus).apple.bundleId"}));if(!r)return{code:N,messageValues:{param:"identityToken"}};t=e||(t&&Object.keys(t).length>0?t.familyName+t.givenName:"");const{code:d,msg:p}=await Lr().verifyIdentityToken(r);if(0!==d)return{code:d,msg:p,messageValues:{account:this.t("apple-account")}};const{iss:l,sub:f,aud:m,email:h}=p;if("https://appleid.apple.com"!==l)return{code:10706,messageValues:{account:this.t("apple-account")}};if(!f)return{code:10701,messageValues:{account:this.t("apple-account")}};if(u!==m)return{code:10702,messageValues:{account:this.t("apple-account")}};const g=t||"User-"+(h?h.split("@")[0]:Math.random().toString(32).slice(2));let y=await P.where({apple_openid:f}).get();if(y=this._getCurrentAppUser(y.data),y&&y.length>0){if("register"===i)return{code:10703,messageValues:{type:this.t("apple-account")}};if(1!==y.length)return{code:10005};const e=y[0],t=await this._loginExec(e,{needPermission:o});return 0!==t.code?t:{...t,openid:f}}if("login"===i)return{code:10704,messageValues:{type:this.t("apple-account")}};const w={nickname:g,apple_openid:f,my_invite_code:n,role:s},v=await this._registerExec(w,{needPermission:o});return 0!==v.code?v:{...v,openid:f}},login:async function({username:e,password:t,queryField:r=[],needPermission:n}){const i=Qr.command,o=[];r&&r.length||(r=["username"]),r.length>1&&console.warn(this.t("query-field-warning"));const{usernameToLowerCase:s,emailToLowerCase:a,passwordErrorLimit:c,passwordErrorRetryTime:u}=this._getConfig(),d={email:{email_confirmed:1},mobile:{mobile_confirmed:1}},p={},l=e&&e.trim();if(!l)return{code:N,messageValues:{param:this.t("username")}};s&&(p.username=l.toLowerCase()),a&&(p.email=l.toLowerCase());const f=[];r.forEach(t=>{o.push({[t]:e,...d[t]});const r={field:t,value:e};"username"===t&&p.username!==e?(o.push({[t]:p.username,...d[t]}),r.fallbackValue=p.username):"email"===t&&p.email!==e&&(o.push({[t]:p.email,...d[t]}),r.fallbackValue=p.email),f.push(r)});let m=await P.where(i.or(...o)).get();m=this._getCurrentAppUser(m.data);const h=this.context.CLIENTIP,g=this._getMatchedUser(m,f);if(g.code)return g;const{userMatched:y}=g;let w=y.login_ip_limit||[];w=w.filter(e=>e.last_error_time>Date.now()-1e3*u);let v=w.find(e=>e.ip===h);if(v&&v.error_times>=c)return{code:10103};const _=t&&t.trim();if(!_)return{code:N,messageValues:{param:"密码"}};const b=this._checkPwd(y,_);if(0===b.code){const e=w.indexOf(v);e>-1&&w.splice(e,1);const t={login_ip_limit:w},{passwordHash:r,passwordVersion:i}=b;r&&i&&(t.password=r,t.password_secret_version=i);const o=await this._loginExec(y,{needPermission:n,extraData:t});return o.code,o}return v?(v.error_times++,v.last_error_time=Date.now()):(v={ip:h,error_times:1,last_error_time:Date.now()},w.push(v)),await P.doc(y._id).update({login_ip_limit:w}),{code:10102,msg:"密码错误"}},register:async function(e){const t=[],r=[{name:"username",desc:this.t("username")},{name:"email",desc:this.t("email"),extraCond:{email_confirmed:1}},{name:"mobile",desc:this.t("mobile"),extraCond:{mobile_confirmed:1}}],{usernameToLowerCase:n,emailToLowerCase:i}=this._getConfig();r.forEach(r=>{const o=r.name;let s=e[o]&&e[o].trim();s?(("username"===r.name&&n||"email"===r.name&&i)&&(s=s.toLowerCase()),e[o]=s,t.push({[o]:s,...r.extraCond})):delete e[o]});const{username:o,email:s,mobile:a,myInviteCode:c,needPermission:u,autoSetDcloudAppid:d=!0}=e;if("needPermission"in e&&delete e.needPermission,"autoSetDcloudAppid"in e&&delete e.autoSetDcloudAppid,0===t.length)return{code:20101,messageValues:{param:this.t("user-unique-param")}};const p=Xr.command;let l=await P.where(p.or(...t)).get();if(l=this._getCurrentAppUser(l.data),l&&l.length>0){const t=l[0];if(t.status===F)return{code:10006};for(let n=0;nt[e]===i.extraCond[e])),t[i.name]===e[i.name]&&o)return{code:20102,messageValues:{type:i.desc}}}}const f=e.password&&e.password.trim();if(!f)return{code:N,messageValues:{param:this.t("password")}};const{passwordHash:m,version:h}=this.encryptPwd(f);e.password=m,h&&(e.password_secret_version=h),e.my_invite_code=c,delete e.myInviteCode;const g=await this._registerExec(e,{needPermission:u,autoSetDcloudAppid:d});return 0!==g.code?g:{...g,username:o,email:s,mobile:a}},logout:async function(e){const t=await this.checkToken(e);if(t.code)return t;const r=Yr.command;return await P.doc(t.uid).update({token:r.pull(e)}),{code:0,msg:""}},getRoleByUid:async function({uid:e}){if(!e)return{code:N,messageValues:{param:this.t("user-id")}};const t=await P.doc(e).get();return 0===t.data.length?{code:L}:{code:0,msg:"",role:t.data[0].role||[]}},getPermissionByRole:async function({roleID:e}){if(!e)return{code:N,messageValues:{param:"roleID"}};if("admin"===e){return{code:0,msg:"",permission:(await D.limit(1e3).get()).data.map(e=>e.permission_id)}}const t=await j.where({role_id:e}).get();return 0===t.data.length?{code:V}:{code:0,msg:"",permission:t.data[0].permission||[]}},getPermissionByUid:async function({uid:e}={}){const t=await P.aggregate().match({_id:e}).project({role:!0}).unwind("$role").lookup({from:"uni-id-roles",localField:"role",foreignField:"role_id",as:"roleDetail"}).unwind("$roleDetail").replaceRoot({newRoot:"$roleDetail"}).end(),r=[],n=[];return t.data.forEach(e=>{n.push(e.role_id),r.push(...e.permission)}),{code:0,msg:"",role:n,permission:A(r)}},bindRole:async function({uid:e,roleList:t,reset:r=!1}){const n={};return"string"==typeof t&&(t=[t]),n.role=r?t:zr.push(t),await P.doc(e).update(n),{code:0,msg:""}},bindPermission:async function({roleID:e,permissionList:t,reset:r=!1}){const n={};return"string"==typeof t&&(t=[t]),n.permission=r?t:zr.push(t),await j.where({role_id:e}).update(n),{code:0,msg:""}},unbindRole:async function({uid:e,roleList:t}){return"string"==typeof t&&(t=[t]),await P.doc(e).update({role:zr.pull(zr.in(t))}),{code:0,msg:""}},unbindPermission:async function({roleID:e,permissionList:t}){return"string"==typeof t&&(t=[t]),await j.where({role_id:e}).update({permission:zr.pull(zr.in(t))}),{code:0,msg:""}},addRole:async function({roleID:e,roleName:t,comment:r,permission:n=[]}){return e?"admin"===e?{code:U,messageValues:{param:"roleID",reason:this.t("add-role-admin-is-not-allowed")}}:(await j.add({role_id:e,role_name:t,comment:r,permission:n,create_date:Date.now()}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("role-id")}}},addPermission:async function({permissionID:e,permissionName:t,comment:r}){return e?(await D.add({permission_id:e,permission_name:t,comment:r,create_date:Date.now()}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("permission-id")}}},getRoleList:async function({limit:e=20,offset:t=0,needTotal:r=!0}){const n={code:0,msg:"",roleList:(await j.skip(t).limit(e).get()).data};if(r){const{total:e}=await j.where({_id:zr.exists(!0)}).count();n.total=e}return n},getRoleInfo:async function(e){const t=await j.where({role_id:e}).get();return 0===t.data.length?{code:V}:{code:0,...t.data[0]}},updateRole:async function({roleID:e,roleName:t,comment:r,permission:n}){return e?(await j.where({role_id:e}).update({role_name:t,comment:r,permission:n}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("role-id")}}},deleteRole:async function({roleID:e}){const t=m(e);if("string"===t)e=[e];else if("array"!==t)throw new Error("typeof roleID must be array or string");return await j.where({role_id:zr.in(e)}).remove(),await P.where({role:zr.elemMatch(zr.in(e))}).update({role:zr.pullAll(e)}),{code:0,msg:""}},getPermissionList:async function({limit:e=20,offset:t=0,needTotal:r=!0}){const n={code:0,msg:"",permissionList:(await D.skip(t).limit(e).get()).data};if(r){const{total:e}=await D.where({_id:zr.exists(!0)}).count();n.total=e}return n},getPermissionInfo:async function(e){const t=await D.where({permission_id:e}).get();return 0===t.data.length?{code:N,messageValues:{param:this.t("permission-id")}}:{code:0,...t.data[0]}},updatePermission:async function({permissionID:e,permissionName:t,comment:r}){return e?(await D.where({permission_id:e}).update({permission_name:t,comment:r}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("permission-id")}}},deletePermission:async function({permissionID:e}){const t=m(e);if("string"===t)e=[e];else if("array"!==t)throw new Error("typeof permissionID must be array or string");return await D.where({permission_id:zr.in(e)}).remove(),await j.where({permission:zr.elemMatch(zr.in(e))}).update({permission:zr.pullAll(e)}),{code:0,msg:""}},bindAlipay:async function({uid:e,code:t,platform:r}){const n=r||this.context.PLATFORM,{openid:i}=await this._getAlipayApi({platform:n}).code2Session(t);if(!i)return{code:60401,messageValues:{account:this.t("alipay-account")}};let o=await P.where({ali_openid:i}).get();return o=this._getCurrentAppUser(o.data),o&&o.length>0?{code:60402,messageValues:{type:this.t("alipay-account")}}:(await P.doc(e).update({ali_openid:i}),{code:0,openid:i,msg:""})},bindEmail:async function(e){let{uid:t,email:r,code:n}=e||{};if(r=r&&r.trim(),!r)return{code:N,messageValues:{param:this.t("email")}};if(!n)return{code:N,messageValues:{param:this.t("verify-code")}};const{emailToLowerCase:i}=this._getConfig();i&&(r=r.toLowerCase());let o=await P.where({email:r,email_confirmed:1}).get();if(o=this._getCurrentAppUser(o.data),o&&o.length>0)return{code:60201,messageValues:{type:this.t("email")}};const s=await this.verifyCode({email:r,code:n,type:"bind"});return 0!==s.code?s:(await P.doc(t).update({email:r,email_confirmed:1}),{code:0,msg:"",email:r})},bindMobile:async function(e){let{uid:t,mobile:r,code:n,openid:i,access_token:o,type:s="sms"}=e||{};if("univerify"===s){const e=this._getConfig(),t=e&&e.service&&e.service.univerify;if(!t)throw new Error("请在config.json中配置service.univerify下一键登录相关参数");const n=await Gr.bind(this)({...t,openid:i,access_token:o});if(0!==n.code)return n;r=""+n.phoneNumber}let a=await P.where({mobile:r,mobile_confirmed:1}).get();if(a=this._getCurrentAppUser(a.data),a&&a.length>0)return{code:60101,messageValues:{type:"手机号"}};if("sms"===s&&"code"in e){if(!r)return{code:N,messageValues:{param:this.t("mobile")}};if(!n)return{code:N,messageValues:{param:this.t("verify-code")}};const e=await this.verifyCode({mobile:r,code:n,type:"bind"});if(0!==e.code)return e}return await P.doc(t).update({mobile:r,mobile_confirmed:1}),{code:0,msg:"",mobile:r}},bindWeixin:async function({uid:e,code:t,platform:r}){const n=r||this.context.PLATFORM,i="mp-weixin"===n,{openid:o,unionid:s,sessionKey:a,accessToken:c,refreshToken:u,expired:d}=await this._getWeixinApi({platform:n})[i?"code2Session":"getOauthAccessToken"](t);if(!o)return{code:60301,messageValues:{account:"微信openid"}};const p=Wr.command,l=[{wx_openid:{[n]:o}}];s&&l.push({wx_unionid:s});let f=await P.where(p.or(...l)).get();if(f=this._getCurrentAppUser(f.data),f&&f.length>0)return{code:60302,messageValues:{type:this.t("wechat-account")}};const m={wx_openid:{[n]:o}};let h;return s&&(m.wx_unionid=s),await P.doc(e).update(m),h=i?{sessionKey:a}:{accessToken:c,refreshToken:u,accessTokenExpired:d},{code:0,msg:"",openid:o,unionid:s,...h}},bindQQ:async function({uid:e,code:t,accessToken:r,platform:n}={}){const i=n||this.context.PLATFORM,o="mp-qq"===i,{openid:s,unionid:a,sessionKey:c}=await this._getQQApi()[o?"code2Session":"getOpenidByToken"]({code:t,accessToken:r});if(!s)return{code:60501,messageValues:{account:"qq openid"}};const u=Jr.command,d=[{qq_openid:{[i]:s}}];a&&d.push({qq_unionid:a});let p=await P.where(u.or(...d)).get();if(p=this._getCurrentAppUser(p.data),p&&p.length>0)return{code:60502,messageValues:{type:this.t("qq-account")}};const l={qq_openid:{[i]:s}};return a&&(l.qq_unionid=a),await P.doc(e).update(l),{code:0,msg:"",openid:s,unionid:a,...{accessToken:r,sessionKey:c}}},unbindAlipay:async function(e){const t=Zr.command,r=await P.doc(e).update({ali_openid:t.remove()});return E("upRes:",r),1===r.updated?{code:0,msg:""}:{code:70401}},unbindEmail:async function(e){let{uid:t,email:r,code:n}=e||{};if(r=r&&r.trim(),!t||!r)return{code:N,messageValues:{param:t?this.t("email"):this.t("user-id")}};const{emailToLowerCase:i}=this._getConfig();if("code"in e){const e=await this.verifyCode({email:r,code:n,type:"unbind"});if(0!==e.code)return e}const o=en.command;let s={_id:t,email:r};if(i){const e=r.toLowerCase();e!==r&&(s=o.or(s,{_id:t,email:e}))}return 1===(await P.where(s).update({email:o.remove(),email_confirmed:o.remove()})).updated?{code:0,msg:""}:{code:70201}},unbindMobile:async function(e){const{uid:t,mobile:r,code:n}=e||{};if("code"in e){const e=await this.verifyCode({mobile:r,code:n,type:"unbind"});if(0!==e.code)return e}const i=tn.command;return 1===(await P.where({_id:t,mobile:r}).update({mobile:i.remove(),mobile_confirmed:i.remove()})).updated?{code:0,msg:""}:{code:70101}},unbindWeixin:async function(e){const t=rn.command,r=await P.doc(e).update({wx_openid:t.remove(),wx_unionid:t.remove()});return E("upRes:",r),1===r.updated?{code:0,msg:""}:{code:70301}},unbindQQ:async function(e){const t=nn.command,r=await P.doc(e).update({qq_openid:t.remove(),qq_unionid:t.remove()});return E("upRes:",r),1===r.updated?{code:0,msg:""}:{code:70501}},getSupportedLoginType:function({appid:e,platform:t}={}){if(!e||!t)throw new Error("Parameter appid and platform is required");const r=this._getConfig({appid:e,platform:t}),n=["username-password","mobile-password","email-password"];for(const e in on)on[e](r)&&n.push(e);return{supportedLoginType:n}},code2SessionAlipay:async function(e){let t=e;"string"==typeof e&&(t={code:e});try{const e=t.platform||this.context.PLATFORM,r=await this._getAlipayApi({platform:e}).code2Session(t.code);return r.openid?{code:0,msg:"",...r}:{code:80701,messageValues:{account:this.t("alipay-account")}}}catch(e){return console.error(e),{code:80702,messageValues:{account:this.t("alipay-account")}}}},code2SessionWeixin:async function(e){let t=e;"string"==typeof e&&(t={code:e});try{const e=t.platform||this.context.PLATFORM,r=await this._getWeixinApi({platform:e})["mp-weixin"===e?"code2Session":"getOauthAccessToken"](t.code);return r.openid?{code:0,msg:"",...r}:{code:80601,messageValues:{account:"微信openid"}}}catch(e){return console.error(e),{code:80602,messageValues:{account:"微信openid"}}}},verifyAppleIdentityToken:async function({identityToken:e,platform:t}){const r=t||this.context.PLATFORM,{code:n,msg:i}=await Lr({clientType:r}).verifyIdentityToken(e);return 0!==n?{code:n,msg:i}:{code:n,msg:"验证通过",...i}},wxBizDataCrypt:async function({code:e,sessionKey:r,encryptedData:n,iv:i}){if(!n)return{code:N,messageValues:{param:"encryptedData"}};if(!i)return{code:N,messageValues:{param:"iv"}};if(!e&&!r)return{code:N,messageValues:{param:"sessionKey"}};const o=this._getWeixinApi();if(!r){const t=await o.code2Session(e);if(!t.sessionKey)return{code:80801};r=t.sessionKey}r=Buffer.from(r,"base64"),n=Buffer.from(n,"base64"),i=Buffer.from(i,"base64");try{var s=t.createDecipheriv("aes-128-cbc",r,i);s.setAutoPadding(!0);var a=s.update(n,"binary","utf8");a+=s.final("utf8"),a=JSON.parse(a)}catch(e){return console.error(e),{code:80802}}return a.watermark.appid!==o.options.appId?{code:80803}:{code:0,msg:"",...a}},getWeixinUserInfo:async function({accessToken:e,openid:t}={}){const r=this.context.PLATFORM;if("app"!==r&&"app-plus"!==r)throw new Error(this.t("limit-client-platform"));try{return{code:0,msg:"",...await this._getWeixinApi().getUserInfo({accessToken:e,openid:t})}}catch(e){return console.error(e),{code:80901}}},encryptPwd:function(e,{value:r,version:n}={}){if(!(e=e&&e.trim()))throw new Error(this.t("param-required",{param:this.t("password")}));if(!r){const e=this._getConfig(),{passwordSecret:t}=e;if("array"===m(t)){const e=t.sort((e,t)=>e.version-t.version);r=e[e.length-1].value,n=e[e.length-1].version}else r=t}if(!r)throw new Error(this.t("param-error",{param:"passwordSecret",reason:"invalid passwordSecret"}));const i=t.createHmac("sha1",r.toString("ascii"));return i.update(e),{passwordHash:i.digest("hex"),version:n}},checkToken:async function(e,{needPermission:t,needUserInfo:r=!0}={}){const n=this._getConfig(),i=this._verifyToken(e);if(i.code)return i;const{uid:o,needPermission:s,role:a,permission:c,exp:u,iat:d,...p}=i,l=a&&c;t=void 0===t?s:t;const f=n.removePermissionAndRoleFromToken||!l||r,m=!n.removePermissionAndRoleFromToken&&!l||n.removePermissionAndRoleFromToken&&l||n.tokenExpiresThreshold&&u-Date.now()/1e3this._createTokenInternal({signContent:e,config:o})):this._createTokenInternal({signContent:a,config:o})},_updateToken:async function({uid:e,tokenList:t,removeToken:r=[],addToken:n=[]}={}){if(!t){const r=await P.doc(e).get(),n=r.data&&r.data[0];t=n&&n.token||[]}"string"==typeof t&&(t=[t]);const i=this._getExpiredToken(t);(t=t.filter(e=>-1===i.indexOf(e))).push(...n);for(let e=0;ee.version-t.version);let c;if(c=n?a.find(e=>e.version===n):a[0],!c)return{code:3};const u=a[a.length-1],{passwordHash:d}=this.encryptPwd(t,c);if(d===r){const e={code:0};if(c!==u){const{passwordHash:r,version:n}=this.encryptPwd(t,u);e.passwordHash=r,e.passwordVersion=n}return e}return{code:4,message:""}},_verifyToken:function(e){const t=this._getConfig();let r;try{r=Pr(e,t.tokenSecret)}catch(e){return"TokenExpiredError"===e.name?{code:30203,err:e}:{code:30204,err:e}}return t.bindTokenToDevice&&r.clientId&&r.clientId!==this._getClientUaHash()?{code:30201}:{code:0,message:"",...r}},_getExpiredToken:function(e){const t=this._getConfig(),r=[];return e.forEach(e=>{try{Pr(e,t.tokenSecret)}catch(t){r.push(e)}}),r},_getPermissionListByRoleList:async function(e){if(!Array.isArray(e))return[];if(0===e.length)return[];if(e.includes("admin")){return(await D.limit(500).get()).data.map(e=>e.permission_id)}const t=await j.where({role_id:sn.in(e)}).get(),r=[];return t.data.forEach(e=>{Array.prototype.push.apply(r,e.permission)}),A(r)},_getClientUaHash:function(){const e=t.createHash("md5"),r=/MicroMessenger/i.test(this.context.CLIENTUA)?this.context.CLIENTUA.replace(/(MicroMessenger\S+).*/i,"$1"):this.context.CLIENTUA;return e.update(r),e.digest("hex")},_createTokenInternal:function({signContent:e,config:t}){if(t.tokenExpiresIn&&t.tokenExpiresThreshold&&t.tokenExpiresIn<=t.tokenExpiresThreshold)throw new Error(this.t("token-expires-config-warning"));return"object"===m(e)&&e.uid?(t.bindTokenToDevice&&(e.clientId=this._getClientUaHash()),{token:Rr(e,t.tokenSecret,{expiresIn:t.tokenExpiresIn}),tokenExpired:Date.now()+1e3*t.tokenExpiresIn}):{code:30101,messageValues:{param:this.t("user-id")}}},setVerifyCode:async function({mobile:e,email:t,code:r,expiresIn:n,type:i}){if(t=t&&t.trim(),e=e&&e.trim(),t){const{emailToLowerCase:e}=this._getConfig();e&&(t=t.toLowerCase())}if(!e&&!t)return{code:50101,messageValues:{param:"手机号或邮箱"}};if(e&&t)return{code:50102,messageValues:{param:"参数",reason:"手机号和邮箱不可同时存在"}};r||(r=C()),n||(n=180);const o=Date.now(),s={mobile:e,email:t,type:i,code:r,state:0,ip:this.context.CLIENTIP,created_at:o,expired_at:o+1e3*n};return await R.add(s),{code:0,mobile:e,email:t}},verifyCode:async function({mobile:e,email:t,code:r,type:n}){if(t=t&&t.trim(),e=e&&e.trim(),t){const{emailToLowerCase:e}=this._getConfig();e&&(t=t.toLowerCase())}if(!e&&!t)return{code:50201,messageValues:{param:"手机号或邮箱"}};if(e&&t)return{code:50203,messageValues:{param:"参数",reason:"手机号和邮箱不可同时存在"}};if(!r)return{code:50202,messageValues:{type:this.t(e?"sms":"email")}};const i=an.command,o=Date.now(),s={mobile:e,email:t,type:n,code:r,state:0,expired_at:i.gt(o)},a=await R.where(s).orderBy("created_at","desc").limit(1).get();if(a&&a.data&&a.data.length>0){const e=a.data[0];return await R.doc(e._id).update({state:1}),{code:0,msg:"验证通过"}}return{code:50202,messageValues:{type:this.t(e?"sms":"email")}}},sendSmsCode:async function({mobile:e,code:t,type:r,templateId:n}){if(!e)return{code:N,messageValues:{param:this.t("mobile")}};if(t||(t=C()),!r)return{code:N,messageValues:{param:this.t("verify-code-type")}};const i=this._getConfig();let o=i&&i.service&&i.service.sms;if(!o)throw new Error(this.t("config-param-required",{param:"service.sms"}));o=Object.assign({codeExpiresIn:300},o);const s=["smsKey","smsSecret"];for(let e=0,t=s.length;e=0?o:{code:0,msg:""}}catch(e){return console.error(e),{code:50301}}}});let un;try{un=require("uni-config-center")}catch(e){throw new Error("Plugin[uni-config-center] was not found")}class dn{constructor({context:e,clientInfo:t,config:r}={}){const n=un({pluginId:"uni-id"});this.pluginConfig=n,this.config=r||this._getConfigContent(),this._configCache={},Object.defineProperty(this,"context",{get(){let r;r=t?{OS:t.os,CLIENTIP:t.clientIP,CLIENTUA:t.userAgent,PLATFORM:t.platform,APPID:t.appId,LOCALE:t.locale,DEVICEID:t.deviceId}:Object.assign({},e||global.__ctx__||{});const n=["CLIENTIP","PLATFORM","APPID","LOCALE"];for(let e=0;ee.dcloudAppid===t)||e.find(e=>e.isDefaultConfig):e}_parseConfigContent(e){return Array.isArray(e)?e:e[0]?Object.values(e):e}_getConfigContent(){if(this.pluginConfig&&this.pluginConfig.hasFile("config.json")){let e;try{e=this.pluginConfig.config()}catch(e){throw new Error("Invalid uni-id config file\n"+e.message)}return this._parseConfigContent(e)}{let e;try{e=require("./config.json")}catch(e){if("MODULE_NOT_FOUND"===e.code||"ENOENT"===e.code)throw new Error("uni-id config file[uniCloud/cloudfunctions/common/uni-config-center/uni-id/config.json] not found");throw e}return this._parseConfigContent(e)}}init(){throw new Error("uniID.init has been deprecated, use uniID.createInstance instead")}setInterceptor(e,t){this.interceptorMap.set(e,t)}_getConfig({appid:e,platform:t}={}){const r=`${e=e||this.context.APPID}_${t=t||this.context.PLATFORM}`;if(this._configCache[r])return this._configCache[r];if(!(this.config&&0!==Object.keys(this.config).length))throw new Error(this.t("config-file-not-found"));const n=this._getAppConfig(this.config,e);"app"!==t&&"app-plus"!==t||(t=n.preferedAppPlatform||t),"web"!==t&&"h5"!==t||(t=n.preferedWebPlatform||t);const i=Object.assign(n,n[t])||{},o=Object.assign({bindTokenToDevice:!1,tokenExpiresIn:7200,tokenExpiresThreshold:1200,passwordErrorLimit:6,passwordErrorRetryTime:3600,usernameToLowerCase:!0,emailToLowerCase:!0},i);return["passwordSecret","tokenSecret","tokenExpiresIn","passwordErrorLimit","passwordErrorRetryTime"].forEach(e=>{if(!o||!o[e])throw new Error(this.t("config-param-required",{param:e}))}),this._configCache[r]=o,o}}for(const e in cn)dn.prototype[e]=cn[e];function pn(e){const t=new dn(e);return new Proxy(t,{get(e,t){if(t in e&&0!==t.indexOf("_")){if("function"==typeof e[t])return(r=e[t],function(){const e=r.apply(this,arguments);return f(e)?e.then(e=>(x.bind(this)(e),e)):(x.bind(this)(e),e)}).bind(e);if("context"!==t&&"config"!==t)return e[t]}var r}})}dn.prototype.createInstance=pn;var ln=pn();module.exports=ln; diff --git a/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json new file mode 100644 index 0000000..93b2b8f --- /dev/null +++ b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json @@ -0,0 +1,16 @@ +{ + "name": "uni-id", + "version": "3.3.28", + "description": "uni-id for uniCloud", + "main": "index.js", + "homepage": "https://uniapp.dcloud.io/uniCloud/uni-id", + "repository": { + "type": "git", + "url": "git+https://gitee.com/dcloud/uni-id.git" + }, + "author": "", + "license": "Apache-2.0", + "dependencies": { + "uni-config-center": "file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + } +} \ 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 平台下不显示文本的bug +## 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,如何创建vue3项目,详见 [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 在首页使用时,h5 平台报 'uni is not defined' 的 bug +## 1.1.6(2021-02-05) +- 调整为uni_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..6f45b0e --- /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..fa8f0f3 --- /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..3a14ca0 --- /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": "正在加载...", + "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..ee99b06 --- /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": "正在加載...", + "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..ededbc2 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + 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** +> 代码块: `uLoadMore` + + +用于列表中,做滚动加载使用,展示 loading 的各种状态。 + + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-load-more) +#### 如使用过程中有任何问题,或者您对uni-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中scss语法兼容问题 +## 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是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "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) +#### 如使用过程中有任何问题,或者您对uni-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-upgrade-center-app/changelog.md b/uni_modules/uni-upgrade-center-app/changelog.md new file mode 100644 index 0000000..6804a9a --- /dev/null +++ b/uni_modules/uni-upgrade-center-app/changelog.md @@ -0,0 +1,64 @@ +## 0.6.1(2022-08-17) +- 修复 后台添加应用市场,但都没有启用的情况下报错的Bug (需要 uni-admin 1.9.3+) +## 0.6.0(2022-07-19) +- 新增 支持多应用商店配置(需要 uni-admin 1.9.3+) +## 0.4.1(2022-05-27) +- 修复 上版引出的报错问题 +## 0.4.0(2022-05-27) +- 新增 Android 支持跳转手机自带商店,填写升级包地址时请填写跳转商店链接 +- 新增 改为云对象调用方式,使用更直观 +## 0.3.3(2022-04-14) +- 修复 调用 check-update,当 code 为 0 时没有回调 +## 0.3.2(2022-01-12) +- 优化显示逻辑 +## 0.3.1(2021-11-24) +- 修复 vue3 上图片不显示的Bug +## 0.3.0(2021-11-18) +- 移除 wgt 安装成功后提示,防止重启过快弹框不消失 +## 0.2.2(2021-08-25) +- 兼容vue3.0 +## 0.2.1(2021-07-26) +- 修复 使用腾讯云并手动填写地址时,导致下载链接失效的bug +## 0.2.0(2021-07-13) +- 更新文档 关于报错local_storage_key 为空,请不要将页面路径设置为pages.json中第一项 +## 0.1.9(2021-06-28) +- 更新文档 +- 修复 wgt安装失败时,按钮状态不对 +## 0.1.8(2021-06-16) +- 修复 跳转安装时,导致上次下载的apk还没安装就被删掉的bug +## 0.1.7(2021-06-03) +- 修改 移除static中的图片 +## 0.1.6(2021-06-03) +- 修改 下载更新按钮使用CSS渐变色 +## 0.1.5(2021-04-22) +- 更新check-update函数。现在返回一个Promise,有更新时成功回调,其他情况错误回调 +## 0.1.4(2021-04-13) +- 更新文档。明确云函数调用结果 +## 0.1.3(2021-04-13) +- 解耦云函数与弹框处理。utils中新增 call-check-version.js,可用于单独检测是否有更新 +## 0.1.2(2021-04-07) +- 更新版本对比函数 compare +## 0.1.1(2021-04-07) +- 修复 腾讯云空间下载链接不能下载问题 +## 0.1.0(2021-04-07) +- 新增使用uni.showModal提示升级示例 +- 修改iOS升级提示方式 +## 0.0.7(2021-04-02) +- 修复在iOS上打开弹框报错 +## 0.0.6(2021-04-01) +- 兼容旧版本安卓 +## 0.0.5(2021-04-01) +- 修复低版本安卓上进度条错位 +## 0.0.4(2021-04-01) +- 更新readme +- 修复check-update语法错误 +## 0.0.3(2021-04-01) +- 新增前台更新弹框,详见readme +- 更新前台检查更新方法 + +## 0.0.2(2021-03-29) +- 更新文档 +- 移除 dependencies + +## 0.0.1(2021-03-25) +- 升级中心前台检查更新 diff --git a/uni_modules/uni-upgrade-center-app/images/app_update_close.png b/uni_modules/uni-upgrade-center-app/images/app_update_close.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2ffe62cba2466f184ea9f8ee4f9395ed8cf37a GIT binary patch literal 7644 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 U2>e_sb7~9VO{|RT486$z2cgKqd;kCd literal 0 HcmV?d00001 diff --git a/uni_modules/uni-upgrade-center-app/images/bg_top.png b/uni_modules/uni-upgrade-center-app/images/bg_top.png new file mode 100644 index 0000000000000000000000000000000000000000..015f698cdd8c8caa63486a2bd87f5a96f17df630 GIT binary patch literal 30486 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 literal 0 HcmV?d00001 diff --git a/uni_modules/uni-upgrade-center-app/package.json b/uni_modules/uni-upgrade-center-app/package.json new file mode 100644 index 0000000..8ccd619 --- /dev/null +++ b/uni_modules/uni-upgrade-center-app/package.json @@ -0,0 +1,81 @@ +{ + "id": "uni-upgrade-center-app", + "displayName": "升级中心 uni-upgrade-center - App", + "version": "0.6.1", + "description": "uni升级中心 - 客户端检查更新", + "keywords": [ + "uniCloud", + "update", + "升级", + "wgt" +], + "repository": "https://gitee.com/dcloud/uni-upgrade-center/tree/master/uni_modules/uni-upgrade-center-app", + "engines": { + "HBuilderX": "^3.1.0" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "", + "type": "unicloud-template-page" + }, + "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" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue b/uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue new file mode 100644 index 0000000..cc33c1d --- /dev/null +++ b/uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue @@ -0,0 +1,539 @@ + + + + + diff --git a/uni_modules/uni-upgrade-center-app/readme.md b/uni_modules/uni-upgrade-center-app/readme.md new file mode 100644 index 0000000..1dad9cd --- /dev/null +++ b/uni_modules/uni-upgrade-center-app/readme.md @@ -0,0 +1,126 @@ +## 升级中心 - app插件与 `uni-admin` 版本关系 + +### `uni-admin >= 1.9.3`:云函数 `checkVersion` 废弃,使用 uni-admin 自带的 `uni-upgrade-center` 云函数。 + +# uni-upgrade-center - App + +### 概述 + +> 统一管理App及App在`Android`、`iOS`平台上`App安装包`和`wgt资源包`的发布升级 + +> uni升级中心分为业务插件和后台管理插件。本插件为业务插件,包括uni升级中心客户端检查更新的前后端逻辑。后台管理系统另见 [uni-upgrade-center - Admin](https://ext.dcloud.net.cn/plugin?id=4470) + +### uni升级中心 - 客户端检查更新插件 + - 一键式检查更新,同时支持整包升级与wgt资源包更新 + - 好看、实用、可自定义的客户端提示框 + +## 安装指引 + +1. 依赖数据库`opendb-app-versions`,如果没有此库,请在云服务空间中创建。 + +2. 使用`HBuilderX 3.1.0+`,因为要使用到`uni_modules` + +3. 在插件市场打开本插件页面,在右侧点击`使用 HBuilderX 导入插件`,选择要导入的项目点击确定 + +4. 绑定一个服务空间。自 `0.6.0` 起,依赖 `uni-admin 1.9.3+` 的 `uni-upgrade-center 云函数`,请和 uni-admin 项目关联同一个服务空间 + +5. 找到`/uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version`,右键上传部署。自 `0.6.0` 起,依赖 `uni-admin 1.9.3+` 的 `uni-upgrade-center 云函数`,插件不再单独提供云函数,这样可以省下一个云函数名额。 + +6. 在`pages.json`中添加页面路径。**注:请不要设置为pages.json中第一项** +```json +"pages": [ + // ……其他页面配置 + { + "path": "uni_modules/uni-upgrade-center-app/pages/upgrade-popup", + "style": { + "disableScroll": true, + "app-plus": { + "backgroundColorTop": "transparent", + "background": "transparent", + "titleNView": false, + "scrollIndicator": false, + "popGesture": "none", + "animationType": "fade-in", + "animationDuration": 200 + + } + } + } +] +``` + +7. 将`@/uni_modules/uni-upgrade-center-app/utils/check-update`import到需要用到的地方,调用一下即可 + 1. 默认使用当前绑定的服务空间,如果要请求其他服务空间,可以使用其他服务空间的 `callFunction`。[详情](https://uniapp.dcloud.io/uniCloud/cf-functions.html#call-by-function-cross-space) + +8. 升级弹框可自行编写,也可以使用`uni.showModal`,或使用现有的升级弹框样式,如果不满足UI需求请自行替换资源文件。在`utils/check-update.js`中都有实例。 + +9. wgt更新时,打包前请务必将manifest.json中的版本修改为更高版本。 + +### 更新下载安装`check-update.js` + +*该函数在utils目录下* + +1. 如果是静默更新,则不会打开更新弹框,会在后台下载后安装,下次启动应用生效 + +2. 如果是 iOS,则会直接打开AppStore的链接 + +3. 其他情况,会将`check-version`返回的结果保存在localStorage中,并跳转进入`upgrade-popup.vue`打开更新弹框 + +### 检查更新函数`check-version` + +*该函数在uniCloud/cloudfunctions目录下* + +1. 使用检查更新需要传递三个参数 `appid`、`appVersion`、`wgtVersion` + +2. `appid` 使用 plus.runtime.appid 获取,*注:真机运行时为固定值HBuilder,在调试的时候请使用本地调试云函数* + +3. `appVersion` 使用 plus.runtime.version 获取 + +4. `wgtVersion` 使用 plus.runtime.getProperty(plus.runtime.appid,(wgtInfo) => { wgtInfo.version }) 获取 + +5. `check-version`云函数内部会自动获取 App 平台 + + +**Tips** + +1. `check-version`云函数内部有版本对比函数(compare)。 + - 使用多段式版本格式(如:"3.0.0.0.0.1.0.1", "3.0.0.0.0.1")。如果不满足对比规则,请自行修改。 + - 如果修改,请将*pages/upgrade-popup.vue*中*compare*函数一并修改 + +## 项目代码说明 + +### 更新弹框 +- `upgrade-popup.vue` - 更新应用: + - 如果云函数`check-version`返回的参数表明需要更新,则将参数保存在localStorage中,带着键值跳转该页面 + - 进入时会先从localStorage中尝试取出之前存的安装包路径(此包不会是强制安装类型的包) + - 如果有已经保存的包,则和传进来的 `version` 进行比较,如果相等则安装。大于和小于都不进行安装,因为admin端可能会调整包的版本。不符合更新会将此包删除 + - 如果本地没有包或者包不符合安装条件,则进行下载安装包 + - 点击下载会有进度条、已下载大小和下载包的大小 + - 下载完成会提示安装: + - 如果是 wgt 包,安装时则会提示 正在安装…… 和 安装完成。安装完成会提示是否重启 + - 如果是 原生安装包,则直接跳出去覆盖安装 + - 下载过程中,如果退出会提示是否取消下载。如果是强制更新,则只会提示正在下载请稍后,此时不可退出 + - 如果是下载完成了没有安装就退出,则会将下载完成的包保存在本地。将包的本地路径和包version保存在localStorage中 + +### 工具类 utils +- `call-check-version` + - 请求云函数`check-version`拿取版本检测结果 +- `check-update` + - 调用`call-check-version`并根据结果判断是否显示更新弹框 + +### 云函数 +- `check-version` - 检查应用更新: + - 根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传 + - 先从数据库取出所有该平台(会从上下文读取平台信息)的所有线上发行更新 + - 再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新 + - 使用上一步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新。必须同时大于这两项,因为上一次可能是wgt热更新,否则返回暂无更新 + - 如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion + - 返回结果: + + |code|message| + |:-:|:-:| + |0|当前版本已经是最新的,不需要更新| + |101|wgt更新| + |102|整包更新| + |-101|暂无更新或检查appid是否填写正确| + |-102|请检查传参是否填写正确| \ No newline at end of file diff --git a/uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/temp.png b/uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/temp.png new file mode 100644 index 0000000000000000000000000000000000000000..8b2ffe62cba2466f184ea9f8ee4f9395ed8cf37a GIT binary patch literal 7644 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 U2>e_sb7~9VO{|RT486$z2cgKqd;kCd literal 0 HcmV?d00001 diff --git a/uni_modules/uni-upgrade-center-app/utils/call-check-version.js b/uni_modules/uni-upgrade-center-app/utils/call-check-version.js new file mode 100644 index 0000000..1a28bd8 --- /dev/null +++ b/uni_modules/uni-upgrade-center-app/utils/call-check-version.js @@ -0,0 +1,33 @@ +export default function() { + // #ifdef APP-PLUS + return new Promise((resolve, reject) => { + plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) { + const data = { + action: 'checkVersion', + appid: plus.runtime.appid, + appVersion: plus.runtime.version, + wgtVersion: widgetInfo.version + } + console.log("data: ",data); + uniCloud.callFunction({ + name: 'uni-upgrade-center', + data, + success: (e) => { + console.log("e: ", e); + resolve(e) + }, + fail: (error) => { + reject(error) + } + }) + }) + }) + // #endif + // #ifndef APP-PLUS + return new Promise((resolve, reject) => { + reject({ + message: '请在App中使用' + }) + }) + // #endif +} diff --git a/uni_modules/uni-upgrade-center-app/utils/check-update.js b/uni_modules/uni-upgrade-center-app/utils/check-update.js new file mode 100644 index 0000000..f45e5fb --- /dev/null +++ b/uni_modules/uni-upgrade-center-app/utils/check-update.js @@ -0,0 +1,158 @@ +import callCheckVersion from './call-check-version' + +// 推荐再App.vue中使用 +const PACKAGE_INFO_KEY = '__package_info__' + +export default function() { + // #ifdef APP-PLUS + return new Promise((resolve, reject) => { + callCheckVersion().then(async (e) => { + if (!e.result) return; + const { + code, + message, + is_silently, // 是否静默更新 + url, // 安装包下载地址 + platform, // 安装包平台 + type // 安装包类型 + } = e.result; + + // 此处逻辑仅为实例,可自行编写 + if (code > 0) { + // 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回 + const { + fileList + } = await uniCloud.getTempFileURL({ + fileList: [url] + }); + if (fileList[0].tempFileURL) + e.result.url = fileList[0].tempFileURL; + + resolve(e) + + // 静默更新,只有wgt有 + if (is_silently) { + uni.downloadFile({ + url: e.result.url, + success: res => { + if (res.statusCode == 200) { + // 下载好直接安装,下次启动生效 + plus.runtime.install(res.tempFilePath, { + force: false + }); + } + } + }); + return; + } + + /** + * 提示升级一 + * 使用 uni.showModal + */ + // return updateUseModal(e.result) + + /** + * 提示升级二 + * 官方适配的升级弹窗,可自行替换资源适配UI风格 + */ + uni.setStorageSync(PACKAGE_INFO_KEY, e.result) + uni.navigateTo({ + url: `/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=${PACKAGE_INFO_KEY}`, + fail: (err) => { + console.error('更新弹框跳转失败', err) + uni.removeStorageSync(PACKAGE_INFO_KEY) + } + }) + + return + } else if (code < 0) { + // TODO 云函数报错处理 + console.error(message) + return reject(e) + } + return resolve(e) + }).catch(err => { + // TODO 云函数报错处理 + console.error(err.message) + reject(err) + }) + }); + // #endif +} + +/** + * 使用 uni.showModal 升级 + */ +function updateUseModal(packageInfo) { + const { + title, // 标题 + contents, // 升级内容 + is_mandatory, // 是否强制更新 + url, // 安装包下载地址 + platform, // 安装包平台 + type // 安装包类型 + } = packageInfo; + + let isWGT = type === 'wgt' + let isiOS = !isWGT ? platform.includes('iOS') : false; + let confirmText = isiOS ? '立即跳转更新' : '立即下载更新' + + return uni.showModal({ + title, + content: contents, + showCancel: !is_mandatory, + confirmText, + success: res => { + if (res.cancel) return; + + // 安装包下载 + if (isiOS) { + plus.runtime.openURL(url); + return; + } + + uni.showToast({ + title: '后台下载中……', + duration: 1000 + }); + + // wgt 和 安卓下载更新 + downloadTask = uni.downloadFile({ + url, + success: res => { + if (res.statusCode !== 200) { + console.error('下载安装包失败', err); + return; + } + // 下载好直接安装,下次启动生效 + plus.runtime.install(res.tempFilePath, { + force: false + }, () => { + if (is_mandatory) { + //更新完重启app + plus.runtime.restart(); + return; + } + uni.showModal({ + title: '安装成功是否重启?', + success: res => { + if (res.confirm) { + //更新完重启app + plus.runtime.restart(); + } + } + }); + }, err => { + uni.showModal({ + title: '更新失败', + content: err + .message, + showCancel: false + }); + }); + } + }); + } + }); +} diff --git a/uni_modules/zxz-uni-data-select/changelog.md b/uni_modules/zxz-uni-data-select/changelog.md new file mode 100644 index 0000000..92b7a5b --- /dev/null +++ b/uni_modules/zxz-uni-data-select/changelog.md @@ -0,0 +1,37 @@ +## 1.0.13(2023-10-12) +优化mixinDatacomResData报错和defValue报错 +## 1.0.12(2023-09-27) +修复搜索输入内容的时候下拉框的箭头会跑到文本框前面去 +优化当有选中项时不显示清除按钮 +## 1.0.11(2023-09-05) +更换change事件执行顺序 +修复多选更改值时未即时更改下拉框选项 +修复单选搜索框选中了 +修复多选筛选输入时点击其他未清空筛选值 +## 1.0.10(2023-08-29) +修复单选搜索回显问题 +## 1.0.9(2023-08-28) +更新文档 +## 1.0.8(2023-08-28) +更新文档 +## 1.0.7(2023-08-16) +修复组件禁用bug +修复数据回显问题 +添加多选搜索功能 +## 1.0.6(2023-08-05) +修复清空值多选下拉列表还是被选中bug +## 1.0.5(2023-07-10) +修复多选初始化异步数据不显示问题 +## 1.0.4(2023-07-07) +修复微信小程序多选显示兼容问题 +## 1.0.3(2023-07-06) +修复bug +多选情况下 初始化之后重新选择第一个不显示 +## 1.0.2(2023-07-06) +更新VUE3兼容 +## 1.0.1(2023-06-30) +添加多选合并功能 +## 1.0.0(2023-06-16) +添加下拉框检索,多选功能,自定义数据 +## 1.0.4(2023-06-16) + 添加下拉框检索,多选功能,自定义数据 diff --git a/uni_modules/zxz-uni-data-select/components/zxz-uni-data-select/zxz-uni-data-select.vue b/uni_modules/zxz-uni-data-select/components/zxz-uni-data-select/zxz-uni-data-select.vue new file mode 100644 index 0000000..746f96c --- /dev/null +++ b/uni_modules/zxz-uni-data-select/components/zxz-uni-data-select/zxz-uni-data-select.vue @@ -0,0 +1,760 @@ + + + + + \ No newline at end of file diff --git a/uni_modules/zxz-uni-data-select/package.json b/uni_modules/zxz-uni-data-select/package.json new file mode 100644 index 0000000..820ab80 --- /dev/null +++ b/uni_modules/zxz-uni-data-select/package.json @@ -0,0 +1,85 @@ +{ + "id": "zxz-uni-data-select", + "displayName": "zxz-uni-data-select 下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义数据)", + "version": "1.0.13", + "description": "通过数据驱动的下拉框选择器(添加下拉框检索,多选功能,多选搜索功能,自定义数据)", + "keywords": [ + "uni-ui", + "select", + "uni-data-select", + "下拉框", + "下拉选" +], + "repository": "", + "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": "", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "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", + "京东": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/zxz-uni-data-select/readme.md b/uni_modules/zxz-uni-data-select/readme.md new file mode 100644 index 0000000..45483ef --- /dev/null +++ b/uni_modules/zxz-uni-data-select/readme.md @@ -0,0 +1,26 @@ +## DataSelect 下拉框选择器 +> **组件名:zxz-uni-data-select** +> 代码块: `zxz-uni-data-select` + +当选项过多时,使用下拉菜单展示并选择内容 +## API + +### zxz-uni-data-select Props + +| 属性名 | 类型 | 默认值 | 说明 | +| - | - | - | - | +| v-model | String、Array、Number |- | 选中项绑定值 | +| multiple | Boolean | false | 是否多选 | +| disabled | Boolean |false | 是否禁用 | +| dataKey | String |"key" | 作为 key 唯一标识的键名 | +| dataValue | String | "value" | 作为 value 唯一标识的键名 | +| collapseTags | Boolean | false | 多选时是否将选中值按文字的形式展示| +|collapseTagsNum|Number | 1 | 多选时选中值按文字的形式展示的数量| +| localdata | Array |- | 下拉列表本地数据 | +|label | String | - | 左侧标题 +|placeholder | String | "请选择" | 输入框的提示文字 +|emptyTips | String |"无选项" | 无选项提示 +|clear | Boolean | true| 是否清空 +|format | String | - | 格式化输出 用法 field="_id as value, version as text, uni_platform as label" format="{label} - {text}" + +#### 如使用过程中有任何问题,或者您对组件有一些好的建议,欢迎加微weiyila520 diff --git a/utils/CLodopfuncs.js b/utils/CLodopfuncs.js new file mode 100644 index 0000000..1cfb5be --- /dev/null +++ b/utils/CLodopfuncs.js @@ -0,0 +1,1894 @@ +/* eslint-disable */ + +// #ifdef APP-PLUS +window = { + location: { + href: 'http://127.0.0.1/print' + } +}; +// #endif +(function(win) { + let printListDev = []; + let printListOnline = []; + var CLODOP = { + strWebPageID:"JL68836", + strTaskID: "", + strHostURI: "http://192.168.81.198:8000", + wsHostURI: "ws://192.168.81.198:8000/c_webskt/", + VERSION:"6.2.2.0", + IVERSION:"6220", + CVERSION:"3.0.2.5", + HTTPS_STATUS:0, + VERSION_EXT:false, + iBaseTask: 0, + timeThreshold: 5, + Priority: 0, + blIslocal:false, + Iframes: [], + ItemDatas: {}, + PageData: {}, + defStyleJson: {}, + PageDataEx: {}, + ItemCNameStyles: {}, + blWorking: false, + blNormalItemAdded: false, + blTmpSelectedIndex: null, + Caption: null, + Color: null, + CompanyName: null, + strBroadcastMS: null, + Border: null, + Inbrowse: null, + webskt: null, + SocketEnable: false, + SocketOpened: false, + NoClearAfterPrint: false, + On_Return_Remain: false, + On_Broadcast_Remain: false, + On_Return: null, + Result: null, + iTrySendTimes: 0, + OBO_Mode: 1, + blOneByone: false, + DelimChar: "\f\f", + Printers: { + "default": "1", + "list":[] + }, + altMessageWebSocketInvalid: "WebSocket没准备好,点确定继续...", + altMessageNoReadWriteFile: "不能远程读写文件!", + altMessageNoReadFile: "不能远程读文件!", + altMessageNoWriteFile: "不能远程写文件!", + altMessageNoPrintDesign: "不能远程打印设计!", + altMessageNoPrintSetup: "不能远程打印维护!", + altMessageSomeWindowExist: "有窗口已打开,先关闭它(持续如此时请刷新页面)!", + altMessageBusy: "上一个请求正忙,请稍后再试!", + Browser: (function() { + // #ifdef APP-PLUS + navigator = { + userAgent: `Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36` + }; + // #endif + var ua = navigator.userAgent; + var isOpera = Object.prototype.toString.call(window.opera) == "[object Opera]"; + return { + IE: !!window.attachEvent && !isOpera, + Opera: isOpera, + WebKit: ua.indexOf("AppleWebKit/") > -1, + Gecko: ua.indexOf("Gecko") > -1 && ua.indexOf("KHTML") === -1, + MobileSafari: /Apple.*Mobile/.test(ua) + } + })(), + GetTaskID: function() { + if (!this.strTaskID || this.strTaskID == "") { + var dt = new Date(); + this.iBaseTask++; + this.strTaskID = "" + dt.getHours() + dt.getMinutes() + dt.getSeconds() + "_" + this.iBaseTask; + } + return this.strWebPageID + this.strTaskID; + }, + DoInit: function() { + if (process.env.NODE_ENV === 'development') { + //开发环境 + CLODOP.Printers.list = printListDev + } else { + //生产环境 + CLODOP.Printers.list = printListOnline + } + this.strTaskID = ""; + if (this.NoClearAfterPrint) return; + this.ItemDatas = { + "count": 0 + }; + this.PageData = {}; + this.ItemCNameStyles = {}; + this.defStyleJson = { + "beginpage": 0, + "beginpagea": 0 + }; + this.blNormalItemAdded = false; + // win.CLODOP.OpenWebSocket(); + }, + OpenWebSocket: function(rest) { + // #ifdef APP-PLUS + if (window.On_CLodop_Opened) { + if (CLODOP.Priority == window.CLODOP_OK_Priority) setTimeout("window.On_CLodop_Opened(CLODOP)", 1); + } + // #endif + if (!window.WebSocket && !window.MozWebSocket) { + if (window.On_CLodop_Opened) { + if (CLODOP.Priority == window.CLODOP_OK_Priority) setTimeout("window.On_CLodop_Opened(CLODOP)", 1); + } + } + console.log(this.webskt) + console.log(CLODOP.wsHostURI) + console.log(rest) + let ip = uni.getStorageSync('fl_ip') || '192.168.81.198'; + let wsHostURI = `ws://${ip}:8000/c_webskt/` + this.SocketEnable = true; + try { + if (!this.webskt || this.webskt.readyState == 3 || rest) { + console.log('链接') + if (!window.WebSocket && window.MozWebSocket) window.WebSocket = window.MozWebSocket; + this.webskt = uni.connectSocket({ + url: wsHostURI, + success: res => { + console.info(res); + console.log('链接成功') + }, + fail: res => { + console.info(res); + console.log('链接失败') + }, + complete: res => { + console.info(res); + console.log('链接完成') + } + }); + console.log(this.webskt) + this.webskt.onOpen(function(e) { + CLODOP.SocketOpened = true; + if (window.On_CLodop_Opened) { + if (CLODOP.Priority == window.CLODOP_OK_Priority) setTimeout(window.On_CLodop_Opened(CLODOP), 10000); + } + }); + this.webskt.onMessage(function(e) { + console.log(e); + CLODOP.resultHandle(e.data); + }); + this.webskt.onClose(function(e) { + if (!CLODOP.SocketOpened) { + CLODOP.SocketEnable = false; + return; + } + // setTimeout(CLODOP.OpenWebSocket(), 2000); + }); + this.webskt.onError(function(e) { + console.info(e); + }); + } + } catch (err) { + this.webskt = null; + if (err.message.indexOf("SecurityError") > -1) + this.SocketEnable = false; + else + setTimeout(()=>{ + CLODOP.OpenWebSocket() + }, 2000); + } + }, + resultHandle: function(data) { + CLODOP.blOneByone = false; + var strResult = data; + CLODOP.Result = strResult; + try { + var strFTaskID = null; + var iPos = strResult.indexOf("="); + if (iPos >= 0 && iPos < 30) { + strFTaskID = strResult.slice(0, iPos); + strResult = strResult.slice(iPos + 1); + } + if (strFTaskID.indexOf("ErrorMS") > -1) { + console.info(strResult); + return; + } + if (strFTaskID.indexOf("BroadcastMS") > -1) { + CLODOP.strBroadcastMS = strResult; + if (CLODOP.On_Broadcast) { + var selfFunc = CLODOP.On_Broadcast; + CLODOP.On_Broadcast(strResult); + if (!CLODOP.On_Broadcast_Remain && selfFunc === CLODOP.On_Broadcast) + CLODOP.On_Broadcast = null; + } + return; + } + if (CLODOP.On_Return) { + var selfFunc = CLODOP.On_Return; + if ((strResult.toLowerCase() == "true") || (strResult.toLowerCase() == "false")) + CLODOP.On_Return(strFTaskID, strResult.toLowerCase() == "true"); + else + CLODOP.On_Return(strFTaskID, strResult); + if (!CLODOP.On_Return_Remain && selfFunc === CLODOP.On_Return) CLODOP.On_Return = null; + } + } catch (err) { + console.log(err); + }; + }, + wsSend: function(strData) { + // console.info(strData); + console.log(this.webskt); + console.log(this.wsHostURI); + console.log(11); + if (this.webskt && this.webskt.readyState == 1) { + this.Result = null; + this.iTrySendTimes = 0; + this.webskt.send({ + data: strData, + success: res => { + console.info(res); + }, + fail: res => { + console.info(res); + } + }); + return true; + } else { + this.iTrySendTimes++; + console.log(this.iTrySendTimes); + if (this.iTrySendTimes <= 1) { + this.OpenWebSocket(); + setTimeout(()=>{ + CLODOP.wsSend(strData) + }, 1000); + } + } + }, + FORMAT: function(oType, oValue) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (oType !== undefined && oValue !== undefined) { + if (oType.replace(/^\s+|\s+$/g, "").toLowerCase().indexOf("time:") == 0) { + oType = oType.replace(/^\s+|\s+$/g, "").slice(5); + if (oValue.toLowerCase().indexOf("now") > -1) oValue = (new Date()).toString(); + if (oValue.toLowerCase().indexOf("date") > -1) oValue = (new Date()).toString(); + if (oValue.toLowerCase().indexOf("time") > -1) oValue = (new Date()).toString(); + var TypeYMD = "ymd"; + if (oValue.toLowerCase().indexOf("ymd") > -1) { + TypeYMD = "ymd"; + oValue = oValue.slice(3); + } + if (oValue.toLowerCase().indexOf("dmy") > -1) { + TypeYMD = "dmy"; + oValue = oValue.slice(3); + } + if (oValue.toLowerCase().indexOf("mdy") > -1) { + TypeYMD = "mdy"; + oValue = oValue.slice(3); + } + oValue = oValue.replace(/ [^ ]*\+[^ ]* /g, " "); + oValue = oValue.replace(/\(.*\)/g, " "); + oValue = oValue.replace(/星期日|星期一|星期二|星期三|星期四|星期五|星期六/g, " "); + oValue = oValue.replace(/[A-Za-z]+day|Mon|Tue|Wed|Thu|Fri|Sat|Sun/g, " "); + var aMonth = 0; + var exp = new RegExp("Oct[A-Za-z]*|十月|10月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 10; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Nov[A-Za-z]*|十一月|11月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 11; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Dec[A-Za-z]*|十二月|12月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 12; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Jan[A-Za-z]*|一月|01月|1月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 1; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Feb[A-Za-z]*|二月|02月|2月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 2; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Mar[A-Za-z]*|三月|03月|3月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 3; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Apr[A-Za-z]*|四月|04月|4月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 4; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("May[A-Za-z]*|五月|05月|5月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 5; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Jun[A-Za-z]*|六月|06月|6月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 6; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Jul[A-Za-z]*|七月|07月|7月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 7; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Aug[A-Za-z]*|八月|08月|8月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 8; + oValue = oValue.replace(exp, ""); + } + exp = new RegExp("Sep[A-Za-z]*|九月|09月|9月", "i"); + if (oValue.match(exp) !== null) { + aMonth = 9; + oValue = oValue.replace(exp, ""); + } + oValue = oValue.replace(/日|秒/g, " "); + oValue = oValue.replace(/时|分/g, ":"); + var subTime = oValue.match(/ \d+:\d+:\d+/); + if (subTime == null) subTime = ""; + oValue = oValue.replace(/ \d+:\d+:\d+/, "") + subTime; + var dValue = new Date(); + var iYear = 0; + var iMonth = 0; + var iDate = 0; + var iHour = 0; + var iMinutes = 0; + var iSecond = 0; + var tmpValue = oValue; + var sValue = ""; + var MC1 = 0; + MC2 = 0; + MC3 = 0; + sValue = tmpValue.match(/\d+/); + if (sValue !== null) { + MC1 = parseInt(sValue[0]); + tmpValue = tmpValue.replace(/\d+/, ""); + } + sValue = tmpValue.match(/\d+/); + if (sValue !== null) { + MC2 = parseInt(sValue[0]); + tmpValue = tmpValue.replace(/\d+/, ""); + } + if (aMonth <= 0) { + sValue = tmpValue.match(/\d+/); + if (sValue !== null) { + MC3 = parseInt(sValue[0]); + tmpValue = tmpValue.replace(/\d+/, ""); + } + } + if (aMonth > 0) { + iMonth = aMonth; + if (MC2 <= 31) { + iYear = MC1; + iDate = MC2; + } else { + iYear = MC2; + iDate = MC1; + } + } else + if (TypeYMD == "dmy") { + iDate = MC1; + iMonth = MC2; + iYear = MC3; + } else + if (TypeYMD == "mdy") { + iMonth = MC1; + iDate = MC2; + iYear = MC3; + } else { + iYear = MC1; + iMonth = MC2; + iDate = MC3; + if (MC3 > 31) { + iYear = MC3; + iMonth = MC1; + iDate = MC2; + if (MC1 > 12) { + iDate = MC1; + iMonth = MC2 + }; + } else { + if (MC2 > 12) { + iYear = MC2; + iMonth = MC1; + } + } + } + var sValue = tmpValue.match(/\d+/); + if (sValue !== null) { + iHour = parseInt(sValue[0]); + tmpValue = tmpValue.replace(/\d+/, ""); + } + var sValue = tmpValue.match(/\d+/); + if (sValue !== null) { + iMinutes = parseInt(sValue[0]); + tmpValue = tmpValue.replace(/\d+/, ""); + } + var sValue = tmpValue.match(/\d+/); + if (sValue !== null) { + iSecond = parseInt(sValue[0]); + tmpValue = tmpValue.replace(/\d+/, ""); + } + if (oType.toLowerCase() == "isvalidformat") + oValue = (iYear > 0 && iMonth > 0 && iMonth <= 12 && iDate > 0 && iDate <= 31); + else { + if (("" + iYear).length < 4) iYear = iYear + 2000; + dValue.setFullYear(iYear, iMonth - 1, iDate); + dValue.setHours(iHour); + dValue.setMinutes(iMinutes); + dValue.setSeconds(iSecond); + var iDay = dValue.getDay(); + if (oType.toLowerCase() == "weekindex") + oValue = iDay; + else + if (oType.toLowerCase() == "floatvalue") + oValue = dValue.getTime(); + else { + var sWeek = ""; + switch (iDay) { + case 0: + sWeek = "日"; + break; + case 1: + sWeek = "一"; + break; + case 2: + sWeek = "二"; + break; + case 3: + sWeek = "三"; + break; + case 4: + sWeek = "四"; + break; + case 5: + sWeek = "五"; + break; + case 6: + sWeek = "六"; + break; + } + oValue = oType.replace(/dddd/ig, "星期" + sWeek); + if (/(y+)/i.test(oValue)) oValue = oValue.replace(RegExp.$1, (iYear + "").substr(4 - RegExp.$1.length)); + if (/(m+:)/i.test(oValue)) oValue = oValue.replace(RegExp.$1, ("00" + iMinutes + ":").substr(("00" + iMinutes + + ":").length - RegExp.$1.length)); + if (/(M+)/i.test(oValue)) { + var dsWidth = ("" + iMonth).length > RegExp.$1.length ? ("" + iMonth).length : RegExp.$1.length; + oValue = oValue.replace(RegExp.$1, ("00" + iMonth).substr(("00" + iMonth).length - dsWidth)); + } + if (/(d+)/i.test(oValue)) { + var dsWidth = ("" + iDate).length > RegExp.$1.length ? ("" + iDate).length : RegExp.$1.length; + oValue = oValue.replace(RegExp.$1, ("00" + iDate).substr(("00" + iDate).length - dsWidth)); + } + if (/(H+)/i.test(oValue)) oValue = oValue.replace(RegExp.$1, ("00" + iHour).substr(("00" + iHour).length - + RegExp.$1.length)); + if (/(n+)/i.test(oValue)) oValue = oValue.replace(RegExp.$1, ("00" + iMinutes).substr(("00" + iMinutes).length - + RegExp.$1.length)); + if (/(s+)/i.test(oValue)) oValue = oValue.replace(RegExp.$1, ("00" + iSecond).substr(("00" + iSecond).length - + RegExp.$1.length)); + } + } + if (CLODOP.On_Return) { + var selfFunc = CLODOP.On_Return; + CLODOP.On_Return(0, oValue); + if (!CLODOP.On_Return_Remain && selfFunc === CLODOP.On_Return) CLODOP.On_Return = null; + } + return oValue; + } else + if (this.blIslocal || oType.indexOf("FILE:") < 0) { + this.PageData["format_type"] = oType; + this.PageData["format_value"] = oValue; + if (this.DoPostDatas("format") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } else console.info(this.altMessageNoReadWriteFile) + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + SET_PRINT_PAPER: function(Top, Left, Width, Height, strPrintTask) { + return this.PRINT_INITA(Top, Left, Width, Height, strPrintTask); + }, + PRINT_INIT: function(strPrintTask,host) { + this.wsHostURI = `ws://${host}:8000/c_webskt/`; + return this.PRINT_INITA(null, null, null, null, strPrintTask); + }, + PRINT_INITA: function(Top, Left, Width, Height, strPrintTask) { + if (Top === undefined || Top === null) Top = ""; + if (Left === undefined || Left === null) Left = ""; + if (Width === undefined || Width === null) Width = ""; + if (Height === undefined || Height === null) Height = ""; + if (strPrintTask === undefined || strPrintTask === null) strPrintTask = ""; + this.NoClearAfterPrint = false; + this.DoInit(); + this.PageData["top"] = Top; + this.PageData["left"] = Left; + this.PageData["width"] = Width; + this.PageData["height"] = Height; + this.PageData["printtask"] = strPrintTask; + return true; + }, + SET_PRINT_MODE: function(strModeType, ModeValue) { + if (strModeType === undefined || strModeType === null) strModeType = ""; + if (ModeValue === undefined || ModeValue === null) ModeValue = ""; + if (strModeType === "") return false; + strModeType = strModeType.toLowerCase(); + this.PageData[strModeType] = ModeValue; + if (strModeType == "noclear_after_print") this.NoClearAfterPrint = ModeValue; + if (strModeType.indexOf("window_def") > -1 || strModeType.indexOf("control_printer") > -1) { + var tResult = null; + if (this.DoPostDatas("onlysetprint") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + this.DoInit(); + this.blWorking = false; + return tResult; + } + }, + ADD_PRINT_TEXT: function(top, left, width, height, strText) { + return this.AddItemArray(2, top, left, width, height, strText); + }, + ADD_PRINT_TEXTA: function(itemName, top, left, width, height, strText) { + return this.AddItemArray(2, top, left, width, height, strText, itemName); + }, + ADD_PRINT_HTM: function(top, left, width, height, strHTML) { + return this.AddItemArray(4, top, left, width, height, strHTML); + }, + ADD_PRINT_HTML: function(top, left, width, height, strHTML) { + return this.AddItemArray(1, top, left, width, height, strHTML); + }, + ADD_PRINT_HTMLA: function(itemName, top, left, width, height, strHTML) { + return this.AddItemArray(1, top, left, width, height, strHTML, itemName); + }, + ADD_PRINT_BARCODE: function(top, left, width, height, BarType, BarValue) { + return this.AddItemArray(9, top, left, width, height, BarValue, null, null, null, null, null, null, BarType); + }, + ADD_PRINT_BARCODEA: function(ItemName, top, left, width, height, BarType, BarValue) { + return this.AddItemArray(9, top, left, width, height, BarValue, ItemName, null, null, null, null, null, BarType); + }, + ADD_PRINT_RECTA: function(top, left, width, height, intPenStyle, intPenWidth, intColor) { + return this.AddItemArray(3, top, left, width, height, null, null, 2, intPenStyle, intPenWidth, intColor, null); + }, + ADD_PRINT_RECT: function(top, left, width, height, intPenStyle, intPenWidth) { + return this.AddItemArray(3, top, left, width, height, null, null, 2, intPenStyle, intPenWidth, null, null); + }, + ADD_PRINT_ELLIPSEA: function(top, left, width, height, intPenStyle, intPenWidth, intColor) { + return this.AddItemArray(3, top, left, width, height, null, null, 3, intPenStyle, intPenWidth, intColor, null); + }, + ADD_PRINT_ELLIPSE: function(top, left, width, height, intPenStyle, intPenWidth) { + return this.AddItemArray(3, top, left, width, height, null, null, 3, intPenStyle, intPenWidth, null, null); + }, + ADD_PRINT_SHAPE: function(ShapeType, top, left, width, height, intPenStyle, intPenWidth, intColor) { + return this.AddItemArray(3, top, left, width, height, null, null, ShapeType, intPenStyle, intPenWidth, intColor, + null); + }, + ADD_PRINT_LINE: function(top1, left1, top2, left2, intPenStyle, intPenWidth) { + return this.AddItemArray(3, top1, left1, top2, left2, null, null, 0, intPenStyle, intPenWidth, null, "1"); + }, + ADD_PRINT_DNLINE: function(Top, Left, Width, Height, intPenStyle, intPenWidth) { + return this.AddItemArray(3, Top, Left, Width, Height, null, null, 1, intPenStyle, intPenWidth, null, null); + }, + ADD_PRINT_DNLINEA: function(Top, Left, Width, Height, intPenStyle, intPenWidth, intColor) { + return this.AddItemArray(3, Top, Left, Width, Height, null, null, 1, intPenStyle, intPenWidth, intColor, null); + }, + ADD_PRINT_UPLINE: function(Top, Left, Width, Height, intPenStyle, intPenWidth) { + return this.AddItemArray(3, Top, Left, Width, Height, null, null, 0, intPenStyle, intPenWidth, null, null); + }, + ADD_PRINT_UPLINEA: function(Top, Left, Width, Height, intPenStyle, intPenWidth, intColor) { + return this.AddItemArray(3, Top, Left, Width, Height, null, null, 0, intPenStyle, intPenWidth, intColor, null); + }, + ADD_PRINT_TABLE: function(top, left, width, height, strHTML) { + return this.AddItemArray(6, top, left, width, height, strHTML); + }, + ADD_PRINT_TBURL: function(top, left, width, height, strURL) { + return this.AddItemArray(7, top, left, width, height, strURL); + }, + ADD_PRINT_URL: function(top, left, width, height, strURL) { + return this.AddItemArray(5, top, left, width, height, strURL); + }, + ADD_PRINT_IMAGE: function(top, left, width, height, strHTML) { + return this.AddItemArray(8, top, left, width, height, strHTML); + }, + ADD_PRINT_CHART: function(top, left, width, height, strChartTypess, strHTML) { + return this.AddItemArray(10, top, left, width, height, strHTML, null, null, null, null, null, null, null, + strChartTypess); + }, + + SET_PRINT_PROPERTY: function(ItemNO, intPageType, intHorzOrient, intVertOrient) { + this.SET_PRINT_STYLEA(ItemNO, "ItemType", intPageType); + this.SET_PRINT_STYLEA(ItemNO, "HOrient", intHorzOrient); + this.SET_PRINT_STYLEA(ItemNO, "VOrient", intVertOrient); + }, + SET_PRINT_PROPERTYA: function(ItemName, intPageType, intHorzOrient, intVertOrient) { + this.SET_PRINT_PROPERTY(ItemName, intPageType, intHorzOrient, intVertOrient); + }, + SET_PRINT_STYLE: function(strStyleName, StyleValue) { + if (strStyleName === undefined || strStyleName === null) strStyleName = ""; + if (StyleValue === undefined || StyleValue === null) StyleValue = ""; + if (strStyleName === "") return false; + strStyleName = strStyleName.toLowerCase(); + this.defStyleJson[strStyleName] = StyleValue; + }, + SET_PRINT_STYLEA: function(ItemNo, strKey, Value) { + if (ItemNo === undefined || ItemNo === null) ItemNo = ""; + if (strKey === undefined || strKey === null) strKey = ""; + if (Value === undefined || Value === null) Value = ""; + if (ItemNo === "" || strKey === "") return false; + if (this.ItemDatas["count"] <= 0) { + if (this.PageData["add_print_program_data"] !== undefined) { + this.ItemCNameStyles[strKey.toLowerCase() + "-" + ItemNo] = Value; + return true; + } else { + return false; + } + } + strKey = strKey.toLowerCase(); + if (strKey == "type") return false; + var blResult = false; + if (ItemNo == 0) { + ItemNo = this.ItemDatas["count"]; + } + for (var vItemNO in this.ItemDatas) { + var ItemName = this.ItemDatas[vItemNO]["itemname"]; + if ((ItemNo == vItemNO) || (ItemNo == ItemName) || ((typeof ItemNo === "string") && (typeof ItemName === + "string") && (ItemNo.toUpperCase() == ItemName.toUpperCase()))) { + this.ItemDatas[vItemNO][strKey] = Value; + blResult = true; + } + } + if (blResult) return true; + return false; + }, + SET_PRINT_TEXT_STYLE: function(ItemNO, strFontName, intSize, intBold, intItalic, intUnderline, intAlignment) { + this.SET_PRINT_STYLEA(ItemNO, "fontname", strFontName); + this.SET_PRINT_STYLEA(ItemNO, "fontsize", intSize); + this.SET_PRINT_STYLEA(ItemNO, "bold", intBold); + this.SET_PRINT_STYLEA(ItemNO, "italic", intItalic); + this.SET_PRINT_STYLEA(ItemNO, "underline", intUnderline); + this.SET_PRINT_STYLEA(ItemNO, "alignment", intAlignment); + }, + SET_PRINT_TEXT_STYLEA: function(ItemNO, strFontName, intSize, intBold, intItalic, intUnderline, intAlignment, Color) { + this.SET_PRINT_TEXT_STYLE(ItemNO, strFontName, intSize, intBold, intItalic, intUnderline, intAlignment); + this.SET_PRINT_STYLEA(ItemNO, "fontcolor", Color); + }, + SET_PRINT_TEXT_STYLEB: function(ItemNO, strFontName, intSize, intBold, intItalic, intUnderline, intAlignment, Color) { + this.SET_PRINT_TEXT_STYLEA(ItemNO, strFontName, intSize, intBold, intItalic, intUnderline, intAlignment, Color); + }, + NEWPAGE: function() { + this.NewPage(); + }, + NewPage: function() { + var blSomeNormal = false; + var noItemType; + for (var vItemNO in this.ItemDatas) { + if (vItemNO == "count") noItemType = false; + else noItemType = true; + for (var vItemxx in this.ItemDatas[vItemNO]) { + if (vItemxx == "itemtype") { + noItemType = false; + if ((this.ItemDatas[vItemNO][vItemxx] == 0) || (this.ItemDatas[vItemNO][vItemxx] == 4)) { + blSomeNormal = true; + break; + } + } + } + if (noItemType) blSomeNormal = true; + if (blSomeNormal) break; + } + if (blSomeNormal) this.defStyleJson["beginpage"] = this.defStyleJson["beginpage"] + 1; + }, + NEWPAGEA: function() { + this.NewPageA(); + }, + NewPageA: function() { + var blSomeNormal = false; + var noItemType; + for (var vItemNO in this.ItemDatas) { + if (vItemNO == "count") noItemType = false; + else noItemType = true; + for (var vItemxx in this.ItemDatas[vItemNO]) { + if (vItemxx == "itemtype") { + noItemType = false; + if ((this.ItemDatas[vItemNO][vItemxx] == 0) || (this.ItemDatas[vItemNO][vItemxx] == 4)) { + blSomeNormal = true; + break; + } + } + } + if (noItemType) blSomeNormal = true; + if (blSomeNormal) break; + } + if (blSomeNormal) this.defStyleJson["beginpagea"] = this.defStyleJson["beginpagea"] + 1; + }, + PREVIEW: function(sView, iW, iH) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if ((!sView) && (this.blIslocal)) { + if (this.DoPostDatas("preview") == true) { + this.Result = null; + this.GetLastResult(true); + tResult = this.GetTaskID(); + } + } else { + if (this.DoPostDatas("cpreview") == true) { + this.DoCPreview(sView, iW, iH); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + PRINT: function(sView, iW, iH) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.DoPostDatas("print") == true) + tResult = this.GetTaskID(); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_PRINTER_COUNT: function() { + if (this.Printers === undefined) return 0; + else { + return this.Printers["list"].length; + } + }, + GET_PRINTER_NAME: function(intNO) { + if (this.Printers === undefined) return ""; + else { + if (typeof intNO == "string" && intNO.indexOf(":") > -1) { + var strPPname = intNO.slice(intNO.indexOf(":") + 1); + intNO = intNO.slice(0, intNO.indexOf(":")); + if (intNO == -1) + return this.Printers["list"][this.Printers["default"]][strPPname]; + else + return this.Printers["list"][intNO][strPPname]; + } else { + if (intNO == -1) + return this.Printers["list"][this.Printers["default"]].name; + else + if (intNO >= 0 && intNO < this.Printers["list"].length) + return this.Printers["list"][intNO].name; + else return "Printer NO. overflow"; + } + } + }, + GET_PAGESIZES_LIST: function(PNameIndx, Split, ListName, NameOrID) { + if (!ListName) ListName = "pagelist"; + if (!NameOrID) NameOrID = "name"; + if (this.Printers === undefined) return ""; + else { + if (PNameIndx == -1) PNameIndx = this.Printers["list"][this.Printers["default"]].name; + for (var intNO in this.Printers["list"]) { + if (PNameIndx == intNO || PNameIndx == this.Printers["list"][intNO].name) { + var strList = ""; + for (var iPNO in this.Printers["list"][intNO][ListName]) { + if ((NameOrID == "id") && this.Printers["list"][intNO][ListName][iPNO].id) { + if (strList === "") strList = this.Printers["list"][intNO][ListName][iPNO].id; + else + strList = strList + Split + this.Printers["list"][intNO][ListName][iPNO].id; + } else { + if (strList === "") strList = this.Printers["list"][intNO][ListName][iPNO].name; + else + strList = strList + Split + this.Printers["list"][intNO][ListName][iPNO].name; + } + } + return strList; + } + } + return ""; + } + }, + SET_PRINTER_INDEX: function(strName, strKeyModeName) { + if (isNaN(strName)) { + this.PageData.printerindex = 1 + } else{ + this.PageData.printerindex = strName + } + return true; + if (this.Printers === undefined) return false; + else { + if (!strKeyModeName) strKeyModeName = "printerindex"; + strName = strName + ""; + strName = strName.replace(/^\s+|\s+$/g, ""); + var iPos = strName.indexOf(","); + var strNameOrNO = strName; + if (iPos > -1) strNameOrNO = strName.slice(0, iPos); + if (strNameOrNO == "-1") { + this.PageData[strKeyModeName] = this.Printers["default"]; + if (iPos > -1) this.PageData["printersubid"] = strName.slice(iPos + 1); + return true; + } else { + for (var vNO in this.Printers["list"]) { + var strPrinterName = this.Printers["list"][vNO].name; + if (!strPrinterName) continue; + if ((strPrinterName.replace(/\\/g, "") == strNameOrNO.replace(/\\/g, "")) || (vNO == strNameOrNO)) { + this.PageData[strKeyModeName] = vNO; + if (iPos > -1) this.PageData["printersubid"] = strName.slice(iPos + 1); + return true; + } + } + return false; + } + } + }, + SET_PRINTER_INDEXA: function(strName) { + return this.SET_PRINTER_INDEX(strName, "printerindexa"); + }, + PRINT_DESIGN: function() { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (this.DoPostDatas("print_design") == true) { + this.Result = null; + this.GetLastResult(true); + tResult = this.GetTaskID(); + } + } else console.info(this.altMessageNoPrintDesign); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + PRINT_SETUP: function() { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (this.DoPostDatas("print_setup") == true) { + this.Result = null; + this.GetLastResult(true); + tResult = this.GetTaskID(); + } + } else console.info(this.altMessageNoPrintSetup); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + SET_PRINT_PAGESIZE: function(intOrient, PageWidth, PageHeight, strPageName) { + if (intOrient !== undefined && intOrient !== null) this.PageData["orient"] = intOrient; + if (PageWidth !== undefined && PageWidth !== null) this.PageData["pagewidth"] = PageWidth; + if (PageHeight !== undefined && PageHeight !== null) this.PageData["pageheight"] = PageHeight; + if (strPageName !== undefined && strPageName !== null) this.PageData["pagename"] = strPageName; + }, + SET_PRINT_COPIES: function(intCopies) { + if (intCopies !== undefined && intCopies !== null) { + this.PageData["printcopies"] = intCopies; + return true; + } + }, + SELECT_PRINTER: function(blPrint) { + this.SelectBox.create(388, 240, !blPrint); + return true; + }, + PRINTA: function(blPrintB, sView) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (!sView && this.blIslocal) { + this.Result = null; + if (blPrintB) { + if (this.DoPostDatas("printb") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } else { + if (this.DoPostDatas("printa") == true) { + this.GetLastResult(true); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + } else { + this.SELECT_PRINTER(true); + } + return tResult; + }, + PRINTAOK: function(iPrintIndex, iPrintCopies, iStartNO, iEndNO, onlySelect) { + this.SET_PRINTER_INDEX(iPrintIndex); + this.SET_PRINT_COPIES(iPrintCopies); + if (iStartNO !== undefined && iStartNO !== 0) this.SET_PRINT_MODE("PRINT_START_PAGE", iStartNO); + if (iEndNO !== undefined && iEndNO !== 0) this.SET_PRINT_MODE("PRINT_END_PAGE", iEndNO); + if (!onlySelect) this.PRINT(); + else { + this.blTmpSelectedIndex = iPrintIndex; + if (CLODOP.On_Return) { + var selfFunc = CLODOP.On_Return; + CLODOP.On_Return(0, iPrintIndex); + if (!CLODOP.On_Return_Remain && selfFunc === CLODOP.On_Return) CLODOP.On_Return = null; + } + } + }, + SET_LICENSES: function(strCompanyName, strLicense, strLicenseA, strLicenseB) { + if ((strCompanyName == 'THIRD LICENSE') && (strLicense == "")) { + if (strLicenseA && strLicenseA !== "") this.PageDataEx["licensec"] = strLicenseA; + if (strLicenseB && strLicenseB !== "") this.PageDataEx["licensed"] = strLicenseB; + } else if ((strCompanyName == 'LICENSE TETCODE') && (strLicense == "") && (strLicenseB == "")) { + if (strLicenseA && strLicenseA !== "") this.PageDataEx["Licensetetcode"] = strLicenseA; + } else { + if (strCompanyName && strCompanyName !== "") this.PageDataEx["companyname"] = strCompanyName; + if (strLicense && strLicense !== "") this.PageDataEx["license"] = strLicense; + if (strLicenseA && strLicenseA !== "") this.PageDataEx["licensea"] = strLicenseA; + if (strLicenseB && strLicenseB !== "") this.PageDataEx["licenseb"] = strLicenseB; + } + }, + PRINTB: function() { + return this.PRINTA(true); + }, + PREVIEWA: function() { + return this.PREVIEW(); + }, + PREVIEWB: function() { + return this.PREVIEW(); + }, + ADD_PRINT_SETUP_BKIMG: function(strContent) { + if (strContent !== undefined && strContent !== null) { + this.PageData["setup_bkimg"] = strContent; + return true; + } + }, + SET_PREVIEW_WINDOW: function(intDispMode, intToolMode, blDirectPrint, oWidth, oHeight, strPButtonCaptoin) { + if (intDispMode !== undefined && intDispMode !== null) this.PageData["pvw_dispmode"] = intDispMode; + if (intToolMode !== undefined && intToolMode !== null) this.PageData["pvw_toolmode"] = intToolMode; + if (blDirectPrint !== undefined && blDirectPrint !== null) this.PageData["pvw_directprint"] = blDirectPrint; + if (oWidth !== undefined && oWidth !== null) this.PageData["pvw_width"] = oWidth; + if (oHeight !== undefined && oHeight !== null) this.PageData["pvw_height"] = oHeight; + if (strPButtonCaptoin !== undefined && strPButtonCaptoin !== null) this.PageData["pvw_puttoncaptoin"] = + strPButtonCaptoin; + }, + SET_PREVIEW_MODE: function(ModeValue) { + if (ModeValue !== undefined) this.PageData["pvw_preview_mode"] = ModeValue; + }, + SET_SHOW_MODE: function(strModeType, ModeValue) { + if (strModeType === undefined || strModeType === null) strModeType = ""; + if (ModeValue === undefined || ModeValue === null) ModeValue = ""; + if (strModeType === "") return false; + strModeType = strModeType.toLowerCase(); + this.PageData['shwmod_' + strModeType] = ModeValue; + }, + SAVE_TO_FILE: function(strFileName) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (strFileName) { + this.PageData["stf_file_name"] = strFileName; + if (this.DoPostDatas("savetofile") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + } else console.info(this.altMessageNoWriteFile); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + SET_SAVE_MODE: function(strModeType, ModeValue) { + if (strModeType === undefined || strModeType === null) strModeType = ""; + if (ModeValue === undefined || ModeValue === null) ModeValue = ""; + if (strModeType === "") return false; + strModeType = strModeType.toLowerCase(); + this.PageData['stfmod_' + strModeType] = ModeValue; + }, + SEND_PRINT_RAWDATA: function(strRawData) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (strRawData !== undefined) { + this.PageData["raw_print_data"] = strRawData; + if (this.DoPostDatas("sendrawdata") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + WRITE_FILE_TEXT: function(WriteMode, strFileName, strText) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (strFileName !== undefined && strText !== undefined) { + this.PageData["write_file_mode"] = WriteMode; + this.PageData["write_file_name"] = strFileName; + this.PageData["write_file_text"] = strText; + if (this.DoPostDatas("writefiletext") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + } else console.info(this.altMessageNoWriteFile); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_DIALOG_VALUE: function(oType, oPreValue) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (oType !== undefined && oPreValue !== undefined) { + if (this.blIslocal) { + this.PageData["dialog_type"] = oType; + this.PageData["dialog_value"] = oPreValue; + if (this.DoPostDatas("dialog") == true) { + this.GetLastResult(true); + tResult = this.GetTaskID(); + } + } else console.info(this.altMessageNoReadWriteFile); + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + WRITE_PORT_DATA: function(strPortName, strData) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (strPortName !== undefined && strData !== undefined) { + this.PageData["write_port_name"] = strPortName; + this.PageData["write_port_data"] = strData; + if (this.DoPostDatas("writeportdata") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + READ_PORT_DATA: function(strPortName) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (strPortName !== undefined) { + this.PageData["read_port_name"] = strPortName; + if (this.DoPostDatas("readportdata") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_SYSTEM_INFO: function(InfoType) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (InfoType !== undefined) { + this.PageData["system_info_type"] = InfoType; + if (this.DoPostDatas("getsysteminfo") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_FILE_TEXT: function(strFileName) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (strFileName !== undefined) { + this.PageData["get_file_name"] = strFileName; + if (this.DoPostDatas("getfiletext") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + } else console.info(this.altMessageNoReadFile); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + IS_FILE_EXIST: function(strFileName) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (strFileName !== undefined) { + this.PageData["file_exist_name"] = strFileName; + if (this.DoPostDatas("isfileexist") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + } else console.info(this.altMessageNoReadFile); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_FILE_TIME: function(strFileName) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (strFileName !== undefined) { + this.PageData["file_time_name"] = strFileName; + if (this.DoPostDatas("getfiletime") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + } else console.info(this.altMessageNoReadFile); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_PRINT_INIFFNAME: function(strPrintTaskName) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (this.blIslocal) { + if (strPrintTaskName !== undefined) { + this.PageData["iniff_task_name"] = strPrintTaskName; + if (this.DoPostDatas("getiniffname") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + } else console.info(this.altMessageNoReadFile); + this.DoInit(); + this.blWorking = false; + return tResult; + }, + GET_VALUE: function(ValueType, ValueIndex) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (ValueType !== undefined && ValueIndex !== undefined) { + this.PageData["get_value_type"] = ValueType; + this.PageData["get_value_index"] = ValueIndex; + if (this.DoPostDatas("dogetvalue") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + ADD_PRINT_DATA: function(DataType, oValue) { + if (DataType !== undefined && oValue !== null) { + if (DataType.toLowerCase().indexOf("programdata") > -1) { + this.PageData["add_print_program_data"] = oValue; + return true; + } + } + }, + SHOW_CHART: function() {}, + DO_ACTION: function(strActName, strActValue) { + if (this.blWorking) { + console.info(this.altMessageBusy); + return null; + } + var tResult = null; + if (strActName !== undefined && strActValue !== undefined) { + this.PageData["do_action_name"] = strActName; + this.PageData["do_action_value"] = strActValue; + if (this.DoPostDatas("doaction") == true) { + this.GetLastResult(false); + tResult = this.GetTaskID(); + } + } + this.DoInit(); + this.blWorking = false; + return tResult; + }, + Create_Printer_List: function(oElement, blNoDetailForAO) { + while (oElement.childNodes.length > 0) { + var children = oElement.childNodes; + for (var i = 0; i < children.length; i++) + oElement.removeChild(children[i]); + }; + var iCount = this.GET_PRINTER_COUNT(); + var iIndex = 0; + for (var i = 0; i < iCount; i++) { + var option = document.createElement('option'); + option.innerHTML = this.GET_PRINTER_NAME(i); + option.value = iIndex; + oElement.appendChild(option); + iIndex++; + if (this.VERSION_EXT) { + if (this.Printers["list"][i]["subdevlist"].length > 0) { + if (blNoDetailForAO) option.innerHTML = option.innerHTML + ',..'; + else { + var strDrivename = option.innerHTML; + for (var j = 0; j < this.Printers["list"][i]["subdevlist"].length; j++) { + var strDevID = this.Printers["list"][i]["subdevlist"][j].id; + var strDevName = this.Printers["list"][i]["subdevlist"][j].name; + if (j == 0) { + option.innerHTML = strDrivename + ',' + strDevName; + option.value = strDrivename + ',' + strDevID + ';' + strDevName; + } else { + option = document.createElement('option'); + option.innerHTML = strDrivename + ',' + strDevName; + option.value = strDrivename + ',' + strDevID + ';' + strDevName; + oElement.appendChild(option); + iIndex++; + if (iIndex >= 100) return; + } + } + } + } + } + } + }, + Create_PageSize_List: function(oElement, printIndex) { + while (oElement.childNodes.length > 0) { + var children = oElement.childNodes; + for (var i = 0; i < children.length; i++) + oElement.removeChild(children[i]); + }; + var strPageSizeList = CLODOP.GET_PAGESIZES_LIST(printIndex, "\n"); + var Options = new Array(); + Options = strPageSizeList.split("\n"); + for (var i in Options) { + var option = document.createElement('option'); + option.innerHTML = Options[i]; + option.value = Options[i]; + oElement.appendChild(option); + } + }, + SET_BRIDGE_INDEX: function(strValue) { + if (this.Printers === undefined) return false; + else { + strValue = (strValue + "").replace(/^\s+|\s+$/g, ""); + for (var vNO in this.Printers["list"]) { + var strDriverOrName = this.Printers["list"][vNO].name; + if (strDriverOrName == "(AO)Client-Bridge Driver") { + this.PageData["printerindex"] = vNO; + this.PageData["printersubid"] = strValue; + return true; + } + } + return false; + } + }, + Get_AOPrinters_List: function(DriverNameOrIndex, strListName, strSplit) { + if (!strSplit) strSplit = "\n"; + if (!strListName) strListName = "name"; + return CLODOP.GET_PAGESIZES_LIST(DriverNameOrIndex, strSplit, "subdevlist", strListName); + }, + Get_AOBridges_List: function(DriverNameOrIndex, strListName, strSplit) { + return CLODOP.Get_AOPrinters_List(DriverNameOrIndex, strListName, strSplit); + }, + Get_AOBridge_List: function(strListName, strSplit) { + return CLODOP.Get_AOPrinters_List("(AO)Client-Bridge Driver", strListName, strSplit); + }, + Get_AOBridge_SubPrinters_List: function(BridgeNameOrIndex, strListName, strSplit, DriverNameOrIndex) { + if (!DriverNameOrIndex) DriverNameOrIndex = "(AO)Client-Bridge Driver"; + if (!strSplit) strSplit = "\n"; + if (!strListName) strListName = "name"; + for (var iDrvNO in this.Printers["list"]) { + if (DriverNameOrIndex == iDrvNO || DriverNameOrIndex == this.Printers["list"][iDrvNO].name) { + for (var iBdgNO in this.Printers["list"][iDrvNO]["subdevlist"]) { + var BridgeID = this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].id; + var BridgeName = this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].name; + if (BridgeNameOrIndex == iBdgNO || BridgeNameOrIndex == BridgeID + ";" + BridgeName) { + var strList = ""; + for (var iSsbPNO in this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].ssbprinter["list"]) { + if (iSsbPNO != "0") strList = strList + strSplit; + if (strListName.toLowerCase() == "id") strList = strList + iSsbPNO; + else + strList = strList + this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].ssbprinter["list"][iSsbPNO].name; + } + return strList; + } + } + } + } + return ""; + }, + Get_AOBridge_SubPrinters_PageSize_List: function(BridgeNameOrIndex, SubPrinterNameOrIndex, strSplit, + DriverNameOrIndex) { + if (!DriverNameOrIndex) DriverNameOrIndex = "(AO)Client-Bridge Driver"; + if (!strSplit) strSplit = "\n"; + for (var iDrvNO in this.Printers["list"]) { + if (DriverNameOrIndex == iDrvNO || DriverNameOrIndex == this.Printers["list"][iDrvNO].name) { + for (var iBdgNO in this.Printers["list"][iDrvNO]["subdevlist"]) { + var BridgeID = this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].id; + var BridgeName = this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].name; + if (BridgeNameOrIndex == iBdgNO || BridgeNameOrIndex == BridgeID + ";" + BridgeName) { + for (var iSsbPNO in this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].ssbprinter["list"]) { + if (SubPrinterNameOrIndex == iSsbPNO || SubPrinterNameOrIndex == this.Printers["list"][iDrvNO]["subdevlist"] + [iBdgNO].ssbprinter["list"][iSsbPNO].name) { + var strList = ""; + for (var iPageSizeNO in this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].ssbprinter["list"][iSsbPNO][ + "pagelist" + ]) { + if (iPageSizeNO != "0") strList = strList + strSplit; + strList = strList + this.Printers["list"][iDrvNO]["subdevlist"][iBdgNO].ssbprinter["list"][iSsbPNO][ + "pagelist" + ][iPageSizeNO].name; + } + return strList; + }; + } + } + } + } + } + return ""; + }, + AddItemArray: function(type, top, left, width, height, strContent, itemname, ShapeType, intPenStyle, intPenWidth, + intColor, isLinePosition, BarType, strChartTypess) { + if (top === undefined || left === undefined || width === undefined || height === undefined || strContent === + undefined) { + return false; + } + var sCount = this.ItemDatas["count"]; + sCount++; + var oneItem = {}; + for (var vstyle in this.defStyleJson) { + oneItem[vstyle] = this.defStyleJson[vstyle]; + } + oneItem["type"] = type; + oneItem["top"] = top; + oneItem["left"] = left; + oneItem["width"] = width; + oneItem["height"] = height; + if (strContent != null) { + if (typeof strContent === "string" && strContent.indexOf(this.DelimChar) > -1) + oneItem["content"] = strContent.replace(new RegExp(this.DelimChar, 'g'), ''); + else + oneItem["content"] = strContent; + } + if ((itemname !== undefined) && (itemname != null)) oneItem["itemname"] = itemname + ""; + if ((ShapeType !== undefined) && (ShapeType != null)) oneItem["shapetype"] = ShapeType; + if ((intPenStyle !== undefined) && (intPenStyle != null)) oneItem["penstyle"] = intPenStyle; + if ((intPenWidth !== undefined) && (intPenWidth != null)) oneItem["penwidth"] = intPenWidth; + if ((intColor !== undefined) && (intColor != null)) oneItem["fontcolor"] = intColor; + if ((isLinePosition !== undefined) && (isLinePosition != null)) oneItem["lineposition"] = "1"; + if ((BarType !== undefined) && (BarType != null)) oneItem["fontname"] = BarType; + if ((strChartTypess !== undefined) && (strChartTypess != null)) oneItem["charttypess"] = strChartTypess; + + oneItem["beginpage"] = this.defStyleJson["beginpage"]; + oneItem["beginpagea"] = this.defStyleJson["beginpagea"]; + this.ItemDatas["count"] = sCount; + this.ItemDatas[sCount] = oneItem; + this.blNormalItemAdded = true; + return true; + }, + RemoveIframes: function() { + // #ifndef APP-PLUS + var obody = document.body || document.getElementsByTagName("body")[0] || document.documentElement; + // #endif + try { + for (var i = 0; i < this.Iframes.length; i++) { + var now = (new Date()).getTime(); + if ((now - this.Iframes[i]["time"]) > this.timeThreshold * 60000) { + // #ifndef APP-PLUS + obody.removeChild(this.Iframes[i]["iframe"]); + // #endif + this.Iframes.splice(i, 1); + } + } + } catch (err) {}; + }, + AddInputElement: function(odocument, oform, name, value) { + if (value !== undefined) { + var oinput = odocument.createElement("input"); + oinput.name = name; + oinput.type = "hidden"; + oinput.value = value; + oform.appendChild(oinput); + } + }, + createPostDataString: function(afterPostAction) { + var strData = "act=" + afterPostAction + this.DelimChar; + strData = strData + "browseurl=" + window.location.href + this.DelimChar; + for (var vMode in this.PageDataEx) { + strData = strData + vMode + "=" + this.PageDataEx[vMode] + this.DelimChar; + } + var PrintModeNamess = ""; + for (var vMode in this.PageData) { + strData = strData + vMode + "=" + this.PageData[vMode] + this.DelimChar; + if (vMode != "top" && vMode != "left" && vMode != "width" && vMode != "height" && vMode != "printtask" && vMode != + "printerindex" && vMode != "printerindexa" && vMode != "printersubid" && vMode != "orient" && vMode != + "pagewidth" && vMode != "pageheight" && vMode != "pagename" && vMode != "printcopies" && vMode != "setup_bkimg" + ) + PrintModeNamess = PrintModeNamess + ";" + vMode; + } + if (PrintModeNamess !== "") + strData = strData + "printmodenames=" + PrintModeNamess + this.DelimChar; + var StyleClassNamess = ""; + for (var vClassStyle in this.ItemCNameStyles) { + strData = strData + vClassStyle + "=" + this.ItemCNameStyles[vClassStyle] + this.DelimChar; + StyleClassNamess = StyleClassNamess + ";" + vClassStyle; + } + if (StyleClassNamess !== "") + strData = strData + "printstyleclassnames=" + StyleClassNamess + this.DelimChar; + strData = strData + "itemcount=" + this.ItemDatas["count"] + this.DelimChar; + for (var vItemNO in this.ItemDatas) { + var ItemStyless = ""; + for (var vItemxx in this.ItemDatas[vItemNO]) { + if (vItemxx != "beginpage" && vItemxx != "beginpagea" && vItemxx != "type" && vItemxx != "top" && vItemxx != + "left" && vItemxx != "width" && vItemxx != "height") + ItemStyless = ItemStyless + ";" + vItemxx; + } + strData = strData + vItemNO + "_itemstylenames" + "=" + ItemStyless + this.DelimChar; + for (var vItemxx in this.ItemDatas[vItemNO]) { + strData = strData + vItemNO + "_" + vItemxx + "=" + this.ItemDatas[vItemNO][vItemxx] + this.DelimChar; + } + } + return strData; + }, + wsDoPostDatas: function(afterPostAction) { + var strData = "charset=丂" + this.DelimChar; + strData = strData + "tid=" + this.GetTaskID() + this.DelimChar; + strData = strData + this.createPostDataString(afterPostAction); + return this.wsSend("post:" + strData); + }, + DoPostDatas: function(afterPostAction) { + if (this.OBO_Mode && this.blOneByone) { + console.info(this.altMessageSomeWindowExist); + return false; + } + this.blWorking = true; + if (this.blTmpSelectedIndex !== null) + this.SET_PRINTER_INDEX(this.blTmpSelectedIndex); + if (this.SocketEnable) { + return this.wsDoPostDatas(afterPostAction); + } + // #ifdef APP-PLUS + return this.wsDoPostDatas(afterPostAction); + // #endif + this.RemoveIframes(); + var obody = document.body || document.getElementsByTagName("body")[0] || document.documentElement; + var oiframe = document.createElement("iframe"); + oiframe.setAttribute("src", "about:blank"); + oiframe.setAttribute("style", "display:none"); + oiframe.height = 0; + obody.appendChild(oiframe); + var contentdocument = oiframe.contentWindow.document; + contentdocument.write("

"); + var oform = contentdocument.getElementsByTagName("form")[0]; + this.AddInputElement(contentdocument, oform, "charset", "丂"); + this.AddInputElement(contentdocument, oform, "tid", this.GetTaskID()); + this.AddInputElement(contentdocument, oform, "post", this.createPostDataString(afterPostAction)); + oform.submit(); + var IframeMS = {}; + IframeMS["time"] = (new Date()).getTime(); + IframeMS["iframe"] = oiframe; + this.Iframes.push(IframeMS); + return true; + }, + GetLastResult: function(blFOneByone) { + if (blFOneByone) this.blOneByone = true; + if (this.SocketEnable) { + return true; + } + var url = this.strHostURI + "/c_lastresult.js"; + url = url + "?times=" + (new Date().getTime()); + url = url + "&tid=" + this.GetTaskID(); + url = encodeURI(url).replace("%20", "+"); + var oscript = document.createElement("script"); + oscript.src = url; + oscript.async = false; + oscript.type = "text/javascript"; + oscript.charset = "utf-8"; + var head = document.head || document.getElementsByTagName("head")[0] || document.documentElement; + head.insertBefore(oscript, head.firstChild); + oscript.onload = oscript.onreadystatechange = function() { + if (!oscript.readyState || /loaded|complete/.test(oscript.readyState)) { + CLODOP.blOneByone = false; + if (CLodop_ACTLastResult) + var strResult = decodeURIComponent(CLodop_ACTLastResult); + var strResultTaskID = CLodop_ACTTaskID; + CLODOP.Result = strResult; + if (CLodop_ACTAlert) CLodop_ACTconsole.info(); + if (CLODOP.On_Return) + try { + var selfFunc = CLODOP.On_Return; + if (strResult == "true" || strResult == "false") + CLODOP.On_Return(strResultTaskID, strResult == "true"); + else + CLODOP.On_Return(strResultTaskID, strResult); + if (!CLODOP.On_Return_Remain && selfFunc === CLODOP.On_Return) CLODOP.On_Return = null; + } catch (err) {}; + oscript.onload = oscript.onreadystatechange = null; + if (oscript.parentNode) { + oscript.parentNode.removeChild(oscript); + } + } + }; + return true; + }, + DoCPreview: function(sView, iW, iH) { + var obody = document.body || document.getElementsByTagName("body")[0] || document.documentElement; + if (typeof iW !== "number") iW = Math.round(obody.offsetWidth * 2 / 3); + else + if (obody.offsetWidth < iW) iW = obody.offsetWidth; + if (typeof iH !== "number") iH = Math.round(window.screen.height - 200); + else + if (window.screen.height < iH) iH = window.screen.height; + var url = this.strHostURI + "/c_dopreview"; + url = url + "?times=" + (new Date().getTime()); + url = url + "&tid=" + this.GetTaskID(); + url = url + "&iw=" + iW; + url = url + "&ih=" + iH; + url = encodeURI(url).replace("%20", "+"); + this.PopView(sView, url, iW, iH); + }, + PopView: function(sView, strPURL, iW, iH) { + try { + if (sView && typeof sView === "string" && sView.length > 0) { + if (sView === "_dialog") { + if (window.showModalDialog) { + window.showModalDialog(strPURL, 'dialog', 'center:yes'); + } else { + window.open(strPURL, "", "scrollbars=yes,toolbar=no,left=150,top=100,resizable=yes"); + } + } else + if (sView === "_self" || sView === "_top" || sView === "_parent") { + window.location.href = strPURL; + } else + if (sView === "_blank") { + this.PreviewBox.create(strPURL, iW, iH); + } else + if (sView.indexOf("_winopen:") > -1) { + var strFeatures = sView.slice(sView.indexOf("_winopen:") + 9); + if (strFeatures.indexOf("_blank") > -1) + window.open(strPURL, "_blank", strFeatures.slice(strFeatures.indexOf("_blank") + 6)); + else + window.open(strPURL, "", strFeatures); + } else + if (document.getElementById(sView)) { + document.getElementById(sView).src = strPURL; + } else + console.info("iframe '" + sView + "' not exist!"); + } else this.PreviewBox.create(strPURL, iW, iH); + } catch (err) { + console.info("CLODOP PopView " + err); + }; + }, + creatMyButtonElement: function(strType, strValue) { + try { + var oElement = document.createElement(""); + } catch (e) {}; + if (!oElement) { + oElement = document.createElement("input"); + oElement.type = strType; + oElement.value = strValue; + } + return oElement; + }, + creatLabelElement: function(Type, Value, Width, Left, Top) { + var TxtLabel = document.createElement(Type); + TxtLabel.innerHTML = Value; + TxtLabel.style.cssText = "position:absolute;width:" + Width + "px;left:" + Left + "px;top:" + Top + "px;"; + return TxtLabel; + }, + SelectBox: { + dragapproved: false, + offsetx: 0, + offsety: 0, + tempx: 0, + tempy: 0, + FrantDiv: undefined, + PopDiv: undefined, + selPrinter: undefined, + selCopies: undefined, + closeit: function() { + if (CLODOP.SelectBox.PopDiv && CLODOP.SelectBox.PopDiv.parentNode) + CLODOP.SelectBox.PopDiv.parentNode.removeChild(CLODOP.SelectBox.PopDiv); + if (this.FrantDiv && this.FrantDiv.parentNode) + this.FrantDiv.parentNode.removeChild(this.FrantDiv); + this.PopDiv = undefined; + }, + initializedrag: function(e) { + var we = window.event || e; + this.offsetx = we.clientX; + this.offsety = we.clientY; + this.tempx = parseInt(this.PopDiv.style.left); + this.tempy = parseInt(this.PopDiv.style.top); + this.dragapproved = true; + }, + drag_drop: function(e) { + if (!this.dragapproved) return; + var we = window.event || e; + this.PopDiv.style.left = we.clientX - this.offsetx + this.tempx + "px"; + this.PopDiv.style.top = we.clientY - this.offsety + this.tempy + "px"; + }, + stopdrag: function() { + this.dragapproved = false; + }, + clickOK: function(onlySelect) { + CLODOP.PRINTAOK(CLODOP.SelectBox.selPrinter.value, CLODOP.SelectBox.selCopies.value, 0, 0, onlySelect); + this.closeit(); + }, + create: function(iW, iH, onlySelect) { + if (CLODOP.SelectBox.PopDiv) this.closeit(); + var obody = document.body || document.getElementsByTagName("body")[0] || document.documentElement; + var Boxdiv = document.createElement("div"); + obody.appendChild(Boxdiv); + Boxdiv.style.cssText = + "position:absolute;z-index:91100;display:block;top:2px;border:1px solid #6B97C1;background:#F5F5F5;color:#000;font-size:13px;"; + Boxdiv.style.width = iW + "px"; + Boxdiv.style.left = Math.max((obody.offsetWidth - iW) / 2, 0) + "px"; + Boxdiv.style.top = Math.max((obody.offsetHeight - iH) / 2, 0) + "px"; + Boxdiv.style.height = iH + "px"; + this.PopDiv = Boxdiv; + var titleDiv = document.createElement("div"); + Boxdiv.appendChild(titleDiv); + titleDiv.style.cssText = + "font: bold 13px Arial;line-height:25px;height:27px;text-indent:5px;color: white;background:#8BACCF"; + titleDiv.innerHTML = "      打印"; + titleDiv.onmousedown = function(event) { + CLODOP.SelectBox.initializedrag(event); + }; + titleDiv.onmousemove = function(event) { + CLODOP.SelectBox.drag_drop(event); + }; + titleDiv.onmouseup = function() { + CLODOP.SelectBox.stopdrag(); + }; + var icoButton = document.createElement("button"); + titleDiv.appendChild(icoButton); + icoButton.style.cssText = "background:transparent url(" + CLODOP.strHostURI + + "/c_favicon.ico) no-repeat scroll 0 0px;margin-left:5px;position:absolute;height:20px;line-height:100px;width:34px;left:3px;border:0;top:5px"; + var CloseButton = document.createElement("button"); + titleDiv.appendChild(CloseButton); + CloseButton.style.cssText = "background:transparent url(" + CLODOP.strHostURI + + "/images/c_winclose.png) no-repeat scroll 0 0px;margin-right:5px;position:absolute;height:20px;line-height:100px;width:34px;right:3px;border:0;top:4px"; + CloseButton.onclick = function() { + CLODOP.SelectBox.closeit(); + if (onlySelect && CLODOP.On_Return) { + var selfFunc = CLODOP.On_Return; + CLODOP.On_Return(0, -1); + if (!CLODOP.On_Return_Remain && selfFunc === CLODOP.On_Return) CLODOP.On_Return = null; + } + }; + var areaDiv = document.createElement("div"); + Boxdiv.appendChild(areaDiv); + areaDiv.style.cssText = "background:#F5F5F5;color:#000;border:0px;left:0px;top:0px;"; + areaDiv.style.width = iW - 2 + "px"; + areaDiv.style.height = (iH - 27) + "px"; + var OKButton = CLODOP.creatMyButtonElement("button", "确定"); + Boxdiv.appendChild(OKButton); + OKButton.style.cssText = "position:absolute;width:80px;height:23px;"; + OKButton.style.left = "110px"; + OKButton.style.top = (iH - 64) + "px"; + OKButton.onclick = function() { + CLODOP.SelectBox.clickOK(onlySelect); + }; + var CancelButton = CLODOP.creatMyButtonElement("button", "取消"); + Boxdiv.appendChild(CancelButton); + CancelButton.style.cssText = "position:absolute;width:80px;;height:23px;"; + CancelButton.style.left = "240px"; + CancelButton.style.top = (iH - 64) + "px"; + CancelButton.onclick = function() { + CLODOP.SelectBox.closeit(); + if (onlySelect && CLODOP.On_Return) { + var selfFunc = CLODOP.On_Return; + CLODOP.On_Return(0, -1); + if (!CLODOP.On_Return_Remain && selfFunc === CLODOP.On_Return) CLODOP.On_Return = null; + } + }; + areaDiv.appendChild(CLODOP.creatLabelElement("span", "选打印机:", 200, 46, 67)); + var oSelect = document.createElement("select"); + Boxdiv.appendChild(oSelect); + this.selPrinter = oSelect; + oSelect.style.cssText = "position:absolute;size:1;width:212px;left:110px;top:62px;"; + CLODOP.Create_Printer_List(oSelect); + areaDiv.appendChild(CLODOP.creatLabelElement("span", "打印份数:", 200, 46, 121)); + var oCopies = CLODOP.creatMyButtonElement("text", "1"); + Boxdiv.appendChild(oCopies); + this.selCopies = oCopies; + oCopies.style.cssText = "position:absolute;size:1;width:30px;left:110px;top:117px;"; + this.FrantDiv = document.createElement("div"); + obody.appendChild(this.FrantDiv); + this.FrantDiv.style.cssText = + "border:0px;left:0px;top:0px;filter: alpha(opacity=20); position: fixed; opacity: 0.2;-moz-opacity: 0.2; _position: absolute;z-index:91009; over-flow: hidden;"; + if (CLODOP.Browser.IE && (document.compatMode == "BackCompat" || navigator.userAgent.indexOf("MSIE 6.0") > 0)) { + this.FrantDiv.style.width = obody.scrollWidth + "px"; + this.FrantDiv.style.height = obody.scrollHeight + "px"; + } else { + this.FrantDiv.style.width = "100%"; + this.FrantDiv.style.height = "100%"; + } + } + }, + PreviewBox: { + dragapproved: false, + offsetx: 0, + offsety: 0, + tempx: 0, + tempy: 0, + FrantDiv: undefined, + PopDiv: undefined, + ContentFrame: undefined, + closeit: function(oSelf) { + if (CLODOP.PreviewBox.PopDiv && CLODOP.PreviewBox.PopDiv.parentNode) + CLODOP.PreviewBox.PopDiv.parentNode.removeChild(CLODOP.PreviewBox.PopDiv); + if (this.FrantDiv && this.FrantDiv.parentNode) + this.FrantDiv.parentNode.removeChild(this.FrantDiv); + this.PopDiv = undefined; + }, + initializedrag: function(e, oSelf) { + var we = window.event || e; + this.offsetx = we.clientX; + this.offsety = we.clientY; + this.tempx = parseInt(oSelf.style.left); + this.tempy = parseInt(oSelf.style.top); + this.dragapproved = true; + }, + drag_drop: function(e, oSelf) { + if (!this.dragapproved) return; + var we = window.event || e; + oSelf.style.left = we.clientX - this.offsetx + this.tempx + "px"; + oSelf.style.top = we.clientY - this.offsety + this.tempy + "px"; + }, + stopdrag: function() { + this.dragapproved = false; + if (this.ContentFrame) this.ContentFrame.style.display = "block"; + }, + create: function(strURL, iW, iH) { + if (CLODOP.PreviewBox.PopDiv) this.closeit(); + var obody = document.body || document.getElementsByTagName("body")[0] || document.documentElement; + var vBoxDiv = document.createElement("div"); + obody.appendChild(vBoxDiv); + vBoxDiv.style.cssText = + "position:absolute;z-index:91100;display:block;top:2px;border:1px solid #6B97C1;font-size:13px;"; + vBoxDiv.style.width = iW + "px"; + var iLeft = (obody.offsetWidth - iW) / 2; + if (window.screen.width < obody.offsetWidth) iLeft = (window.screen.width - iW) / 2; + if (iLeft < 0) iLeft = 0; + vBoxDiv.style.left = iLeft + "px"; + vBoxDiv.style.height = iH + "px"; + vBoxDiv.onmousedown = function(event) { + CLODOP.PreviewBox.initializedrag(event, this); + }; + vBoxDiv.onmouseup = function() { + CLODOP.PreviewBox.stopdrag(); + }; + vBoxDiv.onmousemove = function(event) { + CLODOP.PreviewBox.drag_drop(event, this); + }; + this.PopDiv = vBoxDiv; + var titleDiv = document.createElement("div"); + vBoxDiv.appendChild(titleDiv); + titleDiv.style.cssText = + "position:absolute;left:0px;width:100%;font: bold 14px Arial;line-height:27px;height:27px;text-indent:26px;color: white;background:#8BACCF"; + titleDiv.innerHTML = "打印预览"; + var icoButton = document.createElement("button"); + titleDiv.appendChild(icoButton); + icoButton.style.cssText = "background:transparent url(" + CLODOP.strHostURI + + "/c_favicon.ico) no-repeat scroll 0 0px;margin-left:5px;position:absolute;height:20px;line-height:100px;width:34px;left:3px;border:0;top:5px"; + var CloseButton = document.createElement("button"); + titleDiv.appendChild(CloseButton); + CloseButton.style.cssText = "background:transparent url(" + CLODOP.strHostURI + + "/images/c_winclose.png) no-repeat scroll 0 0px;margin-right:5px;position:absolute;height:20px;line-height:100px;width:34px;right:3px;border:0;top:4px"; + CloseButton.onclick = function() { + CLODOP.PreviewBox.closeit(this); + }; + var areaDiv = document.createElement("div"); + vBoxDiv.appendChild(areaDiv); + areaDiv.style.cssText = "background:#F5F5F5;color:#000;border:0px;left:0px;top:0px;"; + areaDiv.style.width = iW + "px"; + areaDiv.style.height = (iH - 0) + "px"; + this.ContentFrame = document.createElement("iframe"); + areaDiv.appendChild(this.ContentFrame); + this.ContentFrame.style.cssText = "width:100%;height:100%;"; + this.ContentFrame.src = strURL; + this.ContentFrame.frameBorder = "no"; + this.FrantDiv = document.createElement("div"); + obody.appendChild(this.FrantDiv); + this.FrantDiv.style.cssText = + "border:0px;left:0px;top:0px;filter: alpha(opacity=20); position: fixed; opacity: 0.2; -moz-opacity: 0.2; _position: absolute;z-index:91009; over-flow: hidden;"; + if (CLODOP.Browser.IE && (document.compatMode == "BackCompat" || navigator.userAgent.indexOf("MSIE 6.0") > 0)) { + this.FrantDiv.style.width = obody.scrollWidth + "px"; + this.FrantDiv.style.height = obody.scrollHeight + "px"; + } else { + this.FrantDiv.style.width = "100%"; + this.FrantDiv.style.height = "100%"; + } + } + } + }; + if (win.CLODOP2015_7028 && win.CLODOP2015_7028.Priority && win.CLODOP2015_7028.Priority > CLODOP.Priority) { + CLODOP = win.CLODOP2015_7028; + win.CLODOP_OK_Priority = win.CLODOP2015_7028.Priority; + return; + } + win.LODOP = CLODOP; + win.CLODOP = CLODOP; + win.CLODOP2015_7028 = CLODOP; + win.CLODOP_OK_Priority = CLODOP.Priority; + + // #ifndef APP-PLUS + win.CLODOP.DoInit(); + // #endif + + if (navigator.userAgent.indexOf("Lodop") < 0) win.CLODOP.OpenWebSocket(); +})(window); + +function getCLodop() { + return window.CLODOP2015_7028; +} + +async function getPrinterList(ip){ + if (!ip) { + ip = uni.getStorageSync('fl_ip'); + } + try{ + const res = await uni.request({ + url: `http://${ip}:8000/CLodopfuncs.js`, + }); + if (res[0]) { + return []; + } + let temp = res[1].data.match(/"list":(.+)/); + const printerListString = temp[1].substr(0,temp[1].length-2); + let printerListArray = JSON.parse(printerListString); + let printerList = []; + printerListArray.forEach(item=>{ + printerList.push(item.name) + }) + return printerList; + }catch(e){ + console.log(e); + } +} +export { + getCLodop, + getPrinterList +}; //导出getLodop diff --git a/utils/getData1.js b/utils/getData1.js new file mode 100644 index 0000000..fca5dde --- /dev/null +++ b/utils/getData1.js @@ -0,0 +1,99 @@ +import request from './request.js' + +/** + * 人工组盘 + */ +// 点位编码 +export const getPressCode = () => request({ + url:'api/pda/group/getPressCode', + data: {} +}) +// 获取载具类型 +export const getVehicleType = () => request({ + url:'api/pda/group/getVehicleType', + data: {} +}) +// 人工组盘-确认 +export const groupmanual = (vcode, vtype, pcode, weight) => request({ + url:'api/pda/group/manual', + data: { + vehicle_code: vcode, + vehicle_type: vtype, + point_code: pcode, + material_weight: weight + } +}) + +/** + * 混碾搬运 + */ +// 获取混碾机数据 +export const getBlendingCode = () => request({ + url:'api/pda/move/getBlendingCode', + data: {} +}) +// 确认 +export const sendTask = (vcode, spcode) => request({ + url:'api/pda/move/sendTask', + data: { + vehicle_code: vcode, + start_point_code: spcode, + } +}) + +/** + * 人工分拣 + */ +// 呼叫木盘 +// 呼叫木盘刷新 +export const callingWoodenPalletTaskShow = () => request({ + url:'api/pda/manualSorting/callingWoodenPalletTaskShow', + data: {} +}) +// 呼叫木盘任务 +export const callingWoodenPalletTask = () => request({ + url:'api/pda/manualSorting/callingWoodenPalletTask', + data: {} +}) + + +// 呼叫满料 +// 呼叫满料刷新 +export const callingMaterialTaskShow = () => request({ + url:'api/pda/manualSorting/callingMaterialTaskShow', + data: {} +}) +// 呼叫满料确认 +export const callingMaterialTask = () => request({ + url:'/api/pda/manualSorting/callingMaterialTask', + data: {} +}) + +// 空盘入库 +// 空盘入库刷新 +export const emptyDiskIntoStorageShow = () => request({ + url:'api/pda/manualSorting/emptyDiskIntoStorageShow', + data: {} +}) +// 空盘入库确认 +export const emptyDiskIntoStorageTask = () => request({ + url:'api/pda/manualSorting/emptyDiskIntoStorageTask', + data: {} +}) + +// 压机搬运 +// 压机叫料 +export const pressTask = (dcode, vcode, qty, id) => request({ + url:'api/pda/pressSendMaterial/pressTask', + data: { + device_code: dcode, + vehicle_code: vcode, + qty: qty, + user_id: id + } +}) +// 搬运起点 +export const pressPointList = () => request({ + url:'api/pda/pressSendMaterial/pressPointList', + data: {} +}) diff --git a/utils/getData2.js b/utils/getData2.js new file mode 100644 index 0000000..939aad5 --- /dev/null +++ b/utils/getData2.js @@ -0,0 +1,172 @@ +import request from './request.js' +import request1 from './request1.js' + +// 版本更新测试 +export const pdaUpdate = () => request({ + url:'api/pda/update' +}) +// export const pdaUpdate = () => { +// let res = { +// versionName: '1.0.1', +// url: 'https://mp-e979e0eb-882b-42b3-a4a1-923ad08ea194.cdn.bspapp.com/cloudstorage/f72ec59f-7b25-487d-a034-fead1b6654c6.apk' +// } +// return res +// } + +// 登录 +export const handLogin = (user, password) => request({ + url:'mobile/auth/login', + data: { + username: user, + password: password + } +}) + +/** + * 设备点检 + */ +// 获取设备下拉框 +export const deviceInfo = () => request({ + url:'api/pda/deviceCheck/deviceInfo', + data: {} +}) +// 获取设备状态下拉框 +export const deviceStatus = () => request({ + url:'api/pda/deviceCheck/deviceStatus', + data: {} +}) +// 设备点检 +export const deviceCheckVerify = (code, user, remark, status) => request({ + url:'api/pda/deviceCheck/verify', + data: { + device_code: code, + username: user, + remark: remark, + check_status: status + } +}) + +/** + * 强制静置 + */ +// 显示静置信息 +export const forcedRestingShow = () => request({ + url:'api/pda/forcedResting/show', + data: {} +}) +// 强制静置 +export const forcedRestingSubmit = (stime, id) => request({ + url:'api/pda/forcedResting/submit', + data: { + stand_time: stime, + group_id: id + } +}) + +/** + * 分拣排产 + */ +// 显示工单/刷新 +export const manualSortingOrders = () => request({ + url:'api/pda/manualSorting/orders', + data: {} +}) +// 开工 +export const manualSortingProductionScheduling = (code, user) => request({ + url:'api/pda/manualSorting/productionScheduling', + data: { + workorder_code: code, + username: user + } +}) +// 完工 +export const manualSortingProductionComplete = (code, user) => request({ + url:'api/pda/manualSorting/productionComplete', + data: { + workorder_code: code, + username: user + } +}) + +/** + * 剩料入库 + */ +// 刷新 +export const callingResidueMaterialTaskShow = () => request({ + url:'api/pda/manualSorting/callingResidueMaterialTaskShow', + data: {} +}) +// 确认 +export const callingResidueMaterialTask = (code, qty) => request({ + url:'api/pda/manualSorting/callingResidueMaterialTask', + data: { + vehicle_code: code, + qty: qty + } +}) + +/** + * 托盘绑定 + */ +// 确认 +export const manualSortingBindingVehicle = (ocode, tcode) => request({ + url:'api/pda/manualSorting/bindingVehicle', + data: { + origin_vehicle_code: ocode, + target_vehicle_code: tcode + } +}) + +/** + * 包装入库 + */ +// 刷新 +export const manualSortingPackingTaskShow = () => request({ + url:'api/pda/manualSorting/packingTaskShow', + data: {} +}) +// 确认 +export const manualSortingPackingTask = (code, qty, sqty) => request({ + url:'/api/pda/manualSorting/packingTask', + data: { + vehicle_code: code, + qty: qty, + surplus_quantity: sqty + } +}) + +/** + * 货架盘点 + */ +// 物料查询 +export const shelfMaterialQuery = (code) => request({ + url:'api/pda/shelf/materialQuery', + data: { + material_code: code + } +}) +// 确认 +export const shelfUpdateData = (code, status, vcode, qty, id) => request({ + url:'api/pda/shelf/updateData', + data: { + point_code: code, + point_status: status, + vehicle_code: vcode, + material_qty: qty, + material_id: id + } +}) + +/** + * 混碾操作 + */ +// 获取要料信息 +export const mixRequestInfo = () => request({ + url:'api/pda/mix/requestInfo', + data: {} +}) +// 删除数据 +export const mixDeleteInfo = (obj) => request({ + url:'api/pda/mix/deleteInfo', + data: obj +}) diff --git a/utils/jsencrypt.js b/utils/jsencrypt.js new file mode 100644 index 0000000..820344b --- /dev/null +++ b/utils/jsencrypt.js @@ -0,0 +1,12 @@ +import JSEncrypt from './jsencrypt2.js' +let publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANL378k3RiZHWx5AfJqdH9xRNBmD9wGD\n' + + '2iRe41HdTNF8RUhNnHit5NpMNtGL0NPTSSpPjjI1kJfVorRvaQerUgkCAwEAAQ=='; +function RSAencrypt(pas){ + //实例化jsEncrypt对象 + let jse = new JSEncrypt(); + //设置公钥 + jse.setPublicKey(publicKey); + return jse.encrypt(pas); +} + +export {RSAencrypt} \ No newline at end of file diff --git a/utils/jsencrypt2.js b/utils/jsencrypt2.js new file mode 100644 index 0000000..1f14d0d --- /dev/null +++ b/utils/jsencrypt2.js @@ -0,0 +1,5373 @@ +/** + * 复制下面代码到node_modules/jsencrypt/bin/jsencrypt.js文件中兼容app + */ +(function(global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.JSEncrypt = {}))); +}(this, (function(exports) { + 'use strict'; + var navigator2 = { + appName: 'Netscape', + userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1' + }; + // 用来替换window2 + var window2 = { + ASN1: null, + Base64: null, + Hex: null, + crypto: null, + href: null + }; + var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; + + function int2char(n) { + return BI_RM.charAt(n); + } + //#region BIT_OPERATIONS + // (public) this & a + function op_and(x, y) { + return x & y; + } + // (public) this | a + function op_or(x, y) { + return x | y; + } + // (public) this ^ a + function op_xor(x, y) { + return x ^ y; + } + // (public) this & ~a + function op_andnot(x, y) { + return x & ~y; + } + // return index of lowest 1-bit in x, x < 2^31 + function lbit(x) { + if (x == 0) { + return -1; + } + var r = 0; + if ((x & 0xffff) == 0) { + x >>= 16; + r += 16; + } + if ((x & 0xff) == 0) { + x >>= 8; + r += 8; + } + if ((x & 0xf) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) { + ++r; + } + return r; + } + // return number of 1 bits in x + function cbit(x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + //#endregion BIT_OPERATIONS + + var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var b64pad = "="; + + function hex2b64(h) { + var i; + var c; + var ret = ""; + for (i = 0; i + 3 <= h.length; i += 3) { + c = parseInt(h.substring(i, i + 3), 16); + ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63); + } + if (i + 1 == h.length) { + c = parseInt(h.substring(i, i + 1), 16); + ret += b64map.charAt(c << 2); + } else if (i + 2 == h.length) { + c = parseInt(h.substring(i, i + 2), 16); + ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4); + } + while ((ret.length & 3) > 0) { + ret += b64pad; + } + return ret; + } + // convert a base64 string to hex + function b64tohex(s) { + var ret = ""; + var i; + var k = 0; // b64 state, 0-3 + var slop = 0; + for (i = 0; i < s.length; ++i) { + if (s.charAt(i) == b64pad) { + break; + } + var v = b64map.indexOf(s.charAt(i)); + if (v < 0) { + continue; + } + if (k == 0) { + ret += int2char(v >> 2); + slop = v & 3; + k = 1; + } else if (k == 1) { + ret += int2char((slop << 2) | (v >> 4)); + slop = v & 0xf; + k = 2; + } else if (k == 2) { + ret += int2char(slop); + ret += int2char(v >> 2); + slop = v & 3; + k = 3; + } else { + ret += int2char((slop << 2) | (v >> 4)); + ret += int2char(v & 0xf); + k = 0; + } + } + if (k == 1) { + ret += int2char(slop << 2); + } + return ret; + } + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ + __proto__: [] + } + instanceof Array && function(d, b) { + d.__proto__ = b; + }) || + function(d, b) { + for (var p in b) + if (b.hasOwnProperty(p)) d[p] = b[p]; + }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + + function __() { + this.constructor = d; + } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + // Hex JavaScript decoder + // Copyright (c) 2008-2013 Lapo Luchini + // Permission to use, copy, modify, and/or distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + /*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */ + var decoder; + var Hex = { + decode: function(a) { + var i; + if (decoder === undefined) { + var hex = "0123456789ABCDEF"; + var ignore = " \f\n\r\t\u00A0\u2028\u2029"; + decoder = {}; + for (i = 0; i < 16; ++i) { + decoder[hex.charAt(i)] = i; + } + hex = hex.toLowerCase(); + for (i = 10; i < 16; ++i) { + decoder[hex.charAt(i)] = i; + } + for (i = 0; i < ignore.length; ++i) { + decoder[ignore.charAt(i)] = -1; + } + } + var out = []; + var bits = 0; + var char_count = 0; + for (i = 0; i < a.length; ++i) { + var c = a.charAt(i); + if (c == "=") { + break; + } + c = decoder[c]; + if (c == -1) { + continue; + } + if (c === undefined) { + throw new Error("Illegal character at offset " + i); + } + bits |= c; + if (++char_count >= 2) { + out[out.length] = bits; + bits = 0; + char_count = 0; + } else { + bits <<= 4; + } + } + if (char_count) { + throw new Error("Hex encoding incomplete: 4 bits missing"); + } + return out; + } + }; + + // Base64 JavaScript decoder + // Copyright (c) 2008-2013 Lapo Luchini + // Permission to use, copy, modify, and/or distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + /*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */ + var decoder$1; + var Base64 = { + decode: function(a) { + var i; + if (decoder$1 === undefined) { + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var ignore = "= \f\n\r\t\u00A0\u2028\u2029"; + decoder$1 = Object.create(null); + for (i = 0; i < 64; ++i) { + decoder$1[b64.charAt(i)] = i; + } + for (i = 0; i < ignore.length; ++i) { + decoder$1[ignore.charAt(i)] = -1; + } + } + var out = []; + var bits = 0; + var char_count = 0; + for (i = 0; i < a.length; ++i) { + var c = a.charAt(i); + if (c == "=") { + break; + } + c = decoder$1[c]; + if (c == -1) { + continue; + } + if (c === undefined) { + throw new Error("Illegal character at offset " + i); + } + bits |= c; + if (++char_count >= 4) { + out[out.length] = (bits >> 16); + out[out.length] = (bits >> 8) & 0xFF; + out[out.length] = bits & 0xFF; + bits = 0; + char_count = 0; + } else { + bits <<= 6; + } + } + switch (char_count) { + case 1: + throw new Error("Base64 encoding incomplete: at least 2 bits missing"); + case 2: + out[out.length] = (bits >> 10); + break; + case 3: + out[out.length] = (bits >> 16); + out[out.length] = (bits >> 8) & 0xFF; + break; + } + return out; + }, + re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, + unarmor: function(a) { + var m = Base64.re.exec(a); + if (m) { + if (m[1]) { + a = m[1]; + } else if (m[2]) { + a = m[2]; + } else { + throw new Error("RegExp out of sync"); + } + } + return Base64.decode(a); + } + }; + + // Big integer base-10 printing library + // Copyright (c) 2014 Lapo Luchini + // Permission to use, copy, modify, and/or distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + /*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */ + var max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256 + var Int10 = /** @class */ (function() { + function Int10(value) { + this.buf = [+value || 0]; + } + Int10.prototype.mulAdd = function(m, c) { + // assert(m <= 256) + var b = this.buf; + var l = b.length; + var i; + var t; + for (i = 0; i < l; ++i) { + t = b[i] * m + c; + if (t < max) { + c = 0; + } else { + c = 0 | (t / max); + t -= c * max; + } + b[i] = t; + } + if (c > 0) { + b[i] = c; + } + }; + Int10.prototype.sub = function(c) { + // assert(m <= 256) + var b = this.buf; + var l = b.length; + var i; + var t; + for (i = 0; i < l; ++i) { + t = b[i] - c; + if (t < 0) { + t += max; + c = 1; + } else { + c = 0; + } + b[i] = t; + } + while (b[b.length - 1] === 0) { + b.pop(); + } + }; + Int10.prototype.toString = function(base) { + if ((base || 10) != 10) { + throw new Error("only base 10 is supported"); + } + var b = this.buf; + var s = b[b.length - 1].toString(); + for (var i = b.length - 2; i >= 0; --i) { + s += (max + b[i]).toString().substring(1); + } + return s; + }; + Int10.prototype.valueOf = function() { + var b = this.buf; + var v = 0; + for (var i = b.length - 1; i >= 0; --i) { + v = v * max + b[i]; + } + return v; + }; + Int10.prototype.simplify = function() { + var b = this.buf; + return (b.length == 1) ? b[0] : this; + }; + return Int10; + }()); + + // ASN.1 JavaScript decoder + var ellipsis = "\u2026"; + var reTimeS = + /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; + var reTimeL = + /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; + + function stringCut(str, len) { + if (str.length > len) { + str = str.substring(0, len) + ellipsis; + } + return str; + } + var Stream = /** @class */ (function() { + function Stream(enc, pos) { + this.hexDigits = "0123456789ABCDEF"; + if (enc instanceof Stream) { + this.enc = enc.enc; + this.pos = enc.pos; + } else { + // enc should be an array or a binary string + this.enc = enc; + this.pos = pos; + } + } + Stream.prototype.get = function(pos) { + if (pos === undefined) { + pos = this.pos++; + } + if (pos >= this.enc.length) { + throw new Error("Requesting byte offset " + pos + " on a stream of length " + + this.enc.length); + } + return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos]; + }; + Stream.prototype.hexByte = function(b) { + return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF); + }; + Stream.prototype.hexDump = function(start, end, raw) { + var s = ""; + for (var i = start; i < end; ++i) { + s += this.hexByte(this.get(i)); + if (raw !== true) { + switch (i & 0xF) { + case 0x7: + s += " "; + break; + case 0xF: + s += "\n"; + break; + default: + s += " "; + } + } + } + return s; + }; + Stream.prototype.isASCII = function(start, end) { + for (var i = start; i < end; ++i) { + var c = this.get(i); + if (c < 32 || c > 176) { + return false; + } + } + return true; + }; + Stream.prototype.parseStringISO = function(start, end) { + var s = ""; + for (var i = start; i < end; ++i) { + s += String.fromCharCode(this.get(i)); + } + return s; + }; + Stream.prototype.parseStringUTF = function(start, end) { + var s = ""; + for (var i = start; i < end;) { + var c = this.get(i++); + if (c < 128) { + s += String.fromCharCode(c); + } else if ((c > 191) && (c < 224)) { + s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F)); + } else { + s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << + 6) | (this.get(i++) & 0x3F)); + } + } + return s; + }; + Stream.prototype.parseStringBMP = function(start, end) { + var str = ""; + var hi; + var lo; + for (var i = start; i < end;) { + hi = this.get(i++); + lo = this.get(i++); + str += String.fromCharCode((hi << 8) | lo); + } + return str; + }; + Stream.prototype.parseTime = function(start, end, shortYear) { + var s = this.parseStringISO(start, end); + var m = (shortYear ? reTimeS : reTimeL).exec(s); + if (!m) { + return "Unrecognized time: " + s; + } + if (shortYear) { + // to avoid querying the timer, use the fixed range [1970, 2069] + // it will conform with ITU X.400 [-10, +40] sliding window2 until 2030 + m[1] = +m[1]; + m[1] += (+m[1] < 70) ? 2000 : 1900; + } + s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4]; + if (m[5]) { + s += ":" + m[5]; + if (m[6]) { + s += ":" + m[6]; + if (m[7]) { + s += "." + m[7]; + } + } + } + if (m[8]) { + s += " UTC"; + if (m[8] != "Z") { + s += m[8]; + if (m[9]) { + s += ":" + m[9]; + } + } + } + return s; + }; + Stream.prototype.parseInteger = function(start, end) { + var v = this.get(start); + var neg = (v > 127); + var pad = neg ? 255 : 0; + var len; + var s = ""; + // skip unuseful bits (not allowed in DER) + while (v == pad && ++start < end) { + v = this.get(start); + } + len = end - start; + if (len === 0) { + return neg ? -1 : 0; + } + // show bit length of huge integers + if (len > 4) { + s = v; + len <<= 3; + while (((+s ^ pad) & 0x80) == 0) { + s = +s << 1; + --len; + } + s = "(" + len + " bit)\n"; + } + // decode the integer + if (neg) { + v = v - 256; + } + var n = new Int10(v); + for (var i = start + 1; i < end; ++i) { + n.mulAdd(256, this.get(i)); + } + return s + n.toString(); + }; + Stream.prototype.parseBitString = function(start, end, maxLength) { + var unusedBit = this.get(start); + var lenBit = ((end - start - 1) << 3) - unusedBit; + var intro = "(" + lenBit + " bit)\n"; + var s = ""; + for (var i = start + 1; i < end; ++i) { + var b = this.get(i); + var skip = (i == end - 1) ? unusedBit : 0; + for (var j = 7; j >= skip; --j) { + s += (b >> j) & 1 ? "1" : "0"; + } + if (s.length > maxLength) { + return intro + stringCut(s, maxLength); + } + } + return intro + s; + }; + Stream.prototype.parseOctetString = function(start, end, maxLength) { + if (this.isASCII(start, end)) { + return stringCut(this.parseStringISO(start, end), maxLength); + } + var len = end - start; + var s = "(" + len + " byte)\n"; + maxLength /= 2; // we work in bytes + if (len > maxLength) { + end = start + maxLength; + } + for (var i = start; i < end; ++i) { + s += this.hexByte(this.get(i)); + } + if (len > maxLength) { + s += ellipsis; + } + return s; + }; + Stream.prototype.parseOID = function(start, end, maxLength) { + var s = ""; + var n = new Int10(); + var bits = 0; + for (var i = start; i < end; ++i) { + var v = this.get(i); + n.mulAdd(128, v & 0x7F); + bits += 7; + if (!(v & 0x80)) { // finished + if (s === "") { + n = n.simplify(); + if (n instanceof Int10) { + n.sub(80); + s = "2." + n.toString(); + } else { + var m = n < 80 ? n < 40 ? 0 : 1 : 2; + s = m + "." + (n - m * 40); + } + } else { + s += "." + n.toString(); + } + if (s.length > maxLength) { + return stringCut(s, maxLength); + } + n = new Int10(); + bits = 0; + } + } + if (bits > 0) { + s += ".incomplete"; + } + return s; + }; + return Stream; + }()); + var ASN1 = /** @class */ (function() { + function ASN1(stream, header, length, tag, sub) { + if (!(tag instanceof ASN1Tag)) { + throw new Error("Invalid tag value."); + } + this.stream = stream; + this.header = header; + this.length = length; + this.tag = tag; + this.sub = sub; + } + ASN1.prototype.typeName = function() { + switch (this.tag.tagClass) { + case 0: // universal + switch (this.tag.tagNumber) { + case 0x00: + return "EOC"; + case 0x01: + return "BOOLEAN"; + case 0x02: + return "INTEGER"; + case 0x03: + return "BIT_STRING"; + case 0x04: + return "OCTET_STRING"; + case 0x05: + return "NULL"; + case 0x06: + return "OBJECT_IDENTIFIER"; + case 0x07: + return "ObjectDescriptor"; + case 0x08: + return "EXTERNAL"; + case 0x09: + return "REAL"; + case 0x0A: + return "ENUMERATED"; + case 0x0B: + return "EMBEDDED_PDV"; + case 0x0C: + return "UTF8String"; + case 0x10: + return "SEQUENCE"; + case 0x11: + return "SET"; + case 0x12: + return "NumericString"; + case 0x13: + return "PrintableString"; // ASCII subset + case 0x14: + return "TeletexString"; // aka T61String + case 0x15: + return "VideotexString"; + case 0x16: + return "IA5String"; // ASCII + case 0x17: + return "UTCTime"; + case 0x18: + return "GeneralizedTime"; + case 0x19: + return "GraphicString"; + case 0x1A: + return "VisibleString"; // ASCII subset + case 0x1B: + return "GeneralString"; + case 0x1C: + return "UniversalString"; + case 0x1E: + return "BMPString"; + } + return "Universal_" + this.tag.tagNumber.toString(); + case 1: + return "Application_" + this.tag.tagNumber.toString(); + case 2: + return "[" + this.tag.tagNumber.toString() + "]"; // Context + case 3: + return "Private_" + this.tag.tagNumber.toString(); + } + }; + ASN1.prototype.content = function(maxLength) { + if (this.tag === undefined) { + return null; + } + if (maxLength === undefined) { + maxLength = Infinity; + } + var content = this.posContent(); + var len = Math.abs(this.length); + if (!this.tag.isUniversal()) { + if (this.sub !== null) { + return "(" + this.sub.length + " elem)"; + } + return this.stream.parseOctetString(content, content + len, maxLength); + } + switch (this.tag.tagNumber) { + case 0x01: // BOOLEAN + return (this.stream.get(content) === 0) ? "false" : "true"; + case 0x02: // INTEGER + return this.stream.parseInteger(content, content + len); + case 0x03: // BIT_STRING + return this.sub ? "(" + this.sub.length + " elem)" : + this.stream.parseBitString(content, content + len, maxLength); + case 0x04: // OCTET_STRING + return this.sub ? "(" + this.sub.length + " elem)" : + this.stream.parseOctetString(content, content + len, maxLength); + // case 0x05: // NULL + case 0x06: // OBJECT_IDENTIFIER + return this.stream.parseOID(content, content + len, maxLength); + // case 0x07: // ObjectDescriptor + // case 0x08: // EXTERNAL + // case 0x09: // REAL + // case 0x0A: // ENUMERATED + // case 0x0B: // EMBEDDED_PDV + case 0x10: // SEQUENCE + case 0x11: // SET + if (this.sub !== null) { + return "(" + this.sub.length + " elem)"; + } else { + return "(no elem)"; + } + case 0x0C: // UTF8String + return stringCut(this.stream.parseStringUTF(content, content + len), + maxLength); + case 0x12: // NumericString + case 0x13: // PrintableString + case 0x14: // TeletexString + case 0x15: // VideotexString + case 0x16: // IA5String + // case 0x19: // GraphicString + case 0x1A: // VisibleString + // case 0x1B: // GeneralString + // case 0x1C: // UniversalString + return stringCut(this.stream.parseStringISO(content, content + len), + maxLength); + case 0x1E: // BMPString + return stringCut(this.stream.parseStringBMP(content, content + len), + maxLength); + case 0x17: // UTCTime + case 0x18: // GeneralizedTime + return this.stream.parseTime(content, content + len, (this.tag + .tagNumber == 0x17)); + } + return null; + }; + ASN1.prototype.toString = function() { + return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + + ",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub + .length) + "]"; + }; + ASN1.prototype.toPrettyString = function(indent) { + if (indent === undefined) { + indent = ""; + } + var s = indent + this.typeName() + " @" + this.stream.pos; + if (this.length >= 0) { + s += "+"; + } + s += this.length; + if (this.tag.tagConstructed) { + s += " (constructed)"; + } else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag + .tagNumber == 0x04))) && (this.sub !== null)) { + s += " (encapsulates)"; + } + s += "\n"; + if (this.sub !== null) { + indent += " "; + for (var i = 0, max = this.sub.length; i < max; ++i) { + s += this.sub[i].toPrettyString(indent); + } + } + return s; + }; + ASN1.prototype.posStart = function() { + return this.stream.pos; + }; + ASN1.prototype.posContent = function() { + return this.stream.pos + this.header; + }; + ASN1.prototype.posEnd = function() { + return this.stream.pos + this.header + Math.abs(this.length); + }; + ASN1.prototype.toHexString = function() { + return this.stream.hexDump(this.posStart(), this.posEnd(), true); + }; + ASN1.decodeLength = function(stream) { + var buf = stream.get(); + var len = buf & 0x7F; + if (len == buf) { + return len; + } + // no reason to use Int10, as it would be a huge buffer anyways + if (len > 6) { + throw new Error("Length over 48 bits not supported at position " + (stream.pos - + 1)); + } + if (len === 0) { + return null; + } // undefined + buf = 0; + for (var i = 0; i < len; ++i) { + buf = (buf * 256) + stream.get(); + } + return buf; + }; + /** + * Retrieve the hexadecimal value (as a string) of the current ASN.1 element + * @returns {string} + * @public + */ + ASN1.prototype.getHexStringValue = function() { + var hexString = this.toHexString(); + var offset = this.header * 2; + var length = this.length * 2; + return hexString.substr(offset, length); + }; + ASN1.decode = function(str) { + var stream; + if (!(str instanceof Stream)) { + stream = new Stream(str, 0); + } else { + stream = str; + } + var streamStart = new Stream(stream); + var tag = new ASN1Tag(stream); + var len = ASN1.decodeLength(stream); + var start = stream.pos; + var header = start - streamStart.pos; + var sub = null; + var getSub = function() { + var ret = []; + if (len !== null) { + // definite length + var end = start + len; + while (stream.pos < end) { + ret[ret.length] = ASN1.decode(stream); + } + if (stream.pos != end) { + throw new Error( + "Content size is not correct for container starting at offset " + + start); + } + } else { + // undefined length + try { + for (;;) { + var s = ASN1.decode(stream); + if (s.tag.isEOC()) { + break; + } + ret[ret.length] = s; + } + len = start - stream + .pos; // undefined lengths are represented as negative values + } catch (e) { + throw new Error( + "Exception while decoding undefined length content: " + e); + } + } + return ret; + }; + if (tag.tagConstructed) { + // must have valid content + sub = getSub(); + } else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == + 0x04))) { + // sometimes BitString and OctetString are used to encapsulate ASN.1 + try { + if (tag.tagNumber == 0x03) { + if (stream.get() != 0) { + throw new Error("BIT STRINGs with unused bits cannot encapsulate."); + } + } + sub = getSub(); + for (var i = 0; i < sub.length; ++i) { + if (sub[i].tag.isEOC()) { + throw new Error("EOC is not supposed to be actual content."); + } + } + } catch (e) { + // but silently ignore when they don't + sub = null; + } + } + if (sub === null) { + if (len === null) { + throw new Error( + "We can't skip over an invalid tag with undefined length at offset " + + start); + } + stream.pos = start + Math.abs(len); + } + return new ASN1(streamStart, header, len, tag, sub); + }; + return ASN1; + }()); + var ASN1Tag = /** @class */ (function() { + function ASN1Tag(stream) { + var buf = stream.get(); + this.tagClass = buf >> 6; + this.tagConstructed = ((buf & 0x20) !== 0); + this.tagNumber = buf & 0x1F; + if (this.tagNumber == 0x1F) { // long tag + var n = new Int10(); + do { + buf = stream.get(); + n.mulAdd(128, buf & 0x7F); + } while (buf & 0x80); + this.tagNumber = n.simplify(); + } + } + ASN1Tag.prototype.isUniversal = function() { + return this.tagClass === 0x00; + }; + ASN1Tag.prototype.isEOC = function() { + return this.tagClass === 0x00 && this.tagNumber === 0x00; + }; + return ASN1Tag; + }()); + + // Copyright (c) 2005 Tom Wu + // Bits per digit + var dbits; + // JavaScript engine analysis + var canary = 0xdeadbeefcafe; + var j_lm = ((canary & 0xffffff) == 0xefcafe); + //#region + var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, + 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, + 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, + 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, + 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, + 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, + 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, + 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, + 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 + ]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + //#endregion + // (public) Constructor + var BigInteger = /** @class */ (function() { + function BigInteger(a, b, c) { + if (a != null) { + if ("number" == typeof a) { + this.fromNumber(a, b, c); + } else if (b == null && "string" != typeof a) { + this.fromString(a, 256); + } else { + this.fromString(a, b); + } + } + } + //#region PUBLIC + // BigInteger.prototype.toString = bnToString; + // (public) return string representation in given radix + BigInteger.prototype.toString = function(b) { + if (this.s < 0) { + return "-" + this.negate().toString(b); + } + var k; + if (b == 16) { + k = 4; + } else if (b == 8) { + k = 3; + } else if (b == 2) { + k = 1; + } else if (b == 32) { + k = 5; + } else if (b == 4) { + k = 2; + } else { + return this.toRadix(b); + } + var km = (1 << k) - 1; + var d; + var m = false; + var r = ""; + var i = this.t; + var p = this.DB - (i * this.DB) % k; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this[i] & ((1 << p) - 1)) << (k - p); + d |= this[--i] >> (p += this.DB - k); + } else { + d = (this[i] >> (p -= k)) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) { + m = true; + } + if (m) { + r += int2char(d); + } + } + } + return m ? r : "0"; + }; + // BigInteger.prototype.negate = bnNegate; + // (public) -this + BigInteger.prototype.negate = function() { + var r = nbi(); + BigInteger.ZERO.subTo(this, r); + return r; + }; + // BigInteger.prototype.abs = bnAbs; + // (public) |this| + BigInteger.prototype.abs = function() { + return (this.s < 0) ? this.negate() : this; + }; + // BigInteger.prototype.compareTo = bnCompareTo; + // (public) return + if this > a, - if this < a, 0 if equal + BigInteger.prototype.compareTo = function(a) { + var r = this.s - a.s; + if (r != 0) { + return r; + } + var i = this.t; + r = i - a.t; + if (r != 0) { + return (this.s < 0) ? -r : r; + } + while (--i >= 0) { + if ((r = this[i] - a[i]) != 0) { + return r; + } + } + return 0; + }; + // BigInteger.prototype.bitLength = bnBitLength; + // (public) return the number of bits in "this" + BigInteger.prototype.bitLength = function() { + if (this.t <= 0) { + return 0; + } + return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)); + }; + // BigInteger.prototype.mod = bnMod; + // (public) this mod a + BigInteger.prototype.mod = function(a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) { + a.subTo(r, r); + } + return r; + }; + // BigInteger.prototype.modPowInt = bnModPowInt; + // (public) this^e % m, 0 <= e < 2^32 + BigInteger.prototype.modPowInt = function(e, m) { + var z; + if (e < 256 || m.isEven()) { + z = new Classic(m); + } else { + z = new Montgomery(m); + } + return this.exp(e, z); + }; + // BigInteger.prototype.clone = bnClone; + // (public) + BigInteger.prototype.clone = function() { + var r = nbi(); + this.copyTo(r); + return r; + }; + // BigInteger.prototype.intValue = bnIntValue; + // (public) return value as integer + BigInteger.prototype.intValue = function() { + if (this.s < 0) { + if (this.t == 1) { + return this[0] - this.DV; + } else if (this.t == 0) { + return -1; + } + } else if (this.t == 1) { + return this[0]; + } else if (this.t == 0) { + return 0; + } + // assumes 16 < DB < 32 + return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; + }; + // BigInteger.prototype.byteValue = bnByteValue; + // (public) return value as byte + BigInteger.prototype.byteValue = function() { + return (this.t == 0) ? this.s : (this[0] << 24) >> 24; + }; + // BigInteger.prototype.shortValue = bnShortValue; + // (public) return value as short (assumes DB>=16) + BigInteger.prototype.shortValue = function() { + return (this.t == 0) ? this.s : (this[0] << 16) >> 16; + }; + // BigInteger.prototype.signum = bnSigNum; + // (public) 0 if this == 0, 1 if this > 0 + BigInteger.prototype.signum = function() { + if (this.s < 0) { + return -1; + } else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) { + return 0; + } else { + return 1; + } + }; + // BigInteger.prototype.toByteArray = bnToByteArray; + // (public) convert to bigendian byte array + BigInteger.prototype.toByteArray = function() { + var i = this.t; + var r = []; + r[0] = this.s; + var p = this.DB - (i * this.DB) % 8; + var d; + var k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) { + r[k++] = d | (this.s << (this.DB - p)); + } + while (i >= 0) { + if (p < 8) { + d = (this[i] & ((1 << p) - 1)) << (8 - p); + d |= this[--i] >> (p += this.DB - 8); + } else { + d = (this[i] >> (p -= 8)) & 0xff; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 0x80) != 0) { + d |= -256; + } + if (k == 0 && (this.s & 0x80) != (d & 0x80)) { + ++k; + } + if (k > 0 || d != this.s) { + r[k++] = d; + } + } + } + return r; + }; + // BigInteger.prototype.equals = bnEquals; + BigInteger.prototype.equals = function(a) { + return (this.compareTo(a) == 0); + }; + // BigInteger.prototype.min = bnMin; + BigInteger.prototype.min = function(a) { + return (this.compareTo(a) < 0) ? this : a; + }; + // BigInteger.prototype.max = bnMax; + BigInteger.prototype.max = function(a) { + return (this.compareTo(a) > 0) ? this : a; + }; + // BigInteger.prototype.and = bnAnd; + BigInteger.prototype.and = function(a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + }; + // BigInteger.prototype.or = bnOr; + BigInteger.prototype.or = function(a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + }; + // BigInteger.prototype.xor = bnXor; + BigInteger.prototype.xor = function(a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + }; + // BigInteger.prototype.andNot = bnAndNot; + BigInteger.prototype.andNot = function(a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + }; + // BigInteger.prototype.not = bnNot; + // (public) ~this + BigInteger.prototype.not = function() { + var r = nbi(); + for (var i = 0; i < this.t; ++i) { + r[i] = this.DM & ~this[i]; + } + r.t = this.t; + r.s = ~this.s; + return r; + }; + // BigInteger.prototype.shiftLeft = bnShiftLeft; + // (public) this << n + BigInteger.prototype.shiftLeft = function(n) { + var r = nbi(); + if (n < 0) { + this.rShiftTo(-n, r); + } else { + this.lShiftTo(n, r); + } + return r; + }; + // BigInteger.prototype.shiftRight = bnShiftRight; + // (public) this >> n + BigInteger.prototype.shiftRight = function(n) { + var r = nbi(); + if (n < 0) { + this.lShiftTo(-n, r); + } else { + this.rShiftTo(n, r); + } + return r; + }; + // BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; + // (public) returns index of lowest 1-bit (or -1 if none) + BigInteger.prototype.getLowestSetBit = function() { + for (var i = 0; i < this.t; ++i) { + if (this[i] != 0) { + return i * this.DB + lbit(this[i]); + } + } + if (this.s < 0) { + return this.t * this.DB; + } + return -1; + }; + // BigInteger.prototype.bitCount = bnBitCount; + // (public) return number of set bits + BigInteger.prototype.bitCount = function() { + var r = 0; + var x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) { + r += cbit(this[i] ^ x); + } + return r; + }; + // BigInteger.prototype.testBit = bnTestBit; + // (public) true iff nth bit is set + BigInteger.prototype.testBit = function(n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) { + return (this.s != 0); + } + return ((this[j] & (1 << (n % this.DB))) != 0); + }; + // BigInteger.prototype.setBit = bnSetBit; + // (public) this | (1< 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + var j = e.t - 1; + var w; + var is1 = true; + var r2 = nbi(); + var t; + i = nbits(e[j]) - 1; + while (j >= 0) { + if (i >= k1) { + w = (e[j] >> (i - k1)) & km; + } else { + w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); + if (j > 0) { + w |= e[j - 1] >> (this.DB + i - k1); + } + } + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r); + is1 = false; + } else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) { + z.sqrTo(r, r2); + } else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + while (j >= 0 && (e[j] & (1 << i)) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); + }; + // BigInteger.prototype.modInverse = bnModInverse; + // (public) 1/this % m (HAC 14.61) + BigInteger.prototype.modInverse = function(m) { + var ac = m.isEven(); + if ((this.isEven() && ac) || m.signum() == 0) { + return BigInteger.ZERO; + } + var u = m.clone(); + var v = this.clone(); + var a = nbv(1); + var b = nbv(0); + var c = nbv(0); + var d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } else if (!b.isEven()) { + b.subTo(m, b); + } + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } else if (!d.isEven()) { + d.subTo(m, d); + } + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) { + a.subTo(c, a); + } + b.subTo(d, b); + } else { + v.subTo(u, v); + if (ac) { + c.subTo(a, c); + } + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger.ONE) != 0) { + return BigInteger.ZERO; + } + if (d.compareTo(m) >= 0) { + return d.subtract(m); + } + if (d.signum() < 0) { + d.addTo(m, d); + } else { + return d; + } + if (d.signum() < 0) { + return d.add(m); + } else { + return d; + } + }; + // BigInteger.prototype.pow = bnPow; + // (public) this^e + BigInteger.prototype.pow = function(e) { + return this.exp(e, new NullExp()); + }; + // BigInteger.prototype.gcd = bnGCD; + // (public) gcd(this,a) (HAC 14.54) + BigInteger.prototype.gcd = function(a) { + var x = (this.s < 0) ? this.negate() : this.clone(); + var y = (a.s < 0) ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(); + var g = y.getLowestSetBit(); + if (g < 0) { + return x; + } + if (i < g) { + g = i; + } + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) { + x.rShiftTo(i, x); + } + if ((i = y.getLowestSetBit()) > 0) { + y.rShiftTo(i, y); + } + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) { + y.lShiftTo(g, y); + } + return y; + }; + // BigInteger.prototype.isProbablePrime = bnIsProbablePrime; + // (public) test primality with certainty >= 1-.5^t + BigInteger.prototype.isProbablePrime = function(t) { + var i; + var x = this.abs(); + if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) { + if (x[0] == lowprimes[i]) { + return true; + } + } + return false; + } + if (x.isEven()) { + return false; + } + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i]; + var j = i + 1; + while (j < lowprimes.length && m < lplim) { + m *= lowprimes[j++]; + } + m = x.modInt(m); + while (i < j) { + if (m % lowprimes[i++] == 0) { + return false; + } + } + } + return x.millerRabin(t); + }; + //#endregion PUBLIC + //#region PROTECTED + // BigInteger.prototype.copyTo = bnpCopyTo; + // (protected) copy this to r + BigInteger.prototype.copyTo = function(r) { + for (var i = this.t - 1; i >= 0; --i) { + r[i] = this[i]; + } + r.t = this.t; + r.s = this.s; + }; + // BigInteger.prototype.fromInt = bnpFromInt; + // (protected) set from integer value x, -DV <= x < DV + BigInteger.prototype.fromInt = function(x) { + this.t = 1; + this.s = (x < 0) ? -1 : 0; + if (x > 0) { + this[0] = x; + } else if (x < -1) { + this[0] = x + this.DV; + } else { + this.t = 0; + } + }; + // BigInteger.prototype.fromString = bnpFromString; + // (protected) set from string and radix + BigInteger.prototype.fromString = function(s, b) { + var k; + if (b == 16) { + k = 4; + } else if (b == 8) { + k = 3; + } else if (b == 256) { + k = 8; + /* byte array */ + } else if (b == 2) { + k = 1; + } else if (b == 32) { + k = 5; + } else if (b == 4) { + k = 2; + } else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length; + var mi = false; + var sh = 0; + while (--i >= 0) { + var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-") { + mi = true; + } + continue; + } + mi = false; + if (sh == 0) { + this[this.t++] = x; + } else if (sh + k > this.DB) { + this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; + this[this.t++] = (x >> (this.DB - sh)); + } else { + this[this.t - 1] |= x << sh; + } + sh += k; + if (sh >= this.DB) { + sh -= this.DB; + } + } + if (k == 8 && ((+s[0]) & 0x80) != 0) { + this.s = -1; + if (sh > 0) { + this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; + } + } + this.clamp(); + if (mi) { + BigInteger.ZERO.subTo(this, this); + } + }; + // BigInteger.prototype.clamp = bnpClamp; + // (protected) clamp off excess high words + BigInteger.prototype.clamp = function() { + var c = this.s & this.DM; + while (this.t > 0 && this[this.t - 1] == c) { + --this.t; + } + }; + // BigInteger.prototype.dlShiftTo = bnpDLShiftTo; + // (protected) r = this << n*DB + BigInteger.prototype.dlShiftTo = function(n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) { + r[i + n] = this[i]; + } + for (i = n - 1; i >= 0; --i) { + r[i] = 0; + } + r.t = this.t + n; + r.s = this.s; + }; + // BigInteger.prototype.drShiftTo = bnpDRShiftTo; + // (protected) r = this >> n*DB + BigInteger.prototype.drShiftTo = function(n, r) { + for (var i = n; i < this.t; ++i) { + r[i - n] = this[i]; + } + r.t = Math.max(this.t - n, 0); + r.s = this.s; + }; + // BigInteger.prototype.lShiftTo = bnpLShiftTo; + // (protected) r = this << n + BigInteger.prototype.lShiftTo = function(n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB); + var c = (this.s << bs) & this.DM; + for (var i = this.t - 1; i >= 0; --i) { + r[i + ds + 1] = (this[i] >> cbs) | c; + c = (this[i] & bm) << bs; + } + for (var i = ds - 1; i >= 0; --i) { + r[i] = 0; + } + r[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + }; + // BigInteger.prototype.rShiftTo = bnpRShiftTo; + // (protected) r = this >> n + BigInteger.prototype.rShiftTo = function(n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r[0] = this[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r[i - ds - 1] |= (this[i] & bm) << cbs; + r[i - ds] = this[i] >> bs; + } + if (bs > 0) { + r[this.t - ds - 1] |= (this.s & bm) << cbs; + } + r.t = this.t - ds; + r.clamp(); + }; + // BigInteger.prototype.subTo = bnpSubTo; + // (protected) r = this - a + BigInteger.prototype.subTo = function(a, r) { + var i = 0; + var c = 0; + var m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] - a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c -= a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = (c < 0) ? -1 : 0; + if (c < -1) { + r[i++] = this.DV + c; + } else if (c > 0) { + r[i++] = c; + } + r.t = i; + r.clamp(); + }; + // BigInteger.prototype.multiplyTo = bnpMultiplyTo; + // (protected) r = this * a, r != this,a (HAC 14.12) + // "this" should be the larger one if appropriate. + BigInteger.prototype.multiplyTo = function(a, r) { + var x = this.abs(); + var y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) { + r[i] = 0; + } + for (i = 0; i < y.t; ++i) { + r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); + } + r.s = 0; + r.clamp(); + if (this.s != a.s) { + BigInteger.ZERO.subTo(r, r); + } + }; + // BigInteger.prototype.squareTo = bnpSquareTo; + // (protected) r = this^2, r != this (HAC 14.16) + BigInteger.prototype.squareTo = function(r) { + var x = this.abs(); + var i = r.t = 2 * x.t; + while (--i >= 0) { + r[i] = 0; + } + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x[i], r, 2 * i, 0, 1); + if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x + .DV) { + r[i + x.t] -= x.DV; + r[i + x.t + 1] = 1; + } + } + if (r.t > 0) { + r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); + } + r.s = 0; + r.clamp(); + }; + // BigInteger.prototype.divRemTo = bnpDivRemTo; + // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) + // r != q, this != m. q or r may be null. + BigInteger.prototype.divRemTo = function(m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) { + return; + } + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) { + q.fromInt(0); + } + if (r != null) { + this.copyTo(r); + } + return; + } + if (r == null) { + r = nbi(); + } + var y = nbi(); + var ts = this.s; + var ms = m.s; + var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y[ys - 1]; + if (y0 == 0) { + return; + } + var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt; + var d2 = (1 << this.F1) / yt; + var e = 1 << this.F2; + var i = r.t; + var j = i - ys; + var t = (q == null) ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r[r.t++] = 1; + r.subTo(t, r); + } + BigInteger.ONE.dlShiftTo(ys, t); + t.subTo(y, y); // "negative" y so we can replace sub with am later + while (y.t < ys) { + y[y.t++] = 0; + } + while (--j >= 0) { + // Estimate quotient digit + var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r[i] < --qd) { + r.subTo(t, r); + } + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) { + BigInteger.ZERO.subTo(q, q); + } + } + r.t = ys; + r.clamp(); + if (nsh > 0) { + r.rShiftTo(nsh, r); + } // Denormalize remainder + if (ts < 0) { + BigInteger.ZERO.subTo(r, r); + } + }; + // BigInteger.prototype.invDigit = bnpInvDigit; + // (protected) return "-1/this % 2^DB"; useful for Mont. reduction + // justification: + // xy == 1 (mod m) + // xy = 1+km + // xy(2-xy) = (1+km)(1-km) + // x[y(2-xy)] = 1-k^2m^2 + // x[y(2-xy)] == 1 (mod m^2) + // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 + // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. + // JS multiply "overflows" differently from C/C++, so care is needed here. + BigInteger.prototype.invDigit = function() { + if (this.t < 1) { + return 0; + } + var x = this[0]; + if ((x & 1) == 0) { + return 0; + } + var y = x & 3; // y == 1/x mod 2^2 + y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 + y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 + y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return (y > 0) ? this.DV - y : -y; + }; + // BigInteger.prototype.isEven = bnpIsEven; + // (protected) true iff this is even + BigInteger.prototype.isEven = function() { + return ((this.t > 0) ? (this[0] & 1) : this.s) == 0; + }; + // BigInteger.prototype.exp = bnpExp; + // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) + BigInteger.prototype.exp = function(e, z) { + if (e > 0xffffffff || e < 1) { + return BigInteger.ONE; + } + var r = nbi(); + var r2 = nbi(); + var g = z.convert(this); + var i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & (1 << i)) > 0) { + z.mulTo(r2, g, r); + } else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); + }; + // BigInteger.prototype.chunkSize = bnpChunkSize; + // (protected) return x s.t. r^x < DV + BigInteger.prototype.chunkSize = function(r) { + return Math.floor(Math.LN2 * this.DB / Math.log(r)); + }; + // BigInteger.prototype.toRadix = bnpToRadix; + // (protected) convert to radix string + BigInteger.prototype.toRadix = function(b) { + if (b == null) { + b = 10; + } + if (this.signum() == 0 || b < 2 || b > 36) { + return "0"; + } + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a); + var y = nbi(); + var z = nbi(); + var r = ""; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; + }; + // BigInteger.prototype.fromRadix = bnpFromRadix; + // (protected) convert from radix string + BigInteger.prototype.fromRadix = function(s, b) { + this.fromInt(0); + if (b == null) { + b = 10; + } + var cs = this.chunkSize(b); + var d = Math.pow(b, cs); + var mi = false; + var j = 0; + var w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-" && this.signum() == 0) { + mi = true; + } + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) { + BigInteger.ZERO.subTo(this, this); + } + }; + // BigInteger.prototype.fromNumber = bnpFromNumber; + // (protected) alternate constructor + BigInteger.prototype.fromNumber = function(a, b, c) { + if ("number" == typeof b) { + // new BigInteger(int,int,RNG) + if (a < 2) { + this.fromInt(1); + } else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) { + // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + } + if (this.isEven()) { + this.dAddOffset(1, 0); + } // force odd + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) { + this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); + } + } + } + } else { + // new BigInteger(int,RNG) + var x = []; + var t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) { + x[0] &= ((1 << t) - 1); + } else { + x[0] = 0; + } + this.fromString(x, 256); + } + }; + // BigInteger.prototype.bitwiseTo = bnpBitwiseTo; + // (protected) r = this op a (bitwise) + BigInteger.prototype.bitwiseTo = function(a, op, r) { + var i; + var f; + var m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) { + r[i] = op(this[i], a[i]); + } + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) { + r[i] = op(this[i], f); + } + r.t = this.t; + } else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) { + r[i] = op(f, a[i]); + } + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + }; + // BigInteger.prototype.changeBit = bnpChangeBit; + // (protected) this op (1<>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } else { + c += this.s; + while (i < a.t) { + c += a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = (c < 0) ? -1 : 0; + if (c > 0) { + r[i++] = c; + } else if (c < -1) { + r[i++] = this.DV + c; + } + r.t = i; + r.clamp(); + }; + // BigInteger.prototype.dMultiply = bnpDMultiply; + // (protected) this *= n, this >= 0, 1 < n < DV + BigInteger.prototype.dMultiply = function(n) { + this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + }; + // BigInteger.prototype.dAddOffset = bnpDAddOffset; + // (protected) this += n << w words, this >= 0 + BigInteger.prototype.dAddOffset = function(n, w) { + if (n == 0) { + return; + } + while (this.t <= w) { + this[this.t++] = 0; + } + this[w] += n; + while (this[w] >= this.DV) { + this[w] -= this.DV; + if (++w >= this.t) { + this[this.t++] = 0; + } + ++this[w]; + } + }; + // BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + // (protected) r = lower n words of "this * a", a.t <= n + // "this" should be the larger one if appropriate. + BigInteger.prototype.multiplyLowerTo = function(a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; // assumes a,this >= 0 + r.t = i; + while (i > 0) { + r[--i] = 0; + } + for (var j = r.t - this.t; i < j; ++i) { + r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); + } + for (var j = Math.min(a.t, n); i < j; ++i) { + this.am(0, a[i], r, i, 0, n - i); + } + r.clamp(); + }; + // BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + // (protected) r = "this * a" without lower n words, n > 0 + // "this" should be the larger one if appropriate. + BigInteger.prototype.multiplyUpperTo = function(a, n, r) { + --n; + var i = r.t = this.t + a.t - n; + r.s = 0; // assumes a,this >= 0 + while (--i >= 0) { + r[i] = 0; + } + for (i = Math.max(n - this.t, 0); i < a.t; ++i) { + r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); + } + r.clamp(); + r.drShiftTo(1, r); + }; + // BigInteger.prototype.modInt = bnpModInt; + // (protected) this % n, n < 2^26 + BigInteger.prototype.modInt = function(n) { + if (n <= 0) { + return 0; + } + var d = this.DV % n; + var r = (this.s < 0) ? n - 1 : 0; + if (this.t > 0) { + if (d == 0) { + r = this[0] % n; + } else { + for (var i = this.t - 1; i >= 0; --i) { + r = (d * r + this[i]) % n; + } + } + } + return r; + }; + // BigInteger.prototype.millerRabin = bnpMillerRabin; + // (protected) true if probably prime (HAC 4.24, Miller-Rabin) + BigInteger.prototype.millerRabin = function(t) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) { + return false; + } + var r = n1.shiftRight(k); + t = (t + 1) >> 1; + if (t > lowprimes.length) { + t = lowprimes.length; + } + var a = nbi(); + for (var i = 0; i < t; ++i) { + // Pick bases at random, instead of starting at 2 + a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger.ONE) == 0) { + return false; + } + } + if (y.compareTo(n1) != 0) { + return false; + } + } + } + return true; + }; + // BigInteger.prototype.square = bnSquare; + // (public) this^2 + BigInteger.prototype.square = function() { + var r = nbi(); + this.squareTo(r); + return r; + }; + //#region ASYNC + // Public API method + BigInteger.prototype.gcda = function(a, callback) { + var x = (this.s < 0) ? this.negate() : this.clone(); + var y = (a.s < 0) ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(); + var g = y.getLowestSetBit(); + if (g < 0) { + callback(x); + return; + } + if (i < g) { + g = i; + } + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + // Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen. + var gcda1 = function() { + if ((i = x.getLowestSetBit()) > 0) { + x.rShiftTo(i, x); + } + if ((i = y.getLowestSetBit()) > 0) { + y.rShiftTo(i, y); + } + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + if (!(x.signum() > 0)) { + if (g > 0) { + y.lShiftTo(g, y); + } + setTimeout(function() { + callback(y); + }, 0); // escape + } else { + setTimeout(gcda1, 0); + } + }; + setTimeout(gcda1, 10); + }; + // (protected) alternate constructor + BigInteger.prototype.fromNumberAsync = function(a, b, c, callback) { + if ("number" == typeof b) { + if (a < 2) { + this.fromInt(1); + } else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) { + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + } + if (this.isEven()) { + this.dAddOffset(1, 0); + } + var bnp_1 = this; + var bnpfn1_1 = function() { + bnp_1.dAddOffset(2, 0); + if (bnp_1.bitLength() > a) { + bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1); + } + if (bnp_1.isProbablePrime(b)) { + setTimeout(function() { + callback(); + }, 0); // escape + } else { + setTimeout(bnpfn1_1, 0); + } + }; + setTimeout(bnpfn1_1, 0); + } + } else { + var x = []; + var t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) { + x[0] &= ((1 << t) - 1); + } else { + x[0] = 0; + } + this.fromString(x, 256); + } + }; + return BigInteger; + }()); + //#region REDUCERS + //#region NullExp + var NullExp = /** @class */ (function() { + function NullExp() {} + // NullExp.prototype.convert = nNop; + NullExp.prototype.convert = function(x) { + return x; + }; + // NullExp.prototype.revert = nNop; + NullExp.prototype.revert = function(x) { + return x; + }; + // NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.mulTo = function(x, y, r) { + x.multiplyTo(y, r); + }; + // NullExp.prototype.sqrTo = nSqrTo; + NullExp.prototype.sqrTo = function(x, r) { + x.squareTo(r); + }; + return NullExp; + }()); + // Modular reduction using "classic" algorithm + var Classic = /** @class */ (function() { + function Classic(m) { + this.m = m; + } + // Classic.prototype.convert = cConvert; + Classic.prototype.convert = function(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) { + return x.mod(this.m); + } else { + return x; + } + }; + // Classic.prototype.revert = cRevert; + Classic.prototype.revert = function(x) { + return x; + }; + // Classic.prototype.reduce = cReduce; + Classic.prototype.reduce = function(x) { + x.divRemTo(this.m, null, x); + }; + // Classic.prototype.mulTo = cMulTo; + Classic.prototype.mulTo = function(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + }; + // Classic.prototype.sqrTo = cSqrTo; + Classic.prototype.sqrTo = function(x, r) { + x.squareTo(r); + this.reduce(r); + }; + return Classic; + }()); + //#endregion + //#region Montgomery + // Montgomery reduction + var Montgomery = /** @class */ (function() { + function Montgomery(m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 0x7fff; + this.mph = this.mp >> 15; + this.um = (1 << (m.DB - 15)) - 1; + this.mt2 = 2 * m.t; + } + // Montgomery.prototype.convert = montConvert; + // xR mod m + Montgomery.prototype.convert = function(x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) { + this.m.subTo(r, r); + } + return r; + }; + // Montgomery.prototype.revert = montRevert; + // x/R mod m + Montgomery.prototype.revert = function(x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + }; + // Montgomery.prototype.reduce = montReduce; + // x = x/R mod m (HAC 14.32) + Montgomery.prototype.reduce = function(x) { + while (x.t <= this.mt2) { + // pad x so am has enough room later + x[x.t++] = 0; + } + for (var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x[i] & 0x7fff; + var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this + .um) << 15)) & x.DM; + // use am to combine the multiply-shift-add into one call + j = i + this.m.t; + x[j] += this.m.am(0, u0, x, i, 0, this.m.t); + // propagate carry + while (x[j] >= x.DV) { + x[j] -= x.DV; + x[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) { + x.subTo(this.m, x); + } + }; + // Montgomery.prototype.mulTo = montMulTo; + // r = "xy/R mod m"; x,y != r + Montgomery.prototype.mulTo = function(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + }; + // Montgomery.prototype.sqrTo = montSqrTo; + // r = "x^2/R mod m"; x != r + Montgomery.prototype.sqrTo = function(x, r) { + x.squareTo(r); + this.reduce(r); + }; + return Montgomery; + }()); + //#endregion Montgomery + //#region Barrett + // Barrett modular reduction + var Barrett = /** @class */ (function() { + function Barrett(m) { + this.m = m; + // setup Barrett + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + } + // Barrett.prototype.convert = barrettConvert; + Barrett.prototype.convert = function(x) { + if (x.s < 0 || x.t > 2 * this.m.t) { + return x.mod(this.m); + } else if (x.compareTo(this.m) < 0) { + return x; + } else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + }; + // Barrett.prototype.revert = barrettRevert; + Barrett.prototype.revert = function(x) { + return x; + }; + // Barrett.prototype.reduce = barrettReduce; + // x = x mod m (HAC 14.42) + Barrett.prototype.reduce = function(x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) { + x.dAddOffset(1, this.m.t + 1); + } + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) { + x.subTo(this.m, x); + } + }; + // Barrett.prototype.mulTo = barrettMulTo; + // r = x*y mod m; x,y != r + Barrett.prototype.mulTo = function(x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + }; + // Barrett.prototype.sqrTo = barrettSqrTo; + // r = x^2 mod m; x != r + Barrett.prototype.sqrTo = function(x, r) { + x.squareTo(r); + this.reduce(r); + }; + return Barrett; + }()); + //#endregion + //#endregion REDUCERS + // return new, unset BigInteger + function nbi() { + return new BigInteger(null); + } + + function parseBigInt(str, r) { + return new BigInteger(str, r); + } + // am: Compute w_j += (x*this_i), propagate carries, + // c is initial carry, returns final carry. + // c < 3*dvalue, x < 2*dvalue, this_i < dvalue + // We need to select the fastest one that works in this environment. + // am1: use a single mult and divide to get the high bits, + // max digit bits should be 26 because + // max internal value = 2*dvalue^2-2*dvalue (< 2^53) + function am1(i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this[i++] + w[j] + c; + c = Math.floor(v / 0x4000000); + w[j++] = v & 0x3ffffff; + } + return c; + } + // am2 avoids a big mult-and-extract completely. + // Max digit bits should be <= 30 because we do bitwise ops + // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) + function am2(i, x, w, j, c, n) { + var xl = x & 0x7fff; + var xh = x >> 15; + while (--n >= 0) { + var l = this[i] & 0x7fff; + var h = this[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w[j++] = l & 0x3fffffff; + } + return c; + } + // Alternately, set max digit bits to 28 since some + // browsers slow down when dealing with 32-bit numbers. + function am3(i, x, w, j, c, n) { + var xl = x & 0x3fff; + var xh = x >> 14; + while (--n >= 0) { + var l = this[i] & 0x3fff; + var h = this[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w[j++] = l & 0xfffffff; + } + return c; + } + var inBrowser = typeof navigator2 !== "undefined"; + if (inBrowser && j_lm && (navigator2.appName == "Microsoft Internet Explorer")) { + BigInteger.prototype.am = am2; + dbits = 30; + } else if (inBrowser && j_lm && (navigator2.appName != "Netscape")) { + BigInteger.prototype.am = am1; + dbits = 26; + } else { // Mozilla/Netscape seems to prefer am3 + BigInteger.prototype.am = am3; + dbits = 28; + } + BigInteger.prototype.DB = dbits; + BigInteger.prototype.DM = ((1 << dbits) - 1); + BigInteger.prototype.DV = (1 << dbits); + var BI_FP = 52; + BigInteger.prototype.FV = Math.pow(2, BI_FP); + BigInteger.prototype.F1 = BI_FP - dbits; + BigInteger.prototype.F2 = 2 * dbits - BI_FP; + // Digit conversions + var BI_RC = []; + var rr; + var vv; + rr = "0".charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) { + BI_RC[rr++] = vv; + } + rr = "a".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) { + BI_RC[rr++] = vv; + } + rr = "A".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) { + BI_RC[rr++] = vv; + } + + function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return (c == null) ? -1 : c; + } + // return bigint initialized to value + function nbv(i) { + var r = nbi(); + r.fromInt(i); + return r; + } + // returns bit length of the integer x + function nbits(x) { + var r = 1; + var t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; + } + // "constants" + BigInteger.ZERO = nbv(0); + BigInteger.ONE = nbv(1); + + // prng4.js - uses Arcfour as a PRNG + var Arcfour = /** @class */ (function() { + function Arcfour() { + this.i = 0; + this.j = 0; + this.S = []; + } + // Arcfour.prototype.init = ARC4init; + // Initialize arcfour context from key, an array of ints, each from [0..255] + Arcfour.prototype.init = function(key) { + var i; + var j; + var t; + for (i = 0; i < 256; ++i) { + this.S[i] = i; + } + j = 0; + for (i = 0; i < 256; ++i) { + j = (j + this.S[i] + key[i % key.length]) & 255; + t = this.S[i]; + this.S[i] = this.S[j]; + this.S[j] = t; + } + this.i = 0; + this.j = 0; + }; + // Arcfour.prototype.next = ARC4next; + Arcfour.prototype.next = function() { + var t; + this.i = (this.i + 1) & 255; + this.j = (this.j + this.S[this.i]) & 255; + t = this.S[this.i]; + this.S[this.i] = this.S[this.j]; + this.S[this.j] = t; + return this.S[(t + this.S[this.i]) & 255]; + }; + return Arcfour; + }()); + // Plug in your RNG constructor here + function prng_newstate() { + return new Arcfour(); + } + // Pool size must be a multiple of 4 and greater than 32. + // An array of bytes the size of the pool will be passed to init() + var rng_psize = 256; + + // Random number generator - requires a PRNG backend, e.g. prng4.js + var rng_state; + var rng_pool = null; + var rng_pptr; + // Initialize the pool with junk if needed. + if (rng_pool == null) { + rng_pool = []; + rng_pptr = 0; + var t = void 0; + if (window2.crypto && window2.crypto.getRandomValues) { + // Extract entropy (2048 bits) from RNG if available + var z = new Uint32Array(256); + window2.crypto.getRandomValues(z); + for (t = 0; t < z.length; ++t) { + rng_pool[rng_pptr++] = z[t] & 255; + } + } + // Use mouse events for entropy, if we do not have enough entropy by the time + // we need it, entropy will be generated by Math.random. + var onMouseMoveListener_1 = function(ev) { + this.count = this.count || 0; + if (this.count >= 256 || rng_pptr >= rng_psize) { + if (window2.removeEventListener) { + window2.removeEventListener("mousemove", onMouseMoveListener_1, false); + } else if (window2.detachEvent) { + window2.detachEvent("onmousemove", onMouseMoveListener_1); + } + return; + } + try { + var mouseCoordinates = ev.x + ev.y; + rng_pool[rng_pptr++] = mouseCoordinates & 255; + this.count += 1; + } catch (e) { + // Sometimes Firefox will deny permission to access event properties for some reason. Ignore. + } + }; + if (window2.addEventListener) { + window2.addEventListener("mousemove", onMouseMoveListener_1, false); + } else if (window2.attachEvent) { + window2.attachEvent("onmousemove", onMouseMoveListener_1); + } + } + + function rng_get_byte() { + if (rng_state == null) { + rng_state = prng_newstate(); + // At this point, we may not have collected enough entropy. If not, fall back to Math.random + while (rng_pptr < rng_psize) { + var random = Math.floor(65536 * Math.random()); + rng_pool[rng_pptr++] = random & 255; + } + rng_state.init(rng_pool); + for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) { + rng_pool[rng_pptr] = 0; + } + rng_pptr = 0; + } + // TODO: allow reseeding after first request + return rng_state.next(); + } + var SecureRandom = /** @class */ (function() { + function SecureRandom() {} + SecureRandom.prototype.nextBytes = function(ba) { + for (var i = 0; i < ba.length; ++i) { + ba[i] = rng_get_byte(); + } + }; + return SecureRandom; + }()); + + // Depends on jsbn.js and rng.js + // function linebrk(s,n) { + // var ret = ""; + // var i = 0; + // while(i + n < s.length) { + // ret += s.substring(i,i+n) + "\n"; + // i += n; + // } + // return ret + s.substring(i,s.length); + // } + // function byte2Hex(b) { + // if(b < 0x10) + // return "0" + b.toString(16); + // else + // return b.toString(16); + // } + function pkcs1pad1(s, n) { + if (n < s.length + 22) { + console.error("Message too long for RSA"); + return null; + } + var len = n - s.length - 6; + var filler = ""; + for (var f = 0; f < len; f += 2) { + filler += "ff"; + } + var m = "0001" + filler + "00" + s; + return parseBigInt(m, 16); + } + // PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint + function pkcs1pad2(s, n) { + if (n < s.length + 11) { // TODO: fix for utf-8 + console.error("Message too long for RSA"); + return null; + } + var ba = []; + var i = s.length - 1; + while (i >= 0 && n > 0) { + var c = s.charCodeAt(i--); + if (c < 128) { // encode using utf-8 + ba[--n] = c; + } else if ((c > 127) && (c < 2048)) { + ba[--n] = (c & 63) | 128; + ba[--n] = (c >> 6) | 192; + } else { + ba[--n] = (c & 63) | 128; + ba[--n] = ((c >> 6) & 63) | 128; + ba[--n] = (c >> 12) | 224; + } + } + ba[--n] = 0; + var rng = new SecureRandom(); + var x = []; + while (n > 2) { // random non-zero pad + x[0] = 0; + while (x[0] == 0) { + rng.nextBytes(x); + } + ba[--n] = x[0]; + } + ba[--n] = 2; + ba[--n] = 0; + return new BigInteger(ba); + } + // "empty" RSA key constructor + var RSAKey = /** @class */ (function() { + function RSAKey() { + this.n = null; + this.e = 0; + this.d = null; + this.p = null; + this.q = null; + this.dmp1 = null; + this.dmq1 = null; + this.coeff = null; + } + //#region PROTECTED + // protected + // RSAKey.prototype.doPublic = RSADoPublic; + // Perform raw public operation on "x": return x^e (mod n) + RSAKey.prototype.doPublic = function(x) { + return x.modPowInt(this.e, this.n); + }; + // RSAKey.prototype.doPrivate = RSADoPrivate; + // Perform raw private operation on "x": return x^d (mod n) + RSAKey.prototype.doPrivate = function(x) { + if (this.p == null || this.q == null) { + return x.modPow(this.d, this.n); + } + // TODO: re-calculate any missing CRT params + var xp = x.mod(this.p).modPow(this.dmp1, this.p); + var xq = x.mod(this.q).modPow(this.dmq1, this.q); + while (xp.compareTo(xq) < 0) { + xp = xp.add(this.p); + } + return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq); + }; + //#endregion PROTECTED + //#region PUBLIC + // RSAKey.prototype.setPublic = RSASetPublic; + // Set the public key fields N and e from hex strings + RSAKey.prototype.setPublic = function(N, E) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16); + this.e = parseInt(E, 16); + } else { + console.error("Invalid RSA public key"); + } + }; + // RSAKey.prototype.encrypt = RSAEncrypt; + // Return the PKCS#1 RSA encryption of "text" as an even-length hex string + RSAKey.prototype.encrypt = function(text) { + var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3); + if (m == null) { + return null; + } + var c = this.doPublic(m); + if (c == null) { + return null; + } + var h = c.toString(16); + if ((h.length & 1) == 0) { + return h; + } else { + return "0" + h; + } + }; + // RSAKey.prototype.setPrivate = RSASetPrivate; + // Set the private key fields N, e, and d from hex strings + RSAKey.prototype.setPrivate = function(N, E, D) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16); + this.e = parseInt(E, 16); + this.d = parseBigInt(D, 16); + } else { + console.error("Invalid RSA private key"); + } + }; + // RSAKey.prototype.setPrivateEx = RSASetPrivateEx; + // Set the private key fields N, e, d and CRT params from hex strings + RSAKey.prototype.setPrivateEx = function(N, E, D, P, Q, DP, DQ, C) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16); + this.e = parseInt(E, 16); + this.d = parseBigInt(D, 16); + this.p = parseBigInt(P, 16); + this.q = parseBigInt(Q, 16); + this.dmp1 = parseBigInt(DP, 16); + this.dmq1 = parseBigInt(DQ, 16); + this.coeff = parseBigInt(C, 16); + } else { + console.error("Invalid RSA private key"); + } + }; + // RSAKey.prototype.generate = RSAGenerate; + // Generate a new random private key B bits long, using public expt E + RSAKey.prototype.generate = function(B, E) { + var rng = new SecureRandom(); + var qs = B >> 1; + this.e = parseInt(E, 16); + var ee = new BigInteger(E, 16); + for (;;) { + for (;;) { + this.p = new BigInteger(B - qs, 1, rng); + if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == + 0 && this.p.isProbablePrime(10)) { + break; + } + } + for (;;) { + this.q = new BigInteger(qs, 1, rng); + if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == + 0 && this.q.isProbablePrime(10)) { + break; + } + } + if (this.p.compareTo(this.q) <= 0) { + var t = this.p; + this.p = this.q; + this.q = t; + } + var p1 = this.p.subtract(BigInteger.ONE); + var q1 = this.q.subtract(BigInteger.ONE); + var phi = p1.multiply(q1); + if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) { + this.n = this.p.multiply(this.q); + this.d = ee.modInverse(phi); + this.dmp1 = this.d.mod(p1); + this.dmq1 = this.d.mod(q1); + this.coeff = this.q.modInverse(this.p); + break; + } + } + }; + // RSAKey.prototype.decrypt = RSADecrypt; + // Return the PKCS#1 RSA decryption of "ctext". + // "ctext" is an even-length hex string and the output is a plain string. + RSAKey.prototype.decrypt = function(ctext) { + var c = parseBigInt(ctext, 16); + var m = this.doPrivate(c); + if (m == null) { + return null; + } + return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3); + }; + // Generate a new random private key B bits long, using public expt E + RSAKey.prototype.generateAsync = function(B, E, callback) { + var rng = new SecureRandom(); + var qs = B >> 1; + this.e = parseInt(E, 16); + var ee = new BigInteger(E, 16); + var rsa = this; + // These functions have non-descript names because they were originally for(;;) loops. + // I don't know about cryptography to give them better names than loop1-4. + var loop1 = function() { + var loop4 = function() { + if (rsa.p.compareTo(rsa.q) <= 0) { + var t = rsa.p; + rsa.p = rsa.q; + rsa.q = t; + } + var p1 = rsa.p.subtract(BigInteger.ONE); + var q1 = rsa.q.subtract(BigInteger.ONE); + var phi = p1.multiply(q1); + if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) { + rsa.n = rsa.p.multiply(rsa.q); + rsa.d = ee.modInverse(phi); + rsa.dmp1 = rsa.d.mod(p1); + rsa.dmq1 = rsa.d.mod(q1); + rsa.coeff = rsa.q.modInverse(rsa.p); + setTimeout(function() { + callback(); + }, 0); // escape + } else { + setTimeout(loop1, 0); + } + }; + var loop3 = function() { + rsa.q = nbi(); + rsa.q.fromNumberAsync(qs, 1, rng, function() { + rsa.q.subtract(BigInteger.ONE).gcda(ee, function(r) { + if (r.compareTo(BigInteger.ONE) == 0 && rsa + .q.isProbablePrime(10)) { + setTimeout(loop4, 0); + } else { + setTimeout(loop3, 0); + } + }); + }); + }; + var loop2 = function() { + rsa.p = nbi(); + rsa.p.fromNumberAsync(B - qs, 1, rng, function() { + rsa.p.subtract(BigInteger.ONE).gcda(ee, function(r) { + if (r.compareTo(BigInteger.ONE) == 0 && rsa + .p.isProbablePrime(10)) { + setTimeout(loop3, 0); + } else { + setTimeout(loop2, 0); + } + }); + }); + }; + setTimeout(loop2, 0); + }; + setTimeout(loop1, 0); + }; + RSAKey.prototype.sign = function(text, digestMethod, digestName) { + var header = getDigestHeader(digestName); + var digest = header + digestMethod(text).toString(); + var m = pkcs1pad1(digest, this.n.bitLength() / 4); + if (m == null) { + return null; + } + var c = this.doPrivate(m); + if (c == null) { + return null; + } + var h = c.toString(16); + if ((h.length & 1) == 0) { + return h; + } else { + return "0" + h; + } + }; + RSAKey.prototype.verify = function(text, signature, digestMethod) { + var c = parseBigInt(signature, 16); + var m = this.doPublic(c); + if (m == null) { + return null; + } + var unpadded = m.toString(16).replace(/^1f+00/, ""); + var digest = removeDigestHeader(unpadded); + return digest == digestMethod(text).toString(); + }; + return RSAKey; + }()); + // Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext + function pkcs1unpad2(d, n) { + var b = d.toByteArray(); + var i = 0; + while (i < b.length && b[i] == 0) { + ++i; + } + if (b.length - i != n - 1 || b[i] != 2) { + return null; + } + ++i; + while (b[i] != 0) { + if (++i >= b.length) { + return null; + } + } + var ret = ""; + while (++i < b.length) { + var c = b[i] & 255; + if (c < 128) { // utf-8 decode + ret += String.fromCharCode(c); + } else if ((c > 191) && (c < 224)) { + ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63)); + ++i; + } else { + ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63)); + i += 2; + } + } + return ret; + } + // https://tools.ietf.org/html/rfc3447#page-43 + var DIGEST_HEADERS = { + md2: "3020300c06082a864886f70d020205000410", + md5: "3020300c06082a864886f70d020505000410", + sha1: "3021300906052b0e03021a05000414", + sha224: "302d300d06096086480165030402040500041c", + sha256: "3031300d060960864801650304020105000420", + sha384: "3041300d060960864801650304020205000430", + sha512: "3051300d060960864801650304020305000440", + ripemd160: "3021300906052b2403020105000414", + }; + + function getDigestHeader(name) { + return DIGEST_HEADERS[name] || ""; + } + + function removeDigestHeader(str) { + for (var name_1 in DIGEST_HEADERS) { + if (DIGEST_HEADERS.hasOwnProperty(name_1)) { + var header = DIGEST_HEADERS[name_1]; + var len = header.length; + if (str.substr(0, len) == header) { + return str.substr(len); + } + } + } + return str; + } + // Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string + // function RSAEncryptB64(text) { + // var h = this.encrypt(text); + // if(h) return hex2b64(h); else return null; + // } + // public + // RSAKey.prototype.encrypt_b64 = RSAEncryptB64; + + /*! + Copyright (c) 2011, Yahoo! Inc. All rights reserved. + Code licensed under the BSD License: + http://developer.yahoo.com/yui/license.html + version: 2.9.0 + */ + var YAHOO = {}; + YAHOO.lang = { + /** + * Utility to set up the prototype, constructor and superclass properties to + * support an inheritance strategy that can chain constructors and methods. + * Static members will not be inherited. + * + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function(subc, superc, overrides) { + if (!superc || !subc) { + throw new Error("YAHOO.lang.extend failed, please check that " + + "all dependencies are included."); + } + + var F = function() {}; + F.prototype = superc.prototype; + subc.prototype = new F(); + subc.prototype.constructor = subc; + subc.superclass = superc.prototype; + + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor = superc; + } + + if (overrides) { + var i; + for (i in overrides) { + subc.prototype[i] = overrides[i]; + } + + /* + * IE will not enumerate native functions in a derived object even if the + * function was overridden. This is a workaround for specific functions + * we care about on the Object prototype. + * @property _IEEnumFix + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @static + * @private + */ + var _IEEnumFix = function() {}, + ADD = ["toString", "valueOf"]; + try { + if (/MSIE/.test(navigator2.userAgent)) { + _IEEnumFix = function(r, s) { + for (i = 0; i < ADD.length; i = i + 1) { + var fname = ADD[i], + f = s[fname]; + if (typeof f === 'function' && f != Object.prototype[fname]) { + r[fname] = f; + } + } + }; + } + } catch (ex) {} + _IEEnumFix(subc.prototype, overrides); + } + } + }; + + /* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + + /** + * @fileOverview + * @name asn1-1.0.js + * @author Kenji Urushima kenji.urushima@gmail.com + * @version asn1 1.0.13 (2017-Jun-02) + * @since jsrsasign 2.1 + * @license MIT License + */ + + /** + * kjur's class library name space + *

+ * This name space provides following name spaces: + *

    + *
  • {@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder
  • + *
  • {@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL
  • + *
  • {@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature + * class and utilities
  • + *
+ *

+ * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2. + * @name KJUR + * @namespace kjur's class library name space + */ + var KJUR = {}; + + /** + * kjur's ASN.1 class library name space + *

+ * This is ITU-T X.690 ASN.1 DER encoder class library and + * class structure and methods is very similar to + * org.bouncycastle.asn1 package of + * well known BouncyCaslte Cryptography Library. + *

PROVIDING ASN.1 PRIMITIVES

+ * Here are ASN.1 DER primitive classes. + *
    + *
  • 0x01 {@link KJUR.asn1.DERBoolean}
  • + *
  • 0x02 {@link KJUR.asn1.DERInteger}
  • + *
  • 0x03 {@link KJUR.asn1.DERBitString}
  • + *
  • 0x04 {@link KJUR.asn1.DEROctetString}
  • + *
  • 0x05 {@link KJUR.asn1.DERNull}
  • + *
  • 0x06 {@link KJUR.asn1.DERObjectIdentifier}
  • + *
  • 0x0a {@link KJUR.asn1.DEREnumerated}
  • + *
  • 0x0c {@link KJUR.asn1.DERUTF8String}
  • + *
  • 0x12 {@link KJUR.asn1.DERNumericString}
  • + *
  • 0x13 {@link KJUR.asn1.DERPrintableString}
  • + *
  • 0x14 {@link KJUR.asn1.DERTeletexString}
  • + *
  • 0x16 {@link KJUR.asn1.DERIA5String}
  • + *
  • 0x17 {@link KJUR.asn1.DERUTCTime}
  • + *
  • 0x18 {@link KJUR.asn1.DERGeneralizedTime}
  • + *
  • 0x30 {@link KJUR.asn1.DERSequence}
  • + *
  • 0x31 {@link KJUR.asn1.DERSet}
  • + *
+ *

OTHER ASN.1 CLASSES

+ *
    + *
  • {@link KJUR.asn1.ASN1Object}
  • + *
  • {@link KJUR.asn1.DERAbstractString}
  • + *
  • {@link KJUR.asn1.DERAbstractTime}
  • + *
  • {@link KJUR.asn1.DERAbstractStructured}
  • + *
  • {@link KJUR.asn1.DERTaggedObject}
  • + *
+ *

SUB NAME SPACES

+ *
    + *
  • {@link KJUR.asn1.cades} - CAdES long term signature format
  • + *
  • {@link KJUR.asn1.cms} - Cryptographic Message Syntax
  • + *
  • {@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)
  • + *
  • {@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format
  • + *
  • {@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL
  • + *
+ *

+ * NOTE: Please ignore method summary and document of this namespace. + * This caused by a bug of jsdoc2. + * @name KJUR.asn1 + * @namespace + */ + if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {}; + + /** + * ASN1 utilities class + * @name KJUR.asn1.ASN1Util + * @class ASN1 utilities class + * @since asn1 1.0.2 + */ + KJUR.asn1.ASN1Util = new function() { + this.integerToByteHex = function(i) { + var h = i.toString(16); + if ((h.length % 2) == 1) h = '0' + h; + return h; + }; + this.bigIntToMinTwosComplementsHex = function(bigIntegerValue) { + var h = bigIntegerValue.toString(16); + if (h.substr(0, 1) != '-') { + if (h.length % 2 == 1) { + h = '0' + h; + } else { + if (!h.match(/^[0-7]/)) { + h = '00' + h; + } + } + } else { + var hPos = h.substr(1); + var xorLen = hPos.length; + if (xorLen % 2 == 1) { + xorLen += 1; + } else { + if (!h.match(/^[0-7]/)) { + xorLen += 2; + } + } + var hMask = ''; + for (var i = 0; i < xorLen; i++) { + hMask += 'f'; + } + var biMask = new BigInteger(hMask, 16); + var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE); + h = biNeg.toString(16).replace(/^-/, ''); + } + return h; + }; + /** + * get PEM string from hexadecimal data and header string + * @name getPEMStringFromHex + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {String} dataHex hexadecimal string of PEM body + * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY') + * @return {String} PEM formatted string of input data + * @description + * This method converts a hexadecimal string to a PEM string with + * a specified header. Its line break will be CRLF("\r\n"). + * @example + * var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY'); + * // value of pem will be: + * -----BEGIN PRIVATE KEY----- + * YWFh + * -----END PRIVATE KEY----- + */ + this.getPEMStringFromHex = function(dataHex, pemHeader) { + return hextopem(dataHex, pemHeader); + }; + + /** + * generate ASN1Object specifed by JSON parameters + * @name newObject + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {Array} param JSON parameter to generate ASN1Object + * @return {KJUR.asn1.ASN1Object} generated object + * @since asn1 1.0.3 + * @description + * generate any ASN1Object specified by JSON param + * including ASN.1 primitive or structured. + * Generally 'param' can be described as follows: + *
+ * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER} + *
+ * 'TYPE-OF-ASN1OBJ' can be one of following symbols: + *
    + *
  • 'bool' - DERBoolean
  • + *
  • 'int' - DERInteger
  • + *
  • 'bitstr' - DERBitString
  • + *
  • 'octstr' - DEROctetString
  • + *
  • 'null' - DERNull
  • + *
  • 'oid' - DERObjectIdentifier
  • + *
  • 'enum' - DEREnumerated
  • + *
  • 'utf8str' - DERUTF8String
  • + *
  • 'numstr' - DERNumericString
  • + *
  • 'prnstr' - DERPrintableString
  • + *
  • 'telstr' - DERTeletexString
  • + *
  • 'ia5str' - DERIA5String
  • + *
  • 'utctime' - DERUTCTime
  • + *
  • 'gentime' - DERGeneralizedTime
  • + *
  • 'seq' - DERSequence
  • + *
  • 'set' - DERSet
  • + *
  • 'tag' - DERTaggedObject
  • + *
+ * @example + * newObject({'prnstr': 'aaa'}); + * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]}) + * // ASN.1 Tagged Object + * newObject({'tag': {'tag': 'a1', + * 'explicit': true, + * 'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}}); + * // more simple representation of ASN.1 Tagged Object + * newObject({'tag': ['a1', + * true, + * {'seq': [ + * {'int': 3}, + * {'prnstr': 'aaa'}]} + * ]}); + */ + this.newObject = function(param) { + var _KJUR = KJUR, + _KJUR_asn1 = _KJUR.asn1, + _DERBoolean = _KJUR_asn1.DERBoolean, + _DERInteger = _KJUR_asn1.DERInteger, + _DERBitString = _KJUR_asn1.DERBitString, + _DEROctetString = _KJUR_asn1.DEROctetString, + _DERNull = _KJUR_asn1.DERNull, + _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier, + _DEREnumerated = _KJUR_asn1.DEREnumerated, + _DERUTF8String = _KJUR_asn1.DERUTF8String, + _DERNumericString = _KJUR_asn1.DERNumericString, + _DERPrintableString = _KJUR_asn1.DERPrintableString, + _DERTeletexString = _KJUR_asn1.DERTeletexString, + _DERIA5String = _KJUR_asn1.DERIA5String, + _DERUTCTime = _KJUR_asn1.DERUTCTime, + _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime, + _DERSequence = _KJUR_asn1.DERSequence, + _DERSet = _KJUR_asn1.DERSet, + _DERTaggedObject = _KJUR_asn1.DERTaggedObject, + _newObject = _KJUR_asn1.ASN1Util.newObject; + + var keys = Object.keys(param); + if (keys.length != 1) + throw "key of param shall be only one."; + var key = keys[0]; + + if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:" + .indexOf(":" + key + ":") == -1) + throw "undefined key: " + key; + + if (key == "bool") return new _DERBoolean(param[key]); + if (key == "int") return new _DERInteger(param[key]); + if (key == "bitstr") return new _DERBitString(param[key]); + if (key == "octstr") return new _DEROctetString(param[key]); + if (key == "null") return new _DERNull(param[key]); + if (key == "oid") return new _DERObjectIdentifier(param[key]); + if (key == "enum") return new _DEREnumerated(param[key]); + if (key == "utf8str") return new _DERUTF8String(param[key]); + if (key == "numstr") return new _DERNumericString(param[key]); + if (key == "prnstr") return new _DERPrintableString(param[key]); + if (key == "telstr") return new _DERTeletexString(param[key]); + if (key == "ia5str") return new _DERIA5String(param[key]); + if (key == "utctime") return new _DERUTCTime(param[key]); + if (key == "gentime") return new _DERGeneralizedTime(param[key]); + + if (key == "seq") { + var paramList = param[key]; + var a = []; + for (var i = 0; i < paramList.length; i++) { + var asn1Obj = _newObject(paramList[i]); + a.push(asn1Obj); + } + return new _DERSequence({ + 'array': a + }); + } + + if (key == "set") { + var paramList = param[key]; + var a = []; + for (var i = 0; i < paramList.length; i++) { + var asn1Obj = _newObject(paramList[i]); + a.push(asn1Obj); + } + return new _DERSet({ + 'array': a + }); + } + + if (key == "tag") { + var tagParam = param[key]; + if (Object.prototype.toString.call(tagParam) === '[object Array]' && + tagParam.length == 3) { + var obj = _newObject(tagParam[2]); + return new _DERTaggedObject({ + tag: tagParam[0], + explicit: tagParam[1], + obj: obj + }); + } else { + var newParam = {}; + if (tagParam.explicit !== undefined) + newParam.explicit = tagParam.explicit; + if (tagParam.tag !== undefined) + newParam.tag = tagParam.tag; + if (tagParam.obj === undefined) + throw "obj shall be specified for 'tag'."; + newParam.obj = _newObject(tagParam.obj); + return new _DERTaggedObject(newParam); + } + } + }; + + /** + * get encoded hexadecimal string of ASN1Object specifed by JSON parameters + * @name jsonToASN1HEX + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {Array} param JSON parameter to generate ASN1Object + * @return hexadecimal string of ASN1Object + * @since asn1 1.0.4 + * @description + * As for ASN.1 object representation of JSON object, + * please see {@link newObject}. + * @example + * jsonToASN1HEX({'prnstr': 'aaa'}); + */ + this.jsonToASN1HEX = function(param) { + var asn1Obj = this.newObject(param); + return asn1Obj.getEncodedHex(); + }; + }; + + /** + * get dot noted oid number string from hexadecimal value of OID + * @name oidHexToInt + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {String} hex hexadecimal value of object identifier + * @return {String} dot noted string of object identifier + * @since jsrsasign 4.8.3 asn1 1.0.7 + * @description + * This static method converts from hexadecimal string representation of + * ASN.1 value of object identifier to oid number string. + * @example + * KJUR.asn1.ASN1Util.oidHexToInt('550406') → "2.5.4.6" + */ + KJUR.asn1.ASN1Util.oidHexToInt = function(hex) { + var s = ""; + var i01 = parseInt(hex.substr(0, 2), 16); + var i0 = Math.floor(i01 / 40); + var i1 = i01 % 40; + var s = i0 + "." + i1; + + var binbuf = ""; + for (var i = 2; i < hex.length; i += 2) { + var value = parseInt(hex.substr(i, 2), 16); + var bin = ("00000000" + value.toString(2)).slice(-8); + binbuf = binbuf + bin.substr(1, 7); + if (bin.substr(0, 1) == "0") { + var bi = new BigInteger(binbuf, 2); + s = s + "." + bi.toString(10); + binbuf = ""; + } + } + return s; + }; + + /** + * get hexadecimal value of object identifier from dot noted oid value + * @name oidIntToHex + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {String} oidString dot noted string of object identifier + * @return {String} hexadecimal value of object identifier + * @since jsrsasign 4.8.3 asn1 1.0.7 + * @description + * This static method converts from object identifier value string. + * to hexadecimal string representation of it. + * @example + * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") → "550406" + */ + KJUR.asn1.ASN1Util.oidIntToHex = function(oidString) { + var itox = function(i) { + var h = i.toString(16); + if (h.length == 1) h = '0' + h; + return h; + }; + + var roidtox = function(roid) { + var h = ''; + var bi = new BigInteger(roid, 10); + var b = bi.toString(2); + var padLen = 7 - b.length % 7; + if (padLen == 7) padLen = 0; + var bPad = ''; + for (var i = 0; i < padLen; i++) bPad += '0'; + b = bPad + b; + for (var i = 0; i < b.length - 1; i += 7) { + var b8 = b.substr(i, 7); + if (i != b.length - 7) b8 = '1' + b8; + h += itox(parseInt(b8, 2)); + } + return h; + }; + + if (!oidString.match(/^[0-9.]+$/)) { + throw "malformed oid string: " + oidString; + } + var h = ''; + var a = oidString.split('.'); + var i0 = parseInt(a[0]) * 40 + parseInt(a[1]); + h += itox(i0); + a.splice(0, 2); + for (var i = 0; i < a.length; i++) { + h += roidtox(a[i]); + } + return h; + }; + + + // ******************************************************************** + // Abstract ASN.1 Classes + // ******************************************************************** + + // ******************************************************************** + + /** + * base class for ASN.1 DER encoder object + * @name KJUR.asn1.ASN1Object + * @class base class for ASN.1 DER encoder object + * @property {Boolean} isModified flag whether internal data was changed + * @property {String} hTLV hexadecimal string of ASN.1 TLV + * @property {String} hT hexadecimal string of ASN.1 TLV tag(T) + * @property {String} hL hexadecimal string of ASN.1 TLV length(L) + * @property {String} hV hexadecimal string of ASN.1 TLV value(V) + * @description + */ + KJUR.asn1.ASN1Object = function() { + var hV = ''; + + /** + * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V) + * @name getLengthHexFromValue + * @memberOf KJUR.asn1.ASN1Object# + * @function + * @return {String} hexadecimal string of ASN.1 TLV length(L) + */ + this.getLengthHexFromValue = function() { + if (typeof this.hV == "undefined" || this.hV == null) { + throw "this.hV is null or undefined."; + } + if (this.hV.length % 2 == 1) { + throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV; + } + var n = this.hV.length / 2; + var hN = n.toString(16); + if (hN.length % 2 == 1) { + hN = "0" + hN; + } + if (n < 128) { + return hN; + } else { + var hNlen = hN.length / 2; + if (hNlen > 15) { + throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16); + } + var head = 128 + hNlen; + return head.toString(16) + hN; + } + }; + + /** + * get hexadecimal string of ASN.1 TLV bytes + * @name getEncodedHex + * @memberOf KJUR.asn1.ASN1Object# + * @function + * @return {String} hexadecimal string of ASN.1 TLV + */ + this.getEncodedHex = function() { + if (this.hTLV == null || this.isModified) { + this.hV = this.getFreshValueHex(); + this.hL = this.getLengthHexFromValue(); + this.hTLV = this.hT + this.hL + this.hV; + this.isModified = false; + //alert("first time: " + this.hTLV); + } + return this.hTLV; + }; + + /** + * get hexadecimal string of ASN.1 TLV value(V) bytes + * @name getValueHex + * @memberOf KJUR.asn1.ASN1Object# + * @function + * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes + */ + this.getValueHex = function() { + this.getEncodedHex(); + return this.hV; + }; + + this.getFreshValueHex = function() { + return ''; + }; + }; + + // == BEGIN DERAbstractString ================================================ + /** + * base class for ASN.1 DER string classes + * @name KJUR.asn1.DERAbstractString + * @class base class for ASN.1 DER string classes + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @property {String} s internal string of value + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • str - specify initial ASN.1 value(V) by a string
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERAbstractString = function(params) { + KJUR.asn1.DERAbstractString.superclass.constructor.call(this); + + /** + * get string value of this string object + * @name getString + * @memberOf KJUR.asn1.DERAbstractString# + * @function + * @return {String} string value of this string object + */ + this.getString = function() { + return this.s; + }; + + /** + * set value by a string + * @name setString + * @memberOf KJUR.asn1.DERAbstractString# + * @function + * @param {String} newS value by a string to set + */ + this.setString = function(newS) { + this.hTLV = null; + this.isModified = true; + this.s = newS; + this.hV = stohex(this.s); + }; + + /** + * set value by a hexadecimal string + * @name setStringHex + * @memberOf KJUR.asn1.DERAbstractString# + * @function + * @param {String} newHexString value by a hexadecimal string to set + */ + this.setStringHex = function(newHexString) { + this.hTLV = null; + this.isModified = true; + this.s = null; + this.hV = newHexString; + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params == "string") { + this.setString(params); + } else if (typeof params['str'] != "undefined") { + this.setString(params['str']); + } else if (typeof params['hex'] != "undefined") { + this.setStringHex(params['hex']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object); + // == END DERAbstractString ================================================ + + // == BEGIN DERAbstractTime ================================================== + /** + * base class for ASN.1 DER Generalized/UTCTime class + * @name KJUR.asn1.DERAbstractTime + * @class base class for ASN.1 DER Generalized/UTCTime class + * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'}) + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERAbstractTime = function(params) { + KJUR.asn1.DERAbstractTime.superclass.constructor.call(this); + + // --- PRIVATE METHODS -------------------- + this.localDateToUTC = function(d) { + utc = d.getTime() + (d.getTimezoneOffset() * 60000); + var utcDate = new Date(utc); + return utcDate; + }; + + /* + * format date string by Data object + * @name formatDate + * @memberOf KJUR.asn1.AbstractTime; + * @param {Date} dateObject + * @param {string} type 'utc' or 'gen' + * @param {boolean} withMillis flag for with millisections or not + * @description + * 'withMillis' flag is supported from asn1 1.0.6. + */ + this.formatDate = function(dateObject, type, withMillis) { + var pad = this.zeroPadding; + var d = this.localDateToUTC(dateObject); + var year = String(d.getFullYear()); + if (type == 'utc') year = year.substr(2, 2); + var month = pad(String(d.getMonth() + 1), 2); + var day = pad(String(d.getDate()), 2); + var hour = pad(String(d.getHours()), 2); + var min = pad(String(d.getMinutes()), 2); + var sec = pad(String(d.getSeconds()), 2); + var s = year + month + day + hour + min + sec; + if (withMillis === true) { + var millis = d.getMilliseconds(); + if (millis != 0) { + var sMillis = pad(String(millis), 3); + sMillis = sMillis.replace(/[0]+$/, ""); + s = s + "." + sMillis; + } + } + return s + "Z"; + }; + + this.zeroPadding = function(s, len) { + if (s.length >= len) return s; + return new Array(len - s.length + 1).join('0') + s; + }; + + // --- PUBLIC METHODS -------------------- + /** + * get string value of this string object + * @name getString + * @memberOf KJUR.asn1.DERAbstractTime# + * @function + * @return {String} string value of this time object + */ + this.getString = function() { + return this.s; + }; + + /** + * set value by a string + * @name setString + * @memberOf KJUR.asn1.DERAbstractTime# + * @function + * @param {String} newS value by a string to set such like "130430235959Z" + */ + this.setString = function(newS) { + this.hTLV = null; + this.isModified = true; + this.s = newS; + this.hV = stohex(newS); + }; + + /** + * set value by a Date object + * @name setByDateValue + * @memberOf KJUR.asn1.DERAbstractTime# + * @function + * @param {Integer} year year of date (ex. 2013) + * @param {Integer} month month of date between 1 and 12 (ex. 12) + * @param {Integer} day day of month + * @param {Integer} hour hours of date + * @param {Integer} min minutes of date + * @param {Integer} sec seconds of date + */ + this.setByDateValue = function(year, month, day, hour, min, sec) { + var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0)); + this.setByDate(dateObject); + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + }; + YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object); + // == END DERAbstractTime ================================================== + + // == BEGIN DERAbstractStructured ============================================ + /** + * base class for ASN.1 DER structured class + * @name KJUR.asn1.DERAbstractStructured + * @class base class for ASN.1 DER structured class + * @property {Array} asn1Array internal array of ASN1Object + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERAbstractStructured = function(params) { + KJUR.asn1.DERAbstractString.superclass.constructor.call(this); + + /** + * set value by array of ASN1Object + * @name setByASN1ObjectArray + * @memberOf KJUR.asn1.DERAbstractStructured# + * @function + * @param {array} asn1ObjectArray array of ASN1Object to set + */ + this.setByASN1ObjectArray = function(asn1ObjectArray) { + this.hTLV = null; + this.isModified = true; + this.asn1Array = asn1ObjectArray; + }; + + /** + * append an ASN1Object to internal array + * @name appendASN1Object + * @memberOf KJUR.asn1.DERAbstractStructured# + * @function + * @param {ASN1Object} asn1Object to add + */ + this.appendASN1Object = function(asn1Object) { + this.hTLV = null; + this.isModified = true; + this.asn1Array.push(asn1Object); + }; + + this.asn1Array = new Array(); + if (typeof params != "undefined") { + if (typeof params['array'] != "undefined") { + this.asn1Array = params['array']; + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object); + + + // ******************************************************************** + // ASN.1 Object Classes + // ******************************************************************** + + // ******************************************************************** + /** + * class for ASN.1 DER Boolean + * @name KJUR.asn1.DERBoolean + * @class class for ASN.1 DER Boolean + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERBoolean = function() { + KJUR.asn1.DERBoolean.superclass.constructor.call(this); + this.hT = "01"; + this.hTLV = "0101ff"; + }; + YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER Integer + * @name KJUR.asn1.DERInteger + * @class class for ASN.1 DER Integer + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • int - specify initial ASN.1 value(V) by integer value
  • + *
  • bigint - specify initial ASN.1 value(V) by BigInteger object
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERInteger = function(params) { + KJUR.asn1.DERInteger.superclass.constructor.call(this); + this.hT = "02"; + + /** + * set value by Tom Wu's BigInteger object + * @name setByBigInteger + * @memberOf KJUR.asn1.DERInteger# + * @function + * @param {BigInteger} bigIntegerValue to set + */ + this.setByBigInteger = function(bigIntegerValue) { + this.hTLV = null; + this.isModified = true; + this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue); + }; + + /** + * set value by integer value + * @name setByInteger + * @memberOf KJUR.asn1.DERInteger + * @function + * @param {Integer} integer value to set + */ + this.setByInteger = function(intValue) { + var bi = new BigInteger(String(intValue), 10); + this.setByBigInteger(bi); + }; + + /** + * set value by integer value + * @name setValueHex + * @memberOf KJUR.asn1.DERInteger# + * @function + * @param {String} hexadecimal string of integer value + * @description + *
+ * NOTE: Value shall be represented by minimum octet length of + * two's complement representation. + * @example + * new KJUR.asn1.DERInteger(123); + * new KJUR.asn1.DERInteger({'int': 123}); + * new KJUR.asn1.DERInteger({'hex': '1fad'}); + */ + this.setValueHex = function(newHexString) { + this.hV = newHexString; + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params['bigint'] != "undefined") { + this.setByBigInteger(params['bigint']); + } else if (typeof params['int'] != "undefined") { + this.setByInteger(params['int']); + } else if (typeof params == "number") { + this.setByInteger(params); + } else if (typeof params['hex'] != "undefined") { + this.setValueHex(params['hex']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER encoded BitString primitive + * @name KJUR.asn1.DERBitString + * @class class for ASN.1 DER encoded BitString primitive + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • bin - specify binary string (ex. '10111')
  • + *
  • array - specify array of boolean (ex. [true,false,true,true])
  • + *
  • hex - specify hexadecimal string of ASN.1 value(V) including unused bits
  • + *
  • obj - specify {@link KJUR.asn1.ASN1Util.newObject} + * argument for "BitString encapsulates" structure.
  • + *
+ * NOTE1: 'params' can be omitted.
+ * NOTE2: 'obj' parameter have been supported since + * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).
+ * @example + * // default constructor + * o = new KJUR.asn1.DERBitString(); + * // initialize with binary string + * o = new KJUR.asn1.DERBitString({bin: "1011"}); + * // initialize with boolean array + * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]}); + * // initialize with hexadecimal string (04 is unused bits) + * o = new KJUR.asn1.DEROctetString({hex: "04bac0"}); + * // initialize with ASN1Util.newObject argument for encapsulated + * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}}); + * // above generates a ASN.1 data like this: + * // BIT STRING, encapsulates { + * // SEQUENCE { + * // INTEGER 3 + * // PrintableString 'aaa' + * // } + * // } + */ + KJUR.asn1.DERBitString = function(params) { + if (params !== undefined && typeof params.obj !== "undefined") { + var o = KJUR.asn1.ASN1Util.newObject(params.obj); + params.hex = "00" + o.getEncodedHex(); + } + KJUR.asn1.DERBitString.superclass.constructor.call(this); + this.hT = "03"; + + /** + * set ASN.1 value(V) by a hexadecimal string including unused bits + * @name setHexValueIncludingUnusedBits + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {String} newHexStringIncludingUnusedBits + */ + this.setHexValueIncludingUnusedBits = function(newHexStringIncludingUnusedBits) { + this.hTLV = null; + this.isModified = true; + this.hV = newHexStringIncludingUnusedBits; + }; + + /** + * set ASN.1 value(V) by unused bit and hexadecimal string of value + * @name setUnusedBitsAndHexValue + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {Integer} unusedBits + * @param {String} hValue + */ + this.setUnusedBitsAndHexValue = function(unusedBits, hValue) { + if (unusedBits < 0 || 7 < unusedBits) { + throw "unused bits shall be from 0 to 7: u = " + unusedBits; + } + var hUnusedBits = "0" + unusedBits; + this.hTLV = null; + this.isModified = true; + this.hV = hUnusedBits + hValue; + }; + + /** + * set ASN.1 DER BitString by binary string
+ * @name setByBinaryString + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {String} binaryString binary value string (i.e. '10111') + * @description + * Its unused bits will be calculated automatically by length of + * 'binaryValue'.
+ * NOTE: Trailing zeros '0' will be ignored. + * @example + * o = new KJUR.asn1.DERBitString(); + * o.setByBooleanArray("01011"); + */ + this.setByBinaryString = function(binaryString) { + binaryString = binaryString.replace(/0+$/, ''); + var unusedBits = 8 - binaryString.length % 8; + if (unusedBits == 8) unusedBits = 0; + for (var i = 0; i <= unusedBits; i++) { + binaryString += '0'; + } + var h = ''; + for (var i = 0; i < binaryString.length - 1; i += 8) { + var b = binaryString.substr(i, 8); + var x = parseInt(b, 2).toString(16); + if (x.length == 1) x = '0' + x; + h += x; + } + this.hTLV = null; + this.isModified = true; + this.hV = '0' + unusedBits + h; + }; + + /** + * set ASN.1 TLV value(V) by an array of boolean
+ * @name setByBooleanArray + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {array} booleanArray array of boolean (ex. [true, false, true]) + * @description + * NOTE: Trailing falses will be ignored in the ASN.1 DER Object. + * @example + * o = new KJUR.asn1.DERBitString(); + * o.setByBooleanArray([false, true, false, true, true]); + */ + this.setByBooleanArray = function(booleanArray) { + var s = ''; + for (var i = 0; i < booleanArray.length; i++) { + if (booleanArray[i] == true) { + s += '1'; + } else { + s += '0'; + } + } + this.setByBinaryString(s); + }; + + /** + * generate an array of falses with specified length
+ * @name newFalseArray + * @memberOf KJUR.asn1.DERBitString + * @function + * @param {Integer} nLength length of array to generate + * @return {array} array of boolean falses + * @description + * This static method may be useful to initialize boolean array. + * @example + * o = new KJUR.asn1.DERBitString(); + * o.newFalseArray(3) → [false, false, false] + */ + this.newFalseArray = function(nLength) { + var a = new Array(nLength); + for (var i = 0; i < nLength; i++) { + a[i] = false; + } + return a; + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) { + this.setHexValueIncludingUnusedBits(params); + } else if (typeof params['hex'] != "undefined") { + this.setHexValueIncludingUnusedBits(params['hex']); + } else if (typeof params['bin'] != "undefined") { + this.setByBinaryString(params['bin']); + } else if (typeof params['array'] != "undefined") { + this.setByBooleanArray(params['array']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER OctetString
+ * @name KJUR.asn1.DEROctetString + * @class class for ASN.1 DER OctetString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * This class provides ASN.1 OctetString simple type.
+ * Supported "params" attributes are: + *
    + *
  • str - to set a string as a value
  • + *
  • hex - to set a hexadecimal string as a value
  • + *
  • obj - to set a encapsulated ASN.1 value by JSON object + * which is defined in {@link KJUR.asn1.ASN1Util.newObject}
  • + *
+ * NOTE: A parameter 'obj' have been supported + * for "OCTET STRING, encapsulates" structure. + * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25). + * @see KJUR.asn1.DERAbstractString - superclass + * @example + * // default constructor + * o = new KJUR.asn1.DEROctetString(); + * // initialize with string + * o = new KJUR.asn1.DEROctetString({str: "aaa"}); + * // initialize with hexadecimal string + * o = new KJUR.asn1.DEROctetString({hex: "616161"}); + * // initialize with ASN1Util.newObject argument + * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}}); + * // above generates a ASN.1 data like this: + * // OCTET STRING, encapsulates { + * // SEQUENCE { + * // INTEGER 3 + * // PrintableString 'aaa' + * // } + * // } + */ + KJUR.asn1.DEROctetString = function(params) { + if (params !== undefined && typeof params.obj !== "undefined") { + var o = KJUR.asn1.ASN1Util.newObject(params.obj); + params.hex = o.getEncodedHex(); + } + KJUR.asn1.DEROctetString.superclass.constructor.call(this, params); + this.hT = "04"; + }; + YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER Null + * @name KJUR.asn1.DERNull + * @class class for ASN.1 DER Null + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERNull = function() { + KJUR.asn1.DERNull.superclass.constructor.call(this); + this.hT = "05"; + this.hTLV = "0500"; + }; + YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER ObjectIdentifier + * @name KJUR.asn1.DERObjectIdentifier + * @class class for ASN.1 DER ObjectIdentifier + * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'}) + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERObjectIdentifier = function(params) { + var itox = function(i) { + var h = i.toString(16); + if (h.length == 1) h = '0' + h; + return h; + }; + var roidtox = function(roid) { + var h = ''; + var bi = new BigInteger(roid, 10); + var b = bi.toString(2); + var padLen = 7 - b.length % 7; + if (padLen == 7) padLen = 0; + var bPad = ''; + for (var i = 0; i < padLen; i++) bPad += '0'; + b = bPad + b; + for (var i = 0; i < b.length - 1; i += 7) { + var b8 = b.substr(i, 7); + if (i != b.length - 7) b8 = '1' + b8; + h += itox(parseInt(b8, 2)); + } + return h; + }; + + KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this); + this.hT = "06"; + + /** + * set value by a hexadecimal string + * @name setValueHex + * @memberOf KJUR.asn1.DERObjectIdentifier# + * @function + * @param {String} newHexString hexadecimal value of OID bytes + */ + this.setValueHex = function(newHexString) { + this.hTLV = null; + this.isModified = true; + this.s = null; + this.hV = newHexString; + }; + + /** + * set value by a OID string
+ * @name setValueOidString + * @memberOf KJUR.asn1.DERObjectIdentifier# + * @function + * @param {String} oidString OID string (ex. 2.5.4.13) + * @example + * o = new KJUR.asn1.DERObjectIdentifier(); + * o.setValueOidString("2.5.4.13"); + */ + this.setValueOidString = function(oidString) { + if (!oidString.match(/^[0-9.]+$/)) { + throw "malformed oid string: " + oidString; + } + var h = ''; + var a = oidString.split('.'); + var i0 = parseInt(a[0]) * 40 + parseInt(a[1]); + h += itox(i0); + a.splice(0, 2); + for (var i = 0; i < a.length; i++) { + h += roidtox(a[i]); + } + this.hTLV = null; + this.isModified = true; + this.s = null; + this.hV = h; + }; + + /** + * set value by a OID name + * @name setValueName + * @memberOf KJUR.asn1.DERObjectIdentifier# + * @function + * @param {String} oidName OID name (ex. 'serverAuth') + * @since 1.0.1 + * @description + * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'. + * Otherwise raise error. + * @example + * o = new KJUR.asn1.DERObjectIdentifier(); + * o.setValueName("serverAuth"); + */ + this.setValueName = function(oidName) { + var oid = KJUR.asn1.x509.OID.name2oid(oidName); + if (oid !== '') { + this.setValueOidString(oid); + } else { + throw "DERObjectIdentifier oidName undefined: " + oidName; + } + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + + if (params !== undefined) { + if (typeof params === "string") { + if (params.match(/^[0-2].[0-9.]+$/)) { + this.setValueOidString(params); + } else { + this.setValueName(params); + } + } else if (params.oid !== undefined) { + this.setValueOidString(params.oid); + } else if (params.hex !== undefined) { + this.setValueHex(params.hex); + } else if (params.name !== undefined) { + this.setValueName(params.name); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER Enumerated + * @name KJUR.asn1.DEREnumerated + * @class class for ASN.1 DER Enumerated + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • int - specify initial ASN.1 value(V) by integer value
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + * @example + * new KJUR.asn1.DEREnumerated(123); + * new KJUR.asn1.DEREnumerated({int: 123}); + * new KJUR.asn1.DEREnumerated({hex: '1fad'}); + */ + KJUR.asn1.DEREnumerated = function(params) { + KJUR.asn1.DEREnumerated.superclass.constructor.call(this); + this.hT = "0a"; + + /** + * set value by Tom Wu's BigInteger object + * @name setByBigInteger + * @memberOf KJUR.asn1.DEREnumerated# + * @function + * @param {BigInteger} bigIntegerValue to set + */ + this.setByBigInteger = function(bigIntegerValue) { + this.hTLV = null; + this.isModified = true; + this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue); + }; + + /** + * set value by integer value + * @name setByInteger + * @memberOf KJUR.asn1.DEREnumerated# + * @function + * @param {Integer} integer value to set + */ + this.setByInteger = function(intValue) { + var bi = new BigInteger(String(intValue), 10); + this.setByBigInteger(bi); + }; + + /** + * set value by integer value + * @name setValueHex + * @memberOf KJUR.asn1.DEREnumerated# + * @function + * @param {String} hexadecimal string of integer value + * @description + *
+ * NOTE: Value shall be represented by minimum octet length of + * two's complement representation. + */ + this.setValueHex = function(newHexString) { + this.hV = newHexString; + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params['int'] != "undefined") { + this.setByInteger(params['int']); + } else if (typeof params == "number") { + this.setByInteger(params); + } else if (typeof params['hex'] != "undefined") { + this.setValueHex(params['hex']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER UTF8String + * @name KJUR.asn1.DERUTF8String + * @class class for ASN.1 DER UTF8String + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERUTF8String = function(params) { + KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params); + this.hT = "0c"; + }; + YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER NumericString + * @name KJUR.asn1.DERNumericString + * @class class for ASN.1 DER NumericString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERNumericString = function(params) { + KJUR.asn1.DERNumericString.superclass.constructor.call(this, params); + this.hT = "12"; + }; + YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER PrintableString + * @name KJUR.asn1.DERPrintableString + * @class class for ASN.1 DER PrintableString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERPrintableString = function(params) { + KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params); + this.hT = "13"; + }; + YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER TeletexString + * @name KJUR.asn1.DERTeletexString + * @class class for ASN.1 DER TeletexString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERTeletexString = function(params) { + KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params); + this.hT = "14"; + }; + YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER IA5String + * @name KJUR.asn1.DERIA5String + * @class class for ASN.1 DER IA5String + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERIA5String = function(params) { + KJUR.asn1.DERIA5String.superclass.constructor.call(this, params); + this.hT = "16"; + }; + YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER UTCTime + * @name KJUR.asn1.DERUTCTime + * @class class for ASN.1 DER UTCTime + * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'}) + * @extends KJUR.asn1.DERAbstractTime + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
  • date - specify Date object.
  • + *
+ * NOTE: 'params' can be omitted. + *

EXAMPLES

+ * @example + * d1 = new KJUR.asn1.DERUTCTime(); + * d1.setString('130430125959Z'); + * + * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'}); + * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))}); + * d4 = new KJUR.asn1.DERUTCTime('130430125959Z'); + */ + KJUR.asn1.DERUTCTime = function(params) { + KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params); + this.hT = "17"; + + /** + * set value by a Date object
+ * @name setByDate + * @memberOf KJUR.asn1.DERUTCTime# + * @function + * @param {Date} dateObject Date object to set ASN.1 value(V) + * @example + * o = new KJUR.asn1.DERUTCTime(); + * o.setByDate(new Date("2016/12/31")); + */ + this.setByDate = function(dateObject) { + this.hTLV = null; + this.isModified = true; + this.date = dateObject; + this.s = this.formatDate(this.date, 'utc'); + this.hV = stohex(this.s); + }; + + this.getFreshValueHex = function() { + if (typeof this.date == "undefined" && typeof this.s == "undefined") { + this.date = new Date(); + this.s = this.formatDate(this.date, 'utc'); + this.hV = stohex(this.s); + } + return this.hV; + }; + + if (params !== undefined) { + if (params.str !== undefined) { + this.setString(params.str); + } else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) { + this.setString(params); + } else if (params.hex !== undefined) { + this.setStringHex(params.hex); + } else if (params.date !== undefined) { + this.setByDate(params.date); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime); + + // ******************************************************************** + /** + * class for ASN.1 DER GeneralizedTime + * @name KJUR.asn1.DERGeneralizedTime + * @class class for ASN.1 DER GeneralizedTime + * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'}) + * @property {Boolean} withMillis flag to show milliseconds or not + * @extends KJUR.asn1.DERAbstractTime + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
  • date - specify Date object.
  • + *
  • millis - specify flag to show milliseconds (from 1.0.6)
  • + *
+ * NOTE1: 'params' can be omitted. + * NOTE2: 'withMillis' property is supported from asn1 1.0.6. + */ + KJUR.asn1.DERGeneralizedTime = function(params) { + KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params); + this.hT = "18"; + this.withMillis = false; + + /** + * set value by a Date object + * @name setByDate + * @memberOf KJUR.asn1.DERGeneralizedTime# + * @function + * @param {Date} dateObject Date object to set ASN.1 value(V) + * @example + * When you specify UTC time, use 'Date.UTC' method like this:
+ * o1 = new DERUTCTime(); + * o1.setByDate(date); + * + * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59 + */ + this.setByDate = function(dateObject) { + this.hTLV = null; + this.isModified = true; + this.date = dateObject; + this.s = this.formatDate(this.date, 'gen', this.withMillis); + this.hV = stohex(this.s); + }; + + this.getFreshValueHex = function() { + if (this.date === undefined && this.s === undefined) { + this.date = new Date(); + this.s = this.formatDate(this.date, 'gen', this.withMillis); + this.hV = stohex(this.s); + } + return this.hV; + }; + + if (params !== undefined) { + if (params.str !== undefined) { + this.setString(params.str); + } else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) { + this.setString(params); + } else if (params.hex !== undefined) { + this.setStringHex(params.hex); + } else if (params.date !== undefined) { + this.setByDate(params.date); + } + if (params.millis === true) { + this.withMillis = true; + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime); + + // ******************************************************************** + /** + * class for ASN.1 DER Sequence + * @name KJUR.asn1.DERSequence + * @class class for ASN.1 DER Sequence + * @extends KJUR.asn1.DERAbstractStructured + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • array - specify array of ASN1Object to set elements of content
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERSequence = function(params) { + KJUR.asn1.DERSequence.superclass.constructor.call(this, params); + this.hT = "30"; + this.getFreshValueHex = function() { + var h = ''; + for (var i = 0; i < this.asn1Array.length; i++) { + var asn1Obj = this.asn1Array[i]; + h += asn1Obj.getEncodedHex(); + } + this.hV = h; + return this.hV; + }; + }; + YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured); + + // ******************************************************************** + /** + * class for ASN.1 DER Set + * @name KJUR.asn1.DERSet + * @class class for ASN.1 DER Set + * @extends KJUR.asn1.DERAbstractStructured + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • array - specify array of ASN1Object to set elements of content
  • + *
  • sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.
  • + *
+ * NOTE1: 'params' can be omitted.
+ * NOTE2: sortflag is supported since 1.0.5. + */ + KJUR.asn1.DERSet = function(params) { + KJUR.asn1.DERSet.superclass.constructor.call(this, params); + this.hT = "31"; + this.sortFlag = true; // item shall be sorted only in ASN.1 DER + this.getFreshValueHex = function() { + var a = new Array(); + for (var i = 0; i < this.asn1Array.length; i++) { + var asn1Obj = this.asn1Array[i]; + a.push(asn1Obj.getEncodedHex()); + } + if (this.sortFlag == true) a.sort(); + this.hV = a.join(''); + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params.sortflag != "undefined" && + params.sortflag == false) + this.sortFlag = false; + } + }; + YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured); + + // ******************************************************************** + /** + * class for ASN.1 DER TaggedObject + * @name KJUR.asn1.DERTaggedObject + * @class class for ASN.1 DER TaggedObject + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object. + * For example, if you find '[1]' tag in a ASN.1 dump, + * 'tagNoHex' will be 'a1'. + *
+ * As for optional argument 'params' for constructor, you can specify *ANY* of + * following properties: + *
    + *
  • explicit - specify true if this is explicit tag otherwise false + * (default is 'true').
  • + *
  • tag - specify tag (default is 'a0' which means [0])
  • + *
  • obj - specify ASN1Object which is tagged
  • + *
+ * @example + * d1 = new KJUR.asn1.DERUTF8String({'str':'a'}); + * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1}); + * hex = d2.getEncodedHex(); + */ + KJUR.asn1.DERTaggedObject = function(params) { + KJUR.asn1.DERTaggedObject.superclass.constructor.call(this); + this.hT = "a0"; + this.hV = ''; + this.isExplicit = true; + this.asn1Object = null; + + /** + * set value by an ASN1Object + * @name setString + * @memberOf KJUR.asn1.DERTaggedObject# + * @function + * @param {Boolean} isExplicitFlag flag for explicit/implicit tag + * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag + * @param {ASN1Object} asn1Object ASN.1 to encapsulate + */ + this.setASN1Object = function(isExplicitFlag, tagNoHex, asn1Object) { + this.hT = tagNoHex; + this.isExplicit = isExplicitFlag; + this.asn1Object = asn1Object; + if (this.isExplicit) { + this.hV = this.asn1Object.getEncodedHex(); + this.hTLV = null; + this.isModified = true; + } else { + this.hV = null; + this.hTLV = asn1Object.getEncodedHex(); + this.hTLV = this.hTLV.replace(/^../, tagNoHex); + this.isModified = false; + } + }; + + this.getFreshValueHex = function() { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params['tag'] != "undefined") { + this.hT = params['tag']; + } + if (typeof params['explicit'] != "undefined") { + this.isExplicit = params['explicit']; + } + if (typeof params['obj'] != "undefined") { + this.asn1Object = params['obj']; + this.setASN1Object(this.isExplicit, this.hT, this.asn1Object); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object); + + /** + * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object. + * This object is just a decorator for parsing the key parameter + * @param {string|Object} key - The key in string format, or an object containing + * the parameters needed to build a RSAKey object. + * @constructor + */ + var JSEncryptRSAKey = /** @class */ (function(_super) { + __extends(JSEncryptRSAKey, _super); + + function JSEncryptRSAKey(key) { + var _this = _super.call(this) || this; + // Call the super constructor. + // RSAKey.call(this); + // If a key key was provided. + if (key) { + // If this is a string... + if (typeof key === "string") { + _this.parseKey(key); + } else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) || + JSEncryptRSAKey.hasPublicKeyProperty(key)) { + // Set the values for the key. + _this.parsePropertiesFrom(key); + } + } + return _this; + } + /** + * Method to parse a pem encoded string containing both a public or private key. + * The method will translate the pem encoded string in a der encoded string and + * will parse private key and public key parameters. This method accepts public key + * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1). + * + * @todo Check how many rsa formats use the same format of pkcs #1. + * + * The format is defined as: + * PublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * PublicKey BIT STRING + * } + * Where AlgorithmIdentifier is: + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm + * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1) + * } + * and PublicKey is a SEQUENCE encapsulated in a BIT STRING + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + * it's possible to examine the structure of the keys obtained from openssl using + * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/ + * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer + * @private + */ + JSEncryptRSAKey.prototype.parseKey = function(pem) { + try { + var modulus = 0; + var public_exponent = 0; + var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/; + var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem); + var asn1 = ASN1.decode(der); + // Fixes a bug with OpenSSL 1.0+ private keys + if (asn1.sub.length === 3) { + asn1 = asn1.sub[2].sub[0]; + } + if (asn1.sub.length === 9) { + // Parse the private key. + modulus = asn1.sub[1].getHexStringValue(); // bigint + this.n = parseBigInt(modulus, 16); + public_exponent = asn1.sub[2].getHexStringValue(); // int + this.e = parseInt(public_exponent, 16); + var private_exponent = asn1.sub[3].getHexStringValue(); // bigint + this.d = parseBigInt(private_exponent, 16); + var prime1 = asn1.sub[4].getHexStringValue(); // bigint + this.p = parseBigInt(prime1, 16); + var prime2 = asn1.sub[5].getHexStringValue(); // bigint + this.q = parseBigInt(prime2, 16); + var exponent1 = asn1.sub[6].getHexStringValue(); // bigint + this.dmp1 = parseBigInt(exponent1, 16); + var exponent2 = asn1.sub[7].getHexStringValue(); // bigint + this.dmq1 = parseBigInt(exponent2, 16); + var coefficient = asn1.sub[8].getHexStringValue(); // bigint + this.coeff = parseBigInt(coefficient, 16); + } else if (asn1.sub.length === 2) { + // Parse the public key. + var bit_string = asn1.sub[1]; + var sequence = bit_string.sub[0]; + modulus = sequence.sub[0].getHexStringValue(); + this.n = parseBigInt(modulus, 16); + public_exponent = sequence.sub[1].getHexStringValue(); + this.e = parseInt(public_exponent, 16); + } else { + return false; + } + return true; + } catch (ex) { + return false; + } + }; + /** + * Translate rsa parameters in a hex encoded string representing the rsa key. + * + * The translation follow the ASN.1 notation : + * RSAPrivateKey ::= SEQUENCE { + * version Version, + * modulus INTEGER, -- n + * publicExponent INTEGER, -- e + * privateExponent INTEGER, -- d + * prime1 INTEGER, -- p + * prime2 INTEGER, -- q + * exponent1 INTEGER, -- d mod (p1) + * exponent2 INTEGER, -- d mod (q-1) + * coefficient INTEGER, -- (inverse of q) mod p + * } + * @returns {string} DER Encoded String representing the rsa private key + * @private + */ + JSEncryptRSAKey.prototype.getPrivateBaseKey = function() { + var options = { + array: [ + new KJUR.asn1.DERInteger({ + int: 0 + }), + new KJUR.asn1.DERInteger({ + bigint: this.n + }), + new KJUR.asn1.DERInteger({ + int: this.e + }), + new KJUR.asn1.DERInteger({ + bigint: this.d + }), + new KJUR.asn1.DERInteger({ + bigint: this.p + }), + new KJUR.asn1.DERInteger({ + bigint: this.q + }), + new KJUR.asn1.DERInteger({ + bigint: this.dmp1 + }), + new KJUR.asn1.DERInteger({ + bigint: this.dmq1 + }), + new KJUR.asn1.DERInteger({ + bigint: this.coeff + }) + ] + }; + var seq = new KJUR.asn1.DERSequence(options); + return seq.getEncodedHex(); + }; + /** + * base64 (pem) encoded version of the DER encoded representation + * @returns {string} pem encoded representation without header and footer + * @public + */ + JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function() { + return hex2b64(this.getPrivateBaseKey()); + }; + /** + * Translate rsa parameters in a hex encoded string representing the rsa public key. + * The representation follow the ASN.1 notation : + * PublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * PublicKey BIT STRING + * } + * Where AlgorithmIdentifier is: + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm + * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1) + * } + * and PublicKey is a SEQUENCE encapsulated in a BIT STRING + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + * @returns {string} DER Encoded String representing the rsa public key + * @private + */ + JSEncryptRSAKey.prototype.getPublicBaseKey = function() { + var first_sequence = new KJUR.asn1.DERSequence({ + array: [ + new KJUR.asn1.DERObjectIdentifier({ + oid: "1.2.840.113549.1.1.1" + }), + new KJUR.asn1.DERNull() + ] + }); + var second_sequence = new KJUR.asn1.DERSequence({ + array: [ + new KJUR.asn1.DERInteger({ + bigint: this.n + }), + new KJUR.asn1.DERInteger({ + int: this.e + }) + ] + }); + var bit_string = new KJUR.asn1.DERBitString({ + hex: "00" + second_sequence.getEncodedHex() + }); + var seq = new KJUR.asn1.DERSequence({ + array: [ + first_sequence, + bit_string + ] + }); + return seq.getEncodedHex(); + }; + /** + * base64 (pem) encoded version of the DER encoded representation + * @returns {string} pem encoded representation without header and footer + * @public + */ + JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function() { + return hex2b64(this.getPublicBaseKey()); + }; + /** + * wrap the string in block of width chars. The default value for rsa keys is 64 + * characters. + * @param {string} str the pem encoded string without header and footer + * @param {Number} [width=64] - the length the string has to be wrapped at + * @returns {string} + * @private + */ + JSEncryptRSAKey.wordwrap = function(str, width) { + width = width || 64; + if (!str) { + return str; + } + var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})"; + return str.match(RegExp(regex, "g")).join("\n"); + }; + /** + * Retrieve the pem encoded private key + * @returns {string} the pem encoded private key with header/footer + * @public + */ + JSEncryptRSAKey.prototype.getPrivateKey = function() { + var key = "-----BEGIN RSA PRIVATE KEY-----\n"; + key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n"; + key += "-----END RSA PRIVATE KEY-----"; + return key; + }; + /** + * Retrieve the pem encoded public key + * @returns {string} the pem encoded public key with header/footer + * @public + */ + JSEncryptRSAKey.prototype.getPublicKey = function() { + var key = "-----BEGIN PUBLIC KEY-----\n"; + key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n"; + key += "-----END PUBLIC KEY-----"; + return key; + }; + /** + * Check if the object contains the necessary parameters to populate the rsa modulus + * and public exponent parameters. + * @param {Object} [obj={}] - An object that may contain the two public key + * parameters + * @returns {boolean} true if the object contains both the modulus and the public exponent + * properties (n and e) + * @todo check for types of n and e. N should be a parseable bigInt object, E should + * be a parseable integer number + * @private + */ + JSEncryptRSAKey.hasPublicKeyProperty = function(obj) { + obj = obj || {}; + return (obj.hasOwnProperty("n") && + obj.hasOwnProperty("e")); + }; + /** + * Check if the object contains ALL the parameters of an RSA key. + * @param {Object} [obj={}] - An object that may contain nine rsa key + * parameters + * @returns {boolean} true if the object contains all the parameters needed + * @todo check for types of the parameters all the parameters but the public exponent + * should be parseable bigint objects, the public exponent should be a parseable integer number + * @private + */ + JSEncryptRSAKey.hasPrivateKeyProperty = function(obj) { + obj = obj || {}; + return (obj.hasOwnProperty("n") && + obj.hasOwnProperty("e") && + obj.hasOwnProperty("d") && + obj.hasOwnProperty("p") && + obj.hasOwnProperty("q") && + obj.hasOwnProperty("dmp1") && + obj.hasOwnProperty("dmq1") && + obj.hasOwnProperty("coeff")); + }; + /** + * Parse the properties of obj in the current rsa object. Obj should AT LEAST + * include the modulus and public exponent (n, e) parameters. + * @param {Object} obj - the object containing rsa parameters + * @private + */ + JSEncryptRSAKey.prototype.parsePropertiesFrom = function(obj) { + this.n = obj.n; + this.e = obj.e; + if (obj.hasOwnProperty("d")) { + this.d = obj.d; + this.p = obj.p; + this.q = obj.q; + this.dmp1 = obj.dmp1; + this.dmq1 = obj.dmq1; + this.coeff = obj.coeff; + } + }; + return JSEncryptRSAKey; + }(RSAKey)); + + /** + * + * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour + * possible parameters are: + * - default_key_size {number} default: 1024 the key size in bit + * - default_public_exponent {string} default: '010001' the hexadecimal representation of the public exponent + * - log {boolean} default: false whether log warn/error or not + * @constructor + */ + var JSEncrypt = /** @class */ (function() { + function JSEncrypt(options) { + options = options || {}; + this.default_key_size = parseInt(options.default_key_size, 10) || 1024; + this.default_public_exponent = options.default_public_exponent || + "010001"; // 65537 default openssl public exponent for rsa key type + this.log = options.log || false; + // The private and public key. + this.key = null; + } + /** + * Method to set the rsa key parameter (one method is enough to set both the public + * and the private key, since the private key contains the public key paramenters) + * Log a warning if logs are enabled + * @param {Object|string} key the pem encoded string or an object (with or without header/footer) + * @public + */ + JSEncrypt.prototype.setKey = function(key) { + if (this.log && this.key) { + console.warn("A key was already set, overriding existing."); + } + this.key = new JSEncryptRSAKey(key); + }; + /** + * Proxy method for setKey, for api compatibility + * @see setKey + * @public + */ + JSEncrypt.prototype.setPrivateKey = function(privkey) { + // Create the key. + this.setKey(privkey); + }; + /** + * Proxy method for setKey, for api compatibility + * @see setKey + * @public + */ + JSEncrypt.prototype.setPublicKey = function(pubkey) { + // Sets the public key. + this.setKey(pubkey); + }; + /** + * Proxy method for RSAKey object's decrypt, decrypt the string using the private + * components of the rsa key object. Note that if the object was not set will be created + * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor + * @param {string} str base64 encoded crypted string to decrypt + * @return {string} the decrypted string + * @public + */ + JSEncrypt.prototype.decrypt = function(str) { + // Return the decrypted string. + try { + return this.getKey().decrypt(b64tohex(str)); + } catch (ex) { + return false; + } + }; + /** + * Proxy method for RSAKey object's encrypt, encrypt the string using the public + * components of the rsa key object. Note that if the object was not set will be created + * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor + * @param {string} str the string to encrypt + * @return {string} the encrypted string encoded in base64 + * @public + */ + JSEncrypt.prototype.encrypt = function(str) { + // Return the encrypted string. + try { + return hex2b64(this.getKey().encrypt(str)); + } catch (ex) { + return false; + } + }; + /** + * Proxy method for RSAKey object's sign. + * @param {string} str the string to sign + * @param {function} digestMethod hash method + * @param {string} digestName the name of the hash algorithm + * @return {string} the signature encoded in base64 + * @public + */ + JSEncrypt.prototype.sign = function(str, digestMethod, digestName) { + // return the RSA signature of 'str' in 'hex' format. + try { + return hex2b64(this.getKey().sign(str, digestMethod, digestName)); + } catch (ex) { + return false; + } + }; + /** + * Proxy method for RSAKey object's verify. + * @param {string} str the string to verify + * @param {string} signature the signature encoded in base64 to compare the string to + * @param {function} digestMethod hash method + * @return {boolean} whether the data and signature match + * @public + */ + JSEncrypt.prototype.verify = function(str, signature, digestMethod) { + // Return the decrypted 'digest' of the signature. + try { + return this.getKey().verify(str, b64tohex(signature), digestMethod); + } catch (ex) { + return false; + } + }; + /** + * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object + * will be created and returned + * @param {callback} [cb] the callback to be called if we want the key to be generated + * in an async fashion + * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object + * @public + */ + JSEncrypt.prototype.getKey = function(cb) { + // Only create new if it does not exist. + if (!this.key) { + // Get a new private key. + this.key = new JSEncryptRSAKey(); + if (cb && {}.toString.call(cb) === "[object Function]") { + this.key.generateAsync(this.default_key_size, this.default_public_exponent, + cb); + return; + } + // Generate the key. + this.key.generate(this.default_key_size, this.default_public_exponent); + } + return this.key; + }; + /** + * Returns the pem encoded representation of the private key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the private key WITH header and footer + * @public + */ + JSEncrypt.prototype.getPrivateKey = function() { + // Return the private representation of this key. + return this.getKey().getPrivateKey(); + }; + /** + * Returns the pem encoded representation of the private key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the private key WITHOUT header and footer + * @public + */ + JSEncrypt.prototype.getPrivateKeyB64 = function() { + // Return the private representation of this key. + return this.getKey().getPrivateBaseKeyB64(); + }; + /** + * Returns the pem encoded representation of the public key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the public key WITH header and footer + * @public + */ + JSEncrypt.prototype.getPublicKey = function() { + // Return the private representation of this key. + return this.getKey().getPublicKey(); + }; + /** + * Returns the pem encoded representation of the public key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the public key WITHOUT header and footer + * @public + */ + JSEncrypt.prototype.getPublicKeyB64 = function() { + // Return the private representation of this key. + return this.getKey().getPublicBaseKeyB64(); + }; + JSEncrypt.version = "3.0.0-rc.1"; + return JSEncrypt; + }()); + + window2.JSEncrypt = JSEncrypt; + + exports.JSEncrypt = JSEncrypt; + exports.default = JSEncrypt; + + Object.defineProperty(exports, '__esModule', { + value: true + }); + +}))); diff --git a/utils/permission.js b/utils/permission.js new file mode 100644 index 0000000..d9249d9 --- /dev/null +++ b/utils/permission.js @@ -0,0 +1,245 @@ +/// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启 + +var isIOS + +function album() { + var result = 0; + var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary"); + var authStatus = PHPhotoLibrary.authorizationStatus(); + if (authStatus === 0) { + result = null; + } else if (authStatus == 3) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(PHPhotoLibrary); + return result; +} + +function camera() { + var result = 0; + var AVCaptureDevice = plus.ios.import("AVCaptureDevice"); + var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); + if (authStatus === 0) { + result = null; + } else if (authStatus == 3) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(AVCaptureDevice); + return result; +} + +function location() { + var result = 0; + var cllocationManger = plus.ios.import("CLLocationManager"); + var enable = cllocationManger.locationServicesEnabled(); + var status = cllocationManger.authorizationStatus(); + if (!enable) { + result = 2; + } else if (status === 0) { + result = null; + } else if (status === 3 || status === 4) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(cllocationManger); + return result; +} + +function push() { + var result = 0; + var UIApplication = plus.ios.import("UIApplication"); + var app = UIApplication.sharedApplication(); + var enabledTypes = 0; + if (app.currentUserNotificationSettings) { + var settings = app.currentUserNotificationSettings(); + enabledTypes = settings.plusGetAttribute("types"); + if (enabledTypes == 0) { + result = 0; + console.log("推送权限没有开启"); + } else { + result = 1; + console.log("已经开启推送功能!") + } + plus.ios.deleteObject(settings); + } else { + enabledTypes = app.enabledRemoteNotificationTypes(); + if (enabledTypes == 0) { + result = 3; + console.log("推送权限没有开启!"); + } else { + result = 4; + console.log("已经开启推送功能!") + } + } + plus.ios.deleteObject(app); + plus.ios.deleteObject(UIApplication); + return result; +} + +function contact() { + var result = 0; + var CNContactStore = plus.ios.import("CNContactStore"); + var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0); + if (cnAuthStatus === 0) { + result = null; + } else if (cnAuthStatus == 3) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(CNContactStore); + return result; +} + +function record() { + var result = null; + var avaudiosession = plus.ios.import("AVAudioSession"); + var avaudio = avaudiosession.sharedInstance(); + var status = avaudio.recordPermission(); + console.log("permissionStatus:" + status); + if (status === 1970168948) { + result = null; + } else if (status === 1735552628) { + result = 1; + } else { + result = 0; + } + plus.ios.deleteObject(avaudiosession); + return result; +} + +function calendar() { + var result = null; + var EKEventStore = plus.ios.import("EKEventStore"); + var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0); + if (ekAuthStatus == 3) { + result = 1; + console.log("日历权限已经开启"); + } else { + console.log("日历权限没有开启"); + } + plus.ios.deleteObject(EKEventStore); + return result; +} + +function memo() { + var result = null; + var EKEventStore = plus.ios.import("EKEventStore"); + var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1); + if (ekAuthStatus == 3) { + result = 1; + console.log("备忘录权限已经开启"); + } else { + console.log("备忘录权限没有开启"); + } + plus.ios.deleteObject(EKEventStore); + return result; +} + + +function requestIOS(permissionID) { + return new Promise((resolve, reject) => { + switch (permissionID) { + case "push": + resolve(push()); + break; + case "location": + resolve(location()); + break; + case "record": + resolve(record()); + break; + case "camera": + resolve(camera()); + break; + case "album": + resolve(album()); + break; + case "contact": + resolve(contact()); + break; + case "calendar": + resolve(calendar()); + break; + case "memo": + resolve(memo()); + break; + default: + resolve(0); + break; + } + }); +} + +function requestAndroid(permissionID) { + return new Promise((resolve, reject) => { + plus.android.requestPermissions( + [permissionID], + function(resultObj) { + var result = 0; + for (var i = 0; i < resultObj.granted.length; i++) { + var grantedPermission = resultObj.granted[i]; + console.log('已获取的权限:' + grantedPermission); + result = 1 + } + for (var i = 0; i < resultObj.deniedPresent.length; i++) { + var deniedPresentPermission = resultObj.deniedPresent[i]; + console.log('拒绝本次申请的权限:' + deniedPresentPermission); + result = 0 + } + for (var i = 0; i < resultObj.deniedAlways.length; i++) { + var deniedAlwaysPermission = resultObj.deniedAlways[i]; + console.log('永久拒绝申请的权限:' + deniedAlwaysPermission); + result = -1 + } + resolve(result); + }, + function(error) { + console.log('result error: ' + error.message) + resolve({ + code: error.code, + message: error.message + }); + } + ); + }); +} + +function gotoAppPermissionSetting() { + if (permission.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); + } +} + +const permission = { + get isIOS(){ + return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios') + }, + requestIOS: requestIOS, + requestAndroid: requestAndroid, + gotoAppSetting: gotoAppPermissionSetting +} + +export default permission diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 0000000..c5b01e0 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,127 @@ +// import qs from 'qs' // 处理data +import store from '@/vuex/store' +const request = (params) => { + let _self = this; + let url = params.url; + let method = params.method || 'POST'; + let data = params.data || {}; + // data.token = "default-access_token" + // if (!params.token) { + // let token = uni.getStorageSync('token'); + // if (!token) { + // uni.navigateTo({ + // url: '/pages/login/login' + // }); + // } else { + // data.token = '179509245-9c91827e0224bdc18d0b118b8be1b5af'; + // } + // } + let token = '' + if (store.getters.saveToken !== '') { + token = store.getters.saveToken + } + let defaultOpot = { + // 'Content-Type': 'application/x-www-form-urlencoded', + 'Terminal-Type': 'innerH5', + 'Content-Type': 'application/json;charset=UTF-8', + } + let header = {} + method = method.toUpperCase() + if (method == 'POST') { + header = { + 'Content-Type': 'application/json;charset=UTF-8', + 'Authorization': token + } + // data = qs.stringify(data) + } + const requestUrl = `${store.getters.baseUrl}/` + url; + uni.showLoading({ + title: '加载中...' + }); + return new Promise((resolve, reject) => { + uni.request({ + url: requestUrl, + method: method, + header: Object.assign({}, defaultOpot, header), + data: data, + dataType: 'json', + }) + .then(res => { // 成功 + if (res.length === 1) { + uni.showModal({ + content: 'request:fail', + showCancel: false + }) + reject('request:fail') + } else if (res[1] && res[1].statusCode === 400) { + uni.showModal({ + content: res[1].data.message, + showCancel: false + }) + reject(res[1].data.message) + } else if (res[1] && res[1].statusCode === 401) { + uni.showModal({ + content: res[1].data.message, + showCancel: false + }) + store.dispatch('delUserInfo') + uni.redirectTo({ + url: '/pages/login/login' + }) + } else if (res[1] && res[1].statusCode === 200) { + let { + data: dataType + } = res[1] + resolve(dataType) + // switch (dataType.code * 1) { // 拦截返回参数 + // case 0: + // resolve(dataType) + // break; + // case 1003: + // uni.showModal({ + // title: '登录已过期', + // content: '很抱歉,登录已过期,请重新登录', + // confirmText: '重新登录', + // success: function(res) { + // if (res.confirm) { + // uni.navigateTo({ + // // 切记这儿需要哈pages.json保持一致;不能有.vue后缀 + // url: '/pages/login/login' + // }); + // } else if (res.cancel) { + // console.log('用户点击取消'); + // } + // } + // }) + // break; + // case -1: + // uni.showModal({ + // title: '请求数据失败', + // content: '获取数据失败!', + // confirmText: '确定', + // showCancel: false, + // success: function(res) { + // if (res.confirm) {} else if (res.cancel) { + // console.log('用户点击取消'); + // } + // } + // }) + // break + // } + }else { + uni.showModal({ + content: res[1].data.message, + showCancel: false + }) + reject(res[1].data.message) + } + }) + .catch(err => { // 错误 + reject(err) + }) + .finally(() => { + uni.hideLoading(); + }) + }) +} +export default request \ No newline at end of file diff --git a/utils/request1.js b/utils/request1.js new file mode 100644 index 0000000..90dbecf --- /dev/null +++ b/utils/request1.js @@ -0,0 +1,126 @@ +import store from '@/vuex/store' +const request1 = (params) => { + let _self = this; + let url = params.url; + let method = params.method || 'POST'; + let data = params.data || {}; + // data.token = "default-access_token" + // if (!params.token) { + // let token = uni.getStorageSync('token'); + // if (!token) { + // uni.navigateTo({ + // url: '/pages/login/login' + // }); + // } else { + // data.token = '179509245-9c91827e0224bdc18d0b118b8be1b5af'; + // } + // } + let token = '' + if (store.getters.saveToken !== '') { + token = store.getters.saveToken + } + let defaultOpot = { + // 'Content-Type': 'application/x-www-form-urlencoded', + 'Terminal-Type': 'innerH5', + 'Content-Type': 'application/json;charset=UTF-8', + } + let header = {} + method = method.toUpperCase() + if (method == 'POST') { + header = { + 'Content-Type': 'application/json;charset=UTF-8', + 'Authorization': token + } + // data = qs.stringify(data) + } + const requestUrl = url; + uni.showLoading({ + title: '加载中...' + }); + return new Promise((resolve, reject) => { + uni.request({ + url: requestUrl, + method: method, + header: Object.assign({}, defaultOpot, header), + data: data, + dataType: 'json', + }) + .then(res => { // 成功 + if (res.length === 1) { + uni.showModal({ + content: 'request:fail', + showCancel: false + }) + reject('request:fail') + } else if (res[1] && res[1].statusCode === 400) { + uni.showModal({ + content: res[1].data.message, + showCancel: false + }) + reject(res[1].data.message) + } else if (res[1] && res[1].statusCode === 401) { + uni.showModal({ + content: res[1].data.message, + showCancel: false + }) + store.dispatch('delUserInfo') + uni.redirectTo({ + url: '/pages/login/login' + }) + } else if (res[1] && res[1].statusCode === 200) { + let { + data: dataType + } = res[1] + resolve(dataType) + // switch (dataType.code * 1) { // 拦截返回参数 + // case 0: + // resolve(dataType) + // break; + // case 1003: + // uni.showModal({ + // title: '登录已过期', + // content: '很抱歉,登录已过期,请重新登录', + // confirmText: '重新登录', + // success: function(res) { + // if (res.confirm) { + // uni.navigateTo({ + // // 切记这儿需要哈pages.json保持一致;不能有.vue后缀 + // url: '/pages/login/login' + // }); + // } else if (res.cancel) { + // console.log('用户点击取消'); + // } + // } + // }) + // break; + // case -1: + // uni.showModal({ + // title: '请求数据失败', + // content: '获取数据失败!', + // confirmText: '确定', + // showCancel: false, + // success: function(res) { + // if (res.confirm) {} else if (res.cancel) { + // console.log('用户点击取消'); + // } + // } + // }) + // break + // } + }else { + uni.showModal({ + content: res[1].data.message, + showCancel: false + }) + reject(res[1].data.message) + } + }) + .catch(err => { // 错误 + reject(err) + }) + .finally(() => { + uni.hideLoading(); + }) + }) +} +export default request1 \ No newline at end of file diff --git a/utils/utils.js b/utils/utils.js new file mode 100644 index 0000000..6f94817 --- /dev/null +++ b/utils/utils.js @@ -0,0 +1,39 @@ +/** + * yy-mm-dd + */ +export const dateFtt = date => { + if (date == null) { + return '' + } + let year = date.getFullYear() + let month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + return `${year}-${month}-${day}` + } + + /** + * yy-mm-dd hh:mm:ss + */ + export const dateTimeFtt = date => { + if (date == null) { + return '' + } + let year = date.getFullYear() + let month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1 + let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate() + let hh = date.getHours() < 10 ? '0' + date.getHours() : date.getHours() + let mm = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes() + let ss = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds() + return `${year}-${month}-${day} ${hh}:${mm}:${ss}` + } + + /** + * 将字符串形式的日期转换成日期对象 + */ + export const dateNew = date => { + if (date === undefined || date === 'undefined') { + return new Date() + } + return new Date(Date.parse(date)) + } + \ No newline at end of file diff --git a/vuex/modules/user.js b/vuex/modules/user.js new file mode 100644 index 0000000..a06b086 --- /dev/null +++ b/vuex/modules/user.js @@ -0,0 +1,77 @@ +import * as types from '../types' + +const baseUrl = process.env.NODE_ENV === 'development' ? 'http://10.1.3.90:8010' : 'http://10.1.3.90:8010' +const state = { + baseUrl: uni.getStorageSync('baseUrl') || baseUrl, + setTime: uni.getStorageSync('setTime') || 5000, + setPrintName: uni.getStorageSync('setPrintName') || '', + loginName: uni.getStorageSync('loginName') ? uni.getStorageSync('loginName') : '', + userInfo: uni.getStorageSync('userInfo') ? uni.getStorageSync('userInfo') : '', + saveToken: uni.getStorageSync('saveToken') || '' +} +const getters = { + baseUrl: state => state.baseUrl, + setTime: state => state.setTime, + setPrintName: state => state.setPrintName, + loginName: state => state.loginName, + userInfo: state => state.userInfo, + saveToken: state => state.saveToken +} +const actions = { + setConfig ({commit}, res) { + uni.setStorageSync('baseUrl', res.baseUrl) + uni.setStorageSync('setTime', res.setTime) + uni.setStorageSync('setPrintName', res.setPrintName) + commit(types.COM_CONFIG, res) + }, + saveLoginName({commit}, res) { + uni.setStorageSync('loginName', res) + commit(types.SAVE_LOGIN_NAME, res) + }, + delLoginName({commit}, res) { + uni.clearStorageSync('loginName') + commit(types.DEL_LOGIN_NAME, res) + }, + saveUserInfo({commit}, res) { + uni.setStorageSync('userInfo', res) + commit(types.SAVE_USER_INFO, res) + }, + delUserInfo({commit}, res) { + uni.removeStorageSync('userInfo') + uni.removeStorageSync('saveToken') + commit(types.DEL_USER_INFO, res) + }, + saveToken({commit}, res) { + uni.setStorageSync('saveToken', res) + commit(types.SAVE_TOKEN, res) + } +} +const mutations = { + [types.COM_CONFIG] (state, res) { + state.baseUrl = res.baseUrl + state.setTime = res.setTime + state.setPrintName = res.setPrintName + }, + [types.SAVE_LOGIN_NAME] (state, res) { + state.loginName = res + }, + [types.DEL_LOGIN_NAME] (state, res) { + state.loginName = res + }, + [types.SAVE_USER_INFO] (state, res) { + state.userInfo = res + }, + [types.DEL_USER_INFO] (state, res) { + state.userInfo = res + }, + [types.SAVE_TOKEN] (state, res) { + state.saveToken = res + } +} + +export default { + state, + getters, + actions, + mutations +} \ No newline at end of file diff --git a/vuex/store.js b/vuex/store.js new file mode 100644 index 0000000..095161f --- /dev/null +++ b/vuex/store.js @@ -0,0 +1,12 @@ +import Vue from 'vue' +import Vuex from 'vuex' + +import user from './modules/user' + +Vue.use(Vuex) + +export default new Vuex.Store({ + modules: { + user + } +}) diff --git a/vuex/types.js b/vuex/types.js new file mode 100644 index 0000000..4668940 --- /dev/null +++ b/vuex/types.js @@ -0,0 +1,9 @@ +/** + * user + */ +export const SAVE_LOGIN_NAME = 'SAVE_LOGIN_NAME' +export const DEL_LOGIN_NAME = 'DEL_LOGIN_NAME' +export const COM_CONFIG = 'COM_CONFIG' +export const SAVE_USER_INFO = 'SAVE_USER_INFO' +export const DEL_USER_INFO = 'DEL_USER_INFO' +export const SAVE_TOKEN = 'SAVE_TOKEN' \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..9370773 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,8 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +jsencrypt@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/jsencrypt/-/jsencrypt-3.2.1.tgz#09766983cc760088ff26b12fe7e574252af97727" + integrity sha512-k1sD5QV0KPn+D8uG9AdGzTQuamt82QZ3A3l6f7TRwMU6Oi2Vg0BsL+wZIQBONcraO1pc78ExMdvmBBJ8WhNYUA==