From 3bc4a4e9f6d1ad0b859c4e4bab8419be216fcc6b Mon Sep 17 00:00:00 2001 From: mo-bai <1873032855@qq.com> Date: Thu, 29 Dec 2022 12:14:26 +0800 Subject: [PATCH] feat: init --- .gitignore | 10 + .hbuilderx/launch.json | 20 + App.vue | 65 + README copy.md | 3 + apis/addressApi.js | 34 + apis/commonApi.js | 379 ++++++ apis/mineApi.js | 79 ++ common/css/reset.scss | 275 ++++ components/qn-easyinput/qn-easyinput.vue | 501 +++++++ .../qn-input-number/qn-input-number.vue | 95 ++ components/qn-mask/qn-mask.vue | 95 ++ components/scroll-list/images.js | 5 + components/scroll-list/scroll-list.vue | 696 ++++++++++ enums/index.js | 110 ++ env/index.js | 8 + jsconfig.json | 12 + main.js | 29 + manifest.json | 192 +++ package-lock.json | 12 + package.json | 13 + pages.json | 103 ++ pages/address/index.vue | 313 +++++ pages/h5-page/index.vue | 41 + pages/h5-view/index.vue | 35 + pages/index/index.vue | 25 + pages/login/index.vue | 192 +++ pages/mine/index.vue | 25 + pages/page-view/index.vue | 87 ++ pages/pay-result/index.vue | 114 ++ pages/pay/components/FileItem.vue | 151 +++ pages/pay/components/OrderInfo.vue | 82 ++ pages/pay/components/OtherItem.vue | 454 +++++++ pages/pay/components/officialAccountPopup.vue | 77 ++ pages/pay/index.vue | 24 + prettier.config.js | 20 + static/icon/iconfont.css | 25 + static/icon/iconfont.ttf | Bin 0 -> 1912 bytes static/imgs/general/add-icon.png | Bin 0 -> 2370 bytes static/imgs/general/baiduPan-icon.png | Bin 0 -> 4674 bytes static/imgs/general/blue-arrow-down.png | Bin 0 -> 6956 bytes static/imgs/general/blue-plus-icon.png | Bin 0 -> 141 bytes static/imgs/general/camera-icon.png | Bin 0 -> 4551 bytes static/imgs/general/cart-icon.png | Bin 0 -> 828 bytes static/imgs/general/close-circle-icon.png | Bin 0 -> 1748 bytes static/imgs/general/close-icon.png | Bin 0 -> 887 bytes static/imgs/general/coupon-txt-icon.png | Bin 0 -> 5033 bytes static/imgs/general/customer-service-icon.png | Bin 0 -> 1158 bytes static/imgs/general/default-fn-logo.png | Bin 0 -> 765 bytes static/imgs/general/doc-icon.png | Bin 0 -> 1988 bytes static/imgs/general/down-act-icon.png | Bin 0 -> 323 bytes static/imgs/general/down-icon.png | Bin 0 -> 359 bytes static/imgs/general/down.png | Bin 0 -> 461 bytes static/imgs/general/eye-icon.png | Bin 0 -> 634 bytes static/imgs/general/folder-icon.png | Bin 0 -> 1160 bytes static/imgs/general/gesture.png | Bin 0 -> 4537 bytes static/imgs/general/hand-up-icon.gif | Bin 0 -> 5558 bytes static/imgs/general/jinShan-icon.png | Bin 0 -> 5672 bytes static/imgs/general/local-icon.png | Bin 0 -> 3211 bytes static/imgs/general/logo-icon.png | Bin 0 -> 6658 bytes static/imgs/general/not-support-icon.png | Bin 0 -> 1944 bytes static/imgs/general/order-success-icon.png | Bin 0 -> 3233 bytes static/imgs/general/pdf-icon.png | Bin 0 -> 1482 bytes static/imgs/general/plus-icon.png | Bin 0 -> 514 bytes static/imgs/general/ppt-icon.png | Bin 0 -> 1367 bytes static/imgs/general/qn-txt.png | Bin 0 -> 4727 bytes static/imgs/general/question-mask-icon.png | Bin 0 -> 1294 bytes static/imgs/general/reduce-icon.png | Bin 0 -> 415 bytes static/imgs/general/right-arrow-blue.png | Bin 0 -> 1303 bytes static/imgs/general/right-arrow.png | Bin 0 -> 1218 bytes static/imgs/general/select-icon-small.png | Bin 0 -> 2172 bytes static/imgs/general/select-icon.png | Bin 0 -> 894 bytes static/imgs/general/selected-icon-small.png | Bin 0 -> 2082 bytes static/imgs/general/selected-icon.png | Bin 0 -> 984 bytes static/imgs/general/share.png | Bin 0 -> 666 bytes static/imgs/general/tenCent-icon.png | Bin 0 -> 3809 bytes static/imgs/general/top-arrow-icon.png | Bin 0 -> 381 bytes static/imgs/general/txt-bg.png | Bin 0 -> 5373 bytes static/imgs/general/up-act-icon.png | Bin 0 -> 316 bytes static/imgs/general/up-arrow-icon.png | Bin 0 -> 1257 bytes static/imgs/general/up-icon.png | Bin 0 -> 361 bytes static/imgs/general/upload-tip.png | Bin 0 -> 3478 bytes static/imgs/general/uploading.gif | Bin 0 -> 4969 bytes static/imgs/general/wx-icon.png | Bin 0 -> 4192 bytes static/imgs/index/customer-service-icon.png | Bin 0 -> 9633 bytes static/imgs/index/horn-icon.png | Bin 0 -> 997 bytes static/imgs/index/hot-icon.gif | Bin 0 -> 7196 bytes static/imgs/index/index-community-icon.png | Bin 0 -> 6215 bytes static/imgs/index/index-coupon-icon.png | Bin 0 -> 4257 bytes static/imgs/index/index-library-icon.png | Bin 0 -> 2518 bytes static/imgs/index/index-luck-draw-icon.png | Bin 0 -> 5535 bytes static/imgs/index/index-sign-in-icon.png | Bin 0 -> 4578 bytes static/imgs/index/send-icon.gif | Bin 0 -> 7046 bytes static/imgs/tabbar/category-blue.png | Bin 0 -> 1326 bytes static/imgs/tabbar/category-gray.png | Bin 0 -> 1680 bytes static/imgs/tabbar/index-blue.png | Bin 0 -> 1151 bytes static/imgs/tabbar/index-gray.png | Bin 0 -> 1717 bytes static/imgs/tabbar/mine-blue.png | Bin 0 -> 957 bytes static/imgs/tabbar/mine-gray.png | Bin 0 -> 1522 bytes static/imgs/tabbar/order-blue.png | Bin 0 -> 869 bytes static/imgs/tabbar/order-gray.png | Bin 0 -> 1529 bytes store/index.js | 163 +++ uni.scss | 77 ++ uni_modules/uni-badge/changelog.md | 29 + .../components/uni-badge/uni-badge.vue | 268 ++++ uni_modules/uni-badge/package.json | 88 ++ uni_modules/uni-badge/readme.md | 10 + uni_modules/uni-data-select/changelog.md | 10 + .../uni-data-select/uni-data-select.vue | 420 ++++++ 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 ++ .../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-load-more/changelog.md | 19 + .../components/uni-load-more/i18n/en.json | 5 + .../components/uni-load-more/i18n/index.js | 8 + .../uni-load-more/i18n/zh-Hans.json | 5 + .../uni-load-more/i18n/zh-Hant.json | 5 + .../uni-load-more/uni-load-more.vue | 399 ++++++ uni_modules/uni-load-more/package.json | 86 ++ uni_modules/uni-load-more/readme.md | 14 + uni_modules/uni-nav-bar/changelog.md | 22 + .../components/uni-nav-bar/uni-nav-bar.vue | 254 ++++ .../components/uni-nav-bar/uni-status-bar.vue | 27 + uni_modules/uni-nav-bar/package.json | 89 ++ uni_modules/uni-nav-bar/readme.md | 15 + uni_modules/uni-popup/changelog.md | 60 + .../components/uni-popup-dialog/keypress.js | 45 + .../uni-popup-dialog/uni-popup-dialog.vue | 271 ++++ .../uni-popup-message/uni-popup-message.vue | 143 ++ .../uni-popup-share/uni-popup-share.vue | 187 +++ .../components/uni-popup/i18n/en.json | 7 + .../components/uni-popup/i18n/index.js | 8 + .../components/uni-popup/i18n/zh-Hans.json | 7 + .../components/uni-popup/i18n/zh-Hant.json | 7 + .../components/uni-popup/keypress.js | 45 + .../uni-popup/components/uni-popup/popup.js | 26 + .../components/uni-popup/uni-popup.vue | 474 +++++++ uni_modules/uni-popup/package.json | 90 ++ uni_modules/uni-popup/readme.md | 17 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/manifest.json | 95 ++ uni_modules/uni-scss/package.json | 82 ++ uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + .../uni-scss/styles/setting/_border.scss | 3 + .../uni-scss/styles/setting/_color.scss | 66 + .../uni-scss/styles/setting/_radius.scss | 55 + .../uni-scss/styles/setting/_space.scss | 56 + .../uni-scss/styles/setting/_styles.scss | 167 +++ .../uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 ++ .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-steps/changelog.md | 16 + .../components/uni-steps/uni-steps.vue | 269 ++++ uni_modules/uni-steps/package.json | 89 ++ uni_modules/uni-steps/readme.md | 13 + uni_modules/uni-transition/changelog.md | 20 + .../uni-transition/createAnimation.js | 128 ++ .../uni-transition/uni-transition.vue | 277 ++++ uni_modules/uni-transition/package.json | 87 ++ uni_modules/uni-transition/readme.md | 11 + utils/eventBus.js | 48 + utils/hook.js | 421 ++++++ utils/http/http.js | 137 ++ utils/http/index.js | 150 +++ utils/index.js | 480 +++++++ utils/is.js | 25 + utils/md5.js | 223 ++++ utils/monitor/Error.js | 46 + utils/monitor/index.js | 48 + utils/monitor/monitorEnum.js | 17 + utils/monitor/rewriteApp.js | 30 + utils/monitor/rewritePage.js | 11 + utils/monitor/rewriteRequest.js | 105 ++ utils/socket/index.js | 52 + utils/vueWxRouter.js | 24 + 184 files changed, 13494 insertions(+) create mode 100644 .gitignore create mode 100644 .hbuilderx/launch.json create mode 100644 App.vue create mode 100644 README copy.md create mode 100644 apis/addressApi.js create mode 100644 apis/commonApi.js create mode 100644 apis/mineApi.js create mode 100644 common/css/reset.scss create mode 100644 components/qn-easyinput/qn-easyinput.vue create mode 100644 components/qn-input-number/qn-input-number.vue create mode 100644 components/qn-mask/qn-mask.vue create mode 100644 components/scroll-list/images.js create mode 100644 components/scroll-list/scroll-list.vue create mode 100644 enums/index.js create mode 100644 env/index.js create mode 100644 jsconfig.json create mode 100644 main.js create mode 100644 manifest.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages.json create mode 100644 pages/address/index.vue create mode 100644 pages/h5-page/index.vue create mode 100644 pages/h5-view/index.vue create mode 100644 pages/index/index.vue create mode 100644 pages/login/index.vue create mode 100644 pages/mine/index.vue create mode 100644 pages/page-view/index.vue create mode 100644 pages/pay-result/index.vue create mode 100644 pages/pay/components/FileItem.vue create mode 100644 pages/pay/components/OrderInfo.vue create mode 100644 pages/pay/components/OtherItem.vue create mode 100644 pages/pay/components/officialAccountPopup.vue create mode 100644 pages/pay/index.vue create mode 100644 prettier.config.js create mode 100644 static/icon/iconfont.css create mode 100644 static/icon/iconfont.ttf create mode 100644 static/imgs/general/add-icon.png create mode 100644 static/imgs/general/baiduPan-icon.png create mode 100644 static/imgs/general/blue-arrow-down.png create mode 100644 static/imgs/general/blue-plus-icon.png create mode 100644 static/imgs/general/camera-icon.png create mode 100644 static/imgs/general/cart-icon.png create mode 100644 static/imgs/general/close-circle-icon.png create mode 100644 static/imgs/general/close-icon.png create mode 100644 static/imgs/general/coupon-txt-icon.png create mode 100644 static/imgs/general/customer-service-icon.png create mode 100644 static/imgs/general/default-fn-logo.png create mode 100644 static/imgs/general/doc-icon.png create mode 100644 static/imgs/general/down-act-icon.png create mode 100644 static/imgs/general/down-icon.png create mode 100644 static/imgs/general/down.png create mode 100644 static/imgs/general/eye-icon.png create mode 100644 static/imgs/general/folder-icon.png create mode 100644 static/imgs/general/gesture.png create mode 100644 static/imgs/general/hand-up-icon.gif create mode 100644 static/imgs/general/jinShan-icon.png create mode 100644 static/imgs/general/local-icon.png create mode 100644 static/imgs/general/logo-icon.png create mode 100644 static/imgs/general/not-support-icon.png create mode 100644 static/imgs/general/order-success-icon.png create mode 100644 static/imgs/general/pdf-icon.png create mode 100644 static/imgs/general/plus-icon.png create mode 100644 static/imgs/general/ppt-icon.png create mode 100644 static/imgs/general/qn-txt.png create mode 100644 static/imgs/general/question-mask-icon.png create mode 100644 static/imgs/general/reduce-icon.png create mode 100644 static/imgs/general/right-arrow-blue.png create mode 100644 static/imgs/general/right-arrow.png create mode 100644 static/imgs/general/select-icon-small.png create mode 100644 static/imgs/general/select-icon.png create mode 100644 static/imgs/general/selected-icon-small.png create mode 100644 static/imgs/general/selected-icon.png create mode 100644 static/imgs/general/share.png create mode 100644 static/imgs/general/tenCent-icon.png create mode 100644 static/imgs/general/top-arrow-icon.png create mode 100644 static/imgs/general/txt-bg.png create mode 100644 static/imgs/general/up-act-icon.png create mode 100644 static/imgs/general/up-arrow-icon.png create mode 100644 static/imgs/general/up-icon.png create mode 100644 static/imgs/general/upload-tip.png create mode 100644 static/imgs/general/uploading.gif create mode 100644 static/imgs/general/wx-icon.png create mode 100644 static/imgs/index/customer-service-icon.png create mode 100644 static/imgs/index/horn-icon.png create mode 100644 static/imgs/index/hot-icon.gif create mode 100644 static/imgs/index/index-community-icon.png create mode 100644 static/imgs/index/index-coupon-icon.png create mode 100644 static/imgs/index/index-library-icon.png create mode 100644 static/imgs/index/index-luck-draw-icon.png create mode 100644 static/imgs/index/index-sign-in-icon.png create mode 100644 static/imgs/index/send-icon.gif create mode 100644 static/imgs/tabbar/category-blue.png create mode 100644 static/imgs/tabbar/category-gray.png create mode 100644 static/imgs/tabbar/index-blue.png create mode 100644 static/imgs/tabbar/index-gray.png create mode 100644 static/imgs/tabbar/mine-blue.png create mode 100644 static/imgs/tabbar/mine-gray.png create mode 100644 static/imgs/tabbar/order-blue.png create mode 100644 static/imgs/tabbar/order-gray.png create mode 100644 store/index.js create mode 100644 uni.scss create mode 100644 uni_modules/uni-badge/changelog.md create mode 100644 uni_modules/uni-badge/components/uni-badge/uni-badge.vue create mode 100644 uni_modules/uni-badge/package.json create mode 100644 uni_modules/uni-badge/readme.md create mode 100644 uni_modules/uni-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/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-load-more/changelog.md create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/en.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/index.js create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json create mode 100644 uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue create mode 100644 uni_modules/uni-load-more/package.json create mode 100644 uni_modules/uni-load-more/readme.md create mode 100644 uni_modules/uni-nav-bar/changelog.md create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue create mode 100644 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue create mode 100644 uni_modules/uni-nav-bar/package.json create mode 100644 uni_modules/uni-nav-bar/readme.md create mode 100644 uni_modules/uni-popup/changelog.md create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue create mode 100644 uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/en.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/index.js create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json create mode 100644 uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json create mode 100644 uni_modules/uni-popup/components/uni-popup/keypress.js create mode 100644 uni_modules/uni-popup/components/uni-popup/popup.js create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.vue create mode 100644 uni_modules/uni-popup/package.json create mode 100644 uni_modules/uni-popup/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/manifest.json 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-steps/changelog.md create mode 100644 uni_modules/uni-steps/components/uni-steps/uni-steps.vue create mode 100644 uni_modules/uni-steps/package.json create mode 100644 uni_modules/uni-steps/readme.md create mode 100644 uni_modules/uni-transition/changelog.md create mode 100644 uni_modules/uni-transition/components/uni-transition/createAnimation.js create mode 100644 uni_modules/uni-transition/components/uni-transition/uni-transition.vue create mode 100644 uni_modules/uni-transition/package.json create mode 100644 uni_modules/uni-transition/readme.md create mode 100644 utils/eventBus.js create mode 100644 utils/hook.js create mode 100644 utils/http/http.js create mode 100644 utils/http/index.js create mode 100644 utils/index.js create mode 100644 utils/is.js create mode 100644 utils/md5.js create mode 100644 utils/monitor/Error.js create mode 100644 utils/monitor/index.js create mode 100644 utils/monitor/monitorEnum.js create mode 100644 utils/monitor/rewriteApp.js create mode 100644 utils/monitor/rewritePage.js create mode 100644 utils/monitor/rewriteRequest.js create mode 100644 utils/socket/index.js create mode 100644 utils/vueWxRouter.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..287bdf7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.vscode/settings.json +/unpackage/dist +/unpackage/cache +/unpackage/release +/unpackage/debug + +.vscode/ + +.DS_Store +/**/.DS_Store diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json new file mode 100644 index 0000000..ee5be77 --- /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" + }, + "mp-weixin" : + { + "launchtype" : "local" + }, + "type" : "uniCloud" + } + ] +} diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..6f7972c --- /dev/null +++ b/App.vue @@ -0,0 +1,65 @@ + + + diff --git a/README copy.md b/README copy.md new file mode 100644 index 0000000..2d3dc96 --- /dev/null +++ b/README copy.md @@ -0,0 +1,3 @@ +# 飞鸟快印微信小程序 + +uni-app diff --git a/apis/addressApi.js b/apis/addressApi.js new file mode 100644 index 0000000..3a3f448 --- /dev/null +++ b/apis/addressApi.js @@ -0,0 +1,34 @@ +import http from '@/utils/http/index.js' + +/** + * 获取用户地址列表 + * @param {object} data 参数 userId + */ +export function getAddressList(data = {}) { + return http.get({ + url: `/wukong-fast-print/get/personal-shipping-address/list`, + data + }) +} + +/** + * 保存或修改用户地址列表 + * @param {object} data 参数 id + */ +export function changeAddress(data = {}) { + return http.post({ + url: `/wukong-fast-print/save/personal-shipping-address`, + data + }) +} + +/** + * 删除用户地址 + * @param {object} data 参数 id + */ +export function deleteAddress(data = {}) { + return http.post({ + url: `/wukong-fast-print/delete/my-address`, + data + }) +} diff --git a/apis/commonApi.js b/apis/commonApi.js new file mode 100644 index 0000000..46247d6 --- /dev/null +++ b/apis/commonApi.js @@ -0,0 +1,379 @@ +import http from '@/utils/http/index.js' +import store from '@/store/index' +import { XAPPID} from '@/enums/index.js' +import { wxAuthorize } from '@/apis/mineApi.js' + +let priceMap = null + +/** + * 获取价目表 + * @param {boolean} refresh 是否刷新 + * @returns + */ +export function getPriceMap(refresh = false) { + return new Promise((resolve) => { + if (!refresh && priceMap) { + resolve(priceMap) + } else { + http.get({ url: '/wukong-fast-print/get/printing/file/marked/price/by' }).then((res) => { + priceMap = res + resolve(res) + }) + } + }) +} + +let postageMap = null +/** + * 获取邮费 + * @param {boolean} refresh 是否刷新 + * @returns + */ +export function getPostagePrice(refresh = true, goodsId = '') { + return new Promise((resolve) => { + if (!refresh && postageMap) { + resolve(postageMap) + } else { + let data = { goodsId } + let params = goodsId ? { url: '/wukong-fast-print/get/postage/conditions', data } : { url: '/wukong-fast-print/get/postage/conditions' } + http.get(params).then((res) => { + postageMap = res + resolve(res) + }) + } + }) +} + +/** + * 获取OSS上传信息 + * @returns + */ +export function getOssInfo() { + return http.get({ + url: '/wukong-fast-print/getOssSign' + }) +} + +let loading = false +let resolveQueue = [] +let rejectQueue = [] +/** + * 获取用户tmpAuthToken和openId + * @return {Promise} + */ +export function getUserAccountInfo() { + if (loading) { + return new Promise((resolve, reject) => { + resolveQueue.push(resolve) + rejectQueue.push(reject) + }) + } + loading = true + return new Promise((resolve, reject) => { + uni.login({ + provider: 'weixin', + success: (loginRes) => { + let code = loginRes.code + getSession({ authCode: code }) + .then((res) => { + resolve(res) + resolveQueue.forEach((fn) => { + fn(res) + }) + }) + .catch((err) => { + reject(err) + rejectQueue.forEach((fn) => { + fn(err) + }) + }) + .finally(() => { + loading = false + resolveQueue = [] + rejectQueue = [] + }) + }, + fail: (err) => { + reject(err) + rejectQueue.forEach((fn) => { + fn(err) + }) + loading = false + resolveQueue = [] + rejectQueue = [] + } + }) + }) +} + +/** + * 获取微信小程序认证会话 + * @param {object} data 参数 authCode + */ +export function getSession(data = {}) { + return http.post( + { + url: `/uec/get/wechat-applet-session`, + data + }, + { hideLoading: true } + ) +} +// wx登陆生成器缓存 +let loginGenerator = {} +// wx会话缓存 +let session = {} +/** + * 微信小程序登陆 + * @param {object} data + * @returns {(login:Function,getSession:Function)} + */ +export function wxLoginGenerate() { + if (loginGenerator.login && loginGenerator.getSession) { + if (Date.now() > session.expireTime) { + loginGenerator.getSession() + } + return loginGenerator + } + let completed = false + function getSession() { + getUserAccountInfo() + .then(({ tmpAuthToken, openId, expireTime }) => { + expireTime = expireTime.replace(/-/g, '/') + store.commit('setOpenId', openId) + session = { tmpAuthToken, openId, expireTime: new Date(expireTime) } + completed = true + }) + .catch((err) => { + console.log(err) + completed = false + }) + } + getSession() + function login() { + return new Promise((resolve, reject) => { + if (!completed) { + reject('未获取到会话,请再次点击登陆') + return + } + if (Date.now() > session.expireTime) { + getSession() + reject('会话已失效,请再次点击登陆') + return + } + uni.getUserProfile({ + desc: '获取你的昵称、头像', + success: (res) => { + let iv = res.iv + let encryptedData = res.encryptedData + uni.showLoading({ + title: '加载中' + }) + wxAuthorize({ iv, encryptedData, tmpAuthToken: session.tmpAuthToken }) + .then((info) => { + let userInfo = { + name: res.userInfo.nickName, + userId: info.userId, + avatar: res.userInfo.avatarUrl, + mobile: '' + } + store.commit('setUserInfo', userInfo) + store.commit('setToken', info.token) + resolve(userInfo) + }) + .catch(() => { + reject('获取用户信息异常,请联系客服') + }) + .finally(() => { + uni.hideLoading() + }) + }, + fail: () => { + reject('请同意昵称和头像信息的授权') + } + }) + }) + } + loginGenerator = { login, getSession } + return loginGenerator +} + +/** + * 获取当前账号的企业实名认证地址 + * @param {object} data 参数 enterpriseId + */ +export function getVerifyUrl(data = {}) { + return http.post({ url: '/yyt-uec/get/fdd-enterprise-verify-url?enterpriseId=' + data.enterpriseId, data }) +} + +/** + * 生成担保合同的签约地址,同意纸盘商只需要签约一次即可 + * @param {object} data 参数 mallSupplierId + */ +export function getGuaranteeContract(data = {}) { + return http.post({ + url: `/yyt-uec/create/supplier/guarantee-contract?mallSupplierId=${data.mallSupplierId}&customerEnterpriseId=${data.customerEnterpriseId}`, + data + }) +} + +/** + * 转换合同成图片 + * @param {object} data 图片地址链接 fileUrl + */ +export function transformFileToImg(data) { + return http.get({ + url: '/document/get/enterprise-documents/file-image-base64', + data: data + }) +} + +/** + * 获取快递列表 + * @param {object} data + */ +export function getPostageList(data) { + return http.get({ + url: '/wukong-fast-print/get/printing/express/type', + data: data + }) +} + +/** + * 获取网盘链接地址 + * @param {object} data + */ +export function getBandingLink(data) { + return http.get({ + url: '/uec/user/get/baidu-pan/authorize-page', + data: data + }) +} + +/** + * 获取当前账号企业的飞算额度 + * @param {object} data 参数 enterpriseId + */ +export function getFsCredit(data = {}) { + return http.get({ + url: '/yyt-uec/credit/get/enterprise-feisuan-credit', + data + }) +} + +/** + * 获取当前账号企业的被担保的月结额度 + * @param {object} data 参数 enterpriseId supplierId + */ +export function getMonthCredit(data = {}) { + return http.get({ url: '/yyt-uec/customer/get/supplier-credit', data }) +} + +/** + * 推送客户绑定 + * + */ +export function pushCustomerBind(cid, platformType = 'android', appId = XAPPID) { + return http.post({ + url: '/base-paper-trading/user/binding/geTui/cid', + data: { cid, appId, platformType } + }) +} + +/** + * 推送客户绑定 + * + */ +export function pushCustomerOff(cid, platformType = 'android', appId = XAPPID) { + return http.post({ + url: '/base-paper-trading/user/geTui/offline', + data: { cid, appId, platformType } + }) +} + +/** + * 营业执照OCR识别 photoUrl + */ +export function getLicenseOcr(data = {}) { + return http.post({ + url: '/base-paper-trading/ocr/business-license', + data: data + }) +} + +/** + * 身份证正面OCR识别 image + */ +export function getFrontIdCardOcr(data = {}) { + return http.post({ + url: '/base-paper-trading/ocr/id-card/face', + data: data + }) +} + +/** + * 飞鸟快印绑定代销商 + * @param {object} data storeUserId + */ +export function bindingStore(data = {}) { + return http.post( + { + url: '/wukong-fast-print/user/create/distribution-relation', + data: data + }, + { hideLoading: true } + ) +} + +/** + * 获取二维码绑定的userId + * @param {object} data host QrCodeRecordId + */ +export function getQrCodeRecordId(data = {}) { + return http.get( + { + url: '/uec/verify/qrcode', + data + }, + { hideLoading: true } + ) +} + +/** + * 获取半天妖客户经理列表 + * @param {object} data host QrCodeRecordId + */ +export function getBTAreaList() { + return http.get( + { + url: '/wukong-fast-print/get/ban/tian/yao/area/customer/manager/list' + }, + { hideLoading: true } + ) +} + +/** + * 获取活动海报 + */ +export function getPoster(data = {}) { + return http.get({ + url: '/uec/fission/get/poster', + data + }) +} + +/** + * 用户修改用户昵称和头像 + * @param {*} data + * @returns + */ +export function changeUserInfo(data = {}) { + return http.post({ + url: '/uec/user/update/user-info', + data: data + }) +} + +export function uploadAvatar(path) { + return http.uploadFile({ data: { filePath: path } }) +} diff --git a/apis/mineApi.js b/apis/mineApi.js new file mode 100644 index 0000000..9ee7ebf --- /dev/null +++ b/apis/mineApi.js @@ -0,0 +1,79 @@ +import http from '@/utils/http/index.js' + +/** + * 微信登录认证获取token + * @param {object} data 参数 encryptedData iv tmpAuthToken + */ +export function wxAuthorize(data = {}) { + return http.post({ + url: `/uec/authorize/by-wechat-applet/without-regest`, + data + }) +} + +/** + * 微信小程序静默登录 + * @param {object} data 参数 authCode + */ +export function silentLogin(data = {}) { + return http.post( + { + url: `/uec/authorize/by-wechat-applet/without-regest/unlogin`, + data + }, + { hideLoading: true } + ) +} + +/** + * 获取用户代理商状态 + * @param {object} data 参数 + */ +export function getStoreState(data = {}) { + return http.get( + { + url: `/wukong-fast-print/get/agency/shop/status`, + data + }, + { hideLoading: true } + ) +} + +/** + * 获取代理商佣金统计 + * @param {object} data 参数 + */ +export function getStoreStatistics(data = {}) { + return http.get( + { + url: `/wukong-fast-print/get/agency/commission/statistics`, + data + }, + { hideLoading: true } + ) +} + + +/** + * 提交店铺申请 + * @param {object} data 参数 + */ +export function makeStoreApplication(data = {}) { + return http.post({ + url: `/wukong-fast-print/submit/agency/store/apply`, + data + }) +} + +/** + * 获取代理商佣金统计 + * @param {object} data 参数 + */ + export function getPreferentialCardList(data = {}) { + return http.get( + { + url: `/wukong-fast-print/get/preferential/card/list`, + data + } + ) +} diff --git a/common/css/reset.scss b/common/css/reset.scss new file mode 100644 index 0000000..ae26b09 --- /dev/null +++ b/common/css/reset.scss @@ -0,0 +1,275 @@ +page { + font-size: $uni-font-size-base; + line-height: 1; + background-color: #f7f8fa; + -webkit-overflow-scrolling: touch; /* 使ios列表滑动流畅*/ +} +// 标签重置 +page, +view, +input, +text, +form, +navigator, +rich-text, +picker, +scroll-view, +cover-view, +open-data { + box-sizing: border-box; +} +rich-text, +open-data, +form { + display: block; +} + +view, +image, +text { + box-sizing: border-box; + flex-shrink: 0; +} +// flex快捷类 +.flex-row { + display: flex; + flex-direction: row; +} + +.flex-col { + display: flex; + flex-direction: column; +} + +.justify-start { + display: flex; + justify-content: flex-start; +} + +.justify-center { + display: flex; + justify-content: center; +} + +.justify-end { + display: flex; + justify-content: flex-end; +} + +.justify-evenly { + display: flex; + justify-content: space-evenly; +} + +.justify-around { + display: flex; + justify-content: space-around; +} + +.justify-between { + display: flex; + justify-content: space-between; +} + +.items-start { + display: flex; + align-items: flex-start; +} + +.items-center { + display: flex; + align-items: center; +} + +.items-end { + display: flex; + align-items: flex-end; +} +.text-ellipsis { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +cover-view { + line-height: 1.5; + white-space: normal; +} +// 隐藏滑动条 +*::webkit-scrollbar { + display: none; +} +// 重置按钮样式 +button::after { + border: 0; +} + +/* 清除浮动 */ +.clearfix:after { + content: '.'; + display: block; + height: 0; + clear: both; + visibility: hidden; +} +// 两行省略号 +.u-line-2 { + -webkit-line-clamp: 2; + overflow: hidden; + word-break: break-all; + text-overflow: ellipsis; + display: -webkit-box; // 弹性伸缩盒 + -webkit-box-orient: vertical; // 设置伸缩盒子元素排列方式 +} + +// flex 快捷类 +.flex-row-start-start { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: flex-start; +} +.flex-row-start-center { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: center; +} +.flex-row-start-end { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: flex-end; +} +.flex-row-start-space { + display: flex; + flex-direction: row; + align-items: flex-start; + justify-content: space-between; +} +.flex-row-center-start { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-start; +} +.flex-row-center-center { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; +} +.flex-row-center-end { + display: flex; + flex-direction: row; + align-items: center; + justify-content: flex-end; +} +.flex-row-center-space { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} +.flex-row-end-start { + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: flex-start; +} +.flex-row-end-center { + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: center; +} +.flex-row-end-end { + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: flex-end; +} +.flex-row-end-space { + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: space-between; +} + +.flex-col-start-start { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; +} +.flex-col-start-center { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.flex-col-start-end { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-end; +} +.flex-col-start-space { + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: space-between; +} +.flex-col-center-start { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; +} +.flex-col-center-center { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} +.flex-col-center-end { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-end; +} +.flex-col-center-space { + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; +} +.flex-col-end-start { + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: flex-start; +} +.flex-col-end-center { + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: center; +} +.flex-col-end-end { + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: flex-end; +} +.flex-col-end-space { + display: flex; + flex-direction: column; + align-items: flex-end; + justify-content: space-between; +} +// flex 快捷子类 +.flex-base { + flex-grow: 0; + flex-shrink: 0; +} diff --git a/components/qn-easyinput/qn-easyinput.vue b/components/qn-easyinput/qn-easyinput.vue new file mode 100644 index 0000000..984486c --- /dev/null +++ b/components/qn-easyinput/qn-easyinput.vue @@ -0,0 +1,501 @@ + + + + + diff --git a/components/qn-input-number/qn-input-number.vue b/components/qn-input-number/qn-input-number.vue new file mode 100644 index 0000000..353dfc6 --- /dev/null +++ b/components/qn-input-number/qn-input-number.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/components/qn-mask/qn-mask.vue b/components/qn-mask/qn-mask.vue new file mode 100644 index 0000000..98278f6 --- /dev/null +++ b/components/qn-mask/qn-mask.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/components/scroll-list/images.js b/components/scroll-list/images.js new file mode 100644 index 0000000..ed8007a --- /dev/null +++ b/components/scroll-list/images.js @@ -0,0 +1,5 @@ +export default { + empty: 'data:image/png;base64,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', + success: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC4wMSIvPjxwYXRoIGQ9Ik0xMCAyNEwyMCAzNEw0MCAxNCIgc3Ryb2tlPSIjMzAzMTMzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==', + error: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48c3ZnIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDQ4IDQ4IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxyZWN0IHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC4wMSIvPjxwYXRoIGQ9Ik0xNCAxNEwzNCAzNCIgc3Ryb2tlPSIjMzAzMTMzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0xNCAzNEwzNCAxNCIgc3Ryb2tlPSIjMzAzMTMzIiBzdHJva2Utd2lkdGg9IjMiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvc3ZnPg==' +} diff --git a/components/scroll-list/scroll-list.vue b/components/scroll-list/scroll-list.vue new file mode 100644 index 0000000..5555721 --- /dev/null +++ b/components/scroll-list/scroll-list.vue @@ -0,0 +1,696 @@ + + + + + diff --git a/enums/index.js b/enums/index.js new file mode 100644 index 0000000..f34481f --- /dev/null +++ b/enums/index.js @@ -0,0 +1,110 @@ +import env from '@/env/index.js' +const urlEnv = env === 'production' ? '' : `-${env}` + +export const XAPPID = '503258978847966413' + +// 统一支付接口 +export const PAY_URL = `https://api-client-psc${urlEnv}.qniao.cn/payment-settlement-center/pay` + +/** + * 上传地址 + */ +export const uploadUrl = { + image: `https://api-client-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/image`, + file: `https://api-client-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/file`, + // video: `https://api-client-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/file?type=mp4` + video: `https://api-client-yyt${urlEnv}.qniao.cn/yyt-uec/file-uploading/upload/video/file?type=mp4`, + printFile: `https://api-ops-yyt${urlEnv}.qniao.cn/wukong-fast-print/printing-file/upload/file` +} + +/** + * 文件类型 图片:1,视频:2 + */ +export const fileType = { + IMG: 1, + VIDEO: 2 +} + +/** + * 收货地址是否默认 1:默认 0:非默认 + */ +export const addressType = { + DEFAULT: true, + NOT_DEFAULT: false +} + +/** + * 支付方式 1:微信支付 2:月结支付 4:飞算支付 + */ +export const paymentMethodEnum = { + WECHAT_PAY: 1, + MONTHLY_PAY: 2, + FLY_PAY: 4 +} + +export const paymentMethodMap = { + [paymentMethodEnum.WECHAT_PAY]: '微信支付', + [paymentMethodEnum.MONTHLY_PAY]: '月结支付', + [paymentMethodEnum.FLY_PAY]: '飞算支付' +} + +/** + * 订单状态 0:全部 40001:待付款 40002:待确认 40003:生产中 40004:运输中 40005:已完成 40009:待揽收 40006:已取消 40007:退款中 + */ +export const orderStatus = { + ALL: 0, + WAIT_PAY: 40001, + WAIT_CONFIRM: 40002, + PRINTING: 40003, + TRANSPORTING: 40004, + COMPLETED: 40005, + WAIT_COLLECT: 40009, + CANCELLED: 40006, + REFUND: 40007, + REFUNDED: 40008 +} + +/** + * 订单全部状态 40001:待付款 40002:待确认 40003:生产中 40004:运输中 40005:已完成 40007:退款中 40008:已退款 40009:待揽收 40006:已取消 + */ +export const orderStatusMap = { + 40001: '待付款', + 40002: '待确认', + 40003: '生产中', + 40004: '运输中', + 40005: '已完成', + 40007: '退款中', + 40008: '已退款', + 40006: '已取消', + 40009: '待发货' +} +/** + * 物料状态 20003:已发货 20004:已完成 20005:已取消 + */ +export const suppliesOrderItemStatus = { + TRANSPORTING: 20003, + COMPLETED: 20004, + CANCEL: 20005 +} +/** + * 解决oss图片缓存问题 + */ +let images = { + 'service-bg': `https://qncloud.oss-cn-shenzhen.aliyuncs.com/wukong-printer-wx/service-bg.png` +} + +function splicingTimestamps(obj) { + for (let key in obj) { + obj[key] = obj[key] + `?timeStamp=${Date.now()}` + } + return obj +} + +export const imgStamp = Object.freeze(splicingTimestamps(images)) + +/** + * 全局事件key + */ +export const cacheKey = { + ORDER_PARAM: 'orderParam' // 订单列表查询参数参数 +} diff --git a/env/index.js b/env/index.js new file mode 100644 index 0000000..a0bfcb1 --- /dev/null +++ b/env/index.js @@ -0,0 +1,8 @@ +/** + * @description 唯一环境变量 + */ +const env = 'test' +// const env = 'dev' +// const env = 'production' + +export default env diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..a57f870 --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@/*": ["./*"], + "/*": ["./*"] + }, + "target": "ES6" + }, + "include": ["./**/*"], + "exclude": ["./uni_modules"] +} diff --git a/main.js b/main.js new file mode 100644 index 0000000..1ec2ef8 --- /dev/null +++ b/main.js @@ -0,0 +1,29 @@ +import App from './App' +import store from './store' +import Vue from 'vue' +import { Monitor } from '@/utils/monitor/index' +import { XAPPID } from '@/enums/index.js' +import env from '@/env/index.js' +import vueWxRouter from '@/utils/vueWxRouter' + +const urlEnv = env === 'production' ? '' : `-${env}` +// # ifdef MP-WEIXIN +// const monitor = new Monitor({ +// url: `https://api-client-yyt${urlEnv}.qniao.cn/wukong-fast-print/vue/error/message`, +// timeout: 5000, +// method: 'POST', +// env, +// header: { 'X-APP-ID': XAPPID } +// }) +// monitor.init() +// # endif + +Vue.config.productionTip = false +// Vue.prototype.$store = store +App.mpType = 'app' +Vue.use(vueWxRouter) +const app = new Vue({ + ...App, + store +}) +app.$mount() diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..41605ef --- /dev/null +++ b/manifest.json @@ -0,0 +1,192 @@ +{ + "name" : "飞鸟快印", + "appid" : "__UNI__EBBA73E", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : 100, + "transformPx" : false, + "networkTimeout" : { + "request" : 6000 + }, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + "compatible" : { + "ignoreVersion" : true + }, + /* 模块配置 */ + "modules" : { + "iBeacon" : {}, + "Share" : {}, + "Payment" : {} + }, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ], + "abiFilters" : [ "armeabi-v7a", "x86" ] + }, + /* ios打包配置 */ + "ios" : { + "privacyDescription" : { + "NSPhotoLibraryUsageDescription" : "该应用需要读取你的相册,以便为你编辑信息", + "NSPhotoLibraryAddUsageDescription" : "该应用需要读取你的相册,以便为你保存信息", + "NSCameraUsageDescription" : "该应用需要使用你的摄像头,以便为你编辑信息", + "NSLocationWhenInUseUsageDescription" : "该应用需要你的地理位置,以便为你提供当前位置附近印包厂信息", + "NSLocationAlwaysUsageDescription" : "该应用需要你的地理位置,以便为你提供当前位置附近印包厂信息", + "NSLocationAlwaysAndWhenInUseUsageDescription" : "该应用需要你的地理位置,以便为你提供当前位置附近印包厂信息" + }, + "idfa" : false + }, + /* SDK配置 */ + "sdkConfigs" : { + "maps" : { + "amap" : { + "appkey_ios" : "0182ee2a9fdd5fd3ef6a8bd5a2f98325", + "appkey_android" : "877848546f7f3717101a17c33e1d4df3" + } + }, + "payment" : { + "weixin" : { + "__platform__" : [ "ios", "android" ], + "appid" : "wx6c66084e2de41575", + "UniversalLinks" : "https://apple-app-yyt-printpackage.qniao.cn/" + } + }, + "ad" : {}, + "geolocation" : { + "amap" : { + "__platform__" : [ "ios", "android" ], + "appkey_ios" : "0182ee2a9fdd5fd3ef6a8bd5a2f98325", + "appkey_android" : "877848546f7f3717101a17c33e1d4df3" + } + }, + "share" : { + "weixin" : { + "appid" : "wx6c66084e2de41575", + "UniversalLinks" : "https://apple-app-yyt-printpackage.qniao.cn/" + } + }, + "push" : { + "unipush" : {} + } + }, + "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" + } + } + }, + "splashscreen" : { + "androidStyle" : "default", + "iosStyle" : "common" + } + }, + "uniStatistics" : { + "enable" : true + }, + "nativePlugins" : {} + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "wx74a65d2467a4d8ab", + "setting" : { + "urlCheck" : false, + "minified" : true + }, + "usingComponents" : true, + "plugins" : { + "materialPlugin" : { + "version" : "1.0.5", + "provider" : "wx4d2deeab3aed6e5a" + }, + "live-player-plugin" : { + "version" : "1.3.5", + "provider" : "wx2b03c6e691cd7370" + } + }, + "permission" : {}, + "requiredPrivateInfos" : [ "chooseAddress" ], + "lazyCodeLoading" : "requiredComponents" + }, + "navigateToMiniProgramAppIDList" : [ "wx654ce96a7324e76f" ], + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics" : { + "enable" : false + }, + "vueVersion" : "2", + "h5" : { + "router" : { + "mode" : "history" + }, + "devServer" : { + "port" : 9090 + } + } +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..39194ba --- /dev/null +++ b/package-lock.json @@ -0,0 +1,12 @@ +{ + "name": "canvas 生成海报", + "version": "3.2.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "canvas 生成海报", + "version": "3.2.2" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..46a9d73 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "id": "hch-poster", + "name": "canvas 生成海报", + "version": "3.2.2", + "description": "分享弹窗,生成海报并支持保存,支持多端(H5,微信小程序,支付宝小程序,百度小程序,字节跳动小程序,QQ小程序)", + "keywords": [ + "分享", + "海报", + "自定义图片", + "小程序码", + "商城商品分享海报。" + ] +} \ No newline at end of file diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..ff84c3c --- /dev/null +++ b/pages.json @@ -0,0 +1,103 @@ +{ + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "首页", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/mine/index", + "style": { + "navigationBarTitleText": "个人中心", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/address/index", + "style": { + "navigationBarTitleText": "我的地址", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/pay/index", + "style": { + "navigationBarTitleText": "支付", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/pay-result/index", + "style": { + "navigationBarTitleText": "支付结果", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/h5-view/index", + "style": { + "navigationBarTitleText": "统一的H5落地页", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/h5-page/index", + "style": { + "navigationBarTitleText": "飞鸟快印", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/login/index", + "style": { + "navigationBarTitleText": "登陆", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + }, + { + "path": "pages/page-view/index", + "style": { + "navigationBarTitleText": "飞鸟快印", + "enablePullDownRefresh": false, + "navigationStyle": "custom" + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8", + "backgroundColorTop": "#FFFFFF" + }, + "tabBar": { + "color": "#888", + "selectedColor": "#007AFF", + "borderStyle": "white", + "backgroundColor": "#f9f9f9", + "list": [ + { + "pagePath": "pages/index/index", + "iconPath": "static/imgs/tabbar/index-gray.png", + "selectedIconPath": "static/imgs/tabbar/index-blue.png", + "text": "首页" + }, + { + "pagePath": "pages/mine/index", + "iconPath": "static/imgs/tabbar/mine-gray.png", + "selectedIconPath": "static/imgs/tabbar/mine-blue.png", + "text": "我的" + } + ] + } +} diff --git a/pages/address/index.vue b/pages/address/index.vue new file mode 100644 index 0000000..809c70e --- /dev/null +++ b/pages/address/index.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/pages/h5-page/index.vue b/pages/h5-page/index.vue new file mode 100644 index 0000000..25601a7 --- /dev/null +++ b/pages/h5-page/index.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/pages/h5-view/index.vue b/pages/h5-view/index.vue new file mode 100644 index 0000000..65b99bb --- /dev/null +++ b/pages/h5-view/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/pages/index/index.vue b/pages/index/index.vue new file mode 100644 index 0000000..7df7658 --- /dev/null +++ b/pages/index/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/pages/login/index.vue b/pages/login/index.vue new file mode 100644 index 0000000..36352ae --- /dev/null +++ b/pages/login/index.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/pages/mine/index.vue b/pages/mine/index.vue new file mode 100644 index 0000000..a98efa6 --- /dev/null +++ b/pages/mine/index.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/pages/page-view/index.vue b/pages/page-view/index.vue new file mode 100644 index 0000000..7d4b1d7 --- /dev/null +++ b/pages/page-view/index.vue @@ -0,0 +1,87 @@ + + + diff --git a/pages/pay-result/index.vue b/pages/pay-result/index.vue new file mode 100644 index 0000000..bb92b98 --- /dev/null +++ b/pages/pay-result/index.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/pages/pay/components/FileItem.vue b/pages/pay/components/FileItem.vue new file mode 100644 index 0000000..c2619df --- /dev/null +++ b/pages/pay/components/FileItem.vue @@ -0,0 +1,151 @@ + + + + + diff --git a/pages/pay/components/OrderInfo.vue b/pages/pay/components/OrderInfo.vue new file mode 100644 index 0000000..4d48405 --- /dev/null +++ b/pages/pay/components/OrderInfo.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/pages/pay/components/OtherItem.vue b/pages/pay/components/OtherItem.vue new file mode 100644 index 0000000..beffe7b --- /dev/null +++ b/pages/pay/components/OtherItem.vue @@ -0,0 +1,454 @@ + + + + + diff --git a/pages/pay/components/officialAccountPopup.vue b/pages/pay/components/officialAccountPopup.vue new file mode 100644 index 0000000..87adf76 --- /dev/null +++ b/pages/pay/components/officialAccountPopup.vue @@ -0,0 +1,77 @@ + + + + \ No newline at end of file diff --git a/pages/pay/index.vue b/pages/pay/index.vue new file mode 100644 index 0000000..549e479 --- /dev/null +++ b/pages/pay/index.vue @@ -0,0 +1,24 @@ + + + + + diff --git a/prettier.config.js b/prettier.config.js new file mode 100644 index 0000000..f47521d --- /dev/null +++ b/prettier.config.js @@ -0,0 +1,20 @@ +module.exports = { + printWidth: 160, + semi: false, + vueIndentScriptAndStyle: true, + singleQuote: true, + endOfLine: 'lf', + tabWidth: 2, + useTabs: false, + quoteProps: 'preserve', + bracketSpacing: true, + trailingComma: 'none', + // 解决标签结尾 > 格式化到下一行的问题,htmlWhitespaceSensitivity不能为 strict + jsxBracketSameLine: false, + jsxSingleQuote: false, + arrowParens: 'always', + insertPragma: false, + requirePragma: false, + proseWrap: 'never', + htmlWhitespaceSensitivity: 'ignore' +} diff --git a/static/icon/iconfont.css b/static/icon/iconfont.css new file mode 100644 index 0000000..670320d --- /dev/null +++ b/static/icon/iconfont.css @@ -0,0 +1,25 @@ +@font-face { + font-family: "iconfont"; /* Project id 3120523 */ + src: url('/static/icon/iconfont.ttf') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-Less:before { + content: "\e734"; +} + +.icon-m_dow_arrow:before { + content: "\e600"; +} + +.icon-required:before { + content: "\e60e"; +} + diff --git a/static/icon/iconfont.ttf b/static/icon/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b220aa952386772a1a17d7f9d78a4b4893f77e87 GIT binary patch literal 1912 zcmd^AOK%%h7(I7pJQL3(e&k{2L7HirI1&^)anlq^8mTFbB~%{jBP&pt*ke1D?J?s? z+rWYd)I|kSDpnvNLuS(tfpAx0+wPHTnnb2kakK zY8&O7Uu`7-`BT~xRog0!Jze^S+F#k{swA{+`6lt#>=V_xcY|U!@jHh^%_&;=7+Lzi zPg}2BH<}`j7q~u1+iX~MJMqcn&mYx>?aYlw*NjBwY7@H`0X48b-q%N5l}-`VY;^w;a+b^-;>*F&*C@a1wAE1 zWU~L!UMin2;rjK4;*hViE8MxO4j#2&Y8O=uV9XL zSGz(x*op1V?y(m8h^y`W_!>XiAcFAs_J42PK>=pNGO*q|gnsvL+fJJ(j4GPArysc`e$e{+45P1K`)fvT$CiGQ&f+X%FGwfyseyh?<&zo{N2Gy%H7lmH zm^h|pre;sgouZYQ%ACy1oye!DAfB3?qmQP>g(_vno*9oOhg2ncuArv}x`vIRiQGiK zCza?;i%2dvSs0I~su)TdeW}!frpO{ak(PucDPk)=78^_&Ml>>FM280rv$s1rB+fkl z3U@M`h-r&Ys=aa9h#I|vn%-?rPL7WDjXahb)YHZY>j3m(JFFYf*QpGdE?Vs`L4t;n z5X`q$PQ&ZW7wyV=&2l?tXI{45 z)|%5WXR^~Bs$e&4w-csyt&;b=vRQVWy1B%7cCF@^P1m_<7rkuN^O~n~IsZLApDj9d zoP!G+7Ceq6m{`RI$2An;pn-BQdWY@Zs|UT8sdmw#&W~wgh9AK6A+G{e zjX-%Yn-;F|ZF%PCF(Z@RWu!XMQkb93Olrg?571w`$~Z-;v#17MO`JxKPiH?JeKy!< vJ@{h%%NG0>1mM7+2ua975fLaC>{iRDuaunYE0*gz*SlQ%we>aEF45(0mW}iF literal 0 HcmV?d00001 diff --git a/static/imgs/general/add-icon.png b/static/imgs/general/add-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5705b84fffe6f0770db33f0471ea1add1a7ad2 GIT binary patch literal 2370 zcmV-I3BC4-P)Px#1am@3R0s$N2z&@+hyVZx>`6pHRCt{2oqdcH^%=)M&)nV~$kCD6lakW1Ou!ZA^q0ff!NQ;bg_m zm~p=rF_;-BVPLo;by`P(O(;>ST!WA$d-3l+A>7vXvm&n-S8* zKsDll{w;4%3jBpiy)WAU*&WERRshx6R@%jB0PZFxn={=pb2GyFAj(sPe?&^^fr-TA z?M!yc?0|-J3c>~o=ZJJTfyo4_krLeaaezyaT)w`{#Qvw)N0N?LeaP=V%>9ou9hCI!~W8k;bq3DYL_L)oY^*_RY zayo~@78($4ASxeU`Qg>glu+rIq%66i3|3BSZv;TEZt%=ZDE9uDt^|0r87bPz1-wVd~b5>7Qn9L)h?YfuRn-QP;>Uqk0S}XSiLJyi~HxSik#*eiG znBlahY>-YaF7n{oBaYer$KPf~DN})7PV4bC!fjOQ^{sD>D+*@0BFNtuC=ax~0eD1< zfjit%) zc72q70ici5_4e-t_Y8x+J&CWj&X5WHQwQ;%wHbMuYhJGeIezoFd-Z>6a*FclA*$nFgKpk+M zQ#HPN00u3ETLwbk(#|IrB;tXQaL4D9m#=&ic6^+?JQ*z}d~gchI2wQLFm(Zhnrv>o ztZ<>pS`#p;Jhd5H4#M-hvybl*wFdFrd?WG5wE$a#rFtXpw$dB{-%H{ zoTrvIq1B8a?*OOVRODl}x8})>n-PDe#NXUh{dxgyEG{GDa;$*4)28SAA5;b~VSWr*2H$7W~cobV*z5{-C;<7Z*! zvv9V9AqVPU=DNISrp{uryyJ(7$JxTVmCI`eyv((waNif>(`xpfgg@_wOU-VpN&{gD zQK`84<3xn@Yrv*lYw{@9)0@VHz|R+xI`>jh%KA-fg%loyG~UsG+6+Kk8LBFbEp7F%Wc zk6MEKu(ORipA%js+Yo+fizI(yVltbEbb2eA-UR(1QG{15%kn3Ssg_sL*)TmbB4VP< z0*+fz*=!A6J3UNBCrwol;v3Yits+dWEP2~-U{mrfn&0TB5nhY zT8@>Uyg>sKtQrA!J(6Le>_iy_r0jd?QYZ>6<0QARRBG%9X>&ea6~a6UM1f*^V|$8I z2oDmKm+TCho8-tLy$Rv>z_6UecN1X~&CFx5*#0bn+-0hMM2qRee3YNlHJ-g^nOV2$LBIUQBj$4p;>&BPNdaQoGk|RO)q@d$s~%Hh;l112s_R( zN)raVQMMv%p_pw%-1!G2!+U0QB%-A>F&t$u$^Z=dq4WmIh+i@XfxzXfo(6<^lscdW oFNa0nI2t!_)RVF8}}l07*qoM6N<$g8FxAIsgCw literal 0 HcmV?d00001 diff --git a/static/imgs/general/baiduPan-icon.png b/static/imgs/general/baiduPan-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b99dabcbdea769630728fd3559039d74d4d0a5e0 GIT binary patch literal 4674 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 Eg7gd23IG5A literal 0 HcmV?d00001 diff --git a/static/imgs/general/blue-arrow-down.png b/static/imgs/general/blue-arrow-down.png new file mode 100644 index 0000000000000000000000000000000000000000..75235fe2e4f0150bb4d19aee909c6731d845fbd9 GIT binary patch literal 6956 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 literal 0 HcmV?d00001 diff --git a/static/imgs/general/close-circle-icon.png b/static/imgs/general/close-circle-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..752614bd08e0a61be2af1e467da193d13bb59ecc GIT binary patch literal 1748 zcmV;_1}piAP)Px#1am@3R0s$N2z&@+hyVZven~_@RA_H(LlvfvN~#tfVI;HA`xeG+xp$Nkb(Kk<=yW zO8D0<=~Vc4Skliy5EQD(FE;=IFca7eoFN-71G|9dfIT#;L> zevwhLDED?(*rU~3uUSEms=3jgZe2HaHzTM`53PptRw>;vW|6?U*pPu~_smjc-0 z;d>Dn5m!iyN61+%}d+4WyEG~e?uydj)05d8zUhDa4D{I6* z6L2AM!Qk(AX~W*OqO6nDaG%Z!pw-iPb9@b!dm2>LBg-4W2%y8T1gQq{y6< zC>?@xZ=*PZktzlr!evsUSf7?dDA)4lT8o9&(A<|rVJLSraNdx;JyNd`wd2Adr_H{m+}%4UwTLs zQ2<`ZS!aNqMS4WoTgcQr34|mD;Z}7Y*5s`-)Z1z3nj!4H?ujaqnB+0~4|2@KM|4_K zYD%4?PNV+NDi9bXX_Ke;eo4ubgOzm-mSla!_1Ec#9%YKu`(53Q3D2Kleud4zT7f*Hlcyfg!gB)u2?S?)tb z6M=U~+KszHk_Rk1P6t6y@ST>N&qFIP6}W21UlEo!0N)wq$H~WYv$oK$iiMLsD{XT| zrK52%eH69y)h`%w-zXN=;R5|AmSs>l1o+XA>5I;q$vHX$rWo=79xko4%cyWPrNRK% zZOE$>kI%z)rd~|RV}l{<5~UXiaDjw{$te_Cx%s#mnAeQ9i8C-bFY!-9)<&zMHPm({ zRM>)@b9*L%jEx45%fN#PWV~X?0GMV~-egqlCBY&G{1zJ88}`(7;H|jrLmBnBn-5)K z`)=G6_&8?!2J9T-315Tp*nVy1Y)mbIoppg?uFcbEyQk5j8gfq!U<`IN)=s&LLAZ>? zb)(@W;JzB#kQlfr@_pjoE)lTC)3}Wcnb&Fq|4Hv5;@p7)2IIeZyfv1P8Ut90eLUPv zjBT`3(6q3Tg-p5bya7Cm?f5_%?-O@T(uXZnDPxk5t}Sr>)@)E-ybki-LjpFV%ocP0!5HrZ}9&;9tGLZC%-SAY7!izl@>+?qDF^wW{Z#^NA%Cx&(BWL^R}E~ycoX}-P; zT0k}j17mw80}DtA5K93u0|WB{Mh0de%?J`(zyy~yTfmH9gA{&t)?32B!1U15#W5s< z_3W+KyekF*3=c{<3Yxq;WEk}>+8)W8oXdZ}`5~Ll0p3%>?=`x<2|N{2(E2L5@=_Lm z!wRW1CAGpmg;ssX`;^ztvFI$f`>Eb1y47e~erPFgWVv|i&!ZMouRN^VZ~y!AhXDKY zoA__P{njoSvn*Xg`uG2e*`b%${I|2acct|2wI2UKwuLVwf|p+T zeI?7!`K!cIzJTKFz0aaA5+j@1+qd&7I!>4wFg8=E{Aeb9GFh?v0dC#A|Y zyPLaFsD0-nr-cT62b(n0e&kvF+RDtjSRtZoMMiH^;m*sdiwxdcnp*zK6s$Y6Z>4Pa z+b&)?sjN?yrec;Ro*zZi1!wSgEx2TnKZ8Y!<=pE2je%Z&n;zH;9hl~|&fNe*bU5vvXe*f*fBO-c&o+aZB{5wa09}HfuFKR}n_vIh|4mN@PMF z2mXK1#pR=^dPgG5#P3B-e!`L((<-BlJ~A2!y-TXa)Wzav6#QfSv9j=H?(@DWphWNK L>gTe~DWM4fkGXbe literal 0 HcmV?d00001 diff --git a/static/imgs/general/coupon-txt-icon.png b/static/imgs/general/coupon-txt-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..453ab13db2bbd010ee4325cc273d628df595c506 GIT binary patch literal 5033 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 literal 0 HcmV?d00001 diff --git a/static/imgs/general/customer-service-icon.png b/static/imgs/general/customer-service-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f110ec4437dc136c02f95eea9be420ef11649f GIT binary patch literal 1158 zcmV;11bO?3P)WSu9&jBmy>V4ZIF?e6WqT`PLyOTBUZX$#={r;vWH z6Nj0ikJfXR_jc*Dt~crfh!~;rDdC5K{qh>zt0zLRr4 zSA|g(fG6=ld+C9p{5{&}1%{x6)h-C$?<|esynAi{5r37JhdFENg7a-7Ky>UQWK9~b zvyp>h6a$DDTnC4_78vAFP!MMNbjv-=%FF}E789n2WfRg8OLSM|-XlkQ-vzf!SRbL3 z@}z;CA)Z)k$1l2Ef{A zgpo5$j+w)NpAO6FXh3saFN? zQ5Kr5ibhd0(c^oAWQAdxLIulo>4zG}RoEOMqQPOAe-;g}>egl3 ztMiyXT&hvbOkWA462()mOrgsIz)OE(_LuMvmpWl;KyrGIK~d~!U0$+HZREL&jbiEm zj^mnX<_@ZB^xXbD=drgq#w_lBKzpJqr(mFk__|K_(J5 zLzm3zu}WQS^vv_SanX|#&_iJGd*L8!X(QvRK?S;m1yD5j%?q6ih{G6!_A7WL>~@--E_<(oX#ZH)8D@IkACKqV_cS9d~-)Q0FdZc zjIc9U5ey4J=kl@w7<@z-765FU7C?YWGYqoMLcmqb`+Y+v*%ux_T@4!U-vVf8z{aot Y1EcQwK(QRF5&!@I07*qoM6N<$f_&N>0RR91 literal 0 HcmV?d00001 diff --git a/static/imgs/general/default-fn-logo.png b/static/imgs/general/default-fn-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bcba07a6ad255752ba2383ddfbe06f1a83049b GIT binary patch literal 765 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 UjLV=KXX}Gf$nK;HqJPSN0El9YPyhe` literal 0 HcmV?d00001 diff --git a/static/imgs/general/down-act-icon.png b/static/imgs/general/down-act-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a593af5525211ce72f841e54d5430863fb720fae GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@_%`{IEF;H zzn%J!lgW^$^}X5!-z&T&%;AMhg-mx(NFNlvE*);qTdl zgBzs11*96XEoMhEcnM4iw>xg5ruqBH{C=SbMw1S1yGtoNv)<^OyJK=^@c|B;I literal 0 HcmV?d00001 diff --git a/static/imgs/general/down-icon.png b/static/imgs/general/down-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2533fcb8c1240c4910ac89a54afa1e0a7597b7b6 GIT binary patch literal 359 zcmV-t0hs=YP)p#ty~7a&#u@sSE*nx<5~j*}!A zu;*XfZ7W}0Z~{<4K>UgZt3Rt?titZJ02+uV zR(>{hd(bh|O&T4KOn7R|^0D002ovPDHLk FV1i_ljM@MI literal 0 HcmV?d00001 diff --git a/static/imgs/general/down.png b/static/imgs/general/down.png new file mode 100644 index 0000000000000000000000000000000000000000..7e635f8427580b444ee57a69ae30388cf295490f GIT binary patch literal 461 zcmV;;0W$uHP)T5QbwP>?0|G4sa?UsQ@}4zW8y23J4VdCqFI@6;J~1 z0Mh|(gB}uZhZM#qxd&b4+46S7hs37T6 z-6$JAY|!t$YiJz-FSyWBi%bO_1gHzC;NB2FMN53Rt~>XAzy1?IH83Rx=7I`hp9Mis zZHv?YZQBx@hv&<29M2SPbFRs4c4K!SYd|ixkZGD$3jQ1WdDGZ`_n>YO zPTbK9av;WX1(0i242nUn0dBtZpcv#D;O0vY{(FNzz;2i+Gp2)400000NkvXXu0mjf DzvRFt literal 0 HcmV?d00001 diff --git a/static/imgs/general/eye-icon.png b/static/imgs/general/eye-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fb93d520c42dce1a4d3155b732eaf1bfaa820c82 GIT binary patch literal 634 zcmV-=0)_pFP)rYV1N+(maf$CfNTJzH+)vyo*!a{k!_U}E6kF|e<$IhK}EzPCdceQ11^ zw$g|2J*dHkGEgbnrL=HSKV723C|jp_EnTcbu?_%LUWbZ_^(4KK-e&>>6g5CFawY{( zQhoz)q8)cqXeKd%Ef8xQMG>O14)q)b0`Nw<7uEog1f2swGLj=#(mH%IV1pGqe>0IB zzgy=ETjya82tf5D1)!A2V`h^D>hH<$)24EFJqpt#As^#2Qs&GIIB=-SUyfm7eN_$5d1E7~- zfofv;(gM||Y~Hui1Qt^4zH6Nv2eu)0A_+I1N>TuFHt*YNLK~*;*NQF002hgKN&%p{ zlx-6RUgS)hE+qy~YmFCgv^&80Qzb0qx&S*DkjK&ryFFORb1Fk1g2y0? zAp$hg_#L2t)WbFS9k7Zjeb^?F64cvhS6K2wb+j(PO#bu|+GhHgU?gg#u+ar0m6lSw zOtcn0MlI_UzzDEPYHamTr&`536aj?)bpzC*7v*O{A|4ySA+#-PUB-X#zhZ*aQXUvD zZJ1a>v+-cz-{cb8`Z@;U{ZPu$kdSY?2lnR#Kv2z*43bR&3<|o5(*$5*U~~q)0U>9H UA#tUO<^TWy07*qoM6N<$f=#Ugng9R* literal 0 HcmV?d00001 diff --git a/static/imgs/general/folder-icon.png b/static/imgs/general/folder-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a2de5a9b5ef1a267b1c14d0e1b5e158b8500a0 GIT binary patch literal 1160 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 literal 0 HcmV?d00001 diff --git a/static/imgs/general/hand-up-icon.gif b/static/imgs/general/hand-up-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..cd6b3df473181b13985d1fee2735031af0c3bf8c GIT binary patch literal 5558 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 literal 0 HcmV?d00001 diff --git a/static/imgs/general/jinShan-icon.png b/static/imgs/general/jinShan-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0e7d6f8b8bf21a13005db77b645351fa0e6e1eb8 GIT binary patch literal 5672 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 literal 0 HcmV?d00001 diff --git a/static/imgs/general/plus-icon.png b/static/imgs/general/plus-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c140a08cba01fbf24b373547172cf69fc51a41d6 GIT binary patch literal 514 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 FV1n1;0W<&r literal 0 HcmV?d00001 diff --git a/static/imgs/general/question-mask-icon.png b/static/imgs/general/question-mask-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ee1117a0d998f2cfcb7081a3ccbdc074a098c6d GIT binary patch literal 1294 zcmV+p1@ZccP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91AfN*P1ONa40RR91AOHXW0IY^$^8f$@cu7P-R9FecS6ygaMHHTMce4f` zB=MopK=PubkAm%!FH)gCh@hAf5ubK-cl#s7QmCjA(YA_0QT%J}-I(|$f`teoVnKbV zf|v@vC@B@B3n}EKfq>LCd&loPckXsJcX#jBA2M+7J#*%q^PQPFbLL!QcDTu~_}1DW zilX~sV;&VNdySY0@Fu7)B5TH)H7oW~V9au@R{I`2h~~Fk2bPwWMsKuQ#{h5w=62NI$V#-=` zz+#24GSlRvH4A|p$BLX!y4iP62Vg*=XyH_B;}=y$#T_^r_pFUuoc@k zjkS9@8c1-aR(tv-OaT6Mw~PY>52NT~%;s^3ZbA83D1XpPx!Y8C&rRY8Ch;~#ideNz z>b2Sv+wEi=I2VRzu-`90>3Se$re3dq(``EGg<*Iv=C&{C#Ve5esgK{$T@JWC{}ck4xp}Y`_~PQ?WUICHp*8kEw;{PuDixoqR4PrMPa4kBiLXEw5fcaf znCLj5(f()aGK41K=`-;3eJcA6hHj6I{EWT5+vj&^kt>0*_rUQ#Iy^^&VdE&a<2`hn zqqmi&)6;=tn>0OYjCKSZ_dMnMUxde83NC@Xi&dK7Lt5qFn9BG{j#itnjqaqw(h+q4 z0RzYNoEt{__CQJPS!@ew1k}Ytwc0Vv^co-1V&prHr81=bMw_&)JYXp%I_dy39B3w) z)j>xMz~_-*UctVdQbYbLFh6M5+C4tor=9Ip@OC*&Q=|aXE5CurXZ-eSnCa`i#yFe# zsByoJi4dS~BSviPNr!n+S3q++R4_wkxLa=XQS^K#=@>h35-CQCnFJvM$)R4oRrGUF z^d#cvwCaicIzB%BMvjdH!(pleSVDCm&Fwh`I>R`YQzo|QiMcK##e=i6v#pLm4RiJj;A4m`0b1dko6RDQ|R+uYpL+>@R(bpRdzR?D-Y;|mK5cOq&Y(vHYS zhpW|Zhf!>|+q<3IHGY#7Kr!K%Q|_Dl`O6q29b2GaLChDq3O5B342PM-04f=d^FF^R zmqQf_>qtJY@@bEZsD6%y4tp3YWN03M7t1)8CvZL=0q;4L%y}Iymw$)I%Q<41VZ@E* z93)0PuDSxO;UKw=XAg^sjMjg|plxj1G_f3J5(5ZATyo|taahSfsB=s9!^RQZJs*Zw z@cc-+pIpkPO|6p10G48c)D<9)1tdOAW;B#zN5~u0uw^sY&%5yKi$xwDB+D^m%cCw^ zHXW9#bR6LQ%mR{JmQk41ewFC+8YvXML|R?J^IKr;=Y7PKt+uRTaf@^z$J1JX{mfDi zTar?XW8!j2T9o{=9~0k+9sM=)9YJjTFF&U~#*WZ`13cXiZGxPTV*mgE07*qoM6N<$ Eg3g&v&Hw-a literal 0 HcmV?d00001 diff --git a/static/imgs/general/reduce-icon.png b/static/imgs/general/reduce-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..53c7c3907ca8977f31708034771db3af19463698 GIT binary patch literal 415 zcmeAS@N?(olHy`uVBq!ia0vp^79h;Q1|(OsS<3+_#^NA%Cx&(BWL^R}EX7WqAsj$Z z!;#Vfl=Jj-aSX|5e0$r_@34b_+e35jE)K<@0uBY%BC7`)CI?uZ4l)X;#$GCBI_K!= zSf%ISnbgyg!tZ;@CFI8HuR5PYr=>>!pFCAb|Q_ssET23Usa*X9>;C-lc+=3x8?5gBeyUl%PeHUEwHtJ>O z&~SYvXvpf?AJpHW*>OVSYsZXDf8XX-EGU)Bn9CmZyzyEkf|)9Bk@34>_RA?pA8qZ{ z-LKWfx%uax^WVS!<6V`t`giKiUpe1f=Dq$aopYLb?PrJAHW#e;x12*T-`TUgss`Kk z=&$NEW=ECJ4zexo53IjVh&YsCQRDno56EJ12tB-MO&p8bO7>D+h7OO-`?pv3onQ`7 qzjsCRrrpMWYaVcw%sHISYF`lVqaq#qd<8I&89ZJ6T-G@yGywp?P_AqM literal 0 HcmV?d00001 diff --git a/static/imgs/general/right-arrow-blue.png b/static/imgs/general/right-arrow-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7a40ef1fe2e8a3a51c013eb566cbf5a154cafdc4 GIT binary patch literal 1303 zcmV+y1?c*TP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR919-spN1ONa40RR91G5`Po0M2mr00004fk{L`R9FecSY3!!RTTc#^=B$G z3M&mVjG!PTjUK88Z&*qN_M#DJl#-D_FbEk<_uOlz8pp&Cgn8)?oPmmlj7BV^(aM>} z9(t*l3JU7Mh$x)?oN;FLt$SzZJ)OPJ+;i?7+pyX9thLwoowfGbd#`f^u`a|UUI4J2 zUD*e)6fwHxEPu~gE7eIAJ)~U5ehqsMPUAxy&_#2`O5hUvHV?r)_!T3J#^oMeM?^*} z0i-(_jZe|1R|WKKiH-Ph5J9m9e_)KBUmKiLP*K7HJWt!BL3_nbm>_voZwSsQpeP}h z2`t2B+P|F%lIjrBKd8>IXM*R#H#2kw0}B? zAvnXmun{lGSa41YiiXF{6Z>R0ALC|G;wpQyd;cpA0&aR>u%v!@f`6;E%2BlL5ealpp3+ zdn%w0inEE$Y_Ggae>c(dzXK@3HSb5HJpsK}oE_?BlRdhQ+vzC7erdBf@w4*A)RgOT~Wlq8lQ1#RgkGVuPvaYKHb>zQENPr~_Dy9e7AA`MfPZ zvBAW8Bh&2!$(MUkO(;0Rdtht*NcK#cJ-Iwa1pAuewd~*e)ODHi{GY@y4(i3eImJA7 zNU<*CF*3r(RZf%|1*7!*0lw^+W?eCl9YQRpdAZ!h$IqQ8H7d&V{3HvCCC$3_Ja$O? zbuq7wV_fsH6QxGMS6GB~sL0QzYtLhc{;Z5+3GQP;9e1MCs91^L&tJQp@z}9gsXT#q z__)c55~JW8*Sm}BJ>40P9eNjoDG1kRig6ZN^@C-;vuS&b^-6|vgs^LZSa#FRoM@dP zZfvWQB)mC;bQsrRkJGmw>PVM!yNqU%0z+Ke2eDKBy#UW$w{q#8~XXX@~^R zkkmd1W^JwQ>gKjBg6Y1ExS_ICa@Y)@C1vzH@*6R zFq=5i&Ggg`{RIL0DUxoZr*8%HL2;Nk(uYYpKuasyeQlDYTS$7ur<_gZ&+4k~py42U zi1ci|$S+80FO?>?&yi`oPH)pXvk?4=`K+OO#WK8bOM*wbo1~VRp(Pln?tZ)|R^YYO z&J$O(MlTNp(FDIS@Ef?Mqro{j6peix={}NXeRTc8z;EEc0AJ+5&YUXzvVW8_EPF%k zCzi15StorNnovYu;%a7n+x|$>a;Hh{MJ?3cPYlYxXL#=>>324<)6J4=C@s(JB?dN!i{V(<@_78X!tY!B8z~2|34e307eqM9|nEqdie*jKm6mhHht^)u7 N002ovPDHLkV1l2)TPgqm literal 0 HcmV?d00001 diff --git a/static/imgs/general/right-arrow.png b/static/imgs/general/right-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..fb86b618e2a7fc1210d1a234ef5fa3bf50f60734 GIT binary patch literal 1218 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(<^uz(rC1}St4blSkcz@p>n;uuoF z_;%Lqd|yYA_SaFb)~(p>92-6T!9iwzIS&rbP8X+u|593lA01TWCUm&Cc>GdWw{%Nr zRO$7s)uq2{FMSR&o;+`J`nP#U;!c*|+I;QJ&CPYy-`|3$MNV?9&z zr{Mm6=6TA6*OP_5f5>N_{PdRkHO@)-Lf4N>=s4$erh)lXQL}{g8Ku9mYI5E4m9&y4 z*!BK<#Urca(7eLvh*9ZJv4)ho2%{*C|DJ|th0Y&&`&;b6yysf_8&iy3|80G=Qewjv z&#P~v8QAV?J?q?gC`D(|9kuf=^H(~~+9$wdz#Z`+t?TEs6s@Q0#r0j*FZI=W2NW%E zNtk8)w32H^&Z0T5U046mGTIoxBr-X1R$BH-PvY^HZP;cg4hiY);{VzSRu1nO~GNiqTHFO(->4fL>ZjD&JoPn*Z*m! zdr4P_jxVFf3hzC_SD2P5@dygM*qso|k(bHs;KcF4Er5H5%Y@xYs`{I*?O)Frze%8> z#IDP%k;8`5Cv3vzpe-|+_SHmk9{91pV>*+d8pq_opv~nKdMkAIL{DRyz{4%Km8o04 zb>hhzE@#Eg9@@rS%_#7sKvUP8mH%1g3^*zRucsAjfLex#M#Xv)B&-o-gTrH-Symp47z`~sFPzIr- zt?E0a4l-pJ<+VpIJCISkEvRJ6@%FsqqHzx_IQuWSq-i?~m%e(Lu&%1Ppth?<{pHRi z(T2==rwm^GrS-=%=k-FFFd=dWMVaf35v7$=;B|!L>Z%MwZaF1Jhk6 zf5?mE4p`sA#~E$wWLOe-N8C}zo6$^jaq}TFwn_UHgr@GYx|g|avNiuFfjg`0zH#6F zc~fAn_*tbDH`xR}ExCQ=XWVhl8;|A*>-L%5bIRo2;H-TAsl?v}N$IY$7x!Kdn8ozw z%87$%%v>g2e9_GU|F*E)SbH$PT;;;@8s5H=Cj&&IbYZ}$w`rA18+lo zhe=mmbhFN%ZMqqgHhu^UOLSp>Tjl>r#5ypNgE3Cic^=c%CVh(=$K!>j?A-a3>j@Hc bS$sggW7DLMswZE{fXWX~S3j3^P670w literal 0 HcmV?d00001 diff --git a/static/imgs/general/select-icon-small.png b/static/imgs/general/select-icon-small.png new file mode 100644 index 0000000000000000000000000000000000000000..d3da12c749d7209303637ab54adc24e9bbc02c17 GIT binary patch literal 2172 zcmYLKdpr|-7vI=ibJ=D_gcx&M<(fyfhPgc%a=(Qz_sk`?ChCz~GnW>*jZ|{Y#v?_9 zxg@vVRHWh=j}f_qSd@4E=zTxu^Zk9#`JMAQ=lj<=8Fn@nB0@)n004l9l_lPu%XWtl z;N!kIkZ%oK0!G_gm;f3_WtX@Cp6F^7Kp+6rxxN4Zm=+8G9hPu$lnVfWw*m;@)+0094j72en}9{9ENAk-;FY5+}q6@_fbZ+L(RfK}&jrJVQK zeG|5wGET}ozD1+@LXcYy2C6rVbIk<4goHL{$;gb}O+{X6UHR!Q=QhCpgPpjFVSgr{ zV2hCA);2jmI>y+WMzrYF=iyWKmG%|C%@|xB(saRVMCyPTiAy}cg76k6%hN5AyNla? zq<1Z?9g8&cgckOt`Ff0t0%>{GRjejg7!6j^O$+fvu$gKbC+Wl>>b2}<7bDG8*pm#i zSyGH4+6xlc*W(iKng@$UiKbhawT5VPzblt`oOK|f7m>%qVD+1^+|L+y?EmR+wveL; zO7v{ z@YZoL;2(ENp>cslJid_0K<4(5ZPVH?r+*=NH&P!3x77%-`yS?CMuZ0M7@}991vvBh z%rO!9F$^V9U;iD+otYCKh_Df-E`Dofd`PFwpQ zD;Yl(wep_w^)4GUD7Ai-*0SnoS3kh-yJ_y@>a^nhWi3qzkE*M^JRIa*H`A(Io|0wvlAVLHL?_n0(EA!5fol z;J;)X2pE05Qtw?F^+r}*p$Afmv3_)|=zR`)c|?t&Q!Sk*d`4E-lAyadu`jvBX~V=)|@`E;VY=B*`Y8yHA1PgGsp#M1TduIQm5|9*ZF zWR}eO8eV*j30zBxG9eN($;FL=i7ybsyX8{CZ$L(2+v?NzCTsb5M$;PV zN{|ZG->y1S7zD%b+9ep;H~?*p6f~%noX&Rs=rJnwol&wbIK#s6ww%gC&NfZ4x*V>Y zW_GrbcbUi1!M4IXrKSrtZkU(-ezfpZwg*A9WNOmmy1)D?Vs7@=xNz&nGh!lz^bT{% zy{H;u`{F+Na|N5I>;RehGFnO?7y+N7MuctHpZvck>gsKPw!%NTbDo;FpU7la)nuR) zytSH}e5Kom7dSy7EWyd;^r$gj|VIPQx^&Abyv{kwW@VDuv`ZG0}WEp8Xby zw|f7>#8?ifV3a=@Fq;ZBh& zPoZz2d&+ru`3;fn@2D6E%NDfy17ZAhbdSLkdt%nLQBNBc5KGTX2Xet z;kBRfJog4<52Or`)6TtKu`ujEC1BeuX1xA`@_Mp~9Esvub^GH@+jj#}LDwWz@|_jD z4`})x9Pgco+QOd1iMz^2+s>w1LUVsL8k9l9b_|I`-MOqnS&WGOzBMeu`S0NsrM;p_ z5xThidLK_`)%7f0;7g+dn^5cm`Hh-JfwcTEMUyxXr?Y1+`cTmF`SQI48Kpg~*D{`F z$HW$rhVLq4=g5i-fkBvi5-GIOqQ8LE?0hk8x=1H_fM0mG^altVdSuQDncmFG6 z-7xc~vPw>7`bbqp>|gV7=37v{=yv6DxS+9d5FW=j%SU$qcrrf~ z?UQ`L6M^7vagFOFQigo`=hOh~zWb8j29{)UF=<)5q5%6AgI@hJxViqDpw>pK>H|uy z@9L!iyt6mdHGz#^+dE}->GV)BJlDoG7}fWw!wRSoX^+G*v^PN-;do@PXux7oQJmLh zT8sZ;@2}6KJ2&Zur6NyR7QV4-=*Ya39X-hT6rLwvEM{$l=<)f(y>>PLH(V>xLOiqB zL{1}O6J#li!Y@asj%@39dA%)pHaL~FHwMo`r(&Rzm5T+r-R#z%tXx-^>A;u4gLsQ1 zBff!>IYnRntf17Uo|3-XhHa{`Tgg9Lrd~e3qH}`b{z1@LPmE8<$|r&JPn%sBM)Wc0 zdrP(yX?lgMeO55b!v4H!Q0o}#19t=KD$F%0ie>FFjau(NOW+CP1m_K`*SGbIl{Y}` zI*s_wepJGWX6b2#E;u^D{I{MNptzUH@Xn*F;vbIBE(mI4J;=ChhQ`cIRCA9Uq&~x+ vI0&m$^*Fht=kfPC^`Vx!qtI`guY1wO&$1v;EA~4MFTa(U4ZhLD=db?)A}`<@ literal 0 HcmV?d00001 diff --git a/static/imgs/general/select-icon.png b/static/imgs/general/select-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3339917d409c0c611f9dcbcdb0eeddb377913921 GIT binary patch literal 894 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 M07*qoM6N<$g5j{yJ^%m! literal 0 HcmV?d00001 diff --git a/static/imgs/general/selected-icon.png b/static/imgs/general/selected-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39e37d408afd6bf655cba9f550c26a1d1417f618 GIT binary patch literal 984 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 bU~&iER|P^L+OYg#00000NkvXXu0mjfRVtd* literal 0 HcmV?d00001 diff --git a/static/imgs/general/txt-bg.png b/static/imgs/general/txt-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..dbf05a75468c158e4c8b9e9f9cbf907f181ecf18 GIT binary patch literal 5373 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 Mr>mdKI;Vst0Ayc%asU7T literal 0 HcmV?d00001 diff --git a/static/imgs/general/up-arrow-icon.png b/static/imgs/general/up-arrow-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..105bb4c4c3a6ddaa507819a63bbdbda0f869a5de GIT binary patch literal 1257 zcmV=P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuAQ%OWYRCodHo6Bp}KorKS)^~kd zA5<%?BGk7O!G)-}5pm-}!A(^VQ95VtJndD3oFb6(vCOK!$IbUWbGn3q=rcz1&ZmISEJ z?*R)!vRcgfd*E5f^;}L{60nI3)<cMpT7iqqKv{EyJ{Kb&x@igMA*dw@1DlWC zb1;z5-oz{o0c(k1bIK@|Vy{;4I%PeH%{5U;A{`iQPhuFbX{Nj%ObndQteB()DA*%F zQ(Ozt^nq)HOw zq&6-DbmL@OQb#fEG@1Sh!M1%=yIr`P2W*5*i+(pi#d;ut7C7JmI2%o=2NyHVc-@gLg zsn0;cYj;NpXio1UCs2L|bmwzj62}<>8YT9ikwW0Q2>cW{ms`<-fcK8k=hoco#c4r+ z>p8r5A%u^_;; z3%JJURo{YuvITg(MV>1!TYzVR3tzoO3n+Y&Q2|;Ipk=bllRy(8?JX2SEC|q3;H_ge zGadE4sap`B;9faKsCNv75Gw*)-|ns>`%E@H8?kIfK&6qRz;(T2*a3217+GyjXbjj8 zNU~8;EkK(odKH$NSP`I?n#+Of?r;}2t)LHRgEVuoB0z!bdjTcnDswPc0kp%cm!d9@ zRMgXnWgpas4#&ZS6d`G={0Ru#XswP}id)A+e<}VIwaDAx3W!{+SrQ=cYe0_<3L;mD z<5W~EmR&%827sD#Zr}VUh#{ixRRK?joU1vsCP4kS0#*a-x~Vdev|)8A%(B|2!mcMd z{}7|dW|ySW6gGObA9^!FFQjlN)5l;CBzY>x-codvuLBLR|A;RF7NU8ngs#!t*<^V0|nCo ze12_0^)+&llD;^pD_IdB=ha7~h|s)W|0~iLVLs(0m7fHm>kR9epldSi7<7Y9AVMYs z{RbhfX!=_Lr@7Fm3sZ{Cc{ypu0>vcBg4{?~!7>u%FDy(mLL5ae+j4>ozSascAdJkM_k zhO6ku_x(E{dQ%8v0D<_XIRJv3FoG}wkceADXajKKBV(*wmgPyxSU<2XvAp0mazYD$ z7l+ju0vJM=a^OKcM-T_(qBez40*J(^&P~%~dw?`e>vgXYgcRUNoW5EFK+jDfqyTN( zQg2gTN3wmN@FM^bM3N-eqxMt*RH$!+`WAe9$pAJ8^J;ll00000NkvXX Hu0mjf9U717 literal 0 HcmV?d00001 diff --git a/static/imgs/general/upload-tip.png b/static/imgs/general/upload-tip.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb9b49424316f78225a552ad109c4bdb11e7670 GIT binary patch literal 3478 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 DTBN2w literal 0 HcmV?d00001 diff --git a/static/imgs/general/wx-icon.png b/static/imgs/general/wx-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d3e3f8c252edaa5085a1ad837b3600acf0bace9f GIT binary patch literal 4192 zcmV-m5TEafP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91V4wp41ONa40RR91U;qFB0I4%yP5=N8%1J~)RCodHT?vp>#TowJn{$CZ zVAo|K3yWL}qKGJH01wb;p@>!?foM=78VyxOO|&GGMvcZ3#oLMqL5L_41P{kt9E2QO;BYwb zWdEk;P===A0C<7d8@zy2Z3t=FU;ua~{DkBW;G>STRir4NQb<|ka@m%`ucj%KTu1@a zEeHTE^!S4#DWr{26dH(cTe`HYqyzXtO{33ARc5*!wmJB&wvt|C+^kmsw`#QXp_&r9 zK_O*0zTF}VWR(`c_h_WOt7z(L=oug28@(laE^8IQt=s1dj?ySJ5v{LR_KKJ~C-lNK z3aO7cownKBOHxmneoW~Vz`#Syj8#IR320hf)6Z)5QUa7snyNkq@ibj_MM$jx%wh%v zL)uGd@n>caK5?ATBUaf|Wjtn4Ux=d`O-YUZ6!V2vU*h%prUpZ_>_i2hk>I>@8MrK5 zCNbzlQxV<+yxzc7n72Embr3&kcaW0qr9g!sw)&tN&93G$l>5vwhf6{@^ zh-+FgmyOHFWffHkLV7@*rgb7;U^X(@UsT4LG#y1*PEPx%JVn`>X+ATq0H4p-FBno5 zqKQb6k(m}yUV3G}P1P=UI-OrSYH8Iu>abBrOrd46%HF9T`X~eVTb~vdMV+0^2IrVTSaE)l6CjQ15c# zmM?53U^UZCF+M86Pbv*_I~*Tb$)BYP-~pHAUUL>ZX5gX{4y%eb#LB>&as}v9O>Y1r zesi1cm_Z&dOxaH^d%skts42~Y(Bd8XJU<71Jj7%C&_J;!(lLt(iT9aO1$g~|Cz{P7 zD;`Q#{jea_F-sv`QW2!@?eO+O&RIr4Rn)7K?H!p`0J>3$#~0XeQts_ohBJ)>*uZl; z?L9C!?@yH4R0R2a{>O9RCxR{oe{A6C7@9;)*aO0cDZHPbTWp!&mo$hMX*QJxB|6lJ z+XDc)Eqs!d13xLkNg{9quE#R2#)my#dOpL2w$pJtM%?GGrOlqbv_DWw{9c7;OPh;Y z+gehwqZOU%I)%Ep+s4a!ll0@0H62r;sj(SsB!am0d%gbk**riGVps1!ht|-dLu+YC z&3al_w=*`MjlN49`P9Ev7rL;ZCygxWPi^ci8^vi#9sqii%jMt!IZE52Q3YVyc`Z(U zUe8A6kA{3SbKf$0@#l}}f8MIJSvnOv4R6zzeqS~OmC`wFI)X&1)Lo2h36)_T80trS4~9KbX6(wlNP z7C7&~3i{o~SB`nad3&^C6sC}ai2>c^J4Dy4e~#AH;gXAqJ2$@zP3>|smAl&La{iGW z@6wYy6VD%7W1aBrnSZAudkYh)*$Lvc0K`xmJZtnGz&BH5fbZ1;G-2zTrln#T{fDxP zb?`YNPah|CxY9HY2R`5VdL4XzXZb#{e7GsNJl!>`Af}To$5=Dw%r7j0_*#$z_u;`+ zN#%Y!S79U0ZIXx-PEcx(PREr{n51>TvS$$;5WMbal=)OW>M;*jfF`E`X7B$hX?EVJ zT1h-eN4j|jk}I1{+q)z(39UZ5owj)rZoBJo{aTQ?Q8Wps--AQ%MR&-D{IAAS=sc}9 z=%LOl?<6jCGRN}y`cno`M^_0g#a_@m2UaFaqK6M_eU`o#v@cLiQ}!%QX;poB>pnEA z`}maT%Zvp1uVEZ0RG?~d4s_s?H#v*B`S!>*8vMiGEv6C^J>TZ0A%(r@(xTJ#SyGv! zklH#6aVJlqy}p`;u|o{E^r_&Spr4)Z;SzQuMZ29o^J%AOeoU`di*kK1zO3jB+(=bu zdF^IeRJ{hftGlqRT|;}Zwe8jXRASGkQbz$*xQq23bU{H6;%RWU9b<0~UxF6TI##ZW z=WvW7&zv6WIFd#b_oJUYd+5%suhYD$6?7P4FrJHClT6vYSf7DiP}qZRZ+978RM<0K z5-EO+Jq~2}7P@$MH0TpgG!Df9`Q2!Gw_7Nvh3LjjQ*_|1?*H(4#HZD3^eDAbB(>F)9(7@FX(%V&EXT16L&5^Bi#o9^q(DwPn z6(iRv~MZM{{Q^(NcT_4iu4KE6v-*XRoYS%)#a_v)eB;=J= z47Pirf|qXaLNu4YtvZP&*+7p6+iBfyrdJ@pA4W@+<-VxhNTW79Po9up4hvwfvegk8 z)OpY4JnYxVa4&WqOP^uAaL+c&>iCwkv#jPv8i%n(hGXm@g5>l7&hV(>UkcCn=#ulO zdtMpcwN*a&M&=jb^lmQ37txNf4{t??rd&_&+R_0+&t`E?m+mdUnjYWrp6T}X`305q zW8X=%{ha6M!Hy$LOZP0sk^TK&rZ0QnPdo!k z!5jc9IUi8aO<&PY-@DW_*<;w==7kooh*aZ!971Jr83IhF2$OxwXOQ z8BVemK5O5XrhKgiGWOi7rB(oE>WNOHsZYxatNCjb|5t^l)B7oCQ{4K~G@4WO72Rt z780@I)v$GwGE%_W+y5oHYTeWHW$h*loW(|+TX}mzk!G2bqI`itm<`;?cO6~D^hvM3 z(AjCO4_Nh(HQ=(j#}p5h?Ls#hwH>?_u^}EK8Gbx4F6enT@iC-TS7I;FlO&SoR_Uc1 z{{R%r#5q`YWYdn~2qvfGRvq+ex0{G(NLJiYEj(bhbsS%nL)Oq1t1;BHb}8h7=zdX^g!cFSQ=8k58)m#72_w9l#lJq+%`~rrgzj7+qgF zP+t%+(0r1$;>c!P(%47b^6Mae9Au}1!J{;yq#r%=^M^9BmXzkW(u?$oK+=dQMbK6; z_F+NH7G*UpD;2P~dcD4+=L;5pYCn|5wY?~6JjjD)^MyE_;$I@y-QA9U^!%JCSc*T7 zS>xMXB91m=4j0}Ff;nGtl+7tEsaZ$&b-0?o@AD{)FS{fPeDjpYLhtQx)v=E(z1`e) zu)e(^j9oqEx+)4(QlzOS#%7pB5bwQY>R5g8lj!ZBq~e<_?(x?r~a18plTx9wZ+=ywQjcx1E2HDSTpAQ9u`6Rn=+FhCyMI; zrQCTv?jTm`lI3{e_*Ug@)D9B`p$F{K= z_qmmSgzivDI>{5JLCcSSK?4ERIE;QbVag^Na29r1m!1CCw6-@A6^VP*N4@S54nFf^ zj2UZ#_c0L!A2#7`1e{1uK7XFs{Z?J)Q^Z1vRoPk3NQR5WxIqLlGgi>e)-_cbg)?X_ z!CGTZ)pA-~vo@({;tL+O3|Hb!)*%FKRP6 z^n$FLDzH`zxv^QFbkfd+H2>gA`VLo`L^+6>)JzpH!#ZDJ9EC!!iei2u(%FK2C|+mq z)`$?NsyF31?NeiEMU4SQpxz67{*`Ry!|=;J(?H}quVM`vmk>7N92Ew zz%#4c)CT{P>B$(@W7!CNE@#{d-~hJp1m)3x@_Wvuj{sws$XXUtjVpo-b`V8uv~N8| z=3>Jy_q2dOrbheFefHzra-0R0xu_8cFm{Y#gjb{2gd)g@$#yRlRe8qv&OK8@0GLfq zW;2v2nTjBT6+{vKA11I2qNu;&mwTEZfWJ6_z0g5u{YfttB<%srMkj>-Ou?IJcQVOR zGYSGmz$z8+8I+VNfFrUsaQ@E}5Dx2yuxHLiA;8!$MyXm(=fo*j07usC;;S?w)!OAW z&Bf`M02?d+9l+RFssK*F{}2Jg7&m}nZjr`-z%dq#iPeA4;Ix)2fD>VKe*+A!%k_lt z_{dl=CX9_$m(naK5z+eplbMTIl9a2iiTE}Ze>A|uXu>1XY57JOGO7S3lKUgKBz zTmkx^ga1r{AY9Jh&BAe6QD&}AhZHqF53qz^OL0!8J_hDh|D~|FVqcL!Rr5xpnL6_|Q^@ zn3;p`23<{AJQLA9t`!iODS%&~oAYIhvbrHzr8oS9rJT)tv6U}2c7)99#-<=MYIUO{u)Uy>0^1jS q`yY33@#CwY^*2GK+r&r*hyMdKAK?E6ZNVx40000RQ4eN literal 0 HcmV?d00001 diff --git a/static/imgs/index/customer-service-icon.png b/static/imgs/index/customer-service-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8185565d9271551a54f4a24246d449c623eab538 GIT binary patch literal 9633 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 T27gPC00000NkvXXu0mjf7hSO# literal 0 HcmV?d00001 diff --git a/static/imgs/index/hot-icon.gif b/static/imgs/index/hot-icon.gif new file mode 100644 index 0000000000000000000000000000000000000000..12c97c5407e7bc358e6c34fd66a9b94eebbcb1bf GIT binary patch literal 7196 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 A$N&HU literal 0 HcmV?d00001 diff --git a/static/imgs/index/index-community-icon.png b/static/imgs/index/index-community-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b879995335dc0409964ab7970f0dbd4956fab141 GIT binary patch literal 6215 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 DzTURs literal 0 HcmV?d00001 diff --git a/static/imgs/index/index-library-icon.png b/static/imgs/index/index-library-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..964b691097f464aaf0f2ecdcf24599b44902ae7a GIT binary patch literal 2518 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 literal 0 HcmV?d00001 diff --git a/static/imgs/index/index-luck-draw-icon.png b/static/imgs/index/index-luck-draw-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..36602ca6910a587448de2ebab9a45122b1d9f85e GIT binary patch literal 5535 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 literal 0 HcmV?d00001 diff --git a/static/imgs/index/index-sign-in-icon.png b/static/imgs/index/index-sign-in-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4aae23f40e895c56f981ea66b6d90027845db5f4 GIT binary patch literal 4578 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 WDY!tK!#W5ri2a{6`akpG=l=nUT06x6 literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/category-blue.png b/static/imgs/tabbar/category-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f43a181fe5f71ddb32f64cf0441e77da4e89250c GIT binary patch literal 1326 zcmV+}1=0G6P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91ET97b1ONa40RR91EC2ui0Q_#}qW}N|m`OxIR9Fe^SzCx4MHD@EViGVW zs~EGQ#19Qbf(lZL%ATZWJR#5h7v`alsFRh?tH&JKmx2Fx2BZ-E z-MSRNp%05O>o2I|Ich|-P<+}+RZznqRU3E>@cNP0VJyc!49Oqt=eBIZ4tNBQp@~O` zaG607oTTmxR4|0?a@5#kike;m#XGz<8M9!D>39&M@~N?<6mi01+K&^MhytgATV264 z2O8!;yF!yES9Lw*1H?Sr(}#j!3&v!3sBX)ZcE|fYk&y+@X--fq;Zqn#O>c^sTe_lT zowMR~RQ2&JESupGy#o!rpB0d!KZcc9gRSzn=acBgn8Bfrne~Dw2<~B~_l0Vk;U*o+ zwF|fmZ}dXlI+(%UuE{zO#T(4@g&rOSOE|W`!l*1+gT-0H%^diKEcXujKH6UleJo+c zS)o&5S%O%>b%kSNj%wpA;aFfuJUVnP?CF-|q%$@E|)`ct@F8tFJo*zK!j zo0{0eWufNcOuQuwEF>#_>^b;=+tc@@NDFs&!Ok$&5?1UFoeIhBRlN+Kd%jQ0aV)}S z>bkEv1iQEof92s(u!NW3HR`_$9Xradq#2fViLT;XY7g^r3vF3`ztb|rNB6dg zk148pE7flib7jQb;7yG)v(+rJE+&h}JYJ&bbNXM&`eMGy5=x3=xQI2vLoze(T%hL? zF^%Ur@&;mD&Ingl9^&sfZ~U7A2>+prt2KJ z+vGsud#dVc`Z~O|#G5a&DxB4dABgt}k6T~o;bjx9=^z)|9tNM62fzjM8SVFT!AxcP z%^o}-rF|!fotf$941#xgAble1KpH1p(}(BC=3=LeKk=Y6fJEYZ_prW7-zQW4`CY+L zp3v75&(t-M7YC0tO}vtiXsrEwsBaprQ;g{K%-WWyEla7~M(apoW=nV)&(LvM%(;VZ z5Qz>Lp9WswG_d0s$3UTYig+smZ3IZLF?1>{&qQO(;knaz9oL3q+dEgR3Z1%;{n(e( zoy(SX5%0UIUGSE0tb+4lvLy+gm@A_e)(k(RSQ!4PkG6z`OQdXTE+95GX2s%J!oaVw z*g`rnv43(>)Cjko#(k;r^?u1hI)UX)9YYHn>l?veRoe!_C&op}QK_ zK?*;;ZkKO8^jYEMh_16r_(3xA=Cp)&$Po@c+8NRF_>0ngo~A8~$;ZSqANAVi=&$hP zzJf1~NV9~U(_#{?U@Lq6m&gbJ$sFOM+sNW)GG=b+`gsVg@OAHw?wy+8AjjW?XT>GK zwETTC(KS5R-OH$}xnBD?VB5b=*_D?Eu^R6cJ|>OmHKcqO@z(NMo?_#QoJpdyyu?SP k{)$L}^}4+boX#2e2PnN5g6@?FdH?_b07*qoM6N<$f+r|+X8-^I literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/category-gray.png b/static/imgs/tabbar/category-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..fcd58df432c1bfad77aa3847b5567a0f167cf003 GIT binary patch literal 1680 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 RYeWD5002ovPDHLkV1n$@2&e!6 literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/index-gray.png b/static/imgs/tabbar/index-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..07fe841efec0e3fd7ad11786f1070f7fdfde9317 GIT binary patch literal 1717 zcmV;m21@yfP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91EuaGc1ONa40RR91EdT%j07j?B;FdZ)k26Br0<$ z816mB*omN)w>TPId(lsKz;9zq{Pp>!VXPz3kHFPkL8MJT{0;LN6$&93eslZGUJiY) z`04bGG>>x!i+-&qvx}X{V;9@;oCJmo$PkvCq8nqNKfsr_&H-r73FZFrE=yfJw{a%r&zVyq(?UGt|~U^Lc@^c~U;>MD=*q*uCa4sx1=X+_xr zG1}?|kJh>{U+Y9C`CHoaDoB^p>=_A!z<0bR@}s23VpLUC^$-)gq;1sK+=fKkJf|PZ z=|mz?h7F#3tu}->uIMo$0u(%%dkqcE1L^1lgXTMT<{`S9 zB^yoQWNqzhT~5egrzeD}5ru9jE~Gv>$m4A#POzk#nzl`)OWper1y#|Y^KlUeWuJHB z<>`&CrVc>oOnVP)>^6gmPu*QX?#JWpMRe}se&FqkT5HSMbJo$6$CB$1i8cwadLOB3lZAGde~BBlxhRelOilvsGiQo!uP^Z#qKtUmA_#1rBLD+pKsdmif|Tx6bw zCxnKv51F8&*u4h5^B@O2P4C}l@AJBdbv%}9dt^B+H|iUbFX1@86~;m~&^_ahq+qCu zrcHi_E?({c*6Q(YoV^DAI0ZsWD4i-HGCqQ1Q|&#k8TgjcIVBst&OV+_OC?+u4zW#$ z+!91a6)cqXfOkj_1~=7hsQkq?SRZR%4oBAG_AJB&D7`W#!P`M|O5WsUWit9?<#>0x z7Gyc1TWsrqZY=35(nTweZurFJyJw}`yH;`=-Hl4 zLb^7j)1`a&`U;QLwGHXCr(>peMe$8BKr80R5`IqS&gq)<-yr-QxPylST5!}~&D5E~ z6&oCe`p4O`XXWRy9(yfk&aAJe&pUa;LhE?+4}2Q3&M97ceVn%55ucU<|6ENS!57p) zuRBT+PU?#GB5+#rVk@3o-jolt%n)?UCf&2A(|VA#8@*yRawHEA7`zGR&K9>)wf?VS z89c7^XEA5yXG)KY@XYDDNaQ5G<1IzbcDe8)x`aI;>x2TqrS>t_%V6%?2Z>m$WoDY0 z{*P2$&lykCz@an8&@%G)*Fogzlh172SYdtY%^@_86 literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/mine-blue.png b/static/imgs/tabbar/mine-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..f893dcf42fd5d72256605510bdcc3f8117822d20 GIT binary patch literal 957 zcmV;u148_XP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91EuaGc1ONa40RR91EdT%j07j?R9Fe^m`!XAQ547jr=^Mz z#lm-NEHv0iDp6r2@exW$R|FBUWg(Hy!$@1fqS(<$h^55B#;!>htZYQWqP`NLK9Z71 z1bx-xKk9AX%$>PsUO!&s-DEnQd;aH~-<-Mc&bA2$iUvFdH;lK!~SuO~lrpalYV`lX4fzH+>8Aoz=z z#iOInLlc*Tx`v(S;|A}ZCf@K(Z*`e4AM`M~nKYko2|%$K1>IJGV=ubpz1jDlL;h7>DPxEB@ZXcA%ha>rGuP9toH1Ue>N1S^p$od3uk(OM zOGb`z^J@;RD_DUWI4;FkHDLJ z0#=|Ik=OK(W9BW`gG{A&jUv)sGiMLu^vOXmF46f9-%Jd zi+X?oGVeSqiP>I9%S4&G|NrGNnEyUzVWcg2^6*H=+(v3+h@ehfDcbq+<*LO9vAJqU+ fW2jYNqATzRYhI(5a~tP?00000NkvXXu0mjf1L>^x literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/mine-gray.png b/static/imgs/tabbar/mine-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c94fba68a96b737071e3e57e9986a1652a9cf8 GIT binary patch literal 1522 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91ET97b1ONa40RR91EC2ui0Q_#}qW}N}TuDShR9Fe^SY2owRTMsVX0|4= zjcskEYSC0n)rtra#2@hI!4@C1qLMx+h9X7qXC<4THF1;NBeqwW&HOoV{lv-p^sv* z$ZxC7w<^M^RH|}j&g?)EuL~h63z1=r&Expt>MEl<5{ZyrQY)D-Rn-*c=K{n%K{7L7 zXAEZSE4A7s5$37XW|%W4u&TF8vIw+*uYVK?jSDcQ$Vm5>WUYOktKifAzzA-@m?%xD<%UG=81vZaW3BJf@;tj4u==rei6m- z#Te;EScED2Dl!mZu*Dt;ihJu{yLZ-%%f70l7>afMJ(#YofD(+b5I1?SCRC<^$KO#i zF|-($TP~)w`pRI0nb?v=(#~h~pqeK(2eUX%Fv3Fn!-W)LldA_+ys=(P1)M;H8Hisz zn6MR-eVv$$qZg}atQ({1 znen4J*cDHn!q@t+48_yygUXNyN2Ae8(&m+PnV(O?J4m)(+VPU~MQ5z}QH;g&L%juF zGz86ihibq~e}$yC$y7)Hw>dGa>1^EA#WdM9i|w#2ysZIy34Pry5q*CLBXmD+Z8$6A zRb@$p2^>k^0#^DYR@}W}swBmVPJtfUgJgeJ@n7i^cn(VdT~F&+(Vt{rU1E%|OS{%$ zlE4+_Lqi*3E}g)8#X+2WB_+nBCTMH~szPnNq2Yr1!v-YG6N9_JvX0|?yv>`$Apq=4 zeEgGi5a8~0j>Z|YuNS~>#$OzGX%Y{vd_cSeO@d}T!P^=qy?BLm-K0$qamz`zz*u;0bSx?d8b2iMny?rV=W{3vaHvMAx@%3Q)9 zoUoHXGW%wX$6DMI%MZMeoyYsza6F#5TM(|&57VN%#G*BOSdt|IxX(vdOO|j5gRn@a z=4_91*4xWH|NjLm+9ZaZy$jf=&3Fno0%^7fW`f4JZyyr=&dPPG>(63N(F$f)gj zqwyO*q=FT;P3w?{?0LAR;x#{@lI@6zg>cpZ<)WO0uzU&gz9ZW)(D{x)0QmIXJRF`W z1XjuzVG_0{c5f!P$COol2}64EDbIqK72CItWW&mLI Y1-mBj*OxxQpa1{>07*qoM6N<$g7k09*8l(j literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/order-blue.png b/static/imgs/tabbar/order-blue.png new file mode 100644 index 0000000000000000000000000000000000000000..019a51de38d8945cc571a59430c0a822502f0003 GIT binary patch literal 869 zcmV-r1DgDaP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91ET97b1ONa40RR91EC2ui0Q_#}qW}N`&q+igJ<6DLS zQOUvq#f^If9}8bU;7+%SqTmA&6f_TrUA+kE(Fod;KI!af(r$ioeL2miviJ5 z%$V!xB#?BvZl`LxLlWtNhOT>0-FxcPvm3}uuE1m~U{ces$U!vm$SID&JnosNPFMxB zPO-b21v3yFa%@m=#Hlbh!X=qygd;H66^Ycu0@d{!rTa32AGpvLr;Y$`ss2*LZmA?E z6EP^G!gdv^81J0HJJPL?^h-dXZ&ZBGJ3O zrpUYC0P9!ze2&<)ieMjI=QTHTT|@&b^xx1h$qJXG&LG>h#vQv*nRyQBdnzX?)?jBx z*&Qk-bQq$xaukZDZo}ycS7kT;3?$o5A-IXZw(vbRy(>K+z6!g(g8h7Z6?L?0fz8;m zHJr$*%~Lsyo?9oJD&z1P=Y)r+Z9B5Q=#n#k;cEVw3>oMRM|W>)kqv})0se#y9-?M$ zbwi|hE6Z^be(e)MpThw)w3k)8c@0*9cPw3D?GO;$MoG?4nRHXaP>}Y?=hai4a8ek- zo+P)E&-Ebb3#LzrKH#`iCyuZ_CBj8#zaKoq23*1BlymqO^|OR!E@J2-?x37qmx6vMA^Th!-pEW>yh{v*QS!8xkZ)N|_!PhqKbpBe?}03Wrq zI^pmSqTspKaA&Wyi{8PEef5SDB{hDdyJXo&4m?`iNMUR=!`Qy$*00000NkvXXu0mjf1iyYk literal 0 HcmV?d00001 diff --git a/static/imgs/tabbar/order-gray.png b/static/imgs/tabbar/order-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..73197d1e8a1dfe0a6113ff44a9ff4f74cf66e337 GIT binary patch literal 1529 zcmVPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91ET97b1ONa40RR91EC2ui0Q_#}qW}N}V@X6oR9Fe^SWRqOMG&4{|HQFN znnp^RR^q3ri1@8&p@;(@6;yGc2M(m-KtVYL4h^zvH=_A_Mov&-H-Y5RLupZkID`Wr z0aA)eMI{h~2rh_LAt-G{K|zEx32tM*_jZ^~{M={9?>T)AaSW+Z_ z@o~mkcgLGY&M?MkO6g@;fDw@m4i0)XP2-_Z=%!Q?kH-TyQsQHQu)h?wjKfv%^1VtV z@|T>aoIdTVnw!Jg+FGrlp+OY;5L>_!XtcNgQB>7K3|O61Kz8|}qb+hG+TXtglG-Q& z?qG}$lcr(Gw<=uVZUk{i@>#k6ekFYPQnV|vpJ=ZGLKy%~3g-HVA3HLvFea?z*aB9% zdk@e;o+9AYh5!Qo4Q%op07OoJe}c4tREV2ZMhW zlH)E!lr-Q&K9lYMZxw9ZiIpL{u`^j8E}DpH!8XQ`6Ebt!yZ zw5+0%4Zy2t%z~mE`>@jW&MpvIy;&*+eTqsv8yX~!QU={$24`hdF^_fHb_7_7$7>*^ zeo4n_jae}TE-Jd2L?IC%sltGQ7_>Wbb0*nz9Qm+o9s-nnUAK{&Wzlh~(>Kg?QdG_o zSI}@|;r8~(L~CE)GoG7ltIqWt7m!$7LZHqUU85W!nch}&*(x_E6}uzAQb|`Rbd4(c zTi4>qCDs*To-#`ds~$Q^7t)-(8Pugvz~1Ugyg**LcPZDNLfIbW74REuul_JUKe3;= z$h8D4?`UaQ$V-;UiS`WKNw7~*HbaR|iG{WvWo!tOQ{y!ALW#4%60ofxKf6xZ!`E~_ zdxETN;Z`yzEZL7TR>(+q*{upk{_hB|OnB%n_LAq1na!$C%MHAlFZHH?}4_KmXVhJ zp3jMY))>Qu&I)b@V?d^M1lY&C_FtvJH8-dx!Yu%Fp9ZP^eehY{Aln>sT~29 zsUjU7ZzK{4f3l*&j4P}Aj${&N1A%OmF!xz~eOlSKulV|BrQK>c0xYLzl9^S>ac{vX z-g30di;G>m5w{aydXQsqL)wb+m3w5uvvzg^(1fTn{7gIQ zamuh>j&}7{(QD(Hyg$%Y%S-QW&&jYtk!LpLX1|(2n%lNk>xdn1;HZ5-a%>-~%>q~2 zrgyx7ZPk@wtJBaHFkKuubSGY9C|;p&uS0>k?`JDTXUykJC! { + if (userInfoParams.includes(item.key)) { + userInfo[item.key] = item.value + } + }) + try { + uni.setStorageSync('userInfo', JSON.stringify(userInfo)) + state.userInfo = userInfo + } catch (e) { + console.warn('更改userInfo失败:', e) + } + }, + removeUserInfo(state) { + try { + uni.removeStorageSync('userInfo') + state.userInfo = {} + } catch (e) { + console.warn('删除userInfo失败:', e) + } + }, + setNextPage(state, nextPage) { + if (!isObject(nextPage)) { + console.warn('nextPage必须是对象') + return + } + state.nextPage.name = nextPage.name || '' + state.nextPage.data = nextPage.data || {} + }, + removeNextPage(state) { + state.nextPage.name = '' + state.nextPage.data = {} + } + }, + actions: { + logout({ commit }) { + commit('removeOpenId') + commit('removeToken') + commit('removeUserInfo') + } + } + }) +} + +export default store diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..b8a3d5b --- /dev/null +++ b/uni.scss @@ -0,0 +1,77 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ +$uni-btn-color: #007aff; + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #0b0f0c; +$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: #fff; +$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: 24rpx; +$uni-font-size-base: 28rpx; +$uni-font-size-lg: 32rpx; + +/* 图片尺寸 */ +$uni-img-size-sm: 40rpx; +$uni-img-size-base: 52rpx; +$uni-img-size-lg: 80rpx; + +/* Border Radius */ +$uni-border-radius-sm: 4rpx; +$uni-border-radius-base: 6rpx; +$uni-border-radius-lg: 12rpx; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 10px; +$uni-spacing-row-base: 20rpx; +$uni-spacing-row-lg: 30rpx; + +/* 垂直间距 */ +$uni-spacing-col-sm: 8rpx; +$uni-spacing-col-base: 16rpx; +$uni-spacing-col-lg: 24rpx; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2c405a; // 文章标题颜色 +$uni-font-size-title: 40rpx; +$uni-color-subtitle: #555; // 二级标题颜色 +$uni-font-size-subtitle: 36rpx; +$uni-color-paragraph: #3f536e; // 文章段落颜色 +$uni-font-size-paragraph: 30rpx; diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md new file mode 100644 index 0000000..544ecc1 --- /dev/null +++ b/uni_modules/uni-badge/changelog.md @@ -0,0 +1,29 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-badge](https://uniapp.dcloud.io/component/uniui/uni-badge) +## 1.1.7(2021-11-08) +- 优化 升级ui +- 修改 size 属性默认值调整为 small +- 修改 type 属性,默认值调整为 error,info 替换 default +## 1.1.6(2021-09-22) +- 修复 在字节小程序上样式不生效的 bug +## 1.1.5(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.4(2021-07-29) +- 修复 去掉 nvue 不支持css 的 align-self 属性,nvue 下不暂支持 absolute 属性 +## 1.1.3(2021-06-24) +- 优化 示例项目 +## 1.1.1(2021-05-12) +- 新增 组件示例地址 +## 1.1.0(2021-05-12) +- 新增 uni-badge 的 absolute 属性,支持定位 +- 新增 uni-badge 的 offset 属性,支持定位偏移 +- 新增 uni-badge 的 is-dot 属性,支持仅显示有一个小点 +- 新增 uni-badge 的 max-num 属性,支持自定义封顶的数字值,超过 99 显示99+ +- 优化 uni-badge 属性 custom-style, 支持以对象形式自定义样式 +## 1.0.7(2021-05-07) +- 修复 uni-badge 在 App 端,数字小于10时不是圆形的bug +- 修复 uni-badge 在父元素不是 flex 布局时,宽度缩小的bug +- 新增 uni-badge 属性 custom-style, 支持自定义样式 +## 1.0.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue new file mode 100644 index 0000000..1981b4e --- /dev/null +++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -0,0 +1,268 @@ + + + + + diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json new file mode 100644 index 0000000..7ba6d2f --- /dev/null +++ b/uni_modules/uni-badge/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-badge", + "displayName": "uni-badge 数字角标", + "version": "1.2.0", + "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", + "keywords": [ + "", + "badge", + "uni-ui", + "uniui", + "数字角标", + "徽章" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-badge/readme.md b/uni_modules/uni-badge/readme.md new file mode 100644 index 0000000..bdf175d --- /dev/null +++ b/uni_modules/uni-badge/readme.md @@ -0,0 +1,10 @@ +## Badge 数字角标 +> **组件名:uni-badge** +> 代码块: `uBadge` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-badge) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md new file mode 100644 index 0000000..61e1edc --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,10 @@ +## 0.1.3(2022-06-02) +- 修复 localdata 赋值不生效的 bug +- 新增 支持 uni.scss 修改颜色 +- 新增 支持选项禁用(数据选项设置 disabled: true 即禁用) +## 0.1.2(2022-05-08) +- 修复 当 value 为 0 时选择不生效的 bug +## 0.1.1(2022-05-07) +- 新增 记住上次的选项(仅 collection 存在时有效) +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue new file mode 100644 index 0000000..3c53ca4 --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,420 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 0000000..2a31eef --- /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.3", + "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..86e7444 --- /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/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-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..a4f14a5 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/en.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "Pull up to show more", + "uni-load-more.contentrefresh": "loading...", + "uni-load-more.contentnomore": "No more data" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json new file mode 100644 index 0000000..f15d510 --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉显示更多", + "uni-load-more.contentrefresh": "正在加载...", + "uni-load-more.contentnomore": "没有更多数据了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json new file mode 100644 index 0000000..a255c6d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hant.json @@ -0,0 +1,5 @@ +{ + "uni-load-more.contentdown": "上拉顯示更多", + "uni-load-more.contentrefresh": "正在加載...", + "uni-load-more.contentnomore": "沒有更多數據了" +} diff --git a/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue new file mode 100644 index 0000000..e5eff4d --- /dev/null +++ b/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.vue @@ -0,0 +1,399 @@ + + + + + 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-nav-bar/changelog.md b/uni_modules/uni-nav-bar/changelog.md new file mode 100644 index 0000000..75b0586 --- /dev/null +++ b/uni_modules/uni-nav-bar/changelog.md @@ -0,0 +1,22 @@ +## 1.2.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.11(2021-05-12) +- 新增 组件示例地址 +## 1.0.10(2021-04-30) +- 修复 在nvue下fixed为true,宽度不能撑满的Bug +## 1.0.9(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.8(2021-04-14) +- uni-ui 修复 uni-nav-bar 当 fixed 属性为 true 时铺不满屏幕的 bug + +## 1.0.7(2021-02-25) +- 修复 easycom 下,找不到 uni-status-bar 的bug + +## 1.0.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.5(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue new file mode 100644 index 0000000..2fdfe35 --- /dev/null +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue new file mode 100644 index 0000000..976af6c --- /dev/null +++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue @@ -0,0 +1,27 @@ + + + + + diff --git a/uni_modules/uni-nav-bar/package.json b/uni_modules/uni-nav-bar/package.json new file mode 100644 index 0000000..fe08493 --- /dev/null +++ b/uni_modules/uni-nav-bar/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-nav-bar", + "displayName": "uni-nav-bar 自定义导航栏", + "version": "1.2.0", + "description": "自定义导航栏组件,主要用于头部导航。", + "keywords": [ + "uni-ui", + "导航", + "导航栏", + "自定义导航栏" +], + "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", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-nav-bar/readme.md b/uni_modules/uni-nav-bar/readme.md new file mode 100644 index 0000000..3934b32 --- /dev/null +++ b/uni_modules/uni-nav-bar/readme.md @@ -0,0 +1,15 @@ + + +## NavBar 导航栏 +> **组件名:uni-nav-bar** +> 代码块: `uNavBar` + +导航栏组件,主要用于头部导航。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-nav-bar) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + + + diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md new file mode 100644 index 0000000..a9e2d66 --- /dev/null +++ b/uni_modules/uni-popup/changelog.md @@ -0,0 +1,60 @@ +## 1.7.9(2022-04-02) +- 修复 弹出层内部无法滚动的bug +## 1.7.8(2022-03-28) +- 修复 小程序中高度错误的bug +## 1.7.7(2022-03-17) +- 修复 快速调用open出现问题的Bug +## 1.7.6(2022-02-14) +- 修复 safeArea 属性不能设置为false的bug +## 1.7.5(2022-01-19) +- 修复 isMaskClick 失效的bug +## 1.7.4(2022-01-19) +- 新增 cancelText \ confirmText 属性 ,可自定义文本 +- 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色 +- 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题 +## 1.7.3(2022-01-13) +- 修复 设置 safeArea 属性不生效的bug +## 1.7.2(2021-11-26) +- 优化 组件示例 +## 1.7.1(2021-11-26) +- 修复 vuedoc 文字错误 +## 1.7.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-popup](https://uniapp.dcloud.io/component/uniui/uni-popup) +## 1.6.2(2021-08-24) +- 新增 支持国际化 +## 1.6.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.6.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.5.0(2021-06-23) +- 新增 mask-click 遮罩层点击事件 +## 1.4.5(2021-06-22) +- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.4(2021-06-18) +- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.3(2021-06-08) +- 修复 错误的 watch 字段 +- 修复 safeArea 属性不生效的问题 +- 修复 点击内容,再点击遮罩无法关闭的Bug +## 1.4.2(2021-05-12) +- 新增 组件示例地址 +## 1.4.1(2021-04-29) +- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题 +## 1.4.0 (2021-04-29) +- 新增 type 属性的 left\right 值,支持左右弹出 +- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗 +- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色 +- 新增 safeArea 属性,是否适配底部安全区 +- 修复 App\h5\微信小程序底部安全区占位不对的Bug +- 修复 App 端弹出等待的Bug +- 优化 提升低配设备性能,优化动画卡顿问题 +- 优化 更简单的组件自定义方式 +## 1.2.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.2.8(2021-02-05) +- 调整为uni_modules目录规范 +## 1.2.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 +- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端 diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue new file mode 100644 index 0000000..a5d0f2a --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 0000000..91370a8 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 0000000..5be7624 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,187 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 0000000..7f1bd06 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "cancel", + "uni-popup.ok": "ok", + "uni-popup.placeholder": "pleace enter", + "uni-popup.title": "Hint", + "uni-popup.shareTitle": "Share to" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/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-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 0000000..5e3003c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "确定", + "uni-popup.placeholder": "请输入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 0000000..13e39eb --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "確定", + "uni-popup.placeholder": "請輸入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 0000000..c4e5781 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -0,0 +1,26 @@ + +export default { + data() { + return { + + } + }, + created(){ + this.popup = this.getParent() + }, + methods:{ + /** + * 获取父元素实例 + */ + getParent(name = 'uniPopup') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..db90c59 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,474 @@ + + + + diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json new file mode 100644 index 0000000..069e9ce --- /dev/null +++ b/uni_modules/uni-popup/package.json @@ -0,0 +1,90 @@ +{ + "id": "uni-popup", + "displayName": "uni-popup 弹出层", + "version": "1.7.9", + "description": " Popup 组件,提供常用的弹层", + "keywords": [ + "uni-ui", + "弹出层", + "弹窗", + "popup", + "弹框" + ], + "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", + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md new file mode 100644 index 0000000..fdad4b3 --- /dev/null +++ b/uni_modules/uni-popup/readme.md @@ -0,0 +1,17 @@ + + +## Popup 弹出层 +> **组件名:uni-popup** +> 代码块: `uPopup` +> 关联组件:`uni-transition` + + +弹出层组件,在应用中弹出一个消息提示窗口、提示框等 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-popup) +#### 如使用过程中有任何问题,或者您对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/manifest.json b/uni_modules/uni-scss/manifest.json new file mode 100644 index 0000000..9f8baee --- /dev/null +++ b/uni_modules/uni-scss/manifest.json @@ -0,0 +1,95 @@ +{ + "name" : "", + "appid" : "", + "description": "应用描述", + "versionName": "1.0.0", + "versionCode": "100", + "transformPx": false, + /* 5+App特有相关 */ + "app-plus": { + "usingComponents": true, + "splashscreen": { + "alwaysShowBeforeRender": true, + "waiting": true, + "autoclose": true, + "delay": 0 + }, + "modules": { + "OAuth": {}, + "Payment": {}, + "Push": {}, + "Share": {}, + "Speech": {}, + "VideoPlayer": {} + }, + /* 应用发布信息 */ + "distribute": { + /* android打包配置 */ + "android": { + "permissions": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios": { + "UIBackgroundModes": ["audio"] + }, + /* SDK配置 */ + "sdkConfigs": { + "speech": { + "ifly": {} + } + }, + "orientation": ["portrait-primary"] + } + }, + /* 快应用特有相关 */ + "quickapp": {}, + /* 小程序特有相关 */ + "mp-weixin": { + "appid": "", + "setting": { + "urlCheck": false + }, + "usingComponents": true + }, + "h5": { + "template": "template.h5.html", + "router": { + "mode": "history", + "base": "/h5/" + } + } +} 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-steps/changelog.md b/uni_modules/uni-steps/changelog.md new file mode 100644 index 0000000..cb9d367 --- /dev/null +++ b/uni_modules/uni-steps/changelog.md @@ -0,0 +1,16 @@ +## 1.1.1(2021-11-22) +- 修复 vue3中某些scss变量无法找到的问题 +## 1.1.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-steps](https://uniapp.dcloud.io/component/uniui/uni-steps) +## 1.0.8(2021-05-12) +- 新增 项目示例地址 +## 1.0.7(2021-05-06) +- 修复 uni-steps 横向布局时,多行文字高度不合理的 bug +## 1.0.6(2021-04-21) +- 优化 添加依赖 uni-icons, 导入后自动下载依赖 +## 1.0.5(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 + +## 1.0.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-steps/components/uni-steps/uni-steps.vue b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue new file mode 100644 index 0000000..a6c8f28 --- /dev/null +++ b/uni_modules/uni-steps/components/uni-steps/uni-steps.vue @@ -0,0 +1,269 @@ + + + + + diff --git a/uni_modules/uni-steps/package.json b/uni_modules/uni-steps/package.json new file mode 100644 index 0000000..c687b40 --- /dev/null +++ b/uni_modules/uni-steps/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-steps", + "displayName": "uni-steps 步骤条", + "version": "1.1.1", + "description": "步骤条组件,提供横向和纵向两种布局格式。", + "keywords": [ + "uni-ui", + "uniui", + "步骤条", + "时间轴" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-steps/readme.md b/uni_modules/uni-steps/readme.md new file mode 100644 index 0000000..da7a4bf --- /dev/null +++ b/uni_modules/uni-steps/readme.md @@ -0,0 +1,13 @@ + + +## Steps 步骤条 +> **组件名:uni-steps** +> 代码块: `uSteps` + + +步骤条,常用于显示进度 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-steps) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + diff --git a/uni_modules/uni-transition/changelog.md b/uni_modules/uni-transition/changelog.md new file mode 100644 index 0000000..b1a824b --- /dev/null +++ b/uni_modules/uni-transition/changelog.md @@ -0,0 +1,20 @@ +## 1.3.1(2021-11-23) +- 修复 init 方法初始化问题 +## 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-transition](https://uniapp.dcloud.io/component/uniui/uni-transition) +## 1.2.1(2021-09-27) +- 修复 init 方法不生效的 Bug +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.1(2021-05-12) +- 新增 示例地址 +- 修复 示例项目缺少组件的 Bug +## 1.1.0(2021-04-22) +- 新增 通过方法自定义动画 +- 新增 custom-class 非 NVUE 平台支持自定义 class 定制样式 +- 优化 动画触发逻辑,使动画更流畅 +- 优化 支持单独的动画类型 +- 优化 文档示例 +## 1.0.2(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-transition/components/uni-transition/createAnimation.js b/uni_modules/uni-transition/components/uni-transition/createAnimation.js new file mode 100644 index 0000000..5f54365 --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/createAnimation.js @@ -0,0 +1,128 @@ +// const defaultOption = { +// duration: 300, +// timingFunction: 'linear', +// delay: 0, +// transformOrigin: '50% 50% 0' +// } +// #ifdef APP-NVUE +const nvueAnimation = uni.requireNativePlugin('animation') +// #endif +class MPAnimation { + constructor(options, _this) { + this.options = options + this.animation = uni.createAnimation(options) + this.currentStepAnimates = {} + this.next = 0 + this.$ = _this + + } + + _nvuePushAnimates(type, args) { + let aniObj = this.currentStepAnimates[this.next] + let styles = {} + if (!aniObj) { + styles = { + styles: {}, + config: {} + } + } else { + styles = aniObj + } + if (animateTypes1.includes(type)) { + if (!styles.styles.transform) { + styles.styles.transform = '' + } + let unit = '' + if(type === 'rotate'){ + unit = 'deg' + } + styles.styles.transform += `${type}(${args+unit}) ` + } else { + styles.styles[type] = `${args}` + } + this.currentStepAnimates[this.next] = styles + } + _animateRun(styles = {}, config = {}) { + let ref = this.$.$refs['ani'].ref + if (!ref) return + return new Promise((resolve, reject) => { + nvueAnimation.transition(ref, { + styles, + ...config + }, res => { + resolve() + }) + }) + } + + _nvueNextAnimate(animates, step = 0, fn) { + let obj = animates[step] + if (obj) { + let { + styles, + config + } = obj + this._animateRun(styles, config).then(() => { + step += 1 + this._nvueNextAnimate(animates, step, fn) + }) + } else { + this.currentStepAnimates = {} + typeof fn === 'function' && fn() + this.isEnd = true + } + } + + step(config = {}) { + // #ifndef APP-NVUE + this.animation.step(config) + // #endif + // #ifdef APP-NVUE + this.currentStepAnimates[this.next].config = Object.assign({}, this.options, config) + this.currentStepAnimates[this.next].styles.transformOrigin = this.currentStepAnimates[this.next].config.transformOrigin + this.next++ + // #endif + return this + } + + run(fn) { + // #ifndef APP-NVUE + this.$.animationData = this.animation.export() + this.$.timer = setTimeout(() => { + typeof fn === 'function' && fn() + }, this.$.durationTime) + // #endif + // #ifdef APP-NVUE + this.isEnd = false + let ref = this.$.$refs['ani'] && this.$.$refs['ani'].ref + if(!ref) return + this._nvueNextAnimate(this.currentStepAnimates, 0, fn) + this.next = 0 + // #endif + } +} + + +const animateTypes1 = ['matrix', 'matrix3d', 'rotate', 'rotate3d', 'rotateX', 'rotateY', 'rotateZ', 'scale', 'scale3d', + 'scaleX', 'scaleY', 'scaleZ', 'skew', 'skewX', 'skewY', 'translate', 'translate3d', 'translateX', 'translateY', + 'translateZ' +] +const animateTypes2 = ['opacity', 'backgroundColor'] +const animateTypes3 = ['width', 'height', 'left', 'right', 'top', 'bottom'] +animateTypes1.concat(animateTypes2, animateTypes3).forEach(type => { + MPAnimation.prototype[type] = function(...args) { + // #ifndef APP-NVUE + this.animation[type](...args) + // #endif + // #ifdef APP-NVUE + this._nvuePushAnimates(type, args) + // #endif + return this + } +}) + +export function createAnimation(option, _this) { + if(!_this) return + clearTimeout(_this.timer) + return new MPAnimation(option, _this) +} diff --git a/uni_modules/uni-transition/components/uni-transition/uni-transition.vue b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue new file mode 100644 index 0000000..0d739bd --- /dev/null +++ b/uni_modules/uni-transition/components/uni-transition/uni-transition.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/uni_modules/uni-transition/package.json b/uni_modules/uni-transition/package.json new file mode 100644 index 0000000..d15fdf0 --- /dev/null +++ b/uni_modules/uni-transition/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-transition", + "displayName": "uni-transition 过渡动画", + "version": "1.3.1", + "description": "元素的简单过渡动画", + "keywords": [ + "uni-ui", + "uniui", + "动画", + "过渡", + "过渡动画" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-transition/readme.md b/uni_modules/uni-transition/readme.md new file mode 100644 index 0000000..2f8a77e --- /dev/null +++ b/uni_modules/uni-transition/readme.md @@ -0,0 +1,11 @@ + + +## Transition 过渡动画 +> **组件名:uni-transition** +> 代码块: `uTransition` + + +元素过渡动画 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-transition) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/utils/eventBus.js b/utils/eventBus.js new file mode 100644 index 0000000..fe12d90 --- /dev/null +++ b/utils/eventBus.js @@ -0,0 +1,48 @@ +/** + * eventBus + */ +class EventBus { + constructor() { + this.events = {} + } + /** + * @description: on + */ + on(event, callback) { + if (!this.events[event]) { + this.events[event] = [] + } + this.events[event].push(callback) + } + /** + * @description: once + */ + once(event, callback) { + const fn = (...args) => { + callback(...args) + this.off(event, fn) + } + this.on(event, fn) + } + /** + * @description: off + */ + off(event, callback) { + if (!this.events[event]) { + return + } + this.events[event] = this.events[event].filter((cb) => cb !== callback) + } + /** + * @description: emit + */ + emit(event, ...args) { + if (!this.events[event]) { + return + } + this.events[event].forEach((cb) => cb(...args)) + } +} + +const eventBus = new EventBus() +export default eventBus diff --git a/utils/hook.js b/utils/hook.js new file mode 100644 index 0000000..4fa6d9b --- /dev/null +++ b/utils/hook.js @@ -0,0 +1,421 @@ +import store from '@/store/index' +import { uploadUrl, XAPPID, enterpriseType } from '@/enums/index.js' +import { pushCustomerOff } from '@/apis/commonApi' +import { debounce, parseUrl } from '@/utils/index' +// 框架方法封装 +const tabList = ['index', 'order', 'mine', 'category'] + +/** + * @param {string} 返回上一级 + * @return {null} + */ +export function back() { + if (getCurrentPages().length > 1) { + uni.navigateBack({ + delta: 1 + }) + } else { + go2('index') + } +} + +/** + * 获取当前页面 + */ +export function getActivePage() { + const curPages = getCurrentPages() + if (curPages.length) { + return curPages[curPages.length - 1] + } + return null +} + +/** + * 跳转到指定页面,包括tabBar页面 + * @param {string} url 页面名称 + * @param {object} data 页面参数 + * @param {boolean} isRedirect 是否重定向 默认false + * @param {boolean} isReLaunch 是否重新加载 默认false + * @return {null} + */ +export function go2(url, data = {}, isRedirect = false, isReLaunch = false) { + if (!url) { + console.error('请选择页面') + return + } + let param = '' + Object.keys(data).forEach((key) => { + let value = data[key] + let type = typeof value + if (type === 'object') { + value = JSON.stringify(value) + } + if (param === '') { + param = `${key}=${value}` + } else { + param += `&${key}=${value}` + } + }) + if (isReLaunch) { + uni.reLaunch({ + url: `/pages/${url}/index${param ? '?' + param : ''}` + }) + return + } + if (tabList.includes(url)) { + uni.switchTab({ + url: `/pages/${url}/index${param ? '?' + param : ''}` + }) + } else { + if (isRedirect) { + uni.redirectTo({ + url: `/pages/${url}/index${param ? '?' + param : ''}` + }) + } else { + uni.navigateTo({ + url: `/pages/${url}/index${param ? '?' + param : ''}` + }) + } + } +} + +/** + * 跳转到指定页面,包括tabBar页面,校验是否已登录,未登录则跳转到登录页面 + * @param {string} url 页面名称 + * @param {object} data 页面参数 + * @param {string} isRedirect 是否重定向 默认false + * @return {null} + */ +export function loginGo2(url, data = {}, isRedirect = false) { + const token = store.state.qnToken + if (token) { + go2(url, data, isRedirect) + } else { + store.commit('setNextPage', { name: url, data }) + go2('login') + } +} + +/** + * 重定向到登陆页面 + */ +export const redirectLogin = debounce(() => { + let pages = getCurrentPages() + let curPage = pages[pages.length - 1] + let fullPath = curPage.$page.fullPath + const { host, query } = parseUrl(fullPath) + if (host) { + let reg = /\/pages\/(.*)\/index/ + let path = reg.exec(host)[1] + if (path !== 'login') { + go2('login', { target: path, data: JSON.stringify(query) }, false, true) + } + } +}, 300) + +/** + * 退出登录并跳转到登录页面 + * @return {null} + */ +export function exit(redirect = false) { + // #ifdef APP-PLUS + let cid = plus.push.getClientInfo().clientid + let platform = uni.getSystemInfoSync().platform + pushCustomerOff(cid, platform) + // #endif + store.dispatch('logout') + go2('login', {}, redirect) +} + +/** + * 图片文件上传 + * @param {array} sourceType 上传的方式 album:相册 camera:相机 + * @param {number} count 上传的数量 + * @return {Promise} 以数组的形式返回对应的文件地址 + */ +export function uploadImage(sourceType = ['album', 'camera'], count = 1) { + return new Promise((resolve, reject) => { + uni.chooseImage({ + count: count, + sizeType: ['original', 'compressed'], + sourceType: sourceType, + success: (res) => { + const tempFilePaths = res.tempFilePaths + let cache = tempFilePaths.map((path) => { + return uploadFile(path, 'image') + }) + Promise.all(cache) + .then((result) => { + resolve(result) + }) + .catch((err) => { + reject(err) + }) + }, + fail: (err) => { + console.error('chooseImage error:', err) + resolve(null) + } + }) + }) +} + +/** + * 视频文件上传 + * @param {array} sourceType 上传的方式 album:相册 camera:相机 + * @param {boolean} compressed 是否压缩 + * @return {Promise} 返回对应的文件地址 + * @value {string} url 视频地址 + * @value {string} thumb 视频缩略图地址 + */ +export function uploadVideo(sourceType = ['album', 'camera'], compressed = true) { + return new Promise((resolve, reject) => { + uni.chooseVideo({ + compressed, + sourceType: sourceType, + maxDuration: 30, + success: (res) => { + const tempFilePath = res.tempFilePath + console.log('video size:', res, res.size) + if (res.size && res.size > 1024 * 1024 * 10) { + reject('视频大小不能超过10M') + } else { + uploadFile(tempFilePath, 'video') + .then((result) => { + resolve(result) + }) + .catch((err) => { + reject(err) + }) + } + }, + fail: (err) => { + console.error('chooseImage error:', err) + resolve(null) + } + }) + }) +} + +/** + * 单文件上传 + * @param {string} path 文件路径 + * @param {string} type 文件类型 image | file,默认为image + * @returns {Promise} 返回单文件上传地址 + */ +export function uploadFile(path, type = 'image') { + return new Promise((resolve, reject) => { + uni.uploadFile({ + url: uploadUrl[type], + filePath: path, + name: type == 'image' ? 'image' : 'file', + header: { + Authorization: store.state.qnToken, + 'X-APP-ID': XAPPID + }, + // fileType: type, + success: (res) => { + let result = JSON.parse(res.data) + if (result.data) { + if (type == 'video') { + resolve({ + url: result.data.videoFileUrl, + thumb: result.data.videoImgUrl + }) + } else { + resolve(result.data) + } + } else { + reject(result.message) + } + }, + fail: (err) => { + console.error('uploadFile error:', err) + reject(err) + } + }) + }) +} + +/** + * 屏幕截图并保存到相册(不包含状态栏和tabBar),原理就是用webview的draw方法 + */ +export function screenShot() { + let pages = getCurrentPages() + let page = pages[pages.length - 1] + let bitmap = null + // 获取当前页面 webview 的对象实例 + let currentWebview = page.$getAppWebview() + bitmap = new plus.nativeObj.Bitmap('amway_img') + // 将webview内容绘制到Bitmap对象中 + currentWebview.draw( + bitmap, + function () { + console.log('截屏绘制图片成功') + bitmap.save( + '_doc/a.jpg', + {}, + function (i) { + uni.saveImageToPhotosAlbum({ + filePath: i.target, + success: function () { + bitmap.clear() //销毁Bitmap图片 + uni.showToast({ + title: '保存图片成功', + mask: false, + duration: 1500 + }) + } + }) + }, + function (e) { + uni.showToast({ + title: '保存图片失败,请手动截图', + mask: false, + duration: 1500 + }) + } + ) + }, + function (e) { + uni.showToast({ + title: '保存图片失败,请手动截图', + mask: false, + duration: 1500 + }) + } + ) +} + +/** + * 判断是否授权相册并保存图片base64到相册 + * @param {string} base64 图片base64 + */ +export function saveImage(base64) { + saveBase64ToTempFile(base64).then((url) => { + saveImageToPhotosAlbum(url) + }) +} + +/** + * 将base64保存为临时文件,并返回文件路径 + * @param {string} base64 + * @returns + */ +export function saveBase64ToTempFile(base64) { + return new Promise((resolve, reject) => { + const bitmap = new plus.nativeObj.Bitmap('img') + bitmap.loadBase64Data(base64, () => { + const url = '_doc/' + new Date().getTime() + '.png' + bitmap.save( + url, + { + overwrite: true + }, + () => { + bitmap.clear() + resolve(url) + }, + (e) => { + reject(e) + } + ) + }) + }) +} + +/** + * 保存图片到相册 + * @param {string} path 图片路径 + */ +export function saveImageToPhotosAlbum(path) { + return new Promise((resolve, reject) => { + uni.saveImageToPhotosAlbum({ + filePath: path, + success: (res) => { + uni.showToast({ + title: '保存图片成功', + mask: false, + duration: 1500 + }) + resolve() + }, + fail: (err) => { + uni.showToast({ + title: '保存图片失败,请手动截图', + mask: false, + duration: 1500 + }) + resolve() + } + }) + }) +} + +/** + * 根据类型获取缓存 + * @param {string} type 缓存类型 + * @returns object 缓存数据 + */ +export function getCache(type) { + let data = null + if (store.state.cache.type === type) { + data = store.state.cache.data + // 防止同一事件循环的数据竞争 + setTimeout(() => { + store.commit('resetCache') + }) + } + return data +} + +/** + * 设置缓存 + * @param {string} type 缓存类型 + * @param {object} data 缓存数据 + * @returns null + */ +export function setCache(type, data) { + store.commit('setCache', { type, data }) +} + +/** + * 根据后端统一的skuList转化为前端需要的skuList + * @param {array} list + * @returns {array} skuList + */ +export function transformSku(list) { + let skuList = [] + list.forEach((item) => { + let sku = { + id: item.id, + stock: item.stock, + scribingPrice: item.scribingPrice, + listPrice: item.listPrice + } + let attrs = {} + item.attrList.forEach((attr) => { + attrs[attr.skuAttrId] = { + value: attr.skuAttrValueId, + extraInfo: attr + } + }) + skuList.push({ ...sku, attrs }) + }) + return skuList +} + +/** + * 跳转到微信客服 + */ +export function jumpService(info) { + // #ifdef MP-WEIXIN + wx.openCustomerServiceChat(info || { extInfo: { url: 'https://work.weixin.qq.com/kfid/kfca1fe7388697db25c' }, corpId: 'wwe1732a63029fe997' }) + // #endif + + // #ifndef MP-WEIXIN + uni.showToast({ + title: '请在微信中打开' + }) + // #endif +} diff --git a/utils/http/http.js b/utils/http/http.js new file mode 100644 index 0000000..586990f --- /dev/null +++ b/utils/http/http.js @@ -0,0 +1,137 @@ +import { isFunction } from '../is.js' +import env from '@/env/index.js' +const urlEnv = env === 'production' ? '' : `-${env}` +const uploadUrl = `https://api-ops-yyt${urlEnv}.qniao.cn/cloud-print-user-center/utils/uploadImage` +export default class Http { + constructor(config = {}, { reqInterceptor, resInterceptor, transformConfig } = {}) { + this.baseUrl = config.baseUrl + this.header = config.header || { + 'content-type': 'application/json;charset=UTF-8' + } + this.requestOption = config.requestOption || {} + this.reqInterceptor = reqInterceptor + this.resInterceptor = resInterceptor + this.transformConfig = transformConfig + } + post(config, options) { + return this.request( + { + method: 'POST', + ...config + }, + options + ) + } + get(config, options) { + return this.request( + { + method: 'GET', + ...config + }, + options + ) + } + /** + * @param {Object} config 和请求相关的参数 + * @param {Object} options 对请求数据进行额外处理的参数 + */ + request(config, options) { + let conf = Object.assign({}, config) + const { transformConfig, reqInterceptor, resInterceptor } = this + if (transformConfig && isFunction(transformConfig)) { + conf = transformConfig(this, config) + } + let opt = Object.assign({}, this.requestOption, options) + if (reqInterceptor && isFunction(reqInterceptor)) { + conf = reqInterceptor(conf, opt) + } + return new Promise((resolve, reject) => { + uni.request({ + url: conf.url, + data: conf.data, + // enableHttpDNS: openHttpDNS && hasHttpDNSQuota && !hasSystemProxy, + // httpDNSServiceId: 'wxa410372c837a5f26', + timeout: conf.timeout || 5000, + header: conf.header, + method: conf.method, + success: (res) => { + let data = resInterceptor(res, opt) + if (data === null) { + console.log('报错的请求参数:', conf) + let error = res + // 组装一下错误 + if (res.data && res.data.message) { + error = { + message: res.data.message, + code:res.data.code + } + } + reject(error) + return + } + // 服务器错误也会用then抛出,需要自己判断data==null + resolve(data) + }, + fail: (err) => { + if (err.errno === 5) { + uni.showToast({ + title: '网络异常,请重新进入小程序', + icon: 'none', + duration: 2000 + }) + } + // httpDNS额度用完 + else if (err.errno === 602103) { + // hasHttpDNSQuota = false + this.request(config, options) + } else { + uni.showToast({ + title: '服务器正在维护中,请在首页联系客服', + icon: 'none', + duration: 2000 + }) + } + reject(err) + } + }) + }).catch((err) => { + // 不会再进入后面传递的then函数了 + return Promise.reject(err) + }) + } + // config:{} + uploadFile(config, options) { + return new Promise((resolve, reject) => { + let conf = Object.assign({}, config) + conf.url = uploadUrl + const { reqInterceptor } = this + let opt = Object.assign({}, this.requestOption, options) + if (reqInterceptor && isFunction(reqInterceptor)) { + conf = reqInterceptor(conf, opt) + } + delete conf.header['Content-Type'] + uni.uploadFile({ + url: conf.url, + header: { + ...conf.header, + image: config.data.filePath + // 'Content-Type': 'image/png' + }, + filePath: config.data.filePath, + name: config.data.fileName || 'image', + formData: { + image: config.data.filePath + }, + success: (res) => { + uni.hideLoading() + resolve(res.data) + }, + fail: (err) => { + reject(err) + } + }) + }).catch((err) => { + console.error('upload native err', err) + }) + } +} diff --git a/utils/http/index.js b/utils/http/index.js new file mode 100644 index 0000000..0ab971e --- /dev/null +++ b/utils/http/index.js @@ -0,0 +1,150 @@ +import Http from './http.js' +import env from '@/env/index.js' +import { XAPPID, encryptType } from '@/enums/index.js' +import { md5 } from '@/utils/md5.js' +import { redirectLogin } from '@/utils/hook' + +// 请求封装文件 +const urlEnv = env === 'production' ? '' : `-${env}` +/** + * 系统默认的请求域名 + */ +export const baseUrl = `https://api-client-yyt${urlEnv}.qniao.cn` +// 请求url列表 +const prefixList = { + // '/yyt-uec': `https://api-client-yyt${urlEnv}.qniao.cn`, + // '/base-paper-trading': `https://api-client-yyt${urlEnv}.qniao.cn`, + '/uec': `https://api-client-uec${urlEnv}.qniao.cn` + // '/document': `https://api-client-yyt${urlEnv}.qniao.cn`, + // '/cloud-print-user-center':`https://api-client-yyt${urlEnv}.qniao.cn` +} + +const config = { + baseUrl: '', + header: { + 'content-type': 'application/json;charset=UTF-8' + }, + requestOption: { + // 是否需要隐藏loading + hideLoading: false, + // 是否需要自定义错误提醒 + customToast: false, + // 是否返回原始数据 + isReturnNativeResponse: false, + // 需要对返回数据进行处理 + isTransformResponse: true, + // 是否加密 + isEncrypt: false + } +} + +// 请求拦截 +const reqInterceptor = (config, options) => { + const { url } = config + // 添加token + let token = '' + try { + if (url.startsWith('uec')) { + token = uni.getStorageSync('uecToken') + } else { + token = uni.getStorageSync('qnToken') + } + } catch (e) { + console.error('获取缓存失败:', e) + } + config.header = { + ...config.header, + Authorization: token || '', + 'X-APP-ID': XAPPID + } + // 改变url + let newUrl = '' + if (url.startsWith('http')) { + newUrl = url + } else { + let hit = false + for (let key in prefixList) { + if (url.startsWith(key)) { + newUrl = prefixList[key] + url + hit = true + break + } + } + if (!hit) { + newUrl = baseUrl + url + } + } + config.url = newUrl + if (!options.hideLoading) { + uni.showLoading({ + title: '加载中...' + }) + } + if (options.isEncrypt) { + let data = config.data + const signStr = JSON.stringify(data) + const signStrMore = `&Authorization=${token}&X-APP-ID=${XAPPID}` + const sign = md5(JSON.stringify(data) + signStrMore) + data.sign = sign + data.signStr = signStr + data.signType = encryptType.MD5 + } + return config +} + +// 响应拦截 +const resInterceptor = (response, options) => { + uni.hideLoading() + if (options.isReturnNativeResponse) { + return response + } + // 直接返回 {code,data,message} + if (!options.isTransformResponse) { + return response.data + } + const { statusCode } = response + const res = response.data + if (statusCode >= 200 && statusCode < 300) { + if (res.code == 0) { + // 将成功的null置位1 + return res.data === null ? 1 : res.data + } else if (res.code == 401) { + // 重定向到登陆 + redirectLogin() + } else { + handleToast(options) + } + } else { + handleToast(options) + } + return null +} + +function handleToast(options) { + if (options.customToast) return + uni.showToast({ + title: '服务器正在维护中,请在首页联系客服', + icon: 'none', + duration: 2000 + }) +} + +const transformConfig = (ins, config) => { + let conf = { + ...config + } + conf.baseUrl = config.baseUrl || ins.baseUrl || '' + conf.header = config.header || ins.header + conf.method = config.method || 'GET' + conf.data = config.data || config.params || {} + conf.dataType = config.dataType || 'json' + conf.responseType = config.responseType || 'text' + return conf +} +const http = new Http(config, { + reqInterceptor, + resInterceptor, + transformConfig +}) + +export default http diff --git a/utils/index.js b/utils/index.js new file mode 100644 index 0000000..5fb58c7 --- /dev/null +++ b/utils/index.js @@ -0,0 +1,480 @@ +import env from '@/env/index.js' +import store from '@/store/index.js' +import { isDate, isString, isArray } from './is.js' +/** + * 日期格式化,样例 yyyy-mm-dd hh:MM:ss + * @param date Date 需要转换的日期 + * @param fmt string 转化的格式 yyyy-mm-dd hh:MM:ss + */ +export const dateTimeFormat = (date, fmt) => { + if (isString(date)) { + date = date.replace(/-/g, '/') + } + if (!isDate(date)) { + date = new Date(date) + } + if (!date || isNaN(date.getTime())) { + throw new Error('日期不正确') + } + let ret + const opt = { + 'y+': date.getFullYear().toString(), // 年 + 'm+': (date.getMonth() + 1).toString(), // 月 + 'd+': date.getDate().toString(), // 日 + 'h+': date.getHours().toString(), // 时 + 'M+': date.getMinutes().toString(), // 分 + 's+': date.getSeconds().toString() // 秒 + } + for (let k in opt) { + ret = new RegExp('(' + k + ')').exec(fmt) + if (ret) { + fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')) + } + } + return fmt +} +/** + * 日期格式化文字描述,样例 yyyy-mm-dd hh:MM:ss + * @param stringTime 需要转换的日期 + */ +export const getTimer = (stringTime) => { + let minute = 1000 * 60 + let hour = minute * 60 + let day = hour * 24 + let week = day * 7 + let month = day * 30 + let time1 = new Date().getTime() //当前的时间戳 + let time2 = Date.parse(new Date(stringTime)) //指定时间的时间戳 + let time = time1 - time2 + + let result = null + if (time / month >= 1) { + result = parseInt(time / month) + '月前' + } else if (time / week >= 1) { + result = parseInt(time / week) + '周前' + } else if (time / day >= 1) { + result = parseInt(time / day) + '天前' + } else if (time / hour >= 1) { + result = parseInt(time / hour) + '小时前' + } else if (time / minute >= 1) { + result = parseInt(time / minute) + '分钟前' + } else { + result = '刚刚' + } + return result +} + +/** + * 创建websocket + * @param {*} data + * @value {string} pageInfo 页面信息 + * @value {true} retry 是否重连,默认false + * @returns 一个websocket实例 + */ +export const makeSocket = async ({ pageInfo = '', retry = false }) => { + const socket = { + sockTask: null, + close: function () { + this.sockTask.close({ + code: 1000 + }) + closeFlag = true + }, + onMessage: function () { + console.log('onMessage') + }, + onError: function () { + console.log('onError') + }, + onRetry: function () { + console.log('onRetry') + } + } + + let limitedNum = 0 + let closeFlag = false + let timer = null + + async function createSocket() { + let url = '' + if (env == 'production') { + url = 'wss://api-client-yyt.qniao.cn/qn-websocket-service/wechatwebsock?token=' + } else if (env == 'test') { + url = 'wss://api-client-yyt-test.qniao.cn/qn-websocket-service/wechatwebsock?token=' + } + const token = store.state.qnToken + const socketTask = await uni.connectSocket({ + url: `${url}${token}`, + header: { + 'content-type': 'application/json' + }, + success: () => { + console.log('websocket连接成功') + }, + fail: () => { + console.log('websocket连接失败') + } + }) + socketTask.onOpen(() => { + console.log(pageInfo + ' onOpen') + timer = setInterval(() => { + socketTask.send({ + data: 'ping' + }) + }, 10000) + }) + socketTask.onClose(() => { + console.log(pageInfo + ' onClose') + clearInterval(timer) + timer = null + if (!closeFlag && retry && limitedNum < 20) { + limitedNum++ + console.log('重连次数:' + limitedNum) + createSocket().then(() => { + installSocket() + socket.onRetry() + }) + } + }) + + socket.sockTask = socketTask + } + + await createSocket() + function installSocket() { + if (socket.sockTask) { + socket.onMessage = (fn) => { + socket.sockTask.onMessage((res) => { + let data = JSON.parse(res.data) + console.log(pageInfo + '接收到消息:', data) + if (data.type != 'heartbeat') { + fn(data) + } + }) + } + socket.onError = (fn) => { + socket.sockTask.onError((err) => { + fn(err) + }) + } + } + } + installSocket() + + return socket +} + +let _boundaryCheckingState = true + +/** + * {beyond:是否超出目标时间,day:天,hours:小时,minutes:分钟,seconds:秒钟} + * @param time 计算时间 + * @param target 对照时间 + * @returns 时间差对象 + */ +export const difTime = (time, target) => { + if (isString(time)) { + time = time.replace(/-/g, '/') + } + if (isString(target)) { + target = target.replace(/-/g, '/') + } + let begin = new Date(time).getTime() + // 兼容ios时间 + let end = new Date(target).getTime() + let beyond = begin < end ? false : true + let diff = Math.abs(begin - end) + // 计算天数 + let day = Math.floor(diff / (24 * 3600 * 1000)) + day != day ? (day = 0) : '' + diff = diff % (24 * 3600 * 1000) + // 计算小时数 + let hours = Math.floor(diff / (3600 * 1000)) + hours != hours ? (hours = 0) : '' + diff = diff % (3600 * 1000) + // 计算分钟数 + let minutes = Math.floor(diff / (60 * 1000)) + minutes != minutes ? (minutes = 0) : '' + diff = diff % (60 * 1000) + // 计算秒数 + let seconds = Math.floor(diff / 1000) + seconds != seconds ? (seconds = 0) : '' + return { + beyond, + day, + hours, + minutes, + seconds + } +} + +/** + * 迭代操作 + */ +function iteratorOperation(arr, operation) { + const [num1, num2, ...others] = arr + let res = operation(num1, num2) + + others.forEach((num) => { + res = operation(res, num) + }) + + return res +} + +/** + * Return digits length of a number + * @param {*number} num Input number + */ +function digitLength(num) { + // Get digit length of e + const eSplit = num.toString().split(/[eE]/) + const len = (eSplit[0].split('.')[1] || '').length - +(eSplit[1] || 0) + return len > 0 ? len : 0 +} + +/** + * 把错误的数据转正 + * strip(0.09999999999999998)=0.1 + */ +function strip(num, precision = 15) { + return +parseFloat(Number(num).toPrecision(precision)) +} + +/** + * 把小数转成整数,支持科学计数法。如果是小数则放大成整数 + * @param {*number} num 输入数 + */ +function float2Fixed(num) { + if (num.toString().indexOf('e') === -1) { + return Number(num.toString().replace('.', '')) + } + const dLen = digitLength(num) + return dLen > 0 ? strip(Number(num) * Math.pow(10, dLen)) : Number(num) +} + +/** + * 检测数字是否越界,如果越界给出提示 + * @param {*number} num 输入数 + */ +function checkBoundary(num) { + if (_boundaryCheckingState) { + if (num > Number.MAX_SAFE_INTEGER || num < Number.MIN_SAFE_INTEGER) { + console.warn(`${num} is beyond boundary when transfer to integer, the results may not be accurate`) + } + } +} + +/** + * 精确乘法 + */ +function times(...nums) { + if (nums.length > 2) { + return iteratorOperation(nums, times) + } + + const [num1, num2] = nums + const num1Changed = float2Fixed(num1) + const num2Changed = float2Fixed(num2) + const baseNum = digitLength(num1) + digitLength(num2) + const leftValue = num1Changed * num2Changed + + checkBoundary(leftValue) + + return leftValue / Math.pow(10, baseNum) +} + +/** + * 精确除法 + */ +function divide(...nums) { + if (nums.length > 2) { + return iteratorOperation(nums, divide) + } + + const [num1, num2] = nums + const num1Changed = float2Fixed(num1) + const num2Changed = float2Fixed(num2) + checkBoundary(num1Changed) + checkBoundary(num2Changed) + // fix: 类似 10 ** -4 为 0.00009999999999999999,strip 修正 + return times(num1Changed / num2Changed, strip(Math.pow(10, digitLength(num2) - digitLength(num1)))) +} + +/** + * 精确四舍五入 + */ +export const round = (num, ratio) => { + const base = Math.pow(10, ratio) + let result = divide(Math.round(Math.abs(times(num, base))), base) + if (num < 0 && result !== 0) { + result = times(result, -1) + } + return result +} + +/** + * 根据规则校验字段 + * @param {*} value 输入值 + * @param {array} rules 规则集 {type,required,message} + * @value {boolean} required 是否必填 + * @value {string} type 字段类型校验,目前支持 phone + * @returns {object} {isValid,msg} + */ +export const validateField = (value, rules) => { + let isValid = true + let msg = '' + for (let rule of rules) { + if (rule.required) { + if (value === '' || value === undefined || value === null) { + isValid = false + msg = rule.message + break + } + if (isArray(value) && value.length === 0) { + isValid = false + msg = rule.message + break + } + } + if (rule.type === 'phone' && value !== '' && !/^1[3456789]\d{9}$/.test(value)) { + isValid = false + msg = rule.message + break + } + } + return { + isValid, + msg + } +} + +/** + * 正确数字保留几位小数显示 + * @param {(number | string)} value 要修正的对象 + * @param {number} precision 保留位数 + * @returns {string} + */ +export const numToString = function (value, precision = 2) { + const zeros = '00000000000000' + let temp = '' + try { + temp = round(value, precision) + '' + let dot = temp.indexOf('.') + if (dot == -1) { + temp = temp + '.' + zeros.substring(0, 0 + precision) + } else { + // 计算差几个0,精度 - 现有位数 + let digits = precision - (temp.length - dot - 1) + digits > 0 ? (temp = temp + zeros.substring(0, digits)) : '' + } + } catch (error) { + console.log('数字格式错误') + return value + } + return temp +} + +/** + * 简易版防抖函数 + * @param {Function} fn 函数 + * @param {number} delay 延迟时间 + * @returns {Function} + */ +export function debounce(fn, delay) { + let timer = null + return function (...args) { + if (timer) { + clearTimeout(timer) + timer = null + } + timer = setTimeout(() => { + timer = null + fn.apply(this, args) + }, delay) + } +} + +/** + * 简易版节流函数,可以带异步数据返回 + * @param {Function} fn 函数,如果需要返回内容则需要返回Promise,并在then中return内容 + * @param {number} delay 延迟时间单位毫秒 + */ +export function throttle(fn, delay) { + let timer = null, + first = true, + result = null, + lastInvokeTime = 0, + remainingTime = null + return function (...args) { + if (first) { + result = fn.apply(this, args) + first = false + lastInvokeTime = Date.now() + return result + } + // 如果上次调用时间与当前时间差大于等于delay,则直接执行 + if (Date.now() - lastInvokeTime >= delay) { + result = fn.apply(this, args) + lastInvokeTime = Date.now() + return result + } else { + remainingTime = delay - (Date.now() - lastInvokeTime) + if (timer) { + clearTimeout(timer) + createTimer.call(this, remainingTime, args) + } else { + createTimer.call(this, remainingTime, args) + } + } + + return result + } + + function createTimer(time, args) { + timer = null + timer = setTimeout(() => { + result = fn.apply(this, args) + timer = null + lastInvokeTime = Date.now() + }, time) + } +} + +/** + * 简易的解析地址的函数 + * @param {string} url 需要解析的url地址 + * @returns {object} {host,query} + */ +export function parseUrl(url) { + let query = {} + let host = url + if (url.indexOf('?') > -1) { + host = url.substring(0, url.indexOf('?')) + let str = url.split('?')[1] + let arr2 = str.split('&') + arr2.forEach((item) => { + let arr3 = item.split('=') + query[arr3[0]] = arr3[1] + }) + } + return { host, query } +} + +/** + * 获取数组的所有子集 + * @param {Array} arr 数组 + * @returns Array> + */ +export function getAllSubsets(arr) { + let res = [[]] + for (let item of arr) { + const tempRes = res.map((subset) => { + const one = subset.concat([]) + one.push(item) + return one + }) + res = res.concat(tempRes) + } + return res +} diff --git a/utils/is.js b/utils/is.js new file mode 100644 index 0000000..9ff756c --- /dev/null +++ b/utils/is.js @@ -0,0 +1,25 @@ +const toString = Object.prototype.toString + +export function is(val, type) { + return toString.call(val) === `[object ${type}]` +} + +export function isFunction(val) { + return is(val, 'Function') +} + +export function isObject(val) { + return is(val, 'Object') +} + +export function isArray(val) { + return is(val, 'Array') +} + +export function isDate(val) { + return is(val, 'Date') +} + +export function isString(val) { + return is(val, 'String') +} diff --git a/utils/md5.js b/utils/md5.js new file mode 100644 index 0000000..3281de6 --- /dev/null +++ b/utils/md5.js @@ -0,0 +1,223 @@ +export function md5(string) { + function RotateLeft(lValue, iShiftBits) { + return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)) + } + + function AddUnsigned(lX, lY) { + let lX4, lY4, lX8, lY8, lResult + lX8 = lX & 0x80000000 + lY8 = lY & 0x80000000 + lX4 = lX & 0x40000000 + lY4 = lY & 0x40000000 + lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff) + if (lX4 & lY4) { + return lResult ^ 0x80000000 ^ lX8 ^ lY8 + } + if (lX4 | lY4) { + if (lResult & 0x40000000) { + return lResult ^ 0xc0000000 ^ lX8 ^ lY8 + } else { + return lResult ^ 0x40000000 ^ lX8 ^ lY8 + } + } else { + return lResult ^ lX8 ^ lY8 + } + } + + function F(x, y, z) { + return (x & y) | (~x & z) + } + function G(x, y, z) { + return (x & z) | (y & ~z) + } + function H(x, y, z) { + return x ^ y ^ z + } + function I(x, y, z) { + return y ^ (x | ~z) + } + + function FF(a, b, c, d, x, s, ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)) + return AddUnsigned(RotateLeft(a, s), b) + } + + function GG(a, b, c, d, x, s, ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)) + return AddUnsigned(RotateLeft(a, s), b) + } + + function HH(a, b, c, d, x, s, ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)) + return AddUnsigned(RotateLeft(a, s), b) + } + + function II(a, b, c, d, x, s, ac) { + a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)) + return AddUnsigned(RotateLeft(a, s), b) + } + + function ConvertToWordArray(string) { + let lWordCount + let lMessageLength = string.length + let lNumberOfWords_temp1 = lMessageLength + 8 + let lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64 + let lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16 + let lWordArray = Array(lNumberOfWords - 1) + let lBytePosition = 0 + let lByteCount = 0 + while (lByteCount < lMessageLength) { + lWordCount = (lByteCount - (lByteCount % 4)) / 4 + lBytePosition = (lByteCount % 4) * 8 + lWordArray[lWordCount] = lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition) + lByteCount++ + } + lWordCount = (lByteCount - (lByteCount % 4)) / 4 + lBytePosition = (lByteCount % 4) * 8 + lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition) + lWordArray[lNumberOfWords - 2] = lMessageLength << 3 + lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29 + return lWordArray + } + + function WordToHex(lValue) { + let WordToHexValue = '', + WordToHexValue_temp = '', + lByte, + lCount + for (lCount = 0; lCount <= 3; lCount++) { + lByte = (lValue >>> (lCount * 8)) & 255 + WordToHexValue_temp = '0' + lByte.toString(16) + WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2) + } + return WordToHexValue + } + + function Utf8Encode(string) { + string = string.replace(/\r\n/g, '\n') + let utftext = '' + + for (let n = 0; n < string.length; n++) { + let c = string.charCodeAt(n) + + if (c < 128) { + utftext += String.fromCharCode(c) + } else if (c > 127 && c < 2048) { + utftext += String.fromCharCode((c >> 6) | 192) + utftext += String.fromCharCode((c & 63) | 128) + } else { + utftext += String.fromCharCode((c >> 12) | 224) + utftext += String.fromCharCode(((c >> 6) & 63) | 128) + utftext += String.fromCharCode((c & 63) | 128) + } + } + + return utftext + } + + let k, AA, BB, CC, DD, a, b, c, d + let S11 = 7, + S12 = 12, + S13 = 17, + S14 = 22 + let S21 = 5, + S22 = 9, + S23 = 14, + S24 = 20 + let S31 = 4, + S32 = 11, + S33 = 16, + S34 = 23 + let S41 = 6, + S42 = 10, + S43 = 15, + S44 = 21 + + string = Utf8Encode(string) + + let x = ConvertToWordArray(string) + + a = 0x67452301 + b = 0xefcdab89 + c = 0x98badcfe + d = 0x10325476 + + for (k = 0; k < x.length; k += 16) { + AA = a + BB = b + CC = c + DD = d + a = FF(a, b, c, d, x[k + 0], S11, 0xd76aa478) + d = FF(d, a, b, c, x[k + 1], S12, 0xe8c7b756) + c = FF(c, d, a, b, x[k + 2], S13, 0x242070db) + b = FF(b, c, d, a, x[k + 3], S14, 0xc1bdceee) + a = FF(a, b, c, d, x[k + 4], S11, 0xf57c0faf) + d = FF(d, a, b, c, x[k + 5], S12, 0x4787c62a) + c = FF(c, d, a, b, x[k + 6], S13, 0xa8304613) + b = FF(b, c, d, a, x[k + 7], S14, 0xfd469501) + a = FF(a, b, c, d, x[k + 8], S11, 0x698098d8) + d = FF(d, a, b, c, x[k + 9], S12, 0x8b44f7af) + c = FF(c, d, a, b, x[k + 10], S13, 0xffff5bb1) + b = FF(b, c, d, a, x[k + 11], S14, 0x895cd7be) + a = FF(a, b, c, d, x[k + 12], S11, 0x6b901122) + d = FF(d, a, b, c, x[k + 13], S12, 0xfd987193) + c = FF(c, d, a, b, x[k + 14], S13, 0xa679438e) + b = FF(b, c, d, a, x[k + 15], S14, 0x49b40821) + a = GG(a, b, c, d, x[k + 1], S21, 0xf61e2562) + d = GG(d, a, b, c, x[k + 6], S22, 0xc040b340) + c = GG(c, d, a, b, x[k + 11], S23, 0x265e5a51) + b = GG(b, c, d, a, x[k + 0], S24, 0xe9b6c7aa) + a = GG(a, b, c, d, x[k + 5], S21, 0xd62f105d) + d = GG(d, a, b, c, x[k + 10], S22, 0x2441453) + c = GG(c, d, a, b, x[k + 15], S23, 0xd8a1e681) + b = GG(b, c, d, a, x[k + 4], S24, 0xe7d3fbc8) + a = GG(a, b, c, d, x[k + 9], S21, 0x21e1cde6) + d = GG(d, a, b, c, x[k + 14], S22, 0xc33707d6) + c = GG(c, d, a, b, x[k + 3], S23, 0xf4d50d87) + b = GG(b, c, d, a, x[k + 8], S24, 0x455a14ed) + a = GG(a, b, c, d, x[k + 13], S21, 0xa9e3e905) + d = GG(d, a, b, c, x[k + 2], S22, 0xfcefa3f8) + c = GG(c, d, a, b, x[k + 7], S23, 0x676f02d9) + b = GG(b, c, d, a, x[k + 12], S24, 0x8d2a4c8a) + a = HH(a, b, c, d, x[k + 5], S31, 0xfffa3942) + d = HH(d, a, b, c, x[k + 8], S32, 0x8771f681) + c = HH(c, d, a, b, x[k + 11], S33, 0x6d9d6122) + b = HH(b, c, d, a, x[k + 14], S34, 0xfde5380c) + a = HH(a, b, c, d, x[k + 1], S31, 0xa4beea44) + d = HH(d, a, b, c, x[k + 4], S32, 0x4bdecfa9) + c = HH(c, d, a, b, x[k + 7], S33, 0xf6bb4b60) + b = HH(b, c, d, a, x[k + 10], S34, 0xbebfbc70) + a = HH(a, b, c, d, x[k + 13], S31, 0x289b7ec6) + d = HH(d, a, b, c, x[k + 0], S32, 0xeaa127fa) + c = HH(c, d, a, b, x[k + 3], S33, 0xd4ef3085) + b = HH(b, c, d, a, x[k + 6], S34, 0x4881d05) + a = HH(a, b, c, d, x[k + 9], S31, 0xd9d4d039) + d = HH(d, a, b, c, x[k + 12], S32, 0xe6db99e5) + c = HH(c, d, a, b, x[k + 15], S33, 0x1fa27cf8) + b = HH(b, c, d, a, x[k + 2], S34, 0xc4ac5665) + a = II(a, b, c, d, x[k + 0], S41, 0xf4292244) + d = II(d, a, b, c, x[k + 7], S42, 0x432aff97) + c = II(c, d, a, b, x[k + 14], S43, 0xab9423a7) + b = II(b, c, d, a, x[k + 5], S44, 0xfc93a039) + a = II(a, b, c, d, x[k + 12], S41, 0x655b59c3) + d = II(d, a, b, c, x[k + 3], S42, 0x8f0ccc92) + c = II(c, d, a, b, x[k + 10], S43, 0xffeff47d) + b = II(b, c, d, a, x[k + 1], S44, 0x85845dd1) + a = II(a, b, c, d, x[k + 8], S41, 0x6fa87e4f) + d = II(d, a, b, c, x[k + 15], S42, 0xfe2ce6e0) + c = II(c, d, a, b, x[k + 6], S43, 0xa3014314) + b = II(b, c, d, a, x[k + 13], S44, 0x4e0811a1) + a = II(a, b, c, d, x[k + 4], S41, 0xf7537e82) + d = II(d, a, b, c, x[k + 11], S42, 0xbd3af235) + c = II(c, d, a, b, x[k + 2], S43, 0x2ad7d2bb) + b = II(b, c, d, a, x[k + 9], S44, 0xeb86d391) + a = AddUnsigned(a, AA) + b = AddUnsigned(b, BB) + c = AddUnsigned(c, CC) + d = AddUnsigned(d, DD) + } + + let temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d) + + return temp.toLowerCase() +} diff --git a/utils/monitor/Error.js b/utils/monitor/Error.js new file mode 100644 index 0000000..2483fcc --- /dev/null +++ b/utils/monitor/Error.js @@ -0,0 +1,46 @@ +import { TrackerEvents } from './monitorEnum' +export class Error { + constructor(eventName, error) { + this.eventName = eventName + this.error = error + } + getCurrentEnv() { + if (this.eventName == TrackerEvents.jsError) { + this.error = { + message: this.error.message, + stack: this.error.stack + } + } + return { + activePage: this.getActivePage()?.route || 'none', + accountInfo: this.getLocalStorage(), + eventName: this.eventName, + time: this.getTime(), + error: this.error, + extraInfo: this.getExtraInfo() + } + } + getActivePage() { + const curPages = getCurrentPages() + if (curPages.length) { + return curPages[curPages.length - 1] + } + return null + } + getLocalStorage() { + return { + token: wx.getStorageSync('qnToken'), + userInfo: wx.getStorageSync('userInfo') + } + } + getTime() { + let date = new Date() + return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}` + } + getExtraInfo() { + return this.extraInfo + } + setExtraInfo(extraInfo) { + this.extraInfo = extraInfo + } +} diff --git a/utils/monitor/index.js b/utils/monitor/index.js new file mode 100644 index 0000000..6db4494 --- /dev/null +++ b/utils/monitor/index.js @@ -0,0 +1,48 @@ +/** + * 微信小程序监控插件 + * 1. 监听 js错误 网络资源加载错误 打印错误 + * 2. 错误上报 + */ +import { rewriteApp } from './rewriteApp' +import { rewriteRequest, rewriteUpload } from './rewriteRequest' +import { Error } from './Error' + +export class Monitor { + static instance + constructor(options) { + this.options = options + this.behaviorQueue = [] + this.instance = this + // this.init() + } + /** + * 初始化 + */ + init() { + rewriteApp(this) + rewriteRequest(this) + rewriteUpload(this) + // rewritePage(this) + } + pushBehaviorItem(item) { + if (this.behaviorQueue.length >= 20) { + this.behaviorQueue.shift() + } + this.behaviorQueue.push(item) + } + handleErrorEvent(eventName, error, extraInfo) { + // 获取当前场景 + const errorInfo = new Error(eventName, error) + extraInfo ? errorInfo.setExtraInfo(extraInfo) : '' + // 错误上报 + wx.request({ + url: this.options.url, + data: { errorMessage: JSON.stringify(errorInfo.getCurrentEnv()) }, + timeout: this.options.timeout || 5000, + header: this.options.header || {}, + method: this.options.method || 'POST', + monitorIgnore: this.options.monitorIgnore || true + }) + console.log('reportData', errorInfo.getCurrentEnv()) + } +} diff --git a/utils/monitor/monitorEnum.js b/utils/monitor/monitorEnum.js new file mode 100644 index 0000000..072a628 --- /dev/null +++ b/utils/monitor/monitorEnum.js @@ -0,0 +1,17 @@ +export const IBehaviorItemType = { + fn: 'function', + console: 'console', + http: 'http', + custom: 'custom', + tap: 'tap' +} + +export const TrackerEvents = { + event: 'event', + jsError: 'jsError', + reqError: 'reqError', + uploadError: 'uploadError', + unHandleRejection: 'unHandleRejection', + performanceInfoReady: 'performanceInfoReady', + slowHttpRequest: 'slowHttpRequest' +} diff --git a/utils/monitor/rewriteApp.js b/utils/monitor/rewriteApp.js new file mode 100644 index 0000000..78def56 --- /dev/null +++ b/utils/monitor/rewriteApp.js @@ -0,0 +1,30 @@ +import { IBehaviorItemType, TrackerEvents } from './monitorEnum' +export const appHooks = ['onUnhandledRejection', 'onError'] + +export function rewriteApp(monitor) { + const originApp = App + App = function (appOptions) { + appHooks.forEach((methodName) => { + const originMethod = appOptions[methodName] + + appOptions[methodName] = function (param) { + monitor.pushBehaviorItem({ + belong: 'app', + method: methodName, + activePage: null, + type: IBehaviorItemType.fn, + args: param + }) + const error = param + if (methodName === 'onUnhandledRejection') { + monitor.handleErrorEvent(TrackerEvents.unHandleRejection, error) + } + if (methodName === 'onError') { + monitor.handleErrorEvent(TrackerEvents.jsError, error) + } + return originMethod && originMethod.call(this, param) + } + }) + return originApp(appOptions) + } +} diff --git a/utils/monitor/rewritePage.js b/utils/monitor/rewritePage.js new file mode 100644 index 0000000..3f71700 --- /dev/null +++ b/utils/monitor/rewritePage.js @@ -0,0 +1,11 @@ +/** + * uni-app 没有使用微信小程序的 Page 方法创建页面,所以暂时不加该检测 + * @param {*} monitor + */ +export function rewritePage(monitor) { + const originPage = Page + Page = function (pageOptions) { + console.log('🍰', pageOptions) + return originPage(pageOptions) + } +} diff --git a/utils/monitor/rewriteRequest.js b/utils/monitor/rewriteRequest.js new file mode 100644 index 0000000..37f12c9 --- /dev/null +++ b/utils/monitor/rewriteRequest.js @@ -0,0 +1,105 @@ +import { IBehaviorItemType, TrackerEvents } from './monitorEnum' + +function generateRequestError(requestOption, response) { + const { url, header, method } = requestOption + return { + url, + header, + method, + params: requestOption.data, + response: response.data, + statusCode: response.statusCode + } +} + +function generateUploadError(requestOption, response) { + const { url, header } = requestOption + return { + url, + header, + params: requestOption.data, + response: response.data, + statusCode: response.statusCode + } +} + +export function rewriteRequest(monitor) { + const originRequest = wx.request + Object.defineProperty(wx, 'request', { + configurable: false, + enumerable: false, + writable: false, + value: function (options) { + const originSuccess = options.success + const originFail = options.fail + monitor.pushBehaviorItem({ + belong: 'request', + method: options.url, + activePage: null, + type: IBehaviorItemType.http, + args: null + }) + /** + * 后期业务逻辑需要抽出来 + * @param {...any} args + */ + options.success = function (...args) { + typeof originSuccess === 'function' && originSuccess.call(this, ...args) + if (options.monitorIgnore) return + const response = args[0] + let error = generateRequestError(options, response) + let { statusCode, data } = response + if (statusCode >= 200 && statusCode < 300) { + let code = data.code + if (code != 0) { + monitor.handleErrorEvent(TrackerEvents.reqError, error) + } + } else { + monitor.handleErrorEvent(TrackerEvents.reqError, error) + } + } + + /** 请求错误 */ + options.fail = function (...args) { + typeof originFail === 'function' && originFail.call(this, ...args) + if (options.monitorIgnore) return + let error = generateUploadError(options, { data: args[0] }) + monitor.handleErrorEvent(TrackerEvents.reqError, error) + } + return originRequest.call(this, options) + } + }) +} + +export function rewriteUpload(monitor) { + const originUpload = wx.uploadFile + Object.defineProperty(wx, 'uploadFile', { + configurable: false, + enumerable: false, + writable: false, + value: function (options) { + const originSuccess = options.success + const originFail = options.fail + /** + * 后期业务逻辑需要抽出来 + * @param {...any} args + */ + options.success = function (...args) { + typeof originSuccess === 'function' && originSuccess.call(this, ...args) + const response = args[0] + let error = generateUploadError(options, response) + let { statusCode } = response + if (statusCode < 200 || statusCode >= 300) { + monitor.handleErrorEvent(TrackerEvents.uploadError, error) + } + } + + /** 请求错误 */ + options.fail = function (...args) { + typeof originFail === 'function' && originFail.call(this, ...args) + monitor.handleErrorEvent(TrackerEvents.uploadError, args[0]) + } + return originUpload.call(this, options) + } + }) +} diff --git a/utils/socket/index.js b/utils/socket/index.js new file mode 100644 index 0000000..96fca4f --- /dev/null +++ b/utils/socket/index.js @@ -0,0 +1,52 @@ +import { makeSocket } from '@/utils/index' +import eventBus from '@/utils/eventBus' +import { getActivePage } from '@/utils/hook' +let socket = null +export function initSocket() { + if (socket) { + return socket + } + makeSocket({ pageInfo: 'all', retry: true }).then((res) => { + destroySocket() + socket = res + socket.onMessage(handleMessage) + socket.onError(handleError) + socket.onRetry = () => { + handleRetry() + } + }) +} + +export function destroySocket() { + if (socket) { + socket.close() + socket = null + } +} + +function handleError(error) { + console.log('error', error) + destroySocket() +} + +function handleRetry() { + socket.onMessage(handleMessage) + socket.onError(handleError) +} + +function handleMessage(data) { + if (data.type === 'fnFileAnalysisInform') { + eventBus.emit('singleFileAnalysis', data) + } + if (data.type === 'allFileAnalysisSuccess') { + let page = getActivePage() + if (!page || page.route != 'pages/print/index') { + uni.showToast({ + title: '文件全部解析完成,可以下单', + icon: 'none', + duration: 2000 + }) + } + destroySocket() + } +} diff --git a/utils/vueWxRouter.js b/utils/vueWxRouter.js new file mode 100644 index 0000000..2e863b4 --- /dev/null +++ b/utils/vueWxRouter.js @@ -0,0 +1,24 @@ +function init(Vue, options) { + const route = { + data: null, + id: null + } + function setData(data) { + route.data = data + route.id = String(Date.now()) + return route.id + } + function getData(id) { + return id === route.id ? route.data : null + } + Vue.prototype.$wxRouter = { + setData: setData, + getData: getData + } + Vue.prototype.$wxRoute = route +} +const vueWxRouter = { + install: init +} + +export default vueWxRouter