From e3cb0985cdd93cdbc930c66d0090b3b8bd6bad91 Mon Sep 17 00:00:00 2001 From: wangyaqi Date: Mon, 30 Mar 2020 20:43:23 +0800 Subject: [PATCH 001/378] update: remove nav subNvue --- pages.json | 9 ++--- pages/API/subnvue/subnvue/nav.nvue | 57 ------------------------------ 2 files changed, 2 insertions(+), 64 deletions(-) delete mode 100644 pages/API/subnvue/subnvue/nav.nvue diff --git a/pages.json b/pages.json index 3e9fa87b..d6059cf8 100644 --- a/pages.json +++ b/pages.json @@ -322,9 +322,8 @@ { "path": "subnvue/subnvue", "style": { - "navigationBarTitleText": "SubNvue", + "navigationBarTitleText": "原生子窗体", "app-plus": { - "titleNView": false, "subNVues": [{ "id": "drawer", "path": "subnvue/subnvue/drawer", @@ -352,10 +351,6 @@ "height": "110px", "background": "transparent" } - }, { - "id": "nav", - "path": "subnvue/subnvue/nav", - "type": "navigationBar" }] } } @@ -1190,4 +1185,4 @@ } ] } -} \ No newline at end of file +} diff --git a/pages/API/subnvue/subnvue/nav.nvue b/pages/API/subnvue/subnvue/nav.nvue deleted file mode 100644 index 4c27782b..00000000 --- a/pages/API/subnvue/subnvue/nav.nvue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - From c1e54dc45cdcbff5cfbbc55c56f52ab03b2f2a3f Mon Sep 17 00:00:00 2001 From: wangyaqi Date: Thu, 2 Apr 2020 11:47:45 +0800 Subject: [PATCH 002/378] update: push.vue --- platforms/app-plus/push/push.vue | 89 +++++++++----------------------- 1 file changed, 25 insertions(+), 64 deletions(-) diff --git a/platforms/app-plus/push/push.vue b/platforms/app-plus/push/push.vue index 6716d177..3b05cc25 100644 --- a/platforms/app-plus/push/push.vue +++ b/platforms/app-plus/push/push.vue @@ -1,20 +1,17 @@ - - - - + + + + + From c4f4fe23ea316941da335be47a071121e392240c Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Thu, 20 Aug 2020 23:20:47 +0800 Subject: [PATCH 052/378] add: get current wifiInfo --- .../API/get-network-type/get-network-type.vue | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/pages/API/get-network-type/get-network-type.vue b/pages/API/get-network-type/get-network-type.vue index cc603990..6bffd4a2 100644 --- a/pages/API/get-network-type/get-network-type.vue +++ b/pages/API/get-network-type/get-network-type.vue @@ -11,21 +11,27 @@ {{networkType}} + + + - - + + + + button { + background-color: #007aff; + color: #ffffff; + } + diff --git a/pages/API/request-payment/request-payment.vue b/pages/API/request-payment/request-payment.vue index fea247cc..6876ed3b 100644 --- a/pages/API/request-payment/request-payment.vue +++ b/pages/API/request-payment/request-payment.vue @@ -1,228 +1,255 @@ + .ipaPayBtn { + margin-top: 30rpx; + } + From 65c4c43aa7161a9c2dac727a4538b64adb5c574d Mon Sep 17 00:00:00 2001 From: mehaotian <490272692@qq.com> Date: Sat, 22 Aug 2020 11:03:47 +0800 Subject: [PATCH 054/378] =?UTF-8?q?fix:=20=E5=90=8C=E6=AD=A5=20uni-ui=20?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96lsit=20to=20=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E7=A4=BA=E4=BE=8B=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96fab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/uni-fab/uni-fab.vue | 6 +- components/uni-icons/uni-icons.vue | 8 +- components/uni-icons/uni.ttf | Bin 0 -> 26164 bytes components/uni-list-chat/uni-list-chat.vue | 101 ++++++++++------ components/uni-list-item/uni-list-item.vue | 132 ++++++++++++++------- components/uni-list/uni-list.vue | 14 +-- pages/extUI/fab/fab.nvue | 1 - pages/extUI/list/chat.nvue | 2 +- pages/extUI/list/list.nvue | 22 ++-- 9 files changed, 185 insertions(+), 101 deletions(-) create mode 100644 components/uni-icons/uni.ttf diff --git a/components/uni-fab/uni-fab.vue b/components/uni-fab/uni-fab.vue index 9bc4a102..933e1f2a 100644 --- a/components/uni-fab/uni-fab.vue +++ b/components/uni-fab/uni-fab.vue @@ -1,6 +1,6 @@ diff --git a/components/uni-icons/uni-icons.vue b/components/uni-icons/uni-icons.vue index 030b8f89..2c859406 100644 --- a/components/uni-icons/uni-icons.vue +++ b/components/uni-icons/uni-icons.vue @@ -1,5 +1,5 @@ + button { + background-color: #007aff; + color: #ffffff; + } + diff --git a/pages/API/request-payment/request-payment.vue b/pages/API/request-payment/request-payment.vue index fea247cc..6876ed3b 100644 --- a/pages/API/request-payment/request-payment.vue +++ b/pages/API/request-payment/request-payment.vue @@ -1,228 +1,255 @@ + .ipaPayBtn { + margin-top: 30rpx; + } + From e0bfee6535858bb0c414a4eef419ae44b80c8327 Mon Sep 17 00:00:00 2001 From: mehaotian <490272692@qq.com> Date: Thu, 24 Sep 2020 21:12:47 +0800 Subject: [PATCH 058/378] =?UTF-8?q?fix:=20=E5=90=8C=E6=AD=A5=20uni-ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/uni-calendar/uni-calendar-item.vue | 1 - components/uni-calendar/uni-calendar.vue | 5 +- components/uni-card/uni-card.vue | 11 +- .../uni-collapse-item/uni-collapse-item.vue | 7 - components/uni-combox/uni-combox.vue | 5 +- components/uni-drawer/uni-drawer.vue | 4 - components/uni-fab/uni-fab.vue | 6 +- components/uni-field/uni-field.vue | 627 ++++++++++++++++++ components/uni-forms/schema-validator.js | 364 ++++++++++ components/uni-forms/uni-forms.vue | 229 +++++++ components/uni-goods-nav/uni-goods-nav.vue | 12 - .../uni-grid-item/uni-grid-item copy.vue | 5 - components/uni-grid-item/uni-grid-item.vue | 5 - components/uni-grid/uni-grid.vue | 2 - components/uni-group/uni-group.vue | 74 +++ components/uni-icons/uni-icons.vue | 9 +- components/uni-icons/uni.ttf | Bin 0 -> 26164 bytes .../uni-indexed-list-item.vue | 2 +- .../uni-indexed-list/uni-indexed-list.vue | 2 +- components/uni-list-ad/uni-list-ad.vue | 90 +++ components/uni-list-chat/uni-list-chat.scss | 58 ++ components/uni-list-chat/uni-list-chat.vue | 482 ++++++++++++++ components/uni-list-item/uni-list-item.vue | 314 ++++++--- components/uni-list/uni-list.vue | 61 +- components/uni-load-more/uni-load-more.vue | 2 - components/uni-nav-bar/uni-nav-bar.vue | 14 +- components/uni-notice-bar/uni-notice-bar.vue | 1 - components/uni-number-box/uni-number-box.vue | 7 +- components/uni-pagination/uni-pagination.vue | 2 +- .../uni-popup-dialog.vue | 1 - .../uni-popup-message.vue | 0 .../uni-popup-share.vue | 0 components/uni-popup/popup.js | 2 +- components/uni-popup/share.js | 16 + components/uni-popup/uni-popup.vue | 12 +- components/uni-rate/uni-rate.vue | 175 ++++- components/uni-section/uni-section.vue | 18 +- components/uni-status-bar/uni-status-bar.vue | 2 - components/uni-swipe-action-item/bindingx.js | 359 +++++----- components/uni-swipe-action-item/index.wxs | 258 ++++--- components/uni-swipe-action-item/mpalipay.js | 237 ++++--- components/uni-swipe-action-item/mpother.js | 312 ++++++--- components/uni-swipe-action-item/mpwxs.js | 90 ++- .../uni-swipe-action-item.vue | 278 ++++---- .../uni-swipe-action/uni-swipe-action.vue | 36 +- components/uni-swiper-dot/uni-swiper-dot.vue | 4 - components/uni-test/uni-test.vue | 17 + pages.json | 38 +- pages/extUI/badge/badge.nvue | 7 +- pages/extUI/calendar/calendar.nvue | 6 +- pages/extUI/calendar/calendar.test.js | 271 -------- pages/extUI/card/card.nvue | 8 +- pages/extUI/collapse/collapse.nvue | 7 +- pages/extUI/combox/combox.vue | 8 +- pages/extUI/countdown/countdown.nvue | 7 +- pages/extUI/drawer/drawer.nvue | 25 +- pages/extUI/fab/fab.nvue | 10 +- pages/extUI/fav/fav.nvue | 15 +- pages/extUI/field/field.vue | 163 +++++ pages/extUI/forms/forms.vue | 255 +++++++ pages/extUI/goods-nav/goods-nav.nvue | 7 +- pages/extUI/grid/grid.nvue | 11 +- pages/extUI/group/group.nvue | 175 +++++ pages/extUI/icons/icons.nvue | 11 +- pages/extUI/link/link.nvue | 7 +- pages/extUI/list/ad.nvue | 189 ++++++ pages/extUI/list/chat.nvue | 259 ++++++++ pages/extUI/list/list.nvue | 132 +++- pages/extUI/load-more/load-more.nvue | 7 +- pages/extUI/nav-bar/nav-bar.nvue | 10 +- pages/extUI/notice-bar/notice-bar.nvue | 9 +- pages/extUI/number-box/number-box.nvue | 6 +- pages/extUI/pagination/pagination.nvue | 7 +- pages/extUI/popup/popup.nvue | 25 +- pages/extUI/popup/popup.test.js | 285 -------- pages/extUI/rate/rate.nvue | 39 +- pages/extUI/search-bar/search-bar.nvue | 7 +- pages/extUI/section/section.nvue | 7 +- .../segmented-control/segmented-control.nvue | 8 +- pages/extUI/steps/steps.nvue | 7 +- pages/extUI/swipe-action/swipe-action.nvue | 273 +++++--- pages/extUI/swiper-dot/swiper-dot.nvue | 8 +- pages/extUI/tag/tag.nvue | 7 +- pages/extUI/test/test.nvue | 24 + pages/extUI/title/title.nvue | 17 +- pages/extUI/transition/transition.nvue | 6 +- pages/tabBar/extUI/extUI.nvue | 55 +- 87 files changed, 4831 insertions(+), 1805 deletions(-) create mode 100644 components/uni-field/uni-field.vue create mode 100755 components/uni-forms/schema-validator.js create mode 100755 components/uni-forms/uni-forms.vue create mode 100644 components/uni-group/uni-group.vue create mode 100644 components/uni-icons/uni.ttf create mode 100644 components/uni-list-ad/uni-list-ad.vue create mode 100644 components/uni-list-chat/uni-list-chat.scss create mode 100644 components/uni-list-chat/uni-list-chat.vue rename components/{uni-popup => uni-popup-dialog}/uni-popup-dialog.vue (95%) rename components/{uni-popup => uni-popup-message}/uni-popup-message.vue (100%) rename components/{uni-popup => uni-popup-share}/uni-popup-share.vue (100%) create mode 100644 components/uni-popup/share.js create mode 100644 components/uni-test/uni-test.vue delete mode 100644 pages/extUI/calendar/calendar.test.js create mode 100644 pages/extUI/field/field.vue create mode 100644 pages/extUI/forms/forms.vue create mode 100644 pages/extUI/group/group.nvue create mode 100644 pages/extUI/list/ad.nvue create mode 100644 pages/extUI/list/chat.nvue delete mode 100644 pages/extUI/popup/popup.test.js create mode 100644 pages/extUI/test/test.nvue diff --git a/components/uni-calendar/uni-calendar-item.vue b/components/uni-calendar/uni-calendar-item.vue index 0cde3e47..aaa216c6 100644 --- a/components/uni-calendar/uni-calendar-item.vue +++ b/components/uni-calendar/uni-calendar-item.vue @@ -124,7 +124,6 @@ height: 8px; border-radius: 8px; background-color: #dd524d; - } .uni-calendar-item--disable { diff --git a/components/uni-calendar/uni-calendar.vue b/components/uni-calendar/uni-calendar.vue index dc86c778..c8b03d29 100644 --- a/components/uni-calendar/uni-calendar.vue +++ b/components/uni-calendar/uni-calendar.vue @@ -338,7 +338,7 @@ } .uni-calendar--mask-show { - opacity: 1 + opacity: 1; } .uni-calendar--fixed { @@ -389,8 +389,6 @@ .uni-calendar--fixed-width { width: 50px; - /* padding: 0 15px; - */ } .uni-calendar__backtoday { @@ -445,7 +443,6 @@ transform: rotate(135deg); } - .uni-calendar__weeks { position: relative; /* #ifndef APP-NVUE */ diff --git a/components/uni-card/uni-card.vue b/components/uni-card/uni-card.vue index f7dc0b7d..e7a322c3 100644 --- a/components/uni-card/uni-card.vue +++ b/components/uni-card/uni-card.vue @@ -124,8 +124,6 @@ overflow: hidden; } - - .uni-border { position: relative; /* #ifdef APP-NVUE */ @@ -155,7 +153,6 @@ } /* #endif */ - .uni-border-bottom { position: relative; /* #ifdef APP-NVUE */ @@ -212,7 +209,6 @@ } /* #endif */ - .uni-card__thumbnailimage { position: relative; flex-direction: column; @@ -260,7 +256,6 @@ flex-direction: row; align-items: center; padding: 10px; - } .uni-card__title-box { @@ -329,7 +324,7 @@ } .uni-card__header-title-text { - font-size: 16; + font-size: 16px; flex: 1; color: #333; } @@ -397,7 +392,7 @@ text-overflow: ellipsis; /* #endif */ /* #ifdef APP-NVUE */ - lines: 1 - /* #endif */ + lines: 1; + /* #endif */ } \ No newline at end of file diff --git a/components/uni-collapse-item/uni-collapse-item.vue b/components/uni-collapse-item/uni-collapse-item.vue index aa7f7e38..3936ffa9 100644 --- a/components/uni-collapse-item/uni-collapse-item.vue +++ b/components/uni-collapse-item/uni-collapse-item.vue @@ -120,7 +120,6 @@ border-bottom-style: solid; } - .uni-collapse-cell--hover { background-color: #f1f1f1; } @@ -131,18 +130,13 @@ .uni-collapse-cell--disabled { background-color: #f1f1f1; - /* opacity: 0.3; - */ } - .uni-collapse-cell--hide { height: 48px; } .uni-collapse-cell--animation { - /* transition: transform 0.3s ease; - */ transition-property: transform; transition-duration: 0.3s; transition-timing-function: ease; @@ -178,7 +172,6 @@ height: 20px; transform: rotate(0deg); transform-origin: center center; - } .uni-collapse-cell__title-arrow-active { diff --git a/components/uni-combox/uni-combox.vue b/components/uni-combox/uni-combox.vue index 2f808168..0fc4d590 100644 --- a/components/uni-combox/uni-combox.vue +++ b/components/uni-combox/uni-combox.vue @@ -62,7 +62,7 @@ default: '无匹配项' }, value: { - type: String, + type: [String, Number], default: '' } }, @@ -83,7 +83,7 @@ }, filterCandidates() { return this.candidates.filter((item) => { - return item.indexOf(this.inputVal) > -1 + return item.toString().indexOf(this.inputVal) > -1 }) }, filterCandidatesLength() { @@ -132,7 +132,6 @@ height: 40px; flex-direction: row; align-items: center; - /* border-bottom: solid 1px #DDDDDD; */ } .uni-combox__label { diff --git a/components/uni-drawer/uni-drawer.vue b/components/uni-drawer/uni-drawer.vue index feaae3f8..24e18f95 100644 --- a/components/uni-drawer/uni-drawer.vue +++ b/components/uni-drawer/uni-drawer.vue @@ -94,9 +94,6 @@ \ No newline at end of file diff --git a/components/uni-forms/schema-validator.js b/components/uni-forms/schema-validator.js new file mode 100755 index 00000000..3258f90d --- /dev/null +++ b/components/uni-forms/schema-validator.js @@ -0,0 +1,364 @@ + +var pattern = { + email: /^\S+?@\S+?\.\S+?$/, + url: new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", 'i') +}; + +const FORMAT_MAPPING = { + "int": 'number', + "bool": 'boolean', + "double": 'number', + "long": 'number' +} + +function formatMessage(args, resources) { + var defaultMessage = ['label'] + defaultMessage.forEach((item) => { + if (args[item] === undefined) { + args[item] = '' + } + }) + + let str = resources + for (let key in args) { + let reg = new RegExp('{' + key + '}') + str = str.replace(reg, args[key]) + } + return str +} + +function isEmptyValue(value, type) { + if (value === undefined || value === null) { + return true; + } + + if (typeof value === 'string' && !value) { + return true; + } + + if (type === 'array' && Array.isArray(value) && !value.length) { + return true; + } + + return false; +} + +class RuleValidator { + + constructor(message) { + this._message = message + } + + validateRule(key, value, data) { + var result = null + + let rules = key.rules + + let hasRequired = rules.findIndex((item) => { return item.required }) + if (value === undefined && hasRequired < 0) { + return result + } + + var message = this._message + + if (rules === undefined) { + return message['default'] + } + + for (var i = 0; i < rules.length; i++) { + let rule = rules[i] + let vt = this._getValidateType(rule) + + if (key.label !== undefined) { + Object.assign(rule, { label: key.label }) + } + + if (RuleValidatorHelper[vt]) { + var v = RuleValidatorHelper[vt](rule, value, message) + if (v != null) { + result = v + break + } + } + + if (rule.validator) { + var res = rule.validator(rule, value, data) + if (!res) { + result = formatMessage(rule, rule.errorMessage || message[vt] || message['default']) + break + } + } + } + + return result + } + + _getValidateType(rule) { + // TODO + var result = '' + if (rule.required) { + result = 'required' + } else if (rule.enum || rule.maximum || rule.minimum || rule.maxLength || rule.minLength) { + result = 'range' + } else if (rule.format) { + result = 'format' + } else if (rule.pattern) { + result = 'pattern' + } else if (rule.validate) { + result = 'validate' + } + return result + } +} + +const RuleValidatorHelper = { + required(rule, value, message) { + if (rule.required && isEmptyValue(value, rule.format)) { + return formatMessage(rule, rule.errorMessage || message.required); + } + + return null + }, + + range(rule, value, message) { + var type = (rule.maximum || rule.minimum) ? 1 : 0 + var min = type ? rule.minimum : rule.minLength; + var max = type ? rule.maximum : rule.maxLength; + + var key = ['string', 'number'][type]; + var val = type ? value : value.length; + var enumValue = rule.enum; + + if (enumValue) { + if (enumValue.indexOf(value) < 0) { + return formatMessage(rule, message[key].len); + } else { + return null; + } + } else if (min && !max && val < min) { + return formatMessage(rule, rule.errorMessage || message[key].min) + } else if (max && !min && val > max) { + return formatMessage(rule, rule.errorMessage || message[key].max) + } else if (min && max && (val < min || val > max)) { + return formatMessage(rule, rule.errorMessage || message[key].range) + } + + return null + }, + + pattern(rule, value, message) { + if (!types['pattern'](rule.pattern, value)) { + return formatMessage(rule, rule.errorMessage || message.pattern.mismatch); + } + + return null + }, + + format(rule, value, message) { + var customTypes = Object.keys(types); + var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : rule.format; + + if (customTypes.indexOf(format) > -1) { + if (!types[format](value)) { + return formatMessage(rule, rule.errorMessage || message.types[format]); + } + } + + return null + } +} + +const types = { + integer(value) { + return types.number(value) && parseInt(value, 10) === value; + }, + string(value) { + return typeof value === 'string'; + }, + number(value) { + if (isNaN(value)) { + return false; + } + return typeof value === 'number'; + }, + "boolean": function (value) { + return typeof value === 'boolean'; + }, + "float": function (value) { + return types.number(value) && !types.integer(value); + }, + array(value) { + return Array.isArray(value); + }, + object(value) { + return typeof value === 'object' && !types.array(value); + }, + date(value) { + var v + if (value instanceof Date) { + v = value; + } else { + v = new Date(value); + } + return typeof v.getTime === 'function' && typeof v.getMonth === 'function' && typeof v.getYear === 'function' && !isNaN(v.getTime()); + }, + timestamp(value) { + if (!this.integer(value) || Math.abs(value).toString().length > 16) { + return false + } + + return this.date(value); + }, + email(value) { + return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; + }, + url(value) { + return typeof value === 'string' && !!value.match(pattern.url); + }, + pattern(reg, value) { + try { + return new RegExp(reg).test(value); + } catch (e) { + return false; + } + }, + method(value) { + return typeof value === 'function'; + } +} + +class SchemaValidator extends RuleValidator { + + constructor(schema, options) { + super(SchemaValidator.message); + + this._schema = schema + this._options = options || null + } + + updateSchema(schema) { + this._schema = schema + } + + validate(data) { + var checkResult = this._checkField(data) + if (checkResult) { + return checkResult + } + + var result = this.invokeValidate(data, false) + return result.length ? result[0] : null + } + + validateAll(data) { + var checkResult = this._checkField(data) + if (checkResult) { + return checkResult + } + + return this.invokeValidate(data, true) + } + + validateUpdate(data) { + var checkResult = this._checkField(data) + if (checkResult) { + return checkResult + } + + var result = this.invokeValidateUpdate(data, false) + return result.length ? result[0] : null + } + + invokeValidate(data, all) { + let result = [] + let schema = this._schema + for (let key in schema) { + let value = schema[key] + + let vir = this.validateRule(value, data[key], data) + if (vir != null) { + result.push({ + key: key, + errorMessage: vir + }) + + if (!all) break + } + } + + return result + } + + invokeValidateUpdate(data, all) { + let result = [] + + for (let key in data) { + let vir = this.validateRule(this._schema[key], data[key], data) + if (vir != null) { + result.push({ + key: key, + errorMessage: vir + }) + if (!all) break + } + } + + return result + } + + _checkField(data) { + var keys = Object.keys(data) + var keys2 = Object.keys(this._schema) + if (new Set(keys.concat(keys2)).size === keys2.length) { + return '' + } + return [{ key: 'invalid', errorMessage: SchemaValidator.message['defaultInvalid'] }] + } +} + +function Message() { + return { + default: '验证错误', + defaultInvalid: '非法字段', + required: '{label}必填', + 'enum': '{label}不合法', + whitespace: '{label}不能为空', + date: { + format: '{label}日期{value}格式无效', + parse: '{label}日期无法解析,{value}无效', + invalid: '{label}日期{value}无效' + }, + types: { + string: '{label}类型无效', + array: '{label}类型无效', + object: '{label}类型无效', + number: '{label}类型无效', + date: '{label}类型无效', + boolean: '{label}类型无效', + integer: '{label}类型无效', + float: '{label}类型无效', + regexp: '{label}无效', + email: '{label}类型无效', + url: '{label}类型无效' + }, + string: { + len: '{label}必须为{length}个字符', + min: '{label}不能少于 {minLength}个字符', + max: '{label}不能超过 {maxLength}个字符', + range: '{label}必须介于 {minLength}和{maxLength}个字符之间' + }, + number: { + len: '{label}必须等于{length}', + min: '{label}不能小于{minimum}', + max: '{label}不能大于{maximum}', + range: '{label}必须介于{minimum}and{maximum}之间' + }, + pattern: { + mismatch: '{label} 格式不匹配' + } + }; +} + +SchemaValidator.message = new Message(); + +export default SchemaValidator diff --git a/components/uni-forms/uni-forms.vue b/components/uni-forms/uni-forms.vue new file mode 100755 index 00000000..3c32c54d --- /dev/null +++ b/components/uni-forms/uni-forms.vue @@ -0,0 +1,229 @@ + + + + + \ No newline at end of file diff --git a/components/uni-goods-nav/uni-goods-nav.vue b/components/uni-goods-nav/uni-goods-nav.vue index b80c7b8b..cd8d9924 100644 --- a/components/uni-goods-nav/uni-goods-nav.vue +++ b/components/uni-goods-nav/uni-goods-nav.vue @@ -139,8 +139,6 @@ /* #ifndef APP-NVUE */ display: flex; /* #endif */ - /* flex: 1; - */ position: relative; justify-content: center; align-items: center; @@ -193,17 +191,9 @@ top: 2px; justify-content: center; align-items: center; - /* width: 0; - */ - /* height: 0; - */ } .uni-tab__dot { - /* width: 30rpx; - */ - /* height: 30rpx; - */ padding: 0 4px; line-height: 15px; color: #ffffff; @@ -215,8 +205,6 @@ .uni-tab__dots { padding: 0 4px; - /* width: auto; - */ border-radius: 15px; } diff --git a/components/uni-grid-item/uni-grid-item copy.vue b/components/uni-grid-item/uni-grid-item copy.vue index 8395a4cd..739080e1 100644 --- a/components/uni-grid-item/uni-grid-item copy.vue +++ b/components/uni-grid-item/uni-grid-item copy.vue @@ -82,10 +82,6 @@ position: relative; flex: 1; flex-direction: column; - /* justify-content: center; - */ - /* align-items: center; - */ } .uni-grid-item--border { @@ -126,7 +122,6 @@ } /* #endif */ - .uni-grid-item--border-top { position: relative; /* #ifdef APP-NVUE */ diff --git a/components/uni-grid-item/uni-grid-item.vue b/components/uni-grid-item/uni-grid-item.vue index 5a7a7f58..1565e1bb 100644 --- a/components/uni-grid-item/uni-grid-item.vue +++ b/components/uni-grid-item/uni-grid-item.vue @@ -82,10 +82,6 @@ position: relative; flex: 1; flex-direction: column; - /* justify-content: center; - */ - /* align-items: center; - */ } .uni-grid-item--border { @@ -118,7 +114,6 @@ /* #endif */ } - .uni-highlight:active { background-color: #f1f1f1; } diff --git a/components/uni-grid/uni-grid.vue b/components/uni-grid/uni-grid.vue index 4b2c65f5..eecf9f50 100644 --- a/components/uni-grid/uni-grid.vue +++ b/components/uni-grid/uni-grid.vue @@ -121,8 +121,6 @@ /* #ifndef APP-NVUE */ display: flex; /* #endif */ - /* flex: 1; - */ flex-direction: row; flex-wrap: wrap; } diff --git a/components/uni-group/uni-group.vue b/components/uni-group/uni-group.vue new file mode 100644 index 00000000..23c93f00 --- /dev/null +++ b/components/uni-group/uni-group.vue @@ -0,0 +1,74 @@ + + + + \ No newline at end of file diff --git a/components/uni-icons/uni-icons.vue b/components/uni-icons/uni-icons.vue index 23099fef..2c859406 100644 --- a/components/uni-icons/uni-icons.vue +++ b/components/uni-icons/uni-icons.vue @@ -1,5 +1,5 @@ + + \ No newline at end of file diff --git a/components/uni-list-chat/uni-list-chat.scss b/components/uni-list-chat/uni-list-chat.scss new file mode 100644 index 00000000..7e2708f7 --- /dev/null +++ b/components/uni-list-chat/uni-list-chat.scss @@ -0,0 +1,58 @@ +/** + * 这里是 uni-list 组件内置的常用样式变量 + * 如果需要覆盖样式,这里提供了基本的组件样式变量,您可以尝试修改这里的变量,去完成样式替换,而不用去修改源码 + * + */ + +// 背景色 +$background-color : #fff; +// 分割线颜色 +$divide-line-color : #e5e5e5; + +// 默认头像大小,如需要修改此值,注意同步修改 js 中的值 const avatarWidth = xx ,目前只支持方形头像 +// nvue 页面不支持修改头像大小 +$avatar-width : 45px ; + +// 头像边框 +$avatar-border-radius: 5px; +$avatar-border-color: #eee; +$avatar-border-width: 1px; + +// 标题文字样式 +$title-size : 16px; +$title-color : #3b4144; +$title-weight : normal; + +// 描述文字样式 +$note-size : 12px; +$note-color : #999; +$note-weight : normal; + +// 右侧额外内容默认样式 +$right-text-size : 12px; +$right-text-color : #999; +$right-text-weight : normal; + +// 角标样式 +// nvue 页面不支持修改圆点位置以及大小 +// 角标在左侧时,角标的位置,默认为 0 ,负数左/下移动,正数右/上移动 +$badge-left: 0px; +$badge-top: 0px; + +// 显示圆点时,圆点大小 +$dot-width: 10px; +$dot-height: 10px; + +// 显示角标时,角标大小和字体大小 +$badge-size : 18px; +$badge-font : 12px; +// 显示角标时,角标前景色 +$badge-color : #fff; +// 显示角标时,角标背景色 +$badge-background-color : #ff5a5f; +// 显示角标时,角标左右间距 +$badge-space : 6px; + +// 状态样式 +// 选中颜色 +$hover : #f5f5f5; diff --git a/components/uni-list-chat/uni-list-chat.vue b/components/uni-list-chat/uni-list-chat.vue new file mode 100644 index 00000000..9e025022 --- /dev/null +++ b/components/uni-list-chat/uni-list-chat.vue @@ -0,0 +1,482 @@ + + + + + \ No newline at end of file diff --git a/components/uni-list-item/uni-list-item.vue b/components/uni-list-item/uni-list-item.vue index 1b986d84..a49c7c27 100644 --- a/components/uni-list-item/uni-list-item.vue +++ b/components/uni-list-item/uni-list-item.vue @@ -2,27 +2,35 @@ - - - - - - - - - - - {{ title }} - {{ note }} - - - {{rightText}} - - - - - + + + + + + + + + + + + + + + + + {{ title }} + {{ note }} + + + + + {{ rightText }} + + + + + @@ -30,29 +38,41 @@ \ No newline at end of file diff --git a/components/uni-list/uni-list.vue b/components/uni-list/uni-list.vue index f4db8758..5d412dd5 100644 --- a/components/uni-list/uni-list.vue +++ b/components/uni-list/uni-list.vue @@ -1,11 +1,13 @@ - + + diff --git a/windows/uni-sub-menu/uni-sub-menu.vue b/windows/uni-sub-menu/uni-sub-menu.vue new file mode 100644 index 00000000..7d003eb2 --- /dev/null +++ b/windows/uni-sub-menu/uni-sub-menu.vue @@ -0,0 +1,147 @@ + + + + + From 4f5b7fd65c8fdd17e6a295ee05b78033455a8419 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Wed, 28 Oct 2020 14:30:58 +0800 Subject: [PATCH 063/378] =?UTF-8?q?add:=20=E2=80=8Bhello-uniapp=20=20?= =?UTF-8?q?=E9=80=82=E9=85=8D=20PC=20=E4=B8=89=E6=A0=8F=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/uni.css | 10 +- pages.json | 4 +- .../API/websocket-global/websocket-global.vue | 5 - .../websocket-socketTask.vue | 6 +- pages/component/cover-view/cover-view.vue | 3 +- pages/component/web-view/web-view.vue | 6 +- pages/extUI/goods-nav/goods-nav.nvue | 5 +- pages/extUI/grid/grid.nvue | 4 +- pages/extUI/notice-bar/notice-bar.nvue | 14 +- .../segmented-control/segmented-control.nvue | 8 +- pages/tabBar/component/component.nvue | 2 +- .../{templatePage.nvue => template.nvue} | 0 .../nav-search-input/nav-search-input.vue | 3 +- .../nav-transparent/nav-transparent.vue | 3 +- pages/template/tabbar/tabbar.nvue | 7 +- pages/template/ucharts/ucharts.vue | 2421 +++++++++-------- pages/template/vant-button/vant-button.vue | 4 +- windows/left-window.vue | 77 +- windows/uni-sub-menu/uni-sub-menu.vue | 147 - 19 files changed, 1316 insertions(+), 1413 deletions(-) rename pages/tabBar/template/{templatePage.nvue => template.nvue} (100%) delete mode 100644 windows/uni-sub-menu/uni-sub-menu.vue diff --git a/common/uni.css b/common/uni.css index 9784ed4c..d3b94d41 100644 --- a/common/uni.css +++ b/common/uni.css @@ -5,7 +5,13 @@ src: url('~@/static/uni.ttf') format('truetype'); } -/*通用 */ +/*通用 */ +.fix-left-window { + /* #ifdef H5 */ + padding-left: var(--window-left); + /* #endif */ +} + view{ font-size:28rpx; line-height:1.8; @@ -71,7 +77,7 @@ form { overflow-x: hidden; } .uni-padding-wrap{ - width:690rpx; + /* width:690rpx; */ padding:0 30rpx; } .uni-word { diff --git a/pages.json b/pages.json index 852d7961..3484562c 100644 --- a/pages.json +++ b/pages.json @@ -41,7 +41,7 @@ } }, { - "path": "pages/tabBar/template/templatePage", + "path": "pages/tabBar/template/template", "style": { "navigationBarTitleText": "模版", "app-plus": { @@ -1213,7 +1213,7 @@ "selectedIconPath": "static/extuiHL.png", "text": "扩展组件" }, { - "pagePath": "pages/tabBar/template/templatePage", + "pagePath": "pages/tabBar/template/template", "iconPath": "static/template.png", "selectedIconPath": "static/templateHL.png", "text": "模板" diff --git a/pages/API/websocket-global/websocket-global.vue b/pages/API/websocket-global/websocket-global.vue index fbcea692..3d7f1acc 100644 --- a/pages/API/websocket-global/websocket-global.vue +++ b/pages/API/websocket-global/websocket-global.vue @@ -126,11 +126,6 @@ diff --git a/pages/extUI/goods-nav/goods-nav.nvue b/pages/extUI/goods-nav/goods-nav.nvue index f60aae7b..63eca665 100644 --- a/pages/extUI/goods-nav/goods-nav.nvue +++ b/pages/extUI/goods-nav/goods-nav.nvue @@ -177,8 +177,11 @@ display: flex; /* #endif */ flex-direction: column; - position: fixed; + position: fixed; + left: 0; + /* #ifdef H5 */ left: var(--window-left); + /* #endif */ right: 0; bottom: 0; } diff --git a/pages/extUI/grid/grid.nvue b/pages/extUI/grid/grid.nvue index 88a861b9..73d36fd3 100644 --- a/pages/extUI/grid/grid.nvue +++ b/pages/extUI/grid/grid.nvue @@ -241,7 +241,7 @@ background: #ffffff; } - .example-body { + .example-body { /* #ifndef APP-NVUE */ display: flex; /* #endif */ @@ -343,4 +343,4 @@ .swiper { height: 420px; } - \ No newline at end of file + diff --git a/pages/extUI/notice-bar/notice-bar.nvue b/pages/extUI/notice-bar/notice-bar.nvue index e1448c80..f5d05a01 100644 --- a/pages/extUI/notice-bar/notice-bar.nvue +++ b/pages/extUI/notice-bar/notice-bar.nvue @@ -76,8 +76,9 @@ box-sizing: border-box; background-color: #efeff4; min-height: 100%; - height: auto; - } + height: auto; + width: 100%; + } view { font-size: 14px; @@ -85,7 +86,7 @@ } .example { - padding: 0 15px 15px; + /* padding: 0 15px 15px; */ } .example-info { @@ -98,13 +99,14 @@ /* #ifndef APP-NVUE */ display: flex; /* #endif */ - flex-direction: row; + flex-direction: row; flex-wrap: wrap; justify-content: center; padding: 0; font-size: 14px; background-color: #ffffff; - } + } + /* #endif */ .example { @@ -164,4 +166,4 @@ display: block; /* #endif */ } - \ No newline at end of file + diff --git a/pages/extUI/segmented-control/segmented-control.nvue b/pages/extUI/segmented-control/segmented-control.nvue index b32269dd..53d70170 100644 --- a/pages/extUI/segmented-control/segmented-control.nvue +++ b/pages/extUI/segmented-control/segmented-control.nvue @@ -1,9 +1,9 @@ - - diff --git a/windows/top-window.vue b/windows/top-window.vue index ae76c7cf..132968da 100644 --- a/windows/top-window.vue +++ b/windows/top-window.vue @@ -6,9 +6,8 @@ hello uni-app - - {{menu.name}} - + + @@ -17,26 +16,25 @@ export default { data() { return { - menus: [{ - id: 'componentPage', - iconPath: "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/8b4f7fc0-12d1-11eb-8a36-ebb87efcf8c0.png", - name: '内置组件', - component: 'componentPage' - },{ - id: 'API', - iconPath: "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/c15af2c0-12d1-11eb-81ea-f115fe74321c.png", - name: '接口', - component: 'API' - },{ - id: 'extUI', - iconPath: "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/d45d20f0-12d1-11eb-b997-9918a5dda011.png", - name: '扩展组件', - component: 'extUI' - },{ - id: 'template', - iconPath: "https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/e0bd9dc0-12d1-11eb-81ea-f115fe74321c.png", - name: '模板', - component: 'templatePage' + selected: { + component: 0, + API: 1, + extUI: 2, + template: 3 + }, + current: 0, + indexPage: [{ + tabBar: '/pages/tabBar/component/component', + index: '/pages/component/view/view' + }, { + tabBar: '/pages/tabBar/API/API', + index: '/pages/API/set-navigation-bar-title/set-navigation-bar-title' + }, { + tabBar: '/pages/tabBar/extUI/extUI', + index: '/pages/extUI/badge/badge' + }, { + tabBar: '/pages/tabBar/template/template', + index: '/pages/template/nav-button/nav-button' }] } }, @@ -45,24 +43,44 @@ active: state => state.active }) }, + watch: { + $route: { + immediate: true, + handler(newRoute) { + let comp = newRoute.path.split('/')[2] + this.current = this.selected[comp] + + for(const item of this.indexPage) { + if (newRoute.path === item.tabBar) { + uni.redirectTo({ + url: item.index + }) + } + } + } + } + }, + mounted() { + }, methods: { ...mapMutations(['setActive']), - toSecondMenu(component) { - this.setActive(component) - let url = `/pages/component/view/view` - if (component === 'API') { - url = `/pages/API/navigator/navigator` - } - if (component === 'extUI') { - url = `/pages/extUI/badge/badge` + toSecondMenu(e) { + let component = e.pagePath.split('/')[3] + if (component === 'component') { + component = 'componentPage' + } + if (component === 'template') { + component = 'templatePage' } - if (component === 'templatePage') { - url = `/pages/template/nav-button/nav-button` + this.setActive(component) + const activeTabBar = '/' + e.pagePath + for(const item of this.indexPage) { + if (activeTabBar === item.tabBar) { + uni.redirectTo({ + url: item.index + }) + } } - console.log(944) - uni.redirectTo({ - url: url - }) } } } @@ -81,11 +99,6 @@ background-color: #FFFFFF; color: #333; } - // @media screen and (min-width: 1500px) { - // .top-window-header { - // padding: 0 calc(var(--window-left) * 1.6); - // } - // } .logo { display: flex; flex-direction: row; @@ -116,4 +129,12 @@ color: #4cd964; border-bottom: 2px solid; } + .tab-bar-flex { + // flex: 1; + width: 360px; + } + .phone-link { + padding-left: 20px; + cursor: pointer; + } From 64d62b4498f24094ff5ff6c65148e9a766e76698 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Thu, 12 Nov 2020 19:06:02 +0800 Subject: [PATCH 066/378] =?UTF-8?q?test:=20=E8=B7=A8=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/uni-list-item/uni-list-item.vue | 15 +- pages/API/map/map.nvue | 5 +- pages/component/video/video.nvue | 2 + pages/tabBar/API/API.nvue | 1 - pages/tabBar/component/component.nvue | 445 +++++++++++---------- windows/left-window.vue | 9 +- 6 files changed, 250 insertions(+), 227 deletions(-) diff --git a/components/uni-list-item/uni-list-item.vue b/components/uni-list-item/uni-list-item.vue index b0d6112b..d26c8390 100644 --- a/components/uni-list-item/uni-list-item.vue +++ b/components/uni-list-item/uni-list-item.vue @@ -229,7 +229,8 @@ /* #endif */ font-size: 16px; position: relative; - justify-content: space-between; + justify-content: space-between; + align-items: center; background-color: #fff; flex-direction: row; } @@ -354,12 +355,16 @@ } .flex--direction { - flex-direction: column; + flex-direction: column; + /* #ifndef APP-NVUE */ align-items: initial; + /* #endif */ } - .flex--justify { - justify-content: initial; + .flex--justify { + /* #ifndef APP-NVUE */ + justify-content: initial; + /* #endif */ } .uni-list--lg { @@ -405,4 +410,4 @@ lines: 2; /* #endif */ } - \ No newline at end of file + diff --git a/pages/API/map/map.nvue b/pages/API/map/map.nvue index f4687e97..07299b75 100644 --- a/pages/API/map/map.nvue +++ b/pages/API/map/map.nvue @@ -403,15 +403,18 @@ .map { width: 750rpx; + /* #ifdef H5 */ width: 100%; + /* #endif */ height: 250px; background-color: #f0f0f0; } .scrollview { + /* #ifdef H5 */ margin-top: 240px; + /* #endif */ flex: 1; - /* padding: 10px; */ padding: 10px; } diff --git a/pages/component/video/video.nvue b/pages/component/video/video.nvue index 3510f060..587caa8c 100644 --- a/pages/component/video/video.nvue +++ b/pages/component/video/video.nvue @@ -88,7 +88,9 @@ diff --git a/windows/left-window.vue b/windows/left-window.vue index ebf38a7b..4ebb06d5 100644 --- a/windows/left-window.vue +++ b/windows/left-window.vue @@ -1,7 +1,7 @@ @@ -76,12 +76,7 @@ } }, methods: { - ...mapMutations(['setMatchLeftWindow', 'setLeftWinActive', 'setActiveOpen', 'setActive']), - changeLeftWin(panel, e, data) { - this.setActiveOpen(panel) - this.setLeftWinActive(e) - this.menu = data - } + ...mapMutations(['setMatchLeftWindow', 'setActive']), } } From 0bab6f5eca75a79eb3e5bdffae992702b5e143db Mon Sep 17 00:00:00 2001 From: handongxun Date: Fri, 13 Nov 2020 11:07:18 +0800 Subject: [PATCH 067/378] =?UTF-8?q?update:=20=E5=85=A8=E5=B1=8F=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E4=BB=85app=E5=B9=B3=E5=8F=B0=E5=8F=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/tabBar/API/API.nvue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pages/tabBar/API/API.nvue b/pages/tabBar/API/API.nvue index 8bf3b9b5..69658a51 100644 --- a/pages/tabBar/API/API.nvue +++ b/pages/tabBar/API/API.nvue @@ -313,6 +313,8 @@ name: '激励视频广告', open: false }, + // #endif + // #ifdef APP-PLUS { url: 'full-screen-video-ad', name: '全屏视频广告', From c78837c0f65995863f7ec45aa86a490a4552aebf Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Fri, 13 Nov 2020 14:03:22 +0800 Subject: [PATCH 068/378] fixed: style bug of ad on app --- pages/tabBar/component/component.nvue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/tabBar/component/component.nvue b/pages/tabBar/component/component.nvue index 5e5e590e..20652343 100644 --- a/pages/tabBar/component/component.nvue +++ b/pages/tabBar/component/component.nvue @@ -126,7 +126,8 @@ }, // #endif // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW - { + { + id: 'ad', url: 'ad', name: 'AD组件', open: false From 910af89989ea6abc8dadec580f5e160744495f4e Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Fri, 13 Nov 2020 20:00:53 +0800 Subject: [PATCH 069/378] update --- pages.json | 13 ++++++------- windows/left-window.vue | 40 +++++++++++++++++++++------------------- windows/top-window.vue | 19 ++++++++----------- 3 files changed, 35 insertions(+), 37 deletions(-) diff --git a/pages.json b/pages.json index 803dc961..9b3698d7 100644 --- a/pages.json +++ b/pages.json @@ -1196,21 +1196,20 @@ "globalStyle": { "pageOrientation": "portrait", "navigationBarTitleText": "Hello uniapp", - // #ifndef H5 "navigationBarTextStyle": "white", "navigationBarBackgroundColor": "#007AFF", - // #endif - // #ifdef H5 - "navigationBarTextStyle": "black", - "navigationBarBackgroundColor": "#F1F1F1", - // #endif "backgroundColor": "#F8F8F8", "backgroundColorTop": "#F4F5F6", "backgroundColorBottom": "#F4F5F6", "mp-360": { "navigationStyle": "custom" }, - "maxWidth": 1190 + "h5": { + "maxWidth": 1190, + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#F1F1F1" + } + }, "tabBar": { "color": "#7A7E83", diff --git a/windows/left-window.vue b/windows/left-window.vue index 4ebb06d5..33e627e0 100644 --- a/windows/left-window.vue +++ b/windows/left-window.vue @@ -51,26 +51,28 @@ }, $route: { immediate: true, - handler(newRoute) { - if (newRoute.path === '/') { - uni.redirectTo({ - url: 'pages/component/view/view' - }) - } else if (!newRoute.matched.length) { - uni.redirectTo({ - url: 'pages/error/404' - }) - } else { - let active = newRoute.path.split('/')[2] - if (this.nav.includes(active)) { - if (active === 'component') { - active = 'componentPage' + handler(newRoute) { + if (this.matchLeftWindow) { + if (newRoute.path === '/') { + uni.redirectTo({ + url: 'pages/component/view/view' + }) + } else if (!newRoute.matched.length) { + uni.redirectTo({ + url: 'pages/error/404' + }) + } else { + let active = newRoute.path.split('/')[2] + if (this.nav.includes(active)) { + if (active === 'component') { + active = 'componentPage' + } + if (active === 'template') { + active = 'templatePage' + } + this.setActive(active) } - if (active === 'template') { - active = 'templatePage' - } - this.setActive(active) - } + } } } } diff --git a/windows/top-window.vue b/windows/top-window.vue index 132968da..5c39c5e7 100644 --- a/windows/top-window.vue +++ b/windows/top-window.vue @@ -86,7 +86,7 @@ } - \ No newline at end of file diff --git a/components/uni-dateformat/date-format.js b/components/uni-dateformat/date-format.js new file mode 100644 index 00000000..4aa7e760 --- /dev/null +++ b/components/uni-dateformat/date-format.js @@ -0,0 +1,178 @@ +// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型 +function pad(str, length = 2) { + str += '' + while (str.length < length) { + str = '0' + str + } + return str.slice(-length) +} + +const parser = { + yyyy: (dateObj) => { + return pad(dateObj.year, 4) + }, + yy: (dateObj) => { + return pad(dateObj.year) + }, + MM: (dateObj) => { + return pad(dateObj.month) + }, + M: (dateObj) => { + return dateObj.month + }, + dd: (dateObj) => { + return pad(dateObj.day) + }, + d: (dateObj) => { + return dateObj.day + }, + hh: (dateObj) => { + return pad(dateObj.hour) + }, + h: (dateObj) => { + return dateObj.hour + }, + mm: (dateObj) => { + return pad(dateObj.minute) + }, + m: (dateObj) => { + return dateObj.minute + }, + ss: (dateObj) => { + return pad(dateObj.second) + }, + s: (dateObj) => { + return dateObj.second + }, + SSS: (dateObj) => { + return pad(dateObj.millisecond, 3) + }, + S: (dateObj) => { + return dateObj.millisecond + }, +} + +export function formatDate(date, format = 'yyyy/MM/dd hh:mm:ss') { + if (!date && date !== 0) { + return '-' + } + date = date instanceof Date ? date : new Date(date) + const dateObj = { + year: date.getFullYear(), + month: date.getMonth() + 1, + day: date.getDate(), + hour: date.getHours(), + minute: date.getMinutes(), + second: date.getSeconds(), + millisecond: date.getMilliseconds() + } + const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/ + let flag = true + let result = format + while (flag) { + flag = false + result = result.replace(tokenRegExp, function(matched) { + flag = true + return parser[matched](dateObj) + }) + } + return result +} + +export function friendlyDate(time, { + locale = 'zh', + threshold = [60000, 3600000], + format = 'yyyy/MM/dd hh:mm:ss' +}) { + if (!time && time !== 0) { + return '-' + } + const localeText = { + zh: { + year: '年', + month: '月', + day: '天', + hour: '小时', + minute: '分钟', + second: '秒', + ago: '前', + later: '后', + justNow: '刚刚', + soon: '马上', + template: '{num}{unit}{suffix}' + }, + en: { + year: 'year', + month: 'month', + day: 'day', + hour: 'hour', + minute: 'minute', + second: 'second', + ago: 'ago', + later: 'later', + justNow: 'just now', + soon: 'soon', + template: '{num} {unit} {suffix}' + } + } + const text = localeText[locale] || localeText.zh + let date = new Date(time) + let ms = date.getTime() - Date.now() + let absMs = Math.abs(ms) + if (absMs < threshold[0]) { + return ms < 0 ? text.justNow : text.soon + } + if (absMs >= threshold[1]) { + return formatDate(date, format) + } + let num + let unit + let suffix = text.later + if (ms < 0) { + suffix = text.ago + ms = -ms + } + const seconds = Math.floor((ms) / 1000) + const minutes = Math.floor(seconds / 60) + const hours = Math.floor(minutes / 60) + const days = Math.floor(hours / 24) + const months = Math.floor(days / 30) + const years = Math.floor(months / 12) + switch (true) { + case years > 0: + num = years + unit = text.year + break + case months > 0: + num = months + unit = text.month + break + case days > 0: + num = days + unit = text.day + break + case hours > 0: + num = hours + unit = text.hour + break + case minutes > 0: + num = minutes + unit = text.minute + break + default: + num = seconds + unit = text.second + break + } + + if (locale === 'en') { + if (num === 1) { + num = 'a' + } else { + unit += 's' + } + } + + return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(/{\s*suffix\s*}/g, + suffix) +} diff --git a/components/uni-dateformat/uni-dateformat.vue b/components/uni-dateformat/uni-dateformat.vue new file mode 100644 index 00000000..bb23fc0e --- /dev/null +++ b/components/uni-dateformat/uni-dateformat.vue @@ -0,0 +1,88 @@ + + + + + \ No newline at end of file diff --git a/components/uni-easyinput/uni-easyinput.vue b/components/uni-easyinput/uni-easyinput.vue new file mode 100644 index 00000000..6bda0050 --- /dev/null +++ b/components/uni-easyinput/uni-easyinput.vue @@ -0,0 +1,344 @@ + + + + + \ No newline at end of file diff --git a/components/uni-field/uni-field.vue b/components/uni-field/uni-field.vue new file mode 100644 index 00000000..21cb5481 --- /dev/null +++ b/components/uni-field/uni-field.vue @@ -0,0 +1,652 @@ + @@ -53,6 +53,12 @@ * @event {Function} confirm 点击完成按钮时触发 * @example */ + + import { + debounce, + throttle + } from './common.js' + export default { name: 'uni-easyinput', props: { @@ -68,11 +74,14 @@ }, autoHeight: { type: Boolean, - default: true + default: false }, placeholder: String, placeholderStyle: String, - focus: Boolean, + focus: { + type: Boolean, + default: false + }, disabled: { type: Boolean, default: false @@ -136,6 +145,11 @@ if (this.formItem) { this.formItem.setValue(newVal) } + }, + focus(newVal) { + this.$nextTick(() => { + this.focused = this.focus + }) } }, created() { @@ -148,6 +162,13 @@ this.form.inputChildrens.push(this) } } + + }, + mounted() { + // this.onInput = throttle(this.input, 500) + this.$nextTick(() => { + this.focused = this.focus + }) }, methods: { /** @@ -272,8 +293,8 @@ font-size: 14px; padding-top: 6px; padding-bottom: 10px; - box-sizing: border-box; min-height: 80px; + height: 80px; } .input-padding { diff --git a/components/uni-field/uni-field.vue b/components/uni-field/uni-field.vue index 21cb5481..b20f8cb9 100644 --- a/components/uni-field/uni-field.vue +++ b/components/uni-field/uni-field.vue @@ -18,635 +18,649 @@ + + + + \ No newline at end of file diff --git a/components/uni-fav/uni-fav.vue b/components/uni-fav/uni-fav.vue index 89cb3a1f..bac3d957 100644 --- a/components/uni-fav/uni-fav.vue +++ b/components/uni-fav/uni-fav.vue @@ -13,8 +13,6 @@ + + \ No newline at end of file diff --git a/components/uni-file-picker/upload-file.vue b/components/uni-file-picker/upload-file.vue new file mode 100644 index 00000000..d9430c18 --- /dev/null +++ b/components/uni-file-picker/upload-file.vue @@ -0,0 +1,308 @@ + + + + + \ No newline at end of file diff --git a/components/uni-file-picker/upload-image.vue b/components/uni-file-picker/upload-image.vue new file mode 100644 index 00000000..4bb1c1ff --- /dev/null +++ b/components/uni-file-picker/upload-image.vue @@ -0,0 +1,287 @@ + + + + + \ No newline at end of file diff --git a/components/uni-forms-item/uni-forms-item.vue b/components/uni-forms-item/uni-forms-item.vue index 3847cae1..acaac80e 100755 --- a/components/uni-forms-item/uni-forms-item.vue +++ b/components/uni-forms-item/uni-forms-item.vue @@ -1,20 +1,22 @@ @@ -145,10 +147,10 @@ created() { this.form = this.getForm() this.group = this.getForm('uniGroup') - this.formRules = [] + this.formRules = [] this.formTrigger = this.validateTrigger if (this.form) { - this.form.childrens.push(this) + this.form.childrens.push(this) } this.init() }, @@ -156,7 +158,7 @@ if (this.form) { this.form.childrens.forEach((item, index) => { if (item === this) { - this.form.childrens.splice(index, 1) + this.form.childrens.splice(index, 1) delete this.form.formData[item.name] } }) @@ -174,17 +176,17 @@ labelWidth, labelAlign, errShowType - } = this.form - + } = this.form + this.labelPos = this.labelPosition ? this.labelPosition : labelPosition - this.labelWid = this.label ? (this.labelWidth ? this.labelWidth : labelWidth) : 0 - this.labelAli = this.labelAlign ? this.labelAlign : labelAlign + this.labelWid = this.label ? (this.labelWidth ? this.labelWidth : labelWidth):0 + this.labelAli = this.labelAlign ? this.labelAlign : labelAlign // 判断第一个 item if (!this.form.isFirstBorder) { this.form.isFirstBorder = true this.isFirstBorder = true - } + } // 判断 group 里的第一个 item if (this.group) { @@ -201,7 +203,7 @@ this.formRules = formRules[this.name] || {} } - this.validator = validator + this.validator = validator } else { this.labelPos = this.labelPosition || 'left' this.labelWid = this.labelWidth || 65 @@ -220,23 +222,23 @@ parentName = parent.$options.name; } return parent; - }, + }, /** * 移除该表单项的校验结果 */ clearValidate() { this.errMsg = '' - }, - - setValue(value) { - if (this.name) { - if (this.errMsg) this.errMsg = '' - this.form.formData[this.name] = this.form._getValue(this.name, value) - if (!this.formRules || (typeof(this.formRules) && JSON.stringify(this.formRules) === '{}')) return - this.triggerCheck(this.form._getValue(this.name, value)) - } - }, + }, + + setValue(value){ + if (this.name) { + if(this.errMsg) this.errMsg = '' + this.form.formData[this.name] = this.form._getValue(this.name, value) + if(!this.formRules || (typeof(this.formRules) && JSON.stringify(this.formRules) === '{}')) return + this.triggerCheck(this.form._getValue(this.name, value)) + } + }, /** * 校验规则 @@ -252,7 +254,7 @@ // !valid ? resolve(valid) : reject(valid) // }; // }); - // } + // } // if (!this.validator) { // typeof callback === 'function' && callback(null); // if (promise) return promise @@ -261,19 +263,19 @@ const isNoField = this.isRequired(this.formRules.rules || []) let isTrigger = this.isTrigger(this.formRules.validateTrigger, this.validateTrigger, this.form.validateTrigger) let result = null - if (!(!isTrigger)) { + if (!(!isTrigger)) { result = await this.validator.validateUpdate({ [this.name]: value - }, this.form.formData) + }, this.form.formData) } - // 判断是否必填 - if (!isNoField && !value) { + // 判断是否必填,非必填,不填不校验,填写才校验 + if (!isNoField && (value === undefined || value === '')) { result = null } - if (isTrigger && result && result.errorMessage) { - const inputComp = this.form.inputChildrens.find(child => child.rename === this.name) - if (inputComp) { - inputComp.errMsg = result.errorMessage + if (isTrigger && result && result.errorMessage) { + const inputComp = this.form.inputChildrens.find(child => child.rename === this.name) + if (inputComp) { + inputComp.errMsg = result.errorMessage } if (this.form.errShowType === 'toast') { uni.showToast({ @@ -289,7 +291,7 @@ } } - this.errMsg = !result ? '' : result.errorMessage + this.errMsg = !result ? '' : result.errorMessage // 触发validate事件 this.form.validateCheck(result ? result : null) // typeof callback === 'function' && callback(result ? result : null); @@ -333,94 +335,119 @@ }; - \ No newline at end of file + diff --git a/components/uni-forms/uni-forms.vue b/components/uni-forms/uni-forms.vue index c4e2babf..9da0ad8c 100755 --- a/components/uni-forms/uni-forms.vue +++ b/components/uni-forms/uni-forms.vue @@ -249,7 +249,11 @@ } } // 如果存在 required 才会将内容插入校验对象 - if (!isNoField && (!tempInvalidFields[item] && tempInvalidFields[item] !== false)) { + if (!isNoField && + ((tempInvalidFields[item] === undefined || + tempInvalidFields[item] === '') && + tempInvalidFields[item] !== false + )) { delete tempInvalidFields[item] } }) @@ -257,7 +261,8 @@ // 循环字段是否存在于校验规则中 for (let i in this.formRules) { for (let j in tempInvalidFields) { - if (i === j) { + const index = this.childrens.findIndex(v => v.name === j) + if (i === j && index !== -1) { fieldsValue[i] = tempInvalidFields[i] } } @@ -341,6 +346,14 @@ */ submit(callback) { // Object.assign(this.formData,formData) + for (let i in this.value) { + const itemData = this.childrens.find(v => v.name === i) + if (itemData) { + if (this.formData[i] === undefined) { + this.formData[i] = this._getValue(i, this.value[i]) + } + } + } return this.validateAll(this.formData, 'submit', callback) }, @@ -430,8 +443,4 @@ } - \ No newline at end of file + \ No newline at end of file diff --git a/components/uni-forms/validate.js b/components/uni-forms/validate.js index 1a4f8463..e4aad950 100755 --- a/components/uni-forms/validate.js +++ b/components/uni-forms/validate.js @@ -1,18 +1,20 @@ var pattern = { email: /^\S+?@\S+?\.\S+?$/, + idcard: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, url: new RegExp("^(?!mailto:)(?:(?:http|https|ftp)://|//)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-*)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$", 'i') }; const FORMAT_MAPPING = { - "int": 'number', + "int": 'integer', "bool": 'boolean', "double": 'number', "long": 'number', "password": 'string' + // "fileurls": 'array' } -function formatMessage(args, resources) { +function formatMessage(args, resources = '') { var defaultMessage = ['label'] defaultMessage.forEach((item) => { if (args[item] === undefined) { @@ -74,20 +76,16 @@ const types = { return typeof value === 'object' && !types.array(value); }, date(value) { - var v - if (value instanceof Date) { - v = value; - } else { - v = new Date(value); - } - return typeof v.getTime === 'function' && typeof v.getMonth === 'function' && typeof v.getYear === 'function' && !isNaN(v.getTime()); + return value instanceof Date; }, timestamp(value) { if (!this.integer(value) || Math.abs(value).toString().length > 16) { return false } - - return this.date(value); + return true; + }, + file(value) { + return typeof value.url === 'string'; }, email(value) { return typeof value === 'string' && !!value.match(pattern.email) && value.length < 255; @@ -104,6 +102,18 @@ const types = { }, method(value) { return typeof value === 'function'; + }, + idcard(value) { + return typeof value === 'string' && !!value.match(pattern.idcard); + }, + 'url-https'(value) { + return this.url(value) && value.startsWith('https://'); + }, + 'url-scheme'(value) { + return value.startsWith('://'); + }, + 'url-web'(value) { + return false; } } @@ -113,10 +123,10 @@ class RuleValidator { this._message = message } - async validateRule(key, value, data, allData) { + async validateRule(fieldKey, fieldValue, value, data, allData) { var result = null - let rules = key.rules + let rules = fieldValue.rules let hasRequired = rules.findIndex((item) => { return item.required @@ -140,11 +150,9 @@ class RuleValidator { let rule = rules[i] let vt = this._getValidateType(rule) - if (key.label !== undefined) { - Object.assign(rule, { - label: key.label - }) - } + Object.assign(rule, { + label: fieldValue.label || `["${fieldKey}"]` + }) if (RuleValidatorHelper[vt]) { result = RuleValidatorHelper[vt](rule, value, message) @@ -170,6 +178,10 @@ class RuleValidator { } } + if (result !== null) { + result = message.TAG + result + } + return result } @@ -200,6 +212,8 @@ class RuleValidator { result = 'required' } else if (rule.format) { result = 'format' + } else if (rule.arrayType) { + result = 'arrayTypeFormat' } else if (rule.range) { result = 'range' } else if (rule.maximum || rule.minimum) { @@ -208,6 +222,8 @@ class RuleValidator { result = 'rangeLength' } else if (rule.pattern) { result = 'pattern' + } else if (rule.validateFunction) { + result = 'validateFunction' } return result } @@ -261,9 +277,9 @@ const RuleValidatorHelper = { let max = exclusiveMaximum ? value >= maximum : value > maximum; if (minimum !== undefined && min) { - return formatMessage(rule, rule.errorMessage || message['number'].min) + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMinimum ? 'exclusiveMinimum' : 'minimum']) } else if (maximum !== undefined && max) { - return formatMessage(rule, rule.errorMessage || message['number'].max) + return formatMessage(rule, rule.errorMessage || message['number'][exclusiveMaximum ? 'exclusiveMaximum' : 'maximum']) } else if (minimum !== undefined && maximum !== undefined && (min || max)) { return formatMessage(rule, rule.errorMessage || message['number'].range) } @@ -281,9 +297,9 @@ const RuleValidatorHelper = { let val = value.length; if (min !== undefined && val < min) { - return formatMessage(rule, rule.errorMessage || message['length'].min) + return formatMessage(rule, rule.errorMessage || message['length'].minLength) } else if (max !== undefined && val > max) { - return formatMessage(rule, rule.errorMessage || message['length'].max) + return formatMessage(rule, rule.errorMessage || message['length'].maxLength) } else if (min !== undefined && max !== undefined && (val < min || val > max)) { return formatMessage(rule, rule.errorMessage || message['length'].range) } @@ -301,11 +317,27 @@ const RuleValidatorHelper = { format(rule, value, message) { var customTypes = Object.keys(types); - var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : rule.format; + var format = FORMAT_MAPPING[rule.format] ? FORMAT_MAPPING[rule.format] : (rule.format || rule.arrayType); if (customTypes.indexOf(format) > -1) { if (!types[format](value)) { - return formatMessage(rule, rule.errorMessage || message.types[format]); + return formatMessage(rule, rule.errorMessage || message.typeError); + } + } + + return null + }, + + arrayTypeFormat(rule, value, message) { + if (!Array.isArray(value)) { + return formatMessage(rule, rule.errorMessage || message.typeError); + } + + for (let i = 0; i < value.length; i++) { + const element = value[i]; + let formatResult = this.format(rule, element, message) + if (formatResult !== null) { + return formatResult } } @@ -355,7 +387,7 @@ class SchemaValidator extends RuleValidator { let schema = this._schema for (let key in schema) { let value = schema[key] - let errorMessage = await this.validateRule(value, data[key], data, allData) + let errorMessage = await this.validateRule(key, value, data[key], data, allData) if (errorMessage != null) { result.push({ key, @@ -370,7 +402,7 @@ class SchemaValidator extends RuleValidator { async invokeValidateUpdate(data, all, allData) { let result = [] for (let key in data) { - let errorMessage = await this.validateRule(this._schema[key], data[key], data, allData) + let errorMessage = await this.validateRule(key, this._schema[key], data[key], data, allData) if (errorMessage != null) { result.push({ key, @@ -388,46 +420,44 @@ class SchemaValidator extends RuleValidator { if (new Set(keys.concat(keys2)).size === keys2.length) { return '' } + + var noExistFields = keys.filter((key) => { return keys2.indexOf(key) < 0; }) + var errorMessage = formatMessage({ + field: JSON.stringify(noExistFields) + }, SchemaValidator.message.TAG + SchemaValidator.message['defaultInvalid']) return [{ key: 'invalid', - errorMessage: SchemaValidator.message['defaultInvalid'] + errorMessage }] } } function Message() { return { + TAG: "", default: '验证错误', - defaultInvalid: '字段超出范围', + defaultInvalid: '提交的字段{field}在数据库中并不存在', + validateFunction: '验证无效', required: '{label}必填', 'enum': '{label}超出范围', + timestamp: '{label}格式无效', whitespace: '{label}不能为空', + typeError: '{label}类型无效', date: { format: '{label}日期{value}格式无效', parse: '{label}日期无法解析,{value}无效', invalid: '{label}日期{value}无效' }, - types: { - string: '{label}类型无效', - array: '{label}类型无效', - object: '{label}类型无效', - number: '{label}类型无效', - date: '{label}类型无效', - boolean: '{label}类型无效', - integer: '{label}类型无效', - float: '{label}类型无效', - regexp: '{label}无效', - email: '{label}类型无效', - url: '{label}类型无效' - }, length: { - min: '{label}长度不能少于{minLength}', - max: '{label}长度不能超过{maxLength}', + minLength: '{label}长度不能少于{minLength}', + maxLength: '{label}长度不能超过{maxLength}', range: '{label}必须介于{minLength}和{maxLength}之间' }, number: { - min: '{label}不能小于{minimum}', - max: '{label}不能大于{maximum}', + minimum: '{label}不能小于{minimum}', + maximum: '{label}不能大于{maximum}', + exclusiveMinimum: '{label}不能小于等于{minimum}', + exclusiveMaximum: '{label}不能大于等于{maximum}', range: '{label}必须介于{minimum}and{maximum}之间' }, pattern: { diff --git a/components/uni-goods-nav/uni-goods-nav.vue b/components/uni-goods-nav/uni-goods-nav.vue index 4acd51c2..8dcc8050 100644 --- a/components/uni-goods-nav/uni-goods-nav.vue +++ b/components/uni-goods-nav/uni-goods-nav.vue @@ -25,7 +25,6 @@ - \ No newline at end of file + diff --git a/components/uni-group/uni-group.vue b/components/uni-group/uni-group.vue index 183b0c87..65c7639c 100755 --- a/components/uni-group/uni-group.vue +++ b/components/uni-group/uni-group.vue @@ -81,14 +81,11 @@ margin-top: 10px; } - .group-margin { - margin: 0 -15px; - } - .uni-group__title { /* #ifndef APP-NVUE */ display: flex; /* #endif */ + flex-direction: row; align-items: center; padding-left: 15px; height: 40px; @@ -99,7 +96,6 @@ .uni-group__content { padding: 15px; - background-color: #FFF; } .group-conent-padding { diff --git a/components/uni-indexed-list/uni-indexed-list-item.vue b/components/uni-indexed-list/uni-indexed-list-item.vue index cbc0db18..6117ac78 100644 --- a/components/uni-indexed-list/uni-indexed-list-item.vue +++ b/components/uni-indexed-list/uni-indexed-list-item.vue @@ -19,12 +19,8 @@ - \ No newline at end of file + diff --git a/components/uni-list-chat/uni-list-chat.vue b/components/uni-list-chat/uni-list-chat.vue index fa17b128..8e8b1e67 100644 --- a/components/uni-list-chat/uni-list-chat.vue +++ b/components/uni-list-chat/uni-list-chat.vue @@ -11,8 +11,10 @@ - - + + @@ -214,24 +216,54 @@ }; - \ No newline at end of file + diff --git a/components/uni-list-item/uni-list-item.vue b/components/uni-list-item/uni-list-item.vue index 3e5738f5..50c0dc06 100644 --- a/components/uni-list-item/uni-list-item.vue +++ b/components/uni-list-item/uni-list-item.vue @@ -3,17 +3,18 @@ - + - - - - - - + + @@ -38,397 +39,400 @@ - diff --git a/components/uni-load-more/uni-load-more.vue b/components/uni-load-more/uni-load-more.vue index 0935f8ca..1e52fab2 100644 --- a/components/uni-load-more/uni-load-more.vue +++ b/components/uni-load-more/uni-load-more.vue @@ -25,7 +25,10 @@ + + \ No newline at end of file diff --git a/components/uni-notice-bar/uni-notice-bar.vue b/components/uni-notice-bar/uni-notice-bar.vue index b76c8427..11d845ad 100644 --- a/components/uni-notice-bar/uni-notice-bar.vue +++ b/components/uni-notice-bar/uni-notice-bar.vue @@ -25,7 +25,6 @@ - diff --git a/components/uni-popup-message/uni-popup-message.vue b/components/uni-popup-message/uni-popup-message.vue index 9e968de0..a37ee303 100644 --- a/components/uni-popup-message/uni-popup-message.vue +++ b/components/uni-popup-message/uni-popup-message.vue @@ -66,35 +66,35 @@ } } - \ No newline at end of file + diff --git a/components/uni-popup-share/uni-popup-share.vue b/components/uni-popup-share/uni-popup-share.vue index 7eb4eb3b..e13d7fb5 100644 --- a/components/uni-popup-share/uni-popup-share.vue +++ b/components/uni-popup-share/uni-popup-share.vue @@ -83,86 +83,83 @@ } } - \ No newline at end of file + diff --git a/components/uni-popup/popup.js b/components/uni-popup/popup.js index 813ec275..beca4278 100644 --- a/components/uni-popup/popup.js +++ b/components/uni-popup/popup.js @@ -40,11 +40,13 @@ export default { this.popupHeight = windowHeight + windowTop } fixSize() - // #ifdef H5 - window.addEventListener('resize', fixSize) - this.$once('hook:beforeDestroy', () => { - window.removeEventListener('resize', fixSize) - }) + // #ifdef H5 + if (window) { + window.addEventListener('resize', fixSize) + this.$once('hook:beforeDestroy', () => { + window.removeEventListener('resize', fixSize) + }) + } // #endif }, } diff --git a/components/uni-popup/uni-popup.vue b/components/uni-popup/uni-popup.vue index 06923b95..d539312f 100644 --- a/components/uni-popup/uni-popup.vue +++ b/components/uni-popup/uni-popup.vue @@ -13,7 +13,6 @@ - - + + + + + \ No newline at end of file diff --git a/components/uni-search-bar/uni-search-bar.vue b/components/uni-search-bar/uni-search-bar.vue index 7e2b8278..7fa8deac 100644 --- a/components/uni-search-bar/uni-search-bar.vue +++ b/components/uni-search-bar/uni-search-bar.vue @@ -6,11 +6,11 @@ - + {{ placeholder }} - + @@ -19,8 +19,6 @@ + - \ No newline at end of file + diff --git a/components/uni-swiper-dot/uni-swiper-dot.vue b/components/uni-swiper-dot/uni-swiper-dot.vue index a27dd0e3..95e05bf9 100644 --- a/components/uni-swiper-dot/uni-swiper-dot.vue +++ b/components/uni-swiper-dot/uni-swiper-dot.vue @@ -144,9 +144,11 @@ border-radius: 100px; margin-left: 6px; background-color: rgba(0, 0, 0, 0.4); - /* #ifdef H5 */ + /* #ifndef APP-NVUE */ cursor: pointer; /* #endif */ + /* #ifdef H5 */ + /* #endif */ } .uni-swiper__dots-item:first-child { diff --git a/components/uni-table/uni-table.vue b/components/uni-table/uni-table.vue index 4f305ffa..9e1b4fe4 100644 --- a/components/uni-table/uni-table.vue +++ b/components/uni-table/uni-table.vue @@ -1,14 +1,27 @@ @@ -19,7 +32,7 @@ * @tutorial https://ext.dcloud.net.cn/plugin?id= * @property {Boolean} border 是否带有纵向边框 * @property {Boolean} stripe 是否显示斑马线 - * @property {Boolean} type 是否开启多选 + * @property {Boolean} type 是否开启多选 * @property {String} emptyText 空数据时显示的文本内容 * @property {Boolean} loading 显示加载中 * @event {Function} selection-change 开启多选时,当选择项发生变化时会触发该事件 @@ -30,6 +43,12 @@ virtualHost: true }, props: { + data: { + type: Array, + default () { + return [] + } + }, // 是否有竖线 border: { type: Boolean, @@ -54,83 +73,231 @@ type: Boolean, default: false }, + rowKey: { + type: String, + default: '' + } }, data() { return { noData: true, - minWidth: 0 - }; + minWidth: 0, + multiTableHeads: [] + } }, watch: { - loading(val) { - console.log(val); + loading(val) {}, + data(newVal) { + let theadChildren = this.theadChildren + let rowspan = 1 + if (this.theadChildren) { + rowspan = this.theadChildren.rowspan + } + + // this.trChildren.length - rowspan + this.noData = false + // this.noData = newVal.length === 0 } }, created() { // 定义tr的实例数组 this.trChildren = [] + this.thChildren = [] + this.theadChildren = null this.backData = [] + this.backIndexData = [] }, + methods: { isNodata() { - if (this.trChildren.length > 1) { - this.noData = false - } else { - this.noData = true + let theadChildren = this.theadChildren + let rowspan = 1 + if (this.theadChildren) { + rowspan = this.theadChildren.rowspan } + this.noData = this.trChildren.length - rowspan <= 0 }, /** - * 清除选中 + * 选中所有 */ - clearSelection() { + selectionAll() { + let startIndex = 1 + let theadChildren = this.theadChildren + if (!this.theadChildren) { + theadChildren = this.trChildren[0] + } else { + startIndex = theadChildren.rowspan - 1 + } + let isHaveData = this.data && this.data.length.length > 0 + theadChildren.checked = true + theadChildren.indeterminate = false this.trChildren.forEach((item, index) => { - item.value = false + if (!item.disabled) { + item.checked = true + if (isHaveData && item.keyValue) { + const row = this.data.find(v => v[this.rowKey] === item.keyValue) + if (!this.backData.find(v => v[this.rowKey] === row[this.rowKey])) { + this.backData.push(row) + } + } + if (index > (startIndex - 1) && this.backIndexData.indexOf(index - startIndex) === -1) { + this.backIndexData.push(index - startIndex) + } + } }) + // this.backData = JSON.parse(JSON.stringify(this.data)) this.$emit('selection-change', { detail: { - index: [], - value: [] + value: this.backData, + index: this.backIndexData } }) }, - check(child, check) { - const childDom = this.trChildren.find((item, index) => child === item) - const childDomIndex = this.trChildren.findIndex((item, index) => child === item) - if (childDomIndex === 0) { - if (childDom.value !== check) { - this.backData = [] - this.trChildren.map((item, index) => item.value = check) - } - this.trChildren.forEach((item, index) => { - if (index > 0 && item.value) { - this.backData.push(index - 1) + /** + * 用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中) + */ + toggleRowSelection(row, selected) { + // if (!this.theadChildren) return + row = [].concat(row) + + this.trChildren.forEach((item, index) => { + // if (item.keyValue) { + + const select = row.findIndex(v => { + // + if (typeof v === 'number') { + return v === index - 1 + } else { + return v[this.rowKey] === item.keyValue } }) - - } else { - if (!check) { - this.trChildren[0].value = false - } - childDom.value = check - if (check) { - this.backData.push(childDomIndex - 1) - } else { - const index = this.backData.findIndex(item => item === (childDomIndex - 1)) - this.backData.splice(index, 1) + let ischeck = item.checked + if (select !== -1) { + if (typeof selected === 'boolean') { + item.checked = selected + } else { + item.checked = !item.checked + } + if (ischeck !== item.checked) { + this.check(item.rowData || item, item.checked, item.rowData ? item.keyValue : null, true) + } } - const domCheckAll = this.trChildren.find((item, index) => index > 0 && !item.value) - if (!domCheckAll) { - this.trChildren[0].value = true + // } + }) + this.$emit('selection-change', { + detail: { + value: this.backData, + index: this.backIndexData } - } + }) + }, + /** + * 用于多选表格,清空用户的选择 + */ + clearSelection() { + let theadChildren = this.theadChildren + if (!this.theadChildren) { + theadChildren = this.trChildren[0] + } + // if (!this.theadChildren) return + theadChildren.checked = false + theadChildren.indeterminate = false + this.trChildren.forEach(item => { + // if (item.keyValue) { + item.checked = false + // } + }) + this.backData = [] + this.backIndexData = [] this.$emit('selection-change', { detail: { - index: this.backData.sort(), - value: [] + value: [], + index: [] } }) + }, + /** + * 用于多选表格,切换所有行的选中状态 + */ + toggleAllSelection() { + let list = [] + let startIndex = 1 + let theadChildren = this.theadChildren + if (!this.theadChildren) { + theadChildren = this.trChildren[0] + } else { + startIndex = theadChildren.rowspan - 1 + } + this.trChildren.forEach((item, index) => { + if (!item.disabled) { + if (index > (startIndex - 1)) { + list.push(index - startIndex) + } + } + }) + this.toggleRowSelection(list) + }, + + /** + * 选中\取消选中 + * @param {Object} child + * @param {Object} check + * @param {Object} rowValue + */ + check(child, check, keyValue, emit) { + let theadChildren = this.theadChildren + if (!this.theadChildren) { + theadChildren = this.trChildren[0] + } + + + + let childDomIndex = this.trChildren.findIndex((item, index) => child === item) + if (childDomIndex < 0) { + childDomIndex = this.data.findIndex(v => v[this.rowKey] === keyValue) + 1 + } + const dataLen = this.trChildren.filter(v => !v.disabled && v.keyValue).length + if (childDomIndex === 0) { + check ? this.selectionAll() : this.clearSelection() + return + } + + if (check) { + if (keyValue) { + this.backData.push(child) + } + this.backIndexData.push(childDomIndex - 1) + } else { + const index = this.backData.findIndex(v => v[this.rowKey] === keyValue) + const idx = this.backIndexData.findIndex(item => item === childDomIndex - 1) + if (keyValue) { + this.backData.splice(index, 1) + } + this.backIndexData.splice(idx, 1) + } + + const domCheckAll = this.trChildren.find((item, index) => index > 0 && !item.checked && !item.disabled) + if (!domCheckAll) { + theadChildren.indeterminate = false + theadChildren.checked = true + } else { + theadChildren.indeterminate = true + theadChildren.checked = false + } + + if (this.backIndexData.length === 0) { + theadChildren.indeterminate = false + } + if (!emit) { + this.$emit('selection-change', { + detail: { + value: this.backData, + index: this.backIndexData + } + }) + } } } } @@ -141,30 +308,45 @@ .uni-table-scroll { width: 100%; + /* #ifndef APP-NVUE */ overflow-x: auto; + /* #endif */ } .uni-table { position: relative; width: 100%; - display: table; - box-sizing: border-box; border-radius: 5px; - box-shadow: 0px 0px 3px 1px rgba(0, 0, 0, 0.1); - overflow-x: auto; background-color: #fff; + /* #ifndef APP-NVUE */ + box-sizing: border-box; + display: table; + overflow-x: auto; + /* #endif */ } .uni-table ::v-deep .uni-table-tr:nth-child(n+2):hover { background-color: #f5f7fa; } + .uni-table ::v-deep .uni-table-thead .uni-table-tr:hover { + background-color: #fafafa; + } + .table--border { - border: 1px #ddd solid; + border: 1px #ebeef5 solid; + border-right: none; } .border-none { + /* #ifndef APP-NVUE */ border-bottom: none; + /* #endif */ + } + + .table--stripe { + /* #ifndef APP-NVUE */ + /* #endif */ } .table--stripe ::v-deep .uni-table-tr:nth-child(2n+3) { @@ -174,9 +356,17 @@ /* 表格加载、无数据样式 */ .uni-table-loading { position: relative; + /* #ifndef APP-NVUE */ display: table-row; + /* #endif */ height: 50px; line-height: 50px; + overflow: hidden; + box-sizing: border-box; + } + + .empty-border { + border-right: 1px #ebeef5 solid; } .uni-table-text { @@ -194,13 +384,15 @@ bottom: 0; left: 0; right: 0; - margin: auto; background-color: rgba(255, 255, 255, 0.8); z-index: 99; + /* #ifndef APP-NVUE */ display: flex; + margin: auto; + transition: all 0.5s; + /* #endif */ justify-content: center; align-items: center; - transition: all 0.5s; } .uni-table--loader { @@ -208,7 +400,9 @@ height: 30px; border: 2px solid #aaa; border-radius: 50%; + /* #ifndef APP-NVUE */ animation: 2s uni-table--loader linear infinite; + /* #endif */ position: relative; } diff --git a/components/uni-tbody/uni-tbody.vue b/components/uni-tbody/uni-tbody.vue new file mode 100644 index 00000000..1d808b3b --- /dev/null +++ b/components/uni-tbody/uni-tbody.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/components/uni-td/uni-td.vue b/components/uni-td/uni-td.vue index c6067604..83fbace2 100644 --- a/components/uni-td/uni-td.vue +++ b/components/uni-td/uni-td.vue @@ -1,71 +1,90 @@ - - - - \ No newline at end of file + colspan: { + type: [Number,String], + default: 1 + } + }, + data() { + return { + border: false + }; + }, + created() { + this.root = this.getTable() + this.border = this.root.border + }, + methods: { + /** + * 获取父元素实例 + */ + getTable() { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== 'uniTable') { + parent = parent.$parent; + if (!parent) return false; + parentName = parent.$options.name; + } + return parent; + }, + } + } + + + diff --git a/components/uni-th/uni-th.vue b/components/uni-th/uni-th.vue index 189dbe82..2cddf652 100644 --- a/components/uni-th/uni-th.vue +++ b/components/uni-th/uni-th.vue @@ -1,77 +1,219 @@ - \ No newline at end of file +} + diff --git a/components/uni-thead/uni-thead.vue b/components/uni-thead/uni-thead.vue new file mode 100644 index 00000000..a12078aa --- /dev/null +++ b/components/uni-thead/uni-thead.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/components/uni-title/uni-title.vue b/components/uni-title/uni-title.vue index f1f356cd..bab884db 100644 --- a/components/uni-title/uni-title.vue +++ b/components/uni-title/uni-title.vue @@ -117,7 +117,7 @@ diff --git a/components/uni-tr/uni-tr.vue b/components/uni-tr/uni-tr.vue index d4069613..d5635d5a 100644 --- a/components/uni-tr/uni-tr.vue +++ b/components/uni-tr/uni-tr.vue @@ -1,107 +1,162 @@ - \ No newline at end of file +} + +/* #endif */ + diff --git a/components/uni-transition/createAnimation.js b/components/uni-transition/createAnimation.js new file mode 100644 index 00000000..3c5f05e4 --- /dev/null +++ b/components/uni-transition/createAnimation.js @@ -0,0 +1,126 @@ +// 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 + 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/components/uni-transition/uni-transition.vue b/components/uni-transition/uni-transition.vue index 0e26cfcd..3c510596 100644 --- a/components/uni-transition/uni-transition.vue +++ b/components/uni-transition/uni-transition.vue @@ -1,19 +1,20 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/pages.json b/pages.json index 23fa202d..f2be6070 100644 --- a/pages.json +++ b/pages.json @@ -722,12 +722,6 @@ "navigationBarTitleText": "Form 表单" } }, - { - "path": "field/field", - "style": { - "navigationBarTitleText": "Field 字段" - } - }, { "path": "group/group", "style": { @@ -969,10 +963,6 @@ "path": "list/chat", "style": {} }, - { - "path": "test/test", - "style": {} - }, { "path": "table/table", "style": { @@ -1002,16 +992,16 @@ } }, { - "path": "data-indexed-list/data-indexed-list", + "path": "data-picker/data-picker", "style": { - "navigationBarTitleText": "", + "navigationBarTitleText": "级联选择", "enablePullDownRefresh": false } }, { - "path": "data-picker/data-picker", + "path": "date-picker/date-picker", "style": { - "navigationBarTitleText": "级联选择", + "navigationBarTitleText": "日期选择", "enablePullDownRefresh": false } }, @@ -1028,6 +1018,13 @@ "navigationBarTitleText": "layout 布局", "enablePullDownRefresh": false } + }, + { + "path": "file-picker/file-picker", + "style": { + "navigationBarTitleText": "", + "enablePullDownRefresh": false + } } ] }, diff --git a/pages/extUI/data-checkbox/data-checkbox.vue b/pages/extUI/data-checkbox/data-checkbox.nvue similarity index 100% rename from pages/extUI/data-checkbox/data-checkbox.vue rename to pages/extUI/data-checkbox/data-checkbox.nvue diff --git a/pages/extUI/data-indexed-list/data-indexed-list.nvue b/pages/extUI/data-indexed-list/data-indexed-list.nvue deleted file mode 100644 index ae9adf9e..00000000 --- a/pages/extUI/data-indexed-list/data-indexed-list.nvue +++ /dev/null @@ -1,18 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/extUI/data-picker/data-picker.vue b/pages/extUI/data-picker/data-picker.nvue similarity index 77% rename from pages/extUI/data-picker/data-picker.vue rename to pages/extUI/data-picker/data-picker.nvue index fe5229c1..28681137 100644 --- a/pages/extUI/data-picker/data-picker.vue +++ b/pages/extUI/data-picker/data-picker.nvue @@ -18,7 +18,7 @@ uni-data-picker 本地数据 - + @@ -44,11 +44,21 @@ }, { text: "二年级", - value: "2-0" + value: "2-0", + children: [{ + text: "2.1班", + value: "2-1" + }, + { + text: "2.2班", + value: "2-2" + } + ] }, { text: "三年级", - value: "3-0" + value: "3-0", + disable: true } ] } @@ -57,6 +67,12 @@ onnodeclick(e) { console.log(e); }, + onpopupopened(e) { + console.log('popupopened'); + }, + onpopupclosed(e) { + console.log('popupclosed'); + }, onchange(e) {} } } @@ -65,10 +81,12 @@ \ No newline at end of file diff --git a/pages/extUI/datetime-picker/datetime-picker.vue b/pages/extUI/datetime-picker/datetime-picker.vue index 7b67ca20..b23b8de6 100644 --- a/pages/extUI/datetime-picker/datetime-picker.vue +++ b/pages/extUI/datetime-picker/datetime-picker.vue @@ -9,6 +9,14 @@ + + + + + + + + @@ -23,7 +31,11 @@ - + + + + + @@ -38,9 +50,11 @@ return { datetime: '2021/02/013 09:30:00', vModelDatetime: '', + noSecond: '2014-06-10 04:28:30', disDatetime: '2021-02-013 00:00:00', date: '2000-6-15', - time: '', + time: '17:30:30', + timeNoSecond: '17:30', timestamp: 1610364547000, timeArea: '' } diff --git a/pages/extUI/easyinput/easyinput.vue b/pages/extUI/easyinput/easyinput.nvue similarity index 90% rename from pages/extUI/easyinput/easyinput.vue rename to pages/extUI/easyinput/easyinput.nvue index 5b357fc5..f8eb1842 100644 --- a/pages/extUI/easyinput/easyinput.vue +++ b/pages/extUI/easyinput/easyinput.nvue @@ -8,14 +8,13 @@ - 输入内容:"{{ value }}" - + 输入内容:{{ '"'+value+'"' }} + - - + diff --git a/pages/extUI/field/field.vue b/pages/extUI/field/field.nvue similarity index 100% rename from pages/extUI/field/field.vue rename to pages/extUI/field/field.nvue diff --git a/pages/extUI/file-picker/file-picker.vue b/pages/extUI/file-picker/file-picker.vue new file mode 100644 index 00000000..630f81c5 --- /dev/null +++ b/pages/extUI/file-picker/file-picker.vue @@ -0,0 +1,187 @@ + + + + + \ No newline at end of file diff --git a/pages/extUI/forms/forms.vue b/pages/extUI/forms/forms.nvue similarity index 92% rename from pages/extUI/forms/forms.vue rename to pages/extUI/forms/forms.nvue index e69f1291..d9806847 100644 --- a/pages/extUI/forms/forms.vue +++ b/pages/extUI/forms/forms.nvue @@ -14,16 +14,19 @@ - - - + + + + + + + + - - - - - - - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/pages/extUI/table/tableData.js b/pages/extUI/table/tableData.js new file mode 100644 index 00000000..9a57d0cd --- /dev/null +++ b/pages/extUI/table/tableData.js @@ -0,0 +1,193 @@ +export default [{ + "date": "2020-09-01", + "name": "Dcloud1", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-02", + "name": "Dcloud2", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-03", + "name": "Dcloud3", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-04", + "name": "Dcloud4", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-05", + "name": "Dcloud5", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-06", + "name": "Dcloud6", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-07", + "name": "Dcloud7", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-08", + "name": "Dcloud8", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-09", + "name": "Dcloud9", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-10", + "name": "Dcloud10", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-11", + "name": "Dcloud11", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-12", + "name": "Dcloud12", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-13", + "name": "Dcloud13", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-14", + "name": "Dcloud14", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-15", + "name": "Dcloud15", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-16", + "name": "Dcloud16", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-01", + "name": "Dcloud17", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-02", + "name": "Dcloud18", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-03", + "name": "Dcloud19", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-04", + "name": "Dcloud20", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-05", + "name": "Dcloud21", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-06", + "name": "Dcloud22", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-07", + "name": "Dcloud23", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-08", + "name": "Dcloud24", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-09", + "name": "Dcloud25", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-10", + "name": "Dcloud26", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-11", + "name": "Dcloud27", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-12", + "name": "Dcloud28", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-13", + "name": "Dcloud29", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-14", + "name": "Dcloud30", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-15", + "name": "Dcloud31", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-16", + "name": "Dcloud32", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-01", + "name": "Dcloud33", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-02", + "name": "Dcloud34", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-03", + "name": "Dcloud35", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-04", + "name": "Dcloud36", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-05", + "name": "Dcloud37", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-06", + "name": "Dcloud38", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-07", + "name": "Dcloud39", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-08", + "name": "Dcloud40", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-09", + "name": "Dcloud41", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-10", + "name": "Dcloud42", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-11", + "name": "Dcloud43", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-12", + "name": "Dcloud44", + "address": "上海市普陀区金沙江路 1516 弄" +}, { + "date": "2020-09-13", + "name": "Dcloud45", + "address": "上海市普陀区金沙江路 1518 弄" +}, { + "date": "2020-09-14", + "name": "Dcloud46", + "address": "上海市普陀区金沙江路 1517 弄" +}, { + "date": "2020-09-15", + "name": "Dcloud47", + "address": "上海市普陀区金沙江路 1519 弄" +}, { + "date": "2020-09-16", + "name": "Dcloud48", + "address": "上海市普陀区金沙江路 1516 弄" +}] diff --git a/pages/extUI/test/test.nvue b/pages/extUI/test/test.nvue deleted file mode 100644 index 870f2c0c..00000000 --- a/pages/extUI/test/test.nvue +++ /dev/null @@ -1,24 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/extUI/transition/transition.nvue b/pages/extUI/transition/transition.nvue index c298d501..ad2e6971 100644 --- a/pages/extUI/transition/transition.nvue +++ b/pages/extUI/transition/transition.nvue @@ -1,29 +1,18 @@ @@ -32,45 +21,87 @@ components: {}, data() { return { - show: false, - transShow: false, - modeClass: ['fade'], - maskClass: { - 'position': 'fixed', - 'bottom': 0, - 'top': 0, - 'left': 0, - 'right': 0, - 'background-color': 'rgba(0, 0, 0, 0.4)' - }, - transfromClass: { - 'position': 'fixed', - 'bottom': 0, - 'top': 0, - 'left': 0, - 'right': 0, - /* #ifndef APP-NVUE */ - 'display': 'flex', - /* #endif */ - 'justify-content': 'center', - 'align-items': 'center' - } + show: true, + modeClass: 'fade', + styles: {} + } + }, + onLoad() { + // #ifdef APP-NVUE + this.styles = { + justifyContent: 'center', + alignItems: 'center', + width: '100px', + height: '100px', + borderRadius: '5px', + textAlign: 'center', + backgroundColor: '#4cd964', + boxShadow: '0 0 5px 1px rgba(0,0,0,0.2)' } + // #endif }, - onLoad() {}, methods: { - mask() { - this.show = true - }, - open(mode) { - this.modeClass = mode - this.transShow = !this.transShow + handle(type) { + this.show = !this.show + this.modeClass = type }, - onTap() { - this.transShow = this.show = false - }, - change(e) { - console.log(e.detail); + custom() { + // TODO 下面修改宽高在百度下还有些问题待修复 + // this.$refs.ani.step({ + // width: '200px' + // }) + // this.$refs.ani.step({ + // height: '150px' + // },{ + // delay:100, + // duration:200 + // }) + this.$refs.ani.step({ + width: '100px', + height: '100px', + rotate: '180' + }, { + delay: 200, + duration: 300 + }) + this.$refs.ani.step({ + width: '100px', + height: '100px', + rotate: '0' + }, { + transformOrigin: '50% 50%' + }) + + this.$refs.ani.step({ + translateX: '-100px' + }, { + timingFunction: 'ease-in', + duration: 100 + }) + + this.$refs.ani.step({ + translateX: '100px' + }, { + timingFunction: 'ease', + duration: 300 + }) + + this.$refs.ani.step({ + translateX: '50px', + scale: 1.5 + }, { + timingFunction: 'linear', + duration: 100 + }) + this.$refs.ani.step({ + translateX: '0px', + scale: 1 + }, { + timingFunction: 'linear', + duration: 150 + }) + + this.$refs.ani.run() } } } @@ -176,30 +207,45 @@ background-color: #4ca2ff; } - .example-body { - padding: 15px 20px; + .example { /* #ifndef APP-NVUE */ display: flex; /* #endif */ - flex-direction: row; - flex-wrap: wrap; - justify-content: flex-start; + justify-content: center; + align-items: center; + height: 150px; + background-color: #fff; + } + + .example-body { + padding: 10px 20px; + padding-bottom: 0px; } .transition-button { /* #ifndef APP-NVUE */ - /* width: 100%; */ + width: 100%; /* #endif */ - padding: 0 15px; - margin: 10px 5px; + flex: 1; + margin-bottom: 10px; } - .box { - color: #fff; + /* #ifndef APP-NVUE */ + .example ::v-deep .transition { + display: flex; + justify-content: center; + align-items: center; width: 100px; height: 100px; - line-height: 100px; + border-radius: 5px; text-align: center; - background-color: #4CD964; + background-color: #4cd964; + box-shadow: 0 0 5px 1px rgba(0, 0, 0, 0.2); + } + + /* #endif */ + .text { + font-size: 14px; + color: #fff; } \ No newline at end of file diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index ad461917..58ca6401 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -26,158 +26,199 @@ hideList: [ 'load-more' ], - lists: [{ - name: "Badge 数字角标", + lists: [ + { + name: "badge 数字角标", url: "badge" }, { - name: "Card 卡片", + name: "calendar 日历", + url: "calendar" + }, + { + name: "card 卡片", url: "card" }, { - name: "Collapse 折叠面板", + name: "collapse 折叠面板", url: "collapse" }, + + // #ifndef APP-NVUE { - name: "Combox 组合框", + name: "combox 组合框", url: "combox" }, + // #endif { - name: "Countdown 倒计时", + name: "countdown 倒计时", url: "countdown" }, { - name: "DataCheckbox 数据选择器", + name: "dataCheckbox 数据选择器", url: "data-checkbox" }, { - name: "DataPicker 数据驱动的picker选择器", + name: "dataPicker 数据驱动的picker选择器", url: "data-picker" }, + + // #ifndef APP-NVUE { - name: "Dateformat 日期格式化", + name: "datePicker 日期选择器", + url: "date-picker" + }, + // #endif + { + name: "dateformat 日期格式化", url: "dateformat" }, + + // #ifndef APP-NVUE { - name: "DatetimePicker 日期选择器", + name: "datetimePicker 日期选择器", url: "datetime-picker" }, + // #endif { - name: "Drawer 抽屉", + name: "drawer 抽屉", url: "drawer" }, { - name: "Easyinput 增强输入框", + name: "easyinput 增强输入框", url: "easyinput" }, { - name: "Fab 悬浮按钮", + name: "fab 悬浮按钮", url: "fab" }, { - name: "Fav 收藏按钮", + name: "fav 收藏按钮", url: "fav" }, + + // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ { - name: "Forms 表单", + name: "field 输入框", + url: "field" + }, + // #endif + + // #ifndef APP-NVUE + { + name: "filePicker 文件选择上传", + url: "file-picker" + }, + // #endif + { + name: "forms 表单", url: "forms" }, { - name: "GoodsNav 商品导航", + name: "goodsNav 商品导航", url: "goods-nav" }, { - name: "Grid 宫格", + name: "grid 宫格", url: "grid" }, { - name: "Group 分组", + name: "group 分组", url: "group" }, { - name: "Icons 图标", + name: "icons 图标", url: "icons" }, { - name: "IndexedList 索引列表", + name: "indexedList 索引列表", url: "indexed-list" }, + { - name: "Link 超链接", + name: "link 超链接", url: "link" }, { - name: "List 列表", + name: "list 列表", url: "list" }, { - name: "LoadMore 加载更多", + name: "loadMore 加载更多", url: "load-more" }, { - name: "NavBar 自定义导航栏", + name: "navBar 自定义导航栏", url: "nav-bar" }, - // #ifndef QUICKAPP-WEBVIEW { - name: "NoticeBar 通告栏", + name: "noticeBar 通告栏", url: "notice-bar" }, - // #endif { - name: "NumberBox 数字输入框", + name: "numberBox 数字输入框", url: "number-box" }, { - name: "Pagination 分页器", + name: "pagination 分页器", url: "pagination" }, - // #ifndef QUICKAPP-WEBVIEW-HUAWEI { - name: "PopUp 弹出层", + name: "popUp 弹出层", url: "popup" }, - // #endif { - name: "Rate 评分", + name: "rate 评分", url: "rate" }, { - name: "Row 布局-行", + name: "row 布局-行", url: "row" }, { - name: "SearchBar 搜索栏", + name: "searchBar 搜索栏", url: "search-bar" }, + + // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ + { + name: "section 标题栏", + url: "section" + }, + // #endif { - name: "SegmentedControl 分段器", + name: "segmentedControl 分段器", url: "segmented-control" }, { - name: "Steps 步骤条", + name: "steps 步骤条", url: "steps" }, { - name: "SwipeAction 滑动操作", + name: "swipeAction 滑动操作", url: "swipe-action" }, { - name: "SwiperDot 轮播图指示点", + name: "swiperDot 轮播图指示点", url: "swiper-dot" }, - // #ifdef H5 + + // #ifndef APP-NVUE || MP-TOUTIAO { - name: "Table 表格", + name: "table 表格", url: "table" }, - // #endif + // #endif { - name: "Tag 标签", + name: "tag 标签", url: "tag" }, { - name: "Transition 过渡动画", + name: "title 章节标题", + url: "title" + }, + { + name: "transition 过渡动画", url: "transition" }, ] @@ -245,4 +286,4 @@ \ No newline at end of file + diff --git a/project.swan.json b/project.swan.json new file mode 100644 index 00000000..edb01a12 --- /dev/null +++ b/project.swan.json @@ -0,0 +1,12 @@ +{ + "host": "baiduboxapp", + "setting": { + "urlCheck": true + }, + "swan": { + "baiduboxapp": { + "swanJsVersion": "3.290.28", + "extensionJsVersion": "1.21.2" + } + } +} \ No newline at end of file From 4470aeff12c4c9ef3d80fa42d74c69e6f41a8c53 Mon Sep 17 00:00:00 2001 From: mehaotian <490272692@qq.com> Date: Wed, 28 Apr 2021 10:58:38 +0800 Subject: [PATCH 118/378] =?UTF-8?q?update:=20=E4=BF=AE=E6=94=B9=20nuve=20?= =?UTF-8?q?=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/uni-nav-bar/uni-nav-bar.vue | 2 + components/uni-pagination/uni-pagination.vue | 51 ++++++++++---------- manifest.json | 1 + pages/tabBar/extUI/extUI.nvue | 34 ++++++------- 4 files changed, 45 insertions(+), 43 deletions(-) diff --git a/components/uni-nav-bar/uni-nav-bar.vue b/components/uni-nav-bar/uni-nav-bar.vue index c6d3835b..4357eb04 100644 --- a/components/uni-nav-bar/uni-nav-bar.vue +++ b/components/uni-nav-bar/uni-nav-bar.vue @@ -219,8 +219,10 @@ .uni-navbar--fixed { position: fixed; z-index: 998; + /* #ifndef APP-NVUE */ left: var(--window-left); right: var(--window-right); + /* #endif */ } .uni-navbar--shadow { diff --git a/components/uni-pagination/uni-pagination.vue b/components/uni-pagination/uni-pagination.vue index 60db61ff..0eb215ca 100644 --- a/components/uni-pagination/uni-pagination.vue +++ b/components/uni-pagination/uni-pagination.vue @@ -1,28 +1,31 @@ diff --git a/pages/template/nav-image/nav-image.vue b/pages/template/nav-image/nav-image.vue index 9323b2e4..2d31e660 100644 --- a/pages/template/nav-image/nav-image.vue +++ b/pages/template/nav-image/nav-image.vue @@ -5,22 +5,18 @@ 说明 : - 在App端可在pages.json里通过 style -> titleImage 配置,支付宝小程序只支持https地址的图片,暂不支持动态改变;常用于App首页顶部导航显示产品Logo。 + 在App端可在pages.json里通过 style -> titleImage 配置,支付宝小程序只支持https地址的图片,暂不支持动态改变;常用于App首页顶部导航显示产品Logo。 在支付宝小程序里请使用真机调试查看效果。 diff --git a/platforms/app-plus/feedback/feedback.vue b/platforms/app-plus/feedback/feedback.vue index c96450e8..03731665 100644 --- a/platforms/app-plus/feedback/feedback.vue +++ b/platforms/app-plus/feedback/feedback.vue @@ -37,9 +37,7 @@ \ No newline at end of file + diff --git a/pages/template/global/global.vue b/pages/template/global/global.vue index db85a2b4..481efaa9 100644 --- a/pages/template/global/global.vue +++ b/pages/template/global/global.vue @@ -35,7 +35,7 @@ ...mapMutations(['setTestTrue']), ...mapMutations(['setTestFalse']), setGD:function () { - getApp().globalData.test="123" + this.gd.test="123" }, setVUEX:function (isTrue) { // console.log("this.testvuex: " + this.testvuex); diff --git a/project.swan.json b/project.swan.json deleted file mode 100644 index edb01a12..00000000 --- a/project.swan.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "host": "baiduboxapp", - "setting": { - "urlCheck": true - }, - "swan": { - "baiduboxapp": { - "swanJsVersion": "3.290.28", - "extensionJsVersion": "1.21.2" - } - } -} \ No newline at end of file From 72d305db71a34cc71e7ecbf388d4c2c1a39bec65 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Tue, 26 Oct 2021 16:48:45 +0800 Subject: [PATCH 199/378] publish: 3.2.7 --- changelog.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index ede65bb0..9f3cf7ca 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,8 @@ +## 3.2.7(2021-10-26) +- 修复 uni-popup 示例的 button 文字在 iPhone 5 上换行的 bug +- 修复 uni-table 示例,页面顶部距离不对的 bug +- 修复 GlobalData示例,在vue3是无效的 bug +- 优化 删除无用的 project.swan.json 文件 ## 3.2.6(2021-10-08) - 由于体验问题,暂时撤销 uni-ui 以 uni_modules 方式引入的修改 ## 3.2.5(2021-09-29) diff --git a/package.json b/package.json index 087b6f5e..d113f8eb 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.2.6", + "version": "3.2.7", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From 68353f38ffff869d1133475d0718d1b371d2bae8 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Mon, 1 Nov 2021 18:14:42 +0800 Subject: [PATCH 200/378] platform: fix to lark --- pages/component/video/video.vue | 2 +- pages/tabBar/API/API.nvue | 8 +++++-- pages/tabBar/component/component.nvue | 34 +++++++++++++-------------- pages/tabBar/extUI/extUI.nvue | 11 ++++++--- 4 files changed, 32 insertions(+), 23 deletions(-) diff --git a/pages/component/video/video.vue b/pages/component/video/video.vue index 800a4966..64a78a7a 100644 --- a/pages/component/video/video.vue +++ b/pages/component/video/video.vue @@ -6,7 +6,7 @@ - + diff --git a/pages/tabBar/API/API.nvue b/pages/tabBar/API/API.nvue index 2b148424..bb33ebc2 100644 --- a/pages/tabBar/API/API.nvue +++ b/pages/tabBar/API/API.nvue @@ -47,10 +47,12 @@ name: '图片', url: 'image' }, + // #ifndef MP-LARK { name: '音频', url: 'inner-audio' }, + // #endif // #ifdef APP-PLUS || MP-WEIXIN || MP-BAIDU || MP-QQ { name: '录音', @@ -119,10 +121,12 @@ url: 'canvas' }, // #endif + // #ifndef MP-LARK { name: '节点信息', url: 'get-node-info' }, + // #endif { name: '节点布局交互状态', url: 'intersection-observer' @@ -283,7 +287,7 @@ url: 'choose-location' } // #endif - // #ifndef MP-QQ || MP-TOUTIAO + // #ifndef MP-QQ || MP-TOUTIAO || MP-LARK , { name: '地图控制', @@ -330,7 +334,7 @@ open: false }, // #endif - // #ifndef H5 || QUICKAPP-WEBVIEW || MP-KUAISHOU + // #ifndef H5 || QUICKAPP-WEBVIEW || MP-KUAISHOU || MP-LARK { id: 'login', name: '登录', diff --git a/pages/tabBar/component/component.nvue b/pages/tabBar/component/component.nvue index 2852e770..234fb971 100644 --- a/pages/tabBar/component/component.nvue +++ b/pages/tabBar/component/component.nvue @@ -32,14 +32,14 @@ 'src': "url('/static/uni.ttf')" }); // #endif - export default { - props: { - hasLeftWin: { - type: Boolean - }, - leftWinActive: { - type: String - } + export default { + props: { + hasLeftWin: { + type: Boolean + }, + leftWinActive: { + type: String + } }, data() { return { @@ -51,7 +51,7 @@ 'view', 'scroll-view', 'swiper' - // #ifndef MP-TOUTIAO + // #ifndef MP-TOUTIAO || MP-LARK , 'movable-view', 'cover-view' @@ -118,7 +118,7 @@ }] }, // #endif - // #ifndef APP-PLUS || H5 + // #ifndef APP-PLUS || H5 || MP-LARK { id: 'web-view', name: '网页', @@ -126,12 +126,12 @@ pages: ['web-view'] }, // #endif - // #ifdef APP-VUE || APP-NVUE - { + // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW + { id: 'ad', url: 'ad', name: 'AD组件', - open: false + open: false }, // #endif ] @@ -163,7 +163,7 @@ } } } - } + } } } } @@ -174,14 +174,14 @@ if (!this.list[e].pages) { this.goDetailPage('', this.list[e].url); return; - } + } for (var i = 0; i < this.list.length; ++i) { if (e === i) { this.list[i].open = !this.list[i].open; } else { this.list[i].open = false; } - } + } }, goDetailPage(panel, e) { if (typeof e === 'string') { @@ -213,4 +213,4 @@ + diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index 7046d174..791f51f8 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -30,10 +30,13 @@ hideList: [ 'load-more' ], - lists: [{ + lists: [ + // #ifndef MP-LARK + { name: "uni-badge 数字角标", url: "badge" }, + // #endif { name: "uni-calendar 日历", url: "calendar" @@ -47,7 +50,7 @@ url: "collapse" }, - // #ifndef APP-NVUE + // #ifndef APP-NVUE || MP-LARK { name: "uni-combox 组合框", url: "combox" @@ -179,16 +182,18 @@ name: "uni-steps 步骤条", url: "steps" }, + // #ifndef MP-LARK { name: "uni-swipe-action 滑动操作", url: "swipe-action" }, + // #endif { name: "uni-swiper-dot 轮播图指示点", url: "swiper-dot" }, - // #ifndef APP-NVUE || MP-TOUTIAO + // #ifndef APP-NVUE || MP-TOUTIAO || MP-LARK { name: "uni-table 表格", url: "table" From 8effeb4dd2796f30c415ebeb1d55d0482f7ed747 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Tue, 2 Nov 2021 16:11:31 +0800 Subject: [PATCH 201/378] hide ad in lark platform --- pages/tabBar/component/component.nvue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/tabBar/component/component.nvue b/pages/tabBar/component/component.nvue index 234fb971..87390be5 100644 --- a/pages/tabBar/component/component.nvue +++ b/pages/tabBar/component/component.nvue @@ -126,7 +126,7 @@ pages: ['web-view'] }, // #endif - // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW + // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW || MP-LARK { id: 'ad', url: 'ad', From f92d044bcd5b5c11a8b4758f3555ee10e56e03ef Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Wed, 10 Nov 2021 14:33:45 +0800 Subject: [PATCH 202/378] update: fix lark --- pages/extUI/steps/steps.vue | 2 +- pages/tabBar/extUI/extUI.nvue | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pages/extUI/steps/steps.vue b/pages/extUI/steps/steps.vue index 6069d78a..bca378e8 100644 --- a/pages/extUI/steps/steps.vue +++ b/pages/extUI/steps/steps.vue @@ -19,7 +19,7 @@ return { active: 1, list1: [{ - title: '事件一事件一事件一事件一事件一事件一' + title: '事件一' }, { title: '事件二' }, { diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index 791f51f8..4489f6a5 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -71,11 +71,13 @@ { name: "uni-dateformat 日期格式化", url: "dateformat" - }, + }, + // #ifndef MP-LARK { name: "uni-datetime-picker 日期选择器", url: "datetime-picker" - }, + }, + // #endif { name: "uni-drawer 抽屉", url: "drawer" @@ -193,7 +195,7 @@ url: "swiper-dot" }, - // #ifndef APP-NVUE || MP-TOUTIAO || MP-LARK + // #ifndef APP-NVUE || MP-TOUTIAO || MP-LARK || MP-QQ { name: "uni-table 表格", url: "table" From 609bab5971a7c0c86c10712d470cef5bdb1a6143 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Wed, 10 Nov 2021 15:15:49 +0800 Subject: [PATCH 203/378] publish: hello-uniapp@3.2.8 for fix to lark --- changelog.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index 9f3cf7ca..c2b54199 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,5 @@ +## 3.2.8(2021-11-10) +- 新增 适配飞书平台(lark) ## 3.2.7(2021-10-26) - 修复 uni-popup 示例的 button 文字在 iPhone 5 上换行的 bug - 修复 uni-table 示例,页面顶部距离不对的 bug diff --git a/package.json b/package.json index d113f8eb..29d83d3c 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.2.7", + "version": "3.2.8", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From d45829f98085c852d187f4ed05c14061480c970d Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Thu, 11 Nov 2021 15:29:00 +0800 Subject: [PATCH 204/378] chore: console job invite ad --- App.vue | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/App.vue b/App.vue index c57289c9..0abd9d38 100644 --- a/App.vue +++ b/App.vue @@ -1,8 +1,18 @@ + /* #endif*/ + From 33f429a88c1b36856e54bd81743da941f609a2a6 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Wed, 17 Nov 2021 16:30:42 +0800 Subject: [PATCH 206/378] fix mp to vite --- pages/API/storage/storage.vue | 7 ++++++- pages/API/toast/toast.vue | 27 +++++++++++++++------------ pages/component/image/image.vue | 5 ----- pages/tabBar/extUI/extUI.nvue | 17 +++++------------ 4 files changed, 26 insertions(+), 30 deletions(-) diff --git a/pages/API/storage/storage.vue b/pages/API/storage/storage.vue index 448bf877..952192eb 100644 --- a/pages/API/storage/storage.vue +++ b/pages/API/storage/storage.vue @@ -91,7 +91,12 @@ success: (res) => { uni.showModal({ title: '存储数据成功', + // #ifndef MP-ALIPAY content: JSON.stringify(res.errMsg), + // #endif + // #ifdef MP-ALIPAY + content: data, + // #endif showCancel:false }) }, @@ -123,4 +128,4 @@ background-color: #007aff; color: #ffffff; } - + diff --git a/pages/API/toast/toast.vue b/pages/API/toast/toast.vue index e1669311..e290bab1 100644 --- a/pages/API/toast/toast.vue +++ b/pages/API/toast/toast.vue @@ -23,11 +23,11 @@ return { title: 'toast' } - }, + }, // #ifdef MP-ALIPAY onUnload() { this._showTimer && clearTimeout(this._showTimer); - }, + }, // #endif methods: { toast1Tap: function () { @@ -46,13 +46,16 @@ title: "loading", icon: "loading", duration: 5000 - }) - // #ifdef MP-ALIPAY - this._showTimer && clearTimeout(this._showTimer); - this._showTimer = setTimeout(() => { - this.hideToast() - }, 3000) + }) + // #ifdef MP-ALIPAY + this._showTimer = setTimeout(() => { + // icon 是 loading 时,showToast 实际执行的是 showLoading + my.hideLoading() + // 执行完所有代码再清除定时器 + clearTimeout(this._showTimer); + }, 3000) // #endif + }, toast4Tap: function () { uni.showToast({ @@ -62,9 +65,9 @@ }, // #ifdef APP-PLUS toast5Tap: function () { - uni.showToast({ - title: "显示一段轻提示", - position:'bottom' + uni.showToast({ + title: "显示一段轻提示", + position:'bottom' }) }, // #endif @@ -73,4 +76,4 @@ } } } - + diff --git a/pages/component/image/image.vue b/pages/component/image/image.vue index 69c72a05..729eb52a 100644 --- a/pages/component/image/image.vue +++ b/pages/component/image/image.vue @@ -6,12 +6,7 @@ 示例1 \n本地图片 - - - - - 示例2 \n网络图片 diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index 4489f6a5..cd14eda4 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -30,13 +30,10 @@ hideList: [ 'load-more' ], - lists: [ - // #ifndef MP-LARK - { + lists: [{ name: "uni-badge 数字角标", url: "badge" }, - // #endif { name: "uni-calendar 日历", url: "calendar" @@ -50,7 +47,7 @@ url: "collapse" }, - // #ifndef APP-NVUE || MP-LARK + // #ifndef APP-NVUE { name: "uni-combox 组合框", url: "combox" @@ -71,13 +68,11 @@ { name: "uni-dateformat 日期格式化", url: "dateformat" - }, - // #ifndef MP-LARK + }, { name: "uni-datetime-picker 日期选择器", url: "datetime-picker" - }, - // #endif + }, { name: "uni-drawer 抽屉", url: "drawer" @@ -184,18 +179,16 @@ name: "uni-steps 步骤条", url: "steps" }, - // #ifndef MP-LARK { name: "uni-swipe-action 滑动操作", url: "swipe-action" }, - // #endif { name: "uni-swiper-dot 轮播图指示点", url: "swiper-dot" }, - // #ifndef APP-NVUE || MP-TOUTIAO || MP-LARK || MP-QQ + // #ifndef APP-NVUE || MP-TOUTIAO || MP-BAIDU { name: "uni-table 表格", url: "table" From 27cddfa5ce9d19c8fe4c94da44990629f6ba0ae0 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Fri, 19 Nov 2021 18:26:38 +0800 Subject: [PATCH 207/378] update(uni-ui): demo page --- common/uni.css | 4 +- components/uni-section/uni-section.vue | 265 ++-- pages/extUI/badge/badge.vue | 206 +-- pages/extUI/button/button.vue | 107 ++ pages/extUI/calendar/calendar.vue | 119 +- pages/extUI/card/card.nvue | 192 +++ pages/extUI/card/card.vue | 261 ---- pages/extUI/collapse/collapse.vue | 298 ++-- pages/extUI/color/color.nvue | 132 ++ pages/extUI/combox/combox.vue | 142 +- pages/extUI/countdown/countdown.nvue | 70 + pages/extUI/countdown/countdown.vue | 169 --- pages/extUI/data-checkbox/data-checkbox.vue | 214 ++- .../data-indexed-list/data-indexed-list.vue | 19 + .../{data-picker.vue => data-picker.nvue} | 95 +- pages/extUI/dateformat/dateformat.vue | 139 +- .../extUI/datetime-picker/datetime-picker.vue | 210 +-- pages/extUI/drawer/drawer.vue | 313 ++--- pages/extUI/easyinput/easyinput.vue | 200 +-- pages/extUI/fab/fab.vue | 336 ++--- pages/extUI/fav/fav.vue | 161 +-- pages/extUI/file-picker/file-picker.vue | 164 +-- pages/extUI/font/font.nvue | 53 + pages/extUI/forms/forms.vue | 305 ++-- pages/extUI/goods-nav/goods-nav.nvue | 109 ++ pages/extUI/goods-nav/goods-nav.vue | 187 --- pages/extUI/grid/{grid.vue => grid.nvue} | 173 +-- pages/extUI/group/group.vue | 172 +-- pages/extUI/icons/{icons.vue => icons.nvue} | 1123 ++++++++------- .../{indexed-list.vue => indexed-list.nvue} | 42 +- pages/extUI/link/link.vue | 168 +-- pages/extUI/list/ad.vue | 102 +- pages/extUI/list/chat.vue | 169 +-- pages/extUI/list/list.nvue | 214 +++ pages/extUI/list/list.vue | 239 ---- pages/extUI/load-more/load-more.vue | 201 +-- pages/extUI/nav-bar/nav-bar.nvue | 153 ++ pages/extUI/nav-bar/nav-bar.vue | 245 ---- pages/extUI/notice-bar/notice-bar.vue | 194 +-- pages/extUI/number-box/number-box.nvue | 56 + pages/extUI/number-box/number-box.vue | 153 -- pages/extUI/pagination/pagination.vue | 155 +- pages/extUI/popup/popup.vue | 221 +-- pages/extUI/radius/radius.nvue | 145 ++ pages/extUI/rate/rate.nvue | 63 + pages/extUI/rate/rate.vue | 168 --- pages/extUI/row/row.vue | 423 +++--- pages/extUI/search-bar/search-bar.vue | 160 +-- pages/extUI/section/section.vue | 100 +- .../segmented-control/segmented-control.vue | 139 +- pages/extUI/space/space.nvue | 151 ++ pages/extUI/steps/steps.vue | 121 +- pages/extUI/swipe-action/swipe-action.vue | 228 ++- pages/extUI/swiper-dot/swiper-dot.nvue | 231 +++ pages/extUI/swiper-dot/swiper-dot.vue | 309 ---- pages/extUI/table/table.vue | 182 ++- pages/extUI/tag/tag.nvue | 158 +++ pages/extUI/tag/tag.vue | 272 ---- pages/extUI/test/color.vue | 196 +++ pages/extUI/test/test.nvue | 192 +++ pages/extUI/title/title.vue | 213 +-- pages/extUI/transition/transition.vue | 339 ++--- pages/tabBar/extUI/extUI.nvue | 8 +- uni_modules/uni-badge/changelog.md | 51 +- .../components/uni-badge/uni-badge.vue | 149 +- uni_modules/uni-badge/package.json | 174 +-- uni_modules/uni-badge/readme.md | 52 +- uni_modules/uni-card/changelog.md | 16 +- .../uni-card/components/uni-card/uni-card.vue | 504 +++---- uni_modules/uni-card/package.json | 9 +- uni_modules/uni-card/readme.md | 96 +- uni_modules/uni-collapse/changelog.md | 7 +- .../uni-collapse-item/uni-collapse-item.vue | 4 +- .../components/uni-collapse/uni-collapse.vue | 2 +- uni_modules/uni-collapse/package.json | 9 +- uni_modules/uni-collapse/readme.md | 288 +--- uni_modules/uni-combox/changelog.md | 7 +- .../components/uni-combox/uni-combox.vue | 153 +- uni_modules/uni-combox/package.json | 9 +- uni_modules/uni-combox/readme.md | 45 +- uni_modules/uni-countdown/changelog.md | 34 +- .../uni-countdown/uni-countdown.vue | 110 +- uni_modules/uni-countdown/package.json | 170 +-- uni_modules/uni-countdown/readme.md | 51 +- uni_modules/uni-data-checkbox/changelog.md | 11 +- .../uni-data-checkbox/uni-data-checkbox.vue | 32 +- uni_modules/uni-data-checkbox/package.json | 6 +- uni_modules/uni-data-checkbox/readme.md | 285 +--- uni_modules/uni-data-picker/changelog.md | 93 +- .../components/uni-data-picker/keypress.js | 90 +- .../uni-data-picker/uni-data-picker.vue | 61 +- .../uni-data-pickerview/uni-data-picker.js | 1102 ++++++++------- .../uni-data-pickerview.vue | 557 ++++---- uni_modules/uni-data-picker/package.json | 178 +-- uni_modules/uni-data-picker/readme.md | 272 +--- uni_modules/uni-dateformat/changelog.md | 17 +- .../uni-dateformat/uni-dateformat.vue | 176 +-- uni_modules/uni-dateformat/package.json | 8 +- uni_modules/uni-dateformat/readme.md | 88 +- uni_modules/uni-datetime-picker/changelog.md | 157 ++- .../uni-datetime-picker/calendar-item.vue | 96 +- .../uni-datetime-picker/calendar.vue | 163 ++- .../uni-datetime-picker/keypress.js | 88 +- .../uni-datetime-picker.vue | 123 +- .../components/uni-datetime-picker/util.js | 48 +- uni_modules/uni-datetime-picker/package.json | 177 +-- uni_modules/uni-datetime-picker/readme.md | 180 +-- uni_modules/uni-drawer/changelog.md | 7 +- uni_modules/uni-drawer/package.json | 8 +- uni_modules/uni-drawer/readme.md | 80 +- uni_modules/uni-easyinput/changelog.md | 7 +- .../uni-easyinput/uni-easyinput.vue | 62 +- uni_modules/uni-easyinput/package.json | 7 +- uni_modules/uni-easyinput/readme.md | 191 +-- uni_modules/uni-fab/changelog.md | 11 +- .../uni-fab/components/uni-fab/uni-fab.vue | 185 +-- uni_modules/uni-fab/package.json | 8 +- uni_modules/uni-fab/readme.md | 100 +- uni_modules/uni-fav/changelog.md | 31 +- .../uni-fav/components/uni-fav/uni-fav.vue | 6 +- uni_modules/uni-fav/package.json | 175 +-- uni_modules/uni-fav/readme.md | 44 +- uni_modules/uni-file-picker/changelog.md | 5 +- .../uni-file-picker/uni-file-picker.vue | 10 +- .../uni-file-picker/upload-image.vue | 14 +- uni_modules/uni-file-picker/package.json | 6 +- uni_modules/uni-file-picker/readme.md | 316 +---- uni_modules/uni-forms/changelog.md | 9 +- .../uni-forms-item/uni-forms-item.vue | 10 +- uni_modules/uni-forms/package.json | 7 +- uni_modules/uni-forms/readme.md | 853 +---------- uni_modules/uni-goods-nav/changelog.md | 29 +- .../components/uni-goods-nav/i18n/en.json | 2 +- .../components/uni-goods-nav/i18n/index.js | 2 +- .../uni-goods-nav/i18n/zh-Hans.json | 2 +- .../uni-goods-nav/i18n/zh-Hant.json | 2 +- .../uni-goods-nav/uni-goods-nav.vue | 18 +- uni_modules/uni-goods-nav/package.json | 173 +-- uni_modules/uni-goods-nav/readme.md | 113 +- uni_modules/uni-grid/changelog.md | 9 +- .../uni-grid-item/uni-grid-item.vue | 14 +- .../uni-grid/components/uni-grid/uni-grid.vue | 6 +- uni_modules/uni-grid/package.json | 10 +- uni_modules/uni-grid/readme.md | 88 +- uni_modules/uni-group/changelog.md | 10 +- uni_modules/uni-group/package.json | 8 +- uni_modules/uni-group/readme.md | 63 +- uni_modules/uni-icons/changelog.md | 20 +- .../uni-icons/components/uni-icons/icons.js | 1245 +++++++++++++++-- .../components/uni-icons/uni-icons.vue | 39 +- .../components/uni-icons/uniicons.css | 631 +++++++++ .../components/uni-icons/uniicons.ttf | Bin 0 -> 35760 bytes uni_modules/uni-icons/package.json | 170 +-- uni_modules/uni-icons/readme.md | 72 +- uni_modules/uni-indexed-list/changelog.md | 7 +- .../uni-indexed-list-item.vue | 14 +- .../uni-indexed-list/uni-indexed-list.vue | 32 +- uni_modules/uni-indexed-list/package.json | 9 +- uni_modules/uni-indexed-list/readme.md | 60 +- uni_modules/uni-link/changelog.md | 30 +- .../uni-link/components/uni-link/uni-link.vue | 256 ++-- uni_modules/uni-link/package.json | 172 +-- uni_modules/uni-link/readme.md | 59 +- uni_modules/uni-load-more/changelog.md | 23 +- .../uni-load-more/uni-load-more.vue | 91 +- uni_modules/uni-load-more/package.json | 170 +-- uni_modules/uni-load-more/readme.md | 60 +- uni_modules/uni-nav-bar/changelog.md | 7 +- .../components/uni-nav-bar/uni-nav-bar.vue | 32 +- uni_modules/uni-nav-bar/package.json | 9 +- uni_modules/uni-nav-bar/readme.md | 68 +- uni_modules/uni-notice-bar/changelog.md | 9 +- .../uni-notice-bar/uni-notice-bar.vue | 119 +- uni_modules/uni-notice-bar/package.json | 9 +- uni_modules/uni-notice-bar/readme.md | 62 +- uni_modules/uni-number-box/changelog.md | 9 +- .../uni-number-box/uni-number-box.vue | 127 +- uni_modules/uni-number-box/package.json | 8 +- uni_modules/uni-number-box/readme.md | 63 +- uni_modules/uni-pagination/changelog.md | 11 +- .../components/uni-pagination/i18n/en.json | 4 + .../components/uni-pagination/i18n/es.json | 4 + .../components/uni-pagination/i18n/fr.json | 4 + .../components/uni-pagination/i18n/index.js | 12 + .../uni-pagination/i18n/zh-Hans.json | 4 + .../uni-pagination/i18n/zh-Hant.json | 4 + .../uni-pagination/uni-pagination.vue | 670 ++++----- uni_modules/uni-pagination/package.json | 8 +- uni_modules/uni-pagination/readme.md | 61 +- uni_modules/uni-popup/changelog.md | 77 +- .../uni-popup-dialog/uni-popup-dialog.vue | 12 +- .../uni-popup-share/uni-popup-share.vue | 24 +- uni_modules/uni-popup/package.json | 177 +-- uni_modules/uni-popup/readme.md | 285 +--- uni_modules/uni-rate/changelog.md | 43 +- .../uni-rate/components/uni-rate/uni-rate.vue | 262 ++-- uni_modules/uni-rate/package.json | 175 +-- uni_modules/uni-rate/readme.md | 119 +- uni_modules/uni-row/changelog.md | 7 +- uni_modules/uni-row/package.json | 8 +- uni_modules/uni-row/readme.md | 177 +-- uni_modules/uni-scss/changelog.md | 2 + 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 | 2 + 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 | 145 ++ .../uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 + uni_modules/uni-search-bar/changelog.md | 7 +- .../uni-search-bar/uni-search-bar.vue | 27 +- uni_modules/uni-search-bar/package.json | 7 +- uni_modules/uni-search-bar/readme.md | 76 +- .../uni-segmented-control/changelog.md | 7 +- .../uni-segmented-control.vue | 53 +- .../uni-segmented-control/package.json | 8 +- uni_modules/uni-segmented-control/readme.md | 51 +- uni_modules/uni-steps/changelog.md | 7 +- .../components/uni-steps/uni-steps.vue | 95 +- uni_modules/uni-steps/package.json | 9 +- uni_modules/uni-steps/readme.md | 62 +- uni_modules/uni-swipe-action/changelog.md | 11 +- .../uni-swipe-action-item/bindingx.js | 20 +- .../uni-swipe-action-item/index.wxs | 323 +++++ .../uni-swipe-action-item/mpother.js | 11 +- .../components/uni-swipe-action-item/mpwxs.js | 43 +- uni_modules/uni-swipe-action/package.json | 6 +- uni_modules/uni-swipe-action/readme.md | 204 +-- uni_modules/uni-swiper-dot/changelog.md | 7 +- .../uni-swiper-dot/uni-swiper-dot.vue | 28 +- uni_modules/uni-swiper-dot/package.json | 8 +- uni_modules/uni-swiper-dot/readme.md | 84 +- uni_modules/uni-table/changelog.md | 7 +- .../uni-table/components/uni-tr/uni-tr.vue | 11 +- uni_modules/uni-table/package.json | 8 +- uni_modules/uni-table/readme.md | 139 +- uni_modules/uni-tag/changelog.md | 35 +- .../uni-tag/components/uni-tag/uni-tag.vue | 311 ++-- uni_modules/uni-tag/package.json | 172 +-- uni_modules/uni-tag/readme.md | 62 +- uni_modules/uni-title/changelog.md | 9 +- uni_modules/uni-title/package.json | 8 +- uni_modules/uni-title/readme.md | 85 +- uni_modules/uni-transition/changelog.md | 5 +- .../uni-transition/uni-transition.vue | 2 +- uni_modules/uni-transition/package.json | 4 +- uni_modules/uni-transition/readme.md | 390 +----- 255 files changed, 12670 insertions(+), 17076 deletions(-) create mode 100644 pages/extUI/button/button.vue create mode 100644 pages/extUI/card/card.nvue delete mode 100644 pages/extUI/card/card.vue create mode 100644 pages/extUI/color/color.nvue create mode 100644 pages/extUI/countdown/countdown.nvue delete mode 100644 pages/extUI/countdown/countdown.vue create mode 100644 pages/extUI/data-indexed-list/data-indexed-list.vue rename pages/extUI/data-picker/{data-picker.vue => data-picker.nvue} (54%) create mode 100644 pages/extUI/font/font.nvue create mode 100644 pages/extUI/goods-nav/goods-nav.nvue delete mode 100644 pages/extUI/goods-nav/goods-nav.vue rename pages/extUI/grid/{grid.vue => grid.nvue} (68%) rename pages/extUI/icons/{icons.vue => icons.nvue} (64%) rename pages/extUI/indexed-list/{indexed-list.vue => indexed-list.nvue} (88%) create mode 100644 pages/extUI/list/list.nvue delete mode 100644 pages/extUI/list/list.vue create mode 100644 pages/extUI/nav-bar/nav-bar.nvue delete mode 100644 pages/extUI/nav-bar/nav-bar.vue create mode 100644 pages/extUI/number-box/number-box.nvue delete mode 100644 pages/extUI/number-box/number-box.vue create mode 100644 pages/extUI/radius/radius.nvue create mode 100644 pages/extUI/rate/rate.nvue delete mode 100644 pages/extUI/rate/rate.vue create mode 100644 pages/extUI/space/space.nvue create mode 100644 pages/extUI/swiper-dot/swiper-dot.nvue delete mode 100644 pages/extUI/swiper-dot/swiper-dot.vue create mode 100644 pages/extUI/tag/tag.nvue delete mode 100644 pages/extUI/tag/tag.vue create mode 100644 pages/extUI/test/color.vue create mode 100644 pages/extUI/test/test.nvue 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-pagination/components/uni-pagination/i18n/en.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/es.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/fr.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/index.js create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hans.json create mode 100644 uni_modules/uni-pagination/components/uni-pagination/i18n/zh-Hant.json create mode 100644 uni_modules/uni-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-swipe-action/components/uni-swipe-action-item/index.wxs diff --git a/common/uni.css b/common/uni.css index 348e6092..301840d2 100644 --- a/common/uni.css +++ b/common/uni.css @@ -192,7 +192,7 @@ radio-group label, checkbox-group label{ padding-bottom:30rpx; } /*数字角标*/ -.uni-badge, +/* .uni-badge, .uni-badge-default { font-family: 'Helvetica Neue', Helvetica, sans-serif; font-size: 12px; @@ -202,7 +202,7 @@ radio-group label, checkbox-group label{ color: #333; border-radius: 100px; background-color: rgba(0, 0, 0, .15); -} +} */ .uni-badge.uni-badge-inverted { padding: 0 5px 0 0; color: #929292; diff --git a/components/uni-section/uni-section.vue b/components/uni-section/uni-section.vue index c57c973b..d4a81430 100644 --- a/components/uni-section/uni-section.vue +++ b/components/uni-section/uni-section.vue @@ -1,125 +1,140 @@ - - - - \ No newline at end of file + + + + diff --git a/pages/extUI/badge/badge.vue b/pages/extUI/badge/badge.vue index 1428827f..82fc64a5 100644 --- a/pages/extUI/badge/badge.vue +++ b/pages/extUI/badge/badge.vue @@ -1,66 +1,51 @@ @@ -71,8 +56,8 @@ return { value: 0, customStyle: { - backgroundColor: '#2C405A', - color: 'red' + backgroundColor: '#62ed0d', + color: '#fff' } }; }, @@ -88,104 +73,7 @@ }; - \ No newline at end of file + diff --git a/pages/extUI/button/button.vue b/pages/extUI/button/button.vue new file mode 100644 index 00000000..6be67bc6 --- /dev/null +++ b/pages/extUI/button/button.vue @@ -0,0 +1,107 @@ + + + diff --git a/pages/extUI/calendar/calendar.vue b/pages/extUI/calendar/calendar.vue index f4e8ac46..a5dd60aa 100644 --- a/pages/extUI/calendar/calendar.vue +++ b/pages/extUI/calendar/calendar.vue @@ -10,7 +10,8 @@ - + @@ -59,15 +60,15 @@ }) // TODO 模拟请求异步同步数据 setTimeout(() => { - this.info.date = getDate(new Date(), -30).fullDate - this.info.startDate = getDate(new Date(), -60).fullDate - this.info.endDate = getDate(new Date(), 30).fullDate + this.info.date = getDate(new Date(),-30).fullDate + this.info.startDate = getDate(new Date(),-60).fullDate + this.info.endDate = getDate(new Date(),30).fullDate this.info.selected = [{ - date: getDate(new Date(), -3).fullDate, + date: getDate(new Date(),-3).fullDate, info: '打卡' }, { - date: getDate(new Date(), -2).fullDate, + date: getDate(new Date(),-2).fullDate, info: '签到', data: { custom: '自定义信息', @@ -75,7 +76,7 @@ } }, { - date: getDate(new Date(), -1).fullDate, + date: getDate(new Date(),-1).fullDate, info: '已打卡' } ] @@ -85,7 +86,7 @@ open() { this.$refs.calendar.open() }, - close() { + close(){ console.log('弹窗关闭'); }, change(e) { @@ -107,114 +108,16 @@ } - \ No newline at end of file + diff --git a/pages/extUI/card/card.nvue b/pages/extUI/card/card.nvue new file mode 100644 index 00000000..7dadc257 --- /dev/null +++ b/pages/extUI/card/card.nvue @@ -0,0 +1,192 @@ + + + + + diff --git a/pages/extUI/card/card.vue b/pages/extUI/card/card.vue deleted file mode 100644 index 49290a12..00000000 --- a/pages/extUI/card/card.vue +++ /dev/null @@ -1,261 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/extUI/collapse/collapse.vue b/pages/extUI/collapse/collapse.vue index a041d65a..3a4cd64b 100644 --- a/pages/extUI/collapse/collapse.vue +++ b/pages/extUI/collapse/collapse.vue @@ -1,96 +1,108 @@ @@ -99,8 +111,8 @@ components: {}, data() { return { - value: ['0'], - accordionVal: '1', + value:['0'], + accordionVal:'1', content: '折叠内容主体,可自定义内容及样式,点击按钮修改内容使高度发生变化。', extraIcon: { color: '#4cd964', @@ -135,104 +147,7 @@ } - \ No newline at end of file + diff --git a/pages/extUI/color/color.nvue b/pages/extUI/color/color.nvue new file mode 100644 index 00000000..12415600 --- /dev/null +++ b/pages/extUI/color/color.nvue @@ -0,0 +1,132 @@ + + + + + diff --git a/pages/extUI/combox/combox.vue b/pages/extUI/combox/combox.vue index e811fbdc..3a1300d8 100644 --- a/pages/extUI/combox/combox.vue +++ b/pages/extUI/combox/combox.vue @@ -1,21 +1,28 @@ @@ -34,106 +41,9 @@ } - \ No newline at end of file + diff --git a/pages/extUI/countdown/countdown.nvue b/pages/extUI/countdown/countdown.nvue new file mode 100644 index 00000000..dc7d3bf8 --- /dev/null +++ b/pages/extUI/countdown/countdown.nvue @@ -0,0 +1,70 @@ + + + + diff --git a/pages/extUI/countdown/countdown.vue b/pages/extUI/countdown/countdown.vue deleted file mode 100644 index 81cc5d7e..00000000 --- a/pages/extUI/countdown/countdown.vue +++ /dev/null @@ -1,169 +0,0 @@ - - - - \ No newline at end of file diff --git a/pages/extUI/data-checkbox/data-checkbox.vue b/pages/extUI/data-checkbox/data-checkbox.vue index dc3435d4..6cf7eab1 100644 --- a/pages/extUI/data-checkbox/data-checkbox.vue +++ b/pages/extUI/data-checkbox/data-checkbox.vue @@ -1,9 +1,79 @@ @@ -74,10 +145,18 @@ export default { data() { return { - formData: { - value: 1, - hobby: [1] - }, + radio1: 0, + radio2: 0, + radio3: 0, + radio4: 0, + radio5: 0, + radio6: 0, + checkbox1: [0], + checkbox2: [0], + checkbox3: [0], + checkbox4: [0], + checkbox5: [0], + checkbox6: [0], sex: [{ text: '男', value: 0 @@ -129,112 +208,19 @@ } - \ No newline at end of file + diff --git a/pages/extUI/data-indexed-list/data-indexed-list.vue b/pages/extUI/data-indexed-list/data-indexed-list.vue new file mode 100644 index 00000000..8562b9b2 --- /dev/null +++ b/pages/extUI/data-indexed-list/data-indexed-list.vue @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/pages/extUI/data-picker/data-picker.vue b/pages/extUI/data-picker/data-picker.nvue similarity index 54% rename from pages/extUI/data-picker/data-picker.vue rename to pages/extUI/data-picker/data-picker.nvue index 28681137..c95ca699 100644 --- a/pages/extUI/data-picker/data-picker.vue +++ b/pages/extUI/data-picker/data-picker.nvue @@ -1,5 +1,10 @@ @@ -30,37 +33,34 @@ return { classes: '1-2', dataTree: [{ - text: "一年级", - value: "1-0", - children: [{ - text: "1.1班", - value: "1-1" - }, - { - text: "1.2班", - value: "1-2" - } - ] + text: "一年级", + value: "1-0", + children: [{ + text: "1.1班", + value: "1-1" }, { - text: "二年级", - value: "2-0", - children: [{ - text: "2.1班", - value: "2-1" - }, - { - text: "2.2班", - value: "2-2" - } - ] + text: "1.2班", + value: "1-2" + }] + }, + { + text: "二年级", + value: "2-0", + children: [{ + text: "2.1班", + value: "2-1" }, { - text: "三年级", - value: "3-0", - disable: true - } - ] + text: "2.2班", + value: "2-2" + }] + }, + { + text: "三年级", + value: "3-0", + disable: true + }] } }, methods: { @@ -79,16 +79,6 @@ \ No newline at end of file + + .popper__arrow { + top: -6px; + left: 50%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #EBEEF5; +} + .popper__arrow { + top: -6px; + left: 50%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #EBEEF5; +} + diff --git a/pages/extUI/dateformat/dateformat.vue b/pages/extUI/dateformat/dateformat.vue index 8c0c2753..8ff698f0 100644 --- a/pages/extUI/dateformat/dateformat.vue +++ b/pages/extUI/dateformat/dateformat.vue @@ -1,23 +1,27 @@ @@ -34,105 +38,12 @@ } - \ No newline at end of file + diff --git a/pages/extUI/datetime-picker/datetime-picker.vue b/pages/extUI/datetime-picker/datetime-picker.vue index 8f49e7d7..79a5c293 100644 --- a/pages/extUI/datetime-picker/datetime-picker.vue +++ b/pages/extUI/datetime-picker/datetime-picker.vue @@ -1,17 +1,19 @@ - + + + + diff --git a/pages/extUI/link/link.vue b/pages/extUI/link/link.vue index 50075e9b..d6e84c2c 100644 --- a/pages/extUI/link/link.vue +++ b/pages/extUI/link/link.vue @@ -1,130 +1,38 @@ - - - - - \ No newline at end of file + + + + + diff --git a/pages/extUI/list/ad.vue b/pages/extUI/list/ad.vue index d6e73217..b38387b3 100644 --- a/pages/extUI/list/ad.vue +++ b/pages/extUI/list/ad.vue @@ -5,7 +5,7 @@ @@ -87,101 +87,5 @@ } - \ No newline at end of file + diff --git a/pages/extUI/list/chat.vue b/pages/extUI/list/chat.vue index a9063f02..5983e5e1 100644 --- a/pages/extUI/list/chat.vue +++ b/pages/extUI/list/chat.vue @@ -1,31 +1,47 @@ @@ -142,104 +158,7 @@ } - \ No newline at end of file + diff --git a/pages/extUI/list/list.nvue b/pages/extUI/list/list.nvue new file mode 100644 index 00000000..efcf7f29 --- /dev/null +++ b/pages/extUI/list/list.nvue @@ -0,0 +1,214 @@ + + + + + diff --git a/pages/extUI/list/list.vue b/pages/extUI/list/list.vue deleted file mode 100644 index 69c6a148..00000000 --- a/pages/extUI/list/list.vue +++ /dev/null @@ -1,239 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/extUI/load-more/load-more.vue b/pages/extUI/load-more/load-more.vue index 64980147..262ed860 100644 --- a/pages/extUI/load-more/load-more.vue +++ b/pages/extUI/load-more/load-more.vue @@ -1,53 +1,39 @@ - \ No newline at end of file + diff --git a/pages/extUI/nav-bar/nav-bar.nvue b/pages/extUI/nav-bar/nav-bar.nvue new file mode 100644 index 00000000..3d22555b --- /dev/null +++ b/pages/extUI/nav-bar/nav-bar.nvue @@ -0,0 +1,153 @@ + + + + + diff --git a/pages/extUI/nav-bar/nav-bar.vue b/pages/extUI/nav-bar/nav-bar.vue deleted file mode 100644 index eb35ab57..00000000 --- a/pages/extUI/nav-bar/nav-bar.vue +++ /dev/null @@ -1,245 +0,0 @@ - - - - - \ No newline at end of file diff --git a/pages/extUI/notice-bar/notice-bar.vue b/pages/extUI/notice-bar/notice-bar.vue index 0a60f3b0..043b30d7 100644 --- a/pages/extUI/notice-bar/notice-bar.vue +++ b/pages/extUI/notice-bar/notice-bar.vue @@ -1,40 +1,33 @@ @@ -56,120 +49,15 @@ } - \ No newline at end of file + diff --git a/pages/extUI/number-box/number-box.nvue b/pages/extUI/number-box/number-box.nvue new file mode 100644 index 00000000..cb3d0e52 --- /dev/null +++ b/pages/extUI/number-box/number-box.nvue @@ -0,0 +1,56 @@ + + + diff --git a/pages/extUI/number-box/number-box.vue b/pages/extUI/number-box/number-box.vue deleted file mode 100644 index 6cfd9293..00000000 --- a/pages/extUI/number-box/number-box.vue +++ /dev/null @@ -1,153 +0,0 @@ - - - \ No newline at end of file diff --git a/pages/extUI/pagination/pagination.vue b/pages/extUI/pagination/pagination.vue index 20cbce77..1909799b 100644 --- a/pages/extUI/pagination/pagination.vue +++ b/pages/extUI/pagination/pagination.vue @@ -1,28 +1,30 @@ @@ -52,103 +54,7 @@ } - \ No newline at end of file + diff --git a/pages/extUI/popup/popup.vue b/pages/extUI/popup/popup.vue index 990357cb..0fd927bb 100644 --- a/pages/extUI/popup/popup.vue +++ b/pages/extUI/popup/popup.vue @@ -1,48 +1,61 @@ @@ -70,18 +70,20 @@ flex-direction: column; justify-content: center; align-items: center; - margin: 3px 0; + margin: 1px 0; + position: relative; } .uni-calendar-item__weeks-box-text { - font-size: 12px; - // font-size: $uni-font-size-base; - // color: $uni-text-color; + font-size: 14px; + // font-family: Lato-Bold, Lato; + font-weight: bold; + color: #455997; } .uni-calendar-item__weeks-lunar-text { - font-size: $uni-font-size-sm; - color: $uni-text-color; + font-size: 12px; + color: #333; } .uni-calendar-item__weeks-box-item { @@ -107,38 +109,43 @@ width: 8px; height: 8px; border-radius: 8px; - background-color: $uni-color-error; + background-color: #dd524d; } .uni-calendar-item__weeks-box .uni-calendar-item--disable { // background-color: rgba(249, 249, 249, $uni-opacity-disabled); - color: $uni-text-color-disable; cursor: default; + } + + .uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable { + color: #D1D1D1; } - .uni-calendar-item__weeks-box .uni-calendar-item--isDay-text { - color: $uni-color-primary; - } - - .uni-calendar-item--isDay { - background-color: $uni-color-primary; - opacity: 0.8; - color: #fff; + .uni-calendar-item--isDay { + position: absolute; + top: 10px; + right: 17%; + background-color: #dd524d; + width:6px; + height: 6px; + border-radius: 50%; } .uni-calendar-item--extra { - color: $uni-color-error; + color: #dd524d; opacity: 0.8; } .uni-calendar-item__weeks-box .uni-calendar-item--checked { - background-color: $uni-color-primary; - // border-radius: 50%; + background-color: #007aff; + border-radius: 50%; box-sizing: border-box; - border: 6px solid #f2f6fc; - color: #fff; - opacity: 0.8; + border: 3px solid #fff; + } + + .uni-calendar-item--checked .uni-calendar-item--checked-text { + color: #fff; } .uni-calendar-item--multiple .uni-calendar-item--checked-range-text { @@ -146,36 +153,33 @@ } .uni-calendar-item--multiple { - background-color: #f2f6fc; + background-color: #F6F7FC; // color: #fff; - opacity: 0.8; - } - - .uni-calendar-item--multiple .uni-calendar-item--before-checked { - background-color: #409eff; - color: #fff !important; - // border-radius: 50%; - box-sizing: border-box; - border: 6px solid #f2f6fc; } + .uni-calendar-item--multiple .uni-calendar-item--before-checked, .uni-calendar-item--multiple .uni-calendar-item--after-checked { - background-color: #409eff;; - color: #fff !important; - // border-radius: 50%; + background-color: #409eff; + border-radius: 50%; box-sizing: border-box; - border: 6px solid #f2f6fc; + border: 3px solid #F6F7FC; + } + + .uni-calendar-item--before-checked .uni-calendar-item--checked-text, + .uni-calendar-item--after-checked .uni-calendar-item--checked-text { + color: #fff; } .uni-calendar-item--before-checked-x { - // border-top-left-radius: 25px; - // border-bottom-left-radius: 25px; - background-color: #f2f6fc; + border-top-left-radius: 50px; + border-bottom-left-radius: 50px; + box-sizing: border-box; + background-color: #F6F7FC; } .uni-calendar-item--after-checked-x { - // border-top-right-radius: 25px; - // border-bottom-right-radius: 25px; - background-color: #f2f6fc; + border-top-right-radius: 50px; + border-bottom-right-radius: 50px; + background-color: #F6F7FC; } diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue index d04b9cf2..fc16928b 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -3,26 +3,30 @@ - - + :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}"> + - {{ (nowDate.year||'') +' / '+( nowDate.month||'')}} + {{ (nowDate.year||'') + ' 年 ' + ( nowDate.month||'') +' 月'}} - + + + + + {{nowDate.month}} - + {{SUNText}} @@ -66,22 +70,23 @@ {{tempRange.before ? tempRange.before : startDateText}} - + {{tempRange.after ? tempRange.after : endDateText}} - + - - + + + 确认 @@ -187,10 +192,10 @@ checkHover: { type: Boolean, default: true - }, - hideSecond: { - type: [Boolean], - default: false + }, + hideSecond: { + type: [Boolean], + default: false }, pleStatus: { type: Object, @@ -228,25 +233,25 @@ date: { immediate: true, handler(newVal, oldVal) { - if (!this.range) { + if (!this.range) { this.tempSingleDate = newVal setTimeout(() => { this.init(newVal) }, 100) } } - }, - defTime: { - immediate: true, - handler(newVal, oldVal) { - if (!this.range) { - this.time = newVal - } else { - // console.log('-----', newVal); - this.timeRange.startTime = newVal.start - this.timeRange.endTime = newVal.end - } - } + }, + defTime: { + immediate: true, + handler(newVal, oldVal) { + if (!this.range) { + this.time = newVal + } else { + // console.log('-----', newVal); + this.timeRange.startTime = newVal.start + this.timeRange.endTime = newVal.end + } + } }, startDate(val) { this.cale.resetSatrtDate(val) @@ -361,7 +366,6 @@ }) // 选中某一天 // this.cale.setDate(this.date) - this.init(this.date) // this.setDay }, @@ -411,8 +415,8 @@ } else { this.time = '' this.tempSingleDate = '' - } - this.calendar.fullDate = '' + } + this.calendar.fullDate = '' this.setDate() }, @@ -425,7 +429,6 @@ * @param {Object} date */ init(date) { - this.cale.setDate(date) this.weeks = this.cale.weeks this.nowDate = this.calendar = this.cale.getInfo(date) @@ -605,7 +608,7 @@ top: 0; left: 0; right: 0; - background-color: $uni-bg-color-mask; + background-color: rgba(0, 0, 0, 0.4); transition-property: opacity; transition-duration: 0.3s; opacity: 0; @@ -639,6 +642,12 @@ background-color: #fff; } + .uni-calendar__content-mobile { + border-top-left-radius: 10px; + border-top-right-radius: 10px; + box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.1); + } + .uni-calendar__header { position: relative; /* #ifndef APP-NVUE */ @@ -648,9 +657,11 @@ justify-content: center; align-items: center; height: 50px; - // border-bottom-color: $uni-border-color; - // border-bottom-style: solid; - // border-bottom-width: 1px; + } + + .uni-calendar__header-mobile { + padding: 10px; + padding-bottom: 0; } .uni-calendar--fixed-top { @@ -659,14 +670,13 @@ /* #endif */ flex-direction: row; justify-content: space-between; - border-top-color: $uni-border-color; + border-top-color: rgba(0, 0, 0, 0.4); border-top-style: solid; border-top-width: 1px; } .uni-calendar--fixed-width { width: 50px; - // padding: 0 15px; } .uni-calendar__backtoday { @@ -680,21 +690,21 @@ font-size: 12px; border-top-left-radius: 25px; border-bottom-left-radius: 25px; - color: $uni-text-color; - background-color: $uni-bg-color-hover; + color: #fff; + background-color: #f1f1f1; } .uni-calendar__header-text { text-align: center; width: 100px; - font-size: $uni-font-size-base; - color: $uni-text-color; + font-size: 15px; + color: #666; } .uni-calendar__button-text { text-align: center; width: 100px; - font-size: $uni-font-size-base; + font-size: 14px; color: #007aff; /* #ifndef APP-NVUE */ letter-spacing: 3px; @@ -713,12 +723,12 @@ } .uni-calendar__header-btn { - width: 8px; - height: 8px; - border-left-color: $uni-text-color-placeholder; + width: 9px; + height: 9px; + border-left-color: #808080; border-left-style: solid; border-left-width: 1px; - border-top-color: $uni-color-subtitle; + border-top-color: #555555; border-top-style: solid; border-top-width: 1px; } @@ -760,10 +770,13 @@ .uni-calendar__weeks-day-text { font-size: 12px; + color: #B2B2B2; } .uni-calendar__box { position: relative; + // padding: 0 10px; + padding-bottom: 7px; } .uni-calendar__box-bg { @@ -782,7 +795,7 @@ .uni-calendar__box-bg-text { font-size: 200px; font-weight: bold; - color: $uni-text-color-grey; + color: #999; opacity: 0.1; text-align: center; /* #ifndef APP-NVUE */ @@ -795,12 +808,17 @@ // line-height: 50px; text-align: center; color: #333; - border-top-color: $uni-border-color; + border-top-color: #DCDCDC; + ; border-top-style: solid; border-top-width: 1px; flex: 1; } + .uni-date-btn--ok { + padding: 20px 15px; + } + .uni-date-changed--time-start { /* #ifndef APP-NVUE */ display: flex; @@ -834,4 +852,47 @@ .mr-10 { margin-right: 10px; } + + .dialog-close { + position: absolute; + top: 0; + right: 0; + bottom: 0; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex-direction: row; + align-items: center; + padding: 0 25px; + margin-top: 10px; + } + + .dialog-close-plus { + width: 16px; + height: 2px; + background-color: #737987; + border-radius: 2px; + transform: rotate(45deg); + } + + .dialog-close-rotate { + position: absolute; + transform: rotate(-45deg); + } + + .uni-datetime-picker--btn { + border-radius: 100px; + height: 40px; + line-height: 40px; + background-color: #007aff; + color: #fff; + font-size: 16px; + letter-spacing: 5px; + } + + /* #ifndef APP-NVUE */ + .uni-datetime-picker--btn:active { + opacity: 0.7; + } + /* #endif */ diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js index 9601abae..2bf928b4 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/keypress.js @@ -1,45 +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: () => {} -} +// #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 \ No newline at end of file diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue index 362b4f8f..88b3812b 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue @@ -5,16 +5,12 @@ - + - + @@ -25,7 +21,7 @@ - + @@ -34,7 +30,8 @@ - + + - + @change="singleChange" style="padding: 0 8px;" /> {{okText}} @@ -54,7 +51,8 @@ - + + @@ -77,14 +75,14 @@ - - + + @monthSwitch="rightMonthSwitch" style="padding: 0 8px;border-left: 1px solid #F1F1F1;" /> {{clearText}} @@ -92,7 +90,7 @@ - @@ -104,10 +102,10 @@ * @description 同时支持 PC 和移动端使用日历选择日期和日期范围 * @tutorial https://ext.dcloud.net.cn/plugin?id=3962 * @property {String} type 选择器类型 - * @property {String|Array} value 绑定值 + * @property {String|Number|Array|Date} value 绑定值 * @property {String} placeholder 单选择时的占位内容 * @property {String} start 起始时间 - * @property {String} start 终止时间 + * @property {String} end 终止时间 * @property {String} start-placeholder 范围选择时开始日期的占位内容 * @property {String} end-placeholder 范围选择时结束日期的占位内容 * @property {String} range-separator 选择范围时的分隔符 @@ -115,6 +113,9 @@ * @property {Boolean} disabled = [true|false] 是否禁用 * @property {Boolean} clearIcon = [true|false] 是否显示清除按钮(仅PC端适用) * @event {Function} change 确定日期时触发的事件 + * @event {Function} show 打开弹出层 + * @event {Function} close 关闭弹出层 + * @event {Function} clear 清除上次选中的状态和值 **/ import calendar from './calendar.vue' import timePicker from './time-picker.vue' @@ -180,7 +181,6 @@ isEmitValue: false, isPhone: false, isFirstShow: true, - iconBase64: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAABmJLR0QA/wD/AP+gvaeTAAACVklEQVRoge2Zv2vTQRTAP4oWJQQskmolBAnSQVMcSxbp4ubmIEWETu0oIjg5iIOgpLNunfQfMHToUgpOVgfRqRAL4q8WRLQVq4sOdyHPL9/7evfNJReS+8DB433v7r37fl/eu9xBJBKUB0BLt+uDaOOQZb8SUNXyuKuRftg46NeXcBww6M8AC0ANOAycAyb1s7e6+SbNxi/gBfAQ2HadcA7YB/4MUPsKzLos4jzwewAcNy3mhMnx5I/9BiqUAD4DDWAXmAfqWt8Enlq+GBfSbEwAt4AicAxYBO7aTPaGzhu4KvTLQn/Hh9cpmGzcFvqmaXAyaxWE/MGTg93yXsgFUyfbOrJCJ2s8y+tRP21s0fmMTlmih8zT8WnN1GloCmJWaF0CpvrlSAb1/3fJXshNT470hZEIrZeoahqaU8BZ10Exa4XGtiCaKKL+EIHaMX8U81ZEP7ntrwi7n4CfWi7p+UCFdFdh7Rpaps9+mn93rjY2THut0QqtoVlIkpi1QjNyCzEdnl0W+idCXxb6VmKudaGfsbBhRbcHdEWhf5eYt0o6FVR6BjhqYcOKoQkt2y/SAB5rWVbpVeCilmUl3hb6JNeAI1p+ZWEjFzH9hsY2tEwHdHX9DGATWNLyceCeGL/YhY+58LWhy9o0uhJDKw3T4dlr4L6WZab5JvRBGJqs9UPI5R44lQfpx56pUzK0NlA3R6AK1Engu1+/nGhfK7R5bjtwGnXdFfpSJ6190Quz5grqQCC048lFXMhy2nQZWkUVsRowZv8OvLOPCvdHwE5APyKRSMQzfwE22DtT3T5PPwAAAABJRU5ErkJggg==' } }, props: { @@ -235,10 +235,10 @@ clearIcon: { type: [Boolean], default: true - }, - hideSecond: { - type: [Boolean], - default: false + }, + hideSecond: { + type: [Boolean], + default: false } }, watch: { @@ -309,7 +309,7 @@ const res = activeDate === this.caleRange.endDate ? this.caleRange.endTime : '' return res }, - reactMobDefTime() { + reactMobDefTime() { const times = { start: this.tempRange.startTime, end: this.tempRange.endTime @@ -377,7 +377,7 @@ // } }, mounted() { - this.platform() + this.platform() }, methods: { /** @@ -437,7 +437,7 @@ }) this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, defaultRange, { which: 'left' - }) + }) } }, updateLeftCale(e) { @@ -685,9 +685,9 @@ this.tempSingleDate = '' this.time = '' if (this.isPhone) { - this.$refs.mobile.clearCalender() + this.$refs.mobile && this.$refs.mobile.clearCalender() } else { - this.$refs.pcSingle.clearCalender() + this.$refs.pcSingle && this.$refs.pcSingle.clearCalender() } if (needEmit) { this.formItem && this.formItem.setValue('') @@ -698,16 +698,16 @@ } else { this.range.startDate = '' this.range.endDate = '' - this.tempRange.startDate= '' - this.tempRange.startTime= '' - this.tempRange.endDate= '' - this.tempRange.endTime= '' + this.tempRange.startDate = '' + this.tempRange.startTime = '' + this.tempRange.endDate = '' + this.tempRange.endTime = '' if (this.isPhone) { - this.$refs.mobile.clearCalender() + this.$refs.mobile && this.$refs.mobile.clearCalender() } else { - this.$refs.left.clearCalender() - this.$refs.right.clearCalender() - this.$refs.right.next() + this.$refs.left && this.$refs.left.clearCalender() + this.$refs.right && this.$refs.right.clearCalender() + this.$refs.right && this.$refs.right.next() } if (needEmit) { this.formItem && this.formItem.setValue([]) @@ -728,7 +728,8 @@ const minute = defVal.getMinutes() const second = defVal.getSeconds() const defDate = year + '-' + this.lessTen(month) + '-' + this.lessTen(day) - const defTime = this.lessTen(hour) + ':' + this.lessTen(minute) + (this.hideSecond ? '' : (':' + this.lessTen(second))) + const defTime = this.lessTen(hour) + ':' + this.lessTen(minute) + (this.hideSecond ? '' : (':' + this + .lessTen(second))) return { defDate, defTime @@ -782,12 +783,11 @@ .uni-date-editor--x .uni-date__icon-clear { position: absolute; - top: 5px; + top: 0; right: 0; display: inline-block; box-sizing: border-box; - border: 6px solid transparent; - margin-right: 6px; + border: 9px solid transparent; /* #ifdef H5 */ cursor: pointer; /* #endif */ @@ -846,8 +846,8 @@ position: absolute; top: 0; z-index: 999; - border: 1px solid #e4e7ed; - box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); + border: 1px solid #EBEEF5; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); border-radius: 4px; } @@ -857,8 +857,8 @@ position: absolute; top: 0; z-index: 999; - border: 1px solid #e4e7ed; - box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%); + border: 1px solid #EBEEF5; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); border-radius: 4px; } @@ -899,7 +899,7 @@ border-top-color: #F1F1F1; border-top-style: solid; border-top-width: 1px; - background-color: #fff; + /* background-color: #fff; */ line-height: 40px; text-align: right; color: #666; @@ -917,7 +917,7 @@ } .uni-date-changed { - background-color: #fff; + /* background-color: #fff; */ text-align: center; color: #333; border-bottom-color: #F1F1F1; @@ -946,7 +946,32 @@ margin-right: 50px; } - .uni-date_calendar-pc { - padding: 0 6px; + /* picker 弹出层通用的指示小三角, todo:扩展至上下左右方向定位 */ + .uni-popper__arrow, + .uni-popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 6px; + } + + .uni-popper__arrow { + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); + top: -6px; + left: 10%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #EBEEF5; + } + + .uni-popper__arrow::after { + content: " "; + top: 1px; + margin-left: -6px; + border-top-width: 0; + border-bottom-color: #fff; } - + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js index 18b91c36..26f5f104 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -1,5 +1,3 @@ -import CALENDAR from './calendar.js' - class Calendar { constructor({ date, @@ -112,7 +110,6 @@ class Calendar { dateArr.push({ date: beforeDate, month: full.month - 1, - lunar: this.getlunar(full.year, full.month - 1, beforeDate), disable: true }) } @@ -123,7 +120,7 @@ class Calendar { */ _currentMonthDys(dateData, full) { let dateArr = [] - let fullDate = this.date.fullDate + let fullDate = this.date.fullDate for (let i = 1; i <= dateData; i++) { let isinfo = false let nowDate = full.year + '-' + (full.month < 10 ? @@ -164,16 +161,15 @@ class Calendar { if (multiplesStatus !== -1) { checked = true } - } + } let data = { fullDate: nowDate, year: full.year, date: i, multiple: this.range ? checked : false, - beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate), - afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate), + beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), month: full.month, - lunar: this.getlunar(full.year, full.month, i), disable: !(disableBefore && disableAfter), isDay, userChecked: false @@ -195,7 +191,6 @@ class Calendar { dateArr.push({ date: i, month: Number(full.month) + 1, - lunar: this.getlunar(full.year, Number(full.month) + 1, i), disable: true }) } @@ -243,7 +238,26 @@ class Calendar { return false } } - + + /** + * 比较真实起始日期 + */ + + isLogicBefore(currentDay, before, after) { + let logicBefore = before + if (before && after) { + logicBefore = this.dateCompare(before, after) ? before : after + } + return this.dateEqual(logicBefore, currentDay) + } + + isLogicAfter(currentDay, before, after) { + let logicAfter = after + if (before && after) { + logicAfter = this.dateCompare(before, after) ? after : before + } + return this.dateEqual(logicAfter, currentDay) + } /** * 获取日期范围内所有日期 @@ -266,19 +280,6 @@ class Calendar { } return arr } - /** - * 计算阴历日期显示 - */ - getlunar(year, month, date) { - return CALENDAR.solar2lunar(year, month, date) - } - /** - * 设置打点 - */ - setSelectInfo(data, value) { - this.selected = value - this._getWeek(data) - } /** * 获取多选状态 @@ -288,7 +289,6 @@ class Calendar { before, after } = this.multipleStatus - if (!this.range) return if (before && after) { if (!this.lastHover) { diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json index 5c3f88af..c975e969 100644 --- a/uni_modules/uni-datetime-picker/package.json +++ b/uni_modules/uni-datetime-picker/package.json @@ -1,89 +1,90 @@ -{ - "id": "uni-datetime-picker", - "displayName": "uni-datetime-picker 日期选择器", - "version": "2.1.4", - "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", - "keywords": [ - "uni-datetime-picker", - "uni-ui", - "uniui", - "日期时间选择器", - "日期时间" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "" - }, - "directories": { - "example": "../../temps/example_temps" - }, - "dcloudext": { - "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": { +{ + "id": "uni-datetime-picker", + "displayName": "uni-datetime-picker 日期选择器", + "version": "2.2.0", + "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", + "keywords": [ + "uni-datetime-picker", + "uni-ui", + "uniui", + "日期时间选择器", + "日期时间" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "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-icons" - ], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "client": { - "App": { - "app-vue": "y", - "app-nvue": "n" - }, - "H5-mobile": { - "Safari": "y", - "Android Browser": "y", - "微信浏览器(Android)": "y", - "QQ浏览器(Android)": "y" - }, - "H5-pc": { - "Chrome": "y", - "IE": "y", - "Edge": "y", - "Firefox": "y", - "Safari": "y" - }, - "小程序": { - "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" - }, - "快应用": { - "华为": "u", - "联盟": "u" - }, - "Vue": { - "vue2": "y", - "vue3": "y" - } - } - } - } -} + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "n" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md index 37b5344b..87304422 100644 --- a/uni_modules/uni-datetime-picker/readme.md +++ b/uni_modules/uni-datetime-picker/readme.md @@ -1,159 +1,21 @@ - -> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` -## DatetimePicker 时间选择器 -> **组件名:uni-datetime-picker** -> 代码块: `uDatetimePicker` - - -该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 - -若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 - - -___点击 picker 默认值规则:___ - -- 若设置初始值 value, 会显示在 picker 显示框中 -- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 - - -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - -### 基本用法 - -在 ``template`` 中使用组件 - -```html - - - - - -``` - -## API - -### DatetimePicker Props - -|属性名 |类型 |默认值 |值域 |说明 | -|:-: |:-: |:-: | |:-: | -|type |String |datetime |date/daterange/datetime/datetimerange|选择器类型 | -|value |String、Number、Array(范围选择)、Date|- |- |输入框当前值 | -|start |String、Number |- |- |最小值,可以使用日期的字符串(String)、时间戳(Number) | -|end |String、Number |- |- |最大值,可以使用日期的字符串(String)、时间戳(Number) | -|return-type |String |string |timestamp 、string、date |返回值格式 | -|border |Boolean |true | |是否有边框 | -|rangeSeparator |String |'-' |- |选择范围时的分隔符 | -|placeholder |String |- |- |非范围选择时的占位内容 | -|start-placeholder|String |- |- |范围选择时开始日期的占位内容 | -|end-placeholder |String |- |- |范围选择时结束日期的占位内容 | -|disabled |Boolean |false | |是否不可选择 | -|clear-icon |Boolean |true | |是否显示清除按钮 | -|hide-second |Boolean |false | |是否显示秒,只显示时分 | - - - - -### DatetimePicker Events - -|事件名称 |说明 |返回值 | -|:-: |:-: |:-: | -|change |确定日期时间时触发的事件,参数为当前选择的日期对象 |单选返回日期字符串,如:'2010-02-3';范围选返回日期字符串数组,如:['2020-10-1', '2021-4-1'] | -|maskClick|点击遮罩层触发 |- | - -### Popup Methods - -|方法称名 |说明|参数| -|:-:|:-:|:-:| -|show|打开弹出层|-| -|close|关闭弹出层 |-| -|clear|清除上次选中的状态和值|-| - - ### - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/datetime-picker/datetime-picker](https://hellouniapp.dcloud.net.cn/pages/extUI/datetime-picker/datetime-picker) \ No newline at end of file + + +> `重要通知:组件升级更新 2.0.0 后,支持日期+时间范围选择,组件 ui 将使用日历选择日期,ui 变化较大,同时支持 PC 和 移动端。此版本不向后兼容,不再支持单独的时间选择(type=time)及相关的 hide-second 属性(时间选可使用内置组件 picker)。若仍需使用旧版本,可在插件市场下载*非uni_modules版本*,旧版本将不再维护` + +## DatetimePicker 时间选择器 + +> **组件名:uni-datetime-picker** +> 代码块: `uDatetimePicker` + + +该组件的优势是,支持**时间戳**输入和输出(起始时间、终止时间也支持时间戳),可**同时选择**日期和时间。 + +若只是需要单独选择日期和时间,不需要时间戳输入和输出,可使用原生的 picker 组件。 + +**_点击 picker 默认值规则:_** + +- 若设置初始值 value, 会显示在 picker 显示框中 +- 若无初始值 value,则初始值 value 为当前本地时间 Date.now(), 但不会显示在 picker 显示框中 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-drawer/changelog.md b/uni_modules/uni-drawer/changelog.md index 4077ce1c..9f41fa46 100644 --- a/uni_modules/uni-drawer/changelog.md +++ b/uni_modules/uni-drawer/changelog.md @@ -1,5 +1,8 @@ -## 1.1.1(2021-07-30) -- 优化 vue3下事件警告的问题 +## 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-drawer](https://uniapp.dcloud.io/component/uniui/uni-drawer) +## 1.1.1(2021-07-30) +- 优化 vue3下事件警告的问题 ## 1.1.0(2021-07-13) - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) ## 1.0.7(2021-05-12) diff --git a/uni_modules/uni-drawer/package.json b/uni_modules/uni-drawer/package.json index 446171bc..bf28a5f8 100644 --- a/uni_modules/uni-drawer/package.json +++ b/uni_modules/uni-drawer/package.json @@ -1,7 +1,7 @@ { "id": "uni-drawer", "displayName": "uni-drawer 抽屉", - "version": "1.1.1", + "version": "1.2.0", "description": "抽屉式导航,用于展示侧滑菜单,侧滑导航。", "keywords": [ "uni-ui", @@ -41,7 +41,7 @@ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" }, "uni_modules": { - "dependencies": [], + "dependencies": ["uni-scss"], "encrypt": [], "platforms": { "cloud": { @@ -76,6 +76,10 @@ "快应用": { "华为": "u", "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" } } } diff --git a/uni_modules/uni-drawer/readme.md b/uni_modules/uni-drawer/readme.md index d4a8b15b..dcf6e6b2 100644 --- a/uni_modules/uni-drawer/readme.md +++ b/uni_modules/uni-drawer/readme.md @@ -4,83 +4,7 @@ > **组件名:uni-drawer** > 代码块: `uDrawer` - 抽屉侧滑菜单。 -> **注意事项** -> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 -> - `width` 属性仅在 `vue` 页面生效,`nvue` 页面因性能问题,不支持动态设置宽度,如需修改,请下载组件修改源码 - - -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - -### 基本用法 - - -在 ``template`` 中使用组件 - -```html - - - - + @@ -67,7 +68,7 @@ */ export default { name: 'UniFab', - emits:['fabClick','trigger'], + emits: ['fabClick', 'trigger'], props: { pattern: { type: Object, @@ -111,16 +112,17 @@ color: '#3c3e49', selectedColor: '#007AFF', backgroundColor: '#fff', - buttonColor: '#007AFF' + buttonColor: '#007AFF', + iconColor: '#fff' } } }, computed: { contentWidth(e) { - return (this.content.length + 1) * 55 + 10 + 'px' + return (this.content.length + 1) * 55 + 15 + 'px' }, contentWidthMin() { - return 55 + 'px' + return '55px' }, // 动态计算宽度 boxWidth() { @@ -159,9 +161,11 @@ } }, watch: { - pattern(newValue, oldValue) { - //console.log(JSON.stringify(newValue)) - this.styles = Object.assign({}, this.styles, newValue) + pattern: { + handler(val, oldVal) { + this.styles = Object.assign({}, this.styles, val) + }, + deep: true } }, created() { @@ -173,7 +177,7 @@ this.styles = Object.assign({}, this.styles, this.pattern) }, methods: { - _onClick() { + _onClick() { this.$emit('fabClick') if (!this.popMenu) { return @@ -214,6 +218,8 @@ diff --git a/uni_modules/uni-fav/package.json b/uni_modules/uni-fav/package.json index 05560867..b06d32d6 100644 --- a/uni_modules/uni-fav/package.json +++ b/uni_modules/uni-fav/package.json @@ -1,88 +1,89 @@ -{ - "id": "uni-fav", - "displayName": "uni-fav 收藏按钮", - "version": "1.1.1", - "description": " Fav 收藏组件,可自定义颜色、大小。", - "keywords": [ - "fav", - "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": { +{ + "id": "uni-fav", + "displayName": "uni-fav 收藏按钮", + "version": "1.2.0", + "description": " Fav 收藏组件,可自定义颜色、大小。", + "keywords": [ + "fav", + "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-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": "u" - } - } - } - } -} + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-fav/readme.md b/uni_modules/uni-fav/readme.md index 83a01fca..4de125d2 100644 --- a/uni_modules/uni-fav/readme.md +++ b/uni_modules/uni-fav/readme.md @@ -4,47 +4,7 @@ > **组件名:uni-fav** > 代码块: `uFav` - 用于收藏功能,可点击切换选中、不选中的状态。 -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - -### 基本用法 - -在 ``template`` 中使用组件 - -```html - - -``` - -## API - -### Fav Props - -|属性名 |类型 |默认值 |说明 | -|:-: |:-: |:-: |:-: | -|star |Boolean|true |按钮是否带星星 | -|bgColor |String |#eeeeee |未收藏时的背景色 | -|bgColorChecked |String |#007aff |已收藏时的背景色 | -|fgColor |String |#666666 |未收藏时的文字颜色 | -|fgColorChecked |String |#FFFFFF |已收藏时的文字颜色 | -|circle |Boolean|false |是否为圆角 | -|checked |Boolean|false |是否为已收藏 | -|contentText |Object |```{contentDefault: '收藏',contentFav: '已收藏'}```|收藏按钮文字 | - - -### Fav Events - -|事件称名 |说明 |返回值 | -|:-: |:-: |:-: | -|click |点击 fav按钮 触发事件 |- | - - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/fav/fav](https://hellouniapp.dcloud.net.cn/pages/extUI/fav/fav) \ No newline at end of file +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-fav) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-file-picker/changelog.md b/uni_modules/uni-file-picker/changelog.md index 18bbf0ac..f502152b 100644 --- a/uni_modules/uni-file-picker/changelog.md +++ b/uni_modules/uni-file-picker/changelog.md @@ -1,5 +1,6 @@ -## 0.2.15(2021-08-30) -- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug +## 1.0.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-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker) ## 0.2.14(2021-08-23) - 新增 参数中返回 fileID 字段 ## 0.2.13(2021-08-23) diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue index 6476ff7d..ba4d742e 100644 --- a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue +++ b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue @@ -278,6 +278,7 @@ files.push(Object.assign({}, v)) } }) + this.uploadFiles(files) }, async setValue(newVal, oldVal) { @@ -438,7 +439,7 @@ for (let i = 0; i < res.length; i++) { const item = res[i] const index = item.uuid ? this.files.findIndex(p => p.uuid === item.uuid) : item.index - + if (index === -1 || !this.files) break if (item.errMsg === 'request:fail') { this.files[index].url = item.path @@ -456,7 +457,7 @@ }else{ this.files[index].url = item.url } - + this.files[index].status = 'success' this.files[index].progress += 1 successData.push(this.files[index]) @@ -520,7 +521,7 @@ this.setEmit() }) }, - + /** * 获取文件名和后缀 * @param {Object} name @@ -541,7 +542,8 @@ let data = [] if (this.returnType === 'object') { data = this.backObject(this.files)[0] - this.localValue = data?data:null + this.localValue = {} + Object.assign(this.localValue, data) } else { data = this.backObject(this.files) if (!this.localValue) { diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue index 6b1741d9..51ace0b4 100644 --- a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue @@ -116,13 +116,15 @@ let { border } = this.styles - let obj = {} + let obj = {} + const widthDefaultValue = 1 + const radiusDefaultValue = 3 if (typeof border === 'boolean') { obj.border = border ? '1px #eee solid' : 'none' } else { - let width = (border && border.width) || 1 + let width = (border && border.width) || widthDefaultValue width = this.value2px(width) - let radius = (border && border.radius) || 5 + let radius = (border && border.radius) || radiusDefaultValue radius = this.value2px(radius) obj = { 'border-width': width, @@ -206,7 +208,7 @@ left: 0; margin: 5px; border: 1px #eee solid; - border-radius: 8px; + border-radius: 5px; overflow: hidden; } @@ -271,8 +273,8 @@ align-items: center; justify-content: center; position: absolute; - top: 5px; - right: 5px; + top: 3px; + right: 3px; height: 26px; width: 26px; border-radius: 50%; diff --git a/uni_modules/uni-file-picker/package.json b/uni_modules/uni-file-picker/package.json index 98f670bb..995e135c 100644 --- a/uni_modules/uni-file-picker/package.json +++ b/uni_modules/uni-file-picker/package.json @@ -1,7 +1,7 @@ { "id": "uni-file-picker", "displayName": "uni-file-picker 文件选择上传", - "version": "0.2.15", + "version": "1.0.0", "description": "文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间", "keywords": [ "uni-ui", @@ -40,7 +40,7 @@ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" }, "uni_modules": { - "dependencies": [], + "dependencies": ["uni-scss"], "encrypt": [], "platforms": { "cloud": { @@ -78,7 +78,7 @@ }, "Vue": { "vue2": "y", - "vue3": "u" + "vue3": "y" } } } diff --git a/uni_modules/uni-file-picker/readme.md b/uni_modules/uni-file-picker/readme.md index 496327b7..25519626 100644 --- a/uni_modules/uni-file-picker/readme.md +++ b/uni_modules/uni-file-picker/readme.md @@ -1,305 +1,11 @@ - -## FilePicker 文件选择上传 - -> **组件名:uni-file-picker** -> 代码块: `uFilePicker` - - -文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间 - -> **注意事项** -> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 -> - 组件需要依赖 `sass` 插件 ,请自行手动安装 -> - 如不绑定服务空间,`autoUpload`默认为`false`且不可更改 -> - 选择文件目前只支持 `H5` 和 `微信小程序平台` ,且 `微信小程序平台` 使用 `wx.chooseMessageFile()` -> - v-model 值需要自动上传成功后才会绑定值,一般只用来回显数据 -> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - - -## API - -### FilePicker Props - -| 属性名 | 类型 | 默认值 | 可选值 | 说明 | -| :-: | :-: | :-: | :-: | :-: | -| v-model/value | Array\Object | - | - | 组件数据,通常用来回显 ,类型由`return-type`属性决定 ,**格式见下文** | -| disabled | Boolean | false | - | 组件禁用 | -| readonly | Boolean | false | - | 组件只读,不可选择,不显示进度,不显示删除按钮 | -| return-type | String | array | array/object | 限制 `value` 格式,当为 `object` 时 ,组件只能单选,且会覆盖 | -| disable-preview| Boolean | false | - | 禁用图片预览,仅 `mode:grid`生效 | -| del-icon | Boolean | true | - | 是否显示删除按钮 | -| auto-upload | Boolean | true | - | 是否自动上传,值为`true`则只触发@select,可自行上传| -| limit | Number\String | 9 | - | 最大选择个数 ,h5 会自动忽略多选的部分 | -| title | String | - | - | 组件标题,右侧显示上传计数 | -| mode | String | list | list/grid | 选择文件后的文件列表样式 | -| file-mediatype| String | image | image/video/all | 选择文件类型,all 只支持 H5 和微信小程序平台 | -| file-extname | Array\String | - | - | 选择文件后缀,字符串的情况下需要用逗号分隔(推荐使用字符串),根据 `file-mediatype` 属性而不同| -| list-styles | Object | - | - | `mode:list` 时的样式 | -| image-styles | Object | - | - | `mode:grid` 时的样式 | - - -### value 格式 - -三个属性必填,否则影响组件显示 - -```json -[ - { - "name":"file.txt", - "extname":"txt", - "url":"https://xxxx", - // ... - } -] - -``` - -### list-styles 格式 - -```json -{ - "borderStyle":{ - "color":"#eee", // 边框颜色 - "width":"1px", // 边框宽度 - "style":"solid", // 边框样式 - "radius":"5px" // 边框圆角,不支持百分比 - }, - "border":false, // 是否显示边框 - "dividline":true // 是否显示分隔线 -} -``` - -### image-styles 格式 - -```json -{ - "height": 60, // 边框高度 - "width": 60, // 边框宽度 - "border":{ // 如果为 Boolean 值,可以控制边框显示与否 - "color":"#eee", // 边框颜色 - "width":"1px", // 边框宽度 - "style":"solid", // 边框样式 - "radius":"50%" // 边框圆角,支持百分比 - } -} -``` - -### FilePicker Events - -|事件称名 |说明 | 返回值 | -|:-: |:-: | :-: | -|@select | 选择文件后触发 | 见下文| -|@progress|文件上传时触发 | 见下文| -|@success |上传成功触发 | 见下文| -|@fail |上传失败触发 | 见下文| -|@delete |文件从列表移除时触发| 见下文| - - -#### Callback Params - -`**注意**:如果绑定的是腾讯云的服务空间 ,tempFilePaths 将返回 fileID` - -```json -{ - "progress" : Number, // 上传进度 ,仅 @progress 事件包含此字段 - "index" : Number, // 上传文件索引 ,仅 @progress 事件包含此字段 - "tempFile" : file, // 当前文件对象 ,包含文件流,文件大小,文件名称等,仅 @progress 事件包含此字段 - "tempFiles" : files, // 文件列表,包含文件流,文件大小,文件名称等 - "tempFilePaths" : filePaths, // 文件地址列表,@sucess 事件为上传后的线上文件地址 -} - -``` - - -### FilePicker Methods - -通过 `$ref` 调用 - -| 方法称名 | 说明 | 参数 | -| :-: | :-: | :-: | -| upload() | 手动上传 ,如`autoUpload`为`false` ,必须调用此方法| - | -| clearFiles(index:Number) | 清除选择结果| 传如 Number 为删除指定下标的文件 ,不传为删除所有| - -### FilePicker Slots - -插槽可定义上传按钮显示样式 - -| 插槽名 | 说明 | -| :-: | :-: | -| default |默认插槽| - -## 组件用法 - -### 基础用法 - -```html - -``` - -```javascript -export default { - data() { - return { - imageValue:[] - } - }, - methods:{ - // 获取上传状态 - select(e){ - console.log('选择文件:',e) - }, - // 获取上传进度 - progress(e){ - console.log('上传进度:',e) - }, - - // 上传成功 - success(e){ - console.log('上传成功') - }, - - // 上传失败 - fail(e){ - console.log('上传失败:',e) - } - } -} - -``` - -### 选择指定后缀图片,且限制选择个数 - -配置 `file-mediatype` 属性为 `image`,限定只选择图片 - -配置 `file-extname` 属性为 `'png,jpg'`,限定只选择 `png`和`jpg`后缀的图片 - -配置 `limit` 属性为 1 ,则最多选择一张图片 - -配置 `mode` 属性为 `grid` ,可以使用九宫格样式选择图片 - - -```html - -``` - -### 手动上传 - -配置 `auto-upload` 属性为 `false` ,可以停止自动上传,通过`ref`调用`upload`方法自行选择上传时机 - -```html - - - - -``` - -```javascript -export default { - data() {}, - methods:{ - upload(){ - this.$refs.files.upload() - } - } -} - -``` - -### 单选图片且点击再次选择 - -配置 `disable-preview` 属性为 `true`,禁用点击预览图片功能 - -配置 `del-icon` 属性为 `false`,隐藏删除按钮 - -配置 `return-type` 属性为 `object`,设置 `value` 类型 ,如需绑定 `array`类型 ,则设置`limit:1`,可达到一样的效果 - - - -```html -选择头像 -``` - -### 自定义样式 - -配置 `image-styles` 属性,可以自定义`mode:image`时的回显样式 - -配置 `list-styles` 属性,可以自定义`mode:video|| mode:all`时的回显样式 - -```html - - - - -``` - -```javascript -export default { - data() { - imageStyles:{ - width:64, - height:64, - border:{ - color:"#ff5a5f", - width:2, - style:'dashed', - radius:'2px' - } - }, - listStyles:{ - // 是否显示边框 - border: true, - // 是否显示分隔线 - dividline: true, - // 线条样式 - borderStyle: { - width:1, - color:'blue', - radius:2 - } - } - } -} - -``` - - - -### 使用插槽 - -使用默认插槽可以自定义选择文件按钮样式 - -```html - - - -``` - - - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/file-picker/file-picker](https://hellouniapp.dcloud.net.cn/pages/extUI/file-picker/file-picker) \ No newline at end of file + +## FilePicker 文件选择上传 + +> **组件名:uni-file-picker** +> 代码块: `uFilePicker` + + +文件选择上传组件,可以选择图片、视频等任意文件并上传到当前绑定的服务空间 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-forms/changelog.md b/uni_modules/uni-forms/changelog.md index 1d19e706..ef898247 100644 --- a/uni_modules/uni-forms/changelog.md +++ b/uni_modules/uni-forms/changelog.md @@ -1,5 +1,10 @@ -## 1.2.7(2021-08-13) -- 修复 没有添加校验规则的字段依然报错的Bug +## 1.3.1(2021-11-19) +- 修复 label 插槽不生效的bug +## 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-forms](https://uniapp.dcloud.io/component/uniui/uni-forms) +## 1.2.7(2021-08-13) +- 修复 没有添加校验规则的字段依然报错的Bug ## 1.2.6(2021-08-11) - 修复 重置表单错误信息无法清除的问题 ## 1.2.5(2021-08-11) diff --git a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue index b75459b3..b9eeb20d 100644 --- a/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue +++ b/uni_modules/uni-forms/components/uni-forms-item/uni-forms-item.vue @@ -427,8 +427,8 @@ export default { // margin-right: 5px; .label-text { - font-size: 14px; - color: #333; + font-size: 13px; + color: #666666; } .label-seat { margin-right: 5px; @@ -452,7 +452,7 @@ export default { // 必填 .is-required { // color: $uni-color-error; - color: #f00; + color: #dd524d; font-weight: bold; } @@ -465,7 +465,7 @@ export default { .uni-error-message-text { line-height: 22px; - color: $uni-color-error; + color: #dd524d; font-size: 12px; } @@ -476,7 +476,7 @@ export default { } .is-input-error-border { - border-color: $uni-color-error; + border-color: #dd524d; } .uni-forms-item--border { diff --git a/uni_modules/uni-forms/package.json b/uni_modules/uni-forms/package.json index d791aeb9..ee49d92b 100644 --- a/uni_modules/uni-forms/package.json +++ b/uni_modules/uni-forms/package.json @@ -1,7 +1,7 @@ { "id": "uni-forms", "displayName": "uni-forms 表单", - "version": "1.2.7", + "version": "1.3.1", "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", "keywords": [ "uni-ui", @@ -41,7 +41,8 @@ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" }, "uni_modules": { - "dependencies": [ + "dependencies": [ + "uni-scss", "uni-icons" ], "encrypt": [], @@ -81,7 +82,7 @@ }, "Vue": { "vue2": "y", - "vue3": "u" + "vue3": "y" } } } diff --git a/uni_modules/uni-forms/readme.md b/uni_modules/uni-forms/readme.md index e8352620..d3ad984a 100644 --- a/uni_modules/uni-forms/readme.md +++ b/uni_modules/uni-forms/readme.md @@ -1,830 +1,23 @@ - - -## Forms 表单 - -> **组件名:uni-forms** -> 代码块: `uForms`、`uni-forms-item` -> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。 - - -uni-app的内置组件已经有了 `
`组件,用于提交表单内容。 - -然而几乎每个表单都需要做表单验证,为了方便做表单验证,减少重复开发,`uni ui` 又基于 ``组件封装了 ``组件,内置了表单验证功能。 - -`` 提供了 `rules`属性来描述校验规则、``子组件来包裹具体的表单项,以及给原生或三方组件提供了 `binddata()` 来设置表单值。 - -每个要校验的表单项,不管input还是checkbox,都必须放在``组件中,且一个``组件只能放置一个表单项。 - -``组件内部预留了显示error message的区域,默认是在表单项的底部。 - -另外,``组件下面的各个表单项,可以通过``包裹为不同的分组。同一``下的不同表单项目将聚拢在一起,同其他group保持垂直间距。``仅影响视觉效果。 - -> **注意事项** -> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 -> - 组件需要依赖 `sass` 插件 ,请自行手动安装 -> - `resetFields` 方法不会重置原生组件和三方组件的值 -> - 如果配置 `validateTrigger` 属性为 `bind` 且表单域组件使用 `input` 事件触发会耗损部分性能,请谨慎使用 -> - 组件支持 nvue ,需要在 `manifest.json > app-plus` 节点下配置 `"nvueStyleCompiler" : "uni-app"` -> - uni-forms 中不包含其他表单组件,如需使用 uni-easyinput、uni-data-checkbox 等组件,需要自行引入 -> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - -### 基本用法 - -`uni-forms` 组件通常用来做表单校验和提交。每一个 `uni-forms-item` 是它的一个表单域组件,用来承载表单具体内容,`uni-forms-item` 中可以嵌套 `uni-easyinput`、`uni-data-checkbox` 和 uni-app内置的表单组件 ,不过 uni-app 的内置表单组件需要通过 `binddata` 或者 `uni-forms` 提供的 `setValue` 方法,将内容与 `uni-forms` 关联,才可完成表单的校验与提交(详见后文`表单校验` 部分) - -```html - -``` - -### 对齐方式 - -使用 `label-position` 属性可以设置所有表单域的位置,默认在左侧 - -```html - -``` - -## 表单校验 - -表单校验还可以直接通过 `uniCloud web 控制台` 快速根据 `schema` 自动生成表单维护界面,比如新建页面和编辑页面,自动处理校验规则,更多参考[DB Schema](https://uniapp.dcloud.io/uniCloud/schema) - -### 如何使用 - -1. `uni-forms` 需要通过 `rules` 属性传入约定的校验规则,详细描述下文`校验规则说明`。 -```html - - - ... - -``` - -2. `uni-forms` 需要绑定`modelValue`属性,值为表单的key\value 组成的对象。 -```html - - - ... - -``` - -3. `uni-forms-item` 需要设置 `name` 属性为当前字段名,字段为 `String` 类型而非变量。 -```html - - - - - - - - - -``` - -4. 如果使用`uni-easyinput` 和 `uni-data-checkbox` 等关联组件,只需绑定 v-model,无需其他操作。 -5. 如果使用原生 input、checkbox 或三方组件等,只需要给组件绑定 `binddata` 方法即可触发表单校验,无需绑定事件到 `methods` 中,见下方完整示例。 -6. `binddata('name',$event.detail.value,'form')"` 方法接受三个值, - - 第一个参数传入当前表单组件所在的 name,同当前父组件 `uni-forms-item` 绑定属性 `name` 的值 - - 第二个参数传入需要校验的值,内置组件可以通过 `$event.detail.value` 获取到组件的返回值,自定义组件传入需要校验的值即可 - - 第三个参数传入 `uni-forms` 组件绑定属性 `ref` 的值,通常在多表单的时候需要传入,用来区分表单,如页面中仅有一个 `uni-forms` 可忽略 -7. 如果内置 `binddata` 方法无法满足需求,在当前页面的 `methods` 中复写此方法即可,复写此方法需要调用 `uni-forms` 的 `setValue` 来触发表单校验,见下方 `setValue`方法说明 - -**完整示例** - -```html - - -``` - -```javascript -export default { - data() { - return { - // 表单数据 - formData: { - name: 'LiMing', - email: 'dcloud@email.com' - }, - rules: { - // 对name字段进行必填验证 - name: { - rules: [{ - required: true, - errorMessage: '请输入姓名', - }, - { - minLength: 3, - maxLength: 5, - errorMessage: '姓名长度在 {minLength} 到 {maxLength} 个字符', - } - ] - }, - // 对email字段进行必填验证 - email: { - rules: [{ - format: 'email', - errorMessage: '请输入正确的邮箱地址', - }] - } - } - } - }, - methods: { - /** - * 复写 binddata 方法,如果只是为了校验,无复杂自定义操作,可忽略此方法 - * @param {String} name 字段名称 - * @param {String} value 表单域的值 - */ - // binddata(name,value){ - // 通过 input 事件设置表单指定 name 的值 - // this.$refs.form.setValue(name, value) - // }, - // 触发提交表单 - submit() { - this.$refs.form.validate().then(res=>{ - console.log('表单数据信息:', res); - }).catch(err =>{ - console.log('表单错误信息:', err); - }) - } - } -} -``` - -> **注意** -> `modelValue` 对象目前有比较严格的格式要求: -> - 尽量不要使用嵌套的数据结构,因为表单域指定的`name`值与 modeValue 的 key 是一一对应的,只有一种情况例外,那就是动态校验表单,见下方`动态校验表单`章节 - - -### 校验规则说明 - -校验规则接受一个 `Object` 类型的值,通过传入不同的规则来表示每个表单域的值该如何校验 - -对象的 `key` 表示当前表单域的字段名,`value` 为具体的校验规则 - -以下为 `value` 所包含的内容: - -|属性名|类型|说明| -|:-:|:-:|:-:| -|rules|Array|校验规则,见下方 `rules 属性说明`| -|validateTrigger| String| 表单校验时机| -|label|String|当前表单域的字段中文名,多用于 `errorMessage` 的显示,可不填| - - -```javascript -rules: { - // 对name字段进行必填验证 - name: { - // name 字段的校验规则 - rules:[ - // 校验 name 不能为空 - { - required: true, - message: '请填写姓名', - }, - // 对name字段进行长度验证 - { - minLength: 3, - maxLength: 5, - message: '{label}长度在 {minLength} 到 {maxLength} 个字符', - } - ], - // 当前表单域的字段中文名,可不填写 - label:'姓名', - validateTrigger:'submit' - } -} - -``` - - -### rules 属性说明 -每一个验证规则中,可以配置多个属性,下面是一些常见规则属性。实际上这里的规范,与uniCloud的[DB Schema](https://uniapp.dcloud.io/uniCloud/schema?id=validator)规范相同。 - -|属性名|类型|默认值|可选值|说明 | -|:-:|:-:|:-:|:-:|:-:| -|required|Boolean|-|-|是否必填,配置此参数不会显示输入框左边的必填星号,如需要,请配置`uni-forms-item`组件的的required为true| -|range|Array|-|-|数组至少要有一个元素,且数组内的每一个元素都是唯一的。 | -|format|String|-|-|内置校验规则,如这些规则无法满足需求,可以使用正则匹配或者自定义规则 | -|pattern|RegExp|-|-|正则表达式,注意事项见下方说明| -|maximum|Number|-|-| 校验最大值(大于)| -|minimum|Number|-|-| 校验最小值(小于) | -|maxLength|Number|-|-| 校验数据最大长度 | -|errorMessage|String|-|-|校验失败提示信息语,可添加属性占位符,当前表格内属性都可用作占位符| -|trigger|String|bind| bind/submit|校验触发时机| -|validateFunction|Function|-|-|自定义校验规则 | - - -**format属性值说明** - -|属性名|说明| -|:-:|:-:| -|string|必须是 string 类型,默认类型| -|number|必须是 number 类型| -|boolean|必须是 boolean 类型| -|array|必须是 array 类型| -|object|必须是 object 类型| -|url|必须是 url 类型| -|email|必须是 email 类型| - - -> **pattern属性说明** -> 在小程序中,json 中不能使用正则对象,如:`/^\S+?@\S+?\.\S+?$/`,使用正则对象会被微信序列化,导致正则失效。 -> 所以建议统一使用字符串的方式来使用正则 ,如`'^\\S+?@\\S+?\\.\\S+?$'` ,需要注意 `\` 需要使用 `\\` 来转译。 -> 如验证邮箱:/^\S+?@\S+?\.\S+?$/ (注意不带引号),或使用 "^\\S+?@\\S+?\\.\\S+?$"(注意带引号需要使用 `\` 转义) - - - -### validateFunction 自定义校验规则使用说明 -`uni-forms` 的 `rules` 基础规则有时候不能满足项目的所有使用场景,这时候可以使用 `validateFunction` 来自定义校验规则 - -`validateFunction` 方法返回四个参数 `validateFunction:function(rule,value,data,callback){}` ,当然返回参数名开发者可以自定义: - - rule : 当前校验字段在 rules 中所对应的校验规则 - - value : 当前校验字段的值 - - data : 所有校验字段的字段和值的对象 - - callback : 校验完成时的回调,一般无需执行callback,返回true(校验通过)或者false(校验失败)即可 ,如果需要显示不同的 `errMessage`,如果校验不通过需要执行 callback('提示错误信息'),如果校验通过,执行callback()即可 - - -> **注意** -> 需要注意,如果需要使用 `validateFunction` 自定义校验规则,则不能采用 `uni-forms` 的 `rules` 属性来配置校验规则,这时候需要通过`ref`,在`onReady`生命周期调用组件的`setRules`方法绑定验证规则 -> 无法通过props传递变量,是因为微信小程序会过滤掉对象中的方法,导致自定义验证规则无效。 -> - - - - - -```html - - -``` - -```javascript -export default { - data() { - return { - formData:{ - - }, - rules: { - hobby: { - rules: [{ - required: true, - errorMessage: '请选择兴趣', - },{ - validateFunction:function(rule,value,data,callback){ - if (value.length < 2) { - callback('请至少勾选两个兴趣爱好') - } - return true - } - }] - } - } - } - }, - onReady() { - // 需要在onReady中设置规则 - this.$refs.form.setRules(this.rules) - }, - methods: { - submit(form) { - this.$refs.form.validate().then(res=>{ - console.log('表单数据信息:', res); - }).catch(err =>{ - console.log('表单错误信息:', err); - }) - } - } -} - -``` - - -### validateFunction 异步校验 - -上面的自定义校验方式为同步校验 ,如果需要异步校验,`validateFunction` 需要返回一个 `Promise` ,校验不通过 执行 `reject(new Error('错误信息'))` 返回对应的错误信息,如果校验通过则直接执行 `resolve()` 即可,在异步校验方法中,不需要使用 `callback` 。 - -```html - - -``` - -```javascript -export default { - data() { - return { - formData:{ - age:'' - }, - rules: { - age: { - rules: [{ - required: true, - errorMessage: '请输入年龄', - },{ - validateFunction: (rule, value, data, callback) => { - // 异步需要返回 Promise 对象 - return new Promise((resolve, reject) => { - setTimeout(() => { - if (value > 10 ) { - // 通过返回 resolve - resolve() - } else { - // 不通过返回 reject(new Error('错误信息')) - reject(new Error('年龄必须大于十岁')) - } - }, 2000) - }) - } - }] - } - } - } - }, - onReady() { - // 需要在onReady中设置规则 - this.$refs.form.setRules(this.rules) - }, - methods: { - /** - * 表单提交 - * @param {Object} event - */ - submit() { - uni.showLoading() - this.$refs.form.validate().then(res => { - uni.hideLoading() - console.log('表单数据信息:', res); - }).catch(err => { - uni.hideLoading() - console.log('表单错误信息:', err); - }) - } - } -} - -``` - - -### 动态表单校验 - -`uni-forms v1.0.44` 开始增加了动态校验表单的相关内容。 - -多用于同一个字段需要添加多次的场景,如需要动态创建多个域名参与检验。 - -1. 在 `formData` 中定义个变量用来接受同一个字段的多个结果。 -```javascript -dynamicFormData: { - email: '', - // domains 字段下会有多个结果 - domains: {} -} -``` - - -2. 使用 `uni-forms-item` 的 `rules` 属性定义单个表单域的校验规则。 -```html - - ... - -``` - -3. `name` 需要动态指定,格式为: `字段[唯一值]` -```html - - ... - -``` - -4. 需要绑定值的组件的 v-model 也需要动态指定,格式为:`数据源.字段[唯一值]` -```html - - - -``` - -**完整示例** - -```html - - - - - - - - - - - - - -``` - -```javascript -export default { - data() { - return { - // 数据源 - dynamicFormData: { - email: '', - domains: {} - }, - // 动态表单数据 - dynamicLists: [], - // 规则 - dynamicRules: { - email: { - rules: [{ - required: true, - errorMessage: '域名不能为空' - }, { - format: 'email', - errorMessage: '域名格式错误' - }] - } - } - } - }, - methods: { - // 新增表单域 - add() { - this.dynamicLists.push({ - label: '域名', - id: Date.now() - }) - }, - // 删除表单域 - del(id) { - let index = this.dynamicLists.findIndex(v => v.id === id) - this.dynamicLists.splice(index, 1) - }, - // 提交 - submit(ref) { - this.$refs[ref].validate((err,value)=>{ - console.log(err,value); - }) - }, - } -} - -// 返回值格式 ,根据自有业务,自行处理数据 -{ - emial:'', - domains:{ - id1:'', - id2:'', - ... - } -} -``` - - -### 表单校验时机说明 - -不管是在规则里还是`uni-forms`、`uni-forms-item`里,都有 `validateTrigger` 属性, `validateTrigger` 属性规定了表单校验时机,当前只有 `bind`、`submit` 两个值域 - -- `bind` : 数据绑定时触发校验,`uni-esayinput` 、`uni-data-checkbox` 组件表现为数据发生变化时。其他内置或三方组件为 `binddata` 事件执行时机 - -```html - - - -``` - -- `submit`: 只有提交表单才会触发表单校验 - - -对于表单校验时机,同时只会有一个 `validateTrigger` 发生作用,它的作用权重为 - -**`规则 > uni-forms-item > uni-forms `** - -- 如果规则里配置 `validateTrigger` ,则优先使用规则里的 `validateTrigger` 属性来决定表单校验时机 -- 如果规则里没有配置 `validateTrigger` ,则优先使用 `uni-forms-item` 的 `validateTrigger` 属性来决定表单校验时机 -- 如果 `uni-forms-item` 组件里没有配置 `validateTrigger` ,则优先使用 `uni-forms` 的 `validateTrigger` 属性来决定表单校验时机 -- 以此类推,如果都没有使用 `validateTrigger` 属性,则会使用 `uni-forms` 的 `validateTrigger` 属性默认值来决定表单校验时机 - - -## API - -### Forms Props - -|属性名|类型|默认值|可选值|说明| -|:-:|:-:|:-:|:-:|:-:| -|value [即将废弃]|Object|-|-| 表单数据| -|modelValue|Object|-|-| 表单数据| -|rules|Object|-|-|表单校验规则| -|validate-trigger|String|submit|bind/submit| 表单校验时机| -|label-position|String|left|top/left|label 位置| -|label-width|String/Number|75|-|label 宽度,单位 px| -|label-align|String|left| left/center/right|label 居中方式| -|err-show-type|String|undertext| undertext/toast/modal|表单错误信息提示方式| -|border|Boolean|false|-|是否显示分格线| - -### Forms Events - -|事件称名|说明| -|:-:|:-:| -|validate|任意表单项被校验后触发,返回表单校验信息| - -### Forms Methods - -|方法称名|说明| -|:-:| :-:| -|submit[即将废弃]| 对整个表单进行校验的方法,会返回一个 promise| -|validate|对整个表单进行校验的方法,会返回一个 promise| -|setValue|设置表单某一项 name 的对应值,通常在 uni-forms-item 和自定表单组件中使用| -|validateField|部分表单进行校验| -|clearValidate|移除表单的校验结果| -|resetFields|重置表单, 需要把 `uni-forms` 的`modelValue`属性改为 `v-model` ,且对内置组件可能不生效| - - - -### validate(keepItem:Array,callback:Function) 方法说明 -`validate` 方法是对整个表单进行校验,方法接受两个参数 - -|参数称名|类型|说明| -|:-:| :-:|:-:| -|keepItem|Array|保留不参与校验的字段| -|callback|Function|校验完成返回函数| - -校验成功后,校验对象只保留指定了`name`的字段(只要 ``uni-forms-item` 绑定了 `name`,哪怕不校验,也会返回),如果需要保留其他字段,则需要 `keepItem` 属性 - -```html - - - -``` - -```javascript -export default { - data() { - return { - formData:{ - age:'' - }, - rules: { - // ... - } - } - }, - onLoad(){ - this.formData.id = 'testId' - }, - methods: { - submit() { - // 在 onLoad 生命周期中,formData添加了一个 id 字段 ,此时这个字段是不参数校验的,所以结果中不返回 - // 在 validate(['id']) 方法中,指定第一个参数 ,即可返回id字段 - this.$refs.form.validate(['id'],(err,formData)=>{ - if(!err){ - console.log('success',formData) - } - }) - } - } -} - -``` - - -`validate` 方法还可以返回一个 `Promise` 对象,如果使用了 `callback` 则`Promise` 返回 `null`,`validate` 方法会优先使用 `callback`。 - -`callback` 方法会返回两个返回值 : -- 第一个返回值为检验结果,如果校验失败,则返回失败信息,如果成功,返回 `null` -- 第二个返回值校验数据 - - -```javascript - -// 使用 callback -// 如果不需要 keepItem 参数 ,则可以省略 -this.$refs.form.validate((err,formData)=>{ - // 如果校验成功 ,err 返回 null - if(!err){ - console.log('success',formData) - return - } - console.log('error',err) -}).then(res=>{ - // res 返回 null -}) - -// 使用 Promise -// 对整个表单进行校验,返回一个 Promise -this.$refs.form.validate().then((res)=>{ - // 成功返回,res 为表单数据 - // 其他逻辑处理 - // ... -}).catch((err)=>{ - // 表单校验验失败,err 为具体错误信息 - // 其他逻辑处理 - // ... -}) - -``` - -### setValue(name:String,value:any) 方法说明 - -`setValue` 方法通常用于内置组件或三方组件返回值的校验,因为`uni-esayinput` 等 uni 开头的组件内置了对 `uni-forms`的支持,所以这些组件返回的值可以直接使用,但是比如像`input` 这些内置组件值的变化,无法及时通知 `uni-forms` ,从而无法正常的校验,这时就需要我们手动将这些值加入到`uni-forms`的校验。 - -`setValue` 方法接受两个参数: -- name: 表单域对应的name -- value: 表单域对应的值 - -```html - - - -``` - -```javascript -export default { - data() { - return { - formData:{ - age:'' - }, - rules: { - // ... - } - } - }, - methods: { - setValue(name,value){ - // 设置表单某项对应得值来触发表单校验 - // 接受两个参数,第一个参数为表单域的 name ,第二个参数为表单域的值 - this.$refs.form.setValue(name,value) - }, - submit() { - this.$refs.form.validate(['id'],(err,formData)=>{ - if(!err){ - console.log('success',formData) - } - }) - } - } -} - -``` - -### 其他方法说明 - -```javascript - -// 部分表单进行校验,接受一个参数,类型为 String 或 Array ,只校验传入 name 表单域的值 -this.$refs.form.validateField(['name', 'email']).then((res)=>{ - // 成功返回,res 为对应表单数据 - // 其他逻辑处理 - // ... -}).catch((err)=>{ - // 表单校验验失败,err 为具体错误信息 - // 其他逻辑处理 - // ... -}) - -// 移除表单校验,接受一个参数,类型为 String 或 Array ,只移除传入 name 表单域的值,如果不传入参数,则移除所有 -this.$refs.form.clearValidate(['name', 'email']) - -``` - - -### FormsItem Props - -|属性名|类型|默认值|可选值 |说明| -|:-:|:-:|:-:|:-:|:-:| -|name|String|-|-|表单域的属性名,在使用校验规则时必填| -|required|Boolean|false|-|label 右边显示红色"*"号,样式显示不会对校验规则产生效果| -|validate-trigger|String|submit|bind/submit|表单校验时机| -|left-icon|String|-|-| label左边的图标,限uni-ui的图标名称| -|icon-color|String|#606266|-| 左边通过icon配置的图标的颜色| -|label|String|-|-| 输入框左边的文字提示| -|label-width|Number|70|-| label的宽度,单位px| -|label-align|String|left|left/center/right|label的文字对齐方式| -|label-position|String|left|top/left|label的文字的位置| -|error-message|String|-|-|显示的错误提示内容,如果为空字符串或者false,则不显示错误信息| - - -### FormsItem Slots -|插槽名|说明| -|:-:| :-:| -|default|默认插槽| -|left(已经失效,请使用label代替)|label插槽,自定义label显示内容| -|label|label插槽,自定义label显示内容| - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/forms/forms](https://hellouniapp.dcloud.net.cn/pages/extUI/forms/forms) \ No newline at end of file + + +## Forms 表单 + +> **组件名:uni-forms** +> 代码块: `uForms`、`uni-forms-item` +> 关联组件:`uni-forms-item`、`uni-easyinput`、`uni-data-checkbox`、`uni-group`。 + + +uni-app的内置组件已经有了 ``组件,用于提交表单内容。 + +然而几乎每个表单都需要做表单验证,为了方便做表单验证,减少重复开发,`uni ui` 又基于 ``组件封装了 ``组件,内置了表单验证功能。 + +`` 提供了 `rules`属性来描述校验规则、``子组件来包裹具体的表单项,以及给原生或三方组件提供了 `binddata()` 来设置表单值。 + +每个要校验的表单项,不管input还是checkbox,都必须放在``组件中,且一个``组件只能放置一个表单项。 + +``组件内部预留了显示error message的区域,默认是在表单项的底部。 + +另外,``组件下面的各个表单项,可以通过``包裹为不同的分组。同一``下的不同表单项目将聚拢在一起,同其他group保持垂直间距。``仅影响视觉效果。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-forms) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-goods-nav/changelog.md b/uni_modules/uni-goods-nav/changelog.md index b0212bbb..1fd27762 100644 --- a/uni_modules/uni-goods-nav/changelog.md +++ b/uni_modules/uni-goods-nav/changelog.md @@ -1,13 +1,16 @@ -## 1.1.1(2021-08-24) -- 新增 支持国际化 -## 1.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.7(2021-05-12) -- 新增 组件示例地址 -## 1.0.6(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.5(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.4(2021-02-05) -- 调整为uni_modules目录规范 +## 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-goods-nav](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 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-goods-nav/components/uni-goods-nav/i18n/en.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json index 4494f2a5..94f18684 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/en.json @@ -3,4 +3,4 @@ "uni-goods-nav.options.cart": "cart", "uni-goods-nav.buttonGroup.addToCart": "add to cart", "uni-goods-nav.buttonGroup.buyNow": "buy now" -} +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js index fa8f0f37..d2afd081 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/index.js @@ -5,4 +5,4 @@ export default { en, 'zh-Hans': zhHans, 'zh-Hant': zhHant -} +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json index 806913a7..84243b03 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hans.json @@ -3,4 +3,4 @@ "uni-goods-nav.options.cart": "购物车", "uni-goods-nav.buttonGroup.addToCart": "加入购物车", "uni-goods-nav.buttonGroup.buyNow": "立即购买" -} +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json index e862171d..bfd405e5 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/i18n/zh-Hant.json @@ -3,4 +3,4 @@ "uni-goods-nav.options.cart": "購物車", "uni-goods-nav.buttonGroup.addToCart": "加入購物車", "uni-goods-nav.buttonGroup.buyNow": "立即購買" -} +} diff --git a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue index e2a6baf2..cbe1532b 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue @@ -18,7 +18,7 @@ - {{ item.text }} @@ -63,12 +63,12 @@ default () { return [{ text: t("uni-goods-nav.buttonGroup.addToCart"), - backgroundColor: '#ffa200', + backgroundColor: 'linear-gradient(90deg, #FFCD1E, #FF8A18)', color: '#fff' }, { text: t("uni-goods-nav.buttonGroup.buyNow"), - backgroundColor: '#ff0000', + backgroundColor: 'linear-gradient(90deg, #FE6035, #EF1224)', color: '#fff' } ] @@ -164,7 +164,7 @@ .uni-tab__text { margin-top: 3px; - font-size: $uni-font-size-sm; + font-size: 12px; color: #646566; } @@ -182,7 +182,7 @@ } .uni-tab__cart-button-right-text { - font-size: $uni-font-size-base; + font-size: 14px; color: #fff; } @@ -221,12 +221,4 @@ // width: auto; border-radius: 15px; } - - .uni-tab__color-y { - background-color: #ffa200; - } - - .uni-tab__color-r { - background-color: #ff0000; - } diff --git a/uni_modules/uni-goods-nav/package.json b/uni_modules/uni-goods-nav/package.json index d7d56ee0..b3226dd6 100644 --- a/uni_modules/uni-goods-nav/package.json +++ b/uni_modules/uni-goods-nav/package.json @@ -1,87 +1,88 @@ -{ - "id": "uni-goods-nav", - "displayName": "uni-goods-nav 商品导航", - "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": { +{ + "id": "uni-goods-nav", + "displayName": "uni-goods-nav 商品导航", + "version": "1.2.0", + "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-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": "u" - } - } - } - } -} \ No newline at end of file + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-goods-nav/readme.md b/uni_modules/uni-goods-nav/readme.md index 4e47bfda..07df93f5 100644 --- a/uni_modules/uni-goods-nav/readme.md +++ b/uni_modules/uni-goods-nav/readme.md @@ -1,111 +1,10 @@ -### GoodsNav 商品导航 -*已经支持在nvue页面中使用* +## GoodsNav 商品导航 +> **组件名:uni-goods-nav** +> 代码块: `uGoodsNav` -商品加入购物车,立即购买,组件名:`uni-goods-nav`,代码块: uGoodsNav。 +商品加入购物车,立即购买等。 -### 使用方式 - -引用组件 - -```javascript -import uniGoodsNav from '@/components/uni-goods-nav/uni-goods-nav.vue' -export default { - components: {uniGoodsNav} -} -``` - -使用组件 - -```html - -``` - -```javascript -export default { - data () { - return { - options: [{ - icon: 'headphones', - text: '客服' - }, { - icon: 'shop', - text: '店铺', - info: 2, - infoBackgroundColor:'#007aff', - infoColor:"red" - }, { - icon: 'cart', - text: '购物车', - info: 2 - }], - buttonGroup: [{ - text: '加入购物车', - backgroundColor: '#ff0000', - color: '#fff' - }, - { - text: '立即购买', - backgroundColor: '#ffa200', - color: '#fff' - } - ] - } - }, - methods: { - onClick (e) { - uni.showToast({ - title: `点击${e.content.text}`, - icon: 'none' - }) - }, - buttonClick (e) { - console.log(e) - this.options[2].info++ - } - } -} -``` - -### 属性说明 - -|属性名 |类型 |默认值 |说明 | -|:-: |:-: |:-: |:-: | -|options |Array |- |组件参数 | -|buttonGroup|Array |- |组件按钮组参数 | -|fill |Boolean|false |按钮是否平铺 | - - -**options 参数说明:** - -|属性名 |类型 |默认值 |说明 | -|:-: |:-: |:-: |:-: | -|text |String |- |显示文字 | -|icon |String | |图标,[参考](https://ext.dcloud.net.cn/plugin?id=28) | -|info |Number |0 |右上角数字角标 | -|infoBackgroundColor|String |#ff0000|角标背景色 | -|infoColor |String |#fff |角标前景色 | - -**buttonGroup 参数说明:** - -|属性名 |类型 |默认值 |说明 | -|:-: |:-: |:-: |:-: | -|text |String |- |按钮文字 | -|backgroundColor |String |- |按钮背景色 | -|color |String |- |字体颜色 | - -### 事件说明 - -|事件名 |说明 |返回值 | -|:-: |:-: |:-: | -|@click |左侧点击事件 |e = {index,content}| -|@buttonClick |右侧按钮组点击事件 |e = {index,content}| - -### 插件预览地址 - -[https://uniapp.dcloud.io/h5/pages/extUI/goods-nav/goods-nav](https://uniapp.dcloud.io/h5/pages/extUI/goods-nav/goods-nav) - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/goods-nav/goods-nav](https://hellouniapp.dcloud.net.cn/pages/extUI/goods-nav/goods-nav) \ No newline at end of file +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-grid/changelog.md b/uni_modules/uni-grid/changelog.md index 8fc506d7..184941db 100644 --- a/uni_modules/uni-grid/changelog.md +++ b/uni_modules/uni-grid/changelog.md @@ -1,5 +1,10 @@ -## 1.3.1(2021-07-30) -- 优化 vue3下事件警告的问题 +## 1.4.0(2021-11-19) +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-grid](https://uniapp.dcloud.io/component/uniui/uni-grid) +## 1.3.2(2021-11-09) +- 新增 提供组件设计资源,组件样式调整 +## 1.3.1(2021-07-30) +- 优化 vue3下事件警告的问题 ## 1.3.0(2021-07-13) - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) ## 1.2.4(2021-05-12) diff --git a/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue index c63bbc2b..ab86a04e 100644 --- a/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue +++ b/uni_modules/uni-grid/components/uni-grid-item/uni-grid-item.vue @@ -94,34 +94,34 @@ .uni-grid-item--border { position: relative; /* #ifdef APP-NVUE */ - border-bottom-color: $uni-border-color; + border-bottom-color: #D2D2D2; border-bottom-style: solid; border-bottom-width: 0.5px; - border-right-color: $uni-border-color; + border-right-color: #D2D2D2; border-right-style: solid; border-right-width: 0.5px; /* #endif */ /* #ifndef APP-NVUE */ z-index: 0; - border-bottom: 1px $uni-border-color solid; - border-right: 1px $uni-border-color solid; + border-bottom: 1px #D2D2D2 solid; + border-right: 1px #D2D2D2 solid; /* #endif */ } .uni-grid-item--border-top { position: relative; /* #ifdef APP-NVUE */ - border-top-color: $uni-border-color; + border-top-color: #D2D2D2; border-top-style: solid; border-top-width: 0.5px; /* #endif */ /* #ifndef APP-NVUE */ - border-top: 1px $uni-border-color solid; + border-top: 1px #D2D2D2 solid; z-index: 0; /* #endif */ } .uni-highlight:active { - background-color: $uni-bg-color-hover; + background-color: #f1f1f1; } diff --git a/uni_modules/uni-grid/components/uni-grid/uni-grid.vue b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue index b7cc9a49..71edf41d 100644 --- a/uni_modules/uni-grid/components/uni-grid/uni-grid.vue +++ b/uni_modules/uni-grid/components/uni-grid/uni-grid.vue @@ -39,7 +39,7 @@ // 边框颜色 borderColor: { type: String, - default: '#e5e5e5' + default: '#D2D2D2' }, // 是否正方形显示,默认为 true square: { @@ -130,13 +130,13 @@ .uni-grid--border { position: relative; /* #ifdef APP-NVUE */ - border-left-color: $uni-border-color; + border-left-color: #D2D2D2; border-left-style: solid; border-left-width: 0.5px; /* #endif */ /* #ifndef APP-NVUE */ z-index: 1; - border-left: 1px $uni-border-color solid; + border-left: 1px #D2D2D2 solid; /* #endif */ } diff --git a/uni_modules/uni-grid/package.json b/uni_modules/uni-grid/package.json index 90306f59..c68c9524 100644 --- a/uni_modules/uni-grid/package.json +++ b/uni_modules/uni-grid/package.json @@ -1,7 +1,7 @@ { "id": "uni-grid", "displayName": "uni-grid 宫格", - "version": "1.3.1", + "version": "1.4.0", "description": "Grid 宫格组件,提供移动端常见的宫格布局,如九宫格。", "keywords": [ "uni-ui", @@ -40,7 +40,7 @@ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" }, "uni_modules": { - "dependencies": [], + "dependencies": ["uni-scss","uni-icons"], "encrypt": [], "platforms": { "cloud": { @@ -75,8 +75,12 @@ "快应用": { "华为": "u", "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" } } } } -} \ No newline at end of file +} diff --git a/uni_modules/uni-grid/readme.md b/uni_modules/uni-grid/readme.md index a7489547..0aa44cc1 100644 --- a/uni_modules/uni-grid/readme.md +++ b/uni_modules/uni-grid/readme.md @@ -7,89 +7,5 @@ 宫格组件。 -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - -> **注意事项** -> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 -> - 删除组件自带圆点角标效果,完全交给用户实现,示例有简单角标效果实现 -> - Grid 组件仅在自定义组件模式下支持 -> - column 属性最大值最好不要超过 5 个,如果超过,需要注意内容显示 -> - 支付宝小程序平台需要在支付宝小程序开发者工具里开启 component2 编译模式,开启方式: `详情 --> 项目配置 --> 启用 component2 编译` -> - 为了避免高度显示错误组件内必须要有内容 - - -### 基本用法 - -在 ``template`` 中使用组件 - -```html - - - - 文本 - - - 文本 - - - 文本 - - - - - - - 文本 - - - 文本 - - - 文本 - - - 文本 - - - 文本 - - - 文本 - - -``` - -## API - -### Grid Props - -**uni-grid 属性说明:** - -|属性名 |类型 |默认值 |说明 | -|:-: |:-: |:-: |:-: | -|column |Number |3 |每列显示个数 | -|borderColor|String |#d0dee5|边框颜色 | -|showBorder |Boolean|true |是否显示边框 | -|square |Boolean|true |是否方形显示 | -|highlight |Boolean|true |点击背景是否高亮 | - -### Grid Events -|事件名 |说明 |返回值 | -|:-: |:-: |:-: | -|@change|点击 grid 触发 |e={detail:{index:0}},index 为当前点击 gird 下标| - - -### GridItem Props - -|属性名|类型 |默认值 |说明 | -|:-: |:-: |:-: |:-: | -|index|Number |- |子组件的唯一标识 ,点击gird会返回当前的标识| - - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/grid/grid](https://hellouniapp.dcloud.net.cn/pages/extUI/grid/grid) \ No newline at end of file +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-grid) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-group/changelog.md b/uni_modules/uni-group/changelog.md index 6a36f7df..1c214187 100644 --- a/uni_modules/uni-group/changelog.md +++ b/uni_modules/uni-group/changelog.md @@ -1,6 +1,10 @@ -## 1.1.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -- 优化 组件文档 +## 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-group](https://uniapp.dcloud.io/component/uniui/uni-group) +## 1.1.7(2021-11-08) +## 1.1.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +- 优化 组件文档 ## 1.0.3(2021-05-12) - 新增 组件示例地址 ## 1.0.2(2021-02-05) diff --git a/uni_modules/uni-group/package.json b/uni_modules/uni-group/package.json index ec178634..cb1fece6 100644 --- a/uni_modules/uni-group/package.json +++ b/uni_modules/uni-group/package.json @@ -1,7 +1,7 @@ { "id": "uni-group", "displayName": "uni-group 分组", - "version": "1.1.0", + "version": "1.2.0", "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", "keywords": [ "uni-ui", @@ -41,7 +41,7 @@ "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" }, "uni_modules": { - "dependencies": [], + "dependencies": ["uni-scss"], "encrypt": [], "platforms": { "cloud": { @@ -76,6 +76,10 @@ "快应用": { "华为": "u", "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" } } } diff --git a/uni_modules/uni-group/readme.md b/uni_modules/uni-group/readme.md index deefb22c..59d70378 100644 --- a/uni_modules/uni-group/readme.md +++ b/uni_modules/uni-group/readme.md @@ -1,54 +1,9 @@ - - -### Group 分组 - -分组组件可用于将组件分组,添加间隔,以产生明显的区块,组件名:``uni-group``,代码块: uGroup。 - -### 平台差异说明 - -如无特殊说明,则全平台可用 - -### 组件使用注意事项 - -为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 - -- 组件需要依赖 `sass` 插件 ,请自行手动安装 -- 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 - - -### 安装方式 - -本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 - -如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) - - -### 使用方式 - -在 ``template`` 中使用组件 - -```html - - 分组1 的内容 - 分组1 的内容 - - - - 分组2 的内容 - 分组2 的内容 - -``` - -### 属性说明 - -|属性名|类型|默认值|说明| -|:-:|:-:|:-:|:-:| -|title|String|-|主标题| -|top|Number|-|分组间隔| -|mode|String|''|模式 ,card 为卡片模式| - - - -## 组件示例 - -点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/group/group](https://hellouniapp.dcloud.net.cn/pages/extUI/group/group) \ No newline at end of file + +## Group 分组 +> **组件名:uni-group** +> 代码块: `uGroup` + +分组组件可用于将组件分组,添加间隔,以产生明显的区块。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-group) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md index 4cde217b..2df458cc 100644 --- a/uni_modules/uni-icons/changelog.md +++ b/uni_modules/uni-icons/changelog.md @@ -1,8 +1,12 @@ -## 1.2.1(2021-09-17) -- 新增 支持使用 css 图标库扩展组件(仅 vue 支持) -## 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目录规范 +## 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 index 5242f227..2ba9c29a 100644 --- a/uni_modules/uni-icons/components/uni-icons/icons.js +++ b/uni_modules/uni-icons/components/uni-icons/icons.js @@ -1,132 +1,1115 @@ export default { - "pulldown": "\ue588", - "refreshempty": "\ue461", - "back": "\ue471", - "forward": "\ue470", - "more": "\ue507", - "more-filled": "\ue537", - "scan": "\ue612", - "qq": "\ue264", - "weibo": "\ue260", - "weixin": "\ue261", - "pengyouquan": "\ue262", - "loop": "\ue565", - "refresh": "\ue407", - "refresh-filled": "\ue437", - "arrowthindown": "\ue585", - "arrowthinleft": "\ue586", - "arrowthinright": "\ue587", - "arrowthinup": "\ue584", - "undo-filled": "\ue7d6", - "undo": "\ue406", - "redo": "\ue405", - "redo-filled": "\ue7d9", - "bars": "\ue563", - "chatboxes": "\ue203", - "camera": "\ue301", - "chatboxes-filled": "\ue233", - "camera-filled": "\ue7ef", - "cart-filled": "\ue7f4", - "cart": "\ue7f5", - "checkbox-filled": "\ue442", - "checkbox": "\ue7fa", - "arrowleft": "\ue582", - "arrowdown": "\ue581", - "arrowright": "\ue583", - "smallcircle-filled": "\ue801", - "arrowup": "\ue580", - "circle": "\ue411", - "eye-filled": "\ue568", - "eye-slash-filled": "\ue822", - "eye-slash": "\ue823", - "eye": "\ue824", - "flag-filled": "\ue825", - "flag": "\ue508", - "gear-filled": "\ue532", - "reload": "\ue462", - "gear": "\ue502", - "hand-thumbsdown-filled": "\ue83b", - "hand-thumbsdown": "\ue83c", - "hand-thumbsup-filled": "\ue83d", - "heart-filled": "\ue83e", - "hand-thumbsup": "\ue83f", - "heart": "\ue840", - "home": "\ue500", - "info": "\ue504", - "home-filled": "\ue530", - "info-filled": "\ue534", - "circle-filled": "\ue441", - "chat-filled": "\ue847", - "chat": "\ue263", - "mail-open-filled": "\ue84d", - "email-filled": "\ue231", - "mail-open": "\ue84e", - "email": "\ue201", - "checkmarkempty": "\ue472", - "list": "\ue562", - "locked-filled": "\ue856", - "locked": "\ue506", - "map-filled": "\ue85c", - "map-pin": "\ue85e", - "map-pin-ellipse": "\ue864", - "map": "\ue364", - "minus-filled": "\ue440", - "mic-filled": "\ue332", - "minus": "\ue410", - "micoff": "\ue360", - "mic": "\ue302", - "clear": "\ue434", - "smallcircle": "\ue868", - "close": "\ue404", - "closeempty": "\ue460", - "paperclip": "\ue567", - "paperplane": "\ue503", - "paperplane-filled": "\ue86e", - "person-filled": "\ue131", - "contact-filled": "\ue130", - "person": "\ue101", - "contact": "\ue100", - "images-filled": "\ue87a", - "phone": "\ue200", - "images": "\ue87b", - "image": "\ue363", - "image-filled": "\ue877", - "location-filled": "\ue333", - "location": "\ue303", - "plus-filled": "\ue439", - "plus": "\ue409", - "plusempty": "\ue468", - "help-filled": "\ue535", - "help": "\ue505", - "navigate-filled": "\ue884", - "navigate": "\ue501", - "mic-slash-filled": "\ue892", - "search": "\ue466", - "settings": "\ue560", - "sound": "\ue590", - "sound-filled": "\ue8a1", - "spinner-cycle": "\ue465", - "download-filled": "\ue8a4", - "personadd-filled": "\ue132", - "videocam-filled": "\ue8af", - "personadd": "\ue102", - "upload": "\ue402", - "upload-filled": "\ue8b1", - "starhalf": "\ue463", - "star-filled": "\ue438", - "star": "\ue408", - "trash": "\ue401", - "phone-filled": "\ue230", - "compose": "\ue400", - "videocam": "\ue300", - "trash-filled": "\ue8dc", - "download": "\ue403", - "chatbubble-filled": "\ue232", - "chatbubble": "\ue202", - "cloud-download": "\ue8e4", - "cloud-upload-filled": "\ue8e5", - "cloud-upload": "\ue8e6", - "cloud-download-filled": "\ue8e9", - "headphones":"\ue8bf", - "shop":"\ue609" -} + "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": "24923354", + "name": "arrowthinleft", + "font_class": "arrow-left", + "unicode": "e6bc", + "unicode_decimal": 59068 + }, + { + "icon_id": "24923355", + "name": "arrowthinup", + "font_class": "arrow-up", + "unicode": "e6bd", + "unicode_decimal": 59069 + }, + { + "icon_id": "24923356", + "name": "arrowthindown", + "font_class": "arrow-down", + "unicode": "e6be", + "unicode_decimal": 59070 + }, + { + "icon_id": "24923349", + "name": "arrowdown", + "font_class": "bottom", + "unicode": "e6b8", + "unicode_decimal": 59064 + }, + { + "icon_id": "24923346", + "name": "arrowright", + "font_class": "right", + "unicode": "e6b5", + "unicode_decimal": 59061 + }, + { + "icon_id": "24923347", + "name": "arrowup", + "font_class": "top", + "unicode": "e6b6", + "unicode_decimal": 59062 + }, + { + "icon_id": "24923348", + "name": "arrowleft", + "font_class": "left", + "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 index edd5f087..a9f271d7 100644 --- a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -1,14 +1,20 @@ - @@ -278,15 +284,17 @@ this.map = uni.createMapContext("map1", this); }, methods: { + // #ifndef MP-JD changeScale() { this.scale = this.scale == 9 ? 15 : 9; }, changeRotate() { this.rotate = this.rotate == 90 ? 0 : 90; }, - changeSkew() { - this.skew = this.skew == 30 ? 0 : 30; - }, + changeSkew() { + this.skew = this.skew == 30 ? 0 : 30; + }, + // #endif enableThreeD(e) { this.enable3D = e.detail.value; }, @@ -317,9 +325,11 @@ addPolyline() { this.polyline = testPolyline; }, + // #ifndef MP-JD addPolygons() { this.polygons = testPolygons; }, + // #endif addCircles() { this.circles = testCircles; }, @@ -346,6 +356,7 @@ } }) }, + // #ifndef MP-JD handleTranslateMarker() { this.map.translateMarker({ markerId: 1, @@ -361,6 +372,7 @@ }) }); }, + // #endif maptap(e) { uni.showModal({ content: JSON.stringify(e) diff --git a/pages/component/video/video.vue b/pages/component/video/video.vue index 64a78a7a..f8148598 100644 --- a/pages/component/video/video.vue +++ b/pages/component/video/video.vue @@ -6,7 +6,7 @@ - + diff --git a/pages/tabBar/API/API.nvue b/pages/tabBar/API/API.nvue index ceb342e4..47e2e744 100644 --- a/pages/tabBar/API/API.nvue +++ b/pages/tabBar/API/API.nvue @@ -178,6 +178,8 @@ name: '扫码', url: 'scan-code' }, + //#endif + //#ifndef H5 || MP-JD { name: '剪贴板', url: 'clipboard' @@ -189,11 +191,13 @@ url: 'brightness' }, // #endif - // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ|| MP-JD + // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ || MP-JD { name: '蓝牙', url: 'bluetooth' }, + // #endif + // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ { name: '生物认证', url: 'soter' @@ -205,16 +209,18 @@ url: 'ibeacon' }, // #endif - // #ifndef H5 - { - name: '监听加速度传感器', - url: 'on-accelerometer-change' - }, - { - name: '监听罗盘数据', - url: 'on-compass-change' - }, - // #endif + // #ifndef H5 + { + name: '监听加速度传感器', + url: 'on-accelerometer-change' + }, + // #endif + // #ifndef H5 || MP-JD + { + name: '监听罗盘数据', + url: 'on-compass-change' + }, + // #endif //#ifdef APP-PLUS { name: '监听距离传感器', diff --git a/pages/tabBar/component/component.nvue b/pages/tabBar/component/component.nvue index 87390be5..c33d4a0e 100644 --- a/pages/tabBar/component/component.nvue +++ b/pages/tabBar/component/component.nvue @@ -118,7 +118,7 @@ }] }, // #endif - // #ifndef APP-PLUS || H5 || MP-LARK + // #ifndef APP-PLUS || H5 || MP-LARK || MP-JD { id: 'web-view', name: '网页', @@ -126,7 +126,7 @@ pages: ['web-view'] }, // #endif - // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW || MP-LARK + // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW || MP-LARK || MP-JD { id: 'ad', url: 'ad', diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index cb9e4919..3180b120 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -89,7 +89,6 @@ name: "uni-fav 收藏按钮", url: "fav" }, - // #ifndef APP-NVUE { name: "uni-file-picker 文件选择上传", @@ -128,10 +127,12 @@ name: "uni-list 列表", url: "list" }, + // #ifndef MP-JD { name: "uni-load-more 加载更多", url: "load-more" }, + // #endif { name: "uni-nav-bar 自定义导航栏", url: "nav-bar" @@ -164,7 +165,6 @@ name: "uni-search-bar 搜索栏", url: "search-bar" }, - // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ { name: "section 标题栏", @@ -187,7 +187,6 @@ name: "uni-swiper-dot 轮播图指示点", url: "swiper-dot" }, - // #ifndef APP-NVUE || MP-TOUTIAO || MP-BAIDU { name: "uni-table 表格", From 3666928e2ec895aee794bce89822d0c5fc7417c0 Mon Sep 17 00:00:00 2001 From: anne-lxm <1076217653@qq.com> Date: Wed, 12 Jan 2022 20:33:41 +0800 Subject: [PATCH 225/378] =?UTF-8?q?add:=20=E9=80=82=E9=85=8D=E4=BA=AC?= =?UTF-8?q?=E4=B8=9C=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/API/animation/animation.vue | 2 +- pages/API/login/login.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/API/animation/animation.vue b/pages/API/animation/animation.vue index 1c7a0d8a..3b8c9a5d 100644 --- a/pages/API/animation/animation.vue +++ b/pages/API/animation/animation.vue @@ -110,7 +110,7 @@ .animation-buttons { padding:30rpx 0; width: 100%; - height: 360rpx; + /* height: 360rpx; */ } .animation-button { diff --git a/pages/API/login/login.vue b/pages/API/login/login.vue index 0f958b3c..5cd7d0bf 100644 --- a/pages/API/login/login.vue +++ b/pages/API/login/login.vue @@ -22,7 +22,7 @@ - + From 6db79da0e8beba0fea9616302365ce38ec57ad14 Mon Sep 17 00:00:00 2001 From: anne-lxm <1076217653@qq.com> Date: Mon, 10 Jan 2022 17:29:35 +0800 Subject: [PATCH 226/378] =?UTF-8?q?add:=20=E9=80=82=E9=85=8D=E4=BA=AC?= =?UTF-8?q?=E4=B8=9C=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../API/get-network-type/get-network-type.vue | 2 +- pages/API/get-user-info/get-user-info.vue | 17 ++++++----- pages/API/map/map.nvue | 20 ++++++++++--- pages/component/video/video.vue | 2 +- pages/tabBar/API/API.nvue | 28 +++++++++++-------- pages/tabBar/component/component.nvue | 4 +-- pages/tabBar/extUI/extUI.nvue | 5 ++-- 7 files changed, 49 insertions(+), 29 deletions(-) diff --git a/pages/API/get-network-type/get-network-type.vue b/pages/API/get-network-type/get-network-type.vue index 1076676a..3e9cf725 100644 --- a/pages/API/get-network-type/get-network-type.vue +++ b/pages/API/get-network-type/get-network-type.vue @@ -58,7 +58,7 @@ this.networkType = '', this.connectedWifi = '' }, - // #ifdef MP-WEIXIN + // #ifdef MP-WEIXIN || MP-JD getConnectedWifi() { const that = this uni.startWifi({ diff --git a/pages/API/get-user-info/get-user-info.vue b/pages/API/get-user-info/get-user-info.vue index a096b16e..42848417 100644 --- a/pages/API/get-user-info/get-user-info.vue +++ b/pages/API/get-user-info/get-user-info.vue @@ -9,9 +9,9 @@ - {{userInfo.nickName || userInfo.email || userInfo.phoneNumber}} - - + {{userInfo.nickName || userInfo.nickname || userInfo.gender || userInfo.email || userInfo.phoneNumber}} + + @@ -140,10 +140,13 @@ return; } this.hasUserInfo = true; - this.userInfo = result.detail.userInfo; - // #ifdef MP-JD - this.userInfo = result.detail.user_info; - // #endif + if(result.detail && result.detail.userInfo){ + this.userInfo = result.detail.userInfo; + }else{ + // #ifdef MP-JD + this.userInfo = result.detail.user_info; + // #endif + } }, clear() { this.hasUserInfo = false; diff --git a/pages/API/map/map.nvue b/pages/API/map/map.nvue index 6213a8e2..131a2350 100644 --- a/pages/API/map/map.nvue +++ b/pages/API/map/map.nvue @@ -40,17 +40,23 @@ 是否开启实时路况 --> + - + + + + + + @@ -278,15 +284,17 @@ this.map = uni.createMapContext("map1", this); }, methods: { + // #ifndef MP-JD changeScale() { this.scale = this.scale == 9 ? 15 : 9; }, changeRotate() { this.rotate = this.rotate == 90 ? 0 : 90; }, - changeSkew() { - this.skew = this.skew == 30 ? 0 : 30; - }, + changeSkew() { + this.skew = this.skew == 30 ? 0 : 30; + }, + // #endif enableThreeD(e) { this.enable3D = e.detail.value; }, @@ -317,9 +325,11 @@ addPolyline() { this.polyline = testPolyline; }, + // #ifndef MP-JD addPolygons() { this.polygons = testPolygons; }, + // #endif addCircles() { this.circles = testCircles; }, @@ -346,6 +356,7 @@ } }) }, + // #ifndef MP-JD handleTranslateMarker() { this.map.translateMarker({ markerId: 1, @@ -361,6 +372,7 @@ }) }); }, + // #endif maptap(e) { uni.showModal({ content: JSON.stringify(e) diff --git a/pages/component/video/video.vue b/pages/component/video/video.vue index 64a78a7a..f8148598 100644 --- a/pages/component/video/video.vue +++ b/pages/component/video/video.vue @@ -6,7 +6,7 @@ - + diff --git a/pages/tabBar/API/API.nvue b/pages/tabBar/API/API.nvue index ceb342e4..47e2e744 100644 --- a/pages/tabBar/API/API.nvue +++ b/pages/tabBar/API/API.nvue @@ -178,6 +178,8 @@ name: '扫码', url: 'scan-code' }, + //#endif + //#ifndef H5 || MP-JD { name: '剪贴板', url: 'clipboard' @@ -189,11 +191,13 @@ url: 'brightness' }, // #endif - // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ|| MP-JD + // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ || MP-JD { name: '蓝牙', url: 'bluetooth' }, + // #endif + // #ifdef APP-PLUS || MP-WEIXIN || MP-QQ { name: '生物认证', url: 'soter' @@ -205,16 +209,18 @@ url: 'ibeacon' }, // #endif - // #ifndef H5 - { - name: '监听加速度传感器', - url: 'on-accelerometer-change' - }, - { - name: '监听罗盘数据', - url: 'on-compass-change' - }, - // #endif + // #ifndef H5 + { + name: '监听加速度传感器', + url: 'on-accelerometer-change' + }, + // #endif + // #ifndef H5 || MP-JD + { + name: '监听罗盘数据', + url: 'on-compass-change' + }, + // #endif //#ifdef APP-PLUS { name: '监听距离传感器', diff --git a/pages/tabBar/component/component.nvue b/pages/tabBar/component/component.nvue index 87390be5..c33d4a0e 100644 --- a/pages/tabBar/component/component.nvue +++ b/pages/tabBar/component/component.nvue @@ -118,7 +118,7 @@ }] }, // #endif - // #ifndef APP-PLUS || H5 || MP-LARK + // #ifndef APP-PLUS || H5 || MP-LARK || MP-JD { id: 'web-view', name: '网页', @@ -126,7 +126,7 @@ pages: ['web-view'] }, // #endif - // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW || MP-LARK + // #ifndef H5 || MP-BAIDU || QUICKAPP-WEBVIEW || MP-LARK || MP-JD { id: 'ad', url: 'ad', diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index cb9e4919..3180b120 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -89,7 +89,6 @@ name: "uni-fav 收藏按钮", url: "fav" }, - // #ifndef APP-NVUE { name: "uni-file-picker 文件选择上传", @@ -128,10 +127,12 @@ name: "uni-list 列表", url: "list" }, + // #ifndef MP-JD { name: "uni-load-more 加载更多", url: "load-more" }, + // #endif { name: "uni-nav-bar 自定义导航栏", url: "nav-bar" @@ -164,7 +165,6 @@ name: "uni-search-bar 搜索栏", url: "search-bar" }, - // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ { name: "section 标题栏", @@ -187,7 +187,6 @@ name: "uni-swiper-dot 轮播图指示点", url: "swiper-dot" }, - // #ifndef APP-NVUE || MP-TOUTIAO || MP-BAIDU { name: "uni-table 表格", From 14ccb3dd0de50ab2cb978388f619287216492b77 Mon Sep 17 00:00:00 2001 From: anne-lxm <1076217653@qq.com> Date: Wed, 12 Jan 2022 20:33:41 +0800 Subject: [PATCH 227/378] =?UTF-8?q?add:=20=E9=80=82=E9=85=8D=E4=BA=AC?= =?UTF-8?q?=E4=B8=9C=E5=B0=8F=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/API/animation/animation.vue | 2 +- pages/API/login/login.vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/API/animation/animation.vue b/pages/API/animation/animation.vue index 1c7a0d8a..3b8c9a5d 100644 --- a/pages/API/animation/animation.vue +++ b/pages/API/animation/animation.vue @@ -110,7 +110,7 @@ .animation-buttons { padding:30rpx 0; width: 100%; - height: 360rpx; + /* height: 360rpx; */ } .animation-button { diff --git a/pages/API/login/login.vue b/pages/API/login/login.vue index 0f958b3c..5cd7d0bf 100644 --- a/pages/API/login/login.vue +++ b/pages/API/login/login.vue @@ -22,7 +22,7 @@ - + From 5e0f4c3453faffb8757b749489ce571f5733c586 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Wed, 26 Jan 2022 14:51:34 +0800 Subject: [PATCH 228/378] bump hello-uniapp from 3.3.0 to 3.3.1 --- changelog.md | 18 + manifest.json | 2 +- package.json | 2 +- pages.json | 63 +- static/icons/badge.png | Bin 0 -> 677 bytes static/icons/button.png | Bin 0 -> 3465 bytes static/icons/calendar.png | Bin 0 -> 735 bytes static/icons/card.png | Bin 0 -> 429 bytes static/icons/collapse.png | Bin 0 -> 802 bytes static/icons/color.png | Bin 0 -> 4635 bytes static/icons/combox.png | Bin 0 -> 828 bytes static/icons/countdown.png | Bin 0 -> 1527 bytes static/icons/data-checkbox.png | Bin 0 -> 1888 bytes static/icons/data-picker.png | Bin 0 -> 588 bytes static/icons/dateformat.png | Bin 0 -> 879 bytes static/icons/datetime-picker.png | Bin 0 -> 1779 bytes static/icons/drawer.png | Bin 0 -> 686 bytes static/icons/easyinput.png | Bin 0 -> 465 bytes static/icons/fab.png | Bin 0 -> 1303 bytes static/icons/fav.png | Bin 0 -> 1480 bytes static/icons/file-picker.png | Bin 0 -> 1017 bytes static/icons/font.png | Bin 0 -> 3816 bytes static/icons/forms.png | Bin 0 -> 801 bytes static/icons/goods-nav.png | Bin 0 -> 902 bytes static/icons/grid.png | Bin 0 -> 412 bytes static/icons/group.png | Bin 0 -> 948 bytes static/icons/icons.png | Bin 0 -> 1199 bytes static/icons/indexed-list.png | Bin 0 -> 1620 bytes static/icons/link.png | Bin 0 -> 1670 bytes static/icons/list.png | Bin 0 -> 534 bytes static/icons/load-more.png | Bin 0 -> 1342 bytes static/icons/nav-bar.png | Bin 0 -> 716 bytes static/icons/notice-bar.png | Bin 0 -> 981 bytes static/icons/number-box.png | Bin 0 -> 455 bytes static/icons/pagination.png | Bin 0 -> 943 bytes static/icons/popup.png | Bin 0 -> 980 bytes static/icons/radius.png | Bin 0 -> 1249 bytes static/icons/rate.png | Bin 0 -> 1624 bytes static/icons/row.png | Bin 0 -> 400 bytes static/icons/search-bar.png | Bin 0 -> 1249 bytes static/icons/section.png | Bin 0 -> 541 bytes static/icons/segmented-control.png | Bin 0 -> 624 bytes static/icons/space.png | Bin 0 -> 4175 bytes static/icons/steps.png | Bin 0 -> 1203 bytes static/icons/swipe-action.png | Bin 0 -> 1660 bytes static/icons/swiper-dot.png | Bin 0 -> 1023 bytes static/icons/tag.png | Bin 0 -> 569 bytes static/icons/title.png | Bin 0 -> 364 bytes static/icons/transition.png | Bin 0 -> 1415 bytes static/image/uniui-header-bg.png | Bin 0 -> 259722 bytes static/image/uniui-logo.png | Bin 0 -> 3294 bytes uni_modules/uni-card/changelog.md | 26 +- .../uni-card/components/uni-card/uni-card.vue | 3 +- uni_modules/uni-card/package.json | 178 +- uni_modules/uni-collapse/changelog.md | 58 +- .../uni-collapse-item/uni-collapse-item.vue | 58 +- .../components/uni-collapse/uni-collapse.vue | 19 +- uni_modules/uni-collapse/package.json | 174 +- uni_modules/uni-collapse/readme.md | 20 +- uni_modules/uni-combox/changelog.md | 8 +- .../components/uni-combox/uni-combox.vue | 131 +- uni_modules/uni-combox/package.json | 4 +- uni_modules/uni-combox/readme.md | 20 +- uni_modules/uni-countdown/changelog.md | 38 +- .../uni-countdown/uni-countdown.vue | 33 +- uni_modules/uni-countdown/package.json | 170 +- uni_modules/uni-data-picker/changelog.md | 44 +- .../uni-data-picker/uni-data-picker.vue | 6 +- .../uni-data-pickerview/uni-data-picker.js | 92 +- .../uni-data-pickerview.vue | 555 ++-- uni_modules/uni-data-picker/package.json | 3 +- uni_modules/uni-data-picker/readme.md | 42 +- uni_modules/uni-datetime-picker/changelog.md | 160 +- .../uni-datetime-picker/keypress.js | 88 +- .../uni-datetime-picker.vue | 10 +- .../components/uni-datetime-picker/util.js | 9 +- uni_modules/uni-datetime-picker/package.json | 178 +- uni_modules/uni-datetime-picker/readme.md | 38 +- uni_modules/uni-drawer/changelog.md | 2 + .../components/uni-drawer/uni-drawer.vue | 5 +- uni_modules/uni-drawer/package.json | 2 +- uni_modules/uni-fab/changelog.md | 22 +- .../uni-fab/components/uni-fab/uni-fab.vue | 18 +- uni_modules/uni-fab/package.json | 174 +- uni_modules/uni-fab/readme.md | 14 +- uni_modules/uni-file-picker/changelog.md | 6 + .../uni-file-picker/uni-file-picker.vue | 14 +- uni_modules/uni-file-picker/package.json | 2 +- uni_modules/uni-forms/changelog.md | 108 +- .../uni-forms-item/uni-forms-item.vue | 72 +- .../components/uni-forms/uni-forms.vue | 8 +- uni_modules/uni-forms/package.json | 178 +- uni_modules/uni-forms/readme.md | 42 +- uni_modules/uni-group/changelog.md | 2 + .../components/uni-group/uni-group.vue | 8 +- uni_modules/uni-group/package.json | 2 +- uni_modules/uni-icons/changelog.md | 22 +- .../uni-icons/components/uni-icons/icons.js | 2284 +++++++++-------- .../components/uni-icons/uni-icons.vue | 13 +- .../components/uni-icons/uniicons.css | 1294 +++++----- uni_modules/uni-icons/package.json | 170 +- uni_modules/uni-icons/readme.md | 12 +- uni_modules/uni-indexed-list/changelog.md | 2 + .../uni-indexed-list-item.vue | 4 +- uni_modules/uni-indexed-list/package.json | 2 +- uni_modules/uni-list/changelog.md | 7 +- .../uni-list-chat/uni-list-chat.vue | 6 +- .../uni-list-item/uni-list-item.vue | 21 +- .../uni-list - \345\211\257\346\234\254.vue" | 106 + .../uni-list/components/uni-list/uni-list.vue | 4 +- uni_modules/uni-list/package.json | 4 +- uni_modules/uni-list/readme.md | 692 ++--- uni_modules/uni-load-more/changelog.md | 26 +- .../uni-load-more/uni-load-more.vue | 41 +- uni_modules/uni-load-more/package.json | 170 +- uni_modules/uni-nav-bar/changelog.md | 53 +- .../components/uni-nav-bar/uni-nav-bar.vue | 221 +- .../components/uni-nav-bar/uni-status-bar.vue | 10 +- uni_modules/uni-nav-bar/package.json | 174 +- uni_modules/uni-number-box/changelog.md | 2 + .../uni-number-box/uni-number-box.vue | 2 +- uni_modules/uni-number-box/package.json | 2 +- uni_modules/uni-pagination/changelog.md | 2 + .../uni-pagination/uni-pagination.vue | 21 +- uni_modules/uni-pagination/package.json | 2 +- uni_modules/uni-popup/changelog.md | 86 +- .../uni-popup-dialog/uni-popup-dialog.vue | 22 +- .../uni-popup-message/uni-popup-message.vue | 42 +- .../uni-popup-share/uni-popup-share.vue | 4 +- .../components/uni-popup/uni-popup.vue | 138 +- uni_modules/uni-popup/package.json | 178 +- uni_modules/uni-scss/changelog.md | 6 + uni_modules/uni-scss/index.scss | 2 +- uni_modules/uni-scss/package.json | 164 +- uni_modules/uni-scss/readme.md | 6 +- uni_modules/uni-scss/styles/index.scss | 14 +- .../uni-scss/styles/setting/_border.scss | 4 +- .../uni-scss/styles/setting/_color.scss | 132 +- .../uni-scss/styles/setting/_radius.scss | 110 +- .../uni-scss/styles/setting/_space.scss | 110 +- .../uni-scss/styles/setting/_styles.scss | 334 +-- .../uni-scss/styles/setting/_text.scss | 48 +- .../uni-scss/styles/setting/_variables.scss | 291 +-- .../uni-scss/styles/tools/functions.scss | 38 +- uni_modules/uni-scss/theme.scss | 62 +- uni_modules/uni-scss/variables.scss | 124 +- uni_modules/uni-steps/changelog.md | 2 + .../components/uni-steps/uni-steps.vue | 2 +- uni_modules/uni-steps/package.json | 2 +- uni_modules/uni-transition/changelog.md | 10 +- .../uni-transition/uni-transition.vue | 2 +- uni_modules/uni-transition/package.json | 2 +- uni_modules/uni-transition/readme.md | 20 +- .../uni-upgrade-center-app/changelog.md | 66 +- .../images/app_update_close.png | Bin 0 -> 7644 bytes .../uni-upgrade-center-app/images/bg_top.png | Bin 0 -> 30486 bytes .../uni-upgrade-center-app/package.json | 167 +- .../pages/upgrade-popup.vue | 984 +++---- .../uni-upgrade-center-app/pages_init.json | 34 +- uni_modules/uni-upgrade-center-app/readme.md | 234 +- .../check-version/check-version.param.json | 18 +- .../cloudfunctions/check-version/index.js | 334 +-- .../utils/call-check-version.js | 58 +- .../utils/check-update.js | 308 +-- windows/top-window.vue | 277 +- 165 files changed, 6680 insertions(+), 6053 deletions(-) create mode 100644 static/icons/badge.png create mode 100644 static/icons/button.png create mode 100644 static/icons/calendar.png create mode 100644 static/icons/card.png create mode 100644 static/icons/collapse.png create mode 100644 static/icons/color.png create mode 100644 static/icons/combox.png create mode 100644 static/icons/countdown.png create mode 100644 static/icons/data-checkbox.png create mode 100644 static/icons/data-picker.png create mode 100644 static/icons/dateformat.png create mode 100644 static/icons/datetime-picker.png create mode 100644 static/icons/drawer.png create mode 100644 static/icons/easyinput.png create mode 100644 static/icons/fab.png create mode 100644 static/icons/fav.png create mode 100644 static/icons/file-picker.png create mode 100644 static/icons/font.png create mode 100644 static/icons/forms.png create mode 100644 static/icons/goods-nav.png create mode 100644 static/icons/grid.png create mode 100644 static/icons/group.png create mode 100644 static/icons/icons.png create mode 100644 static/icons/indexed-list.png create mode 100644 static/icons/link.png create mode 100644 static/icons/list.png create mode 100644 static/icons/load-more.png create mode 100644 static/icons/nav-bar.png create mode 100644 static/icons/notice-bar.png create mode 100644 static/icons/number-box.png create mode 100644 static/icons/pagination.png create mode 100644 static/icons/popup.png create mode 100644 static/icons/radius.png create mode 100644 static/icons/rate.png create mode 100644 static/icons/row.png create mode 100644 static/icons/search-bar.png create mode 100644 static/icons/section.png create mode 100644 static/icons/segmented-control.png create mode 100644 static/icons/space.png create mode 100644 static/icons/steps.png create mode 100644 static/icons/swipe-action.png create mode 100644 static/icons/swiper-dot.png create mode 100644 static/icons/tag.png create mode 100644 static/icons/title.png create mode 100644 static/icons/transition.png create mode 100644 static/image/uniui-header-bg.png create mode 100644 static/image/uniui-logo.png create mode 100644 "uni_modules/uni-list/components/uni-list/uni-list - \345\211\257\346\234\254.vue" create mode 100644 uni_modules/uni-upgrade-center-app/images/app_update_close.png create mode 100644 uni_modules/uni-upgrade-center-app/images/bg_top.png diff --git a/changelog.md b/changelog.md index 9602e42f..3ed2d54b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,21 @@ +## 3.3.1(2022-01-04) +- 新增 同步 uni-ui@1.4.11 + - uni-collapse 修复 微信小程序resize后组件收起的bug + - uni-countdown 修复 在微信小程序中样式不生效的bug + - uni-countdown 新增 update 方法 ,在动态更新时间后,刷新组件 + - uni-load-more 新增 showText属性 ,是否显示文本 + - uni-load-more 修复 nvue 平台下不显示文本的bug + - uni-load-more 修复 微信小程序平台样式选择器报警告的问题 + - uni-nav-bar 修复 在vue下,标题不垂直居中的bug + - uni-nav-bar 修复 height 属性类型错误 + - uni-nav-bar 新增 height 属性,可修改组件高度 + - uni-nav-bar 新增 dark 属性可可开启暗黑模式 + - uni-nav-bar 优化 标题字数过多显示省略号 + - uni-nav-bar 优化 插槽,插入内容可完全覆盖 + - uni-popup 修复 isMaskClick 失效的bug + - uni-popup 新增 cancelText \ confirmText 属性 ,可自定义文本 + - uni-popup 新增 maskBackgroundColor 属性 ,可以修改蒙版颜色 + - uni-popup 优化 maskClick属性 更新为 isMaskClick ,解决微信小程序警告的问题 ## 3.3.0(2022-01-04) - 修复 开发时在 vue3 下由 pc 端切换到手机端,不能返回上一级页面的 bug - 优化 去掉 pc 端 topwindow 右上角用于演示的 url 导航 diff --git a/manifest.json b/manifest.json index 836d0b65..dd4a64c4 100644 --- a/manifest.json +++ b/manifest.json @@ -140,5 +140,5 @@ "timeout" : 20000 } }, - "vueVersion" : "2" + "vueVersion" : "3" } diff --git a/package.json b/package.json index f019ccf7..3bcf26cd 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.3.0", + "version": "3.3.1", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" diff --git a/pages.json b/pages.json index bd418153..b2940f74 100644 --- a/pages.json +++ b/pages.json @@ -745,17 +745,7 @@ { "path": "drawer/drawer", "style": { - "navigationBarTitleText": "Drawer 抽屉", - "app-plus": { - "titleNView": { - "buttons": [{ - "text": "\ue563", - "fontSrc": "/static/uni.ttf", - "fontSize": "22px" - }] - }, - "bounce": "none" - } + "navigationBarTitleText": "Drawer 抽屉" } }, { @@ -957,12 +947,6 @@ "navigationBarTitleText": "Combox 组合框" } }, - // #ifndef H5 - { - "path": "list/ad", - "style": {} - }, - // #endif { "path": "list/chat", "style": {} @@ -984,40 +968,75 @@ { "path": "data-checkbox/data-checkbox", "style": { - "navigationBarTitleText": "", + "navigationBarTitleText": "DataCheckbox 单选复选框", "enablePullDownRefresh": false } }, { "path": "easyinput/easyinput", "style": { - "navigationBarTitleText": "", + "navigationBarTitleText": "Easyinput 增强输入框", "enablePullDownRefresh": false } }, { "path": "data-picker/data-picker", "style": { - "navigationBarTitleText": "级联选择", + "navigationBarTitleText": "DataPicker 级联选择", "enablePullDownRefresh": false } }, { "path": "datetime-picker/datetime-picker", "style": { - "navigationBarTitleText": "日期时间", + "navigationBarTitleText": "DatetimePicker 日期时间", "enablePullDownRefresh": false } }, { "path": "row/row", "style": { - "navigationBarTitleText": "layout 布局", + "navigationBarTitleText": "Layout 布局", "enablePullDownRefresh": false } }, { "path": "file-picker/file-picker", + "style": { + "navigationBarTitleText": "FilePicker 文件选择上传", + "enablePullDownRefresh": false + } + }, + { + "path": "space/space", + "style": { + "navigationBarTitleText": "间距", + "enablePullDownRefresh": false + } + }, + { + "path": "font/font", + "style": { + "navigationBarTitleText": "字体", + "enablePullDownRefresh": false + } + }, + { + "path": "color/color", + "style": { + "navigationBarTitleText": "颜色", + "enablePullDownRefresh": false + } + }, + { + "path": "radius/radius", + "style": { + "navigationBarTitleText": "圆角", + "enablePullDownRefresh": false + } + }, + { + "path": "button/button", "style": { "navigationBarTitleText": "", "enablePullDownRefresh": false diff --git a/static/icons/badge.png b/static/icons/badge.png new file mode 100644 index 0000000000000000000000000000000000000000..b32a7a54c4b6ec3cee442faaa7c869a1bf2e6b88 GIT binary patch literal 677 zcmV;W0$TlvP)Px%Ur9tkRA@u(mpy0{Q51#G9nD57waJdbM$~9!r#P#PAc~;TZWap*?JNWfMX=e< zLI|X?N)rgoZX=2=_)}<+9koeiB7#K_l36Vb1i{4JIg(-<3EY`C^FWq2?LGH<@0>GJ zj9^F}84@3GM*g=ZT_dg$O9{AF%Tln$Sl5Vgbe0xfBbI_S#=1rZ(ak3FV-G$Qtn3TCWg>meRHp0W!BQShp+=&la|x7L5$wxzsHP?G2jqkL{@No=JD3|AX?Ejt zB-#RuWIZgej^w?pW{ixqzIAr9B40op$a}dw`mJWtl*g})*FI}|Mn;-R=LR4%8oZ1- z1&{01;FiWRG7=?mBtWRaOPLG4hSlJ(#xgR}OyU^8DGgrIycha``W>1Y`3T@dNf%Wy zp&zLCR0Z3e(oAA!M2&wNfonudZJ1uI4**VThD(~Kp&#tfSVkXvYc+0Da8ZMoH2)F$ z!I;J}GSW=qDFAmgco}noPwRf|s>U)h((1l{N%Fh~FJn&da^0^z*I2oYJo&k>cXQ+S zDu7)YyoC9)&=0O;;p8?FC7t^Md6)%WL_^^1ueJW<&0}ZQvv6`5X(jItQbrd*?#Ti- z(GXk_a%#!noNmb3URFkCBT;w$kfibgB1iv$uQTOc^!NrN-h_Cb(XTGq?|H!TV)fOh zhBVTw1_ruJM&?#J7j}BG_1k#_A{CHpAQmBPZ-6t`{nOv`9$dCQlaaCywZU^nY@}L* z=^81Lo{e4Ch>cW>FkK@>(zCJa8nKaT5vFUTNP0GQT_ZM9EyDZ@hIO+uZ?U0H00000 LNkvXXu0mjf`o}O2 literal 0 HcmV?d00001 diff --git a/static/icons/button.png b/static/icons/button.png new file mode 100644 index 0000000000000000000000000000000000000000..461fe674f686ce167bd7111914099cc74ee4bcf2 GIT binary patch literal 3465 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 literal 0 HcmV?d00001 diff --git a/static/icons/calendar.png b/static/icons/calendar.png new file mode 100644 index 0000000000000000000000000000000000000000..e8beb9cb3eb736cdf8e9aa5f0e2bef86f79943f5 GIT binary patch literal 735 zcmV<50wDc~P)Px%nMp)JRA@u(SUqSIK@|SpBKSkJNh2CN6|@ip!Nx|kP{VGcjbe6N^IK^JMr&;$w5Z@)bRK#X`fC! zwjIQi0G_38cvPC#3fDFfCkbW%tY*&6DX(%_+K`h3X8=qv^PKXcmC`(&M7{&)%a})> zc+n+kL-t+&ELn7gfjQ-dogs1{8QZyxvugmY`>RpHS^yRUGsO5ICBi@-5!Nu6iD^2g z?w9!*pQ;W=FC{faqh;R<-VtMyq~KCwnDAZ=g_|WcWkeD`BajFySyYOtyQSR7lHf(n zIZ42hVmdIX8;W`qftrY9V4ebzUSf;^5Eh)!LWIFexsjto`R1BV96SW!kVYc(NV($+ z3+VjpIJi%QBZf#Tl^c76VI29VNi?HXBv-4^vTt5kRa^0MATOV5_*OlB@oOWtCm!uz z4)o_?f6@HZq&qR&h;`f%I|;55a5|R=@K(9u)<(=pg8C7EN3LiY-$;)|C%Q)@_OBDs z$rg@&NZoMbVsnZAnn2rfvCOwqFB<6@k-;R`VlnT|YmO}Xm=1+c8?nJS*lU4v4}b)I zk$ROkT_aMox5~ylzDLS7T9jvq6e(o>>_rN-h?~(W60YfD^*D9IgGKmu<4){90MTKM z$9SG4&~p&$yCL$z+rX~+6O#@ip8({ZsoGV)Apdjfh8rYni0JnAVM~`aj+B;8Q)16J@*CvzS3;jx R)Up5o002ovPDHLkV1n(fO~U{H literal 0 HcmV?d00001 diff --git a/static/icons/card.png b/static/icons/card.png new file mode 100644 index 0000000000000000000000000000000000000000..8426e99a013b9ce4a3ed731850deffc45cf76fbf GIT binary patch literal 429 zcmV;e0aE^nP)Px$XGugsRA@u(SW8O8KoEV^eh}Pv7QKVG5Znsh#F$J^V!X+KTfv2R2j?tq1ksr; zaU@HJO3@Xxsa}SzSM@##=_VAis1P1-B7eQcd&vc?`ao2*>V>LwE$RGp2!Z@0wCNr&vEp>%~OU zynn%u6VoilGR&$IX)`&IwqH%;#xVOjG?h5MV~DU+om~4uQ;FvjZ%l1p9FY$&KQPf- zF69RtVm<`X1%UnUXQqx2_>P*JDmRG%kK5axLDv%y!9CLF6~&lxli?Tx!rp>`OLHQd z;hA4Sc+X7)i~|rI4Y;P!%0B!SKqsyD_UGb(gPjD%Ig7URel Xn2DP+Oc^+{00000NkvXXu0mjfsJXe{ literal 0 HcmV?d00001 diff --git a/static/icons/collapse.png b/static/icons/collapse.png new file mode 100644 index 0000000000000000000000000000000000000000..87da4bbab1b550f1ab810fe2d3dbdf220673e310 GIT binary patch literal 802 zcmV+-1Ks?IP)Px%+(|@1RA@u(n7eBfQ543%GZTzRvOBB)fnX8Mu1{iPlR}8tWhY3A*a)H^fry1q zvKmF(ps0{CO^7=YMJy8SL@YFqnWVC^mUU+nA87P`vPHrYV`g^PnN612cFsNb`^=?Js6h5ZpatHk+J%H7IH#cc zc9{njyq0@{xR(6^kV9UH!h6nXBbzzwmEQ-*{2zePIq{ETQAW01uK|d|iX_Vdj6r14 zD{peXf7nW+X{gx0Mre{ePO5Mr#vTc48Sh}mr~jE{h%;)0VzJ6F+?>@ z0XR}2oI(sF&Gc{(n4)Fh5Xh~_j@Fm)_erg3`y|MYbp%t${-l|CP%Vr*;amf8J2Vgi zqp58Aba{iq%Z~~D`;SS89Nj=Dm68iPd)gmX1LImwIsSZTAOHx#6euNtC?T+6uw;OdsYBW~Wl3z5q)$a=S= z9#a%I?>vIwTzHNE%Ou7$EyTGNR0}A*to>Z8K_-pGyge-<2g7(3@spF}Ov=o7&YnFd zjpb>)4s8^5n8pK~)1mrWYcY-YQ?<KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z2S`aoK~#9!?AdvYUsV;r@z1%x`OQoh3vEPf2e2qnjDo1RA)pum5mBNh7>yc?ilGRS zC?YPPgaJb&5)f1(Dux6kQCxymf&vwZqGAkgtS;T4Af?LC&ivjx{_)=YW`?@OnF`T) z$t3gMUC#O5d$xOjk(vG%o|p%j2bl+%2bl+%2icJz@4sj2|4h0A40Na=5nfOgD?7C# zh1;d;l3Ou8Lr~kjBm-lNFDA12HoZNveVO)*j_g>Fouu=Hw?BGJavna4vBx{e%9^XN z|393#_Co2F$&J%_9D&p|gIy~+9jlXl+RqQ;$C)mQa2yVWsJveKdTV}i;4udIz#nGV z`QlQ1uM{t7cj!*MH^S;nB3z1NA$yLLu2G0i-{c-UkPoh%>N`+;JJYLM!GG%Y93I7Q zO6m8x882?NJ`gu4`r1wd86IEkd6AYU58x-k*bW6bb!}gXmv_PsCchV6-s`zRp#;J% zxDk5`oA4ZIgRoFqj;AGO2D?S-WLS(rOyDo5l21muO4u;xARk^o+0W0hUrTjK3GeRp z8luvy;NHTu8b$BO@F{E+j**V|w-Z9zD0~7J&nd_mcTjb`r8nqvkroMeW;!6krmQIg z8tX{|b?ufu>^~FQnA0_x)(U&!NGyC*xA)=vIRp8`ujnms-o&tzBZ=bdI-M4%3ith% zU7y0>B6<_{#1FAz+7uJGU;1kmPKorZ5|-j#Jd$h2&-!lB&a>enyV7a(_Bq>dNjo7hO~tt|-OVqDNMCuLqnKysOD9Bo_pu z$wn;4wZXGm@fRj1ojuYN60-t1ZJmR015~v&6P1I92OABl4(oow*!?Wni9PnE43g8t z*1_-~QCqofo9`-~{&&ROmK=e#nO+p(8`12{{dn2vh+ofsN7g$i(v7VnUXNEPPLSSK zbzHpm=RUjj!6xeuEoRUCw-28Yy0|s7ztWrAXuP=HImwrkV>4w5Hw6c@3vtLfD_lSO z9a-;P(&q)8aqlgaGQPn1kxio8beFep{j19+bII~&5|i0&YU*7S8=DyChd2z|A{~|C z>bB3e2+K;x7*4NxPDj+?jB{4__*|IQxp+TnmDfk@fb2S@KS9U3D4r^tYPYJIq-W-| zhh|ufl4+k(+*a2Om9RD$iDGPg%q|bEGuG)^v21sDM;OA*qa)4k%ogN4oQ$k%heddC zgfmTL#>;T5oN~yF?ab@BQTZuKosR7kU#csFB@ynyvIteCB^!QgY|Fido_>%&N3jqO zjE;EX>@)j%CzNzS`+8!gOCx+C!pb^56vc7){d7~xvK`29RPMtQ(2MYqy0S+2d_>=G z?!-RbFsn|3c5+liQ_hd~w)5+L0r;qfz{fJ3 z@lP`PE2DB>Ydumt}Y;>L%y31?d_b*oN+xowcG3|FbF@Hz0i`)A7;N z8>ddBPYyRiUmIM31=EHsntsI1pwv_ojCWY_2onpb%S`Lbse{Q2f^Xu|aPF1OGUA6Nxkbw-RmD+Cggp&Gjv z!t>b>U1#QmpIRj)Q`DL)IZNErZ1*6O70A$szjj%;a85nd)=x_VO(rbk4 zGp5em>b_zNu&MPK*plguno3$JGeDN&a@qq}+8hI(iU;AWC(lJ0zp;(06_NHRVGZ_Z zoBx8N%aHFsa92|_E?U;Fexton`C{AmoUC2Y3kGI_JR`!zIHd1qwWFi!nn@kz1Z3Lf zgFp#~X(ClW+jfSWwBa^aF4)<ok7=jhkY8G`ax*Y?I%H!F2_YU6mOU=tAt|)yS_T_=t)_0oGv_*S>Oy$(AXWb)g| zI0i5J4=&L+M7TPN6RS$E6Fin6&`pjn>|67W_}6lOf~zyEF5DWW3Gt5ykbVZNd44ch zvsBtAiWPGr(W>3*-%^Fg=g zqfYlnpp;%WSg_|kSn)@lo{ze{?{&L@=!0(W2R$GHiGT!kKx%**KY*lqfZ{*}Kofvg zfDP;g34%-p8VfcbWJu3@pdk=(ka~~;pn8xp2p3`$f(z0PQU)~&%z$t~MuBC)hC|iB zq(DwZuu*hEamTas2I-NG1y;8~(zyIG~c~LU`5LUg!>{rqp&6RmU=-%l(ISyI|zNdjL&nHtRZ?T%5Gp5dZo z$fdB(`1j1F2cr7B9@swTUjO#^rupX8YR?r`wz}G14`+NH#!yl za#wEJT(kUpLhN_vhgvMw1_xelbuwmpTPAPW8Su|2)qwfn@3Y6Zw=MX#>;H$8SaEs# zN84B>&OPH-KPGTic6Rz+hua751|ErBnfLUn_*TYF)B4NH%RwpM)78&qol`;+0F`Wy A2><{9 literal 0 HcmV?d00001 diff --git a/static/icons/countdown.png b/static/icons/countdown.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4bf1076134c0f157d067d730b4921179485b8b GIT binary patch literal 1527 zcmVPx)u}MThRA@u(nO$rYRTRhn=k8Kk8X_(12Ott+3|R2RM2#tdc6U(|5gyf$XrgE$ z#+eop6-B!!D87{L5Wt8UjZt~Vkci!BO9Rnp;uFQ7F$hg{zXWF;b%h)mHA{J&Bwuq)msSZ)Sr`V?*G zRb)9S89TakU)ag7Qba;VEOFx@Mwgz9YToMW0unT0BLu2(5}OJ;gD;wzZ-$e$QbdA= z)la~kwipxEr#N%KNq92$D(PB70w3oz=yX)`EOgRS0tp#b4}g_f5azc{-S@7O@MP=( z!`dQ%f{(*d&D-Rprv?&Ai@JtdG}$IxmL z;+vcpC)1e`e^2Y83r^zY*qe5qoaJ`a4g$y@a9SPJJO`b$lt7xoC#&7{wL<{z$f5wc zsd)`2@pA0J$dFDXI`V%0%A6ba_k`kTwg*Hn6yY-%_dEZoVqBMp`n0T`k^T6-Q2E0v*;0K`;v&1*Q+9x+k9jPP0+k#cKJU3w6`e zsbd7p%S*>one@uu)_K1;ySn;_rd?;2xLMj8;>kz*&!oF**^v#i&a3K{6cJmr*@&+c z;7$Uj<(=BoS#&k7LN;d3_bwiIzWIwuXjm;R&{Hh!=>nz3}TB1Bi6G-_!NN1 zJ4;9sTVrQuxA%o9rLusf;l3(gy{A9T`bwDL(2eepfP?KbV_DY>$+R#A1yT!h4GUDu|*m`h|jF9k!=KexhO?c*OOrI z?!-m0_2_G!e^e(;G_C@YORa%M;i{TAwV01H=oo+_%1N=ZQfvI{my=RbICdf4 z-WOh~`1<84e_ebN5x0$AqZv{Xp6}AUpOp$zGRW8uqMbStnKfP7+#idb+usRK{p|bQ zEbg*@Pm??yKX>-$v7iBC@Ie8WedF}yK8SRQC5K8aeM$luTcR-Y8IrCQ(bhSmB}(Hb z@tM{CVha&o0J!eTou%{4a$h1LwiUmng2vefLdGspW@llT29hHq_Z`{1aB51FV8q%@ zgj`uYLDAUU5nn8b4-(<-Yo!JQze{=P@$Q!SCko?&k-=sn*LOg!x&~-(RP!j6@Fjf^ z$CmM6Y>(>REro>y+WY5|yZQ$LXPXpG4>JZhBOdD7IA>rK#;~>%@J3;yQb0rR^)BPD zyjY=sIGrrMSWz%ynM7!I0w}gKqubOyL4er)-M(1Oa8LiW(6K2cDoSU>zUsQ_Yloi)=RG>oCA1;kgSKorJiSgz~V{iAaOM!ZFUcjoPX52urUm7Ay%$oS?%mA|L8 zZnXIjG_3sqmXrfRj1y7a`($D6^7l{GRoB+o&4+AzHY4TQ?iRmeA594)RMZXva44#I zA1i0ks&hhybqGMA<-y-IBYz-#rHDB>$ zn}d@ExzR1tY3yDri1%ed7z3v6b$k;lMdW5SvB8{*>ORN6Gn7C=hGjR%9L1c%U!I*( zQO)D%TL~l(iG>B>^&9>l33G}GJ50^j=Clb)AWkB;g1rKAD@37q4V8#gA~HogP)V&R d+SsyX{{yZcOHqaA#n%7;002ovPDHLkV1j*S)|vnS literal 0 HcmV?d00001 diff --git a/static/icons/data-checkbox.png b/static/icons/data-checkbox.png new file mode 100644 index 0000000000000000000000000000000000000000..748bdcbe36faff874f06ebf45f135d6e166e5ec5 GIT binary patch literal 1888 zcmV-m2cP(fP)Px+8c9S!RA@u(S!qmER}}v448u4qf}n_kidtn5qpeW`TCLWtwi=fPtGF|*tuT!E3U}Yr+FfL|(N_Hf5wKBaIY+rqZe(SVrO!)B6*mcn?ta1%z;b zv<9FCNCgNU;f6H8d=@| zzFTb+yBQPMJbiM+Dk-`Wh%lm~hFbtSz1!Cxu_O6m-MDMx?i?JuSOUgyQ=g>mD#e;h zB5}z#qlsWW&A}GW2}7HfYALubWq8DQ9nD96aTP|t6KIFa&zZzuj3S0$wML~aj^yLa z3zthGI+~FLkc5yRPbAIm=n7BL^9r+o)mtCboFAP-o8ens2Rq$_)px`RfPp3HX#{lz z?2<@aV#WbN$nYV3{V}Nl%Bu8<1u3SgDuPdA+M-97`f|pH6(}Tv_}2!S}_y*ibQxj+Vjr6hCdaFFs18T9*NLDWId7{9QpE zKP42AoxL3zJ$$|hzwOJbdB#VWX``x3@$9uyr0skJt5B;N+1U%9PY8k9Q{gnwoIEc> z#!#+L(mIY{9c|Y{5)Jo2Si6~Hg3!GY7&mG80F%!q6z` z({e#^6&9?>s`lM#?UlMX^0M1RC}oQKFx&yq{{6QDFn&lYSD51Sf6_~#-;pD3`skj{ z_m(5DKMp^}-jjv=FicOS;oYSebX}|fW+Yr+pj0S+(5Myoer`wjde`s!j*OL>ENCuK z)}~)(vS8t=J192`U;>$?PYz$(U_@eQx{oiEHwh3N-Ltv)cGy@eb;l!|xmwEK;BP4( zn!2T=^sXHPUSL#GM!5bAnh~o6+06gejSEI}4|(Mxh4`6kB}n}&jivGGXPG2e#{>6{%D^Uk;8eBBSXAuORpy z23Qn-TZ|hUY&VL?FB48{wmmQeu&VCyNLNj{W9Z3yoT}7lcId--CMl z zng90nR$@eS00#8(b2g-Q3S}d?_L}5FIs4 z1jM^vv5oP)6Vb^F;b9tt2JyRJ6+Bf0l~oMIWmU+|Gs9pkM@H6D+g{)#j0|jU8jaX3 zBLVe9-6F!#s&C^pvl#?gxAFX9fe^CNiihjg)4~7mZM=P0`1g?;{Ry!;_&$OPFjRjZ zVeG7+RPIen=z9K@`aa@LIW(lM+ojcz&bWisM8uuwHHL0eMj9ik?qD`$#GU9hhVE;V ak^cbcP=`^xbzQaq0000Px%21!IgRA@u(S+Pn3K@fd&F`|f-Hll)woxPn(8Y?@&bUFQi)Dlm`2pVk!!CEAy zQ?RxS*!UA(0+ymx3X6Cn8;FJ|cYC+Dkc)fe?wh%J@6F9F31LVc8WJ8bL$VmHE|^`Jn8+BSECE@) z=Sbx0q6KO=*_)4jrOW`l*jZydfv6p=RR5@oy|5~iSNhV}pKQO@EHd+@SRWl5nJVY! z-(_B?3uB1<8%La)yH0GaskYLIy>K9tLtAU@RU4;7D9IGzhlzb^h5gvOL>OQKLQXWY z08VK+NBW7Bs&3ID>P#)>^z`ZW+*>cE$B~bUof!|~jMgj4FCsVYmIb;M>mE3NW@qmb zNo4oxb#f%#Y5O`^n1t)OxGLxkHPIu643 z?rZ&lE=(Z;o0yY5h}h5&2_hQze&kDI+=Zy-GelGsj62>q61SqN`HUl~3dS989En>| a)qG$3mMlVfP~6f00000Px&DM>^@RA@u(m`i9AQ51&%Gig#3L{KUSwVAXC1y??HKCoIhqHR(kphEFc-MbO2 zwz)~Q1vlMmwNOy8VkfQQ#%jgKO4OB55R-{52o^;U)F#b6GOd-g=2`NX49WV=Ip;h7 zz5mTU1dII0A{?lIm`%xwA{9jn)Pc&@Do|rr95yROfY`Iw#BAwa0~(1$;>k#`jHPsz`TZtY5=^7Bic@J`zFOk z&y3i4S46R)zNJeI2ZjC^KyzLI{tq(l7V3eq9^ED52o(gx=oT2i7}!RHbztrX$wzqs zV&x!+&N1T~0dGNAWvE^#kR>&j-C@^6`0P9Z(`6#mfYHyylU2a;!@@P04@Dk`aN``X zhnN~cFqD}A@g*a+N4S!@Sz_L-Tx;p=9val_2(d}1z%MN5hOjLb`D@;J` z-}5!KmO}MSqG>K2jOi57M951}?lRMB0uu;3NRqcT;JjC6Ao>decCnQ0fDNSZ5HntS z{Oazq0U7Pmx3Udy0R9q%T4xmQK;#pE4HU=r)*kg;Di~93t)S3v0yqg!z%86Uqi9X& z0Rp-J47!DS%Jd+^7e3TDs_jPim3S2DkzVz)QS|*zeWT3*-EiXQY^=`Pw|OQRjA;~E zv|MJs;Qg(F}w878L9!SW^fFE*CSj(Q{L=a zw|<%w3}m|W=I=*|4o^V6VNMXSV7XGt^ThILG9V^ppQ0#NQ(1Azx7KpY^$Ln60~r?V zNN2?*2hn`tK_WVlXt^mZHjNdR6eN}9rUFT4#U%w93q-caIeADzPPYXbZe?@WN4oXn z3b2eNgOg zavIPTySQBPRX}p-Rx#FA6e&iRbIDOrB$sX#W36Qr`2+R;pivlgpN;?k002ovPDHLk FV1n7zjbQ)) literal 0 HcmV?d00001 diff --git a/static/icons/datetime-picker.png b/static/icons/datetime-picker.png new file mode 100644 index 0000000000000000000000000000000000000000..24753fd1e5160041f5506fffdd5c38e85d838d93 GIT binary patch literal 1779 zcmVPx*tw}^dRA@u(SZiz)RTTct-EFHtF^KKVDiFdCqhex2RH*F?D1yf-yG4fM`?%L92FWQTZXLLGhI+(%l6?d?ad!4+ND`cD4k<%Oc(GJ!ZDM?X)cI zEN(Z3bpFjfXU_S)^SJlSC7dP?ohCdmK;-|H$$^XvWTc-WFi=|Vz;0O8bY2k`eFC5i zpxZS=*_x|+d>lt#aATlcr^}~E6C@&d_gzQBC=BGhz&t9APwpp%}}q%O2o1sC&FS!Mxf>@Lm5$UA{$q<4Dp>Q?|{G< zW)^M$M3@55W$CpTGryS)AORCVq^D&^n0aMSJtiC|f_U#LL)n=NNl&E}4mOV@@->1m zCKuzUtjjpgkay|kx$k?m;fY8j6kiMQZC;J$N$;RY`bJgOmL2h8&l8bw$UaKIV3)xp zfL7Og34r4Cdrw)X8Z#FYk)!Jjd6I#@GeWm4vnH9QPBN9x^F|~RvbobC_-C0Yo;vxS z;d?S`kvuf}_BC9*zcs!B!0aw^bgOPEp32KpM%+Y%q&bx}O1(Qu;h_Bz3CvBcF}~JJ zbwai%Mnds<053_)nlwWl<<^S?kCZ|D-O`mpx>+-ob^VeNVwzQDDsQ=sH(K^|LHMAf zVrZdeC{JZ`zS)Xho+NS(%OYkD>Smy}r(VReH-k_C&_NtOc9C}P=vcvsIF1^vmMRE7 zN1s)`j)*!-@dTj3z2iXQ{6TGd-Wz}K_(V_nriOi`Nk88rk{qq7QFeJDk?y&^Ro$hP zEhBwf=zoozdjvp?hz@6i#y~U6wmG^vaz{3KIM`f45I2z!<0MOkKoW!|Ft(8Jy<1gX z_S>maJ{2Op`eNqwx*52!TMsqFCkh`g1(0=g=_n1768wQ=eq^#4_%l~Rc_#wE(hRjG z1Eet+n@55c5#aL%jt&9xZp{dM>`lKz>lBF4CI+%MAt(2i6qPKVFmrgS^deULNf0k| z17aWv#`i?{orwI*d@+CvdSFSA#4S}d>PKG5;}J|)@J~AoaFSHpL|bO zRG-uA1{iIKU&2Bz0ns$q`r$T7mrn7xbM*_6PnPW{88Wo=7XYKvz}i`2re34IaWn1k!=7{L>O32k{2a>?T4;ik0yHqB74EOr#Y7vGv+%D*_+|06@P?@pYLjTnyDMg>b}4@@@{{dsa@^F%_5r}uS8NO zZ+aIw#E^4^q|Tiw!R`M{u08KZLdOqPI;zgS)bLbPfulagwUws2wKp>1kX=i_>lt6n z*s7cAL@xpGL?mk2HWQTI4br=sq1>L)iLA0`gHxa~&oL?G6JCHn*+l>c56@ zqIe-dP6=f&B?!KWRYuu&c_R`D#+E?PyuJ*!wkL*PH+$rPPBKJkV}sl{D5u*oLd!7kEe_{L*U@j(jXD;JlW{a;7@fUaJ}2>nlLwTH|0XY(aniSuEyQ^U%k+DX7X(R9Sm}QgU11^I`sphCV;;Z zL~AQ&DIfQC1Jj%Tf)V*ILGbeJ01+=yDx}UpMhY2iFTMsc;w4Ij)EUS~A*1cZ*T30? V%28uzHN5};002ovPDHLkV1hX0Q40V7 literal 0 HcmV?d00001 diff --git a/static/icons/drawer.png b/static/icons/drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..73a98023a7ecd54715176e64204c1760fd16611f GIT binary patch literal 686 zcmV;f0#W^mP)Px%Xh}ptRA@u(STSo9K^T4C-sKX(&FvmU)GlCUDcFc8(Z<43tTG#xE$u`L#Uh;| zcs5#CoJ)3sA>dCCjOi`>4Hilw+=e>|Y;;Bz6oSN^$>ip8-p#b%_r00--ZwKlOBjE5St@jnSQ6G4R?Cr{EW0C#9s}@=XEH17k(3Xb zQS?$(u0V>H^A7}Ev9wSX>}J5&RaKG}5!vbZd82X5lTxXS zYQn?B1yL_3ino*`Wk*yFEg~wAQHW0-k$#$<7M?e2qW(`Iw!%2h4^u1Cbf#ac&H7Qa zrBkQnNY43F0QUgn7i9sWC|F!v*I86I%NP+o2hb8iJZmj2-B;D=64?bXqXMgpOZh&C zqH9$--`Cd87JGZIi0I~@JOYX)W7Dd+b%~Tp-d2HC#if*Y!ze0MK5%q7k4eflh=RWp z0>+fJbs6EAxeODI8OjP8Tf@*sx$0Ql(OBX z!?1ZOj=!o-zA~(nWApRjIDZET z;9-lg7b>?WYqP7=7=^fVWE5Q3zXs=sbHtJYuC*))YYgigF_z9!p>xENu*R^z0J1^P UGsAVEr2qf`07*qoM6N<$f=h!t5C8xG literal 0 HcmV?d00001 diff --git a/static/icons/easyinput.png b/static/icons/easyinput.png new file mode 100644 index 0000000000000000000000000000000000000000..569ea58079e845a756c57fa2af704d8d12810e28 GIT binary patch literal 465 zcmV;?0WSWDP)Px$i%CR5RA@u(n6Xa7Fc5~%MS>1gMM8oH0J0zkb|#Yn33eoSi9P^Bo`!+FFi^tG z3=<7IOdvH91Vj!cQcx9w>zr&0tjp9YzO(=TyGtAk@Z=Jn=l~Y-*GMuECSu6}E-g#O zlG8E~ign|2ToB##ZB{G-9B#Y?E&`UlR9wbNi-jl(4*T3lNE)cRQi(_0ko5$+L7Jz{ce!nPx((Md!>RA@u(m{Dv~Wf+Fv_q1$~t=oVI8kr#hgR%{;WjMGoB;utY#v7x?p#;LZ zo-u|bOOP?vu0x2(j2dr@h$h|$33vmz;kB$qiI5P%7%)P&b^%6vUem?Jwyd1fvvx70 z=l1*l_xqmj{m%NCru4 zl<{!7!(AuvNzsfc&(#^^1jS71rs=A8OD~2 zeqXc@Ek__r!q?{2rF?rxwga+%nG5M)+FVXZ>W_Kid$0TJ?>LdO1!?FVT~CibBC*Vg zU@>zfTv3W!qn)*<>~w8GnnJMzfGRto62`|z0(I4P`nDh|`(hgngC7!l!cMH%ae;qA z+!`@!zO&P|1xX7m?Y>=CUCsRf-XUPviOw`Gzyk0|BB5PZyXVK8=s5zJ5^C)Ido{hr zAizc^;_h-3QPOISbS^w!$ohgnCWQwzr*UjFKxz-bd4&{vc&_e9+#9K>4WX6y3)L+g z6}Li;L3+;Vv91>Wm0PGOH2ONAFn~oanz#wj zKN6_@GIwphdiiSDf&_=P$Pju!yaC|bJ4u-DujRE&!G`eY0!n=l-gI*BO5d+Qd@iyh z>aV?(srA8G)z9-H2;db6Usyz!*-YCHGFy=TVWlr}|4myM7tm8NhW_m@@m^*V&xYbH z9;5~dJdq-W;*Z zDGO~KFYx;;ce+)kz0|R*QQy?i}Ah3oV zGX_Zu1kY)e;lUvQYjXt!oG^$T{?)vk8C!8+Y{eWSb(G{fNoVd`o-LPl)?CWW37^+; zOE^ei!!(VawNlt_w(x=-L^^KkNTx_|Sepq12`tGH7w(DZR{}ledX8ttnu24`kC-(- zW$Bz!6|2!jp&dkJW=z0!0jAl^V@?33atZ>ObmwPP8FB0e;GeFE^yhB-8h)LxiT)wI z3QoSv^|`|U5Vm~SXFiub3@1PZgG`A&Y+H~xGjSi=JJ)h#D!=!vnkwetkc4$kx2F>T z*N)_h2ZyzR!~lh-bGAs5z!58ngN7G71iZ(b14G1b657mWo+za0>2h5=k}0U`j5F|BuxKm{^7Rik~xwq z92!;&gu^6OO~oW!0I@C5%&Z^6V!;&Ek<6x!AD8Fa5^RCc24bN8I*xAI#8j~w&($dz zNU0jmr&|V@?TOpfD?4I0q1ld?9hvQk+tn*OVmG1Lj+Y&o?TOpf`v;;-n?iW5(*Xbg N002ovPDHLkV1ga&WIq4^ literal 0 HcmV?d00001 diff --git a/static/icons/fav.png b/static/icons/fav.png new file mode 100644 index 0000000000000000000000000000000000000000..a51153c9b7763baad278ab6d1cfaf9b4a6a7d8c8 GIT binary patch literal 1480 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 literal 0 HcmV?d00001 diff --git a/static/icons/grid.png b/static/icons/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..e50cb7f9e6ed089d521a8f2916dff38f3fa072e3 GIT binary patch literal 412 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 Q?f?J)07*qoM6N<$f?y%{;s5{u literal 0 HcmV?d00001 diff --git a/static/icons/list.png b/static/icons/list.png new file mode 100644 index 0000000000000000000000000000000000000000..688602e1ed83f3ddba48780b89792901a739b3c9 GIT binary patch literal 534 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 LNkvXXu0mjff{RYP literal 0 HcmV?d00001 diff --git a/static/icons/rate.png b/static/icons/rate.png new file mode 100644 index 0000000000000000000000000000000000000000..2c582066c773ea4db173fa4080ae7a8fe04ba5b2 GIT binary patch literal 1624 zcmV-e2B-OnP)Px*5=lfsRA@u(SbbePc&UG3yTwkw}r5fW4C5eB~L zEU?4;SdnFY{l5?rQEDv#3sPjG0CWY4^nYglIAmG#`@E3kuu|$Yh;B_12euN>2H^P= z`M=hjJUODehlf{>53Oij-Bd8|bu&&t2{X5X=!^C$Bofoiii+=hvMN0<(`SW5 zl$u1qk1j!WoU%}Pc|%f&l(U(r(d`Q)689BURQ%jiVtRCFMU{FFz-y^$v^iI<3@@5L z|DyhXcIC=~K|_b0C!)dnKM^ephQn`OS0PcQtQ5hq01Q9D8Q2pNVusf?rquT2PVcYj zCHokF<)#oalS{^mTvW;m0JWKb()$@G4GFQ;`#mb<6CnCBTPy(OnZ#ri5|y$EM0aEn zoC#PP6k=g#K2a%Gfk>}v8Do3=n@l0@>WV`~u&9)6Aj(UDG&#(x48zbH+||aM=dk7u z7(}f^v_BXQAMPq>e8YzE90*Kt3}axYcKVPB=;1s*6~i_yE5Ex!4uNQbhxon((VQVd zoXDa|zD>ENrZ{RCl8Bya&lPYeB*esS35nFy%%nhI2Y`SF=#m3e6$#P4ocd`{e~XFU z=#VhxbB;Gr{`jL70`I|sA z&D&4FZnEvN!ph2XesFyY(O}ip)yATcBNv0{Z2;cM*K9D)DzvQKeuBC-k(!#xWEi_Z zRP6CKzZ^X47!i{aYkBt$!3RH`VzEI~BO1+#5?LUCo~uYO2el5&heq<8LQ)AttBajK}i zJm$wg-6m%t8Yp#iY2Wo7=CMVV^`{>qm+R|qvmNKOry3PzIGptfqT3bG01+v_BBIAr zU`I?L{u?Gf)I_EH9YptBEeY>5Eo-I^w@yuRuE>Rr8_oRI*7G28cjtFaA@uU;yG82i z-XZ3tDIqOw@%XTz3m57;e%38#ArYnK5U|OOn0~)trEZD?iy3%Ezc`R#G!_mXypl>v zT3w%uH8m3hfxtn}@F)$Y9W?za%2`NMsqJu&R23|y@k^Ip@k9=a|Px$N=ZaPRA@u(Si4QcKop!YIUSHAQ32AKfFdBFfV&WI1;mz!(9r^vfsyEdh=715 zNN&)Ad`C+fZ+z;MCLzMB=Tamu;ieVME>k_}FZ4 zl>>m}F{#UxTMP)q^M18>92>sA8y4Kd0N}M>wnsTYy7luJs0Rayu($O{?TQF`Z-k2o zIb*EQoPtU|n}tVmF#O8-ce6|S1o@VOhQL06gSjZ;UCY}q5TBy#%=YV(J>BDcMX^WH zRT1sGVj20000Px(n@L1LRA@u(m``jJRUF5^zc>9u8(Iz~kmv;=Dq>O%6e9*bnAnr}pQym@%yf%( zcH2e{1QTn*p+r1*>7QLl-JO};wj$}lL%Gi2lMwp>JmBP!EDzdRWVBdLR}jsPeNDg<4E{xA z>RS_`&~#ZMJq~V<$D5>*o+P3NnemOK8N15@(e2m_fOV45Yiq`Fk2+Q*OtoU~3PK-% zSyMF{$_3#jE&~gqx~SboIC{E!~bS203<2Xj?Xo5@Q#b?;KC~ zJwxf2*L{UyF%ki8n0WI9<^o`xDVE^$Pt~T%>&6R3o2MGzb`^ z+0kJlYF$bwGyfq;9!#oTH(iO`b3Hw2C#K>+G&6dF z1RZt6G4m}3$C<>0kd%SQ?gT^!0rwRE$4%APS8*VEYUoKw@m1alImr@xEj==|(3R)o zA2i*gY#0Uc-oht|YHN{XMLD9|vCjZJ2gaYXbLs6LAA0-xQcFuS&2^yJ?})Gsz)z-X zJgnO%UjU@j6k)32XVO~EAQ-H zGXqeq!AArsKjij?pf)Sed7;?wKyu*z8m_sTkLQ=HK=@Oy)AM=G&+M_a?um+U zBzJ^bu^&O$4q(y@c0LZG`H#>$H0pNrG(fKbe0%+0nT-R5e&PkjS4SKHsuhh0qWtGS zQJ)#?d~fMfYe<6-3CBGKQkH52y#UO|_ztr3)SI;}^^Z+}Xjg7h#yDlEFA?heJ`dWz zl~8w>h>ZnZKb_6u)nxnPPnL3z-@*-1_S#ycq#I&;eBfTG)Lbm|h=Lye8%$XcHY^Z0 z#o$H)HG?_LEMK{_SABZClF_F?oXpY7XgpvJ~>KwRs!OrcRD?>(v(!gm))lG4C0n( zt>0Hc*4lyp&tG+<>WEJjs4gv^3R`m8sv{+r&ZmJ@M|>)5$!Y%sd0h@sIjHjY00000 LNkvXXu0mjfR%=4r literal 0 HcmV?d00001 diff --git a/static/icons/section.png b/static/icons/section.png new file mode 100644 index 0000000000000000000000000000000000000000..69dffeb24394c15c7194f95b44c6513b55824bc5 GIT binary patch literal 541 zcmV+&0^Px$*GWV{RA@u(SWPbjQ4~FQW-2O3h}p8RU|$vzJ3oW?*!UNUO8f{bgrDFySZH@P zmR(s?5J5y==Sq{732EPZGrd!pyzZKN?#DUj-sz--oO~!JJm84@Hz%DV&JiI6+-eC4 zo4BlVB(ZctiAIiW9yShy`Wux!-w(C@t%)!w0HR5g2^jR@0q;62Gm0QC{@}b90;}$K z86re;U~KD#>%^-BzS3bCSOaMF8%H=L=DH)&OS$-saBds{O#@ibtxG%3K-~l1>aYwf z0yH1PT@(0GbhUItNyGWr+bzYhIRTZgg0q$8Tx3TF@1ejMq+2$2@y^>ugA4d?VfSTHWMv|^oJ5O<8%!dj@ zS1ZkcNpnSxJ?SuM@*I&g>J2N`=%sO3!`bw8L~PW`0_z;fLS>sC&Ji26vcNh=vQXKk fhjYY6tt_x#k4EP+t9}^b00000NkvXXu0mjfJNoE! literal 0 HcmV?d00001 diff --git a/static/icons/segmented-control.png b/static/icons/segmented-control.png new file mode 100644 index 0000000000000000000000000000000000000000..5cbe60d5b501be75dda272d037dfbb37e93fdc76 GIT binary patch literal 624 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 Rqb~pe002ovPDHLkV1gDcJX!z% literal 0 HcmV?d00001 diff --git a/static/icons/swipe-action.png b/static/icons/swipe-action.png new file mode 100644 index 0000000000000000000000000000000000000000..204b7f9e0f457fe3427b8a44f4c8243d43942f52 GIT binary patch literal 1660 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 literal 0 HcmV?d00001 diff --git a/static/icons/tag.png b/static/icons/tag.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8f27deca9bff54b086de49e12b7ea0954a5290 GIT binary patch literal 569 zcmV-90>=G`P)Px$^GQTORA@u(SiMREK@k3CFE;8$Meq$oh}dXrDOd=>Tp*QL_y*PzI1p*^vlpz{Kn=>=9(Py>E8s`{CFf!arH`Pk2Cx44aeUh&bX& z0g09;VV$=XN1UbeR49%#E0r9Apv*)o1WW_Yw*&_80Om8a+q+?@bmL;0lOqkSmkBrp zFzRyXA2n|btY)L=Jn6npM4DP(09Z_Vm?i!)jG`q=>^IDfNVVDqkxF`)6`t9I#bRKE z?E<+G(YljsZ!3(V#C;_$=ycx{B6cQ+9dX%8I{23`o*3Y6lOF$V;U+n6$JMDCEu6vBM|`tuD_ug{~^ zssWfCL?%5V1D?9fe9~5GW2#Vi>Tde6R+|irIU=I9zGTvT>b_`w!M%qM#xU>gUtPs< z9GhOv#&N8+7Zzegv;*MRyPtr|@wA2yea1o0ig|OaSga3ckOW%DV0=j<_o4t4z&Aq`hW-3GX00000NkvXX Hu0mjfcm@7N literal 0 HcmV?d00001 diff --git a/static/icons/title.png b/static/icons/title.png new file mode 100644 index 0000000000000000000000000000000000000000..298336c3eebfd9b3c0ff7e73587cbbb83e0b3542 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nC-#^NA%Cx&(BWL^T-jF;UDi702GLLE zly7E|o#j!UbBvTb)Q#e-Cy_l8*j<+W2yp@AH6Pl zySwa}^yQME;Chw4B{3ZgH#YMtHRShyKXKZlu|GZYsoW&ZJ#B#<<8ok{Vlv* u?U0^CsJe3C$xXYI4ylQUsw-h*ma|`$Ja61D?#B!aJ_b)$KbLh*2~7ZDNtLSr literal 0 HcmV?d00001 diff --git a/static/icons/transition.png b/static/icons/transition.png new file mode 100644 index 0000000000000000000000000000000000000000..4824802749eb429bfea4bee918cbf6232fbaad28 GIT binary patch literal 1415 zcmV;21$g?2P)Px)K}keGRA@u(SX+z}WfcC-wA}?}T9u0z3?w9)$R#l<;yxIWgiEIt_Ce%93723{ z0%)QF+fH>WI8zoLNJLSh0dK@af^u=E-GwMBiGT@8f(CssXb@3^u-oZEciaD%0^M}U zt~0Ycn;6pnvHv;W`M&f0o&U@bZjePchz?YR{NJ3cI#P9HkUCI3T7%Tse#2HB>38b} zDY5EEZ;iE@<1--9W&*}Ccu$coEx#$e>B1nH&;!;pN3xkU6D9V4$KV=(&I7oW!H1M1 zHB%{>6oW0sGa*(weh{Fk056tD{ju?(16U{oZwf_?7b?jmlaN+DqDT1dw}?arc4%psEM z!I%a@4Zx@JoV|BMWOMuV1ln6-_eete9$+7c4uE-ofPAgB;dR~4xh36Oykj9&b8Imr zS_WV;K-cp43=w^bd{;`Y-*BccLfK~Ragy)`fZNM41pEOOpD`D7CA#tKK*cx`l1;~x z1Zpf5WAI4=@0J914~?Xb5`mqN;AB#|RM$1RC`1@UVPZ@Hkq_Y0%zS?^k~-%Er>_`i zLd^ID5CwcfOdl3a9T`Z$a&B8DIo!{kO$>S(;MIz1Y#a!#Ga>2tMFMroLjt2|TCy;Z zf|a=!&4!tN^0g52IyqvzQrff9T8hBIa-0z2%V2c>VxI7$I;Bz|G7wD;Rn0 z3nyg%E5=I4HvqJX8Sexm`qFZ&Woj=GvD|&<0EZRTXtAs3$dRj^YM2R<%+ef{=dK4v zL^hnZ1Mh3!$|S;IZU*CLxfqyCvy&bD#j1D;I)}(+;x7}^S^^HA%KkES;=G-m&af{HimJ!l6wkG;9?iu->E8G{7%?7olWQ02T1dO8&6WsziLh1<>sKyG zr|Z(*#JFOBe?DSU2;U9 z>n7JO*0m6;IsPOh+5y3b+Aa#mXFWBBA|MKvB91R;qf41Sk@<+7@8X*0Dt zpTx_+G!MX#(pxT2dPjjDKxr;(Wft2Nt9CDjBGlpU`cr_v4XVZ?*9rNn53>6eRiE#< zkh~e2&_#6O+Lw|nfN|G~93$elvefypa=Au90P_J_1j3}N``iXl{>s-C!7GAM<4rqq zZuVUttrB?FjISi3Mi6`u*ds~UQXcxQFW#1Jc+gM21uQTN;98RCy^V+USCh%o`SWh| zONe*ny+f)B@vfKNAXOdlrjOpCR2}iIm);;%9r31*-l0?-@vfKNAXOdlrjOpC{0lOz7p-n;++002ovPDHLkV1g_Dn8*MC literal 0 HcmV?d00001 diff --git a/static/image/uniui-header-bg.png b/static/image/uniui-header-bg.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3827ce94bea6c23076ef20956ea16a0d9e9c7d GIT binary patch literal 259722 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�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

-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 CAadmZ literal 0 HcmV?d00001 diff --git a/static/image/uniui-logo.png b/static/image/uniui-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3f0a8a27a9ce6b1b85a77bd965ca9f6c750952 GIT binary patch literal 3294 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 hAF3io)-m8?jtkk&o^nZ0I2pa$Z literal 0 HcmV?d00001 diff --git a/uni_modules/uni-card/changelog.md b/uni_modules/uni-card/changelog.md index 17647690..c3cd8c45 100644 --- a/uni_modules/uni-card/changelog.md +++ b/uni_modules/uni-card/changelog.md @@ -1,3 +1,5 @@ +## 1.3.1(2021-12-20) +- 修复 在vue页面下略缩图显示不正常的bug ## 1.3.0(2021-11-19) - 重构插槽的用法 ,header 替换为 title - 新增 actions 插槽 @@ -10,15 +12,15 @@ - 取消 note 属性 ,使用actions插槽代替 - 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-card](https://uniapp.dcloud.io/component/uniui/uni-card) -## 1.2.1(2021-07-30) -- 优化 vue3下事件警告的问题 -## 1.2.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.1.8(2021-07-01) -- 优化 图文卡片无图片加载时,提供占位图标 -- 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持) -- 修复 thumbnail 不存在仍然占位的 bug -## 1.1.7(2021-05-12) -- 新增 组件示例地址 -## 1.1.6(2021-02-04) -- 调整为uni_modules目录规范 +## 1.2.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.8(2021-07-01) +- 优化 图文卡片无图片加载时,提供占位图标 +- 新增 header 插槽,自定义卡片头部( 图文卡片 mode="style" 时,不支持) +- 修复 thumbnail 不存在仍然占位的 bug +## 1.1.7(2021-05-12) +- 新增 组件示例地址 +## 1.1.6(2021-02-04) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-card/components/uni-card/uni-card.vue b/uni_modules/uni-card/components/uni-card/uni-card.vue index 4def8f14..045c082a 100644 --- a/uni_modules/uni-card/components/uni-card/uni-card.vue +++ b/uni_modules/uni-card/components/uni-card/uni-card.vue @@ -183,7 +183,8 @@ margin-right: $uni-card-spacing; .uni-card__header-avatar-image { flex: 1; - width: 40px; + width: 40px; + height: 40px; } } diff --git a/uni_modules/uni-card/package.json b/uni_modules/uni-card/package.json index 4b4e5bd1..f16224de 100644 --- a/uni_modules/uni-card/package.json +++ b/uni_modules/uni-card/package.json @@ -1,90 +1,90 @@ -{ - "id": "uni-card", - "displayName": "uni-card 卡片", - "version": "1.3.0", - "description": "Card 组件,提供常见的卡片样式。", - "keywords": [ - "uni-ui", - "uniui", - "card", - "", - "卡片" -], - "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": [ +{ + "id": "uni-card", + "displayName": "uni-card 卡片", + "version": "1.3.1", + "description": "Card 组件,提供常见的卡片样式。", + "keywords": [ + "uni-ui", + "uniui", + "card", + "", + "卡片" +], + "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-icons", - "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" - } - } - } - } -} + "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" + } + } + } + } +} diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md index e3ff544f..292e4c79 100644 --- a/uni_modules/uni-collapse/changelog.md +++ b/uni_modules/uni-collapse/changelog.md @@ -1,30 +1,36 @@ +## 1.4.3(2022-01-25) +- 修复 初始化的时候 ,open 属性失效的bug +## 1.4.2(2022-01-21) +- 修复 微信小程序resize后组件收起的bug +## 1.4.1(2021-11-22) +- 修复 vue3中个别scss变量无法找到的问题 ## 1.4.0(2021-11-19) - 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-collapse](https://uniapp.dcloud.io/component/uniui/uni-collapse) -## 1.3.3(2021-08-17) -- 优化 show-arrow 属性默认为true -## 1.3.2(2021-08-17) -- 新增 show-arrow 属性,控制是否显示右侧箭头 -## 1.3.1(2021-07-30) -- 优化 vue3下小程序事件警告的问题 -## 1.3.0(2021-07-30) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.2.2(2021-07-21) -- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug -## 1.2.1(2021-07-21) -- 优化 组件示例 -## 1.2.0(2021-07-21) -- 新增 组件折叠动画 -- 新增 value\v-model 属性 ,动态修改面板折叠状态 -- 新增 title 插槽 ,可定义面板标题 -- 新增 border 属性 ,显示隐藏面板内容分隔线 -- 新增 title-border 属性 ,显示隐藏面板标题分隔线 -- 修复 resize 方法失效的Bug -- 修复 change 事件返回参数不正确的Bug -- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法 -## 1.1.7(2021-05-12) -- 新增 组件示例地址 -## 1.1.6(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 -## 1.1.5(2021-02-05) +## 1.3.3(2021-08-17) +- 优化 show-arrow 属性默认为true +## 1.3.2(2021-08-17) +- 新增 show-arrow 属性,控制是否显示右侧箭头 +## 1.3.1(2021-07-30) +- 优化 vue3下小程序事件警告的问题 +## 1.3.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.2.2(2021-07-21) +- 修复 由1.2.0版本引起的 change 事件返回 undefined 的Bug +## 1.2.1(2021-07-21) +- 优化 组件示例 +## 1.2.0(2021-07-21) +- 新增 组件折叠动画 +- 新增 value\v-model 属性 ,动态修改面板折叠状态 +- 新增 title 插槽 ,可定义面板标题 +- 新增 border 属性 ,显示隐藏面板内容分隔线 +- 新增 title-border 属性 ,显示隐藏面板标题分隔线 +- 修复 resize 方法失效的Bug +- 修复 change 事件返回参数不正确的Bug +- 优化 H5、App 平台自动更具内容更新高度,无需调用 reszie() 方法 +## 1.1.7(2021-05-12) +- 新增 组件示例地址 +## 1.1.6(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.1.5(2021-02-05) - 调整为uni_modules目录规范 \ No newline at end of file diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue index 5a52eab0..b2aad1fd 100644 --- a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue +++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue @@ -11,8 +11,7 @@ - @@ -96,7 +95,7 @@ type: Boolean, default: true }, - showArrow:{ + showArrow: { type: Boolean, default: true } @@ -115,31 +114,32 @@ watch: { open(val) { this.isOpen = val - this.onClick(val,'init') + this.onClick(val, 'init') } }, updated(e) { - this.$nextTick(()=> { + this.$nextTick(() => { this.init(true) }) }, - created(){ + created() { this.collapse = this.getCollapse() this.oldHeight = 0 - }, - // #ifndef VUE3 - // TODO vue2 - destroyed() { - if (this.__isUnmounted) return - this.uninstall() - }, + this.onClick(this.open, 'init') + }, + // #ifndef VUE3 + // TODO vue2 + destroyed() { + if (this.__isUnmounted) return + this.uninstall() + }, // #endif - // #ifdef VUE3 - // TODO vue3 - unmounted() { - this.__isUnmounted = true - this.uninstall() - }, + // #ifdef VUE3 + // TODO vue3 + unmounted() { + this.__isUnmounted = true + this.uninstall() + }, // #endif mounted() { if (!this.collapse) return @@ -181,14 +181,14 @@ }) } }, - onClick(isOpen,type) { + onClick(isOpen, type) { if (this.disabled) return this.isOpen = isOpen if (this.isOpen && this.collapse) { this.collapse.setAccordion(this) } - if(type !== 'init'){ - this.collapse.onChange(isOpen,this) + if (type !== 'init') { + this.collapse.onChange(isOpen, this) } }, getCollapseHeight(type, index = 0) { @@ -213,7 +213,7 @@ // #endif this.isheight = true if (type) return - this.onClick(this.open,'init') + this.onClick(this.isOpen, 'init') }) .exec() }, @@ -228,7 +228,7 @@ // #endif this.isheight = true if (type) return - this.onClick(this.open,'init') + this.onClick(this.open, 'init') } }) }, @@ -249,7 +249,7 @@ } - + diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json index 0cf3d308..65349cf9 100644 --- a/uni_modules/uni-collapse/package.json +++ b/uni_modules/uni-collapse/package.json @@ -1,89 +1,89 @@ -{ - "id": "uni-collapse", - "displayName": "uni-collapse 折叠面板", - "version": "1.4.0", - "description": "Collapse 组件,可以折叠 / 展开的内容区域。", - "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": { +{ + "id": "uni-collapse", + "displayName": "uni-collapse 折叠面板", + "version": "1.4.3", + "description": "Collapse 组件,可以折叠 / 展开的内容区域。", + "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" - } - } - } - } + "uni-scss", + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } } diff --git a/uni_modules/uni-collapse/readme.md b/uni_modules/uni-collapse/readme.md index ff32209a..bc758ebc 100644 --- a/uni_modules/uni-collapse/readme.md +++ b/uni_modules/uni-collapse/readme.md @@ -1,12 +1,12 @@ - - -## Collapse 折叠面板 -> **组件名:uni-collapse** -> 代码块: `uCollapse` -> 关联组件:`uni-collapse-item`、`uni-icons`。 - - -折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。 - + + +## Collapse 折叠面板 +> **组件名:uni-collapse** +> 代码块: `uCollapse` +> 关联组件:`uni-collapse-item`、`uni-icons`。 + + +折叠面板用来折叠/显示过长的内容或者是列表。通常是在多内容分类项使用,折叠不重要的内容,显示重要内容。点击可以展开折叠部分。 + ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-collapse) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-combox/changelog.md b/uni_modules/uni-combox/changelog.md index 958d03a6..15256a2e 100644 --- a/uni_modules/uni-combox/changelog.md +++ b/uni_modules/uni-combox/changelog.md @@ -1,6 +1,8 @@ -## 1.0.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-combox](https://uniapp.dcloud.io/component/uniui/uni-combox) +## 1.0.1(2021-11-23) +- 优化 label、label-width 属性 +## 1.0.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-combox](https://uniapp.dcloud.io/component/uniui/uni-combox) ## 0.1.0(2021-07-30) - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) ## 0.0.6(2021-05-12) diff --git a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue index 538853b0..98bf152e 100644 --- a/uni_modules/uni-combox/components/uni-combox/uni-combox.vue +++ b/uni_modules/uni-combox/components/uni-combox/uni-combox.vue @@ -1,9 +1,12 @@ diff --git a/pages/extUI/search-bar/search-bar.vue b/pages/extUI/search-bar/search-bar.vue index e536cf1f..34c3efee 100644 --- a/pages/extUI/search-bar/search-bar.vue +++ b/pages/extUI/search-bar/search-bar.vue @@ -19,7 +19,7 @@ - + diff --git a/pages/extUI/test/test.nvue b/pages/extUI/test/test.nvue index 7dadc257..9c49de73 100644 --- a/pages/extUI/test/test.nvue +++ b/pages/extUI/test/test.nvue @@ -30,7 +30,7 @@ 这是一个带封面和操作栏的卡片示例,此示例展示了封面插槽和操作栏插槽的用法。 - + 分享 @@ -56,7 +56,7 @@ 卡片组件通用来显示完整独立的一段信息,同时让用户理解他的作用。例如一篇文章的预览图、作者信息、时间等,卡片通常是更复杂和更详细信息的入口点。 - + 分享 @@ -88,7 +88,7 @@ - + 分享 diff --git a/uni_modules/uni-list/readme.md b/uni_modules/uni-list/readme.md index 1bc5b951..77e166e2 100644 --- a/uni_modules/uni-list/readme.md +++ b/uni_modules/uni-list/readme.md @@ -259,17 +259,17 @@ footer | 右/下内容插槽,可完全自定义右侧内容 ```html - 卡片组件通用来显示完整独立的一段信息,同时让用户理解他的作用。例如一篇文章的预览图、作者信息、时间等,卡片通常是更复杂和更详细信息的入口点。 - + 分享 @@ -88,7 +88,7 @@ - + 分享 From 1ee754641d12561125c8724211716782f357f005 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Wed, 6 Apr 2022 17:00:02 +0800 Subject: [PATCH 253/378] publish v3.3.7 --- changelog.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index d61ec141..fc918e5a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,5 @@ +## 3.3.7(2022-04-06) +- 新增 更新扩展组件 uni-nav-bar、uni-list 的展示页面 ## 3.3.6(2022-03-31) - 更新 uni-ui 组件及示例 ## 3.3.5(2022-03-30) diff --git a/package.json b/package.json index 5b5bdd3d..90470b84 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.3.6", + "version": "3.3.7", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From 86c15bf45d5f5c4c31095afe5010b3018a2de754 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Mon, 11 Apr 2022 17:47:10 +0800 Subject: [PATCH 254/378] fix(card): miss icon --- pages/extUI/card/card.nvue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/extUI/card/card.nvue b/pages/extUI/card/card.nvue index fc431339..9e3ec0d9 100644 --- a/pages/extUI/card/card.nvue +++ b/pages/extUI/card/card.nvue @@ -32,7 +32,7 @@ 这是一个带封面和操作栏的卡片示例,此示例展示了封面插槽和操作栏插槽的用法。 - + 分享 @@ -59,7 +59,7 @@ class="uni-body uni-mt-5">卡片组件通用来显示完整独立的一段信息,同时让用户理解他的作用。例如一篇文章的预览图、作者信息、时间等,卡片通常是更复杂和更详细信息的入口点。 - + 分享 @@ -91,7 +91,7 @@ - + 分享 From 75dcc3ee6baeb8ef67b6bd5d9d7d980563e85272 Mon Sep 17 00:00:00 2001 From: mehaotian <490272692@qq.com> Date: Wed, 20 Apr 2022 18:43:18 +0800 Subject: [PATCH 255/378] =?UTF-8?q?update:=20=E6=9B=B4=E6=96=B0=20uni-ui?= =?UTF-8?q?=20=E8=BF=90=E8=A1=8C=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/extUI/swiper-dot/swiper-dot.nvue | 6 ++-- .../components/uni-swipe-action-item/isPC.js | 6 ++-- .../components/uni-swipe-action-item/mpwxs.js | 32 +++++++++++-------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/pages/extUI/swiper-dot/swiper-dot.nvue b/pages/extUI/swiper-dot/swiper-dot.nvue index 052afcb2..c515c482 100644 --- a/pages/extUI/swiper-dot/swiper-dot.nvue +++ b/pages/extUI/swiper-dot/swiper-dot.nvue @@ -172,8 +172,10 @@ @media screen and (min-width: 500px) { .uni-swiper-dot-box { - width: 400px; - margin: 0 auto; + width: 400px; + /* #ifndef APP-NVUE */ + margin: 0 auto; + /* #endif */ margin-top: 8px; } diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js index 7f549f65..be2519a4 100644 --- a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js @@ -1,4 +1,4 @@ -export function isPC() { +export function isPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = true; @@ -8,5 +8,5 @@ export function isPC() { break; } } - return flag; -} \ No newline at end of file + return flag; +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js index 17736d8d..86c5ea90 100644 --- a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js @@ -1,8 +1,12 @@ -let mpMixins = {} -// #ifdef APP-VUE|| MP-WEIXIN || H5 +let mpMixins = {} + +// #ifdef H5 import { isPC -} from "./isPC" +} from "./isPC" +// #endif +// #ifdef APP-VUE|| MP-WEIXIN || H5 + mpMixins = { data() { return { @@ -14,7 +18,7 @@ mpMixins = { this.is_show = this.show } }, - created() { + created() { this.swipeaction = this.getSwipeAction() if (this.swipeaction.children !== undefined) { this.swipeaction.children.push(this) @@ -37,20 +41,18 @@ mpMixins = { } }, - appTouchStart(e) { - // #ifdef H5 - if (isPC()) return - // #endif + appTouchStart(e) { + let is_pc = isPC() || false + if (is_pc) return const { clientX } = e.changedTouches[0] this.clientX = clientX this.timestamp = new Date().getTime() }, - appTouchEnd(e, index, item, position) { - // #ifdef H5 - if (isPC()) return - // #endif + appTouchEnd(e, index, item, position) { + let is_pc = isPC() || false + if (is_pc) return const { clientX } = e.changedTouches[0] @@ -65,9 +67,11 @@ mpMixins = { }) } }, - onClickForPC(index, item, position) { + onClickForPC(index, item, position) { + + let is_pc = isPC() || false + if (is_pc) return // #ifdef H5 - if (!isPC()) return this.$emit('click', { content: item, index, From a6cc4b8b898e9941d18135c2d75df741480ec838 Mon Sep 17 00:00:00 2001 From: handongxun Date: Sat, 7 May 2022 10:56:20 +0800 Subject: [PATCH 256/378] =?UTF-8?q?update:=20ad=20=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/component/ad/ad.vue | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pages/component/ad/ad.vue b/pages/component/ad/ad.vue index 3c83dfda..450e5d6d 100644 --- a/pages/component/ad/ad.vue +++ b/pages/component/ad/ad.vue @@ -2,7 +2,12 @@ - + + + + + + {{adMessage}} From 3e0bdfc1c18f53b4b78f116209c020be477e32e2 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Sun, 8 May 2022 22:00:09 +0800 Subject: [PATCH 257/378] chore: sync from uni-ui --- pages.json | 21 +- pages/extUI/breadcrumb/breadcrumb.vue | 41 ++ pages/extUI/data-select/data-select.vue | 54 +++ pages/extUI/tooltip/tooltip.vue | 41 ++ pages/tabBar/extUI/extUI.nvue | 37 +- uni_modules/uni-breadcrumb/changelog.md | 2 + .../uni-breadcrumb-item.vue | 106 +++++ .../uni-breadcrumb/uni-breadcrumb.vue | 38 ++ uni_modules/uni-breadcrumb/package.json | 84 ++++ uni_modules/uni-breadcrumb/readme.md | 8 + uni_modules/uni-data-select/changelog.md | 4 + .../uni-data-select/uni-data-select.vue | 368 ++++++++++++++++++ uni_modules/uni-data-select/package.json | 87 +++++ uni_modules/uni-data-select/readme.md | 8 + uni_modules/uni-tooltip/changelog.md | 8 + .../components/uni-tooltip/uni-tooltip.vue | 68 ++++ uni_modules/uni-tooltip/package.json | 84 ++++ uni_modules/uni-tooltip/readme.md | 8 + 18 files changed, 1055 insertions(+), 12 deletions(-) create mode 100644 pages/extUI/breadcrumb/breadcrumb.vue create mode 100644 pages/extUI/data-select/data-select.vue create mode 100644 pages/extUI/tooltip/tooltip.vue create mode 100644 uni_modules/uni-breadcrumb/changelog.md create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue create mode 100644 uni_modules/uni-breadcrumb/package.json create mode 100644 uni_modules/uni-breadcrumb/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-tooltip/changelog.md create mode 100644 uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue create mode 100644 uni_modules/uni-tooltip/package.json create mode 100644 uni_modules/uni-tooltip/readme.md diff --git a/pages.json b/pages.json index b2940f74..68b8dce9 100644 --- a/pages.json +++ b/pages.json @@ -736,6 +736,12 @@ "navigationBarTitleText": "Badge 数字角标" } }, + { + "path": "breadcrumb/breadcrumb", + "style": { + "navigationBarTitleText": "Breadcrumb 面包屑" + } + }, { "path": "countdown/countdown", "style": { @@ -935,6 +941,12 @@ "navigationBarTitleText": "Title 章节标题" } }, + { + "path": "tooltip/tooltip", + "style": { + "navigationBarTitleText": "Tooltip 文字提示" + } + }, { "path": "link/link", "style": { @@ -986,6 +998,13 @@ "enablePullDownRefresh": false } }, + { + "path": "data-select/data-select", + "style": { + "navigationBarTitleText": "DataSelect 下拉框", + "enablePullDownRefresh": false + } + }, { "path": "datetime-picker/datetime-picker", "style": { @@ -1335,4 +1354,4 @@ } ] } -} \ No newline at end of file +} diff --git a/pages/extUI/breadcrumb/breadcrumb.vue b/pages/extUI/breadcrumb/breadcrumb.vue new file mode 100644 index 00000000..6b87f670 --- /dev/null +++ b/pages/extUI/breadcrumb/breadcrumb.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/pages/extUI/data-select/data-select.vue b/pages/extUI/data-select/data-select.vue new file mode 100644 index 00000000..1721e65e --- /dev/null +++ b/pages/extUI/data-select/data-select.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/pages/extUI/tooltip/tooltip.vue b/pages/extUI/tooltip/tooltip.vue new file mode 100644 index 00000000..fc8798f3 --- /dev/null +++ b/pages/extUI/tooltip/tooltip.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index 3180b120..d1d81eee 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -5,10 +5,13 @@ 以下是uni-app扩展组件示例,更多组件见插件市场: - + - - + + {{item.name}} @@ -34,6 +37,10 @@ name: "uni-badge 数字角标", url: "badge" }, + { + name: "uni-breadcrumb 面包屑", + url: "breadcrumb" + }, // { // name: "uni-calendar 日历", // url: "calendar" @@ -47,12 +54,12 @@ url: "collapse" }, - // #ifndef APP-NVUE + // #ifndef APP-NVUE { name: "uni-combox 组合框", url: "combox" }, - // #endif + // #endif { name: "uni-countdown 倒计时", url: "countdown" @@ -65,6 +72,10 @@ name: "uni-data-picker 数据驱动的picker选择器", url: "data-picker" }, + { + name: "uni-data-select 数据驱动的下拉框", + url: "data-select" + }, { name: "uni-dateformat 日期格式化", url: "dateformat" @@ -89,12 +100,12 @@ name: "uni-fav 收藏按钮", url: "fav" }, - // #ifndef APP-NVUE + // #ifndef APP-NVUE { name: "uni-file-picker 文件选择上传", url: "file-picker" }, - // #endif + // #endif { name: "uni-forms 表单", url: "forms" @@ -165,12 +176,12 @@ name: "uni-search-bar 搜索栏", url: "search-bar" }, - // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ + // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ { name: "section 标题栏", url: "section" }, - // #endif + // #endif { name: "uni-segmented-control 分段器", url: "segmented-control" @@ -192,7 +203,7 @@ name: "uni-table 表格", url: "table" }, - // #endif + // #endif { name: "uni-tag 标签", url: "tag" @@ -201,6 +212,10 @@ name: "uni-title 章节标题", url: "title" }, + { + name: "uni-tooltip 文字提示", + url: "tooltip" + }, { name: "uni-transition 过渡动画", url: "transition" @@ -250,4 +265,4 @@ \ No newline at end of file + diff --git a/uni_modules/uni-breadcrumb/changelog.md b/uni_modules/uni-breadcrumb/changelog.md new file mode 100644 index 00000000..b7b6f6f2 --- /dev/null +++ b/uni_modules/uni-breadcrumb/changelog.md @@ -0,0 +1,2 @@ +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue new file mode 100644 index 00000000..4d3f3986 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue @@ -0,0 +1,106 @@ + + + diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue new file mode 100644 index 00000000..a93f7351 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue @@ -0,0 +1,38 @@ + + + diff --git a/uni_modules/uni-breadcrumb/package.json b/uni_modules/uni-breadcrumb/package.json new file mode 100644 index 00000000..1fd5f0aa --- /dev/null +++ b/uni_modules/uni-breadcrumb/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-breadcrumb", + "displayName": "uni-breadcrumb", + "version": "0.1.0", + "description": "uni-breadcrumb", + "keywords": [ + "uni-breadcrumb", + "breadcrumb", + "uni-ui", + "面包屑导航", + "面包屑" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} diff --git a/uni_modules/uni-breadcrumb/readme.md b/uni_modules/uni-breadcrumb/readme.md new file mode 100644 index 00000000..4ad5f0c5 --- /dev/null +++ b/uni_modules/uni-breadcrumb/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-breadcrumb** +> 代码块: `uBreadcrumb` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-breadcrumb) +#### 如使用过程中有任何问题,或者您对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 00000000..957824e6 --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,4 @@ +## 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 00000000..152b6054 --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 00000000..b3344ff1 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "0.1.1", + "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": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md new file mode 100644 index 00000000..8b59e4a1 --- /dev/null +++ b/uni_modules/uni-data-select/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-data-select** +> 代码块: `uDataSelect` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-tooltip/changelog.md b/uni_modules/uni-tooltip/changelog.md new file mode 100644 index 00000000..1e0ca85c --- /dev/null +++ b/uni_modules/uni-tooltip/changelog.md @@ -0,0 +1,8 @@ +## 0.2.0(2022-05-07) +**注意:破坏性更新** +- 更新 text 属性变更为 content +- 更新 移除 width 属性 +## 0.1.1(2022-04-27) +- 修复 组件根 text 嵌套组件 warning +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue new file mode 100644 index 00000000..8f9a6f2b --- /dev/null +++ b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/uni_modules/uni-tooltip/package.json b/uni_modules/uni-tooltip/package.json new file mode 100644 index 00000000..e7e2659d --- /dev/null +++ b/uni_modules/uni-tooltip/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-tooltip", + "displayName": "uni-tooltip", + "version": "0.2.0", + "description": "uni-tooltip", + "keywords": [ + "uni-tooltip", + "uni-ui", + "tooltip", + "tip", + "文字提示" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} diff --git a/uni_modules/uni-tooltip/readme.md b/uni_modules/uni-tooltip/readme.md new file mode 100644 index 00000000..faafa2ec --- /dev/null +++ b/uni_modules/uni-tooltip/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-tooltip** +> 代码块: `uTooltip` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tooltip) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 From a0607eb0d05be5e6257b27926416000c65551b0c Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Sun, 8 May 2022 22:06:23 +0800 Subject: [PATCH 258/378] publish v3.3.8 --- changelog.md | 9 +++++++++ package.json | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index fc918e5a..ffe6d8bc 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,12 @@ +## 3.3.8(2022-05-08) +- 新增 同步 uni-ui@1.4.15 + - uni-data-picker 修复 字节小程序 本地数据无法选择下一级的Bug + - uni-data-select 新增 记住上次的选项(仅 collection 存在时有效) + - uni-search-bar 修复 vue3 input 事件不生效的bug + - uni-search-bar 修复 多余代码导致的bug + - uni-tooltip 更新 text 属性变更为 content + - uni-tooltip 更新 移除 width 属性 + - uni-tooltip 修复 组件根 text 嵌套组件 warning ## 3.3.7(2022-04-06) - 新增 更新扩展组件 uni-nav-bar、uni-list 的展示页面 ## 3.3.6(2022-03-31) diff --git a/package.json b/package.json index 90470b84..b6f1e127 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.3.7", + "version": "3.3.8", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From 92a244b58d2b304e3800cc71938ea219d33ef981 Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Sun, 8 May 2022 22:11:13 +0800 Subject: [PATCH 259/378] chore: merge dev --- changelog.md | 9 + package.json | 2 +- pages.json | 21 +- pages/component/ad/ad.vue | 7 +- pages/extUI/breadcrumb/breadcrumb.vue | 41 ++ pages/extUI/card/card.nvue | 6 +- pages/extUI/data-select/data-select.vue | 54 +++ pages/extUI/swiper-dot/swiper-dot.nvue | 6 +- pages/extUI/tooltip/tooltip.vue | 41 ++ pages/tabBar/extUI/extUI.nvue | 37 +- uni_modules/uni-breadcrumb/changelog.md | 2 + .../uni-breadcrumb-item.vue | 106 +++++ .../uni-breadcrumb/uni-breadcrumb.vue | 38 ++ uni_modules/uni-breadcrumb/package.json | 84 ++++ uni_modules/uni-breadcrumb/readme.md | 8 + uni_modules/uni-data-select/changelog.md | 4 + .../uni-data-select/uni-data-select.vue | 368 ++++++++++++++++++ uni_modules/uni-data-select/package.json | 87 +++++ uni_modules/uni-data-select/readme.md | 8 + .../components/uni-swipe-action-item/isPC.js | 6 +- .../components/uni-swipe-action-item/mpwxs.js | 32 +- uni_modules/uni-tooltip/changelog.md | 8 + .../components/uni-tooltip/uni-tooltip.vue | 68 ++++ uni_modules/uni-tooltip/package.json | 84 ++++ uni_modules/uni-tooltip/readme.md | 8 + 25 files changed, 1099 insertions(+), 36 deletions(-) create mode 100644 pages/extUI/breadcrumb/breadcrumb.vue create mode 100644 pages/extUI/data-select/data-select.vue create mode 100644 pages/extUI/tooltip/tooltip.vue create mode 100644 uni_modules/uni-breadcrumb/changelog.md create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue create mode 100644 uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue create mode 100644 uni_modules/uni-breadcrumb/package.json create mode 100644 uni_modules/uni-breadcrumb/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-tooltip/changelog.md create mode 100644 uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue create mode 100644 uni_modules/uni-tooltip/package.json create mode 100644 uni_modules/uni-tooltip/readme.md diff --git a/changelog.md b/changelog.md index fc918e5a..ffe6d8bc 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,12 @@ +## 3.3.8(2022-05-08) +- 新增 同步 uni-ui@1.4.15 + - uni-data-picker 修复 字节小程序 本地数据无法选择下一级的Bug + - uni-data-select 新增 记住上次的选项(仅 collection 存在时有效) + - uni-search-bar 修复 vue3 input 事件不生效的bug + - uni-search-bar 修复 多余代码导致的bug + - uni-tooltip 更新 text 属性变更为 content + - uni-tooltip 更新 移除 width 属性 + - uni-tooltip 修复 组件根 text 嵌套组件 warning ## 3.3.7(2022-04-06) - 新增 更新扩展组件 uni-nav-bar、uni-list 的展示页面 ## 3.3.6(2022-03-31) diff --git a/package.json b/package.json index 90470b84..b6f1e127 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.3.7", + "version": "3.3.8", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" diff --git a/pages.json b/pages.json index b2940f74..68b8dce9 100644 --- a/pages.json +++ b/pages.json @@ -736,6 +736,12 @@ "navigationBarTitleText": "Badge 数字角标" } }, + { + "path": "breadcrumb/breadcrumb", + "style": { + "navigationBarTitleText": "Breadcrumb 面包屑" + } + }, { "path": "countdown/countdown", "style": { @@ -935,6 +941,12 @@ "navigationBarTitleText": "Title 章节标题" } }, + { + "path": "tooltip/tooltip", + "style": { + "navigationBarTitleText": "Tooltip 文字提示" + } + }, { "path": "link/link", "style": { @@ -986,6 +998,13 @@ "enablePullDownRefresh": false } }, + { + "path": "data-select/data-select", + "style": { + "navigationBarTitleText": "DataSelect 下拉框", + "enablePullDownRefresh": false + } + }, { "path": "datetime-picker/datetime-picker", "style": { @@ -1335,4 +1354,4 @@ } ] } -} \ No newline at end of file +} diff --git a/pages/component/ad/ad.vue b/pages/component/ad/ad.vue index 3c83dfda..450e5d6d 100644 --- a/pages/component/ad/ad.vue +++ b/pages/component/ad/ad.vue @@ -2,7 +2,12 @@ - + + + + + + {{adMessage}} diff --git a/pages/extUI/breadcrumb/breadcrumb.vue b/pages/extUI/breadcrumb/breadcrumb.vue new file mode 100644 index 00000000..6b87f670 --- /dev/null +++ b/pages/extUI/breadcrumb/breadcrumb.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/pages/extUI/card/card.nvue b/pages/extUI/card/card.nvue index fc431339..9e3ec0d9 100644 --- a/pages/extUI/card/card.nvue +++ b/pages/extUI/card/card.nvue @@ -32,7 +32,7 @@ 这是一个带封面和操作栏的卡片示例,此示例展示了封面插槽和操作栏插槽的用法。 - + 分享 @@ -59,7 +59,7 @@ class="uni-body uni-mt-5">卡片组件通用来显示完整独立的一段信息,同时让用户理解他的作用。例如一篇文章的预览图、作者信息、时间等,卡片通常是更复杂和更详细信息的入口点。 - + 分享 @@ -91,7 +91,7 @@ - + 分享 diff --git a/pages/extUI/data-select/data-select.vue b/pages/extUI/data-select/data-select.vue new file mode 100644 index 00000000..1721e65e --- /dev/null +++ b/pages/extUI/data-select/data-select.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/pages/extUI/swiper-dot/swiper-dot.nvue b/pages/extUI/swiper-dot/swiper-dot.nvue index 052afcb2..c515c482 100644 --- a/pages/extUI/swiper-dot/swiper-dot.nvue +++ b/pages/extUI/swiper-dot/swiper-dot.nvue @@ -172,8 +172,10 @@ @media screen and (min-width: 500px) { .uni-swiper-dot-box { - width: 400px; - margin: 0 auto; + width: 400px; + /* #ifndef APP-NVUE */ + margin: 0 auto; + /* #endif */ margin-top: 8px; } diff --git a/pages/extUI/tooltip/tooltip.vue b/pages/extUI/tooltip/tooltip.vue new file mode 100644 index 00000000..fc8798f3 --- /dev/null +++ b/pages/extUI/tooltip/tooltip.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index 3180b120..d1d81eee 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -5,10 +5,13 @@ 以下是uni-app扩展组件示例,更多组件见插件市场: - + - - + + {{item.name}} @@ -34,6 +37,10 @@ name: "uni-badge 数字角标", url: "badge" }, + { + name: "uni-breadcrumb 面包屑", + url: "breadcrumb" + }, // { // name: "uni-calendar 日历", // url: "calendar" @@ -47,12 +54,12 @@ url: "collapse" }, - // #ifndef APP-NVUE + // #ifndef APP-NVUE { name: "uni-combox 组合框", url: "combox" }, - // #endif + // #endif { name: "uni-countdown 倒计时", url: "countdown" @@ -65,6 +72,10 @@ name: "uni-data-picker 数据驱动的picker选择器", url: "data-picker" }, + { + name: "uni-data-select 数据驱动的下拉框", + url: "data-select" + }, { name: "uni-dateformat 日期格式化", url: "dateformat" @@ -89,12 +100,12 @@ name: "uni-fav 收藏按钮", url: "fav" }, - // #ifndef APP-NVUE + // #ifndef APP-NVUE { name: "uni-file-picker 文件选择上传", url: "file-picker" }, - // #endif + // #endif { name: "uni-forms 表单", url: "forms" @@ -165,12 +176,12 @@ name: "uni-search-bar 搜索栏", url: "search-bar" }, - // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ + // #ifndef APP || H5 || MP-WEIXIN || MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || MP-QQ { name: "section 标题栏", url: "section" }, - // #endif + // #endif { name: "uni-segmented-control 分段器", url: "segmented-control" @@ -192,7 +203,7 @@ name: "uni-table 表格", url: "table" }, - // #endif + // #endif { name: "uni-tag 标签", url: "tag" @@ -201,6 +212,10 @@ name: "uni-title 章节标题", url: "title" }, + { + name: "uni-tooltip 文字提示", + url: "tooltip" + }, { name: "uni-transition 过渡动画", url: "transition" @@ -250,4 +265,4 @@ \ No newline at end of file + diff --git a/uni_modules/uni-breadcrumb/changelog.md b/uni_modules/uni-breadcrumb/changelog.md new file mode 100644 index 00000000..b7b6f6f2 --- /dev/null +++ b/uni_modules/uni-breadcrumb/changelog.md @@ -0,0 +1,2 @@ +## 0.1.0(2022-04-22) +- 初始化 diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue new file mode 100644 index 00000000..4d3f3986 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb-item/uni-breadcrumb-item.vue @@ -0,0 +1,106 @@ + + + diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue new file mode 100644 index 00000000..a93f7351 --- /dev/null +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue @@ -0,0 +1,38 @@ + + + diff --git a/uni_modules/uni-breadcrumb/package.json b/uni_modules/uni-breadcrumb/package.json new file mode 100644 index 00000000..1fd5f0aa --- /dev/null +++ b/uni_modules/uni-breadcrumb/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-breadcrumb", + "displayName": "uni-breadcrumb", + "version": "0.1.0", + "description": "uni-breadcrumb", + "keywords": [ + "uni-breadcrumb", + "breadcrumb", + "uni-ui", + "面包屑导航", + "面包屑" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} diff --git a/uni_modules/uni-breadcrumb/readme.md b/uni_modules/uni-breadcrumb/readme.md new file mode 100644 index 00000000..4ad5f0c5 --- /dev/null +++ b/uni_modules/uni-breadcrumb/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-breadcrumb** +> 代码块: `uBreadcrumb` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-breadcrumb) +#### 如使用过程中有任何问题,或者您对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 00000000..957824e6 --- /dev/null +++ b/uni_modules/uni-data-select/changelog.md @@ -0,0 +1,4 @@ +## 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 00000000..152b6054 --- /dev/null +++ b/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.vue @@ -0,0 +1,368 @@ + + + + + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json new file mode 100644 index 00000000..b3344ff1 --- /dev/null +++ b/uni_modules/uni-data-select/package.json @@ -0,0 +1,87 @@ +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "0.1.1", + "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": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-data-select/readme.md b/uni_modules/uni-data-select/readme.md new file mode 100644 index 00000000..8b59e4a1 --- /dev/null +++ b/uni_modules/uni-data-select/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-data-select** +> 代码块: `uDataSelect` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-select) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js index 7f549f65..be2519a4 100644 --- a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/isPC.js @@ -1,4 +1,4 @@ -export function isPC() { +export function isPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = true; @@ -8,5 +8,5 @@ export function isPC() { break; } } - return flag; -} \ No newline at end of file + return flag; +} diff --git a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js index 17736d8d..86c5ea90 100644 --- a/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js +++ b/uni_modules/uni-swipe-action/components/uni-swipe-action-item/mpwxs.js @@ -1,8 +1,12 @@ -let mpMixins = {} -// #ifdef APP-VUE|| MP-WEIXIN || H5 +let mpMixins = {} + +// #ifdef H5 import { isPC -} from "./isPC" +} from "./isPC" +// #endif +// #ifdef APP-VUE|| MP-WEIXIN || H5 + mpMixins = { data() { return { @@ -14,7 +18,7 @@ mpMixins = { this.is_show = this.show } }, - created() { + created() { this.swipeaction = this.getSwipeAction() if (this.swipeaction.children !== undefined) { this.swipeaction.children.push(this) @@ -37,20 +41,18 @@ mpMixins = { } }, - appTouchStart(e) { - // #ifdef H5 - if (isPC()) return - // #endif + appTouchStart(e) { + let is_pc = isPC() || false + if (is_pc) return const { clientX } = e.changedTouches[0] this.clientX = clientX this.timestamp = new Date().getTime() }, - appTouchEnd(e, index, item, position) { - // #ifdef H5 - if (isPC()) return - // #endif + appTouchEnd(e, index, item, position) { + let is_pc = isPC() || false + if (is_pc) return const { clientX } = e.changedTouches[0] @@ -65,9 +67,11 @@ mpMixins = { }) } }, - onClickForPC(index, item, position) { + onClickForPC(index, item, position) { + + let is_pc = isPC() || false + if (is_pc) return // #ifdef H5 - if (!isPC()) return this.$emit('click', { content: item, index, diff --git a/uni_modules/uni-tooltip/changelog.md b/uni_modules/uni-tooltip/changelog.md new file mode 100644 index 00000000..1e0ca85c --- /dev/null +++ b/uni_modules/uni-tooltip/changelog.md @@ -0,0 +1,8 @@ +## 0.2.0(2022-05-07) +**注意:破坏性更新** +- 更新 text 属性变更为 content +- 更新 移除 width 属性 +## 0.1.1(2022-04-27) +- 修复 组件根 text 嵌套组件 warning +## 0.1.0(2022-04-21) +- 初始化 diff --git a/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue new file mode 100644 index 00000000..8f9a6f2b --- /dev/null +++ b/uni_modules/uni-tooltip/components/uni-tooltip/uni-tooltip.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/uni_modules/uni-tooltip/package.json b/uni_modules/uni-tooltip/package.json new file mode 100644 index 00000000..e7e2659d --- /dev/null +++ b/uni_modules/uni-tooltip/package.json @@ -0,0 +1,84 @@ +{ + "id": "uni-tooltip", + "displayName": "uni-tooltip", + "version": "0.2.0", + "description": "uni-tooltip", + "keywords": [ + "uni-tooltip", + "uni-ui", + "tooltip", + "tip", + "文字提示" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "y", + "联盟": "y" + } + } + } + } +} diff --git a/uni_modules/uni-tooltip/readme.md b/uni_modules/uni-tooltip/readme.md new file mode 100644 index 00000000..faafa2ec --- /dev/null +++ b/uni_modules/uni-tooltip/readme.md @@ -0,0 +1,8 @@ +## Badge 数字角标 +> **组件名:uni-tooltip** +> 代码块: `uTooltip` + +数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tooltip) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 From 6a3fbf184ba4eb980070c0f201308029a36eb91b Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Sun, 8 May 2022 23:21:20 +0800 Subject: [PATCH 260/378] fix(uni-data-select): select invaild when value is 0 --- uni_modules/uni-data-select/changelog.md | 2 ++ .../uni-data-select/uni-data-select.vue | 33 ++++++++++++------- uni_modules/uni-data-select/package.json | 5 +-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md index 957824e6..9d68a573 100644 --- a/uni_modules/uni-data-select/changelog.md +++ b/uni_modules/uni-data-select/changelog.md @@ -1,3 +1,5 @@ +## 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 index 152b6054..22ecd7b8 100644 --- 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 @@ -138,20 +138,31 @@ } }, methods: { - initDefVal() { - let defItem = '' - if (this.defItem > 0 && this.defItem < this.mixinDatacomResData.length) { - defItem = this.mixinDatacomResData[this.defItem - 1].value + initDefVal() { + let defValue = '' + if (this.value ||this.value === 0) { + defValue = this.value + } else if(this.modelValue || this.modelValue === 0 ) { + defValue = this.modelValue + } else { + let strogeValue + if (this.collection) { + strogeValue = uni.getStorageSync(this.last) + } + if (strogeValue || strogeValue === 0) { + defValue = strogeValue + } else { + let defItem = '' + if (this.defItem > 0 && this.defItem < this.mixinDatacomResData.length) { + defItem = this.mixinDatacomResData[this.defItem - 1].value + } + defValue = defItem + } + this.emit(defValue) } - let strogeValue - if (this.collection) { - strogeValue = uni.getStorageSync(this.last) - } - const defValue = this.value || this.modelValue || strogeValue || defItem const def = this.mixinDatacomResData.find(item => item.value === defValue) this.current = def ? this.formatItemName(def) : '' - this.emit(defValue) - }, + }, clearVal() { this.emit('') diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json index b3344ff1..a2814db2 100644 --- a/uni_modules/uni-data-select/package.json +++ b/uni_modules/uni-data-select/package.json @@ -1,7 +1,7 @@ { "id": "uni-data-select", "displayName": "uni-data-select 下拉框选择器", - "version": "0.1.1", + "version": "0.1.2", "description": "通过数据驱动的下拉框选择器", "keywords": [ "uni-ui", @@ -71,7 +71,8 @@ "阿里": "y", "百度": "y", "字节跳动": "y", - "QQ": "y" + "QQ": "y", + "京东": "u" }, "快应用": { "华为": "y", From b54b85d77bc8d72c57141db8bfc3bfda7649586e Mon Sep 17 00:00:00 2001 From: tianjiaxing Date: Sun, 8 May 2022 23:21:20 +0800 Subject: [PATCH 261/378] fix(uni-data-select): select invaild when value is 0 --- uni_modules/uni-data-select/changelog.md | 2 ++ .../uni-data-select/uni-data-select.vue | 33 ++++++++++++------- uni_modules/uni-data-select/package.json | 5 +-- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md index 957824e6..9d68a573 100644 --- a/uni_modules/uni-data-select/changelog.md +++ b/uni_modules/uni-data-select/changelog.md @@ -1,3 +1,5 @@ +## 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 index 152b6054..22ecd7b8 100644 --- 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 @@ -138,20 +138,31 @@ } }, methods: { - initDefVal() { - let defItem = '' - if (this.defItem > 0 && this.defItem < this.mixinDatacomResData.length) { - defItem = this.mixinDatacomResData[this.defItem - 1].value + initDefVal() { + let defValue = '' + if (this.value ||this.value === 0) { + defValue = this.value + } else if(this.modelValue || this.modelValue === 0 ) { + defValue = this.modelValue + } else { + let strogeValue + if (this.collection) { + strogeValue = uni.getStorageSync(this.last) + } + if (strogeValue || strogeValue === 0) { + defValue = strogeValue + } else { + let defItem = '' + if (this.defItem > 0 && this.defItem < this.mixinDatacomResData.length) { + defItem = this.mixinDatacomResData[this.defItem - 1].value + } + defValue = defItem + } + this.emit(defValue) } - let strogeValue - if (this.collection) { - strogeValue = uni.getStorageSync(this.last) - } - const defValue = this.value || this.modelValue || strogeValue || defItem const def = this.mixinDatacomResData.find(item => item.value === defValue) this.current = def ? this.formatItemName(def) : '' - this.emit(defValue) - }, + }, clearVal() { this.emit('') diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json index b3344ff1..a2814db2 100644 --- a/uni_modules/uni-data-select/package.json +++ b/uni_modules/uni-data-select/package.json @@ -1,7 +1,7 @@ { "id": "uni-data-select", "displayName": "uni-data-select 下拉框选择器", - "version": "0.1.1", + "version": "0.1.2", "description": "通过数据驱动的下拉框选择器", "keywords": [ "uni-ui", @@ -71,7 +71,8 @@ "阿里": "y", "百度": "y", "字节跳动": "y", - "QQ": "y" + "QQ": "y", + "京东": "u" }, "快应用": { "华为": "y", From 096a71fa386d76195aea9f4bebfd8cbb62633fc8 Mon Sep 17 00:00:00 2001 From: zhenyuWang <13641039885@163.com> Date: Wed, 29 Jun 2022 16:11:18 +0800 Subject: [PATCH 262/378] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=20ios=20?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/index.html b/index.html index b61f63ec..407bd65f 100644 --- a/index.html +++ b/index.html @@ -3,6 +3,13 @@ + From 7521ff3c1940a839fe9e7b8ece24e5769c6fdb10 Mon Sep 17 00:00:00 2001 From: zhenyuWang <13641039885@163.com> Date: Wed, 29 Jun 2022 16:11:18 +0800 Subject: [PATCH 263/378] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=20ios=20?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/index.html b/index.html index b61f63ec..407bd65f 100644 --- a/index.html +++ b/index.html @@ -3,6 +3,13 @@ + From 732b1c75bf0c5835ab13f99a1841669cec3e1c95 Mon Sep 17 00:00:00 2001 From: zhenyuWang <13641039885@163.com> Date: Wed, 29 Jun 2022 16:22:51 +0800 Subject: [PATCH 264/378] update: publish 3.3.9 --- changelog.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index ffe6d8bc..34b9c541 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,5 @@ +## 3.3.9(2022-06-29) +- 新增 支持 ios 安全区 ## 3.3.8(2022-05-08) - 新增 同步 uni-ui@1.4.15 - uni-data-picker 修复 字节小程序 本地数据无法选择下一级的Bug diff --git a/package.json b/package.json index b6f1e127..fce66ef6 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.3.8", + "version": "3.3.9", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From 1958f3d48665be9d19bb0b08ec9564dbfa5ffff4 Mon Sep 17 00:00:00 2001 From: zhenyuWang <13641039885@163.com> Date: Wed, 29 Jun 2022 16:22:51 +0800 Subject: [PATCH 265/378] update: publish 3.3.9 --- changelog.md | 2 ++ package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.md b/changelog.md index ffe6d8bc..34b9c541 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,5 @@ +## 3.3.9(2022-06-29) +- 新增 支持 ios 安全区 ## 3.3.8(2022-05-08) - 新增 同步 uni-ui@1.4.15 - uni-data-picker 修复 字节小程序 本地数据无法选择下一级的Bug diff --git a/package.json b/package.json index b6f1e127..fce66ef6 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "id": "hello-uniapp", "name": "hello-uniapp", "displayName": "hello-uniapp 示例工程", - "version": "3.3.8", + "version": "3.3.9", "description": "uni-app 框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验 uni-app 的强大功能", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" From b8a5855b70b6f6fb4f1ca84e18bea2fff96f8268 Mon Sep 17 00:00:00 2001 From: zhenyuWang <13641039885@163.com> Date: Wed, 29 Jun 2022 19:51:30 +0800 Subject: [PATCH 266/378] =?UTF-8?q?fix:=20=E6=94=AF=E6=8C=81=20ios=20?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 14 +++++++------- index.html | 1 - package.json | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/changelog.md b/changelog.md index 34b9c541..312be195 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,4 @@ -## 3.3.9(2022-06-29) +## 3.4.0(2022-06-29) - 新增 支持 ios 安全区 ## 3.3.8(2022-05-08) - 新增 同步 uni-ui@1.4.15 @@ -23,7 +23,7 @@ - 修复 删除 map.nvue 中多余的 enableOverlooking 变量 - 修复 swipe-dot.nvue 中条件编译媒体查询 ## 3.3.2(2022-01-26) -- 修复 默认运行到 vue2 +- 修复 默认运行到 vue2 ## 3.3.1(2022-01-26) - 新增 同步 uni-ui@1.4.11 - uni-collapse 修复 微信小程序resize后组件收起的bug @@ -61,7 +61,7 @@ - 修复 uni-popup 示例的 button 文字在 iPhone 5 上换行的 bug - 修复 uni-table 示例,页面顶部距离不对的 bug - 修复 GlobalData示例,在vue3是无效的 bug -- 优化 删除无用的 project.swan.json 文件 +- 优化 删除无用的 project.swan.json 文件 ## 3.2.6(2021-10-08) - 由于体验问题,暂时撤销 uni-ui 以 uni_modules 方式引入的修改 @@ -91,10 +91,10 @@ - uni-file-picker 修复 v-model 值设为 null 报错的Bug - uni-swipe-action 新增 close-all 方法,关闭所有已打开的组件 - uni-swipe-action 新增 resize() 方法,在非微信小程序、h5、app-vue端出现不能滑动的问题的时候,重置组件 - - uni-swipe-action 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 + - uni-swipe-action 修复 app 端偶尔出现类似 Page[x][-x,xx;-x,xx,x,x-x] 的问题 - uni-swipe-action 优化 微信小程序、h5、app-vue 滑动逻辑,避免出现动态新增组件后不能滑动的问题 - + ## 3.2.3(2021-08-27) - 优化 tabbar 页面移除 vuex 相关代码 - 新增 适配 vue3 (app) @@ -119,9 +119,9 @@ ## 3.2.1(2021-07-31) - 新增 同步 uni-ui@1.3.8 ## 3.2.0(2021-07-30) -- 新增 同时兼容 vue2 & vue3 +- 新增 同时兼容 vue2 & vue3 ## 3.1.20(2021-07-30) -- 新增 同时兼容 vue2 & vue3 +- 新增 同时兼容 vue2 & vue3 ## 3.1.17(2021-05-26) - 修复 3.1.16 依赖 sass 的问题 - 条件编译 nuve 不支持 css 属性 diff --git a/index.html b/index.html index 407bd65f..c3ff205f 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,6 @@ - <%= htmlWebpackPlugin.options.title %> From 73aff1124c2e17029e0df221efc84b9b896cfdd5 Mon Sep 17 00:00:00 2001 From: mehaotian <490272692@qq.com> Date: Thu, 30 Jun 2022 18:14:45 +0800 Subject: [PATCH 269/378] =?UTF-8?q?update:=20=E5=90=8C=E6=AD=A5uni-ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- manifest.json | 60 +- pages/extUI/breadcrumb/breadcrumb.vue | 6 +- pages/extUI/calendar/calendar.vue | 126 ++ pages/extUI/data-checkbox/data-checkbox.vue | 67 - pages/extUI/data-select/data-select.vue | 2 +- pages/extUI/forms/forms.vue | 27 +- pages/extUI/nav-bar/nav-bar.nvue | 8 +- pages/extUI/pagination/pagination.vue | 2 +- pages/extUI/search-bar/search-bar.vue | 5 +- pages/extUI/test/color.vue | 196 --- pages/extUI/test/test.nvue | 192 --- pages/extUI/title/title.vue | 4 +- uni_modules/uni-breadcrumb/changelog.md | 8 +- .../uni-breadcrumb-item.vue | 95 +- .../uni-breadcrumb/uni-breadcrumb.vue | 9 +- uni_modules/uni-breadcrumb/package.json | 21 +- uni_modules/uni-breadcrumb/readme.md | 68 +- uni_modules/uni-config-center/changelog.md | 4 + uni_modules/uni-config-center/package.json | 80 ++ uni_modules/uni-config-center/readme.md | 93 ++ .../common/uni-config-center/index.js | 1 + .../common/uni-config-center/package.json | 9 + uni_modules/uni-data-checkbox/changelog.md | 2 + .../uni-data-checkbox/uni-data-checkbox.vue | 48 +- uni_modules/uni-data-checkbox/package.json | 2 +- uni_modules/uni-data-picker/changelog.md | 114 +- .../components/uni-data-picker/keypress.js | 90 +- .../uni-data-picker/uni-data-picker.vue | 4 +- .../uni-data-pickerview/uni-data-picker.js | 1126 ++++++++--------- uni_modules/uni-data-picker/package.json | 182 +-- uni_modules/uni-data-picker/readme.md | 42 +- uni_modules/uni-data-select/changelog.md | 4 + .../uni-data-select/uni-data-select.vue | 143 ++- uni_modules/uni-data-select/package.json | 16 +- uni_modules/uni-data-select/readme.md | 4 +- uni_modules/uni-datetime-picker/changelog.md | 6 + .../uni-datetime-picker/calendar.vue | 21 +- .../uni-datetime-picker/i18n/en.json | 15 +- .../uni-datetime-picker/i18n/zh-Hans.json | 21 +- .../uni-datetime-picker/i18n/zh-Hant.json | 41 +- .../uni-datetime-picker.vue | 163 ++- uni_modules/uni-datetime-picker/package.json | 2 +- uni_modules/uni-easyinput/changelog.md | 72 +- .../uni-easyinput/uni-easyinput.vue | 362 ++++-- uni_modules/uni-easyinput/package.json | 176 +-- uni_modules/uni-fav/changelog.md | 30 +- .../uni-fav/components/uni-fav/uni-fav.vue | 79 +- uni_modules/uni-fav/package.json | 176 +-- uni_modules/uni-forms/changelog.md | 11 + .../uni-forms-item/uni-forms-item.vue | 1021 ++++++++------- .../components/uni-forms/uni-forms.vue | 461 +++---- .../uni-forms/components/uni-forms/utils.js | 293 +++++ uni_modules/uni-forms/package.json | 2 +- uni_modules/uni-goods-nav/changelog.md | 28 +- .../uni-goods-nav/uni-goods-nav.vue | 11 +- uni_modules/uni-goods-nav/package.json | 172 +-- uni_modules/uni-group/changelog.md | 18 +- .../components/uni-group/uni-group.vue | 26 +- uni_modules/uni-group/package.json | 172 +-- uni_modules/uni-group/readme.md | 10 +- uni_modules/uni-id/changelog.md | 105 ++ uni_modules/uni-id/package.json | 88 ++ uni_modules/uni-id/readme.md | 33 + .../cloudfunctions/common/uni-id/LICENSE.md | 201 +++ .../cloudfunctions/common/uni-id/index.js | 1 + .../cloudfunctions/common/uni-id/package.json | 16 + uni_modules/uni-nav-bar/changelog.md | 4 + .../components/uni-nav-bar/uni-nav-bar.vue | 13 +- uni_modules/uni-nav-bar/package.json | 2 +- uni_modules/uni-popup/changelog.md | 2 + .../components/uni-popup/uni-popup.vue | 3 +- uni_modules/uni-popup/package.json | 2 +- uni_modules/uni-search-bar/changelog.md | 54 +- .../uni-search-bar/uni-search-bar.vue | 97 +- uni_modules/uni-search-bar/package.json | 174 +-- uni_modules/uni-search-bar/readme.md | 2 +- uni_modules/uni-swipe-action/changelog.md | 74 +- .../uni-swipe-action-item/bindingx.js | 2 + .../components/uni-swipe-action-item/isPC.js | 4 +- .../uni-swipe-action-item/mpalipay.js | 82 +- .../uni-swipe-action-item/mpother.js | 80 +- .../components/uni-swipe-action-item/mpwxs.js | 29 +- .../uni-swipe-action-item/render.js | 538 ++++---- .../uni-swipe-action-item.vue | 179 +-- .../components/uni-swipe-action-item/wx.wxs | 680 +++++----- uni_modules/uni-swipe-action/package.json | 174 +-- uni_modules/uni-swipe-action/readme.md | 20 +- uni_modules/uni-table/changelog.md | 38 +- .../components/uni-th/filter-dropdown.vue | 1006 +++++++-------- .../uni-table/components/uni-th/uni-th.vue | 39 +- uni_modules/uni-table/i18n/en.json | 9 + uni_modules/uni-table/i18n/es.json | 9 + uni_modules/uni-table/i18n/fr.json | 9 + uni_modules/uni-table/i18n/index.js | 12 + uni_modules/uni-table/i18n/zh-Hans.json | 9 + uni_modules/uni-table/i18n/zh-Hant.json | 9 + uni_modules/uni-table/package.json | 170 +-- uni_modules/uni-title/changelog.md | 12 +- .../components/uni-title/uni-title.vue | 8 +- uni_modules/uni-title/package.json | 174 +-- uni_modules/uni-title/readme.md | 26 +- uni_modules/uni-tooltip/changelog.md | 2 + .../components/uni-tooltip/uni-tooltip.vue | 4 +- uni_modules/uni-tooltip/package.json | 25 +- .../uni-upgrade-center-app/changelog.md | 9 + .../uni-upgrade-center-app/package.json | 2 +- .../pages/upgrade-popup.vue | 27 +- uni_modules/uni-upgrade-center-app/readme.md | 5 +- .../checkVersion/checkVersion.param.json | 14 + .../cloudfunctions/checkVersion/index.obj.js | 148 +++ .../cloudfunctions/checkVersion/package.json | 7 + .../utils/call-check-version.js | 29 +- .../utils/check-update.js | 9 +- 113 files changed, 6029 insertions(+), 4690 deletions(-) create mode 100644 pages/extUI/calendar/calendar.vue delete mode 100644 pages/extUI/test/color.vue delete mode 100644 pages/extUI/test/test.nvue create mode 100644 uni_modules/uni-config-center/changelog.md create mode 100644 uni_modules/uni-config-center/package.json create mode 100644 uni_modules/uni-config-center/readme.md create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js create mode 100644 uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/package.json create mode 100644 uni_modules/uni-forms/components/uni-forms/utils.js create mode 100644 uni_modules/uni-id/changelog.md create mode 100644 uni_modules/uni-id/package.json create mode 100644 uni_modules/uni-id/readme.md create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js create mode 100644 uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json create mode 100644 uni_modules/uni-table/i18n/en.json create mode 100644 uni_modules/uni-table/i18n/es.json create mode 100644 uni_modules/uni-table/i18n/fr.json create mode 100644 uni_modules/uni-table/i18n/index.js create mode 100644 uni_modules/uni-table/i18n/zh-Hans.json create mode 100644 uni_modules/uni-table/i18n/zh-Hant.json create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/checkVersion/checkVersion.param.json create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/checkVersion/index.obj.js create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/checkVersion/package.json diff --git a/manifest.json b/manifest.json index 836d0b65..038b93b4 100644 --- a/manifest.json +++ b/manifest.json @@ -78,6 +78,9 @@ } }, "orientation" : [ "portrait-primary" ] + }, + "uniStatistics" : { + "enable" : true } }, /* 快应用特有相关 */ @@ -109,19 +112,34 @@ "scope.userLocation" : { "desc" : "演示定位能力" } + }, + "uniStatistics" : { + "enable" : true } }, "mp-alipay" : { - "usingComponents" : true + "usingComponents" : true, + "uniStatistics" : { + "enable" : true + } }, "mp-baidu" : { - "usingComponents" : true + "usingComponents" : true, + "uniStatistics" : { + "enable" : true + } }, "mp-toutiao" : { - "usingComponents" : true + "usingComponents" : true, + "uniStatistics" : { + "enable" : true + } }, "mp-jd" : { - "usingComponents" : true + "usingComponents" : true, + "uniStatistics" : { + "enable" : true + } }, "h5" : { "template" : "template.h5.html", @@ -138,7 +156,39 @@ }, "async" : { "timeout" : 20000 + }, + "uniStatistics" : { + "enable" : true } }, - "vueVersion" : "2" + "vueVersion" : "2", + "uniStatistics" : { + "version" : "2", + "enable" : true + }, + "mp-kuaishou" : { + "uniStatistics" : { + "enable" : true + } + }, + "mp-lark" : { + "uniStatistics" : { + "enable" : true + } + }, + "mp-qq" : { + "uniStatistics" : { + "enable" : true + } + }, + "quickapp-webview-huawei" : { + "uniStatistics" : { + "enable" : true + } + }, + "quickapp-webview-union" : { + "uniStatistics" : { + "enable" : true + } + } } diff --git a/pages/extUI/breadcrumb/breadcrumb.vue b/pages/extUI/breadcrumb/breadcrumb.vue index 6b87f670..78643089 100644 --- a/pages/extUI/breadcrumb/breadcrumb.vue +++ b/pages/extUI/breadcrumb/breadcrumb.vue @@ -5,12 +5,12 @@ - {{route.name}} + {{route.name}} - {{route.name}} + {{route.name}} @@ -22,7 +22,7 @@ data() { return { routes: [ { - to: '/', + to: '/pages/index/index', name: '首页' }, { to: '', diff --git a/pages/extUI/calendar/calendar.vue b/pages/extUI/calendar/calendar.vue new file mode 100644 index 00000000..cf8f90f4 --- /dev/null +++ b/pages/extUI/calendar/calendar.vue @@ -0,0 +1,126 @@ + + + + + diff --git a/pages/extUI/data-checkbox/data-checkbox.vue b/pages/extUI/data-checkbox/data-checkbox.vue index 6cf7eab1..ad110f99 100644 --- a/pages/extUI/data-checkbox/data-checkbox.vue +++ b/pages/extUI/data-checkbox/data-checkbox.vue @@ -71,73 +71,6 @@ - - - - diff --git a/pages/extUI/data-select/data-select.vue b/pages/extUI/data-select/data-select.vue index 1721e65e..6bbff0e8 100644 --- a/pages/extUI/data-select/data-select.vue +++ b/pages/extUI/data-select/data-select.vue @@ -23,7 +23,7 @@ data() { return { value: 0, - range: [{"value": 0,"text": "篮球"}, + range: [{"value": 0,"text": "篮球", "disable": true}, {"value": 1,"text": "足球"}, {"value": 2,"text": "游泳"}] } diff --git a/pages/extUI/forms/forms.vue b/pages/extUI/forms/forms.vue index cfb72867..9ce77618 100644 --- a/pages/extUI/forms/forms.vue +++ b/pages/extUI/forms/forms.vue @@ -6,7 +6,7 @@ - + @@ -52,14 +52,14 @@ - + - + @@ -70,7 +70,7 @@ - + @@ -89,14 +89,14 @@ - + - + - + @@ -224,7 +224,7 @@ }, dynamicFormData: { email: '', - domains: {} + domains: [] }, dynamicLists: [], dynamicRules: { @@ -259,8 +259,9 @@ this.current = e.currentIndex }, add() { - this.dynamicLists.push({ + this.dynamicFormData.domains.push({ label: '域名', + value: '', rules: [{ 'required': true, errorMessage: '域名项必填' @@ -304,13 +305,15 @@ .form-item { display: flex; - align-items: center; + align-items: center; + flex: 1; } .button { display: flex; align-items: center; - height: 35px; + height: 35px; + line-height: 35px; margin-left: 10px; } diff --git a/pages/extUI/nav-bar/nav-bar.nvue b/pages/extUI/nav-bar/nav-bar.nvue index d8bbcf43..8a774e25 100644 --- a/pages/extUI/nav-bar/nav-bar.nvue +++ b/pages/extUI/nav-bar/nav-bar.nvue @@ -53,24 +53,24 @@ - + - + diff --git a/pages/extUI/pagination/pagination.vue b/pages/extUI/pagination/pagination.vue index 29b67773..5c954fb8 100644 --- a/pages/extUI/pagination/pagination.vue +++ b/pages/extUI/pagination/pagination.vue @@ -13,7 +13,7 @@ - + 当前页:{{ current }},数据总量:{{ total }}条,每页数据:{{ pageSize }} diff --git a/pages/extUI/search-bar/search-bar.vue b/pages/extUI/search-bar/search-bar.vue index 34c3efee..c66b6275 100644 --- a/pages/extUI/search-bar/search-bar.vue +++ b/pages/extUI/search-bar/search-bar.vue @@ -16,10 +16,13 @@ + + + - + diff --git a/pages/extUI/test/color.vue b/pages/extUI/test/color.vue deleted file mode 100644 index 1dca253d..00000000 --- a/pages/extUI/test/color.vue +++ /dev/null @@ -1,196 +0,0 @@ - - - - - diff --git a/pages/extUI/test/test.nvue b/pages/extUI/test/test.nvue deleted file mode 100644 index 9c49de73..00000000 --- a/pages/extUI/test/test.nvue +++ /dev/null @@ -1,192 +0,0 @@ - - - - - diff --git a/pages/extUI/title/title.vue b/pages/extUI/title/title.vue index 1a6d35e6..c2fbf015 100644 --- a/pages/extUI/title/title.vue +++ b/pages/extUI/title/title.vue @@ -1,7 +1,7 @@ - + diff --git a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue index a93f7351..1d6b0582 100644 --- a/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue +++ b/uni_modules/uni-breadcrumb/components/uni-breadcrumb/uni-breadcrumb.vue @@ -7,11 +7,14 @@ /** * Breadcrumb 面包屑导航父组件 * @description 显示当前页面的路径,快速返回之前的任意页面 - * @tutorial https://uniapp.dcloud.io/component/uniui/uni-breadcrumb + * @tutorial https://ext.dcloud.net.cn/plugin?id=xxx * @property {String} separator 分隔符,默认为斜杠'/' * @property {String} separatorClass 图标分隔符 class */ - export default { + export default { + options: { + virtualHost: true + }, props: { separator: { type: String, @@ -33,6 +36,6 @@ diff --git a/uni_modules/uni-breadcrumb/package.json b/uni_modules/uni-breadcrumb/package.json index 1fd5f0aa..e5f33e85 100644 --- a/uni_modules/uni-breadcrumb/package.json +++ b/uni_modules/uni-breadcrumb/package.json @@ -1,8 +1,8 @@ { "id": "uni-breadcrumb", - "displayName": "uni-breadcrumb", - "version": "0.1.0", - "description": "uni-breadcrumb", + "displayName": "uni-breadcrumb 面包屑", + "version": "0.1.2", + "description": "Breadcrumb 面包屑", "keywords": [ "uni-breadcrumb", "breadcrumb", @@ -52,7 +52,7 @@ }, "App": { "app-vue": "y", - "app-nvue": "y" + "app-nvue": "n" }, "H5-mobile": { "Safari": "y", @@ -69,14 +69,15 @@ }, "小程序": { "微信": "y", - "阿里": "y", - "百度": "y", - "字节跳动": "y", - "QQ": "y" + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "京东": "u" }, "快应用": { - "华为": "y", - "联盟": "y" + "华为": "u", + "联盟": "u" } } } diff --git a/uni_modules/uni-breadcrumb/readme.md b/uni_modules/uni-breadcrumb/readme.md index 4ad5f0c5..7c6207c9 100644 --- a/uni_modules/uni-breadcrumb/readme.md +++ b/uni_modules/uni-breadcrumb/readme.md @@ -1,8 +1,66 @@ -## Badge 数字角标 + +## breadcrumb 面包屑导航 > **组件名:uni-breadcrumb** -> 代码块: `uBreadcrumb` +> 代码块: `ubreadcrumb` + +显示当前页面的路径,快速返回之前的任意页面。 + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + +### 基本用法 + +在 ``template`` 中使用组件 + +```html + + {{route.name}} + +``` + +```js +export default { + name: "uni-stat-breadcrumb", + data() { + return { + routes: [{ + to: '/A', + name: 'A页面' + }, { + to: '/B', + name: 'B页面' + }, { + to: '/C', + name: 'C页面' + }] + }; + } + } +``` + + +## API + +### Breadcrumb Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|separator |String |斜杠'/' |分隔符 | +|separatorClass |String | |图标分隔符 class | + +### Breadcrumb Item Props + +|属性名 |类型 |默认值 |说明 | +|:-: |:-: |:-: |:-: | +|to |String | |路由跳转页面路径 | +|replace|Boolean | |在使用 to 进行路由跳转时,启用 replace 将不会向 history 添加新记录(仅 h5 支持) | + + + -数字角标一般和其它控件(列表、9宫格等)配合使用,用于进行数量提示,默认为实心灰色背景, +## 组件示例 -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-breadcrumb) -#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb](https://hellouniapp.dcloud.net.cn/pages/extUI/breadcrumb/breadcrumb) \ No newline at end of file diff --git a/uni_modules/uni-config-center/changelog.md b/uni_modules/uni-config-center/changelog.md new file mode 100644 index 00000000..4d2eb92f --- /dev/null +++ b/uni_modules/uni-config-center/changelog.md @@ -0,0 +1,4 @@ +## 0.0.2(2021-04-16) +- 修改插件package信息 +## 0.0.1(2021-03-15) +- 初始化项目 diff --git a/uni_modules/uni-config-center/package.json b/uni_modules/uni-config-center/package.json new file mode 100644 index 00000000..d97bd27a --- /dev/null +++ b/uni_modules/uni-config-center/package.json @@ -0,0 +1,80 @@ +{ + "id": "uni-config-center", + "displayName": "uni-config-center", + "version": "0.0.2", + "description": "uniCloud 配置中心", + "keywords": [ + "配置", + "配置中心" +], + "repository": "", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "uniCloud", + "云函数模板" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "directories": { + "example": "../../../scripts/dist" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + } + } + } + } +} diff --git a/uni_modules/uni-config-center/readme.md b/uni_modules/uni-config-center/readme.md new file mode 100644 index 00000000..0bd8ac43 --- /dev/null +++ b/uni_modules/uni-config-center/readme.md @@ -0,0 +1,93 @@ +# 为什么使用uni-config-center + +实际开发中很多插件需要配置文件才可以正常运行,如果每个插件都单独进行配置的话就会产生下面这样的目录结构 + +```bash +cloudfunctions +└─────common 公共模块 + ├─plugin-a // 插件A对应的目录 + │ ├─index.js + │ ├─config.json // plugin-a对应的配置文件 + │ └─other-file.cert // plugin-a依赖的其他文件 + └─plugin-b // plugin-b对应的目录 + ├─index.js + └─config.json // plugin-b对应的配置文件 +``` + +假设插件作者要发布一个项目模板,里面使用了很多需要配置的插件,无论是作者发布还是用户使用都是一个大麻烦。 + +uni-config-center就是用了统一管理这些配置文件的,使用uni-config-center后的目录结构如下 + +```bash +cloudfunctions +└─────common 公共模块 + ├─plugin-a // 插件A对应的目录 + │ └─index.js + ├─plugin-b // plugin-b对应的目录 + │ └─index.js + └─uni-config-center + ├─index.js // config-center入口文件 + ├─plugin-a + │ ├─config.json // plugin-a对应的配置文件 + │ └─other-file.cert // plugin-a依赖的其他文件 + └─plugin-b + └─config.json // plugin-b对应的配置文件 +``` + +使用uni-config-center后的优势 + +- 配置文件统一管理,分离插件主体和配置信息,更新插件更方便 +- 支持对config.json设置schema,插件使用者在HBuilderX内编写config.json文件时会有更好的提示(后续HBuilderX会提供支持) + +# 用法 + +在要使用uni-config-center的公共模块或云函数内引入uni-config-center依赖,请参考:[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common) + +```js +const createConfig = require('uni-config-center') + +const uniIdConfig = createConfig({ + pluginId: 'uni-id', // 插件id + defaultConfig: { // 默认配置 + tokenExpiresIn: 7200, + tokenExpiresThreshold: 600, + }, + customMerge: function(defaultConfig, userConfig) { // 自定义默认配置和用户配置的合并规则,不设置的情况侠会对默认配置和用户配置进行深度合并 + // defaudltConfig 默认配置 + // userConfig 用户配置 + return Object.assign(defaultConfig, userConfig) + } +}) + + +// 以如下配置为例 +// { +// "tokenExpiresIn": 7200, +// "passwordErrorLimit": 6, +// "bindTokenToDevice": false, +// "passwordErrorRetryTime": 3600, +// "app-plus": { +// "tokenExpiresIn": 2592000 +// }, +// "service": { +// "sms": { +// "codeExpiresIn": 300 +// } +// } +// } + +// 获取配置 +uniIdConfig.config() // 获取全部配置,注意:uni-config-center内不存在对应插件目录时会返回空对象 +uniIdConfig.config('tokenExpiresIn') // 指定键值获取配置,返回:7200 +uniIdConfig.config('service.sms.codeExpiresIn') // 指定键值获取配置,返回:300 +uniIdConfig.config('tokenExpiresThreshold', 600) // 指定键值获取配置,如果不存在则取传入的默认值,返回:600 + +// 获取文件绝对路径 +uniIdConfig.resolve('custom-token.js') // 获取uni-config-center/uni-id/custom-token.js文件的路径 + +// 引用文件(require) +uniIDConfig.requireFile('custom-token.js') // 使用require方式引用uni-config-center/uni-id/custom-token.js文件。文件不存在时返回undefined,文件内有其他错误导致require失败时会抛出错误。 + +// 判断是否包含某文件 +uniIDConfig.hasFile('custom-token.js') // 配置目录是否包含某文件,true: 文件存在,false: 文件不存在 +``` \ No newline at end of file diff --git a/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js b/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js new file mode 100644 index 00000000..e14fb3b0 --- /dev/null +++ b/uni_modules/uni-config-center/uniCloud/cloudfunctions/common/uni-config-center/index.js @@ -0,0 +1 @@ +"use strict";var t=require("fs"),r=require("path");function e(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var n=e(t),o=e(r),i="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var u=function(t){var r={exports:{}};return t(r,r.exports),r.exports}((function(t,r){var e="__lodash_hash_undefined__",n=9007199254740991,o="[object Arguments]",u="[object Function]",c="[object Object]",a=/^\[object .+?Constructor\]$/,f=/^(?:0|[1-9]\d*)$/,s={};s["[object Float32Array]"]=s["[object Float64Array]"]=s["[object Int8Array]"]=s["[object Int16Array]"]=s["[object Int32Array]"]=s["[object Uint8Array]"]=s["[object Uint8ClampedArray]"]=s["[object Uint16Array]"]=s["[object Uint32Array]"]=!0,s[o]=s["[object Array]"]=s["[object ArrayBuffer]"]=s["[object Boolean]"]=s["[object DataView]"]=s["[object Date]"]=s["[object Error]"]=s[u]=s["[object Map]"]=s["[object Number]"]=s[c]=s["[object RegExp]"]=s["[object Set]"]=s["[object String]"]=s["[object WeakMap]"]=!1;var l="object"==typeof i&&i&&i.Object===Object&&i,h="object"==typeof self&&self&&self.Object===Object&&self,p=l||h||Function("return this")(),_=r&&!r.nodeType&&r,v=_&&t&&!t.nodeType&&t,d=v&&v.exports===_,y=d&&l.process,g=function(){try{var t=v&&v.require&&v.require("util").types;return t||y&&y.binding&&y.binding("util")}catch(t){}}(),b=g&&g.isTypedArray;function j(t,r,e){switch(e.length){case 0:return t.call(r);case 1:return t.call(r,e[0]);case 2:return t.call(r,e[0],e[1]);case 3:return t.call(r,e[0],e[1],e[2])}return t.apply(r,e)}var w,O,m,A=Array.prototype,z=Function.prototype,M=Object.prototype,x=p["__core-js_shared__"],C=z.toString,F=M.hasOwnProperty,U=(w=/[^.]+$/.exec(x&&x.keys&&x.keys.IE_PROTO||""))?"Symbol(src)_1."+w:"",S=M.toString,I=C.call(Object),P=RegExp("^"+C.call(F).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),T=d?p.Buffer:void 0,q=p.Symbol,E=p.Uint8Array,$=T?T.allocUnsafe:void 0,D=(O=Object.getPrototypeOf,m=Object,function(t){return O(m(t))}),k=Object.create,B=M.propertyIsEnumerable,N=A.splice,L=q?q.toStringTag:void 0,R=function(){try{var t=_t(Object,"defineProperty");return t({},"",{}),t}catch(t){}}(),G=T?T.isBuffer:void 0,V=Math.max,W=Date.now,H=_t(p,"Map"),J=_t(Object,"create"),K=function(){function t(){}return function(r){if(!Mt(r))return{};if(k)return k(r);t.prototype=r;var e=new t;return t.prototype=void 0,e}}();function Q(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},X.prototype.set=function(t,r){var e=this.__data__,n=nt(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this},Y.prototype.clear=function(){this.size=0,this.__data__={hash:new Q,map:new(H||X),string:new Q}},Y.prototype.delete=function(t){var r=pt(this,t).delete(t);return this.size-=r?1:0,r},Y.prototype.get=function(t){return pt(this,t).get(t)},Y.prototype.has=function(t){return pt(this,t).has(t)},Y.prototype.set=function(t,r){var e=pt(this,t),n=e.size;return e.set(t,r),this.size+=e.size==n?0:1,this},Z.prototype.clear=function(){this.__data__=new X,this.size=0},Z.prototype.delete=function(t){var r=this.__data__,e=r.delete(t);return this.size=r.size,e},Z.prototype.get=function(t){return this.__data__.get(t)},Z.prototype.has=function(t){return this.__data__.has(t)},Z.prototype.set=function(t,r){var e=this.__data__;if(e instanceof X){var n=e.__data__;if(!H||n.length<199)return n.push([t,r]),this.size=++e.size,this;e=this.__data__=new Y(n)}return e.set(t,r),this.size=e.size,this};var it,ut=function(t,r,e){for(var n=-1,o=Object(t),i=e(t),u=i.length;u--;){var c=i[it?u:++n];if(!1===r(o[c],c,o))break}return t};function ct(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":L&&L in Object(t)?function(t){var r=F.call(t,L),e=t[L];try{t[L]=void 0;var n=!0}catch(t){}var o=S.call(t);n&&(r?t[L]=e:delete t[L]);return o}(t):function(t){return S.call(t)}(t)}function at(t){return xt(t)&&ct(t)==o}function ft(t){return!(!Mt(t)||function(t){return!!U&&U in t}(t))&&(At(t)?P:a).test(function(t){if(null!=t){try{return C.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t){if(!Mt(t))return function(t){var r=[];if(null!=t)for(var e in Object(t))r.push(e);return r}(t);var r=dt(t),e=[];for(var n in t)("constructor"!=n||!r&&F.call(t,n))&&e.push(n);return e}function lt(t,r,e,n,o){t!==r&&ut(r,(function(i,u){if(o||(o=new Z),Mt(i))!function(t,r,e,n,o,i,u){var a=yt(t,e),f=yt(r,e),s=u.get(f);if(s)return void rt(t,e,s);var l=i?i(a,f,e+"",t,r,u):void 0,h=void 0===l;if(h){var p=wt(f),_=!p&&mt(f),v=!p&&!_&&Ct(f);l=f,p||_||v?wt(a)?l=a:xt(j=a)&&Ot(j)?l=function(t,r){var e=-1,n=t.length;r||(r=Array(n));for(;++e-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(R?function(t,r){return R(t,"toString",{configurable:!0,enumerable:!1,value:(e=r,function(){return e}),writable:!0});var e}:It);function bt(t,r){return t===r||t!=t&&r!=r}var jt=at(function(){return arguments}())?at:function(t){return xt(t)&&F.call(t,"callee")&&!B.call(t,"callee")},wt=Array.isArray;function Ot(t){return null!=t&&zt(t.length)&&!At(t)}var mt=G||function(){return!1};function At(t){if(!Mt(t))return!1;var r=ct(t);return r==u||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}function zt(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=n}function Mt(t){var r=typeof t;return null!=t&&("object"==r||"function"==r)}function xt(t){return null!=t&&"object"==typeof t}var Ct=b?function(t){return function(r){return t(r)}}(b):function(t){return xt(t)&&zt(t.length)&&!!s[ct(t)]};function Ft(t){return Ot(t)?tt(t,!0):st(t)}var Ut,St=(Ut=function(t,r,e){lt(t,r,e)},ht((function(t,r){var e=-1,n=r.length,o=n>1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=Ut.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!Mt(e))return!1;var n=typeof r;return!!("number"==n?Ot(e)&&vt(r,e.length):"string"==n&&r in e)&&bt(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++ec.call(t,r);class f{constructor({pluginId:t,defaultConfig:r={},customMerge:e,root:n}){this.pluginId=t,this.defaultConfig=r,this.pluginConfigPath=o.default.resolve(n||__dirname,t),this.customMerge=e,this._config=void 0}resolve(t){return o.default.resolve(this.pluginConfigPath,t)}hasFile(t){return n.default.existsSync(this.resolve(t))}requireFile(t){try{return require(this.resolve(t))}catch(t){if("MODULE_NOT_FOUND"===t.code)return;throw t}}_getUserConfig(){return this.requireFile("config.json")}config(t,r){this._config||(this._config=(this.customMerge||u)(this.defaultConfig,this._getUserConfig()));let e=this._config;return t?function(t,r,e){if("number"==typeof r)return t[r];if("symbol"==typeof r)return a(t,r)?t[r]:e;const n="string"!=typeof(o=r)?o:o.split(".").reduce(((t,r)=>(r.split(/\[([^}]+)\]/g).forEach((r=>r&&t.push(r))),t)),[]);var o;let i=t;for(let t=0;t 0 ? this.dataValue : selectedArr + return this.dataValue.length > 0 ? this.dataValue : selectedArr }, /** diff --git a/uni_modules/uni-data-checkbox/package.json b/uni_modules/uni-data-checkbox/package.json index 64131e75..51470a95 100644 --- a/uni_modules/uni-data-checkbox/package.json +++ b/uni_modules/uni-data-checkbox/package.json @@ -1,7 +1,7 @@ { "id": "uni-data-checkbox", "displayName": "uni-data-checkbox 数据选择器", - "version": "1.0.1", + "version": "1.0.2", "description": "通过数据驱动的单选框和复选框", "keywords": [ "uni-ui", diff --git a/uni_modules/uni-data-picker/changelog.md b/uni_modules/uni-data-picker/changelog.md index 486eedce..be901afa 100644 --- a/uni_modules/uni-data-picker/changelog.md +++ b/uni_modules/uni-data-picker/changelog.md @@ -1,56 +1,58 @@ -## 1.0.3(2022-02-25) -- 修复 nvue 不支持的 v-show 的 bug -## 1.0.2(2022-02-25) -- 修复 条件编译 nvue 不支持的 css 样式 -## 1.0.1(2021-11-23) -- 修复 由上个版本引发的map、v-model等属性不生效的bug -## 1.0.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-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker) -## 0.4.9(2021-10-28) -- 修复 VUE2 v-model 概率无效的 bug -## 0.4.8(2021-10-27) -- 修复 v-model 概率无效的 bug -## 0.4.7(2021-10-25) -- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+ -- 修复 树型 uniCloud 数据类型为 int 时报错的 bug -## 0.4.6(2021-10-19) -- 修复 非 VUE3 v-model 为 0 时无法选中的 bug -## 0.4.5(2021-09-26) -- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效 -- 修复 readonly 为 true 时报错的 bug -## 0.4.4(2021-09-26) -- 修复 上一版本造成的 map 属性失效的 bug -- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 -## 0.4.3(2021-09-24) -- 修复 某些情况下级联未触发的 bug -## 0.4.2(2021-09-23) -- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用 -- 新增 选项内容过长自动添加省略号 -## 0.4.1(2021-09-15) -- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 -## 0.4.0(2021-07-13) -- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 0.3.5(2021-06-04) -- 修复 无法加载云端数据的问题 -## 0.3.4(2021-05-28) -- 修复 v-model 无效问题 -- 修复 loaddata 为空数据组时加载时间过长问题 -- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点 -## 0.3.3(2021-05-12) -- 新增 组件示例地址 -## 0.3.2(2021-04-22) -- 修复 非树形数据有 where 属性查询报错的问题 -## 0.3.1(2021-04-15) -- 修复 本地数据概率无法回显时问题 -## 0.3.0(2021-04-07) -- 新增 支持云端非树形表结构数据 -- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 -## 0.2.0(2021-03-15) -- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 -## 0.1.9(2021-03-09) -- 修复 微信小程序某些情况下无法选择的问题 -## 0.1.8(2021-02-05) -- 优化 部分样式在 nvue 上的兼容表现 -## 0.1.7(2021-02-05) -- 调整为 uni_modules 目录规范 +## 1.0.4(2022-04-19) +- 修复 字节小程序 本地数据无法选择下一级的Bug +## 1.0.3(2022-02-25) +- 修复 nvue 不支持的 v-show 的 bug +## 1.0.2(2022-02-25) +- 修复 条件编译 nvue 不支持的 css 样式 +## 1.0.1(2021-11-23) +- 修复 由上个版本引发的map、v-model等属性不生效的bug +## 1.0.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-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +## 0.4.9(2021-10-28) +- 修复 VUE2 v-model 概率无效的 bug +## 0.4.8(2021-10-27) +- 修复 v-model 概率无效的 bug +## 0.4.7(2021-10-25) +- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+ +- 修复 树型 uniCloud 数据类型为 int 时报错的 bug +## 0.4.6(2021-10-19) +- 修复 非 VUE3 v-model 为 0 时无法选中的 bug +## 0.4.5(2021-09-26) +- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效 +- 修复 readonly 为 true 时报错的 bug +## 0.4.4(2021-09-26) +- 修复 上一版本造成的 map 属性失效的 bug +- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略 +## 0.4.3(2021-09-24) +- 修复 某些情况下级联未触发的 bug +## 0.4.2(2021-09-23) +- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用 +- 新增 选项内容过长自动添加省略号 +## 0.4.1(2021-09-15) +- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段 +## 0.4.0(2021-07-13) +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.3.5(2021-06-04) +- 修复 无法加载云端数据的问题 +## 0.3.4(2021-05-28) +- 修复 v-model 无效问题 +- 修复 loaddata 为空数据组时加载时间过长问题 +- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点 +## 0.3.3(2021-05-12) +- 新增 组件示例地址 +## 0.3.2(2021-04-22) +- 修复 非树形数据有 where 属性查询报错的问题 +## 0.3.1(2021-04-15) +- 修复 本地数据概率无法回显时问题 +## 0.3.0(2021-04-07) +- 新增 支持云端非树形表结构数据 +- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题 +## 0.2.0(2021-03-15) +- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题 +## 0.1.9(2021-03-09) +- 修复 微信小程序某些情况下无法选择的问题 +## 0.1.8(2021-02-05) +- 优化 部分样式在 nvue 上的兼容表现 +## 0.1.7(2021-02-05) +- 调整为 uni_modules 目录规范 diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js index 6ef26a26..a747b9fc 100644 --- a/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js +++ b/uni_modules/uni-data-picker/components/uni-data-picker/keypress.js @@ -1,45 +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 +// #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-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue index b094a316..a704c028 100644 --- a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -182,13 +182,13 @@ }, show() { this.isOpened = true - this.$nextTick(() => { + setTimeout(() => { this.$refs.pickerView.updateData({ treeData: this._treeData, selected: this.selected, selectedIndex: this.selectedIndex }) - }) + }, 200) this.$emit('popupopened') }, hide() { diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js index c12fd54b..555d2c5c 100644 --- a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -1,563 +1,563 @@ -export default { - props: { - localdata: { - type: [Array, Object], - default () { - return [] - } - }, - spaceInfo: { - type: Object, - default () { - return {} - } - }, - collection: { - type: String, - default: '' - }, - action: { - type: String, - default: '' - }, - field: { - type: String, - default: '' - }, - orderby: { - type: String, - default: '' - }, - where: { - type: [String, Object], - default: '' - }, - pageData: { - type: String, - default: 'add' - }, - pageCurrent: { - type: Number, - default: 1 - }, - pageSize: { - type: Number, - default: 20 - }, - getcount: { - type: [Boolean, String], - default: false - }, - getone: { - type: [Boolean, String], - default: false - }, - gettree: { - type: [Boolean, String], - default: false - }, - manual: { - type: Boolean, - default: false - }, - value: { - type: [Array, String, Number], - default () { - return [] - } - }, - modelValue: { - type: [Array, String, Number], - default () { - return [] - } - }, - preload: { - type: Boolean, - default: false - }, - stepSearh: { - type: Boolean, - default: true - }, - selfField: { - type: String, - default: '' - }, - parentField: { - type: String, - default: '' - }, - multiple: { - type: Boolean, - default: false - }, - map: { - type: Object, - default() { - return { - text: "text", - value: "value" - } - } - } - }, - data() { - return { - loading: false, - errorMessage: '', - loadMore: { - contentdown: '', - contentrefresh: '', - contentnomore: '' - }, - dataList: [], - selected: [], - selectedIndex: 0, - page: { - current: this.pageCurrent, - size: this.pageSize, - count: 0 - } - } - }, - computed: { - isLocaldata() { - return !this.collection.length - }, - postField() { - let fields = [this.field]; - if (this.parentField) { - fields.push(`${this.parentField} as parent_value`); - } - return fields.join(','); - }, - dataValue() { - let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined) - return isModelValue ? this.modelValue : this.value - }, - hasValue() { - if (typeof this.dataValue === 'number') { - return true - } - return (this.dataValue != null) && (this.dataValue.length > 0) - } - }, - created() { - this.$watch(() => { - var al = []; - ['pageCurrent', - 'pageSize', - 'spaceInfo', - 'value', - 'modelValue', - 'localdata', - 'collection', - 'action', - 'field', - 'orderby', - 'where', - 'getont', - 'getcount', - 'gettree' - ].forEach(key => { - al.push(this[key]) - }); - return al - }, (newValue, oldValue) => { - let needReset = false - for (let i = 2; i < newValue.length; i++) { - if (newValue[i] != oldValue[i]) { - needReset = true - break - } - } - if (newValue[0] != oldValue[0]) { - this.page.current = this.pageCurrent - } - this.page.size = this.pageSize - - this.onPropsChange() - }) - this._treeData = [] - }, - methods: { - onPropsChange() { - this._treeData = [] - }, - getCommand(options = {}) { - /* eslint-disable no-undef */ - let db = uniCloud.database(this.spaceInfo) - - const action = options.action || this.action - if (action) { - db = db.action(action) - } - - const collection = options.collection || this.collection - db = db.collection(collection) - - const where = options.where || this.where - if (!(!where || !Object.keys(where).length)) { - db = db.where(where) - } - - const field = options.field || this.field - if (field) { - db = db.field(field) - } - - const orderby = options.orderby || this.orderby - if (orderby) { - db = db.orderBy(orderby) - } - - const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current - const size = options.pageSize !== undefined ? options.pageSize : this.page.size - const getCount = options.getcount !== undefined ? options.getcount : this.getcount - const getTree = options.gettree !== undefined ? options.gettree : this.gettree - - const getOptions = { - getCount, - getTree - } - if (options.getTreePath) { - getOptions.getTreePath = options.getTreePath - } - - db = db.skip(size * (current - 1)).limit(size).get(getOptions) - - return db - }, - getNodeData(callback) { - if (this.loading) { - return - } - this.loading = true - this.getCommand({ - field: this.postField, - where: this._pathWhere() - }).then((res) => { - this.loading = false - this.selected = res.result.data - callback && callback() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - getTreePath(callback) { - if (this.loading) { - return - } - this.loading = true - - this.getCommand({ - field: this.postField, - getTreePath: { - startWith: `${this.selfField}=='${this.dataValue}'` - } - }).then((res) => { - this.loading = false - let treePath = [] - this._extractTreePath(res.result.data, treePath) - this.selected = treePath - callback && callback() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - loadData() { - if (this.isLocaldata) { - this._processLocalData() - return - } - - if (this.dataValue != null) { - this._loadNodeData((data) => { - this._treeData = data - this._updateBindData() - this._updateSelected() - }) - return - } - - if (this.stepSearh) { - this._loadNodeData((data) => { - this._treeData = data - this._updateBindData() - }) - } else { - this._loadAllData((data) => { - this._treeData = [] - this._extractTree(data, this._treeData, null) - this._updateBindData() - }) - } - }, - _loadAllData(callback) { - if (this.loading) { - return - } - this.loading = true - - this.getCommand({ - field: this.postField, - gettree: true, - startwith: `${this.selfField}=='${this.dataValue}'` - }).then((res) => { - this.loading = false - callback(res.result.data) - this.onDataChange() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - _loadNodeData(callback, pw) { - if (this.loading) { - return - } - this.loading = true - - this.getCommand({ - field: this.postField, - where: pw || this._postWhere(), - pageSize: 500 - }).then((res) => { - this.loading = false - callback(res.result.data) - this.onDataChange() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - _pathWhere() { - let result = [] - let where_field = this._getParentNameByField(); - if (where_field) { - result.push(`${where_field} == '${this.dataValue}'`) - } - - if (this.where) { - return `(${this.where}) && (${result.join(' || ')})` - } - - return result.join(' || ') - }, - _postWhere() { - let result = [] - let selected = this.selected - let parentField = this.parentField - if (parentField) { - result.push(`${parentField} == null || ${parentField} == ""`) - } - if (selected.length) { - for (var i = 0; i < selected.length - 1; i++) { - result.push(`${parentField} == '${selected[i].value}'`) - } - } - - let where = [] - if (this.where) { - where.push(`(${this.where})`) - } - if (result.length) { - where.push(`(${result.join(' || ')})`) - } - - return where.join(' && ') - }, - _nodeWhere() { - let result = [] - let selected = this.selected - if (selected.length) { - result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`) - } - - if (this.where) { - return `(${this.where}) && (${result.join(' || ')})` - } - - return result.join(' || ') - }, - _getParentNameByField() { - const fields = this.field.split(','); - let where_field = null; - for (let i = 0; i < fields.length; i++) { - const items = fields[i].split('as'); - if (items.length < 2) { - continue; - } - if (items[1].trim() === 'value') { - where_field = items[0].trim(); - break; - } - } - return where_field - }, - _isTreeView() { - return (this.parentField && this.selfField) - }, - _updateSelected() { - var dl = this.dataList - var sl = this.selected - let textField = this.map.text - let valueField = this.map.value - for (var i = 0; i < sl.length; i++) { - var value = sl[i].value - var dl2 = dl[i] - for (var j = 0; j < dl2.length; j++) { - var item2 = dl2[j] - if (item2[valueField] === value) { - sl[i].text = item2[textField] - break - } - } - } - }, - _updateBindData(node) { - const { - dataList, - hasNodes - } = this._filterData(this._treeData, this.selected) - - let isleaf = this._stepSearh === false && !hasNodes - - if (node) { - node.isleaf = isleaf - } - - this.dataList = dataList - this.selectedIndex = dataList.length - 1 - - if (!isleaf && this.selected.length < dataList.length) { - this.selected.push({ - value: null, - text: "请选择" - }) - } - - return { - isleaf, - hasNodes - } - }, - _filterData(data, paths) { - let dataList = [] - let hasNodes = true - - dataList.push(data.filter((item) => { - return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') - })) - for (let i = 0; i < paths.length; i++) { - var value = paths[i].value - var nodes = data.filter((item) => { - return item.parent_value === value - }) - - if (nodes.length) { - dataList.push(nodes) - } else { - hasNodes = false - } - } - - return { - dataList, - hasNodes - } - }, - _extractTree(nodes, result, parent_value) { - let list = result || [] - let valueField = this.map.value - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i] - - let child = {} - for (let key in node) { - if (key !== 'children') { - child[key] = node[key] - } - } - if (parent_value !== null && parent_value !== undefined && parent_value !== '') { - child.parent_value = parent_value - } - result.push(child) - - let children = node.children - if (children) { - this._extractTree(children, result, node[valueField]) - } - } - }, - _extractTreePath(nodes, result) { - let list = result || [] - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i] - - let child = {} - for (let key in node) { - if (key !== 'children') { - child[key] = node[key] - } - } - result.push(child) - - let children = node.children - if (children) { - this._extractTreePath(children, result) - } - } - }, - _findNodePath(key, nodes, path = []) { - let textField = this.map.text - let valueField = this.map.value - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i] - let children = node.children - let text = node[textField] - let value = node[valueField] - - path.push({ - value, - text - }) - - if (value === key) { - return path - } - - if (children) { - const p = this._findNodePath(key, children, path) - if (p.length) { - return p - } - } - - path.pop() - } - return [] - }, - _processLocalData() { - this._treeData = [] - this._extractTree(this.localdata, this._treeData) - - var inputValue = this.dataValue - if (inputValue === undefined) { - return - } - - if (Array.isArray(inputValue)) { - inputValue = inputValue[inputValue.length - 1] - if (typeof inputValue === 'object' && inputValue[this.map.value]) { - inputValue = inputValue[this.map.value] - } - } - - this.selected = this._findNodePath(inputValue, this.localdata) - } - } -} +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + spaceInfo: { + type: Object, + default () { + return {} + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 20 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + modelValue: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + map: { + type: Object, + default() { + return { + text: "text", + value: "value" + } + } + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocaldata() { + return !this.collection.length + }, + postField() { + let fields = [this.field]; + if (this.parentField) { + fields.push(`${this.parentField} as parent_value`); + } + return fields.join(','); + }, + dataValue() { + let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined) + return isModelValue ? this.modelValue : this.value + }, + hasValue() { + if (typeof this.dataValue === 'number') { + return true + } + return (this.dataValue != null) && (this.dataValue.length > 0) + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'spaceInfo', + 'value', + 'modelValue', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = [] + }, + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database(this.spaceInfo) + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + getNodeData(callback) { + if (this.loading) { + return + } + this.loading = true + this.getCommand({ + field: this.postField, + where: this._pathWhere() + }).then((res) => { + this.loading = false + this.selected = res.result.data + callback && callback() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + getTreePath(callback) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + getTreePath: { + startWith: `${this.selfField}=='${this.dataValue}'` + } + }).then((res) => { + this.loading = false + let treePath = [] + this._extractTreePath(res.result.data, treePath) + this.selected = treePath + callback && callback() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + loadData() { + if (this.isLocaldata) { + this._processLocalData() + return + } + + if (this.dataValue != null) { + this._loadNodeData((data) => { + this._treeData = data + this._updateBindData() + this._updateSelected() + }) + return + } + + if (this.stepSearh) { + this._loadNodeData((data) => { + this._treeData = data + this._updateBindData() + }) + } else { + this._loadAllData((data) => { + this._treeData = [] + this._extractTree(data, this._treeData, null) + this._updateBindData() + }) + } + }, + _loadAllData(callback) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + gettree: true, + startwith: `${this.selfField}=='${this.dataValue}'` + }).then((res) => { + this.loading = false + callback(res.result.data) + this.onDataChange() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + _loadNodeData(callback, pw) { + if (this.loading) { + return + } + this.loading = true + + this.getCommand({ + field: this.postField, + where: pw || this._postWhere(), + pageSize: 500 + }).then((res) => { + this.loading = false + callback(res.result.data) + this.onDataChange() + }).catch((err) => { + this.loading = false + this.errorMessage = err + }) + }, + _pathWhere() { + let result = [] + let where_field = this._getParentNameByField(); + if (where_field) { + result.push(`${where_field} == '${this.dataValue}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + _postWhere() { + let result = [] + let selected = this.selected + let parentField = this.parentField + if (parentField) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${parentField} == '${selected[i].value}'`) + } + } + + let where = [] + if (this.where) { + where.push(`(${this.where})`) + } + if (result.length) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + _nodeWhere() { + let result = [] + let selected = this.selected + if (selected.length) { + result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + _getParentNameByField() { + const fields = this.field.split(','); + let where_field = null; + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as'); + if (items.length < 2) { + continue; + } + if (items[1].trim() === 'value') { + where_field = items[0].trim(); + break; + } + } + return where_field + }, + _isTreeView() { + return (this.parentField && this.selfField) + }, + _updateSelected() { + var dl = this.dataList + var sl = this.selected + let textField = this.map.text + let valueField = this.map.value + for (var i = 0; i < sl.length; i++) { + var value = sl[i].value + var dl2 = dl[i] + for (var j = 0; j < dl2.length; j++) { + var item2 = dl2[j] + if (item2[valueField] === value) { + sl[i].text = item2[textField] + break + } + } + } + }, + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + _filterData(data, paths) { + let dataList = [] + let hasNodes = true + + dataList.push(data.filter((item) => { + return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') + })) + for (let i = 0; i < paths.length; i++) { + var value = paths[i].value + var nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + _extractTree(nodes, result, parent_value) { + let list = result || [] + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null && parent_value !== undefined && parent_value !== '') { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node[valueField]) + } + } + }, + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + _findNodePath(key, nodes, path = []) { + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + let children = node.children + let text = node[textField] + let value = node[valueField] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + }, + _processLocalData() { + this._treeData = [] + this._extractTree(this.localdata, this._treeData) + + var inputValue = this.dataValue + if (inputValue === undefined) { + return + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1] + if (typeof inputValue === 'object' && inputValue[this.map.value]) { + inputValue = inputValue[this.map.value] + } + } + + this.selected = this._findNodePath(inputValue, this.localdata) + } + } +} diff --git a/uni_modules/uni-data-picker/package.json b/uni_modules/uni-data-picker/package.json index d4925ef0..d1af059e 100644 --- a/uni_modules/uni-data-picker/package.json +++ b/uni_modules/uni-data-picker/package.json @@ -1,92 +1,92 @@ -{ - "id": "uni-data-picker", - "displayName": "uni-data-picker 数据驱动的picker选择器", - "version": "1.0.3", - "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景", - "keywords": [ - "uni-ui", - "uniui", - "picker", - "级联", - "省市区", - "" -], - "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-load-more", - "uni-icons", - "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" - } - } - } - } +{ + "id": "uni-data-picker", + "displayName": "uni-data-picker 数据驱动的picker选择器", + "version": "1.0.4", + "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景", + "keywords": [ + "uni-ui", + "uniui", + "picker", + "级联", + "省市区", + "" +], + "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-load-more", + "uni-icons", + "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-data-picker/readme.md b/uni_modules/uni-data-picker/readme.md index 6cda2240..a6bf10f3 100644 --- a/uni_modules/uni-data-picker/readme.md +++ b/uni_modules/uni-data-picker/readme.md @@ -1,22 +1,22 @@ -## DataPicker 级联选择 -> **组件名:uni-data-picker** -> 代码块: `uDataPicker` -> 关联组件:`uni-data-pickerview`、`uni-load-more`。 - - -`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 - -支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 - -候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 - -`` 组件尤其适用于地址选择、分类选择等选择类。 - -`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 - -`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 - -在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 - -### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker) +## DataPicker 级联选择 +> **组件名:uni-data-picker** +> 代码块: `uDataPicker` +> 关联组件:`uni-data-pickerview`、`uni-load-more`。 + + +`` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。 + +支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。 + +候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。 + +`` 组件尤其适用于地址选择、分类选择等选择类。 + +`` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。 + +`` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。 + +在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-data-select/changelog.md b/uni_modules/uni-data-select/changelog.md index 9d68a573..61e1edce 100644 --- a/uni_modules/uni-data-select/changelog.md +++ b/uni_modules/uni-data-select/changelog.md @@ -1,3 +1,7 @@ +## 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) 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 index 22ecd7b8..af359d6d 100644 --- 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 @@ -1,27 +1,25 @@ - + diff --git a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue index dff823bb..7a4343c5 100644 --- a/uni_modules/uni-forms/components/uni-forms/uni-forms.vue +++ b/uni_modules/uni-forms/components/uni-forms/uni-forms.vue @@ -1,13 +1,27 @@ - + diff --git a/uni_modules/uni-forms/components/uni-forms/utils.js b/uni_modules/uni-forms/components/uni-forms/utils.js new file mode 100644 index 00000000..31d57f41 --- /dev/null +++ b/uni_modules/uni-forms/components/uni-forms/utils.js @@ -0,0 +1,293 @@ +/** + * 简单处理对象拷贝 + * @param {Obejct} 被拷贝对象 + * @@return {Object} 拷贝对象 + */ +export const deepCopy = (val) => { + return JSON.parse(JSON.stringify(val)) +} +/** + * 过滤数字类型 + * @param {String} format 数字类型 + * @@return {Boolean} 返回是否为数字类型 + */ +export const typeFilter = (format) => { + return format === 'int' || format === 'double' || format === 'number' || format === 'timestamp'; +} + +/** + * 把 value 转换成指定的类型,用于处理初始值,原因是初始值需要入库不能为 undefined + * @param {String} key 字段名 + * @param {any} value 字段值 + * @param {Object} rules 表单校验规则 + */ +export const getValue = (key, value, rules) => { + const isRuleNumType = rules.find(val => val.format && typeFilter(val.format)); + const isRuleBoolType = rules.find(val => (val.format && val.format === 'boolean') || val.format === 'bool'); + // 输入类型为 number + if (!!isRuleNumType) { + if (!value && value !== 0) { + value = null + } else { + value = isNumber(Number(value)) ? Number(value) : value + } + } + + // 输入类型为 boolean + if (!!isRuleBoolType) { + value = isBoolean(value) ? value : false + } + + return value; +} + +/** + * 获取表单数据 + * @param {String|Array} name 真实名称,需要使用 realName 获取 + * @param {Object} data 原始数据 + * @param {any} value 需要设置的值 + */ +export const setDataValue = (field, formdata, value) => { + formdata[field] = value + return value || '' +} + +/** + * 获取表单数据 + * @param {String|Array} field 真实名称,需要使用 realName 获取 + * @param {Object} data 原始数据 + */ +export const getDataValue = (field, data) => { + return objGet(data, field) +} + +/** + * 获取表单类型 + * @param {String|Array} field 真实名称,需要使用 realName 获取 + */ +export const getDataValueType = (field, data) => { + const value = getDataValue(field, data) + return { + type: type(value), + value + } +} + +/** + * 获取表单可用的真实name + * @param {String|Array} name 表单name + * @@return {String} 表单可用的真实name + */ +export const realName = (name, data = {}) => { + const base_name = _basePath(name) + if (typeof base_name === 'object' && Array.isArray(base_name) && base_name.length > 1) { + const realname = base_name.reduce((a, b) => a += `#${b}`, '_formdata_') + return realname + } + return base_name[0] || name +} + +/** + * 判断是否表单可用的真实name + * @param {String|Array} name 表单name + * @@return {String} 表单可用的真实name + */ +export const isRealName = (name) => { + const reg = /^_formdata_#*/ + return reg.test(name) +} + +/** + * 获取表单数据的原始格式 + * @@return {Object|Array} object 需要解析的数据 + */ +export const rawData = (object = {}, name) => { + let newData = JSON.parse(JSON.stringify(object)) + let formData = {} + for(let i in newData){ + let path = name2arr(i) + objSet(formData,path,newData[i]) + } + return formData +} + +/** + * 真实name还原为 array + * @param {*} name + */ +export const name2arr = (name) => { + let field = name.replace('_formdata_#', '') + field = field.split('#').map(v => (isNumber(v) ? Number(v) : v)) + return field +} + +/** + * 对象中设置值 + * @param {Object|Array} object 源数据 + * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c'] + * @param {String} value 需要设置的值 + */ +export const objSet = (object, path, value) => { + if (typeof object !== 'object') return object; + _basePath(path).reduce((o, k, i, _) => { + if (i === _.length - 1) { + // 若遍历结束直接赋值 + o[k] = value + return null + } else if (k in o) { + // 若存在对应路径,则返回找到的对象,进行下一次遍历 + return o[k] + } else { + // 若不存在对应路径,则创建对应对象,若下一路径是数字,新对象赋值为空数组,否则赋值为空对象 + o[k] = /^[0-9]{1,}$/.test(_[i + 1]) ? [] : {} + return o[k] + } + }, object) + // 返回object + return object; +} + +// 处理 path, path有三种形式:'a[0].b.c'、'a.0.b.c' 和 ['a','0','b','c'],需要统一处理成数组,便于后续使用 +function _basePath(path) { + // 若是数组,则直接返回 + if (Array.isArray(path)) return path + // 若有 '[',']',则替换成将 '[' 替换成 '.',去掉 ']' + return path.replace(/\[/g, '.').replace(/\]/g, '').split('.') +} + +/** + * 从对象中获取值 + * @param {Object|Array} object 源数据 + * @param {String| Array} path 'a.b.c' 或 ['a',0,'b','c'] + * @param {String} defaultVal 如果无法从调用链中获取值的默认值 + */ +export const objGet = (object, path, defaultVal = 'undefined') => { + // 先将path处理成统一格式 + let newPath = _basePath(path) + // 递归处理,返回最后结果 + let val = newPath.reduce((o, k) => { + return (o || {})[k] + }, object); + return !val || val !== undefined ? val : defaultVal +} + + +/** + * 是否为 number 类型 + * @param {any} num 需要判断的值 + * @return {Boolean} 是否为 number + */ +export const isNumber = (num) => { + return !isNaN(Number(num)) +} + +/** + * 是否为 boolean 类型 + * @param {any} bool 需要判断的值 + * @return {Boolean} 是否为 boolean + */ +export const isBoolean = (bool) => { + return (typeof bool === 'boolean') +} +/** + * 是否有必填字段 + * @param {Object} rules 规则 + * @return {Boolean} 是否有必填字段 + */ +export const isRequiredField = (rules) => { + let isNoField = false; + for (let i = 0; i < rules.length; i++) { + const ruleData = rules[i]; + if (ruleData.required) { + isNoField = true; + break; + } + } + return isNoField; +} + + +/** + * 获取数据类型 + * @param {Any} obj 需要获取数据类型的值 + */ +export const type = (obj) => { + var class2type = {}; + + // 生成class2type映射 + "Boolean Number String Function Array Date RegExp Object Error".split(" ").map(function(item, index) { + class2type["[object " + item + "]"] = item.toLowerCase(); + }) + if (obj == null) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[Object.prototype.toString.call(obj)] || "object" : + typeof obj; +} + +/** + * 判断两个值是否相等 + * @param {any} a 值 + * @param {any} b 值 + * @return {Boolean} 是否相等 + */ +export const isEqual = (a, b) => { + //如果a和b本来就全等 + if (a === b) { + //判断是否为0和-0 + return a !== 0 || 1 / a === 1 / b; + } + //判断是否为null和undefined + if (a == null || b == null) { + return a === b; + } + //接下来判断a和b的数据类型 + var classNameA = toString.call(a), + classNameB = toString.call(b); + //如果数据类型不相等,则返回false + if (classNameA !== classNameB) { + return false; + } + //如果数据类型相等,再根据不同数据类型分别判断 + switch (classNameA) { + case '[object RegExp]': + case '[object String]': + //进行字符串转换比较 + return '' + a === '' + b; + case '[object Number]': + //进行数字转换比较,判断是否为NaN + if (+a !== +a) { + return +b !== +b; + } + //判断是否为0或-0 + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + return +a === +b; + } + //如果是对象类型 + if (classNameA == '[object Object]') { + //获取a和b的属性长度 + var propsA = Object.getOwnPropertyNames(a), + propsB = Object.getOwnPropertyNames(b); + if (propsA.length != propsB.length) { + return false; + } + for (var i = 0; i < propsA.length; i++) { + var propName = propsA[i]; + //如果对应属性对应值不相等,则返回false + if (a[propName] !== b[propName]) { + return false; + } + } + return true; + } + //如果是数组类型 + if (classNameA == '[object Array]') { + if (a.toString() == b.toString()) { + return true; + } + return false; + } +} diff --git a/uni_modules/uni-forms/package.json b/uni_modules/uni-forms/package.json index dfa7af4c..38891e3c 100644 --- a/uni_modules/uni-forms/package.json +++ b/uni_modules/uni-forms/package.json @@ -1,7 +1,7 @@ { "id": "uni-forms", "displayName": "uni-forms 表单", - "version": "1.3.2", + "version": "1.4.0", "description": "由输入框、选择器、单选框、多选框等控件组成,用以收集、校验、提交数据", "keywords": [ "uni-ui", diff --git a/uni_modules/uni-goods-nav/changelog.md b/uni_modules/uni-goods-nav/changelog.md index 1fd27762..c6264c67 100644 --- a/uni_modules/uni-goods-nav/changelog.md +++ b/uni_modules/uni-goods-nav/changelog.md @@ -1,16 +1,18 @@ +## 1.2.1(2022-05-30) +- 新增 stat属性,是否开启uni统计功能 ## 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-goods-nav](https://uniapp.dcloud.io/component/uniui/uni-goods-nav) -## 1.1.1(2021-08-24) -- 新增 支持国际化 -## 1.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 1.0.7(2021-05-12) -- 新增 组件示例地址 -## 1.0.6(2021-04-21) -- 优化 添加依赖 uni-icons, 导入后自动下载依赖 -## 1.0.5(2021-02-05) -- 优化 组件引用关系,通过uni_modules引用组件 - -## 1.0.4(2021-02-05) -- 调整为uni_modules目录规范 +## 1.1.1(2021-08-24) +- 新增 支持国际化 +## 1.1.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.0.7(2021-05-12) +- 新增 组件示例地址 +## 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-goods-nav/components/uni-goods-nav/uni-goods-nav.vue b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue index cbe1532b..e7f28b6d 100644 --- a/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue +++ b/uni_modules/uni-goods-nav/components/uni-goods-nav/uni-goods-nav.vue @@ -37,7 +37,8 @@ * @tutorial https://ext.dcloud.net.cn/plugin?id=865 * @property {Array} options 组件参数 * @property {Array} buttonGroup 组件按钮组参数 - * @property {Boolean} fill = [true | false] 组件按钮组参数 + * @property {Boolean} fill = [true | false] 组件按钮组参数 + * @property {Boolean} stat 是否开启统计功能 * @event {Function} click 左侧点击事件 * @event {Function} buttonClick 右侧按钮组点击事件 * @example @@ -77,6 +78,10 @@ fill: { type: Boolean, default: false + }, + stat:{ + type: Boolean, + default: false } }, methods: { @@ -87,7 +92,7 @@ }) }, buttonClick(index, item) { - if (uni.report) { + if (uni.report && this.stat) { uni.report(item.text, item.text) } this.$emit('buttonClick', { @@ -99,7 +104,7 @@ } - + diff --git a/uni_modules/uni-group/package.json b/uni_modules/uni-group/package.json index 8717e84f..ea00a08c 100644 --- a/uni_modules/uni-group/package.json +++ b/uni_modules/uni-group/package.json @@ -1,87 +1,87 @@ -{ - "id": "uni-group", - "displayName": "uni-group 分组", - "version": "1.2.1", - "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", - "keywords": [ - "uni-ui", - "uniui", - "group", - "分组", - "" -], - "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" - } - } - } - } +{ + "id": "uni-group", + "displayName": "uni-group 分组", + "version": "1.2.2", + "description": "分组组件可用于将组件用于分组,添加间隔,以产生明显的区块", + "keywords": [ + "uni-ui", + "uniui", + "group", + "分组", + "" +], + "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-group/readme.md b/uni_modules/uni-group/readme.md index 59d70378..bae67f46 100644 --- a/uni_modules/uni-group/readme.md +++ b/uni_modules/uni-group/readme.md @@ -1,9 +1,9 @@ - -## Group 分组 + +## Group 分组 > **组件名:uni-group** > 代码块: `uGroup` - -分组组件可用于将组件分组,添加间隔,以产生明显的区块。 - + +分组组件可用于将组件分组,添加间隔,以产生明显的区块。 + ### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-group) #### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-id/changelog.md b/uni_modules/uni-id/changelog.md new file mode 100644 index 00000000..666602ef --- /dev/null +++ b/uni_modules/uni-id/changelog.md @@ -0,0 +1,105 @@ +## 3.3.25(2022-06-30) +- 修复config文件不合法时未抛出具体错误的Bug +## 3.3.24(2022-06-28) +- 修复3.3.12引出的使用多应用配置时报错的Bug +## 3.3.23(2022-06-13) +- 修复上版本引出的部分依赖未找到的Bug +## 3.3.22(2022-06-13) +- 新增 preferedWebPlatform 配置用于解决HBuilderX 3.4.9版本起web端platform不一致的问题 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=prefered-web-platform) +## 3.3.21(2022-05-24) +- 修复createInstance传入clientInfo无效的Bug +## 3.3.20(2022-05-19) +- 调整以下错误码(账号已注册[uni-id-account-exists]、账号不存在[uni-id-account-not-exists]、账号已绑定[uni-id-account-bound]) +## 3.3.19(2022-05-19) +- 修复 addUser 部分情况下会创建出重复账号的Bug +## 3.3.18(2022-05-12) +- 调整绑定、解绑邮箱手机号接口,只要传递code参数就进行验证码校验即使传递的值为undefined +## 3.3.17(2022-05-09) +- register_env内增加os_name字段用于区分注册时的客户端系统类型 +## 3.3.16(2022-05-09) +- 修复 addUser接口添加的用户无法使用密码登录的Bug [详情](https://ask.dcloud.net.cn/question/144670) +## 3.3.15(2022-05-08) +- 修复config文件语法错误时报`this.t is not a function`的Bug 感谢@寒暄 +## 3.3.14(2022-05-08) +- 新增 getWeixinUserInfo接口 用于获取app平台微信登录用户的用户信息 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#get-weixin-user-info) +- 新增 addUser接口 用于手动添加用户 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#add-user) +- 新增 resetPwdBySms接口 用于使用短信验证码重置密码 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#reset-pwd-by-sms) +- 新增 refreshToken接口 用于主动刷新用户token [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#refresh-token) +- 调整 用户注册时记录用户注册环境到 register_env 字段 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#user-table) +- 调整 用户注册时将注册 ip 移至 register_env 内 + +## 3.3.13(2022-03-04) +- createInstance方法支持传递clientInfo [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id.html#create-instance) +- 修复`this.t is not a function`报错 +## 3.3.12(2022-01-15) +- 新增 preferedAppPlatform 配置用于解决uni-app vue2版本vue3版本获取platform不一致的问题 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=prefered-app-platform) +- 修复 checkToken 未返回自定义token内容的Bug +## 3.3.11(2022-01-11) +- 修复用户名密码登录时多个应用出现重复用户名登录报错的Bug +## 3.3.10(2022-01-07) +- 新增 自定义国际化语言支持 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=custom-i8n) +- 修复 一键登录时未校验重复手机号是否已验证的Bug +- 修复 Apple登录时用户邮箱为空时报错的Bug +- 修复 登录接口未传username时错误提示不正确的Bug +## 3.3.9(2021-11-09) +- 去除重复的context.xxx未找到的提示语 +## 3.3.8(2021-10-28) +- 新增 用户账户封禁接口 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=ban-account) +- 新增 用户账户注销接口 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=close-account) +- 修复 未传appid时用户重复注册的Bug +## 3.3.7(2021-10-08) +- 移除部分接口的废弃提示 +## 3.3.6(2021-09-08) +- 修复 邀请码可能重复的Bug +## 3.3.5(2021-08-10) +- 修复版本号错误 +## 3.3.4(2021-08-10) +- 微信、QQ、支付宝登录新增type参数用于指定当前是登录还是注册 +## 3.3.3(2021-08-04) +- 修复使用数组形式的配置文件报错的Bug +## 3.3.2(2021-08-03) +- 修复上3.3.0版本引出的createInstance接口传入配置不生效的Bug 感谢[hmh](https://gitee.com/hmh) +## 3.3.1(2021-07-30) +- 修复 将设置用户允许登录的应用列表时传入空数组报错的Bug +## 3.3.0(2021-07-30) +- 新增 不同端应用配置隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config) +- 新增 不同端用户隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user) + + 此版本升级需要开发者处理一下用户数据,请参考 [补齐用户dcloud_appid字段](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=makeup-dcloud-appid) +- 新增 QQ登录、注册相关功能 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=qq) +- 调整 不再支持绑定手机、邮箱时不填验证码直接绑定 +## 3.2.1(2021-07-09) +- 撤销3.2.0版本所做的调整 +## 3.2.0(2021-07-09) +- 【重要】支持不同端(管理端、用户端等)用户隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-user) +- 支持不同端(管理端、用户端等)配置文件隔离 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=isolate-config) +## 3.1.3(2021-07-08) +- 移除插件内误传的node_modules +## 3.1.2(2021-07-08) +- 修复 微信小程序绑定微信账号时报错的Bug +## 3.1.1(2021-07-01) +- 使用新的错误码规范,兼容旧版 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=errcode) +- 修复微信登录、绑定时未返回用户accessToken的Bug +## 3.1.0(2021-04-19) +- 增加对用户名、邮箱、密码字段的两端去空格 +- 默认忽略用户名、邮箱的大小写 [详情](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=case-sensitive) +- 修复 customToken导出async方法报错的Bug +## 3.0.12(2021-04-13) +- 调整bindTokenToDevice默认值为false +## 3.0.11(2021-04-12) +- 修复3.0.7版本引出的多个用户访问时可能出现30201报错的Bug +## 3.0.10(2021-04-08) +- 优化错误提示 +## 3.0.9(2021-04-08) +- bindMobile接口支持通过一键登录的方式绑定 +- 优化错误提示 +## 3.0.8(2021-03-19) +- 修复 3.0.7版本某些情况下生成token报错的Bug +## 3.0.7(2021-03-19) +- 新增 支持uni-config-center,更新uni-id无须再担心配置被覆盖 [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=uni-config-center) +- 新增 自定义token内容,可以缓存角色权限之外的更多信息到客户端 [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=custom-token) +- 新增 支持传入context获取uni-id实例,防止单实例多并发时全局context混乱 [详情](https://uniapp.dcloud.io/uniCloud/uni-id?id=create-instance) +## 3.0.6(2021-03-05) +- 新增[uniID.wxBizDataCrypt](https://uniapp.dcloud.io/uniCloud/uni-id?id=%e5%be%ae%e4%bf%a1%e6%95%b0%e6%8d%ae%e8%a7%a3%e5%af%86)方法 +- 优化loginByApple方法,提高接口响应速度 +## 3.0.5(2021-02-03) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-id/package.json b/uni_modules/uni-id/package.json new file mode 100644 index 00000000..fba5ced7 --- /dev/null +++ b/uni_modules/uni-id/package.json @@ -0,0 +1,88 @@ +{ + "id": "uni-id", + "displayName": "uni-id", + "version": "3.3.25", + "description": "简单、统一、可扩展的用户中心", + "keywords": [ + "uniid", + "uni-id", + "用户管理", + "用户中心", + "短信验证码" +], + "repository": "https://gitee.com/dcloud/uni-id.git", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "uniCloud", + "云函数模板" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": ["uni-config-center"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "u", + "app-nvue": "u" + }, + "H5-mobile": { + "Safari": "u", + "Android Browser": "u", + "微信浏览器(Android)": "u", + "QQ浏览器(Android)": "u" + }, + "H5-pc": { + "Chrome": "u", + "IE": "u", + "Edge": "u", + "Firefox": "u", + "Safari": "u" + }, + "小程序": { + "微信": "u", + "阿里": "u", + "百度": "u", + "字节跳动": "u", + "QQ": "u", + "钉钉": "u", + "快手": "u", + "飞书": "u", + "京东": "u" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "u" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-id/readme.md b/uni_modules/uni-id/readme.md new file mode 100644 index 00000000..68901213 --- /dev/null +++ b/uni_modules/uni-id/readme.md @@ -0,0 +1,33 @@ +**文档已移至[uni-id文档](https://uniapp.dcloud.net.cn/uniCloud/uni-id)** + +> 一般uni-id升级大版本时为不兼容更新,从低版本迁移到高版本请参考:[uni-id迁移指南](https://uniapp.dcloud.net.cn/uniCloud/uni-id?id=migration) + +## 重要升级说明 + +**uni-id 3.x版本,搭配的uniCloud admin版本需大于1.2.10。** + +### 缓存角色权限 + +自`uni-id 3.0.0`起,支持在token内缓存用户的角色权限,默认开启此功能,各登录接口的needPermission参数不再生效。如需关闭请在config内配置`"removePermissionAndRoleFromToken": true`。 + +为什么要缓存角色权限?要知道云数据库是按照读写次数来收取费用的,并且读写数据库会拖慢接口响应速度。未配置`"removePermissionAndRoleFromToken": true`的情况下,可以在调用checkToken接口时不查询数据库获取用户角色权限。 + +详细checkToken流程如下: + +![](https://vkceyugu.cdn.bspapp.com/VKCEYUGU-dc-site/ed45d350-5a4d-11eb-b997-9918a5dda011.jpg) + +可以看出,旧版token(removePermissionAndRoleFromToken为true时生成的)在checkToken时如需返回权限需要进行两次数据库查询。新版token不需要查库即可返回权限信息。 + +**注意** + +- 由于角色权限缓存在token内,可能会存在权限已经更新但是用户token未过期之前依然是旧版角色权限的情况。可以调短一些token过期时间来减少这种情况的影响。 +- admin角色token内不包含permission,如需自行判断用户是否有某个权限,要注意admin角色需要额外判断一下,写法如下 + ```js + const { + role, + permission + } = await uniID.checkToken(event.uniIdToken) + if(role.includes('admin') || permission.includes('your permission id')) { + // 当前角色拥有'your permission id'对应的权限 + } + ``` \ No newline at end of file diff --git a/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md new file mode 100644 index 00000000..29f81d81 --- /dev/null +++ b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js new file mode 100644 index 00000000..0c6e0c05 --- /dev/null +++ b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/index.js @@ -0,0 +1 @@ +"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var t=e(require("crypto")),r=e(require("buffer")),n=e(require("stream")),i=e(require("util"));const o={PARAM_ERROR:{errCode:"param-error"},PARAM_REQUIRED:{errCode:"param-required"},USER_NOT_EXIST:{errCode:"user-not-exist"},ROLE_NOT_EXIST:{errCode:"role-not-exist"},PERMISSION_NOT_EXIST:{errCode:"permission-not-exist"},MULTI_USER_MATCHED:{errCode:"multi-user-matched"},USER_INFO_ERROR:{errCode:"user-info-error"},USER_ACCOUNT_CONFLICT:{errCode:"user-account-conflict"},USER_ACCOUNT_CLOSED:{errCode:"user-account-closed"},ACCOUNT_EXISTS:{errCode:"account-exists"},ACCOUNT_NOT_EXISTS:{errCode:"account-not-exists"},ACCOUNT_BOUND:{errCode:"account-bound"},UNBIND_FAILED:{errCode:"unbind-failed"},INVALID_INVITE_CODE:{errCode:"invalid-invite-code"},SET_INVITE_CODE_FAILED:{errCode:"set-invite-code-failed"},GET_THIRD_PARTY_ACCOUNT_FAILED:{errCode:"get-third-party-account-failed"},GET_THIRD_PARTY_USER_INFO_FAILED:{errCode:"get-third-party-user-info-failed"}},s={0:{errCode:0,errMsg:""},10001:{errCode:"account-banned"},10002:o.USER_NOT_EXIST,10003:o.MULTI_USER_MATCHED,10004:o.USER_INFO_ERROR,10005:o.USER_ACCOUNT_CONFLICT,10006:o.USER_ACCOUNT_CLOSED,10102:{errCode:"password-error"},10103:{errCode:"password-error-exceed-limit"},10201:o.ACCOUNT_EXISTS,10202:o.ACCOUNT_NOT_EXISTS,10203:o.INVALID_INVITE_CODE,10301:o.ACCOUNT_EXISTS,10302:o.ACCOUNT_NOT_EXISTS,10401:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10402:o.ACCOUNT_EXISTS,10403:o.ACCOUNT_NOT_EXISTS,10501:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10502:o.ACCOUNT_EXISTS,10503:o.ACCOUNT_NOT_EXISTS,10601:o.ACCOUNT_EXISTS,10602:o.ACCOUNT_NOT_EXISTS,10701:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10702:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10703:o.ACCOUNT_EXISTS,10704:o.ACCOUNT_NOT_EXISTS,10705:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10706:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10801:o.GET_THIRD_PARTY_ACCOUNT_FAILED,10802:o.ACCOUNT_EXISTS,10803:o.ACCOUNT_NOT_EXISTS,20101:o.PARAM_REQUIRED,20102:o.ACCOUNT_EXISTS,30101:o.PARAM_REQUIRED,30201:{errCode:"check-device-feature-failed"},30202:{errCode:"token-not-exist"},30203:{errCode:"token-expired"},30204:{errCode:"check-token-failed"},40201:o.USER_NOT_EXIST,40202:{errCode:"invalid-old-password"},50101:o.PARAM_REQUIRED,50102:o.PARAM_ERROR,50201:o.PARAM_REQUIRED,50203:o.PARAM_ERROR,50202:{errCode:"invalid-verify-code"},50301:{errCode:"send-sms-code-failed"},60101:o.ACCOUNT_BOUND,60201:o.ACCOUNT_BOUND,60301:o.GET_THIRD_PARTY_ACCOUNT_FAILED,60302:o.ACCOUNT_BOUND,60401:o.GET_THIRD_PARTY_ACCOUNT_FAILED,60402:o.ACCOUNT_BOUND,60501:o.GET_THIRD_PARTY_ACCOUNT_FAILED,60502:o.ACCOUNT_BOUND,70101:o.UNBIND_FAILED,70201:o.UNBIND_FAILED,70301:o.UNBIND_FAILED,70401:o.UNBIND_FAILED,70501:o.UNBIND_FAILED,80301:o.USER_NOT_EXIST,80401:o.SET_INVITE_CODE_FAILED,80402:o.SET_INVITE_CODE_FAILED,80501:o.INVALID_INVITE_CODE,80502:o.USER_NOT_EXIST,80503:{errCode:"modify-invite-code-is-not-allowed"},80601:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80602:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80701:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80702:o.GET_THIRD_PARTY_ACCOUNT_FAILED,80801:{errCode:"decrypt-weixin-data-failed"},80802:{errCode:"decrypt-weixin-data-failed"},80803:{errCode:"invalid-weixin-appid"},80804:o.PARAM_REQUIRED,80805:o.PARAM_REQUIRED,80806:o.PARAM_REQUIRED,80901:o.GET_THIRD_PARTY_USER_INFO_FAILED,90001:{errCode:"database-operation-failed"},90002:o.PARAM_REQUIRED,90003:o.PARAM_ERROR,90004:o.USER_NOT_EXIST,90005:o.ROLE_NOT_EXIST,90006:o.PERMISSION_NOT_EXIST};class a extends Error{constructor(e){super(e.message),this.errMsg=e.message||"",Object.defineProperties(this,{message:{get(){return`errCode: ${e.code||""} | errMsg: `+this.errMsg},set(e){this.errMsg=e}}})}}const c=Object.prototype.toString,u=Object.prototype.hasOwnProperty;function d(e,t){return u.call(e,t)}function p(e){return"[object Object]"===c.call(e)}function l(e){return"function"==typeof e}function f(e){return!!e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then}function m(e){return Object.prototype.toString.call(e).slice(8,-1).toLowerCase()}const h=/_(\w)/g,g=/[A-Z]/g;function y(e){return e.replace(h,(e,t)=>t?t.toUpperCase():"")}function w(e){return e.replace(g,e=>"_"+e.toLowerCase())}function v(e,t){let r,n;switch(t){case"snake2camel":n=y,r=h;break;case"camel2snake":n=w,r=g}for(const i in e)if(d(e,i)&&r.test(i)){const r=n(i);e[r]=e[i],delete e[i],p(e[r])?e[r]=v(e[r],t):Array.isArray(e[r])&&(e[r]=e[r].map(e=>v(e,t)))}return e}function _(e){return v(e,"snake2camel")}function b(e){return v(e,"camel2snake")}function T(e){return function(e,t="-"){e=e||new Date;const r=[];return r.push(e.getFullYear()),r.push(("00"+(e.getMonth()+1)).substr(-2)),r.push(("00"+e.getDate()).substr(-2)),r.join(t)}(e=e||new Date)+" "+function(e,t=":"){e=e||new Date;const r=[];return r.push(("00"+e.getHours()).substr(-2)),r.push(("00"+e.getMinutes()).substr(-2)),r.push(("00"+e.getSeconds()).substr(-2)),r.join(t)}(e)}function E(){"development"===process.env.NODE_ENV&&console.log(...arguments)}function C(e=6){let t="";for(let r=0;r-1?"&":"?"}access_token=${t.accessToken}`}return`${e}${r}`}class G{constructor(e){this.options=Object.assign({baseUrl:"https://api.weixin.qq.com",timeout:5e3},e)}async _requestWxOpenapi({name:e,url:t,data:r,options:n}){const i={method:"GET",dataType:"json",dataAsQueryString:!0,timeout:this.options.timeout};return await H({name:"auth."+e,url:`${this.options.baseUrl}${K(t,r)}`,data:r,options:n,defaultOptions:i})}async code2Session(e){return await this._requestWxOpenapi({name:"code2Session",url:"/sns/jscode2session",data:{grant_type:"authorization_code",appid:this.options.appId,secret:this.options.secret,js_code:e}})}async getOauthAccessToken(e){const t=await this._requestWxOpenapi({name:"getOauthAccessToken",url:"/sns/oauth2/access_token",data:{grant_type:"authorization_code",appid:this.options.appId,secret:this.options.secret,code:e}});return t.expiresIn&&(t.expired=Date.now()+t.expiresIn),t}async getUserInfo({accessToken:e,openid:t}={}){const{nickname:r,headimgurl:n}=await this._requestWxOpenapi({name:"getUserInfo",url:"/sns/userinfo",data:{accessToken:e,openid:t,appid:this.options.appId,secret:this.options.secret,scope:"snsapi_userinfo"}});return{nickname:r,avatar:n}}}async function Q({name:e,url:t,data:r,options:n,defaultOptions:i}){let o;n=Object.assign({},i,n,{data:b(Object.assign({},r))});try{o=await uniCloud.httpclient.request(t,n)}catch(t){return function(e,t){throw new a({code:t.code||-2,message:t.message||e+" fail"})}(e,t)}let s=o.data;const c=o.headers["content-type"];if(!Buffer.isBuffer(s)||0!==c.indexOf("text/plain")&&0!==c.indexOf("application/json"))Buffer.isBuffer(s)&&(s={buffer:s,contentType:c});else try{s=JSON.parse(s.toString())}catch(e){s=s.toString()}return _(function(e,t){if(t.ret||t.error){const r=t.ret||t.error||t.errcode||-2,n=t.msg||t.error_description||t.errmsg||e+" fail";throw new a({code:r,message:n})}return delete t.ret,delete t.msg,delete t.error,delete t.error_description,delete t.errcode,delete t.errmsg,{...t,errMsg:e+" ok",errCode:0}}(e,s||{errCode:-2,errMsg:"Request failed"}))}class X{constructor(e){this.options=Object.assign({baseUrl:"https://graph.qq.com",timeout:5e3},e)}async _requestQQOpenapi({name:e,url:t,data:r,options:n}){const i={method:"GET",dataType:"json",dataAsQueryString:!0,timeout:this.options.timeout};var o,s;return await Q({name:"auth."+e,url:(o=this.options.baseUrl,s=t,/^https?:/.test(s)?s:o+s),data:r,options:n,defaultOptions:i})}async getOpenidByToken({accessToken:e}={}){const t=await this._requestQQOpenapi({name:"getOpenidByToken",url:"/oauth2.0/me",data:{accessToken:e,unionid:1,fmt:"json"}});if(t.clientId!==this.options.appId)throw new a({code:"APPID_NOT_MATCH",message:"appid not match"});return{openid:t.openid,unionid:t.unionid}}async code2Session({code:e}={}){return await this._requestQQOpenapi({name:"getOpenidByToken",url:"https://api.q.qq.com/sns/jscode2session",data:{grant_type:"authorization_code",appid:this.options.appId,secret:this.options.secret,js_code:e}})}}const Y={RSA:"RSA-SHA1",RSA2:"RSA-SHA256"};var z={code2Session:{returnValue:{openid:"userId"}}};class W extends class{constructor(e={}){if(!e.appId)throw new Error("appId required");if(!e.privateKey)throw new Error("privateKey required");const t={gateway:"https://openapi.alipay.com/gateway.do",timeout:5e3,charset:"utf-8",version:"1.0",signType:"RSA2",timeOffset:-(new Date).getTimezoneOffset()/60,keyType:"PKCS8"};e.sandbox&&(e.gateway="https://openapi.alipaydev.com/gateway.do"),this.options=Object.assign({},t,e);const r="PKCS8"===this.options.keyType?"PRIVATE KEY":"RSA PRIVATE KEY";this.options.privateKey=this._formatKey(this.options.privateKey,r),this.options.alipayPublicKey&&(this.options.alipayPublicKey=this._formatKey(this.options.alipayPublicKey,"PUBLIC KEY"))}_formatKey(e,t){return`-----BEGIN ${t}-----\n${e}\n-----END ${t}-----`}_formatUrl(e,t){let r=e;const n=["app_id","method","format","charset","sign_type","sign","timestamp","version","notify_url","return_url","auth_token","app_auth_token"];for(const e in t)if(n.indexOf(e)>-1){const n=encodeURIComponent(t[e]);r=`${r}${r.includes("?")?"&":"?"}${e}=${n}`,delete t[e]}return{execParams:t,url:r}}_getSign(e,r){const n=r.bizContent||null;delete r.bizContent;const i=Object.assign({method:e,appId:this.options.appId,charset:this.options.charset,version:this.options.version,signType:this.options.signType,timestamp:T((o=this.options.timeOffset,new Date(Date.now()+6e4*((new Date).getTimezoneOffset()+60*(o||0)))))},r);var o;n&&(i.bizContent=JSON.stringify(b(n)));const s=b(i),a=Object.keys(s).sort().map(e=>{let t=s[e];return"[object String]"!==Array.prototype.toString.call(t)&&(t=JSON.stringify(t)),`${e}=${t}`}).join("&"),c=t.createSign(Y[this.options.signType]).update(a,"utf8").sign(this.options.privateKey,"base64");return Object.assign(s,{sign:c})}async _exec(e,t={},r={}){const n=this._getSign(e,t),{url:i,execParams:o}=this._formatUrl(this.options.gateway,n),{status:s,data:a}=await uniCloud.httpclient.request(i,{method:"POST",data:o,dataType:"text",timeout:this.options.timeout});if(200!==s)throw new Error("request fail");const c=JSON.parse(a),u=e.replace(/\./g,"_")+"_response",d=c[u],p=c.error_response;if(d){if(!r.validateSign||this._checkResponseSign(a,u)){if(!d.code||"10000"===d.code){return{errCode:0,errMsg:d.msg||"",..._(d)}}const e=d.sub_code?`${d.sub_code} ${d.sub_msg}`:""+(d.msg||"unkonwn error");throw new Error(e)}throw new Error("check sign error")}if(p)throw new Error(p.sub_msg||p.msg||"request fail");throw new Error("request fail")}_checkResponseSign(e,r){if(!this.options.alipayPublicKey||""===this.options.alipayPublicKey)return console.warn("options.alipayPublicKey is empty"),!0;if(!e)return!1;const n=this._getSignStr(e,r),i=JSON.parse(e).sign,o=t.createVerify(Y[this.options.signType]);return o.update(n,"utf8"),o.verify(this.options.alipayPublicKey,i,"base64")}_getSignStr(e,t){let r=e.trim();const n=e.indexOf(t+'"'),i=e.lastIndexOf('"sign"');return r=r.substr(n+t.length+1),r=r.substr(0,i),r=r.replace(/^[^{]*{/g,"{"),r=r.replace(/\}([^}]*)$/g,"}"),r}}{constructor(e){super(e),this._protocols=z}async code2Session(e){return await this._exec("alipay.system.oauth.token",{grantType:"authorization_code",code:e})}}function J(e){var t=e[0];return t<"0"||t>"7"?"00"+e:e}function Z(e){var t=e.toString(16);return t.length%2?"0"+t:t}function ee(e){if(e<=127)return Z(e);var t=Z(e);return Z(128+t.length/2)+t}function te(e,t){return e(t={exports:{}},t.exports),t.exports}var re=te((function(e,t){var n=r.Buffer;function i(e,t){for(var r in e)t[r]=e[r]}function o(e,t,r){return n(e,t,r)}n.from&&n.alloc&&n.allocUnsafe&&n.allocUnsafeSlow?e.exports=r:(i(r,t),t.Buffer=o),o.prototype=Object.create(n.prototype),i(n,o),o.from=function(e,t,r){if("number"==typeof e)throw new TypeError("Argument must not be a number");return n(e,t,r)},o.alloc=function(e,t,r){if("number"!=typeof e)throw new TypeError("Argument must be a number");var i=n(e);return void 0!==t?"string"==typeof r?i.fill(t,r):i.fill(t):i.fill(0),i},o.allocUnsafe=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return n(e)},o.allocUnsafeSlow=function(e){if("number"!=typeof e)throw new TypeError("Argument must be a number");return r.SlowBuffer(e)}})),ne=(re.Buffer,re.Buffer);function ie(e){if(this.buffer=null,this.writable=!0,this.readable=!0,!e)return this.buffer=ne.alloc(0),this;if("function"==typeof e.pipe)return this.buffer=ne.alloc(0),e.pipe(this),this;if(e.length||"object"==typeof e)return this.buffer=e,this.writable=!1,process.nextTick(function(){this.emit("end",e),this.readable=!1,this.emit("close")}.bind(this)),this;throw new TypeError("Unexpected data type ("+typeof e+")")}i.inherits(ie,n),ie.prototype.write=function(e){this.buffer=ne.concat([this.buffer,ne.from(e)]),this.emit("data",e)},ie.prototype.end=function(e){e&&this.write(e),this.emit("end",e),this.emit("close"),this.writable=!1,this.readable=!1};var oe=ie,se=r.Buffer,ae=r.SlowBuffer,ce=ue;function ue(e,t){if(!se.isBuffer(e)||!se.isBuffer(t))return!1;if(e.length!==t.length)return!1;for(var r=0,n=0;n=128&&--n,n}var we={derToJose:function(e,t){e=ge(e);var r=me(t),n=r+1,i=e.length,o=0;if(48!==e[o++])throw new Error('Could not find expected "seq"');var s=e[o++];if(129===s&&(s=e[o++]),i-o0)return function(e){if((e=String(e)).length>100)return;var t=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(!t)return;var r=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*r;case"weeks":case"week":case"w":return 6048e5*r;case"days":case"day":case"d":return r*mt;case"hours":case"hour":case"hrs":case"hr":case"h":return r*ft;case"minutes":case"minute":case"mins":case"min":case"m":return r*lt;case"seconds":case"second":case"secs":case"sec":case"s":return r*pt;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r;default:return}}(e);if("number"===r&&isFinite(e))return t.long?function(e){var t=Math.abs(e);if(t>=mt)return gt(e,t,mt,"day");if(t>=ft)return gt(e,t,ft,"hour");if(t>=lt)return gt(e,t,lt,"minute");if(t>=pt)return gt(e,t,pt,"second");return e+" ms"}(e):function(e){var t=Math.abs(e);if(t>=mt)return Math.round(e/mt)+"d";if(t>=ft)return Math.round(e/ft)+"h";if(t>=lt)return Math.round(e/lt)+"m";if(t>=pt)return Math.round(e/pt)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))};function gt(e,t,r,n){var i=t>=1.5*r;return Math.round(e/r)+" "+n+(i?"s":"")}var yt=function(e,t){var r=t||Math.floor(Date.now()/1e3);if("string"==typeof e){var n=ht(e);if(void 0===n)return;return Math.floor(r+n/1e3)}return"number"==typeof e?r+e:void 0},wt=te((function(e,t){var r;t=e.exports=G,r="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?function(){var e=Array.prototype.slice.call(arguments,0);e.unshift("SEMVER"),console.log.apply(console,e)}:function(){},t.SEMVER_SPEC_VERSION="2.0.0";var n=Number.MAX_SAFE_INTEGER||9007199254740991,i=t.re=[],o=t.src=[],s=0,a=s++;o[a]="0|[1-9]\\d*";var c=s++;o[c]="[0-9]+";var u=s++;o[u]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var d=s++;o[d]="("+o[a]+")\\.("+o[a]+")\\.("+o[a]+")";var p=s++;o[p]="("+o[c]+")\\.("+o[c]+")\\.("+o[c]+")";var l=s++;o[l]="(?:"+o[a]+"|"+o[u]+")";var f=s++;o[f]="(?:"+o[c]+"|"+o[u]+")";var m=s++;o[m]="(?:-("+o[l]+"(?:\\."+o[l]+")*))";var h=s++;o[h]="(?:-?("+o[f]+"(?:\\."+o[f]+")*))";var g=s++;o[g]="[0-9A-Za-z-]+";var y=s++;o[y]="(?:\\+("+o[g]+"(?:\\."+o[g]+")*))";var w=s++,v="v?"+o[d]+o[m]+"?"+o[y]+"?";o[w]="^"+v+"$";var _="[v=\\s]*"+o[p]+o[h]+"?"+o[y]+"?",b=s++;o[b]="^"+_+"$";var T=s++;o[T]="((?:<|>)?=?)";var E=s++;o[E]=o[c]+"|x|X|\\*";var C=s++;o[C]=o[a]+"|x|X|\\*";var A=s++;o[A]="[v=\\s]*("+o[C]+")(?:\\.("+o[C]+")(?:\\.("+o[C]+")(?:"+o[m]+")?"+o[y]+"?)?)?";var S=s++;o[S]="[v=\\s]*("+o[E]+")(?:\\.("+o[E]+")(?:\\.("+o[E]+")(?:"+o[h]+")?"+o[y]+"?)?)?";var I=s++;o[I]="^"+o[T]+"\\s*"+o[A]+"$";var x=s++;o[x]="^"+o[T]+"\\s*"+o[S]+"$";var k=s++;o[k]="(?:^|[^\\d])(\\d{1,16})(?:\\.(\\d{1,16}))?(?:\\.(\\d{1,16}))?(?:$|[^\\d])";var O=s++;o[O]="(?:~>?)";var P=s++;o[P]="(\\s*)"+o[O]+"\\s+",i[P]=new RegExp(o[P],"g");var R=s++;o[R]="^"+o[O]+o[A]+"$";var j=s++;o[j]="^"+o[O]+o[S]+"$";var D=s++;o[D]="(?:\\^)";var q=s++;o[q]="(\\s*)"+o[D]+"\\s+",i[q]=new RegExp(o[q],"g");var N=s++;o[N]="^"+o[D]+o[A]+"$";var U=s++;o[U]="^"+o[D]+o[S]+"$";var L=s++;o[L]="^"+o[T]+"\\s*("+_+")$|^$";var V=s++;o[V]="^"+o[T]+"\\s*("+v+")$|^$";var M=s++;o[M]="(\\s*)"+o[T]+"\\s*("+_+"|"+o[A]+")",i[M]=new RegExp(o[M],"g");var B=s++;o[B]="^\\s*("+o[A]+")\\s+-\\s+("+o[A]+")\\s*$";var F=s++;o[F]="^\\s*("+o[S]+")\\s+-\\s+("+o[S]+")\\s*$";var $=s++;o[$]="(<|>)?=?\\s*\\*";for(var H=0;H<35;H++)r(H,o[H]),i[H]||(i[H]=new RegExp(o[H]));function K(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof G)return e;if("string"!=typeof e)return null;if(e.length>256)return null;if(!(t.loose?i[b]:i[w]).test(e))return null;try{return new G(e,t)}catch(e){return null}}function G(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof G){if(e.loose===t.loose)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>256)throw new TypeError("version is longer than 256 characters");if(!(this instanceof G))return new G(e,t);r("SemVer",e,t),this.options=t,this.loose=!!t.loose;var o=e.trim().match(t.loose?i[b]:i[w]);if(!o)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>n||this.major<0)throw new TypeError("Invalid major version");if(this.minor>n||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>n||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map((function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(t>=0&&t=0;)"number"==typeof this.prerelease[r]&&(this.prerelease[r]++,r=-2);-1===r&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},t.inc=function(e,t,r,n){"string"==typeof r&&(n=r,r=void 0);try{return new G(e,r).inc(t,n).version}catch(e){return null}},t.diff=function(e,t){if(J(e,t))return null;var r=K(e),n=K(t),i="";if(r.prerelease.length||n.prerelease.length){i="pre";var o="prerelease"}for(var s in r)if(("major"===s||"minor"===s||"patch"===s)&&r[s]!==n[s])return i+s;return o},t.compareIdentifiers=X;var Q=/^[0-9]+$/;function X(e,t){var r=Q.test(e),n=Q.test(t);return r&&n&&(e=+e,t=+t),e===t?0:r&&!n?-1:n&&!r?1:e0}function W(e,t,r){return Y(e,t,r)<0}function J(e,t,r){return 0===Y(e,t,r)}function Z(e,t,r){return 0!==Y(e,t,r)}function ee(e,t,r){return Y(e,t,r)>=0}function te(e,t,r){return Y(e,t,r)<=0}function re(e,t,r,n){switch(t){case"===":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e===r;case"!==":return"object"==typeof e&&(e=e.version),"object"==typeof r&&(r=r.version),e!==r;case"":case"=":case"==":return J(e,r,n);case"!=":return Z(e,r,n);case">":return z(e,r,n);case">=":return ee(e,r,n);case"<":return W(e,r,n);case"<=":return te(e,r,n);default:throw new TypeError("Invalid operator: "+t)}}function ne(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof ne){if(e.loose===!!t.loose)return e;e=e.value}if(!(this instanceof ne))return new ne(e,t);r("comparator",e,t),this.options=t,this.loose=!!t.loose,this.parse(e),this.semver===ie?this.value="":this.value=this.operator+this.semver.version,r("comp",this)}t.rcompareIdentifiers=function(e,t){return X(t,e)},t.major=function(e,t){return new G(e,t).major},t.minor=function(e,t){return new G(e,t).minor},t.patch=function(e,t){return new G(e,t).patch},t.compare=Y,t.compareLoose=function(e,t){return Y(e,t,!0)},t.rcompare=function(e,t,r){return Y(t,e,r)},t.sort=function(e,r){return e.sort((function(e,n){return t.compare(e,n,r)}))},t.rsort=function(e,r){return e.sort((function(e,n){return t.rcompare(e,n,r)}))},t.gt=z,t.lt=W,t.eq=J,t.neq=Z,t.gte=ee,t.lte=te,t.cmp=re,t.Comparator=ne;var ie={};function oe(e,t){if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),e instanceof oe)return e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease?e:new oe(e.raw,t);if(e instanceof ne)return new oe(e.value,t);if(!(this instanceof oe))return new oe(e,t);if(this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map((function(e){return this.parseRange(e.trim())}),this).filter((function(e){return e.length})),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}function se(e){return!e||"x"===e.toLowerCase()||"*"===e}function ae(e,t,r,n,i,o,s,a,c,u,d,p,l){return((t=se(r)?"":se(n)?">="+r+".0.0":se(i)?">="+r+"."+n+".0":">="+t)+" "+(a=se(c)?"":se(u)?"<"+(+c+1)+".0.0":se(d)?"<"+c+"."+(+u+1)+".0":p?"<="+c+"."+u+"."+d+"-"+p:"<="+a)).trim()}function ce(e,t,n){for(var i=0;i0){var o=e[i].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}return!0}function ue(e,t,r){try{t=new oe(t,r)}catch(e){return!1}return t.test(e)}function de(e,t,r,n){var i,o,s,a,c;switch(e=new G(e,n),t=new oe(t,n),r){case">":i=z,o=te,s=W,a=">",c=">=";break;case"<":i=W,o=ee,s=z,a="<",c="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ue(e,t,n))return!1;for(var u=0;u=0.0.0")),p=p||e,l=l||e,i(e.semver,p.semver,n)?p=e:s(e.semver,l.semver,n)&&(l=e)})),p.operator===a||p.operator===c)return!1;if((!l.operator||l.operator===a)&&o(e,l.semver))return!1;if(l.operator===c&&s(e,l.semver))return!1}return!0}ne.prototype.parse=function(e){var t=this.options.loose?i[L]:i[V],r=e.match(t);if(!r)throw new TypeError("Invalid comparator: "+e);this.operator=r[1],"="===this.operator&&(this.operator=""),r[2]?this.semver=new G(r[2],this.options.loose):this.semver=ie},ne.prototype.toString=function(){return this.value},ne.prototype.test=function(e){return r("Comparator.test",e,this.options.loose),this.semver===ie||("string"==typeof e&&(e=new G(e,this.options)),re(e,this.operator,this.semver,this.options))},ne.prototype.intersects=function(e,t){if(!(e instanceof ne))throw new TypeError("a Comparator is required");var r;if(t&&"object"==typeof t||(t={loose:!!t,includePrerelease:!1}),""===this.operator)return r=new oe(e.value,t),ue(this.value,r,t);if(""===e.operator)return r=new oe(this.value,t),ue(e.semver,r,t);var n=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),i=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),o=this.semver.version===e.semver.version,s=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),a=re(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),c=re(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return n||i||o&&s||a||c},t.Range=oe,oe.prototype.format=function(){return this.range=this.set.map((function(e){return e.join(" ").trim()})).join("||").trim(),this.range},oe.prototype.toString=function(){return this.range},oe.prototype.parseRange=function(e){var t=this.options.loose;e=e.trim();var n=t?i[F]:i[B];e=e.replace(n,ae),r("hyphen replace",e),e=e.replace(i[M],"$1$2$3"),r("comparator trim",e,i[M]),e=(e=(e=e.replace(i[P],"$1~")).replace(i[q],"$1^")).split(/\s+/).join(" ");var o=t?i[L]:i[V],s=e.split(" ").map((function(e){return function(e,t){return r("comp",e,t),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){r("caret",e,t);var n=t.loose?i[U]:i[N];return e.replace(n,(function(t,n,i,o,s){var a;return r("caret",e,t,n,i,o,s),se(n)?a="":se(i)?a=">="+n+".0.0 <"+(+n+1)+".0.0":se(o)?a="0"===n?">="+n+"."+i+".0 <"+n+"."+(+i+1)+".0":">="+n+"."+i+".0 <"+(+n+1)+".0.0":s?(r("replaceCaret pr",s),a="0"===n?"0"===i?">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+i+"."+(+o+1):">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+(+i+1)+".0":">="+n+"."+i+"."+o+"-"+s+" <"+(+n+1)+".0.0"):(r("no pr"),a="0"===n?"0"===i?">="+n+"."+i+"."+o+" <"+n+"."+i+"."+(+o+1):">="+n+"."+i+"."+o+" <"+n+"."+(+i+1)+".0":">="+n+"."+i+"."+o+" <"+(+n+1)+".0.0"),r("caret return",a),a}))}(e,t)})).join(" ")}(e,t),r("caret",e),e=function(e,t){return e.trim().split(/\s+/).map((function(e){return function(e,t){var n=t.loose?i[j]:i[R];return e.replace(n,(function(t,n,i,o,s){var a;return r("tilde",e,t,n,i,o,s),se(n)?a="":se(i)?a=">="+n+".0.0 <"+(+n+1)+".0.0":se(o)?a=">="+n+"."+i+".0 <"+n+"."+(+i+1)+".0":s?(r("replaceTilde pr",s),a=">="+n+"."+i+"."+o+"-"+s+" <"+n+"."+(+i+1)+".0"):a=">="+n+"."+i+"."+o+" <"+n+"."+(+i+1)+".0",r("tilde return",a),a}))}(e,t)})).join(" ")}(e,t),r("tildes",e),e=function(e,t){return r("replaceXRanges",e,t),e.split(/\s+/).map((function(e){return function(e,t){e=e.trim();var n=t.loose?i[x]:i[I];return e.replace(n,(function(t,n,i,o,s,a){r("xRange",e,t,n,i,o,s,a);var c=se(i),u=c||se(o),d=u||se(s);return"="===n&&d&&(n=""),c?t=">"===n||"<"===n?"<0.0.0":"*":n&&d?(u&&(o=0),s=0,">"===n?(n=">=",u?(i=+i+1,o=0,s=0):(o=+o+1,s=0)):"<="===n&&(n="<",u?i=+i+1:o=+o+1),t=n+i+"."+o+"."+s):u?t=">="+i+".0.0 <"+(+i+1)+".0.0":d&&(t=">="+i+"."+o+".0 <"+i+"."+(+o+1)+".0"),r("xRange return",t),t}))}(e,t)})).join(" ")}(e,t),r("xrange",e),e=function(e,t){return r("replaceStars",e,t),e.trim().replace(i[$],"")}(e,t),r("stars",e),e}(e,this.options)}),this).join(" ").split(/\s+/);return this.options.loose&&(s=s.filter((function(e){return!!e.match(o)}))),s=s.map((function(e){return new ne(e,this.options)}),this)},oe.prototype.intersects=function(e,t){if(!(e instanceof oe))throw new TypeError("a Range is required");return this.set.some((function(r){return r.every((function(r){return e.set.some((function(e){return e.every((function(e){return r.intersects(e,t)}))}))}))}))},t.toComparators=function(e,t){return new oe(e,t).set.map((function(e){return e.map((function(e){return e.value})).join(" ").trim().split(" ")}))},oe.prototype.test=function(e){if(!e)return!1;"string"==typeof e&&(e=new G(e,this.options));for(var t=0;t":0===t.prerelease.length?t.patch++:t.prerelease.push(0),t.raw=t.format();case"":case">=":r&&!z(r,t)||(r=t);break;case"<":case"<=":break;default:throw new Error("Unexpected operation: "+e.operator)}}))}if(r&&e.test(r))return r;return null},t.validRange=function(e,t){try{return new oe(e,t).range||"*"}catch(e){return null}},t.ltr=function(e,t,r){return de(e,t,"<",r)},t.gtr=function(e,t,r){return de(e,t,">",r)},t.outside=de,t.prerelease=function(e,t){var r=K(e,t);return r&&r.prerelease.length?r.prerelease:null},t.intersects=function(e,t,r){return e=new oe(e,r),t=new oe(t,r),e.intersects(t)},t.coerce=function(e){if(e instanceof G)return e;if("string"!=typeof e)return null;var t=e.match(i[k]);if(null==t)return null;return K(t[1]+"."+(t[2]||"0")+"."+(t[3]||"0"))}})),vt=(wt.SEMVER_SPEC_VERSION,wt.re,wt.src,wt.parse,wt.valid,wt.clean,wt.SemVer,wt.inc,wt.diff,wt.compareIdentifiers,wt.rcompareIdentifiers,wt.major,wt.minor,wt.patch,wt.compare,wt.compareLoose,wt.rcompare,wt.sort,wt.rsort,wt.gt,wt.lt,wt.eq,wt.neq,wt.gte,wt.lte,wt.cmp,wt.Comparator,wt.Range,wt.toComparators,wt.satisfies,wt.maxSatisfying,wt.minSatisfying,wt.minVersion,wt.validRange,wt.ltr,wt.gtr,wt.outside,wt.prerelease,wt.intersects,wt.coerce,wt.satisfies(process.version,"^6.12.0 || >=8.0.0")),_t=["RS256","RS384","RS512","ES256","ES384","ES512"],bt=["RS256","RS384","RS512"],Tt=["HS256","HS384","HS512"];vt&&(_t.splice(3,0,"PS256","PS384","PS512"),bt.splice(3,0,"PS256","PS384","PS512"));var Et=/^\s+|\s+$/g,Ct=/^[-+]0x[0-9a-f]+$/i,At=/^0b[01]+$/i,St=/^0o[0-7]+$/i,It=/^(?:0|[1-9]\d*)$/,xt=parseInt;function kt(e){return e!=e}function Ot(e,t){return function(e,t){for(var r=-1,n=e?e.length:0,i=Array(n);++r-1&&e%1==0&&e-1&&e%1==0&&e<=9007199254740991}(e.length)&&!function(e){var t=Ht(e)?qt.call(e):"";return"[object Function]"==t||"[object GeneratorFunction]"==t}(e)}function Ht(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function Kt(e){return!!e&&"object"==typeof e}var Gt=function(e,t,r,n){var i;e=$t(e)?e:(i=e)?Ot(i,function(e){return $t(e)?Vt(e):Mt(e)}(i)):[],r=r&&!n?function(e){var t=function(e){if(!e)return 0===e?e:0;if((e=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||Kt(e)&&"[object Symbol]"==qt.call(e)}(e))return NaN;if(Ht(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Ht(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(Et,"");var r=At.test(e);return r||St.test(e)?xt(e.slice(2),r?2:8):Ct.test(e)?NaN:+e}(e))===1/0||e===-1/0){return 17976931348623157e292*(e<0?-1:1)}return e==e?e:0}(e),r=t%1;return t==t?r?t-r:t:0}(r):0;var o=e.length;return r<0&&(r=Lt(o+r,0)),function(e){return"string"==typeof e||!Ft(e)&&Kt(e)&&"[object String]"==qt.call(e)}(e)?r<=o&&e.indexOf(t,r)>-1:!!o&&function(e,t,r){if(t!=t)return function(e,t,r,n){for(var i=e.length,o=r+(n?1:-1);n?o--:++o-1},Qt=Object.prototype.toString;var Xt=function(e){return!0===e||!1===e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Boolean]"==Qt.call(e)},Yt=/^\s+|\s+$/g,zt=/^[-+]0x[0-9a-f]+$/i,Wt=/^0b[01]+$/i,Jt=/^0o[0-7]+$/i,Zt=parseInt,er=Object.prototype.toString;function tr(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var rr=function(e){return"number"==typeof e&&e==function(e){var t=function(e){if(!e)return 0===e?e:0;if((e=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==er.call(e)}(e))return NaN;if(tr(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=tr(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(Yt,"");var r=Wt.test(e);return r||Jt.test(e)?Zt(e.slice(2),r?2:8):zt.test(e)?NaN:+e}(e))===1/0||e===-1/0){return 17976931348623157e292*(e<0?-1:1)}return e==e?e:0}(e),r=t%1;return t==t?r?t-r:t:0}(e)},nr=Object.prototype.toString;var ir=function(e){return"number"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Number]"==nr.call(e)};var or=Function.prototype,sr=Object.prototype,ar=or.toString,cr=sr.hasOwnProperty,ur=ar.call(Object),dr=sr.toString,pr=function(e,t){return function(r){return e(t(r))}}(Object.getPrototypeOf,Object);var lr=function(e){if(!function(e){return!!e&&"object"==typeof e}(e)||"[object Object]"!=dr.call(e)||function(e){var t=!1;if(null!=e&&"function"!=typeof e.toString)try{t=!!(e+"")}catch(e){}return t}(e))return!1;var t=pr(e);if(null===t)return!0;var r=cr.call(t,"constructor")&&t.constructor;return"function"==typeof r&&r instanceof r&&ar.call(r)==ur},fr=Object.prototype.toString,mr=Array.isArray;var hr=function(e){return"string"==typeof e||!mr(e)&&function(e){return!!e&&"object"==typeof e}(e)&&"[object String]"==fr.call(e)},gr=/^\s+|\s+$/g,yr=/^[-+]0x[0-9a-f]+$/i,wr=/^0b[01]+$/i,vr=/^0o[0-7]+$/i,_r=parseInt,br=Object.prototype.toString;function Tr(e,t){var r;if("function"!=typeof t)throw new TypeError("Expected a function");return e=function(e){var t=function(e){if(!e)return 0===e?e:0;if((e=function(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==br.call(e)}(e))return NaN;if(Er(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Er(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(gr,"");var r=wr.test(e);return r||vr.test(e)?_r(e.slice(2),r?2:8):yr.test(e)?NaN:+e}(e))===1/0||e===-1/0){return 17976931348623157e292*(e<0?-1:1)}return e==e?e:0}(e),r=t%1;return t==t?r?t-r:t:0}(e),function(){return--e>0&&(r=t.apply(this,arguments)),e<=1&&(t=void 0),r}}function Er(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}var Cr=function(e){return Tr(2,e)},Ar=["RS256","RS384","RS512","ES256","ES384","ES512","HS256","HS384","HS512","none"];vt&&Ar.splice(3,0,"PS256","PS384","PS512");var Sr={expiresIn:{isValid:function(e){return rr(e)||hr(e)&&e},message:'"expiresIn" should be a number of seconds or string representing a timespan'},notBefore:{isValid:function(e){return rr(e)||hr(e)&&e},message:'"notBefore" should be a number of seconds or string representing a timespan'},audience:{isValid:function(e){return hr(e)||Array.isArray(e)},message:'"audience" must be a string or array'},algorithm:{isValid:Gt.bind(null,Ar),message:'"algorithm" must be a valid string enum value'},header:{isValid:lr,message:'"header" must be an object'},encoding:{isValid:hr,message:'"encoding" must be a string'},issuer:{isValid:hr,message:'"issuer" must be a string'},subject:{isValid:hr,message:'"subject" must be a string'},jwtid:{isValid:hr,message:'"jwtid" must be a string'},noTimestamp:{isValid:Xt,message:'"noTimestamp" must be a boolean'},keyid:{isValid:hr,message:'"keyid" must be a string'},mutatePayload:{isValid:Xt,message:'"mutatePayload" must be a boolean'}},Ir={iat:{isValid:ir,message:'"iat" should be a number of seconds'},exp:{isValid:ir,message:'"exp" should be a number of seconds'},nbf:{isValid:ir,message:'"nbf" should be a number of seconds'}};function xr(e,t,r,n){if(!lr(r))throw new Error('Expected "'+n+'" to be a plain object.');Object.keys(r).forEach((function(i){var o=e[i];if(o){if(!o.isValid(r[i]))throw new Error(o.message)}else if(!t)throw new Error('"'+i+'" is not allowed in "'+n+'"')}))}var kr={audience:"aud",issuer:"iss",subject:"sub",jwtid:"jti"},Or=["expiresIn","notBefore","noTimestamp","audience","issuer","subject","jwtid"],Pr=function(e,t,r,n){var i;if("function"!=typeof r||n||(n=r,r={}),r||(r={}),r=Object.assign({},r),i=n||function(e,t){if(e)throw e;return t},r.clockTimestamp&&"number"!=typeof r.clockTimestamp)return i(new st("clockTimestamp must be a number"));if(void 0!==r.nonce&&("string"!=typeof r.nonce||""===r.nonce.trim()))return i(new st("nonce must be a non-empty string"));var o=r.clockTimestamp||Math.floor(Date.now()/1e3);if(!e)return i(new st("jwt must be provided"));if("string"!=typeof e)return i(new st("jwt must be a string"));var s,a=e.split(".");if(3!==a.length)return i(new st("jwt malformed"));try{s=it(e,{complete:!0})}catch(e){return i(e)}if(!s)return i(new st("invalid token"));var c,u=s.header;if("function"==typeof t){if(!n)return i(new st("verify must be called asynchronous if secret or public key is provided as a callback"));c=t}else c=function(e,r){return r(null,t)};return c(u,(function(t,n){if(t)return i(new st("error in secret or public key callback: "+t.message));var c,d=""!==a[2].trim();if(!d&&n)return i(new st("jwt signature is required"));if(d&&!n)return i(new st("secret or public key must be provided"));if(d||r.algorithms||(r.algorithms=["none"]),r.algorithms||(r.algorithms=~n.toString().indexOf("BEGIN CERTIFICATE")||~n.toString().indexOf("BEGIN PUBLIC KEY")?_t:~n.toString().indexOf("BEGIN RSA PUBLIC KEY")?bt:Tt),!~r.algorithms.indexOf(s.header.alg))return i(new st("invalid algorithm"));try{c=nt.verify(e,s.header.alg,n)}catch(e){return i(e)}if(!c)return i(new st("invalid signature"));var p=s.payload;if(void 0!==p.nbf&&!r.ignoreNotBefore){if("number"!=typeof p.nbf)return i(new st("invalid nbf value"));if(p.nbf>o+(r.clockTolerance||0))return i(new ct("jwt not active",new Date(1e3*p.nbf)))}if(void 0!==p.exp&&!r.ignoreExpiration){if("number"!=typeof p.exp)return i(new st("invalid exp value"));if(o>=p.exp+(r.clockTolerance||0))return i(new dt("jwt expired",new Date(1e3*p.exp)))}if(r.audience){var l=Array.isArray(r.audience)?r.audience:[r.audience];if(!(Array.isArray(p.aud)?p.aud:[p.aud]).some((function(e){return l.some((function(t){return t instanceof RegExp?t.test(e):t===e}))})))return i(new st("jwt audience invalid. expected: "+l.join(" or ")))}if(r.issuer&&("string"==typeof r.issuer&&p.iss!==r.issuer||Array.isArray(r.issuer)&&-1===r.issuer.indexOf(p.iss)))return i(new st("jwt issuer invalid. expected: "+r.issuer));if(r.subject&&p.sub!==r.subject)return i(new st("jwt subject invalid. expected: "+r.subject));if(r.jwtid&&p.jti!==r.jwtid)return i(new st("jwt jwtid invalid. expected: "+r.jwtid));if(r.nonce&&p.nonce!==r.nonce)return i(new st("jwt nonce invalid. expected: "+r.nonce));if(r.maxAge){if("number"!=typeof p.iat)return i(new st("iat required when maxAge is specified"));var f=yt(r.maxAge,p.iat);if(void 0===f)return i(new st('"maxAge" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'));if(o>=f+(r.clockTolerance||0))return i(new dt("maxAge exceeded",new Date(1e3*f)))}if(!0===r.complete){var m=s.signature;return i(null,{header:u,payload:p,signature:m})}return i(null,p)}))},Rr=function(e,t,r,n){"function"==typeof r?(n=r,r={}):r=r||{};var i="object"==typeof e&&!Buffer.isBuffer(e),o=Object.assign({alg:r.algorithm||"HS256",typ:i?"JWT":void 0,kid:r.keyid},r.header);function s(e){if(n)return n(e);throw e}if(!t&&"none"!==r.algorithm)return s(new Error("secretOrPrivateKey must have a value"));if(void 0===e)return s(new Error("payload is required"));if(i){try{!function(e){xr(Ir,!0,e,"payload")}(e)}catch(e){return s(e)}r.mutatePayload||(e=Object.assign({},e))}else{var a=Or.filter((function(e){return void 0!==r[e]}));if(a.length>0)return s(new Error("invalid "+a.join(",")+" option for "+typeof e+" payload"))}if(void 0!==e.exp&&void 0!==r.expiresIn)return s(new Error('Bad "options.expiresIn" option the payload already has an "exp" property.'));if(void 0!==e.nbf&&void 0!==r.notBefore)return s(new Error('Bad "options.notBefore" option the payload already has an "nbf" property.'));try{!function(e){xr(Sr,!1,e,"options")}(r)}catch(e){return s(e)}var c=e.iat||Math.floor(Date.now()/1e3);if(r.noTimestamp?delete e.iat:i&&(e.iat=c),void 0!==r.notBefore){try{e.nbf=yt(r.notBefore,c)}catch(e){return s(e)}if(void 0===e.nbf)return s(new Error('"notBefore" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}if(void 0!==r.expiresIn&&"object"==typeof e){try{e.exp=yt(r.expiresIn,c)}catch(e){return s(e)}if(void 0===e.exp)return s(new Error('"expiresIn" should be a number of seconds or string representing a timespan eg: "1d", "20h", 60'))}Object.keys(kr).forEach((function(t){var n=kr[t];if(void 0!==r[t]){if(void 0!==e[n])return s(new Error('Bad "options.'+t+'" option. The payload already has an "'+n+'" property.'));e[n]=r[t]}}));var u=r.encoding||"utf8";if("function"!=typeof n)return nt.sign({header:o,payload:e,secret:t,encoding:u});n=n&&Cr(n),nt.createSign({header:o,privateKey:t,payload:e,encoding:u}).once("error",n).once("done",(function(e){n(null,e)}))};let jr=[];class Dr{constructor(e){this.options=Object.assign({baseUrl:"https://appleid.apple.com",timeout:1e4},e)}async _fetch(e,t){const{baseUrl:r}=this.options;return uniCloud.httpclient.request(r+e,t)}async verifyIdentityToken(e){const t=e.split(".")[0],{kid:r}=JSON.parse(Buffer.from(t,"base64").toString());if(!jr.length)try{jr=await this.getAuthKeys()}catch(e){return{code:10705,msg:e.message}}const n=this.getUsedKey(jr,r);if(!Object.keys(n).length&&!this.fetched)try{jr=await this.getAuthKeys()}catch(e){return{code:10705,msg:e.message}}let i=null;try{i=Pr(e,function(e,t){var r=Buffer.from(e,"base64"),n=Buffer.from(t,"base64"),i=r.toString("hex"),o=n.toString("hex");i=J(i),o=J(o);var s=i.length/2,a=o.length/2,c=ee(s),u=ee(a),d="30"+ee(s+a+c.length/2+u.length/2+2)+"02"+c+i+"02"+u+o;return"-----BEGIN RSA PUBLIC KEY-----\n"+Buffer.from(d,"hex").toString("base64").match(/.{1,64}/g).join("\n")+"\n-----END RSA PUBLIC KEY-----\n"}(n.n,n.e),{algorithms:n.alg})}catch(e){return{code:10705,msg:e.message}}return{code:0,msg:i}}async getAuthKeys(){const{status:e,data:t}=await this._fetch("/auth/keys",{method:"GET",dataType:"json",timeout:this.options.timeout});if(200!==e)throw new Error("request https://appleid.apple.com/auth/keys fail");return t.keys}getUsedKey(e,t){let r={};for(let n=0;nvoid 0===e))return{code:N,messageValues:{param:this.t("dcloud-appid")}};const r=await P.doc(e).get(),n=r&&r.data&&r.data[0];if(!n)return{code:10002};const i=Object.keys(q).reduce((e,t)=>{const r=t,i=function(e,t){return t.split(".").reduce((e,t)=>e&&e[t],e)}(n,t);return i&&e.push({[r]:i}),e},[]);let o;const s={dcloud_appid:Mr.in(t),_id:Mr.neq(n._id)},a={dcloud_appid:Mr.exists(!1),_id:Mr.neq(n._id)};switch(i.length){case 0:return{code:10004};case 1:o=Mr.or([Mr.and([i[0],s]),Mr.and([i[0],a])]);break;default:o=Mr.or([Mr.and([Mr.or(i),s]),Mr.and([Mr.or(i),a])])}const c=await P.where(o).limit(1).get();return c&&c.data&&c.data[0]?{code:10005}:{code:0}}const Fr=uniCloud.database().command;const $r=uniCloud.database();const Hr=uniCloud.database();const Kr=uniCloud.database();async function Gr(e){const t=["apiKey","apiSecret"];for(let r=0,n=t.length;r0){u=a.and(a.or(c),a.or({dcloud_appid:a.in(s)},{dcloud_appid:a.exists(!1)}));if((await P.where(u).limit(1).get()).data.length>0)return{code:10201,messageValues:{type:this.t("username")}}}const d={role:o,nickname:t,dcloud_appid:s,register_date:Date.now()};if(e&&(d.username=e),r){const{passwordHash:e,version:t}=this.encryptPwd(r);d.password=e,t&&(d.password_secret_version=t)}return n&&(d.mobile=n,d.mobile_confirmed=1),i&&(d.email=i,d.email_confirmed=1),{code:0,uid:(await P.add(d)).id}},getUserInfo:async function({uid:e,field:t}){if(!e)return{code:N,messageValues:{param:this.t("user-id")}};let r;if(t&&t.length){const n={};for(let e=0;evoid 0===e.dcloud_appid||e.dcloud_appid.includes(this.context.APPID));if(0===i.length)return{code:10002};if(i.length>1)return{code:10005};const o=i[0]._id;return this.resetPwd({uid:o,password:r})},setAvatar:async function(e){return await P.doc(e.uid).update({avatar:e.avatar}),{code:0,msg:""}},updatePwd:async function(e){const t=await P.doc(e.uid).get();if(t&&t.data&&t.data.length>0){if(0===this._checkPwd(t.data[0],e.oldPassword).code){const{passwordHash:r,version:n}=this.encryptPwd(e.newPassword),i={password:r,token:[]};n&&(i.password_secret_version=n);return E("upRes",await P.doc(t.data[0]._id).update(i)),{code:0,msg:""}}return{code:40202}}return{code:40201}},updateUser:async function(e){const t=e.uid;if(!t)return{code:N,messageValues:{param:this.t("user-id")}};delete e.uid;const{username:r,email:n}=e,{usernameToLowerCase:i,emailToLowerCase:o}=this._getConfig();let s=r&&r.trim(),a=n&&n.trim();return s&&(i&&(s=s.toLowerCase()),e.username=s),a&&(o&&(a=a.toLowerCase()),e.email=a),E("update -> upRes",await P.doc(t).update(e)),{code:0,msg:""}},banAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:B})},unbanAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:M})},closeAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:F})},openAccount:async function({uid:e}={}){return $.call(this,{uid:e,status:M})},_getAlipayApi:function(){const e=this.context.PLATFORM,t=this._getConfig();if(!t.oauth||!t.oauth.alipay)throw new Error(this.t("config-param-require",{param:e+".alipay"}));return["appid","privateKey"].forEach(r=>{if(!t.oauth.alipay[r])throw new Error(this.t("config-param-require",{param:`${e}.alipay.${r}`}))}),Ur({...t.oauth.alipay})},_getValidInviteCode:async function({inviteCode:e}){let t,r=10;e?(r=1,t=e):t=Vr();let n=!1;try{for(;r>0&&!n;){r--;if(0===(await P.where({my_invite_code:t}).get()).data.length){n=!0;break}t=Vr()}t=Vr()}catch(e){}return n?{code:0,inviteCode:t}:e?{code:80401}:{code:80402}},_addUser:async function(e,{needPermission:t,autoSetDcloudAppid:r=!0}={}){const n=this._getConfig(),i={...e,dcloud_appid:r?[this.context.APPID]:[],register_date:Date.now()},o=(await P.add(i)).id;let s;if(n.removePermissionAndRoleFromToken)s=await this.createToken({uid:o,needPermission:t});else{const t=e.role||[];let r;r=0===t.length||t.includes("admin")?[]:await this._getPermissionListByRoleList(t),s=await this.createToken({uid:o,role:t,permission:r})}const{token:a,tokenExpired:c}=s;return await P.doc(o).update({token:[a]}),{token:a,tokenExpired:c,uid:o,type:"register",userInfo:Object.assign({},i,{token:[a]})}},_loginExec:async function(e,t={}){if(e.status===B)return{code:10001};if(e.status===F)return{code:10006};const r=this._getConfig();let n=e.token||[];"string"==typeof n&&(n=[n]);const i=this._getExpiredToken(n);let o;if(n=n.filter(e=>-1===i.indexOf(e)),r.removePermissionAndRoleFromToken){const r=t.needPermission;o=await this.createToken({uid:e._id,needPermission:r})}else{const t=e.role||[];let r;r=0===t.length||t.includes("admin")?[]:await this._getPermissionListByRoleList(t),o=await this.createToken({uid:e._id,role:t,permission:r})}const{token:s,tokenExpired:a}=o;n.push(s),e.token=n;const c={last_login_date:Date.now(),last_login_ip:this.context.CLIENTIP,token:n,...t.extraData};await P.doc(e._id).update(c);const u=Object.assign({},e,c);return{code:0,msg:"",token:s,uid:u._id,username:u.username,type:"login",userInfo:u,tokenExpired:a}},_registerExec:async function(e,{needPermission:t,autoSetDcloudAppid:r=!0}={}){const{my_invite_code:n}=e;if(this._getConfig().autoSetInviteCode||n){const t=await this._getValidInviteCode({inviteCode:n});if(t.code)return t;e.my_invite_code=t.inviteCode}const{PLATFORM:i,appId:o,appid:s,APPID:a,uniPlatform:c,appName:u,appVersion:d,appVersionCode:p,channel:l,clientIP:f,CLIENTIP:m,OS:h,osName:g}=this.context;return e.register_env={appid:o||s||a||"",uni_platform:c||i||"",os_name:g||h||"",app_name:u||"",app_version:d||"",app_version_code:p||"",channel:l?l+"":"",client_ip:f||m||""},{code:0,msg:"",...await this._addUser(e,{needPermission:t,autoSetDcloudAppid:r})}},_getWeixinApi:function(){const e=this.context.PLATFORM,t=this._getConfig();if(!t.oauth||!t.oauth.weixin)throw new Error(this.t("config-param-require",{param:e+".weixin"}));return["appid","appsecret"].forEach(r=>{if(!t.oauth.weixin[r])throw new Error(this.t("config-param-require",{param:`${e}.weixin.${r}`}))}),qr({...t.oauth.weixin})},_getQQApi:function(){const e=this.context.PLATFORM,t=this._getConfig();if(!t.oauth||!t.oauth.qq)throw new Error(this.t("config-param-require",{param:e+".qq"}));return["appid","appsecret"].forEach(r=>{if(!t.oauth.qq[r])throw new Error(this.t("config-param-require",{param:`${e}.qq.${r}`}))}),Nr({...t.oauth.qq})},_getMatchedUser:function(e,t){if(0===e.length)return{code:10002};let r;const n={},i={};for(let r=e.length-1;r>=0;r--){const o=e[r];for(let s=0;s0?{code:10003,messageValues:{target:"用户"}}:{code:0,msg:"",userMatched:r,fieldMatched:s,isFallbackValueMatched:!!s&&i[s]}},_getCurrentAppUser:function(e){const t=this.context.APPID;return e.filter(e=>void 0===e.dcloud_appid||null===e.dcloud_appid||e.dcloud_appid.indexOf(t)>-1||e.dcloud_appid.indexOf(null)>-1)},_checkLoginUserList:function(e){if(e&&1!==e.length)return e[0].status===F?{code:10006}:{code:10005}},setAuthorizedAppLogin:async function({uid:e,dcloudAppidList:t}={}){if("array"!==m(t))return{code:U,messageValues:{param:"dcloudAppidList",reason:this.t("type-array-required",{param:this.t("dcloud-appid-list")})}};if(t&&0!==t.length){const r=await Br.bind(this)({uid:e,dcloudAppidList:t});if(r.code)return r}return await P.doc(e).update({dcloud_appid:Mr.set(t)}),{code:0}},authorizeAppLogin:async function({uid:e,dcloudAppid:t}={}){const r=await Br.bind(this)({uid:e,dcloudAppidList:[t]});return r.code?r:(await P.doc(e).update({dcloud_appid:Mr.push(t)}),{code:0})},forbidAppLogin:async function({uid:e,dcloudAppid:t}={}){return e?(await P.doc(e).update({dcloud_appid:Mr.pull(t)}),{code:0}):{code:N,messageValues:{param:this.t("user-id")}}},acceptInvite:async function({uid:e,inviteCode:t}){const r=await P.where({_id:Fr.neq(e),inviter_uid:Fr.not(Fr.all([e])),my_invite_code:t}).get();if(1!==r.data.length)return{code:80501,msg:"邀请码无效"};const n=[r.data[0]._id].concat(r.data[0].inviter_uid||[]),i=await P.doc(e).field({my_invite_code:!0,inviter_uid:!0}).get();if(0===i.data.length)return{code:80502};if(i.data[0].inviter_uid&&i.data[0].inviter_uid.length>0)return{code:80503,msg:"邀请码不可修改"};const o=Date.now();return await P.doc(e).update({inviter_uid:n,invite_time:o}),await P.where({inviter_uid:e}).update({inviter_uid:Fr.push(n)}),{code:0,msg:""}},getInvitedUser:async function({uid:e,level:t=1,limit:r=20,offset:n=0,needTotal:i=!1}){const o={code:0,msg:"",invitedUser:(await P.where({["inviter_uid."+(t-1)]:e}).field({_id:!0,username:!0,mobile:!0,invite_time:!0}).orderBy("invite_time","desc").skip(n).limit(r).get()).data};if(i){const r=await P.where({["inviter_uid."+(t-1)]:e}).count();o.total=r.total}return o},setUserInviteCode:async function({uid:e,myInviteCode:t}){const r=await this._getValidInviteCode({inviteCode:t});return r.code?r:(await P.doc(e).update({my_invite_code:r.inviteCode}),{code:0,msg:"",myInviteCode:r.inviteCode})},loginByAlipay:async function(e){"string"==typeof e&&(e={code:e});const{needPermission:t,code:r,myInviteCode:n,role:i,type:o}=e,{openid:s}=await this._getAlipayApi().code2Session(r);if(!s)return{code:10501,messageValues:{account:this.t("alipay-account")}};let a=await P.where({ali_openid:s}).get();if(a=this._getCurrentAppUser(a.data),a&&a.length>0){if("register"===o)return{code:10502,messageValues:{type:this.t("alipay-account")}};if(1!==a.length)return{code:10005};const e=a[0],r=await this._loginExec(e,{needPermission:t});if(0!==r.code)return r;const{userInfo:n}=r;return{...r,openid:s,mobileConfirmed:1===n.mobile_confirmed,emailConfirmed:1===n.email_confirmed}}{if("login"===o)return{code:10503,messageValues:{type:this.t("alipay-account")}};const e={ali_openid:s};e.my_invite_code=n,e.role=i;const r=await this._registerExec(e,{needPermission:t});return 0!==r.code?r:{...r,openid:s,mobileConfirmed:!1,emailConfirmed:!1}}},loginByEmail:async function(e){let{email:t,code:r,password:n,myInviteCode:i,type:o,needPermission:s,role:a}=e||{};if(t=t&&t.trim(),!t)return{code:N,messageValues:{param:"邮箱"}};const{emailToLowerCase:c}=this._getConfig();let u=t;c&&(u=t.toLowerCase());const d=await this.verifyCode({email:u,code:r,type:o||"login"});if(0!==d.code)return d;let p={email:t,email_confirmed:1};const l={field:"email",value:t},f=$r.command;u!==t&&(p=f.or(p,{email:u,email_confirmed:1}),l.fallbackValue=u);let m=await P.where(p).get();if(m=this._getCurrentAppUser(m.data),m&&m.length>0){if("register"===o)return{code:10301,messageValues:{type:"邮箱"}};const e=this._getMatchedUser(m,[l]);if(e.code)return e;const{userMatched:t}=e,r=await this._loginExec(t,{needPermission:s});return 0!==r.code?r:{...r,email:u}}{if("login"===o)return{code:10302,messageValues:{type:"邮箱"}};const e={email:u,email_confirmed:1},t=n&&n.trim();if(t){const{passwordHash:r,version:n}=this.encryptPwd(t);e.password=r,n&&(e.password_secret_version=n)}e.my_invite_code=i,e.role=a;const r=await this._registerExec(e,{needPermission:s});return 0!==r.code?r:{...r,email:u}}},loginBySms:async function({mobile:e,code:t,password:r,inviteCode:n,myInviteCode:i,type:o,needPermission:s,role:a}){if(!(e=e&&e.trim()))return{code:N,messageValues:{param:this.t("mobile")}};const c=this._getConfig();if(c.forceInviteCode&&!o)throw new Error(this.t("login-with-invite-type-required"));const u=await this.verifyCode({mobile:e,code:t,type:o||"login"});if(0!==u.code)return u;const d={mobile:e,mobile_confirmed:1};let p=await P.where(d).get();if(p=this._getCurrentAppUser(p.data),p&&p.length>0){if("register"===o)return{code:10201,messageValues:{type:this.t("mobile")}};if(1!==p.length)return{code:10005};const t=p[0],r=await this._loginExec(t,{needPermission:s});return 0!==r.code?r:{...r,mobile:e}}{const t=Date.now();if("login"===o)return{code:10202,messageValues:{type:this.t("mobile")}};const u={mobile:e,mobile_confirmed:1,register_ip:this.context.CLIENTIP,register_date:t},d=r&&r.trim();if(d){const{passwordHash:e,version:t}=this.encryptPwd(d);u.password=e,t&&(u.password_secret_version=t)}if(n){const e=await P.where({my_invite_code:n}).get();if(1!==e.data.length)return{code:10203};u.inviter_uid=[e.data[0]._id].concat(e.data[0].inviter_uid||[]),u.invite_time=t}else if(c.forceInviteCode)return{code:10203};u.my_invite_code=i,u.role=a;const p=await this._registerExec(u,{needPermission:s});return 0!==p.code?p:{...p,mobile:e}}},loginByWeixin:async function(e){"string"==typeof e&&(e={code:e});const{needPermission:t,platform:r,code:n,myInviteCode:i,role:o,type:s}=e,a=r||this.context.PLATFORM,c="mp-weixin"===a,{openid:u,unionid:d,sessionKey:p,accessToken:l,refreshToken:f,expired:m}=await this._getWeixinApi()[c?"code2Session":"getOauthAccessToken"](n);if(!u)return{code:10401,messageValues:{account:"微信openid"}};let h;h=c?{sessionKey:p}:{accessToken:l,refreshToken:f,accessTokenExpired:m};const g=Hr.command,y=[{wx_openid:{[a]:u}}];d&&y.push({wx_unionid:d});let w=await P.where(g.or(...y)).get();if(w=this._getCurrentAppUser(w.data),w&&w.length>0){if("register"===s)return{code:10402,messageValues:{type:this.t("wechat-account")}};if(1!==w.length)return{code:10005};const e=w[0],r={wx_openid:{[a]:u}};d&&(r.wx_unionid=d);const n=await this._loginExec(e,{needPermission:t,extraData:r});if(0!==n.code)return n;const{userInfo:i}=n;return{...n,openid:u,unionid:d,...h,mobileConfirmed:1===i.mobile_confirmed,emailConfirmed:1===i.email_confirmed}}{if("login"===s)return{code:10403,messageValues:{type:this.t("wechat-account")}};const e={wx_openid:{[a]:u},wx_unionid:d};e.my_invite_code=i,e.role=o;const r=await this._registerExec(e,{needPermission:t});return 0!==r.code?r:{...r,openid:u,unionid:d,...h,mobileConfirmed:!1,emailConfirmed:!1}}},loginByQQ:async function({code:e,accessToken:t,myInviteCode:r,needPermission:n,role:i,type:o}={}){const s=this.context.PLATFORM,a="mp-qq"===s,{openid:c,unionid:u,sessionKey:d}=await this._getQQApi()[a?"code2Session":"getOpenidByToken"]({code:e,accessToken:t});if(!c)return{code:10801,messageValues:{account:"qq openid"}};const p={accessToken:t,sessionKey:d},l=Kr.command,f=[{qq_openid:{[s]:c}}];u&&f.push({qq_unionid:u});let m=await P.where(l.or(...f)).get();if(m=this._getCurrentAppUser(m.data),m&&m.length>0){if("register"===o)return{code:10802,messageValues:{type:this.t("qq-account")}};if(1!==m.length)return{code:10005};const e=m[0],t={qq_openid:{[s]:c}};u&&(t.qq_unionid=u);const r=await this._loginExec(e,{needPermission:n,extraData:t});if(0!==r.code)return r;const{userInfo:i}=r;return{...r,openid:c,unionid:u,...p,mobileConfirmed:1===i.mobile_confirmed,emailConfirmed:1===i.email_confirmed}}{if("login"===o)return{code:10803,messageValues:{type:this.t("qq-account")}};const e={qq_openid:{[s]:c},qq_unionid:u};e.my_invite_code=r,e.role=i;const t=await this._registerExec(e);return 0!==t.code?t:{...t,openid:c,unionid:u,...p,mobileConfirmed:!1,emailConfirmed:!1}}},loginByUniverify:async function({openid:e,access_token:t,password:r,inviteCode:n,myInviteCode:i,type:o,needPermission:s,role:a}){const c=this._getConfig(),u=c&&c.service&&c.service.univerify;if(!u)throw new Error(this.t("uni-verify-config-required"));if(c.forceInviteCode&&!o)throw new Error(this.t("login-with-invite-type-required"));const d=await Gr.bind(this)({...u,openid:e,access_token:t});if(0!==d.code)return d;const p=String(d.phoneNumber);let l=await P.where({mobile:p,mobile_confirmed:1}).get();if(l=this._getCurrentAppUser(l.data),l&&l.length>0){if("register"===o)return{code:10601,messageValues:{type:this.t("mobile")}};if(1!==l.length)return{code:10005};const e=l[0],t=await this._loginExec(e,{needPermission:s});return 0!==t.code?t:{...t,mobile:p}}if("login"===o)return{code:10602,messageValues:{type:this.t("mobile")}};const f=Date.now(),m={mobile:p,my_invite_code:i,mobile_confirmed:1,role:a},h=r&&r.trim();if(h){const{passwordHash:e,version:t}=this.encryptPwd(h);m.password=e,t&&(m.password_secret_version=t)}if(n){let e=await P.where({my_invite_code:n}).get();if(1!==e.data.length)return{code:10203};e=e.data[0],m.inviter_uid=[e._id].concat(e.inviter_uid||[]),m.invite_time=f}else if(c.forceInviteCode)return{code:10203};m.my_invite_code=i;const g=await this._registerExec(m,{needPermission:s});return 0!==g.code?g:{...g,mobile:p}},loginByApple:async function({nickName:e,fullName:t,identityToken:r,myInviteCode:n,type:i,needPermission:o,role:s}){const a=this._getConfig(),c=a&&a.oauth&&a.oauth.apple,u=c&&c.bundleId;if(!u)throw new Error(this.t("config-param-require",{param:"(app || app-plus).apple.bundleId"}));if(!r)return{code:N,messageValues:{param:"identityToken"}};t=e||(t&&Object.keys(t).length>0?t.familyName+t.givenName:"");const{code:d,msg:p}=await Lr().verifyIdentityToken(r);if(0!==d)return{code:d,msg:p,messageValues:{account:this.t("apple-account")}};const{iss:l,sub:f,aud:m,email:h}=p;if("https://appleid.apple.com"!==l)return{code:10706,messageValues:{account:this.t("apple-account")}};if(!f)return{code:10701,messageValues:{account:this.t("apple-account")}};if(u!==m)return{code:10702,messageValues:{account:this.t("apple-account")}};const g=t||"User-"+(h?h.split("@")[0]:Math.random().toString(32).slice(2));let y=await P.where({apple_openid:f}).get();if(y=this._getCurrentAppUser(y.data),y&&y.length>0){if("register"===i)return{code:10703,messageValues:{type:this.t("apple-account")}};if(1!==y.length)return{code:10005};const e=y[0],t=await this._loginExec(e,{needPermission:o});return 0!==t.code?t:{...t,openid:f}}if("login"===i)return{code:10704,messageValues:{type:this.t("apple-account")}};const w={nickname:g,apple_openid:f,my_invite_code:n,role:s},v=await this._registerExec(w,{needPermission:o});return 0!==v.code?v:{...v,openid:f}},login:async function({username:e,password:t,queryField:r=[],needPermission:n}){const i=Qr.command,o=[];r&&r.length||(r=["username"]),r.length>1&&console.warn(this.t("query-field-warning"));const{usernameToLowerCase:s,emailToLowerCase:a,passwordErrorLimit:c,passwordErrorRetryTime:u}=this._getConfig(),d={email:{email_confirmed:1},mobile:{mobile_confirmed:1}},p={},l=e&&e.trim();if(!l)return{code:N,messageValues:{param:this.t("username")}};s&&(p.username=l.toLowerCase()),a&&(p.email=l.toLowerCase());const f=[];r.forEach(t=>{o.push({[t]:e,...d[t]});const r={field:t,value:e};"username"===t&&p.username!==e?(o.push({[t]:p.username,...d[t]}),r.fallbackValue=p.username):"email"===t&&p.email!==e&&(o.push({[t]:p.email,...d[t]}),r.fallbackValue=p.email),f.push(r)});let m=await P.where(i.or(...o)).get();m=this._getCurrentAppUser(m.data);const h=this.context.CLIENTIP,g=this._getMatchedUser(m,f);if(g.code)return g;const{userMatched:y}=g;let w=y.login_ip_limit||[];w=w.filter(e=>e.last_error_time>Date.now()-1e3*u);let v=w.find(e=>e.ip===h);if(v&&v.error_times>=c)return{code:10103};const _=t&&t.trim();if(!_)return{code:N,messageValues:{param:"密码"}};const b=this._checkPwd(y,_);if(0===b.code){const e=w.indexOf(v);e>-1&&w.splice(e,1);const t={login_ip_limit:w},{passwordHash:r,passwordVersion:i}=b;r&&i&&(t.password=r,t.password_secret_version=i);const o=await this._loginExec(y,{needPermission:n,extraData:t});return o.code,o}return v?(v.error_times++,v.last_error_time=Date.now()):(v={ip:h,error_times:1,last_error_time:Date.now()},w.push(v)),await P.doc(y._id).update({login_ip_limit:w}),{code:10102,msg:"密码错误"}},register:async function(e){const t=[],r=[{name:"username",desc:this.t("username")},{name:"email",desc:this.t("email"),extraCond:{email_confirmed:1}},{name:"mobile",desc:this.t("mobile"),extraCond:{mobile_confirmed:1}}],{usernameToLowerCase:n,emailToLowerCase:i}=this._getConfig();r.forEach(r=>{const o=r.name;let s=e[o]&&e[o].trim();s?(("username"===r.name&&n||"email"===r.name&&i)&&(s=s.toLowerCase()),e[o]=s,t.push({[o]:s,...r.extraCond})):delete e[o]});const{username:o,email:s,mobile:a,myInviteCode:c,needPermission:u,autoSetDcloudAppid:d=!0}=e;if("needPermission"in e&&delete e.needPermission,"autoSetDcloudAppid"in e&&delete e.autoSetDcloudAppid,0===t.length)return{code:20101,messageValues:{param:this.t("user-unique-param")}};const p=Xr.command;let l=await P.where(p.or(...t)).get();if(l=this._getCurrentAppUser(l.data),l&&l.length>0){const t=l[0];if(t.status===F)return{code:10006};for(let n=0;nt[e]===i.extraCond[e])),t[i.name]===e[i.name]&&o)return{code:20102,messageValues:{type:i.desc}}}}const f=e.password&&e.password.trim();if(!f)return{code:N,messageValues:{param:this.t("password")}};const{passwordHash:m,version:h}=this.encryptPwd(f);e.password=m,h&&(e.password_secret_version=h),e.my_invite_code=c,delete e.myInviteCode;const g=await this._registerExec(e,{needPermission:u,autoSetDcloudAppid:d});return 0!==g.code?g:{...g,username:o,email:s,mobile:a}},logout:async function(e){const t=await this.checkToken(e);if(t.code)return t;const r=Yr.command;return await P.doc(t.uid).update({token:r.pull(e)}),{code:0,msg:""}},getRoleByUid:async function({uid:e}){if(!e)return{code:N,messageValues:{param:this.t("user-id")}};const t=await P.doc(e).get();return 0===t.data.length?{code:L}:{code:0,msg:"",role:t.data[0].role||[]}},getPermissionByRole:async function({roleID:e}){if(!e)return{code:N,messageValues:{param:"roleID"}};if("admin"===e){return{code:0,msg:"",permission:(await D.limit(1e3).get()).data.map(e=>e.permission_id)}}const t=await j.where({role_id:e}).get();return 0===t.data.length?{code:V}:{code:0,msg:"",permission:t.data[0].permission||[]}},getPermissionByUid:async function({uid:e}={}){const t=await P.aggregate().match({_id:e}).project({role:!0}).unwind("$role").lookup({from:"uni-id-roles",localField:"role",foreignField:"role_id",as:"roleDetail"}).unwind("$roleDetail").replaceRoot({newRoot:"$roleDetail"}).end(),r=[],n=[];return t.data.forEach(e=>{n.push(e.role_id),r.push(...e.permission)}),{code:0,msg:"",role:n,permission:A(r)}},bindRole:async function({uid:e,roleList:t,reset:r=!1}){const n={};return"string"==typeof t&&(t=[t]),n.role=r?t:zr.push(t),await P.doc(e).update(n),{code:0,msg:""}},bindPermission:async function({roleID:e,permissionList:t,reset:r=!1}){const n={};return"string"==typeof t&&(t=[t]),n.permission=r?t:zr.push(t),await j.where({role_id:e}).update(n),{code:0,msg:""}},unbindRole:async function({uid:e,roleList:t}){return"string"==typeof t&&(t=[t]),await P.doc(e).update({role:zr.pull(zr.in(t))}),{code:0,msg:""}},unbindPermission:async function({roleID:e,permissionList:t}){return"string"==typeof t&&(t=[t]),await j.where({role_id:e}).update({permission:zr.pull(zr.in(t))}),{code:0,msg:""}},addRole:async function({roleID:e,roleName:t,comment:r,permission:n=[]}){return e?"admin"===e?{code:U,messageValues:{param:"roleID",reason:this.t("add-role-admin-is-not-allowed")}}:(await j.add({role_id:e,role_name:t,comment:r,permission:n,create_date:Date.now()}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("role-id")}}},addPermission:async function({permissionID:e,permissionName:t,comment:r}){return e?(await D.add({permission_id:e,permission_name:t,comment:r,create_date:Date.now()}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("permission-id")}}},getRoleList:async function({limit:e=20,offset:t=0,needTotal:r=!0}){const n={code:0,msg:"",roleList:(await j.skip(t).limit(e).get()).data};if(r){const{total:e}=await j.where({_id:zr.exists(!0)}).count();n.total=e}return n},getRoleInfo:async function(e){const t=await j.where({role_id:e}).get();return 0===t.data.length?{code:V}:{code:0,...t.data[0]}},updateRole:async function({roleID:e,roleName:t,comment:r,permission:n}){return e?(await j.where({role_id:e}).update({role_name:t,comment:r,permission:n}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("role-id")}}},deleteRole:async function({roleID:e}){const t=m(e);if("string"===t)e=[e];else if("array"!==t)throw new Error("typeof roleID must be array or string");return await j.where({role_id:zr.in(e)}).remove(),await P.where({role:zr.elemMatch(zr.in(e))}).update({role:zr.pullAll(e)}),{code:0,msg:""}},getPermissionList:async function({limit:e=20,offset:t=0,needTotal:r=!0}){const n={code:0,msg:"",permissionList:(await D.skip(t).limit(e).get()).data};if(r){const{total:e}=await D.where({_id:zr.exists(!0)}).count();n.total=e}return n},getPermissionInfo:async function(e){const t=await D.where({permission_id:e}).get();return 0===t.data.length?{code:N,messageValues:{param:this.t("permission-id")}}:{code:0,...t.data[0]}},updatePermission:async function({permissionID:e,permissionName:t,comment:r}){return e?(await D.where({permission_id:e}).update({permission_name:t,comment:r}),{code:0,msg:""}):{code:N,messageValues:{param:this.t("permission-id")}}},deletePermission:async function({permissionID:e}){const t=m(e);if("string"===t)e=[e];else if("array"!==t)throw new Error("typeof permissionID must be array or string");return await D.where({permission_id:zr.in(e)}).remove(),await j.where({permission:zr.elemMatch(zr.in(e))}).update({permission:zr.pullAll(e)}),{code:0,msg:""}},bindAlipay:async function({uid:e,code:t,platform:r}){const n=r||this.context.PLATFORM,{openid:i}=await this._getAlipayApi({platform:n}).code2Session(t);if(!i)return{code:60401,messageValues:{account:this.t("alipay-account")}};let o=await P.where({ali_openid:i}).get();return o=this._getCurrentAppUser(o.data),o&&o.length>0?{code:60402,messageValues:{type:this.t("alipay-account")}}:(await P.doc(e).update({ali_openid:i}),{code:0,openid:i,msg:""})},bindEmail:async function(e){let{uid:t,email:r,code:n}=e||{};if(r=r&&r.trim(),!r)return{code:N,messageValues:{param:this.t("email")}};if(!n)return{code:N,messageValues:{param:this.t("verify-code")}};const{emailToLowerCase:i}=this._getConfig();i&&(r=r.toLowerCase());let o=await P.where({email:r,email_confirmed:1}).get();if(o=this._getCurrentAppUser(o.data),o&&o.length>0)return{code:60201,messageValues:{type:this.t("email")}};const s=await this.verifyCode({email:r,code:n,type:"bind"});return 0!==s.code?s:(await P.doc(t).update({email:r,email_confirmed:1}),{code:0,msg:"",email:r})},bindMobile:async function(e){let{uid:t,mobile:r,code:n,openid:i,access_token:o,type:s="sms"}=e||{};if("univerify"===s){const e=this._getConfig(),t=e&&e.service&&e.service.univerify;if(!t)throw new Error("请在config.json中配置service.univerify下一键登录相关参数");const n=await Gr.bind(this)({...t,openid:i,access_token:o});if(0!==n.code)return n;r=""+n.phoneNumber}let a=await P.where({mobile:r,mobile_confirmed:1}).get();if(a=this._getCurrentAppUser(a.data),a&&a.length>0)return{code:60101,messageValues:{type:"手机号"}};if("sms"===s&&"code"in e){if(!r)return{code:N,messageValues:{param:this.t("mobile")}};if(!n)return{code:N,messageValues:{param:this.t("verify-code")}};const e=await this.verifyCode({mobile:r,code:n,type:"bind"});if(0!==e.code)return e}return await P.doc(t).update({mobile:r,mobile_confirmed:1}),{code:0,msg:"",mobile:r}},bindWeixin:async function({uid:e,code:t,platform:r}){const n=r||this.context.PLATFORM,i="mp-weixin"===n,{openid:o,unionid:s,sessionKey:a,accessToken:c,refreshToken:u,expired:d}=await this._getWeixinApi({platform:n})[i?"code2Session":"getOauthAccessToken"](t);if(!o)return{code:60301,messageValues:{account:"微信openid"}};const p=Wr.command,l=[{wx_openid:{[n]:o}}];s&&l.push({wx_unionid:s});let f=await P.where(p.or(...l)).get();if(f=this._getCurrentAppUser(f.data),f&&f.length>0)return{code:60302,messageValues:{type:this.t("wechat-account")}};const m={wx_openid:{[n]:o}};let h;return s&&(m.wx_unionid=s),await P.doc(e).update(m),h=i?{sessionKey:a}:{accessToken:c,refreshToken:u,accessTokenExpired:d},{code:0,msg:"",openid:o,unionid:s,...h}},bindQQ:async function({uid:e,code:t,accessToken:r,platform:n}={}){const i=n||this.context.PLATFORM,o="mp-qq"===i,{openid:s,unionid:a,sessionKey:c}=await this._getQQApi()[o?"code2Session":"getOpenidByToken"]({code:t,accessToken:r});if(!s)return{code:60501,messageValues:{account:"qq openid"}};const u=Jr.command,d=[{qq_openid:{[i]:s}}];a&&d.push({qq_unionid:a});let p=await P.where(u.or(...d)).get();if(p=this._getCurrentAppUser(p.data),p&&p.length>0)return{code:60502,messageValues:{type:this.t("qq-account")}};const l={qq_openid:{[i]:s}};return a&&(l.qq_unionid=a),await P.doc(e).update(l),{code:0,msg:"",openid:s,unionid:a,...{accessToken:r,sessionKey:c}}},unbindAlipay:async function(e){const t=Zr.command,r=await P.doc(e).update({ali_openid:t.remove()});return E("upRes:",r),1===r.updated?{code:0,msg:""}:{code:70401}},unbindEmail:async function(e){let{uid:t,email:r,code:n}=e||{};if(r=r&&r.trim(),!t||!r)return{code:N,messageValues:{param:t?this.t("email"):this.t("user-id")}};const{emailToLowerCase:i}=this._getConfig();if("code"in e){const e=await this.verifyCode({email:r,code:n,type:"unbind"});if(0!==e.code)return e}const o=en.command;let s={_id:t,email:r};if(i){const e=r.toLowerCase();e!==r&&(s=o.or(s,{_id:t,email:e}))}return 1===(await P.where(s).update({email:o.remove(),email_confirmed:o.remove()})).updated?{code:0,msg:""}:{code:70201}},unbindMobile:async function(e){const{uid:t,mobile:r,code:n}=e||{};if("code"in e){const e=await this.verifyCode({mobile:r,code:n,type:"unbind"});if(0!==e.code)return e}const i=tn.command;return 1===(await P.where({_id:t,mobile:r}).update({mobile:i.remove(),mobile_confirmed:i.remove()})).updated?{code:0,msg:""}:{code:70101}},unbindWeixin:async function(e){const t=rn.command,r=await P.doc(e).update({wx_openid:t.remove(),wx_unionid:t.remove()});return E("upRes:",r),1===r.updated?{code:0,msg:""}:{code:70301}},unbindQQ:async function(e){const t=nn.command,r=await P.doc(e).update({qq_openid:t.remove(),qq_unionid:t.remove()});return E("upRes:",r),1===r.updated?{code:0,msg:""}:{code:70501}},getSupportedLoginType:function({appid:e,platform:t}={}){if(!e||!t)throw new Error("Parameter appid and platform is required");const r=this._getConfig({appid:e,platform:t}),n=["username-password","mobile-password","email-password"];for(const e in on)on[e](r)&&n.push(e);return{supportedLoginType:n}},code2SessionAlipay:async function(e){let t=e;"string"==typeof e&&(t={code:e});try{const e=t.platform||this.context.PLATFORM,r=await this._getAlipayApi({platform:e}).code2Session(t.code);return r.openid?{code:0,msg:"",...r}:{code:80701,messageValues:{account:this.t("alipay-account")}}}catch(e){return{code:80702,messageValues:{account:this.t("alipay-account")}}}},code2SessionWeixin:async function(e){let t=e;"string"==typeof e&&(t={code:e});try{const e=t.platform||this.context.PLATFORM,r=await this._getWeixinApi({platform:e})["mp-weixin"===e?"code2Session":"getOauthAccessToken"](t.code);return r.openid?{code:0,msg:"",...r}:{code:80601,messageValues:{account:"微信openid"}}}catch(e){return{code:80602,messageValues:{account:"微信openid"}}}},verifyAppleIdentityToken:async function({identityToken:e,platform:t}){const r=t||this.context.PLATFORM,{code:n,msg:i}=await Lr({clientType:r}).verifyIdentityToken(e);return 0!==n?{code:n,msg:i}:{code:n,msg:"验证通过",...i}},wxBizDataCrypt:async function({code:e,sessionKey:r,encryptedData:n,iv:i}){if(!n)return{code:N,messageValues:{param:"encryptedData"}};if(!i)return{code:N,messageValues:{param:"iv"}};if(!e&&!r)return{code:N,messageValues:{param:"sessionKey"}};const o=this._getWeixinApi();if(!r){const t=await o.code2Session(e);if(!t.sessionKey)return{code:80801};r=t.sessionKey}r=Buffer.from(r,"base64"),n=Buffer.from(n,"base64"),i=Buffer.from(i,"base64");try{var s=t.createDecipheriv("aes-128-cbc",r,i);s.setAutoPadding(!0);var a=s.update(n,"binary","utf8");a+=s.final("utf8"),a=JSON.parse(a)}catch(e){return console.error(e),{code:80802}}return a.watermark.appid!==o.options.appId?{code:80803}:{code:0,msg:"",...a}},getWeixinUserInfo:async function({accessToken:e,openid:t}={}){const r=this.context.PLATFORM;if("app"!==r&&"app-plus"!==r)throw new Error(this.t("limit-client-platform"));try{return{code:0,msg:"",...await this._getWeixinApi().getUserInfo({accessToken:e,openid:t})}}catch(e){return{code:80901}}},encryptPwd:function(e,{value:r,version:n}={}){if(!(e=e&&e.trim()))throw new Error(this.t("param-required",{param:this.t("password")}));if(!r){const e=this._getConfig(),{passwordSecret:t}=e;if("array"===m(t)){const e=t.sort((e,t)=>e.version-t.version);r=e[e.length-1].value,n=e[e.length-1].version}else r=t}if(!r)throw new Error(this.t("param-error",{param:"passwordSecret",reason:"invalid passwordSecret"}));const i=t.createHmac("sha1",r.toString("ascii"));return i.update(e),{passwordHash:i.digest("hex"),version:n}},checkToken:async function(e,{needPermission:t,needUserInfo:r=!0}={}){const n=this._getConfig(),i=this._verifyToken(e);if(i.code)return i;const{uid:o,needPermission:s,role:a,permission:c,exp:u,iat:d,...p}=i,l=a&&c;t=void 0===t?s:t;const f=n.removePermissionAndRoleFromToken||!l||r,m=!n.removePermissionAndRoleFromToken&&!l||n.removePermissionAndRoleFromToken&&l||n.tokenExpiresThreshold&&u-Date.now()/1e3this._createTokenInternal({signContent:e,config:o})):this._createTokenInternal({signContent:a,config:o})},_updateToken:async function({uid:e,tokenList:t,removeToken:r=[],addToken:n=[]}={}){if(!t){const r=await P.doc(e).get(),n=r.data&&r.data[0];t=n&&n.token||[]}"string"==typeof t&&(t=[t]);const i=this._getExpiredToken(t);(t=t.filter(e=>-1===i.indexOf(e))).push(...n);for(let e=0;ee.version-t.version);let c;if(c=n?a.find(e=>e.version===n):a[0],!c)return{code:3};const u=a[a.length-1],{passwordHash:d}=this.encryptPwd(t,c);if(d===r){const e={code:0};if(c!==u){const{passwordHash:r,version:n}=this.encryptPwd(t,u);e.passwordHash=r,e.passwordVersion=n}return e}return{code:4,message:""}},_verifyToken:function(e){const t=this._getConfig();let r;try{r=Pr(e,t.tokenSecret)}catch(e){return"TokenExpiredError"===e.name?{code:30203,err:e}:{code:30204,err:e}}return t.bindTokenToDevice&&r.clientId&&r.clientId!==this._getClientUaHash()?{code:30201}:{code:0,message:"",...r}},_getExpiredToken:function(e){const t=this._getConfig(),r=[];return e.forEach(e=>{try{Pr(e,t.tokenSecret)}catch(t){r.push(e)}}),r},_getPermissionListByRoleList:async function(e){if(!Array.isArray(e))return[];if(0===e.length)return[];if(e.includes("admin")){return(await D.limit(500).get()).data.map(e=>e.permission_id)}const t=await j.where({role_id:sn.in(e)}).get(),r=[];return t.data.forEach(e=>{Array.prototype.push.apply(r,e.permission)}),A(r)},_getClientUaHash:function(){const e=t.createHash("md5"),r=/MicroMessenger/i.test(this.context.CLIENTUA)?this.context.CLIENTUA.replace(/(MicroMessenger\S+).*/i,"$1"):this.context.CLIENTUA;return e.update(r),e.digest("hex")},_createTokenInternal:function({signContent:e,config:t}){if(t.tokenExpiresIn&&t.tokenExpiresThreshold&&t.tokenExpiresIn<=t.tokenExpiresThreshold)throw new Error(this.t("token-expires-config-warning"));return"object"===m(e)&&e.uid?(t.bindTokenToDevice&&(e.clientId=this._getClientUaHash()),{token:Rr(e,t.tokenSecret,{expiresIn:t.tokenExpiresIn}),tokenExpired:Date.now()+1e3*t.tokenExpiresIn}):{code:30101,messageValues:{param:this.t("user-id")}}},setVerifyCode:async function({mobile:e,email:t,code:r,expiresIn:n,type:i}){if(t=t&&t.trim(),e=e&&e.trim(),t){const{emailToLowerCase:e}=this._getConfig();e&&(t=t.toLowerCase())}if(!e&&!t)return{code:50101,messageValues:{param:"手机号或邮箱"}};if(e&&t)return{code:50102,messageValues:{param:"参数",reason:"手机号和邮箱不可同时存在"}};r||(r=C()),n||(n=180);const o=Date.now(),s={mobile:e,email:t,type:i,code:r,state:0,ip:this.context.CLIENTIP,created_at:o,expired_at:o+1e3*n};return await R.add(s),{code:0,mobile:e,email:t}},verifyCode:async function({mobile:e,email:t,code:r,type:n}){if(t=t&&t.trim(),e=e&&e.trim(),t){const{emailToLowerCase:e}=this._getConfig();e&&(t=t.toLowerCase())}if(!e&&!t)return{code:50201,messageValues:{param:"手机号或邮箱"}};if(e&&t)return{code:50203,messageValues:{param:"参数",reason:"手机号和邮箱不可同时存在"}};if(!r)return{code:50202,messageValues:{type:this.t(e?"sms":"email")}};const i=an.command,o=Date.now(),s={mobile:e,email:t,type:n,code:r,state:0,expired_at:i.gt(o)},a=await R.where(s).orderBy("created_at","desc").limit(1).get();if(a&&a.data&&a.data.length>0){const e=a.data[0];return await R.doc(e._id).update({state:1}),{code:0,msg:"验证通过"}}return{code:50202,messageValues:{type:this.t(e?"sms":"email")}}},sendSmsCode:async function({mobile:e,code:t,type:r,templateId:n}){if(!e)return{code:N,messageValues:{param:this.t("mobile")}};if(t||(t=C()),!r)return{code:N,messageValues:{param:this.t("verify-code-type")}};const i=this._getConfig();let o=i&&i.service&&i.service.sms;if(!o)throw new Error(this.t("config-param-required",{param:"service.sms"}));o=Object.assign({codeExpiresIn:300},o);const s=["smsKey","smsSecret"];for(let e=0,t=s.length;e=0?o:{code:0,msg:""}}catch(e){return{code:50301}}}});let un;try{un=require("uni-config-center")}catch(e){throw new Error("Plugin[uni-config-center] was not found")}class dn{constructor({context:e,clientInfo:t,config:r}={}){const n=un({pluginId:"uni-id"});this.pluginConfig=n,this.config=r||this._getConfigContent(),this._configCache={},Object.defineProperty(this,"context",{get(){let r;r=t?{OS:t.os,CLIENTIP:t.clientIP,CLIENTUA:t.userAgent,PLATFORM:t.platform,APPID:t.appId,LOCALE:t.locale,DEVICEID:t.deviceId}:Object.assign({},e||global.__ctx__||{});const n=["CLIENTIP","PLATFORM","APPID","LOCALE"];for(let e=0;ee.dcloudAppid===t)||e.find(e=>e.isDefaultConfig):e}_getConfigContent(){if(this.pluginConfig&&this.pluginConfig.hasFile("config.json")){let e;try{e=this.pluginConfig.config()}catch(e){throw new Error("Invalid config file\n"+e.message)}return Array.isArray(e)?e:e[0]?Object.values(e):e}}init(){throw new Error("uniID.init has been deprecated, use uniID.createInstance instead")}setInterceptor(e,t){this.interceptorMap.set(e,t)}_getConfig({appid:e,platform:t}={}){const r=`${e=e||this.context.APPID}_${t=t||this.context.PLATFORM}`;if(this._configCache[r])return this._configCache[r];if(!(this.config&&0!==Object.keys(this.config).length))throw new Error(this.t("config-file-not-found"));const n=this._getAppConfig(this.config,e);"app"!==t&&"app-plus"!==t||(t=n.preferedAppPlatform||t),"web"!==t&&"h5"!==t||(t=n.preferedWebPlatform||t);const i=Object.assign(n,n[t])||{},o=Object.assign({bindTokenToDevice:!1,tokenExpiresIn:7200,tokenExpiresThreshold:1200,passwordErrorLimit:6,passwordErrorRetryTime:3600,usernameToLowerCase:!0,emailToLowerCase:!0},i);return["passwordSecret","tokenSecret","tokenExpiresIn","passwordErrorLimit","passwordErrorRetryTime"].forEach(e=>{if(!o||!o[e])throw new Error(this.t("config-param-required",{param:e}))}),this._configCache[r]=o,o}}for(const e in cn)dn.prototype[e]=cn[e];function pn(e){const t=new dn(e);return new Proxy(t,{get(e,t){if(t in e&&0!==t.indexOf("_")){if("function"==typeof e[t])return(r=e[t],function(){const e=r.apply(this,arguments);return f(e)?e.then(e=>(x.bind(this)(e),e)):(x.bind(this)(e),e)}).bind(e);if("context"!==t&&"config"!==t)return e[t]}var r}})}dn.prototype.createInstance=pn;var ln=pn();module.exports=ln; diff --git a/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json new file mode 100644 index 00000000..01c1f218 --- /dev/null +++ b/uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/package.json @@ -0,0 +1,16 @@ +{ + "name": "uni-id", + "version": "3.3.25", + "description": "uni-id for uniCloud", + "main": "index.js", + "homepage": "https://uniapp.dcloud.io/uniCloud/uni-id", + "repository": { + "type": "git", + "url": "git+https://gitee.com/dcloud/uni-id.git" + }, + "author": "", + "license": "Apache-2.0", + "dependencies": { + "uni-config-center": "file:../../../../../uni-config-center/uniCloud/cloudfunctions/common/uni-config-center" + } +} \ No newline at end of file diff --git a/uni_modules/uni-nav-bar/changelog.md b/uni_modules/uni-nav-bar/changelog.md index fbacca4b..f0f6b566 100644 --- a/uni_modules/uni-nav-bar/changelog.md +++ b/uni_modules/uni-nav-bar/changelog.md @@ -1,3 +1,7 @@ +## 1.3.6(2022-06-30) +- 修复 组件示例中插槽用法无法显示内容的bug +## 1.3.5(2022-05-24) +- 新增 stat 属性 ,可开启统计title 上报 ,仅使用了title 属性且项目开启了uni统计生效 ## 1.3.4(2022-01-24) - 更新 组件示例 ## 1.3.3(2022-01-24) 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 index 3346a861..4a46b870 100644 --- 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 @@ -64,6 +64,7 @@ * @property {Boolean} fixed = [true|false] 是否固定顶部 * @property {Boolean} statusBar = [true|false] 是否包含状态栏 * @property {Boolean} shadow = [true|false] 导航栏下是否有阴影 + * @property {Boolean} stat 是否开启统计标题上报 * @event {Function} clickLeft 左侧按钮点击时触发 * @event {Function} clickRight 右侧按钮点击时触发 * @event {Function} clickTitle 中间标题点击时触发 @@ -135,6 +136,10 @@ type: [Number, String], default: 60 }, + stat: { + type: [Boolean, String], + default: '' + } }, computed: { themeBgColor() { @@ -170,7 +175,7 @@ } }, mounted() { - if (uni.report && this.title !== '') { + if (uni.report && this.stat && this.title !== '') { uni.report('title', this.title) } }, @@ -240,7 +245,7 @@ } .uni-navbar__header-btns { - /* #ifndef APP-NVUE */ + /* #ifndef APP-NVUE */ overflow: hidden; display: flex; /* #endif */ @@ -279,7 +284,7 @@ /* #ifndef APP-NVUE */ display: flex; /* #endif */ - flex: 1; + flex: 1; padding: 0 10px; overflow: hidden; } @@ -340,4 +345,4 @@ // 暗主题配置 .uni-dark {} - + diff --git a/uni_modules/uni-nav-bar/package.json b/uni_modules/uni-nav-bar/package.json index e1473ca1..e3fe073d 100644 --- a/uni_modules/uni-nav-bar/package.json +++ b/uni_modules/uni-nav-bar/package.json @@ -1,7 +1,7 @@ { "id": "uni-nav-bar", "displayName": "uni-nav-bar 自定义导航栏", - "version": "1.3.4", + "version": "1.3.6", "description": "自定义导航栏组件,主要用于头部导航。", "keywords": [ "uni-ui", diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md index d9cf6880..a9e2d668 100644 --- a/uni_modules/uni-popup/changelog.md +++ b/uni_modules/uni-popup/changelog.md @@ -1,3 +1,5 @@ +## 1.7.9(2022-04-02) +- 修复 弹出层内部无法滚动的bug ## 1.7.8(2022-03-28) - 修复 小程序中高度错误的bug ## 1.7.7(2022-03-17) diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue index e7f3998e..a3ced3d8 100644 --- a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -1,6 +1,5 @@ diff --git a/pages/extUI/forms/forms.vue b/pages/extUI/forms/forms.vue index 9ce77618..eb78bf95 100644 --- a/pages/extUI/forms/forms.vue +++ b/pages/extUI/forms/forms.vue @@ -26,6 +26,15 @@ + + + + + + + + + @@ -93,8 +102,8 @@ - + @@ -121,8 +130,34 @@ introduction: '', sex: 2, hobby: [5], - datetimesingle: 1627529992399 + datetimesingle: 1627529992399, + city: '', + skills: 0 }, + // 城市数据 + cityData: [{ + text: "北京", + value: "10001", + }, { + text: "上海", + value: "10002", + }, { + text: "深圳", + value: "10004", + }], + skillsRange: [{ + value: 0, + text: "编程" + }, + { + value: 1, + text: "绘画" + }, + { + value: 2, + text: "运动" + }, + ], // 表单数据 alignmentFormData: { name: '', @@ -273,7 +308,8 @@ let index = this.dynamicLists.findIndex(v => v.id === id) this.dynamicLists.splice(index, 1) }, - submit(ref) { + submit(ref) { + console.log(this.baseFormData); this.$refs[ref].validate().then(res => { console.log('success', res); uni.showToast({ @@ -305,14 +341,14 @@ .form-item { display: flex; - align-items: center; + align-items: center; flex: 1; } .button { display: flex; align-items: center; - height: 35px; + height: 35px; line-height: 35px; margin-left: 10px; } diff --git a/pages/extUI/nav-bar/nav-bar.nvue b/pages/extUI/nav-bar/nav-bar.nvue index 8a774e25..7d87e709 100644 --- a/pages/extUI/nav-bar/nav-bar.nvue +++ b/pages/extUI/nav-bar/nav-bar.nvue @@ -53,7 +53,7 @@ - From b8c350c54c3aa918beba5d39c06e7c0126b4bc3f Mon Sep 17 00:00:00 2001 From: HRK <119110706+18148764734@users.noreply.github.com> Date: Fri, 1 Mar 2024 15:32:19 +0800 Subject: [PATCH 315/378] update uni-ui to 1.5.2 --- uni_modules/uni-badge/changelog.md | 2 + .../components/uni-badge/uni-badge.vue | 8 +- uni_modules/uni-badge/package.json | 2 +- uni_modules/uni-calendar/changelog.md | 22 +- .../uni-calendar/uni-calendar-item.vue | 9 +- .../components/uni-calendar/uni-calendar.vue | 45 +- .../components/uni-calendar/util.js | 14 +- uni_modules/uni-calendar/package.json | 2 +- uni_modules/uni-calendar/readme.md | 6 +- uni_modules/uni-config-center/changelog.md | 10 +- uni_modules/uni-config-center/package.json | 17 +- .../common/uni-config-center/index.js | 2 +- .../common/uni-config-center/package.json | 2 +- uni_modules/uni-countdown/changelog.md | 2 + .../uni-countdown/uni-countdown.vue | 20 +- uni_modules/uni-countdown/package.json | 11 +- uni_modules/uni-data-checkbox/changelog.md | 2 + .../uni-data-checkbox/uni-data-checkbox.vue | 64 +- uni_modules/uni-data-checkbox/package.json | 2 +- uni_modules/uni-data-picker/changelog.md | 143 +- .../components/uni-data-picker/keypress.js | 90 +- .../uni-data-picker/uni-data-picker.uvue | 380 ++++++ .../uni-data-picker/uni-data-picker.vue | 1091 ++++++++------- .../uni-data-pickerview/loading.uts | 1 + .../uni-data-pickerview/uni-data-picker.js | 1185 +++++++++-------- .../uni-data-pickerview/uni-data-picker.uts | 693 ++++++++++ .../uni-data-pickerview.css | 76 ++ .../uni-data-pickerview.uvue | 69 + .../uni-data-pickerview.vue | 538 ++++---- uni_modules/uni-data-picker/package.json | 181 +-- uni_modules/uni-data-picker/readme.md | 44 +- uni_modules/uni-data-select/changelog.md | 9 + .../uni-data-select/uni-data-select.vue | 984 +++++++------- uni_modules/uni-data-select/package.json | 170 +-- uni_modules/uni-datetime-picker/changelog.md | 33 + .../uni-datetime-picker/calendar-item.vue | 15 +- .../uni-datetime-picker/calendar.vue | 187 +-- .../uni-datetime-picker/i18n/en.json | 6 +- .../uni-datetime-picker/time-picker.vue | 19 +- .../uni-datetime-picker.vue | 605 ++++----- .../components/uni-datetime-picker/util.js | 405 +++--- uni_modules/uni-datetime-picker/package.json | 2 +- uni_modules/uni-easyinput/changelog.md | 84 +- .../components/uni-easyinput/common.js | 2 - .../uni-easyinput/uni-easyinput.vue | 1184 ++++++++-------- uni_modules/uni-easyinput/package.json | 2 +- uni_modules/uni-fab/changelog.md | 2 + .../uni-fab/components/uni-fab/uni-fab.vue | 8 +- uni_modules/uni-fab/package.json | 2 +- uni_modules/uni-file-picker/changelog.md | 138 +- .../uni-file-picker/choose-and-upload-file.js | 71 +- .../uni-file-picker/uni-file-picker.vue | 20 +- .../uni-file-picker/upload-file.vue | 52 +- .../uni-file-picker/upload-image.vue | 76 +- .../components/uni-file-picker/utils.js | 217 +-- uni_modules/uni-file-picker/package.json | 169 ++- uni_modules/uni-file-picker/readme.md | 20 +- uni_modules/uni-forms/changelog.md | 4 + .../uni-forms-item/uni-forms-item.vue | 20 +- .../components/uni-forms/uni-forms.vue | 2 +- uni_modules/uni-forms/package.json | 2 +- uni_modules/uni-icons/changelog.md | 18 + .../components/uni-icons/uni-icons.uvue | 91 ++ .../components/uni-icons/uni-icons.vue | 88 +- .../components/uni-icons/uniicons.css | 63 +- .../components/uni-icons/uniicons.ttf | Bin 35760 -> 35824 bytes .../components/uni-icons/uniicons_file.ts | 664 +++++++++ .../components/uni-icons/uniicons_file_vue.js | 649 +++++++++ uni_modules/uni-icons/package.json | 26 +- uni_modules/uni-id/changelog.md | 4 + uni_modules/uni-id/package.json | 2 +- .../cloudfunctions/common/uni-id/index.js | 2 +- .../cloudfunctions/common/uni-id/package.json | 5 +- uni_modules/uni-installApk/changelog.md | 10 + uni_modules/uni-installApk/package.json | 93 ++ uni_modules/uni-installApk/readme.md | 37 + .../utssdk/app-android/AndroidManifest.xml | 5 + .../utssdk/app-android/index.uts | 83 ++ .../uni-installApk/utssdk/app-ios/index.uts | 0 uni_modules/uni-installApk/utssdk/index.d.ts | 78 ++ .../uni-installApk/utssdk/interface.uts | 76 ++ .../uni-installApk/utssdk/unierror.uts | 25 + uni_modules/uni-list/changelog.md | 26 + .../uni-list-chat/uni-list-chat.vue | 99 +- .../uni-list-item/uni-list-item.vue | 984 +++++++------- .../uni-list/components/uni-list/uni-list.vue | 189 +-- uni_modules/uni-list/package.json | 11 +- uni_modules/uni-nav-bar/changelog.md | 4 + .../components/uni-nav-bar/uni-nav-bar.vue | 4 +- .../components/uni-nav-bar/uni-status-bar.vue | 5 +- uni_modules/uni-nav-bar/package.json | 2 +- uni_modules/uni-notice-bar/changelog.md | 2 + .../uni-notice-bar/uni-notice-bar.vue | 5 + uni_modules/uni-notice-bar/package.json | 2 +- uni_modules/uni-number-box/changelog.md | 50 +- .../uni-number-box/uni-number-box.vue | 91 +- uni_modules/uni-number-box/package.json | 165 ++- uni_modules/uni-number-box/readme.md | 24 +- .../uni-open-bridge-common/changelog.md | 25 + .../uni-open-bridge-common/package.json | 84 ++ uni_modules/uni-open-bridge-common/readme.md | 5 + .../uni-open-bridge-common/bridge-error.js | 26 + .../common/uni-open-bridge-common/config.js | 124 ++ .../common/uni-open-bridge-common/consts.js | 30 + .../common/uni-open-bridge-common/index.js | 317 +++++ .../uni-open-bridge-common/package.json | 15 + .../common/uni-open-bridge-common/storage.js | 111 ++ .../uni-open-bridge-common/uni-cloud-cache.js | 324 +++++ .../uni-open-bridge-common/validator.js | 31 + .../uni-open-bridge-common/weixin-server.js | 203 +++ .../database/opendb-open-data.schema.json | 19 + uni_modules/uni-popup/changelog.md | 18 + .../uni-popup-dialog/uni-popup-dialog.vue | 75 +- .../uni-popup-share/uni-popup-share.vue | 2 +- .../components/uni-popup/uni-popup.uvue | 90 ++ .../components/uni-popup/uni-popup.vue | 951 ++++++------- uni_modules/uni-popup/package.json | 13 +- uni_modules/uni-search-bar/changelog.md | 10 + .../uni-search-bar/i18n/zh-Hans.json | 4 +- .../uni-search-bar/i18n/zh-Hant.json | 4 +- .../uni-search-bar/uni-search-bar.vue | 28 +- uni_modules/uni-search-bar/package.json | 11 +- uni_modules/uni-swipe-action/changelog.md | 6 + .../uni-swipe-action-item/bindingx.js | 6 +- .../uni-swipe-action-item/mpalipay.js | 8 +- .../uni-swipe-action-item/mpother.js | 9 +- .../components/uni-swipe-action-item/mpwxs.js | 11 +- .../uni-swipe-action-item.vue | 29 +- uni_modules/uni-swipe-action/package.json | 13 +- uni_modules/uni-table/changelog.md | 6 + .../components/uni-table/uni-table.vue | 8 +- .../components/uni-th/filter-dropdown.vue | 24 +- .../uni-table/components/uni-th/uni-th.vue | 117 +- .../components/uni-tr/table-checkbox.vue | 14 +- .../uni-table/components/uni-tr/uni-tr.vue | 12 +- uni_modules/uni-table/package.json | 11 +- uni_modules/uni-tooltip/changelog.md | 2 + .../components/uni-tooltip/uni-tooltip.vue | 56 +- uni_modules/uni-tooltip/package.json | 24 +- uni_modules/uni-transition/changelog.md | 32 +- .../uni-transition/createAnimation.js | 225 ++-- .../uni-transition/uni-transition.vue | 539 ++++---- uni_modules/uni-transition/package.json | 169 ++- uni_modules/uni-transition/readme.md | 20 +- .../uni-upgrade-center-app/changelog.md | 33 +- .../uni-upgrade-center-app.uvue | 474 +++++++ .../uni-upgrade-center-app/package.json | 21 +- .../pages/upgrade-popup.vue | 180 ++- uni_modules/uni-upgrade-center-app/readme.md | 127 +- .../uniCloud/database/db_init.json | 1 + .../utils/call-check-version.ts | 120 ++ .../utils/check-update-nvue.js | 184 +++ .../utils/check-update.ts | 191 +++ .../uni-upgrade-center-app/utils/utils.uts | 17 + .../uts-progressNotification/changelog.md | 22 + .../uts-progressNotification/package.json | 83 ++ .../uts-progressNotification/readme.md | 71 + .../utssdk/app-android/AndroidManifest.xml | 11 + .../app-android/TransparentActivity.uts | 62 + .../utssdk/app-android/config.json | 3 + .../utssdk/app-android/constant.uts | 2 + .../utssdk/app-android/index.uts | 159 +++ .../values/notification_progress_styles.xml | 11 + .../utssdk/interface.uts | 46 + .../utssdk/unierror.uts | 0 165 files changed, 12597 insertions(+), 6007 deletions(-) create mode 100644 uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css create mode 100644 uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.uvue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file.ts create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js create mode 100644 uni_modules/uni-installApk/changelog.md create mode 100644 uni_modules/uni-installApk/package.json create mode 100644 uni_modules/uni-installApk/readme.md create mode 100644 uni_modules/uni-installApk/utssdk/app-android/AndroidManifest.xml create mode 100644 uni_modules/uni-installApk/utssdk/app-android/index.uts create mode 100644 uni_modules/uni-installApk/utssdk/app-ios/index.uts create mode 100644 uni_modules/uni-installApk/utssdk/index.d.ts create mode 100644 uni_modules/uni-installApk/utssdk/interface.uts create mode 100644 uni_modules/uni-installApk/utssdk/unierror.uts create mode 100644 uni_modules/uni-open-bridge-common/changelog.md create mode 100644 uni_modules/uni-open-bridge-common/package.json create mode 100644 uni_modules/uni-open-bridge-common/readme.md create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/bridge-error.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/config.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/consts.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/index.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/package.json create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/storage.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/uni-cloud-cache.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/validator.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/cloudfunctions/common/uni-open-bridge-common/weixin-server.js create mode 100644 uni_modules/uni-open-bridge-common/uniCloud/database/opendb-open-data.schema.json create mode 100644 uni_modules/uni-popup/components/uni-popup/uni-popup.uvue create mode 100644 uni_modules/uni-upgrade-center-app/components/uni-upgrade-center-app/uni-upgrade-center-app.uvue create mode 100644 uni_modules/uni-upgrade-center-app/uniCloud/database/db_init.json create mode 100644 uni_modules/uni-upgrade-center-app/utils/call-check-version.ts create mode 100644 uni_modules/uni-upgrade-center-app/utils/check-update-nvue.js create mode 100644 uni_modules/uni-upgrade-center-app/utils/check-update.ts create mode 100644 uni_modules/uni-upgrade-center-app/utils/utils.uts create mode 100644 uni_modules/uts-progressNotification/changelog.md create mode 100644 uni_modules/uts-progressNotification/package.json create mode 100644 uni_modules/uts-progressNotification/readme.md create mode 100644 uni_modules/uts-progressNotification/utssdk/app-android/AndroidManifest.xml create mode 100644 uni_modules/uts-progressNotification/utssdk/app-android/TransparentActivity.uts create mode 100644 uni_modules/uts-progressNotification/utssdk/app-android/config.json create mode 100644 uni_modules/uts-progressNotification/utssdk/app-android/constant.uts create mode 100644 uni_modules/uts-progressNotification/utssdk/app-android/index.uts create mode 100644 uni_modules/uts-progressNotification/utssdk/app-android/res/values/notification_progress_styles.xml create mode 100644 uni_modules/uts-progressNotification/utssdk/interface.uts create mode 100644 uni_modules/uts-progressNotification/utssdk/unierror.uts diff --git a/uni_modules/uni-badge/changelog.md b/uni_modules/uni-badge/changelog.md index 56581c4e..e352c60c 100644 --- a/uni_modules/uni-badge/changelog.md +++ b/uni_modules/uni-badge/changelog.md @@ -1,3 +1,5 @@ +## 1.2.2(2023-01-28) +- 修复 运行/打包 控制台警告问题 ## 1.2.1(2022-09-05) - 修复 当 text 超过 max-num 时,badge 的宽度计算是根据 text 的长度计算,更改为 css 计算实际展示宽度,详见:[https://ask.dcloud.net.cn/question/150473](https://ask.dcloud.net.cn/question/150473) ## 1.2.0(2021-11-19) diff --git a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue index 664dc370..282d2539 100644 --- a/uni_modules/uni-badge/components/uni-badge/uni-badge.vue +++ b/uni_modules/uni-badge/components/uni-badge/uni-badge.vue @@ -21,7 +21,7 @@ * @value error 红色 * @property {String} inverted = [true|false] 是否无需背景颜色 * @property {Number} maxNum 展示封顶的数字值,超过 99 显示 99+ - * @property {String} absolute = [rightTop|rightBottom|leftBottom|leftTop] 开启绝对定位, 角标将定位到其包裹的标签的四角上 + * @property {String} absolute = [rightTop|rightBottom|leftBottom|leftTop] 开启绝对定位, 角标将定位到其包裹的标签的四角上 * @value rightTop 右上 * @value rightBottom 右下 * @value leftTop 左上 @@ -191,12 +191,13 @@ /* #ifndef APP-NVUE */ display: flex; overflow: hidden; - box-sizing: border-box; + box-sizing: border-box; + font-feature-settings: "tnum"; + min-width: 20px; /* #endif */ justify-content: center; flex-direction: row; height: 20px; - min-width: 20px; padding: 0 4px; line-height: 18px; color: #fff; @@ -206,7 +207,6 @@ border: 1px solid #fff; text-align: center; font-family: 'Helvetica Neue', Helvetica, sans-serif; - font-feature-settings: "tnum"; font-size: $bage-size; /* #ifdef H5 */ z-index: 999; diff --git a/uni_modules/uni-badge/package.json b/uni_modules/uni-badge/package.json index 7a34d9c3..b0bac937 100644 --- a/uni_modules/uni-badge/package.json +++ b/uni_modules/uni-badge/package.json @@ -1,7 +1,7 @@ { "id": "uni-badge", "displayName": "uni-badge 数字角标", - "version": "1.2.1", + "version": "1.2.2", "description": "数字角标(徽章)组件,在元素周围展示消息提醒,一般用于列表、九宫格、按钮等地方。", "keywords": [ "", diff --git a/uni_modules/uni-calendar/changelog.md b/uni_modules/uni-calendar/changelog.md index 0160b692..a728bb80 100644 --- a/uni_modules/uni-calendar/changelog.md +++ b/uni_modules/uni-calendar/changelog.md @@ -1,20 +1,28 @@ +## 1.4.11(2024-01-10) +- 修复 回到今天时,月份显示不一致问题 +## 1.4.10(2023-04-10) +- 修复 某些情况 monthSwitch 未触发的Bug +## 1.4.9(2023-02-02) +- 修复 某些情况切换月份错误的Bug +## 1.4.8(2023-01-30) +- 修复 某些情况切换月份错误的Bug [详情](https://ask.dcloud.net.cn/question/161964) ## 1.4.7(2022-09-16) -- 可以使用 uni-scss 控制主题色 +- 优化 支持使用 uni-scss 控制主题色 ## 1.4.6(2022-09-08) -- fix: 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件 +- 修复 表头年月切换,导致改变当前日期为选择月1号,且未触发change事件的Bug ## 1.4.5(2022-02-25) -- 修复 条件编译 nvue 不支持的 css 样式 +- 修复 条件编译 nvue 不支持的 css 样式的Bug ## 1.4.4(2022-02-25) -- 修复 条件编译 nvue 不支持的 css 样式 +- 修复 条件编译 nvue 不支持的 css 样式的Bug ## 1.4.3(2021-09-22) -- 修复 startDate、 endDate 属性失效的 bug +- 修复 startDate、 endDate 属性失效的Bug ## 1.4.2(2021-08-24) - 新增 支持国际化 ## 1.4.1(2021-08-05) -- 修复 弹出层被 tabbar 遮盖 bug +- 修复 弹出层被 tabbar 遮盖的Bug ## 1.4.0(2021-07-30) - 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) ## 1.3.16(2021-05-12) - 新增 组件示例地址 ## 1.3.15(2021-02-04) -- 调整为uni_modules目录规范 +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue index d29ead54..bf714c2f 100644 --- a/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue +++ b/uni_modules/uni-calendar/components/uni-calendar/uni-calendar-item.vue @@ -51,11 +51,10 @@ + + diff --git a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue index 7dd0e4be..c86d5476 100644 --- a/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue +++ b/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue @@ -1,554 +1,551 @@ - + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts b/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts new file mode 100644 index 00000000..baa0dfff --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/loading.uts @@ -0,0 +1 @@ +export const imgbase : string = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzlBMzU3OTlEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzlBMzU3OUFEOUM0MTFFOUI0NTZDNERBQURBQzI4RkUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDOUEzNTc5N0Q5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDOUEzNTc5OEQ5QzQxMUU5QjQ1NkM0REFBREFDMjhGRSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pt+ALSwAAA6CSURBVHja1FsLkFZV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' \ No newline at end of file diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js index c12fd54b..4d9f95fb 100644 --- a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js @@ -1,563 +1,622 @@ -export default { - props: { - localdata: { - type: [Array, Object], - default () { - return [] - } - }, - spaceInfo: { - type: Object, - default () { - return {} - } - }, - collection: { - type: String, - default: '' - }, - action: { - type: String, - default: '' - }, - field: { - type: String, - default: '' - }, - orderby: { - type: String, - default: '' - }, - where: { - type: [String, Object], - default: '' - }, - pageData: { - type: String, - default: 'add' - }, - pageCurrent: { - type: Number, - default: 1 - }, - pageSize: { - type: Number, - default: 20 - }, - getcount: { - type: [Boolean, String], - default: false - }, - getone: { - type: [Boolean, String], - default: false - }, - gettree: { - type: [Boolean, String], - default: false - }, - manual: { - type: Boolean, - default: false - }, - value: { - type: [Array, String, Number], - default () { - return [] - } - }, - modelValue: { - type: [Array, String, Number], - default () { - return [] - } - }, - preload: { - type: Boolean, - default: false - }, - stepSearh: { - type: Boolean, - default: true - }, - selfField: { - type: String, - default: '' - }, - parentField: { - type: String, - default: '' - }, - multiple: { - type: Boolean, - default: false - }, - map: { - type: Object, - default() { - return { - text: "text", - value: "value" - } - } - } - }, - data() { - return { - loading: false, - errorMessage: '', - loadMore: { - contentdown: '', - contentrefresh: '', - contentnomore: '' - }, - dataList: [], - selected: [], - selectedIndex: 0, - page: { - current: this.pageCurrent, - size: this.pageSize, - count: 0 - } - } - }, - computed: { - isLocaldata() { - return !this.collection.length - }, - postField() { - let fields = [this.field]; - if (this.parentField) { - fields.push(`${this.parentField} as parent_value`); - } - return fields.join(','); - }, - dataValue() { - let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined) - return isModelValue ? this.modelValue : this.value - }, - hasValue() { - if (typeof this.dataValue === 'number') { - return true - } - return (this.dataValue != null) && (this.dataValue.length > 0) - } - }, - created() { - this.$watch(() => { - var al = []; - ['pageCurrent', - 'pageSize', - 'spaceInfo', - 'value', - 'modelValue', - 'localdata', - 'collection', - 'action', - 'field', - 'orderby', - 'where', - 'getont', - 'getcount', - 'gettree' - ].forEach(key => { - al.push(this[key]) - }); - return al - }, (newValue, oldValue) => { - let needReset = false - for (let i = 2; i < newValue.length; i++) { - if (newValue[i] != oldValue[i]) { - needReset = true - break - } - } - if (newValue[0] != oldValue[0]) { - this.page.current = this.pageCurrent - } - this.page.size = this.pageSize - - this.onPropsChange() - }) - this._treeData = [] - }, - methods: { - onPropsChange() { - this._treeData = [] - }, - getCommand(options = {}) { - /* eslint-disable no-undef */ - let db = uniCloud.database(this.spaceInfo) - - const action = options.action || this.action - if (action) { - db = db.action(action) - } - - const collection = options.collection || this.collection - db = db.collection(collection) - - const where = options.where || this.where - if (!(!where || !Object.keys(where).length)) { - db = db.where(where) - } - - const field = options.field || this.field - if (field) { - db = db.field(field) - } - - const orderby = options.orderby || this.orderby - if (orderby) { - db = db.orderBy(orderby) - } - - const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current - const size = options.pageSize !== undefined ? options.pageSize : this.page.size - const getCount = options.getcount !== undefined ? options.getcount : this.getcount - const getTree = options.gettree !== undefined ? options.gettree : this.gettree - - const getOptions = { - getCount, - getTree - } - if (options.getTreePath) { - getOptions.getTreePath = options.getTreePath - } - - db = db.skip(size * (current - 1)).limit(size).get(getOptions) - - return db - }, - getNodeData(callback) { - if (this.loading) { - return - } - this.loading = true - this.getCommand({ - field: this.postField, - where: this._pathWhere() - }).then((res) => { - this.loading = false - this.selected = res.result.data - callback && callback() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - getTreePath(callback) { - if (this.loading) { - return - } - this.loading = true - - this.getCommand({ - field: this.postField, - getTreePath: { - startWith: `${this.selfField}=='${this.dataValue}'` - } - }).then((res) => { - this.loading = false - let treePath = [] - this._extractTreePath(res.result.data, treePath) - this.selected = treePath - callback && callback() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - loadData() { - if (this.isLocaldata) { - this._processLocalData() - return - } - - if (this.dataValue != null) { - this._loadNodeData((data) => { - this._treeData = data - this._updateBindData() - this._updateSelected() - }) - return - } - - if (this.stepSearh) { - this._loadNodeData((data) => { - this._treeData = data - this._updateBindData() - }) - } else { - this._loadAllData((data) => { - this._treeData = [] - this._extractTree(data, this._treeData, null) - this._updateBindData() - }) - } - }, - _loadAllData(callback) { - if (this.loading) { - return - } - this.loading = true - - this.getCommand({ - field: this.postField, - gettree: true, - startwith: `${this.selfField}=='${this.dataValue}'` - }).then((res) => { - this.loading = false - callback(res.result.data) - this.onDataChange() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - _loadNodeData(callback, pw) { - if (this.loading) { - return - } - this.loading = true - - this.getCommand({ - field: this.postField, - where: pw || this._postWhere(), - pageSize: 500 - }).then((res) => { - this.loading = false - callback(res.result.data) - this.onDataChange() - }).catch((err) => { - this.loading = false - this.errorMessage = err - }) - }, - _pathWhere() { - let result = [] - let where_field = this._getParentNameByField(); - if (where_field) { - result.push(`${where_field} == '${this.dataValue}'`) - } - - if (this.where) { - return `(${this.where}) && (${result.join(' || ')})` - } - - return result.join(' || ') - }, - _postWhere() { - let result = [] - let selected = this.selected - let parentField = this.parentField - if (parentField) { - result.push(`${parentField} == null || ${parentField} == ""`) - } - if (selected.length) { - for (var i = 0; i < selected.length - 1; i++) { - result.push(`${parentField} == '${selected[i].value}'`) - } - } - - let where = [] - if (this.where) { - where.push(`(${this.where})`) - } - if (result.length) { - where.push(`(${result.join(' || ')})`) - } - - return where.join(' && ') - }, - _nodeWhere() { - let result = [] - let selected = this.selected - if (selected.length) { - result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`) - } - - if (this.where) { - return `(${this.where}) && (${result.join(' || ')})` - } - - return result.join(' || ') - }, - _getParentNameByField() { - const fields = this.field.split(','); - let where_field = null; - for (let i = 0; i < fields.length; i++) { - const items = fields[i].split('as'); - if (items.length < 2) { - continue; - } - if (items[1].trim() === 'value') { - where_field = items[0].trim(); - break; - } - } - return where_field - }, - _isTreeView() { - return (this.parentField && this.selfField) - }, - _updateSelected() { - var dl = this.dataList - var sl = this.selected - let textField = this.map.text - let valueField = this.map.value - for (var i = 0; i < sl.length; i++) { - var value = sl[i].value - var dl2 = dl[i] - for (var j = 0; j < dl2.length; j++) { - var item2 = dl2[j] - if (item2[valueField] === value) { - sl[i].text = item2[textField] - break - } - } - } - }, - _updateBindData(node) { - const { - dataList, - hasNodes - } = this._filterData(this._treeData, this.selected) - - let isleaf = this._stepSearh === false && !hasNodes - - if (node) { - node.isleaf = isleaf - } - - this.dataList = dataList - this.selectedIndex = dataList.length - 1 - - if (!isleaf && this.selected.length < dataList.length) { - this.selected.push({ - value: null, - text: "请选择" - }) - } - - return { - isleaf, - hasNodes - } - }, - _filterData(data, paths) { - let dataList = [] - let hasNodes = true - - dataList.push(data.filter((item) => { - return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') - })) - for (let i = 0; i < paths.length; i++) { - var value = paths[i].value - var nodes = data.filter((item) => { - return item.parent_value === value - }) - - if (nodes.length) { - dataList.push(nodes) - } else { - hasNodes = false - } - } - - return { - dataList, - hasNodes - } - }, - _extractTree(nodes, result, parent_value) { - let list = result || [] - let valueField = this.map.value - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i] - - let child = {} - for (let key in node) { - if (key !== 'children') { - child[key] = node[key] - } - } - if (parent_value !== null && parent_value !== undefined && parent_value !== '') { - child.parent_value = parent_value - } - result.push(child) - - let children = node.children - if (children) { - this._extractTree(children, result, node[valueField]) - } - } - }, - _extractTreePath(nodes, result) { - let list = result || [] - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i] - - let child = {} - for (let key in node) { - if (key !== 'children') { - child[key] = node[key] - } - } - result.push(child) - - let children = node.children - if (children) { - this._extractTreePath(children, result) - } - } - }, - _findNodePath(key, nodes, path = []) { - let textField = this.map.text - let valueField = this.map.value - for (let i = 0; i < nodes.length; i++) { - let node = nodes[i] - let children = node.children - let text = node[textField] - let value = node[valueField] - - path.push({ - value, - text - }) - - if (value === key) { - return path - } - - if (children) { - const p = this._findNodePath(key, children, path) - if (p.length) { - return p - } - } - - path.pop() - } - return [] - }, - _processLocalData() { - this._treeData = [] - this._extractTree(this.localdata, this._treeData) - - var inputValue = this.dataValue - if (inputValue === undefined) { - return - } - - if (Array.isArray(inputValue)) { - inputValue = inputValue[inputValue.length - 1] - if (typeof inputValue === 'object' && inputValue[this.map.value]) { - inputValue = inputValue[this.map.value] - } - } - - this.selected = this._findNodePath(inputValue, this.localdata) - } - } -} +export default { + props: { + localdata: { + type: [Array, Object], + default () { + return [] + } + }, + spaceInfo: { + type: Object, + default () { + return {} + } + }, + collection: { + type: String, + default: '' + }, + action: { + type: String, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: [String, Object], + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 500 + }, + getcount: { + type: [Boolean, String], + default: false + }, + getone: { + type: [Boolean, String], + default: false + }, + gettree: { + type: [Boolean, String], + default: false + }, + manual: { + type: Boolean, + default: false + }, + value: { + type: [Array, String, Number], + default () { + return [] + } + }, + modelValue: { + type: [Array, String, Number], + default () { + return [] + } + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + map: { + type: Object, + default () { + return { + text: "text", + value: "value" + } + } + } + }, + data() { + return { + loading: false, + errorMessage: '', + loadMore: { + contentdown: '', + contentrefresh: '', + contentnomore: '' + }, + dataList: [], + selected: [], + selectedIndex: 0, + page: { + current: this.pageCurrent, + size: this.pageSize, + count: 0 + } + } + }, + computed: { + isLocalData() { + return !this.collection.length; + }, + isCloudData() { + return this.collection.length > 0; + }, + isCloudDataList() { + return (this.isCloudData && (!this.parentField && !this.selfField)); + }, + isCloudDataTree() { + return (this.isCloudData && this.parentField && this.selfField); + }, + dataValue() { + let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || + this.modelValue !== undefined); + return isModelValue ? this.modelValue : this.value; + }, + hasValue() { + if (typeof this.dataValue === 'number') { + return true + } + return (this.dataValue != null) && (this.dataValue.length > 0) + } + }, + created() { + this.$watch(() => { + var al = []; + ['pageCurrent', + 'pageSize', + 'spaceInfo', + 'value', + 'modelValue', + 'localdata', + 'collection', + 'action', + 'field', + 'orderby', + 'where', + 'getont', + 'getcount', + 'gettree' + ].forEach(key => { + al.push(this[key]) + }); + return al + }, (newValue, oldValue) => { + let needReset = false + for (let i = 2; i < newValue.length; i++) { + if (newValue[i] != oldValue[i]) { + needReset = true + break + } + } + if (newValue[0] != oldValue[0]) { + this.page.current = this.pageCurrent + } + this.page.size = this.pageSize + + this.onPropsChange() + }) + this._treeData = [] + }, + methods: { + onPropsChange() { + this._treeData = []; + }, + + // 填充 pickview 数据 + async loadData() { + if (this.isLocalData) { + this.loadLocalData(); + } else if (this.isCloudDataList) { + this.loadCloudDataList(); + } else if (this.isCloudDataTree) { + this.loadCloudDataTree(); + } + }, + + // 加载本地数据 + async loadLocalData() { + this._treeData = []; + this._extractTree(this.localdata, this._treeData); + + let inputValue = this.dataValue; + if (inputValue === undefined) { + return; + } + + if (Array.isArray(inputValue)) { + inputValue = inputValue[inputValue.length - 1]; + if (typeof inputValue === 'object' && inputValue[this.map.value]) { + inputValue = inputValue[this.map.value]; + } + } + + this.selected = this._findNodePath(inputValue, this.localdata); + }, + + // 加载 Cloud 数据 (单列) + async loadCloudDataList() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let response = await this.getCommand(); + let responseData = response.result.data; + + this._treeData = responseData; + + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (树形) + async loadCloudDataTree() { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataTreeWhere() + }; + if (this.gettree) { + commandOptions.startwith = `${this.selfField}=='${this.dataValue}'`; + } + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + this._treeData = responseData; + this._updateBindData(); + this._updateSelected(); + + this.onDataChange(); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 加载 Cloud 数据 (节点) + async loadCloudDataNode(callback) { + if (this.loading) { + return; + } + this.loading = true; + + try { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataNodeWhere() + }; + + let response = await this.getCommand(commandOptions); + let responseData = response.result.data; + + callback(responseData); + } catch (e) { + this.errorMessage = e; + } finally { + this.loading = false; + } + }, + + // 回显 Cloud 数据 + getCloudDataValue() { + if (this.isCloudDataList) { + return this.getCloudDataListValue(); + } + + if (this.isCloudDataTree) { + return this.getCloudDataTreeValue(); + } + }, + + // 回显 Cloud 数据 (单列) + getCloudDataListValue() { + // 根据 field's as value标识匹配 where 条件 + let where = []; + let whereField = this._getForeignKeyByField(); + if (whereField) { + where.push(`${whereField} == '${this.dataValue}'`) + } + + where = where.join(' || '); + + if (this.where) { + where = `(${this.where}) && (${where})` + } + + return this.getCommand({ + field: this._cloudDataPostField(), + where + }).then((res) => { + this.selected = res.result.data; + return res.result.data; + }); + }, + + // 回显 Cloud 数据 (树形) + getCloudDataTreeValue() { + return this.getCommand({ + field: this._cloudDataPostField(), + getTreePath: { + startWith: `${this.selfField}=='${this.dataValue}'` + } + }).then((res) => { + let treePath = []; + this._extractTreePath(res.result.data, treePath); + this.selected = treePath; + return treePath; + }); + }, + + getCommand(options = {}) { + /* eslint-disable no-undef */ + let db = uniCloud.database(this.spaceInfo) + + const action = options.action || this.action + if (action) { + db = db.action(action) + } + + const collection = options.collection || this.collection + db = db.collection(collection) + + const where = options.where || this.where + if (!(!where || !Object.keys(where).length)) { + db = db.where(where) + } + + const field = options.field || this.field + if (field) { + db = db.field(field) + } + + const orderby = options.orderby || this.orderby + if (orderby) { + db = db.orderBy(orderby) + } + + const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current + const size = options.pageSize !== undefined ? options.pageSize : this.page.size + const getCount = options.getcount !== undefined ? options.getcount : this.getcount + const getTree = options.gettree !== undefined ? options.gettree : this.gettree + + const getOptions = { + getCount, + getTree + } + if (options.getTreePath) { + getOptions.getTreePath = options.getTreePath + } + + db = db.skip(size * (current - 1)).limit(size).get(getOptions) + + return db + }, + + _cloudDataPostField() { + let fields = [this.field]; + if (this.parentField) { + fields.push(`${this.parentField} as parent_value`); + } + return fields.join(','); + }, + + _cloudDataTreeWhere() { + let result = [] + let selected = this.selected + let parentField = this.parentField + if (parentField) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selected.length) { + for (var i = 0; i < selected.length - 1; i++) { + result.push(`${parentField} == '${selected[i].value}'`) + } + } + + let where = [] + if (this.where) { + where.push(`(${this.where})`) + } + + if (result.length) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + + _cloudDataNodeWhere() { + let where = [] + let selected = this.selected; + if (selected.length) { + where.push(`${this.parentField} == '${selected[selected.length - 1].value}'`); + } + + where = where.join(' || '); + + if (this.where) { + return `(${this.where}) && (${where})` + } + + return where + }, + + _getWhereByForeignKey() { + let result = [] + let whereField = this._getForeignKeyByField(); + if (whereField) { + result.push(`${whereField} == '${this.dataValue}'`) + } + + if (this.where) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + + _getForeignKeyByField() { + let fields = this.field.split(','); + let whereField = null; + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as'); + if (items.length < 2) { + continue; + } + if (items[1].trim() === 'value') { + whereField = items[0].trim(); + break; + } + } + return whereField; + }, + + _updateBindData(node) { + const { + dataList, + hasNodes + } = this._filterData(this._treeData, this.selected) + + let isleaf = this._stepSearh === false && !hasNodes + + if (node) { + node.isleaf = isleaf + } + + this.dataList = dataList + this.selectedIndex = dataList.length - 1 + + if (!isleaf && this.selected.length < dataList.length) { + this.selected.push({ + value: null, + text: "请选择" + }) + } + + return { + isleaf, + hasNodes + } + }, + + _updateSelected() { + let dl = this.dataList + let sl = this.selected + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < sl.length; i++) { + let value = sl[i].value + let dl2 = dl[i] + for (let j = 0; j < dl2.length; j++) { + let item2 = dl2[j] + if (item2[valueField] === value) { + sl[i].text = item2[textField] + break + } + } + } + }, + + _filterData(data, paths) { + let dataList = [] + let hasNodes = true + + dataList.push(data.filter((item) => { + return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '') + })) + for (let i = 0; i < paths.length; i++) { + let value = paths[i].value + let nodes = data.filter((item) => { + return item.parent_value === value + }) + + if (nodes.length) { + dataList.push(nodes) + } else { + hasNodes = false + } + } + + return { + dataList, + hasNodes + } + }, + + _extractTree(nodes, result, parent_value) { + let list = result || [] + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + if (parent_value !== null && parent_value !== undefined && parent_value !== '') { + child.parent_value = parent_value + } + result.push(child) + + let children = node.children + if (children) { + this._extractTree(children, result, node[valueField]) + } + } + }, + + _extractTreePath(nodes, result) { + let list = result || [] + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + + let child = {} + for (let key in node) { + if (key !== 'children') { + child[key] = node[key] + } + } + result.push(child) + + let children = node.children + if (children) { + this._extractTreePath(children, result) + } + } + }, + + _findNodePath(key, nodes, path = []) { + let textField = this.map.text + let valueField = this.map.value + for (let i = 0; i < nodes.length; i++) { + let node = nodes[i] + let children = node.children + let text = node[textField] + let value = node[valueField] + + path.push({ + value, + text + }) + + if (value === key) { + return path + } + + if (children) { + const p = this._findNodePath(key, children, path) + if (p.length) { + return p + } + } + + path.pop() + } + return [] + } + } +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts new file mode 100644 index 00000000..1c78a40e --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts @@ -0,0 +1,693 @@ +export type PaginationType = { + current : number, + size : number, + count : number +} + +export type LoadMoreType = { + contentdown : string, + contentrefresh : string, + contentnomore : string +} + +export type SelectedItemType = { + name : string, + value : string, +} + +export type GetCommandOptions = { + collection ?: UTSJSONObject, + field ?: string, + orderby ?: string, + where ?: any, + pageData ?: string, + pageCurrent ?: number, + pageSize ?: number, + getCount ?: boolean, + getTree ?: any, + getTreePath ?: UTSJSONObject, + startwith ?: string, + limitlevel ?: number, + groupby ?: string, + groupField ?: string, + distinct ?: boolean, + pageIndistinct ?: boolean, + foreignKey ?: string, + loadtime ?: string, + manual ?: boolean +} + +const DefaultSelectedNode = { + text: '请选择', + value: '' +} + +export const dataPicker = defineMixin({ + props: { + localdata: { + type: Array as PropType>, + default: [] as Array + }, + collection: { + type: Object, + default: '' + }, + field: { + type: String, + default: '' + }, + orderby: { + type: String, + default: '' + }, + where: { + type: Object, + default: '' + }, + pageData: { + type: String, + default: 'add' + }, + pageCurrent: { + type: Number, + default: 1 + }, + pageSize: { + type: Number, + default: 20 + }, + getcount: { + type: Boolean, + default: false + }, + gettree: { + type: Object, + default: '' + }, + gettreepath: { + type: Object, + default: '' + }, + startwith: { + type: String, + default: '' + }, + limitlevel: { + type: Number, + default: 10 + }, + groupby: { + type: String, + default: '' + }, + groupField: { + type: String, + default: '' + }, + distinct: { + type: Boolean, + default: false + }, + pageIndistinct: { + type: Boolean, + default: false + }, + foreignKey: { + type: String, + default: '' + }, + loadtime: { + type: String, + default: 'auto' + }, + manual: { + type: Boolean, + default: false + }, + preload: { + type: Boolean, + default: false + }, + stepSearh: { + type: Boolean, + default: true + }, + selfField: { + type: String, + default: '' + }, + parentField: { + type: String, + default: '' + }, + multiple: { + type: Boolean, + default: false + }, + value: { + type: Object, + default: '' + }, + modelValue: { + type: Object, + default: '' + }, + defaultProps: { + type: Object as PropType, + } + }, + data() { + return { + loading: false, + error: null as UniCloudError | null, + treeData: [] as Array, + selectedIndex: 0, + selectedNodes: [] as Array, + selectedPages: [] as Array[], + selectedValue: '', + selectedPaths: [] as Array, + pagination: { + current: 1, + size: 20, + count: 0 + } as PaginationType + } + }, + computed: { + mappingTextName() : string { + // TODO + return (this.defaultProps != null) ? this.defaultProps!.getString('text', 'text') : 'text' + }, + mappingValueName() : string { + // TODO + return (this.defaultProps != null) ? this.defaultProps!.getString('value', 'value') : 'value' + }, + currentDataList() : Array { + if (this.selectedIndex > this.selectedPages.length - 1) { + return [] as Array + } + return this.selectedPages[this.selectedIndex] + }, + isLocalData() : boolean { + return this.localdata.length > 0 + }, + isCloudData() : boolean { + return this._checkIsNotNull(this.collection) + }, + isCloudDataList() : boolean { + return (this.isCloudData && (this.parentField.length == 0 && this.selfField.length == 0)) + }, + isCloudDataTree() : boolean { + return (this.isCloudData && this.parentField.length > 0 && this.selfField.length > 0) + }, + dataValue() : any { + return this.hasModelValue ? this.modelValue : this.value + }, + hasCloudTreeData() : boolean { + return this.treeData.length > 0 + }, + hasModelValue() : boolean { + if (typeof this.modelValue == 'string') { + const valueString = this.modelValue as string + return (valueString.length > 0) + } else if (Array.isArray(this.modelValue)) { + const valueArray = this.modelValue as Array + return (valueArray.length > 0) + } + return false + }, + hasCloudDataValue() : boolean { + if (typeof this.dataValue == 'string') { + const valueString = this.dataValue as string + return (valueString.length > 0) + } + return false + } + }, + created() { + this.pagination.current = this.pageCurrent + this.pagination.size = this.pageSize + + this.$watch( + () : any => [ + this.pageCurrent, + this.pageSize, + this.localdata, + this.value, + this.collection, + this.field, + this.getcount, + this.orderby, + this.where, + this.groupby, + this.groupField, + this.distinct + ], + (newValue : Array, oldValue : Array) => { + this.pagination.size = this.pageSize + if (newValue[0] !== oldValue[0]) { + this.pagination.current = this.pageCurrent + } + + this.onPropsChange() + } + ) + }, + methods: { + onPropsChange() { + this.selectedIndex = 0 + this.treeData.length = 0 + this.selectedNodes.length = 0 + this.selectedPages.length = 0 + this.selectedPaths.length = 0 + + // 加载数据 + this.$nextTick(() => { + this.loadData() + }) + }, + + onTabSelect(index : number) { + this.selectedIndex = index + }, + + onNodeClick(nodeData : UTSJSONObject) { + if (nodeData.getBoolean('disable', false)) { + return + } + + const isLeaf = this._checkIsLeafNode(nodeData) + + this._trimSelectedNodes(nodeData) + + this.$emit('nodeclick', nodeData) + + if (this.isLocalData) { + if (isLeaf || !this._checkHasChildren(nodeData)) { + this.onFinish() + } + } else if (this.isCloudDataList) { + this.onFinish() + } else if (this.isCloudDataTree) { + if (isLeaf) { + this.onFinish() + } else if (!this._checkHasChildren(nodeData)) { + // 尝试请求一次,如果没有返回数据标记为叶子节点 + this.loadCloudDataNode(nodeData) + } + } + }, + + getChangeNodes(): Array { + const nodes: Array = [] + this.selectedNodes.forEach((node : UTSJSONObject) => { + const newNode: UTSJSONObject = {} + newNode[this.mappingTextName] = node.getString(this.mappingTextName) + newNode[this.mappingValueName] = node.getString(this.mappingValueName) + nodes.push(newNode) + }) + return nodes + }, + + onFinish() { }, + + // 加载数据(自动判定环境) + loadData() { + if (this.isLocalData) { + this.loadLocalData() + } else if (this.isCloudDataList) { + this.loadCloudDataList() + } else if (this.isCloudDataTree) { + this.loadCloudDataTree() + } + }, + + // 加载本地数据 + loadLocalData() { + this.treeData = this.localdata + if (Array.isArray(this.dataValue)) { + const value = this.dataValue as Array + this.selectedPaths = value.slice(0) + this._pushSelectedTreeNodes(value, this.localdata) + } else { + this._pushSelectedNodes(this.localdata) + } + }, + + // 加载 Cloud 数据 (单列) + loadCloudDataList() { + this._loadCloudData(null, (data : Array) => { + this.treeData = data + this._pushSelectedNodes(data) + }) + }, + + // 加载 Cloud 数据 (树形) + loadCloudDataTree() { + let commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataTreeWhere(), + getTree: true + } as GetCommandOptions + if (this._checkIsNotNull(this.gettree)) { + commandOptions.startwith = `${this.selfField}=='${this.dataValue as string}'` + } + this._loadCloudData(commandOptions, (data : Array) => { + this.treeData = data + if (this.selectedPaths.length > 0) { + this._pushSelectedTreeNodes(this.selectedPaths, data) + } else { + this._pushSelectedNodes(data) + } + }) + }, + + // 加载 Cloud 数据 (节点) + loadCloudDataNode(nodeData : UTSJSONObject) { + const commandOptions = { + field: this._cloudDataPostField(), + where: this._cloudDataNodeWhere() + } as GetCommandOptions + this._loadCloudData(commandOptions, (data : Array) => { + nodeData['children'] = data + if (data.length == 0) { + nodeData['isleaf'] = true + this.onFinish() + } else { + this._pushSelectedNodes(data) + } + }) + }, + + // 回显 Cloud Tree Path + loadCloudDataPath() { + if (!this.hasCloudDataValue) { + return + } + + const command : GetCommandOptions = {} + + // 单列 + if (this.isCloudDataList) { + // 根据 field's as value标识匹配 where 条件 + let where : Array = []; + let whereField = this._getForeignKeyByField(); + if (whereField.length > 0) { + where.push(`${whereField} == '${this.dataValue as string}'`) + } + + let whereString = where.join(' || ') + if (this._checkIsNotNull(this.where)) { + whereString = `(${this.where}) && (${whereString})` + } + + command.field = this._cloudDataPostField() + command.where = whereString + } + + // 树形 + if (this.isCloudDataTree) { + command.field = this._cloudDataPostField() + command.getTreePath = { + startWith: `${this.selfField}=='${this.dataValue as string}'` + } + } + + this._loadCloudData(command, (data : Array) => { + this._extractTreePath(data, this.selectedPaths) + }) + }, + + _loadCloudData(options ?: GetCommandOptions, callback ?: ((data : Array) => void)) { + if (this.loading) { + return + } + this.loading = true + + this.error = null + + this._getCommand(options).then((response : UniCloudDBGetResult) => { + callback?.(response.data) + }).catch((err : any | null) => { + this.error = err as UniCloudError + }).finally(() => { + this.loading = false + }) + }, + + _cloudDataPostField() : string { + let fields = [this.field]; + if (this.parentField.length > 0) { + fields.push(`${this.parentField} as parent_value`) + } + return fields.join(',') + }, + + _cloudDataTreeWhere() : string { + let result : Array = [] + let selectedNodes = this.selectedNodes.length > 0 ? this.selectedNodes : this.selectedPaths + let parentField = this.parentField + if (parentField.length > 0) { + result.push(`${parentField} == null || ${parentField} == ""`) + } + if (selectedNodes.length > 0) { + for (var i = 0; i < selectedNodes.length - 1; i++) { + const parentFieldValue = selectedNodes[i].getString('value', '') + result.push(`${parentField} == '${parentFieldValue}'`) + } + } + + let where : Array = [] + if (this._checkIsNotNull(this.where)) { + where.push(`(${this.where as string})`) + } + + if (result.length > 0) { + where.push(`(${result.join(' || ')})`) + } + + return where.join(' && ') + }, + + _cloudDataNodeWhere() : string { + const where : Array = [] + if (this.selectedNodes.length > 0) { + const value = this.selectedNodes[this.selectedNodes.length - 1].getString('value', '') + where.push(`${this.parentField} == '${value}'`) + } + + let whereString = where.join(' || ') + if (this._checkIsNotNull(this.where)) { + return `(${this.where as string}) && (${whereString})` + } + + return whereString + }, + + _getWhereByForeignKey() : string { + let result : Array = [] + let whereField = this._getForeignKeyByField(); + if (whereField.length > 0) { + result.push(`${whereField} == '${this.dataValue as string}'`) + } + + if (this._checkIsNotNull(this.where)) { + return `(${this.where}) && (${result.join(' || ')})` + } + + return result.join(' || ') + }, + + _getForeignKeyByField() : string { + const fields = this.field.split(',') + let whereField = '' + for (let i = 0; i < fields.length; i++) { + const items = fields[i].split('as') + if (items.length < 2) { + continue + } + if (items[1].trim() === 'value') { + whereField = items[0].trim() + break + } + } + return whereField + }, + + _getCommand(options ?: GetCommandOptions) : Promise { + let db = uniCloud.databaseForJQL() + + let collection = Array.isArray(this.collection) ? db.collection(...(this.collection as Array)) : db.collection(this.collection) + + let filter : UniCloudDBFilter | null = null + if (this.foreignKey.length > 0) { + filter = collection.foreignKey(this.foreignKey) + } + + const where : any = options?.where ?? this.where + if (typeof where == 'string') { + const whereString = where as string + if (whereString.length > 0) { + filter = (filter != null) ? filter.where(where) : collection.where(where) + } + } else { + filter = (filter != null) ? filter.where(where) : collection.where(where) + } + + let query : UniCloudDBQuery | null = null + if (this.field.length > 0) { + query = (filter != null) ? filter.field(this.field) : collection.field(this.field) + } + if (this.groupby.length > 0) { + if (query != null) { + query = query.groupBy(this.groupby) + } else if (filter != null) { + query = filter.groupBy(this.groupby) + } + } + if (this.groupField.length > 0) { + if (query != null) { + query = query.groupField(this.groupField) + } else if (filter != null) { + query = filter.groupField(this.groupField) + } + } + if (this.distinct == true) { + if (query != null) { + query = query.distinct(this.field) + } else if (filter != null) { + query = filter.distinct(this.field) + } + } + if (this.orderby.length > 0) { + if (query != null) { + query = query.orderBy(this.orderby) + } else if (filter != null) { + query = filter.orderBy(this.orderby) + } + } + + const size = this.pagination.size + const current = this.pagination.current + if (query != null) { + query = query.skip(size * (current - 1)).limit(size) + } else if (filter != null) { + query = filter.skip(size * (current - 1)).limit(size) + } else { + query = collection.skip(size * (current - 1)).limit(size) + } + + const getOptions = {} + const treeOptions = { + limitLevel: this.limitlevel, + startWith: this.startwith + } + if (this.getcount == true) { + getOptions['getCount'] = this.getcount + } + + const getTree : any = options?.getTree ?? this.gettree + if (typeof getTree == 'string') { + const getTreeString = getTree as string + if (getTreeString.length > 0) { + getOptions['getTree'] = treeOptions + } + } else if (typeof getTree == 'object') { + getOptions['getTree'] = treeOptions + } else { + getOptions['getTree'] = getTree + } + + const getTreePath = options?.getTreePath ?? this.gettreepath + if (typeof getTreePath == 'string') { + const getTreePathString = getTreePath as string + if (getTreePathString.length > 0) { + getOptions['getTreePath'] = getTreePath + } + } else { + getOptions['getTreePath'] = getTreePath + } + + return query.get(getOptions) + }, + + _checkIsNotNull(value : any) : boolean { + if (typeof value == 'string') { + const valueString = value as string + return (valueString.length > 0) + } else if (value instanceof UTSJSONObject) { + return true + } + return false + }, + + _checkIsLeafNode(nodeData : UTSJSONObject) : boolean { + if (this.selectedIndex >= this.limitlevel) { + return true + } + + if (nodeData.getBoolean('isleaf', false)) { + return true + } + + return false + }, + + _checkHasChildren(nodeData : UTSJSONObject) : boolean { + const children = nodeData.getArray('children') ?? ([] as Array) + return children.length > 0 + }, + + _pushSelectedNodes(nodes : Array) { + this.selectedNodes.push(DefaultSelectedNode) + this.selectedPages.push(nodes) + this.selectedIndex = this.selectedPages.length - 1 + }, + + _trimSelectedNodes(nodeData : UTSJSONObject) { + this.selectedNodes.splice(this.selectedIndex) + this.selectedNodes.push(nodeData) + + if (this.selectedPages.length > 0) { + this.selectedPages.splice(this.selectedIndex + 1) + } + + const children = nodeData.getArray('children') ?? ([] as Array) + if (children.length > 0) { + this.selectedNodes.push(DefaultSelectedNode) + this.selectedPages.push(children) + } + + this.selectedIndex = this.selectedPages.length - 1 + }, + + _pushSelectedTreeNodes(paths : Array, nodes : Array) { + let children : Array = nodes + paths.forEach((node : UTSJSONObject) => { + const findNode = children.find((item : UTSJSONObject) : boolean => { + return (item.getString(this.mappingValueName) == node.getString(this.mappingValueName)) + }) + if (findNode != null) { + this.selectedPages.push(children) + this.selectedNodes.push(node) + children = findNode.getArray('children') ?? ([] as Array) + } + }) + this.selectedIndex = this.selectedPages.length - 1 + }, + + _extractTreePath(nodes : Array, result : Array) { + if (nodes.length == 0) { + return + } + + const node = nodes[0] + result.push(node) + + const children = node.getArray('children') + if (Array.isArray(children) && children!.length > 0) { + this._extractTreePath(children, result) + } + } + } +}) diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css new file mode 100644 index 00000000..1a9c12e1 --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css @@ -0,0 +1,76 @@ +.uni-data-pickerview { + position: relative; + flex-direction: column; + overflow: hidden; +} + +.loading-cover { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + align-items: center; + justify-content: center; + background-color: rgba(150, 150, 150, .1); +} + +.error { + background-color: #fff; + padding: 15px; +} + +.error-text { + color: #DD524D; +} + +.selected-node-list { + flex-direction: row; + flex-wrap: nowrap; +} + +.selected-node-item { + margin-left: 10px; + margin-right: 10px; + padding: 8px 10px 8px 10px; + border-bottom: 2px solid transparent; +} + +.selected-node-item-active { + color: #007aff; + border-bottom-color: #007aff; +} + +.list-view { + flex: 1; +} + +.list-item { + flex-direction: row; + justify-content: space-between; + padding: 12px 15px; + border-bottom: 1px solid #f0f0f0; +} + +.item-text { + color: #333333; +} + +.item-text-disabled { + opacity: .5; +} + +.item-text-overflow { + overflow: hidden; +} + +.check { + margin-right: 5px; + border: 2px solid #007aff; + border-left: 0; + border-top: 0; + height: 12px; + width: 6px; + transform-origin: center; + transform: rotate(45deg); +} diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue new file mode 100644 index 00000000..653f8ddc --- /dev/null +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue @@ -0,0 +1,69 @@ + + + + + diff --git a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue index e6c187a7..d3acf921 100644 --- a/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue +++ b/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue @@ -1,184 +1,173 @@ - + /* #endif */ + width: 100%; + flex: 1; + box-sizing: border-box; + } + + .uni-stat-box { + width: 100%; + flex: 1; + } + + .uni-stat__actived { + width: 100%; + flex: 1; + // outline: 1px solid #2979ff; + } + + .uni-label-text { + font-size: 14px; + font-weight: bold; + color: $uni-base-color; + margin: auto 0; + margin-right: 5px; + } + + .uni-select { + font-size: 14px; + border: 1px solid $uni-border-3; + box-sizing: border-box; + border-radius: 4px; + padding: 0 5px; + padding-left: 10px; + position: relative; + /* #ifndef APP-NVUE */ + display: flex; + user-select: none; + /* #endif */ + flex-direction: row; + align-items: center; + border-bottom: solid 1px $uni-border-3; + width: 100%; + flex: 1; + height: 35px; + + &--disabled { + background-color: #f5f7fa; + cursor: not-allowed; + } + } + + .uni-select__label { + font-size: 16px; + // line-height: 22px; + height: 35px; + padding-right: 10px; + color: $uni-secondary-color; + } + + .uni-select__input-box { + height: 35px; + position: relative; + /* #ifndef APP-NVUE */ + display: flex; + /* #endif */ + flex: 1; + flex-direction: row; + align-items: center; + } + + .uni-select__input { + flex: 1; + font-size: 14px; + height: 22px; + line-height: 22px; + } + + .uni-select__input-plac { + font-size: 14px; + color: $uni-secondary-color; + } + + .uni-select__selector { + /* #ifndef APP-NVUE */ + box-sizing: border-box; + /* #endif */ + position: absolute; + top: calc(100% + 12px); + left: 0; + width: 100%; + background-color: #FFFFFF; + border: 1px solid #EBEEF5; + border-radius: 6px; + box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); + z-index: 3; + padding: 4px 0; + } + + .uni-select__selector-scroll { + /* #ifndef APP-NVUE */ + max-height: 200px; + box-sizing: border-box; + /* #endif */ + } + + /* #ifdef H5 */ + @media (min-width: 768px) { + .uni-select__selector-scroll { + max-height: 600px; + } + } + /* #endif */ + + .uni-select__selector-empty, + .uni-select__selector-item { + /* #ifndef APP-NVUE */ + display: flex; + cursor: pointer; + /* #endif */ + line-height: 35px; + font-size: 14px; + text-align: center; + /* border-bottom: solid 1px $uni-border-3; */ + padding: 0px 10px; + } + + .uni-select__selector-item:hover { + background-color: #f9f9f9; + } + + .uni-select__selector-empty:last-child, + .uni-select__selector-item:last-child { + /* #ifndef APP-NVUE */ + border-bottom: none; + /* #endif */ + } + + .uni-select__selector__disabled { + opacity: 0.4; + cursor: default; + } + + /* picker 弹出层通用的指示小三角 */ + .uni-popper__arrow, + .uni-popper__arrow::after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 6px; + } + + .uni-popper__arrow { + filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03)); + top: -6px; + left: 10%; + margin-right: 3px; + border-top-width: 0; + border-bottom-color: #EBEEF5; + } + + .uni-popper__arrow::after { + content: " "; + top: 1px; + margin-left: -6px; + border-top-width: 0; + border-bottom-color: #fff; + } + + .uni-select__input-text { + // width: 280px; + width: 100%; + color: $uni-main-color; + white-space: nowrap; + text-overflow: ellipsis; + -o-text-overflow: ellipsis; + overflow: hidden; + } + + .uni-select__input-placeholder { + color: $uni-base-color; + font-size: 12px; + } + + .uni-select--mask { + position: fixed; + top: 0; + bottom: 0; + right: 0; + left: 0; + z-index: 2; + } + diff --git a/uni_modules/uni-data-select/package.json b/uni_modules/uni-data-select/package.json index 2a203ca8..1af59240 100644 --- a/uni_modules/uni-data-select/package.json +++ b/uni_modules/uni-data-select/package.json @@ -1,85 +1,85 @@ -{ - "id": "uni-data-select", - "displayName": "uni-data-select 下拉框选择器", - "version": "0.1.9", - "description": "通过数据驱动的下拉框选择器", - "keywords": [ - "uni-ui", - "select", - "uni-data-select", - "下拉框", - "下拉选" -], - "repository": "https://github.com/dcloudio/uni-ui", - "engines": { - "HBuilderX": "^3.1.1" - }, - "directories": { - "example": "../../temps/example_temps" - }, -"dcloudext": { - "sale": { - "regular": { - "price": "0.00" - }, - "sourcecode": { - "price": "0.00" - } - }, - "contact": { - "qq": "" - }, - "declaration": { - "ads": "无", - "data": "无", - "permissions": "无" - }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", - "type": "component-vue" - }, - "uni_modules": { - "dependencies": ["uni-load-more"], - "encrypt": [], - "platforms": { - "cloud": { - "tcb": "y", - "aliyun": "y" - }, - "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" - } - } - } - } -} +{ + "id": "uni-data-select", + "displayName": "uni-data-select 下拉框选择器", + "version": "1.0.7", + "description": "通过数据驱动的下拉框选择器", + "keywords": [ + "uni-ui", + "select", + "uni-data-select", + "下拉框", + "下拉选" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.1" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-load-more"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "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-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md index 953afea3..e5ad7c18 100644 --- a/uni_modules/uni-datetime-picker/changelog.md +++ b/uni_modules/uni-datetime-picker/changelog.md @@ -1,3 +1,36 @@ +## 2.2.32(2024-02-20) +- 修复 日历的close事件触发异常的bug [详情](https://github.com/dcloudio/uni-ui/issues/844) +## 2.2.31(2024-02-20) +- 修复 h5平台 右边日历的月份默认+1的bug [详情](https://github.com/dcloudio/uni-ui/issues/841) +## 2.2.30(2024-01-31) +- 修复 隐藏“秒”时,在IOS15及以下版本时出现 结束时间在开始时间之前 的bug [详情](https://github.com/dcloudio/uni-ui/issues/788) +## 2.2.29(2024-01-20) +- 新增 show事件,弹窗弹出时触发该事件 [详情](https://github.com/dcloudio/uni-app/issues/4694) +## 2.2.28(2024-01-18) +- 去除 noChange事件,当进行日期范围选择时,若只选了一天,则开始结束日期都为同一天 [详情](https://github.com/dcloudio/uni-ui/issues/815) +## 2.2.27(2024-01-10) +- 优化 增加noChange事件,当进行日期范围选择时,若有空值,则触发该事件 [详情](https://github.com/dcloudio/uni-ui/issues/815) +## 2.2.26(2024-01-08) +- 修复 字节小程序时间选择范围器失效问题 [详情](https://github.com/dcloudio/uni-ui/issues/834) +## 2.2.25(2023-10-18) +- 修复 PC端初次修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) +## 2.2.24(2023-06-02) +- 修复 部分情况修改时间,开始、结束时间显示异常的Bug [详情](https://ask.dcloud.net.cn/question/171146) +- 优化 当前月可以选择上月、下月的日期的Bug +## 2.2.23(2023-05-02) +- 修复 部分情况修改时间,开始时间未更新的Bug [详情](https://github.com/dcloudio/uni-ui/issues/737) +- 修复 部分平台及设备第一次点击无法显示弹框的Bug +- 修复 ios 日期格式未补零显示及使用异常的Bug [详情](https://ask.dcloud.net.cn/question/162979) +## 2.2.22(2023-03-30) +- 修复 日历 picker 修改年月后,自动选中当月1日的Bug [详情](https://ask.dcloud.net.cn/question/165937) +- 修复 小程序端 低版本 ios NaN的Bug [详情](https://ask.dcloud.net.cn/question/162979) +## 2.2.21(2023-02-20) +- 修复 firefox 浏览器显示区域点击无法拉起日历弹框的Bug [详情](https://ask.dcloud.net.cn/question/163362) +## 2.2.20(2023-02-17) +- 优化 值为空依然选中当天问题 +- 优化 提供 default-value 属性支持配置选择器打开时默认显示的时间 +- 优化 非范围选择未选择日期时间,点击确认按钮选中当前日期时间 +- 优化 字节小程序日期时间范围选择,底部日期换行的Bug ## 2.2.19(2023-02-09) - 修复 2.2.18 引起范围选择配置 end 选择无效的Bug [详情](https://github.com/dcloudio/uni-ui/issues/686) ## 2.2.18(2023-02-08) diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue index 30c4134c..8f3c4615 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue @@ -13,10 +13,10 @@ 'uni-calendar-item--after-checked':weeks.afterMultiple, 'uni-calendar-item--disable':weeks.disable, }"> - + {{weeks.date}} - + @@ -41,10 +41,6 @@ return [] } }, - lunar: { - type: Boolean, - default: false - }, checkHover: { type: Boolean, default: false @@ -83,11 +79,6 @@ color: darken($color: $uni-primary, $amount: 40%); } - .uni-calendar-item__weeks-lunar-text { - font-size: 12px; - color: #333; - } - .uni-calendar-item__weeks-box-item { position: relative; /* #ifndef APP-NVUE */ @@ -123,7 +114,7 @@ color: #D1D1D1; } - .uni-calendar-item--isDay { + .uni-calendar-item--today { position: absolute; top: 10px; right: 17%; diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue index 8dee24b9..2e952dc3 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue @@ -1,29 +1,37 @@ @@ -875,6 +829,7 @@ width: 100%; flex: 1; } + .uni-date-x { display: flex; flex-direction: row; @@ -886,12 +841,17 @@ font-size: 14px; flex: 1; - .icon-calendar{ - padding-left: 3px; - } - .range-separator{ - padding: 0 2px; - } + .icon-calendar { + padding-left: 3px; + } + + .range-separator { + height: 35px; + /* #ifndef MP */ + padding: 0 2px; + /* #endif */ + line-height: 35px; + } } .uni-date-x--border { @@ -917,15 +877,18 @@ .uni-date__x-input { width: auto; + height: 35px; + /* #ifndef MP */ + padding-left: 5px; + /* #endif */ position: relative; - overflow: hidden; flex: 1; - line-height: 1; + line-height: 35px; font-size: 14px; - height: 35px; + overflow: hidden; } - .t-c { + .text-center { text-align: center; } @@ -1023,7 +986,7 @@ opacity: 0.8; } - .popup-x-footer .confirm { + .popup-x-footer .confirm-text { margin-left: 20px; color: $uni-primary; } @@ -1079,4 +1042,4 @@ margin-left: -6px; border-bottom-color: #fff; } - + diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js index 9b170d28..acf7e4ba 100644 --- a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js +++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js @@ -1,27 +1,24 @@ class Calendar { constructor({ - date, selected, startDate, endDate, range, - // multipleStatus } = {}) { // 当前日期 - this.date = this.getDate(new Date()) // 当前初入日期 + this.date = this.getDateObj(new Date()) // 当前初入日期 // 打点信息 this.selected = selected || []; - // 范围开始 + // 起始时间 this.startDate = startDate - // 范围结束 + // 终止时间 this.endDate = endDate + // 是否范围选择 this.range = range // 多选状态 this.cleanMultipleStatus() // 每周日期 this.weeks = {} - // this._getWeek(this.date.fullDate) - // this.multipleStatus = multipleStatus this.lastHover = false } /** @@ -29,8 +26,8 @@ class Calendar { * @param {Object} date */ setDate(date) { - this.selectDate = this.getDate(date) - this._getWeek(this.selectDate.fullDate) + const selectDate = this.getDateObj(date) + this.getWeeks(selectDate.fullDate) } /** @@ -44,103 +41,82 @@ class Calendar { } } - /** - * 重置开始日期 - */ - resetSatrtDate(startDate) { - // 范围开始 + setStartDate(startDate) { this.startDate = startDate - } - /** - * 重置结束日期 - */ - resetEndDate(endDate) { - // 范围结束 + setEndDate(endDate) { this.endDate = endDate } - /** - * 获取任意时间 - */ - getDate(date, AddDayCount = 0, str = 'day') { - if (!date) { - date = new Date() - } - if (typeof date !== 'object') { - date = date.replace(/-/g, '/') + getPreMonthObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + const oldMonth = date.getMonth() + date.setMonth(oldMonth - 1) + const newMonth = date.getMonth() + if (oldMonth !== 0 && newMonth - oldMonth === 0) { + date.setMonth(newMonth - 1) } - const dd = new Date(date) - switch (str) { - case 'day': - dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期 - break - case 'month': - if (dd.getDate() === 31 && AddDayCount>0) { - dd.setDate(dd.getDate() + AddDayCount) - } else { - const preMonth = dd.getMonth() - dd.setMonth(preMonth + AddDayCount) // 获取AddDayCount天后的日期 - const nextMonth = dd.getMonth() - // 处理 pre 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 - if(AddDayCount<0 && preMonth!==0 && nextMonth-preMonth>AddDayCount){ - dd.setMonth(nextMonth+(nextMonth-preMonth+AddDayCount)) - } - // 处理 next 切换月份目标月份为2月没有当前日(30 31) 切换错误问题 - if(AddDayCount>0 && nextMonth-preMonth>AddDayCount){ - dd.setMonth(nextMonth-(nextMonth-preMonth-AddDayCount)) - } - } - break - case 'year': - dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期 - break + return this.getDateObj(date) + } + getNextMonthObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + + const oldMonth = date.getMonth() + date.setMonth(oldMonth + 1) + const newMonth = date.getMonth() + if (newMonth - oldMonth > 1) { + date.setMonth(newMonth - 1) } - const y = dd.getFullYear() - const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0 - const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0 + return this.getDateObj(date) + } + + /** + * 获取指定格式Date对象 + */ + getDateObj(date) { + date = fixIosDateFormat(date) + date = new Date(date) + return { - fullDate: y + '-' + m + '-' + d, - year: y, - month: m, - date: d, - day: dd.getDay() + fullDate: getDate(date), + year: date.getFullYear(), + month: addZero(date.getMonth() + 1), + date: addZero(date.getDate()), + day: date.getDay() } } - /** - * 获取上月剩余天数 + * 获取上一个月日期集合 */ - _getLastMonthDays(firstDay, full) { - let dateArr = [] - for (let i = firstDay; i > 0; i--) { - const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate() - dateArr.push({ - date: beforeDate, - month: full.month - 1, + getPreMonthDays(amount, dateObj) { + const result = [] + for (let i = amount - 1; i >= 0; i--) { + const month = dateObj.month - 1 + result.push({ + date: new Date(dateObj.year, month, -i).getDate(), + month, disable: true }) } - return dateArr + return result } /** - * 获取本月天数 + * 获取本月日期集合 */ - _currentMonthDys(dateData, full) { - let dateArr = [] - let fullDate = this.date.fullDate - for (let i = 1; i <= dateData; i++) { - let isinfo = false - let nowDate = full.year + '-' + (full.month < 10 ? - full.month : full.month) + '-' + (i < 10 ? - '0' + i : i) - // 是否今天 - let isDay = fullDate === nowDate + getCurrentMonthDays(amount, dateObj) { + const result = [] + const fullDate = this.date.fullDate + for (let i = 1; i <= amount; i++) { + const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}` + const isToday = fullDate === currentDate // 获取打点信息 - let info = this.selected && this.selected.find((item) => { - if (this.dateEqual(nowDate, item.date)) { + const info = this.selected && this.selected.find((item) => { + if (this.dateEqual(currentDate, item.date)) { return item } }) @@ -149,62 +125,53 @@ class Calendar { let disableBefore = true let disableAfter = true if (this.startDate) { - // let dateCompBefore = this.dateCompare(this.startDate, fullDate) - // disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate) - disableBefore = this.dateCompare(this.startDate, nowDate) + disableBefore = dateCompare(this.startDate, currentDate) } if (this.endDate) { - // let dateCompAfter = this.dateCompare(fullDate, this.endDate) - // disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate) - disableAfter = this.dateCompare(nowDate, this.endDate) + disableAfter = dateCompare(currentDate, this.endDate) } + let multiples = this.multipleStatus.data - let checked = false let multiplesStatus = -1 - if (this.range) { - if (multiples) { - multiplesStatus = multiples.findIndex((item) => { - return this.dateEqual(item, nowDate) - }) - } - if (multiplesStatus !== -1) { - checked = true - } + if (this.range && multiples) { + multiplesStatus = multiples.findIndex((item) => { + return this.dateEqual(item, currentDate) + }) } - let data = { - fullDate: nowDate, - year: full.year, + const checked = multiplesStatus !== -1 + + result.push({ + fullDate: currentDate, + year: dateObj.year, date: i, multiple: this.range ? checked : false, - beforeMultiple: this.isLogicBefore(nowDate, this.multipleStatus.before, this.multipleStatus.after), - afterMultiple: this.isLogicAfter(nowDate, this.multipleStatus.before, this.multipleStatus.after), - month: full.month, - disable: !(disableBefore && disableAfter), - isDay, - userChecked: false - } - if (info) { - data.extraInfo = info - } - - dateArr.push(data) + beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after), + afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after), + month: dateObj.month, + disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare( + currentDate, this.endDate)), + isToday, + userChecked: false, + extraInfo: info + }) } - return dateArr + return result } /** - * 获取下月天数 + * 获取下一个月日期集合 */ - _getNextMonthDays(surplus, full) { - let dateArr = [] - for (let i = 1; i < surplus + 1; i++) { - dateArr.push({ + _getNextMonthDays(amount, dateObj) { + const result = [] + const month = dateObj.month + 1 + for (let i = 1; i <= amount; i++) { + result.push({ date: i, - month: Number(full.month) + 1, + month, disable: true }) } - return dateArr + return result } /** @@ -215,58 +182,37 @@ class Calendar { if (!date) { date = new Date() } - const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate) - return dateInfo - } - /** - * 比较时间大小 - */ - dateCompare(startDate, endDate) { - // 计算截止时间 - startDate = new Date(startDate.replace('-', '/').replace('-', '/')) - // 计算详细项的截止时间 - endDate = new Date(endDate.replace('-', '/').replace('-', '/')) - if (startDate <= endDate) { - return true - } else { - return false - } + return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate) } /** * 比较时间是否相等 */ dateEqual(before, after) { - // 计算截止时间 - before = new Date(before.replace('-', '/').replace('-', '/')) - // 计算详细项的截止时间 - after = new Date(after.replace('-', '/').replace('-', '/')) - if (before.getTime() - after.getTime() === 0) { - return true - } else { - return false - } + before = new Date(fixIosDateFormat(before)) + after = new Date(fixIosDateFormat(after)) + return before.valueOf() === after.valueOf() } /** * 比较真实起始日期 */ - isLogicBefore(currentDay, before, after) { + isLogicBefore(currentDate, before, after) { let logicBefore = before if (before && after) { - logicBefore = this.dateCompare(before, after) ? before : after + logicBefore = dateCompare(before, after) ? before : after } - return this.dateEqual(logicBefore, currentDay) + return this.dateEqual(logicBefore, currentDate) } - isLogicAfter(currentDay, before, after) { + isLogicAfter(currentDate, before, after) { let logicAfter = after if (before && after) { - logicAfter = this.dateCompare(before, after) ? after : before + logicAfter = dateCompare(before, after) ? after : before } - return this.dateEqual(logicAfter, currentDay) + return this.dateEqual(logicAfter, currentDate) } /** @@ -286,7 +232,7 @@ class Calendar { var unixDe = de.getTime() - 24 * 60 * 60 * 1000 for (var k = unixDb; k <= unixDe;) { k = k + 24 * 60 * 60 * 1000 - arr.push(this.getDate(new Date(parseInt(k))).fullDate) + arr.push(this.getDateObj(new Date(parseInt(k))).fullDate) } return arr } @@ -295,11 +241,12 @@ class Calendar { * 获取多选状态 */ setMultiple(fullDate) { + if (!this.range) return + let { before, after } = this.multipleStatus - if (!this.range) return if (before && after) { if (!this.lastHover) { this.lastHover = true @@ -313,10 +260,11 @@ class Calendar { } else { if (!before) { this.multipleStatus.before = fullDate + this.multipleStatus.after = undefined; this.lastHover = false } else { this.multipleStatus.after = fullDate - if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus .after); } else { @@ -326,32 +274,33 @@ class Calendar { this.lastHover = true } } - this._getWeek(fullDate) + this.getWeeks(fullDate) } /** * 鼠标 hover 更新多选状态 */ setHoverMultiple(fullDate) { - let { - before, - after + //抖音小程序点击会触发hover事件,需要避免一下 + // #ifndef MP-TOUTIAO + if (!this.range || this.lastHover) return + const { + before } = this.multipleStatus - if (!this.range) return - if (this.lastHover) return - if (!before) { this.multipleStatus.before = fullDate } else { this.multipleStatus.after = fullDate - if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { + if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) { this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after); } else { this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before); } } - this._getWeek(fullDate) + this.getWeeks(fullDate) + // #endif + } /** @@ -361,12 +310,12 @@ class Calendar { this.multipleStatus.before = before this.multipleStatus.after = after if (before && after) { - if (this.dateCompare(before, after)) { + if (dateCompare(before, after)) { this.multipleStatus.data = this.geDateAll(before, after); - this._getWeek(after) + this.getWeeks(after) } else { this.multipleStatus.data = this.geDateAll(after, before); - this._getWeek(before) + this.getWeeks(before) } } } @@ -375,46 +324,98 @@ class Calendar { * 获取每周数据 * @param {Object} dateData */ - _getWeek(dateData) { + getWeeks(dateData) { const { - fullDate, year, month, - date, - day - } = this.getDate(dateData) - let firstDay = new Date(year, month - 1, 1).getDay() - let currentDay = new Date(year, month, 0).getDate() - let dates = { - lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天 - currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数 - nextMonthDays: [], // 下个月开始几天 - weeks: [] - } - let canlender = [] - const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length) - dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData)) - canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays) - let weeks = {} - // 拼接数组 上个月开始几天 + 本月天数+ 下个月开始几天 - for (let i = 0; i < canlender.length; i++) { - if (i % 7 === 0) { - weeks[parseInt(i / 7)] = new Array(7) + } = this.getDateObj(dateData) + + const preMonthDayAmount = new Date(year, month - 1, 1).getDay() + const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData)) + + const currentMonthDayAmount = new Date(year, month, 0).getDate() + const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData)) + + const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount + const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData)) + + const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays] + + const weeks = new Array(6) + for (let i = 0; i < calendarDays.length; i++) { + const index = Math.floor(i / 7) + if (!weeks[index]) { + weeks[index] = new Array(7) } - weeks[parseInt(i / 7)][i % 7] = canlender[i] + weeks[index][i % 7] = calendarDays[i] } - this.canlender = canlender + + this.calendar = calendarDays this.weeks = weeks } +} - //静态方法 - // static init(date) { - // if (!this.instance) { - // this.instance = new Calendar(date); - // } - // return this.instance; - // } +function getDateTime(date, hideSecond) { + return `${getDate(date)} ${getTime(date, hideSecond)}` +} + +function getDate(date) { + date = fixIosDateFormat(date) + date = new Date(date) + const year = date.getFullYear() + const month = date.getMonth() + 1 + const day = date.getDate() + return `${year}-${addZero(month)}-${addZero(day)}` +} + +function getTime(date, hideSecond) { + date = fixIosDateFormat(date) + date = new Date(date) + const hour = date.getHours() + const minute = date.getMinutes() + const second = date.getSeconds() + return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}` +} + +function addZero(num) { + if (num < 10) { + num = `0${num}` + } + return num } +function getDefaultSecond(hideSecond) { + return hideSecond ? '00:00' : '00:00:00' +} + +function dateCompare(startDate, endDate) { + startDate = new Date(fixIosDateFormat(startDate)) + endDate = new Date(fixIosDateFormat(endDate)) + return startDate <= endDate +} + +function checkDate(date) { + const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g + return date.match(dateReg) +} +//ios低版本15及以下,无法匹配 没有 ’秒‘ 时的情况,所以需要在末尾 秒 加上 问号 +const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9](:[0-5]?[0-9])?)?$/; + +function fixIosDateFormat(value) { + if (typeof value === 'string' && dateTimeReg.test(value)) { + value = value.replace(/-/g, '/') + } + return value +} -export default Calendar +export { + Calendar, + getDateTime, + getDate, + getTime, + addZero, + getDefaultSecond, + dateCompare, + checkDate, + fixIosDateFormat +} diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json index 2ec840e2..2c861460 100644 --- a/uni_modules/uni-datetime-picker/package.json +++ b/uni_modules/uni-datetime-picker/package.json @@ -1,7 +1,7 @@ { "id": "uni-datetime-picker", "displayName": "uni-datetime-picker 日期选择器", - "version": "2.2.19", + "version": "2.2.32", "description": "uni-datetime-picker 日期时间选择器,支持日历,支持范围选择", "keywords": [ "uni-datetime-picker", diff --git a/uni_modules/uni-easyinput/changelog.md b/uni_modules/uni-easyinput/changelog.md index 33130c66..2133bd42 100644 --- a/uni_modules/uni-easyinput/changelog.md +++ b/uni_modules/uni-easyinput/changelog.md @@ -1,53 +1,107 @@ -## 1.1.3(2022-09-22) -- 修复,引入 uni.scss 引入默认主题色报错的问题 -## 1.1.2(2022-09-22) -- 增加主题色 primaryColor 配置选项 -## 1.1.1(2022-09-19) -- 修复,输入后回车,change 事件触发两次,[详情](https://ask.dcloud.net.cn/question/152149) +## 1.1.15(2024-02-21) +- 新增 左侧插槽:left +## 1.1.14(2024-02-19) +- 修复 onBlur的emit传值错误 +## 1.1.12(2024-01-29) +- 补充 adjust-position文档属性补充 +## 1.1.11(2024-01-29) +- 补充 adjust-position属性传递值:(Boolean)当键盘弹起时,是否自动上推页面 +## 1.1.10(2024-01-22) +- 去除 移除无用的log输出 +## 1.1.9(2023-04-11) +- 修复 vue3 下 keyboardheightchange 事件报错的bug +## 1.1.8(2023-03-29) +- 优化 trim 属性默认值 +## 1.1.7(2023-03-29) +- 新增 cursor-spacing 属性 +## 1.1.6(2023-01-28) +- 新增 keyboardheightchange 事件,可监听键盘高度变化 +## 1.1.5(2022-11-29) +- 优化 主题样式 +## 1.1.4(2022-10-27) +- 修复 props 中背景颜色无默认值的bug ## 1.1.0(2022-06-30) + - 新增 在 uni-forms 1.4.0 中使用可以在 blur 时校验内容 - 新增 clear 事件,点击右侧叉号图标触发 - 新增 change 事件 ,仅在输入框失去焦点或用户按下回车时触发 - 优化 组件样式,组件获取焦点时高亮显示,图标颜色调整等 -- + ## 1.0.5(2022-06-07) + - 优化 clearable 显示策略 + ## 1.0.4(2022-06-07) + - 优化 clearable 显示策略 + ## 1.0.3(2022-05-20) -- 修复 关闭图标某些情况下无法取消的bug + +- 修复 关闭图标某些情况下无法取消的 bug + ## 1.0.2(2022-04-12) -- 修复 默认值不生效的bug + +- 修复 默认值不生效的 bug + ## 1.0.1(2022-04-02) -- 修复 value不能为0的bug + +- 修复 value 不能为 0 的 bug + ## 1.0.0(2021-11-19) -- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) + +- 优化 组件 UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) - 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-easyinput](https://uniapp.dcloud.io/component/uniui/uni-easyinput) + ## 0.1.4(2021-08-20) + - 修复 在 uni-forms 的动态表单中默认值校验不通过的 bug + ## 0.1.3(2021-08-11) + - 修复 在 uni-forms 中重置表单,错误信息无法清除的问题 + ## 0.1.2(2021-07-30) -- 优化 vue3下事件警告的问题 + +- 优化 vue3 下事件警告的问题 + ## 0.1.1 + - 优化 errorMessage 属性支持 Boolean 类型 + ## 0.1.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) + +- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) + ## 0.0.16(2021-06-29) + - 修复 confirmType 属性(仅 type="text" 生效)导致多行文本框无法换行的 bug + ## 0.0.15(2021-06-21) + - 修复 passwordIcon 属性拼写错误的 bug + ## 0.0.14(2021-06-18) -- 新增 passwordIcon 属性,当type=password时是否显示小眼睛图标 + +- 新增 passwordIcon 属性,当 type=password 时是否显示小眼睛图标 - 修复 confirmType 属性不生效的问题 + ## 0.0.13(2021-06-04) + - 修复 disabled 状态可清出内容的 bug + ## 0.0.12(2021-05-12) + - 新增 组件示例地址 + ## 0.0.11(2021-05-07) + - 修复 input-border 属性不生效的问题 + ## 0.0.10(2021-04-30) + - 修复 ios 遮挡文字、显示一半的问题 + ## 0.0.9(2021-02-05) -- 调整为uni_modules目录规范 + +- 调整为 uni_modules 目录规范 - 优化 兼容 nvue 页面 diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/common.js b/uni_modules/uni-easyinput/components/uni-easyinput/common.js index 5549cc99..d2cf040d 100644 --- a/uni_modules/uni-easyinput/components/uni-easyinput/common.js +++ b/uni_modules/uni-easyinput/components/uni-easyinput/common.js @@ -6,9 +6,7 @@ */ export const debounce = function(func, wait = 1000, immediate = true) { let timer; - console.log(1); return function() { - console.log(123); let context = this, args = arguments; if (timer) clearTimeout(timer); diff --git a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue index fdc023a4..836b84c9 100644 --- a/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue +++ b/uni_modules/uni-easyinput/components/uni-easyinput/uni-easyinput.vue @@ -1,34 +1,79 @@ - - diff --git a/uni_modules/uni-easyinput/package.json b/uni_modules/uni-easyinput/package.json index 4ca4200a..caf63459 100644 --- a/uni_modules/uni-easyinput/package.json +++ b/uni_modules/uni-easyinput/package.json @@ -1,7 +1,7 @@ { "id": "uni-easyinput", "displayName": "uni-easyinput 增强输入框", - "version": "1.1.3", + "version": "1.1.15", "description": "Easyinput 组件是对原生input组件的增强", "keywords": [ "uni-ui", diff --git a/uni_modules/uni-fab/changelog.md b/uni_modules/uni-fab/changelog.md index 0048ff92..9bd47292 100644 --- a/uni_modules/uni-fab/changelog.md +++ b/uni_modules/uni-fab/changelog.md @@ -1,3 +1,5 @@ +## 1.2.5(2023-03-29) +- 新增 pattern.icon 属性,可自定义图标 ## 1.2.4(2022-09-07) 小程序端由于 style 使用了对象导致报错,[详情](https://ask.dcloud.net.cn/question/152790?item_id=211778&rf=false) ## 1.2.3(2022-09-05) diff --git a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue index 037385e2..43b45314 100644 --- a/uni_modules/uni-fab/components/uni-fab/uni-fab.vue +++ b/uni_modules/uni-fab/components/uni-fab/uni-fab.vue @@ -35,7 +35,7 @@ 'uni-fab__circle--rightTop': rightTop, 'uni-fab__content--other-platform': !isAndroidNvue }" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor, 'bottom': nvueBottom }" @click="_onClick"> - @@ -115,7 +115,8 @@ selectedColor: '#007AFF', backgroundColor: '#fff', buttonColor: '#007AFF', - iconColor: '#fff' + iconColor: '#fff', + icon: 'plusempty' } } }, @@ -206,6 +207,9 @@ * 按钮点击事件 */ _onItemClick(index, item) { + if (!this.isShow) { + return + } this.$emit('trigger', { index, item diff --git a/uni_modules/uni-fab/package.json b/uni_modules/uni-fab/package.json index 6636170d..18c08102 100644 --- a/uni_modules/uni-fab/package.json +++ b/uni_modules/uni-fab/package.json @@ -1,7 +1,7 @@ { "id": "uni-fab", "displayName": "uni-fab 悬浮按钮", - "version": "1.2.4", + "version": "1.2.5", "description": "悬浮按钮 fab button ,点击可展开一个图标按钮菜单。", "keywords": [ "uni-ui", diff --git a/uni_modules/uni-file-picker/changelog.md b/uni_modules/uni-file-picker/changelog.md index e1621c32..52f68d62 100644 --- a/uni_modules/uni-file-picker/changelog.md +++ b/uni_modules/uni-file-picker/changelog.md @@ -1,65 +1,73 @@ -## 1.0.3(2022-12-21) -- 新增 sourceType 属性, 可以自定义图片和视频选择的来源 -## 1.0.2(2022-07-04) -- 修复 在uni-forms下样式不生效的bug -## 1.0.1(2021-11-23) -- 修复 参数为对象的情况下,url在某些情况显示错误的bug -## 1.0.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-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker) -## 0.2.16(2021-11-08) -- 修复 传入空对象 ,显示错误的Bug -## 0.2.15(2021-08-30) -- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug -## 0.2.14(2021-08-23) -- 新增 参数中返回 fileID 字段 -## 0.2.13(2021-08-23) -- 修复 腾讯云传入fileID 不能回显的bug -- 修复 选择图片后,不能放大的问题 -## 0.2.12(2021-08-17) -- 修复 由于 0.2.11 版本引起的不能回显图片的Bug -## 0.2.11(2021-08-16) -- 新增 clearFiles(index) 方法,可以手动删除指定文件 -- 修复 v-model 值设为 null 报错的Bug -## 0.2.10(2021-08-13) -- 修复 return-type="object" 时,无法删除文件的Bug -## 0.2.9(2021-08-03) -- 修复 auto-upload 属性失效的Bug -## 0.2.8(2021-07-31) -- 修复 fileExtname属性不指定值报错的Bug -## 0.2.7(2021-07-31) -- 修复 在某种场景下图片不回显的Bug -## 0.2.6(2021-07-30) -- 修复 return-type为object下,返回值不正确的Bug -## 0.2.5(2021-07-30) -- 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题 -## 0.2.3(2021-07-28) -- 优化 调整示例代码 -## 0.2.2(2021-07-27) -- 修复 vue3 下赋值错误的Bug -- 优化 h5平台下上传文件导致页面卡死的问题 -## 0.2.0(2021-07-13) -- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) -## 0.1.1(2021-07-02) -- 修复 sourceType 缺少默认值导致 ios 无法选择文件 -## 0.1.0(2021-06-30) -- 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改 -## 0.0.11(2021-06-30) -- 修复 由 0.0.10 版本引发的 returnType 属性失效的问题 -## 0.0.10(2021-06-29) -- 优化 文件上传后进度条消失时机 -## 0.0.9(2021-06-29) -- 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug -## 0.0.8(2021-06-15) -- 修复 删除文件时无法触发 v-model 的Bug -## 0.0.7(2021-05-12) -- 新增 组件示例地址 -## 0.0.6(2021-04-09) -- 修复 选择的文件非 file-extname 字段指定的扩展名报错的Bug -## 0.0.5(2021-04-09) -- 优化 更新组件示例 -## 0.0.4(2021-04-09) -- 优化 file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔 -## 0.0.3(2021-02-05) -- 调整为uni_modules目录规范 -- 修复 微信小程序不指定 fileExtname 属性选择失败的Bug +## 1.0.7(2024-02-21) +- 新增 微信小程序选择视频时改用chooseMedia,并返回视频缩略图 +## 1.0.6(2024-01-06) +- 新增 微信小程序不再调用chooseImage,而是调用chooseMedia +## 1.0.5(2024-01-03) +- 新增 上传文件至云存储携带本地文件名称 +## 1.0.4(2023-03-29) +- 修复 手动上传删除一个文件后不能再上传的bug +## 1.0.3(2022-12-19) +- 新增 sourceType 属性, 可以自定义图片和视频选择的来源 +## 1.0.2(2022-07-04) +- 修复 在uni-forms下样式不生效的bug +## 1.0.1(2021-11-23) +- 修复 参数为对象的情况下,url在某些情况显示错误的bug +## 1.0.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-file-picker](https://uniapp.dcloud.io/component/uniui/uni-file-picker) +## 0.2.16(2021-11-08) +- 修复 传入空对象 ,显示错误的Bug +## 0.2.15(2021-08-30) +- 修复 return-type="object" 时且存在v-model时,无法删除文件的Bug +## 0.2.14(2021-08-23) +- 新增 参数中返回 fileID 字段 +## 0.2.13(2021-08-23) +- 修复 腾讯云传入fileID 不能回显的bug +- 修复 选择图片后,不能放大的问题 +## 0.2.12(2021-08-17) +- 修复 由于 0.2.11 版本引起的不能回显图片的Bug +## 0.2.11(2021-08-16) +- 新增 clearFiles(index) 方法,可以手动删除指定文件 +- 修复 v-model 值设为 null 报错的Bug +## 0.2.10(2021-08-13) +- 修复 return-type="object" 时,无法删除文件的Bug +## 0.2.9(2021-08-03) +- 修复 auto-upload 属性失效的Bug +## 0.2.8(2021-07-31) +- 修复 fileExtname属性不指定值报错的Bug +## 0.2.7(2021-07-31) +- 修复 在某种场景下图片不回显的Bug +## 0.2.6(2021-07-30) +- 修复 return-type为object下,返回值不正确的Bug +## 0.2.5(2021-07-30) +- 修复(重要) H5 平台下如果和uni-forms组件一同使用导致页面卡死的问题 +## 0.2.3(2021-07-28) +- 优化 调整示例代码 +## 0.2.2(2021-07-27) +- 修复 vue3 下赋值错误的Bug +- 优化 h5平台下上传文件导致页面卡死的问题 +## 0.2.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 0.1.1(2021-07-02) +- 修复 sourceType 缺少默认值导致 ios 无法选择文件 +## 0.1.0(2021-06-30) +- 优化 解耦与uniCloud的强绑定关系 ,如不绑定服务空间,默认autoUpload为false且不可更改 +## 0.0.11(2021-06-30) +- 修复 由 0.0.10 版本引发的 returnType 属性失效的问题 +## 0.0.10(2021-06-29) +- 优化 文件上传后进度条消失时机 +## 0.0.9(2021-06-29) +- 修复 在uni-forms 中,删除文件 ,获取的值不对的Bug +## 0.0.8(2021-06-15) +- 修复 删除文件时无法触发 v-model 的Bug +## 0.0.7(2021-05-12) +- 新增 组件示例地址 +## 0.0.6(2021-04-09) +- 修复 选择的文件非 file-extname 字段指定的扩展名报错的Bug +## 0.0.5(2021-04-09) +- 优化 更新组件示例 +## 0.0.4(2021-04-09) +- 优化 file-extname 字段支持字符串写法,多个扩展名需要用逗号分隔 +## 0.0.3(2021-02-05) +- 调整为uni_modules目录规范 +- 修复 微信小程序不指定 fileExtname 属性选择失败的Bug diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js index 018590d6..c4ff85dd 100644 --- a/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js +++ b/uni_modules/uni-file-picker/components/uni-file-picker/choose-and-upload-file.js @@ -11,6 +11,28 @@ function chooseImage(opts) { extension } = opts return new Promise((resolve, reject) => { + // 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口 + // #ifdef MP-WEIXIN + uni.chooseMedia({ + count, + sizeType, + sourceType, + mediaType: ['image'], + extension, + success(res) { + res.tempFiles.forEach(item => { + item.path = item.tempFilePath; + }) + resolve(normalizeChooseAndUploadFileRes(res, 'image')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseImage:fail', ERR_MSG_FAIL), + }); + }, + }) + // #endif + // #ifndef MP-WEIXIN uni.chooseImage({ count, sizeType, @@ -25,11 +47,14 @@ function chooseImage(opts) { }); }, }); + // #endif + }); } function chooseVideo(opts) { const { + count, camera, compressed, maxDuration, @@ -37,6 +62,45 @@ function chooseVideo(opts) { extension } = opts; return new Promise((resolve, reject) => { + // 微信由于旧接口不再维护,针对微信小程序平台改用chooseMedia接口 + // #ifdef MP-WEIXIN + uni.chooseMedia({ + count, + compressed, + maxDuration, + sourceType, + extension, + mediaType: ['video'], + success(res) { + const { + tempFiles, + } = res; + resolve(normalizeChooseAndUploadFileRes({ + errMsg: 'chooseVideo:ok', + tempFiles: tempFiles.map(item => { + return { + name: item.name || '', + path: item.tempFilePath, + thumbTempFilePath: item.thumbTempFilePath, + size:item.size, + type: (res.tempFile && res.tempFile.type) || '', + width:item.width, + height:item.height, + duration:item.duration, + fileType: 'video', + cloudPath: '', + } + }), + }, 'video')); + }, + fail(res) { + reject({ + errMsg: res.errMsg.replace('chooseVideo:fail', ERR_MSG_FAIL), + }); + }, + }) + // #endif + // #ifndef MP-WEIXIN uni.chooseVideo({ camera, compressed, @@ -54,8 +118,7 @@ function chooseVideo(opts) { resolve(normalizeChooseAndUploadFileRes({ errMsg: 'chooseVideo:ok', tempFilePaths: [tempFilePath], - tempFiles: [ - { + tempFiles: [{ name: (res.tempFile && res.tempFile.name) || '', path: tempFilePath, size, @@ -74,6 +137,7 @@ function chooseVideo(opts) { }); }, }); + // #endif }); } @@ -211,8 +275,7 @@ function chooseAndUploadFile(opts = { }) { if (opts.type === 'image') { return uploadFiles(chooseImage(opts), opts); - } - else if (opts.type === 'video') { + } else if (opts.type === 'video') { return uploadFiles(chooseVideo(opts), opts); } return uploadFiles(chooseAll(opts), opts); diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue index b0f61b4c..74407d96 100644 --- a/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue +++ b/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.vue @@ -191,6 +191,10 @@ default () { return ['album', 'camera'] } + }, + provider: { + type: String, + default: '' // 默认上传到 unicloud 内置存储 extStorage 扩展存储 } }, data() { @@ -331,7 +335,6 @@ * 选择文件 */ choose() { - if (this.disabled) return if (this.files.length >= Number(this.limitLength) && this.showType !== 'grid' && this.returnType === 'array') { @@ -417,7 +420,14 @@ // 停止自动上传 if (!this.autoUpload || this.noSpace) { res.tempFiles = [] - } + } + res.tempFiles.forEach((fileItem, index) => { + this.provider && (fileItem.provider = this.provider); + const fileNameSplit = fileItem.name.split('.') + const ext = fileNameSplit.pop() + const fileName = fileNameSplit.join('.').replace(/[\s\/\?<>\\:\*\|":]/g, '_') + fileItem.cloudPath = fileName + '_' + Date.now() + '_' + index + '.' + ext + }) }, /** @@ -583,7 +593,11 @@ path: v.path, size: v.size, fileID:v.fileID, - url: v.url + url: v.url, + // 修改删除一个文件后不能再上传的bug, #694 + uuid: v.uuid, + status: v.status, + cloudPath: v.cloudPath }) }) return newFilesData diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue index eb1840b7..ab15bad9 100644 --- a/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.vue @@ -24,7 +24,7 @@ - + 点击重试 @@ -69,10 +69,10 @@ borderStyle: {} } } - }, - readonly:{ - type:Boolean, - default:false + }, + readonly:{ + type:Boolean, + default:false } }, computed: { @@ -114,7 +114,7 @@ let classles = '' for (let i in obj) { classles += `${i}:${obj[i]};` - } + } return classles }, borderLineStyle() { @@ -133,19 +133,19 @@ } else { width = width.indexOf('px') ? width : width + 'px' } - obj['border-width'] = width - - if (typeof style === 'number') { - style += 'px' - } else { - style = style.indexOf('px') ? style : style + 'px' + obj['border-width'] = width + + if (typeof style === 'number') { + style += 'px' + } else { + style = style.indexOf('px') ? style : style + 'px' } obj['border-top-style'] = style } let classles = '' for (let i in obj) { classles += `${i}:${obj[i]};` - } + } return classles } }, @@ -176,9 +176,9 @@ + diff --git a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue index 51ace0b4..0c1abe8c 100644 --- a/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue +++ b/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.vue @@ -1,7 +1,7 @@ @@ -38,4 +53,14 @@ .uni-stat-tooltip { width: 160px; } + + .tooltip { + margin: 10px; + } + + .content { + display: flex; + justify-content: center; + + } diff --git a/pages/tabBar/extUI/extUI.nvue b/pages/tabBar/extUI/extUI.nvue index c6520773..4ce3ebdb 100644 --- a/pages/tabBar/extUI/extUI.nvue +++ b/pages/tabBar/extUI/extUI.nvue @@ -223,15 +223,17 @@ }, onLoad() {}, onReady() { - // // #ifdef APP-NVUE - // uni.preloadPage({ - // url: "/pages/extUI/calendar/calendar", - // success() { - // console.log("preloadPage /pages/extUI/calendar/calendar") - // }, - // fail() {} - // }) - // // #endif + // #ifdef APP-NVUE + uni.preloadPage({ + url: "/pages/extUI/calendar/calendar", + success() { + console.log("preloadPage/pages/extUI/calendar/calendar") + }, + fail(e) { + console.log(e); + } + }) + // #endif }, onShareAppMessage() { return { @@ -263,4 +265,4 @@ + diff --git a/uni_modules/uni-collapse/changelog.md b/uni_modules/uni-collapse/changelog.md index 292e4c79..455308a9 100644 --- a/uni_modules/uni-collapse/changelog.md +++ b/uni_modules/uni-collapse/changelog.md @@ -1,3 +1,5 @@ +## 1.4.4(2024-03-20) +- 修复 titleBorder类型修正 ## 1.4.3(2022-01-25) - 修复 初始化的时候 ,open 属性失效的bug ## 1.4.2(2022-01-21) diff --git a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue index b2aad1fd..63d30e31 100644 --- a/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue +++ b/uni_modules/uni-collapse/components/uni-collapse-item/uni-collapse-item.vue @@ -40,7 +40,7 @@ * @property {String} name 唯一标志符 * @property {Boolean} open = [true|false] 是否展开组件 * @property {Boolean} titleBorder = [true|false] 是否显示标题分隔线 - * @property {Boolean} border = [true|false] 是否显示分隔线 + * @property {String} border = ['auto'|'show'|'none'] 是否显示分隔线 * @property {Boolean} disabled = [true|false] 是否展开面板 * @property {Boolean} showAnimation = [true|false] 开启动画 * @property {Boolean} showArrow = [true|false] 是否显示右侧箭头 diff --git a/uni_modules/uni-collapse/package.json b/uni_modules/uni-collapse/package.json index 65349cf9..65c5c2ee 100644 --- a/uni_modules/uni-collapse/package.json +++ b/uni_modules/uni-collapse/package.json @@ -1,7 +1,7 @@ { "id": "uni-collapse", "displayName": "uni-collapse 折叠面板", - "version": "1.4.3", + "version": "1.4.4", "description": "Collapse 组件,可以折叠 / 展开的内容区域。", "keywords": [ "uni-ui", @@ -16,11 +16,7 @@ "directories": { "example": "../../temps/example_temps" }, - "dcloudext": { - "category": [ - "前端组件", - "通用组件" - ], +"dcloudext": { "sale": { "regular": { "price": "0.00" @@ -37,7 +33,8 @@ "data": "无", "permissions": "无" }, - "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" }, "uni_modules": { "dependencies": [ diff --git a/uni_modules/uni-data-checkbox/changelog.md b/uni_modules/uni-data-checkbox/changelog.md index 78f12590..b475fcbb 100644 --- a/uni_modules/uni-data-checkbox/changelog.md +++ b/uni_modules/uni-data-checkbox/changelog.md @@ -1,3 +1,5 @@ +## 1.0.5(2024-03-20) +- 修复 单选模式下选中样式不生效的bug ## 1.0.4(2024-01-27) - 修复 修复错别字chagne为change ## 1.0.3(2022-09-16) diff --git a/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue index e469afcf..6e03c6e4 100644 --- a/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue +++ b/uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue @@ -2,16 +2,21 @@