hy-app 0.5.10 → 0.5.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/hy-action-sheet/hy-action-sheet.vue +200 -200
- package/components/hy-action-sheet/props.ts +71 -71
- package/components/hy-action-sheet/typing.d.ts +64 -64
- package/components/hy-address-picker/hy-address-picker.vue +1 -1
- package/components/hy-address-picker/props.ts +100 -100
- package/components/hy-address-picker/typing.d.ts +16 -16
- package/components/hy-avatar/hy-avatar.vue +163 -163
- package/components/hy-avatar/props.ts +78 -78
- package/components/hy-avatar/typing.d.ts +4 -4
- package/components/hy-back-top/hy-back-top.vue +90 -90
- package/components/hy-back-top/props.ts +60 -60
- package/components/hy-back-top/typing.d.ts +4 -4
- package/components/hy-badge/hy-badge.vue +97 -97
- package/components/hy-badge/props.ts +82 -82
- package/components/hy-badge/typing.d.ts +9 -9
- package/components/hy-button/hy-button.vue +17 -3
- package/components/hy-button/index.scss +24 -1
- package/components/hy-button/props.ts +9 -1
- package/components/hy-button/typing.d.ts +5 -0
- package/components/hy-calendar/header.vue +60 -60
- package/components/hy-calendar/hy-calendar.vue +362 -362
- package/components/hy-calendar/month.vue +537 -537
- package/components/hy-calendar/props.ts +159 -159
- package/components/hy-calendar/typing.d.ts +6 -6
- package/components/hy-card/hy-card.vue +161 -161
- package/components/hy-card/props.ts +122 -122
- package/components/hy-card/typing.d.ts +12 -12
- package/components/hy-cell/hy-cell.vue +33 -33
- package/components/hy-cell/props.ts +54 -54
- package/components/hy-cell/typing.d.ts +4 -4
- package/components/hy-cell-item/hy-cell-item.vue +161 -161
- package/components/hy-cell-item/props.ts +66 -66
- package/components/hy-cell-item/typing.d.ts +7 -7
- package/components/hy-check-button/hy-check-button.vue +96 -96
- package/components/hy-check-button/props.ts +74 -74
- package/components/hy-check-button/typing.d.ts +44 -44
- package/components/hy-checkbox/hy-checkbox.vue +227 -227
- package/components/hy-checkbox/props.ts +96 -96
- package/components/hy-checkbox/typing.d.ts +8 -8
- package/components/hy-checkbox-group/hy-checkbox-group.vue +45 -45
- package/components/hy-checkbox-group/props.ts +80 -80
- package/components/hy-checkbox-group/typing.d.ts +6 -6
- package/components/hy-checkbox-item/hy-checkbox-item.vue +199 -199
- package/components/hy-checkbox-item/props.ts +24 -24
- package/components/hy-checkbox-item/typing.d.ts +7 -7
- package/components/hy-code-input/hy-code-input.vue +231 -231
- package/components/hy-code-input/props.ts +88 -88
- package/components/hy-code-input/typing.d.ts +8 -8
- package/components/hy-config-provider/hy-config-provider.vue +53 -53
- package/components/hy-config-provider/props.ts +28 -28
- package/components/hy-count-down/hy-count-down.vue +170 -170
- package/components/hy-count-down/index.ts +52 -52
- package/components/hy-count-down/props.ts +32 -32
- package/components/hy-count-down/typing.d.ts +14 -14
- package/components/hy-count-to/hy-count-to.vue +218 -218
- package/components/hy-count-to/props.ts +62 -62
- package/components/hy-count-to/typing.d.ts +4 -4
- package/components/hy-coupon/hy-coupon.vue +12 -1
- package/components/hy-coupon/index.scss +167 -171
- package/components/hy-coupon/props.ts +6 -1
- package/components/hy-coupon/typing.d.ts +14 -14
- package/components/hy-datetime-picker/hy-datetime-picker.vue +521 -521
- package/components/hy-datetime-picker/props.ts +142 -142
- package/components/hy-datetime-picker/typing.d.ts +20 -20
- package/components/hy-divider/hy-divider.vue +132 -132
- package/components/hy-divider/props.ts +80 -80
- package/components/hy-dropdown/hy-dropdown.vue +60 -60
- package/components/hy-dropdown/props.ts +40 -40
- package/components/hy-dropdown-item/hy-dropdown-item.vue +206 -206
- package/components/hy-dropdown-item/props.ts +21 -21
- package/components/hy-dropdown-item/typing.d.ts +17 -17
- package/components/hy-empty/hy-empty.vue +116 -116
- package/components/hy-empty/icon.ts +72 -72
- package/components/hy-empty/props.ts +60 -60
- package/components/hy-empty/typing.d.ts +38 -38
- package/components/hy-flex/hy-flex.vue +53 -53
- package/components/hy-flex/index.scss +8 -8
- package/components/hy-flex/props.ts +58 -58
- package/components/hy-flex/typing.d.ts +21 -21
- package/components/hy-float-button/hy-float-button.vue +378 -378
- package/components/hy-float-button/props.ts +111 -111
- package/components/hy-float-button/typing.d.ts +35 -35
- package/components/hy-folding-panel/hy-folding-panel.vue +109 -109
- package/components/hy-folding-panel/props.ts +42 -42
- package/components/hy-folding-panel/typing.d.ts +19 -19
- package/components/hy-folding-panel-item/hy-folding-panel-item.vue +183 -183
- package/components/hy-folding-panel-item/props.ts +81 -81
- package/components/hy-folding-panel-item/typing.d.ts +37 -37
- package/components/hy-form/props.ts +37 -37
- package/components/hy-form/typing.d.ts +41 -41
- package/components/hy-form-group/hy-form-group.vue +333 -333
- package/components/hy-form-group/props.ts +105 -105
- package/components/hy-form-item/hy-form-item.vue +176 -176
- package/components/hy-form-item/index.scss +0 -1
- package/components/hy-form-item/props.ts +25 -25
- package/components/hy-form-item/typing.d.ts +30 -30
- package/components/hy-grid/hy-grid.vue +109 -109
- package/components/hy-grid/props.ts +60 -60
- package/components/hy-grid/typing.d.ts +35 -35
- package/components/hy-icon/hy-icon.vue +112 -112
- package/components/hy-icon/index.scss +0 -3
- package/components/hy-icon/props.ts +79 -79
- package/components/hy-icon/typing.d.ts +9 -9
- package/components/hy-image/hy-image.vue +192 -192
- package/components/hy-image/props.ts +107 -107
- package/components/hy-image/typing.d.ts +10 -10
- package/components/hy-input/hy-input.vue +1 -1
- package/components/hy-input/index.scss +1 -2
- package/components/hy-input/props.ts +3 -3
- package/components/hy-input/typing.d.ts +31 -31
- package/components/hy-line/hy-line.vue +55 -55
- package/components/hy-line/props.ts +43 -43
- package/components/hy-line-progress/hy-line-progress.vue +102 -102
- package/components/hy-line-progress/props.ts +33 -33
- package/components/hy-list/hy-list.vue +226 -226
- package/components/hy-list/props.ts +69 -69
- package/components/hy-list/typing.d.ts +6 -6
- package/components/hy-loading/hy-loading.vue +107 -107
- package/components/hy-loading/props.ts +65 -65
- package/components/hy-menu/hy-menu.vue +159 -159
- package/components/hy-menu/props.ts +44 -44
- package/components/hy-menu/typing.d.ts +34 -34
- package/components/hy-modal/hy-modal.vue +173 -173
- package/components/hy-modal/props.ts +90 -90
- package/components/hy-modal/typing.d.ts +11 -11
- package/components/hy-navbar/hy-navbar.vue +144 -144
- package/components/hy-navbar/props.ts +78 -78
- package/components/hy-navbar/typing.d.ts +6 -6
- package/components/hy-notice-bar/hy-column-notice.vue +94 -94
- package/components/hy-notice-bar/hy-notice-bar.vue +96 -96
- package/components/hy-notice-bar/hy-row-notice.vue +1 -1
- package/components/hy-notice-bar/props.ts +85 -85
- package/components/hy-notice-bar/typing.d.ts +8 -8
- package/components/hy-notify/hy-notify.vue +174 -174
- package/components/hy-notify/props.ts +51 -51
- package/components/hy-number-step/hy-number-step.vue +367 -367
- package/components/hy-number-step/props.ts +112 -112
- package/components/hy-number-step/typing.d.ts +16 -16
- package/components/hy-overlay/hy-overlay.vue +60 -60
- package/components/hy-overlay/props.ts +33 -33
- package/components/hy-overlay/typing.d.ts +4 -4
- package/components/hy-pagination/hy-pagination.vue +135 -135
- package/components/hy-pagination/props.ts +55 -55
- package/components/hy-pagination/typing.d.ts +10 -10
- package/components/hy-parse/node/node.vue +619 -422
- package/components/hy-parse/parser.js +1253 -1060
- package/components/hy-picker/hy-picker.vue +7 -5
- package/components/hy-picker/props.ts +7 -2
- package/components/hy-picker/typing.d.ts +9 -5
- package/components/hy-popover/hy-popover.vue +251 -251
- package/components/hy-popover/props.ts +51 -51
- package/components/hy-popover/typing.d.ts +39 -39
- package/components/hy-popup/hy-popup.vue +197 -197
- package/components/hy-popup/props.ts +85 -85
- package/components/hy-popup/typing.d.ts +10 -10
- package/components/hy-price/hy-price.vue +79 -79
- package/components/hy-price/props.ts +54 -54
- package/components/hy-price/typing.d.ts +4 -4
- package/components/hy-qrcode/hy-qrcode.vue +216 -216
- package/components/hy-qrcode/props.ts +70 -70
- package/components/hy-qrcode/qrcode.js +1304 -1304
- package/components/hy-qrcode/typing.d.ts +8 -8
- package/components/hy-radio/hy-radio.vue +226 -226
- package/components/hy-radio/props.ts +1 -1
- package/components/hy-radio/typing.d.ts +8 -8
- package/components/hy-rate/hy-rate.vue +239 -239
- package/components/hy-rate/props.ts +77 -77
- package/components/hy-rate/typing.d.ts +6 -6
- package/components/hy-read-more/hy-read-more.vue +130 -130
- package/components/hy-read-more/props.ts +45 -45
- package/components/hy-read-more/typing.d.ts +6 -6
- package/components/hy-rolling-num/hy-rolling-num.vue +188 -188
- package/components/hy-rolling-num/props.ts +68 -68
- package/components/hy-scroll-list/hy-scroll-list.vue +123 -123
- package/components/hy-scroll-list/props.ts +22 -22
- package/components/hy-scroll-list/typing.d.ts +6 -6
- package/components/hy-search/hy-search.vue +221 -221
- package/components/hy-search/props.ts +131 -131
- package/components/hy-search/typing.d.ts +22 -22
- package/components/hy-signature/hy-signature.vue +640 -640
- package/components/hy-signature/props.ts +118 -118
- package/components/hy-signature/typing.d.ts +93 -93
- package/components/hy-slider/hy-slider.vue +444 -444
- package/components/hy-slider/props.ts +77 -77
- package/components/hy-slider/typing.d.ts +10 -10
- package/components/hy-status-bar/hy-status-bar.vue +41 -41
- package/components/hy-status-bar/props.ts +8 -8
- package/components/hy-status-bar/typing.d.ts +12 -12
- package/components/hy-steps/hy-steps.vue +267 -267
- package/components/hy-steps/props.ts +49 -49
- package/components/hy-steps/typing.d.ts +21 -21
- package/components/hy-sticky/hy-sticky.vue +226 -226
- package/components/hy-sticky/props.ts +24 -24
- package/components/hy-sticky/typing.d.ts +4 -4
- package/components/hy-submit-bar/hy-submit-bar.vue +189 -189
- package/components/hy-submit-bar/props.ts +91 -91
- package/components/hy-submit-bar/typing.d.ts +24 -24
- package/components/hy-subsection/hy-subsection.vue +207 -207
- package/components/hy-subsection/props.ts +52 -52
- package/components/hy-subsection/typing.d.ts +13 -13
- package/components/hy-swipe-action/hy-swipe-action.vue +323 -323
- package/components/hy-swipe-action/index.ts +25 -25
- package/components/hy-swipe-action/props.ts +47 -47
- package/components/hy-swipe-action/typing.d.ts +25 -25
- package/components/hy-swiper/hy-swiper-indicator.vue +75 -75
- package/components/hy-swiper/hy-swiper.vue +224 -224
- package/components/hy-swiper/props.ts +128 -128
- package/components/hy-swiper/typing.d.ts +26 -26
- package/components/hy-switch/hy-switch.vue +173 -173
- package/components/hy-switch/props.ts +61 -61
- package/components/hy-switch/typing.d.ts +8 -8
- package/components/hy-tabbar/hy-tabbar.vue +136 -136
- package/components/hy-tabbar/props.ts +59 -59
- package/components/hy-tabbar/typing.d.ts +21 -21
- package/components/hy-tabbar-group/hy-tabbar-group.vue +87 -87
- package/components/hy-tabbar-group/props.ts +78 -78
- package/components/hy-tabbar-group/typing.d.ts +16 -16
- package/components/hy-tabbar-item/hy-tabbar-item.vue +103 -103
- package/components/hy-tabbar-item/typing.d.ts +10 -10
- package/components/hy-table/hy-table.vue +492 -271
- package/components/hy-table/index.scss +134 -159
- package/components/hy-table/props.ts +22 -7
- package/components/hy-table/typing.d.ts +6 -11
- package/components/hy-tabs/hy-tabs.vue +1 -1
- package/components/hy-tabs/props.ts +77 -77
- package/components/hy-tabs/typing.d.ts +33 -33
- package/components/hy-tag/hy-tag.vue +174 -174
- package/components/hy-tag/props.ts +89 -89
- package/components/hy-tag/typing.d.ts +13 -13
- package/components/hy-text/hy-text.vue +3 -3
- package/components/hy-text/props.ts +1 -1
- package/components/hy-text/typing.d.ts +6 -6
- package/components/hy-textarea/hy-textarea.vue +3 -2
- package/components/hy-textarea/index.scss +2 -3
- package/components/hy-textarea/props.ts +116 -116
- package/components/hy-textarea/typing.d.ts +22 -22
- package/components/hy-toast/hy-toast.vue +1 -1
- package/components/hy-toast/typing.d.ts +38 -38
- package/components/hy-tooltip/hy-tooltip.vue +277 -277
- package/components/hy-tooltip/props.ts +78 -78
- package/components/hy-tooltip/typing.d.ts +4 -4
- package/components/hy-transition/hy-transition.vue +157 -157
- package/components/hy-transition/props.ts +32 -32
- package/components/hy-transition/typing.d.ts +16 -16
- package/components/hy-upload/hy-upload.vue +385 -385
- package/components/hy-upload/props.ts +132 -132
- package/components/hy-upload/typing.d.ts +65 -65
- package/components/hy-warn/hy-warn.vue +115 -115
- package/components/hy-warn/props.ts +49 -49
- package/components/hy-warn/typing.d.ts +6 -6
- package/components/hy-waterfall/hy-waterfall.vue +191 -191
- package/components/hy-waterfall/props.ts +21 -21
- package/components/hy-watermark/hy-watermark.vue +978 -978
- package/components/hy-watermark/props.ts +104 -104
- package/components/index.ts +183 -183
- package/global.d.ts +91 -91
- package/index.ts +1 -1
- package/libs/api/http.ts +140 -140
- package/libs/api/index.ts +1 -1
- package/libs/common/index.ts +2 -2
- package/libs/common/queue.ts +28 -28
- package/libs/composables/index.ts +6 -6
- package/libs/composables/usePopover.ts +241 -241
- package/libs/composables/useQueue.ts +53 -53
- package/libs/composables/useShakeService.ts +64 -64
- package/libs/composables/useShare.ts +42 -42
- package/libs/composables/useToast.ts +45 -45
- package/libs/composables/useTouch.ts +51 -51
- package/libs/config/color.ts +7 -7
- package/libs/config/icon.ts +430 -430
- package/libs/config/index.ts +2 -2
- package/libs/css/iconfont.css +443 -443
- package/libs/css/theme.scss +1 -0
- package/libs/css/vars.scss +2 -2
- package/libs/global/index.ts +6 -6
- package/libs/global/register-properties.ts +37 -37
- package/libs/index.ts +7 -7
- package/libs/typing/index.ts +4 -4
- package/libs/typing/modules/common.d.ts +136 -136
- package/libs/typing/modules/enum.ts +67 -67
- package/libs/typing/modules/form.ts +5 -1
- package/libs/typing/modules/http.ts +17 -17
- package/libs/typing/modules/icon.d.ts +366 -366
- package/libs/typing/modules/rect.ts +10 -10
- package/libs/utils/base64.ts +119 -119
- package/libs/utils/calendar.js +1021 -1021
- package/libs/utils/colorGradient.ts +112 -112
- package/libs/utils/index.ts +5 -5
- package/libs/utils/inside.ts +11 -25
- package/libs/utils/inspect.ts +171 -171
- package/libs/utils/utils.ts +521 -521
- package/package.json +18 -18
- package/web-types.json +1 -1
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description 求两个颜色之间的渐变值
|
|
3
|
-
* @param {string} startColor 开始的颜色
|
|
4
|
-
* @param {string} endColor 结束的颜色
|
|
5
|
-
* @param {number} step 颜色等分的份额
|
|
6
|
-
* */
|
|
7
|
-
export const colorGradient = (
|
|
8
|
-
startColor: string = "rgb(0, 0, 0)",
|
|
9
|
-
endColor: string = "rgb(255, 255, 255)",
|
|
10
|
-
step: number = 100,
|
|
11
|
-
): any[] => {
|
|
12
|
-
const startRGB = hexToRgb(startColor, false); // 转换为rgb数组模式
|
|
13
|
-
|
|
14
|
-
const endRGB = hexToRgb(endColor, false);
|
|
15
|
-
|
|
16
|
-
if (typeof startRGB !== "string" && typeof endRGB !== "string") {
|
|
17
|
-
const startR = startRGB[0];
|
|
18
|
-
const startG = startRGB[1];
|
|
19
|
-
const startB = startRGB[2];
|
|
20
|
-
|
|
21
|
-
const endR = endRGB[0];
|
|
22
|
-
const endG = endRGB[1];
|
|
23
|
-
const endB = endRGB[2];
|
|
24
|
-
|
|
25
|
-
const sR = (endR - startR) / step; // 总差值
|
|
26
|
-
const sG = (endG - startG) / step;
|
|
27
|
-
const sB = (endB - startB) / step;
|
|
28
|
-
const colorArr = [];
|
|
29
|
-
for (let i = 0; i < step; i++) {
|
|
30
|
-
// 计算每一步的hex值
|
|
31
|
-
let hex = rgbToHex(
|
|
32
|
-
`rgb(${Math.round(sR * i + startR)},${Math.round(sG * i + startG)},${Math.round(
|
|
33
|
-
sB * i + startB,
|
|
34
|
-
)})`,
|
|
35
|
-
);
|
|
36
|
-
// 确保第一个颜色值为startColor的值
|
|
37
|
-
if (i === 0) hex = rgbToHex(startColor);
|
|
38
|
-
// 确保最后一个颜色值为endColor的值
|
|
39
|
-
if (i === step - 1) hex = rgbToHex(endColor);
|
|
40
|
-
colorArr.push(hex);
|
|
41
|
-
}
|
|
42
|
-
return colorArr;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
return [];
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
|
|
49
|
-
export function hexToRgb(sColor: string, str = true): string | number[] {
|
|
50
|
-
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
51
|
-
sColor = String(sColor).toLowerCase();
|
|
52
|
-
if (sColor && reg.test(sColor)) {
|
|
53
|
-
if (sColor.length === 4) {
|
|
54
|
-
let sColorNew = "#";
|
|
55
|
-
for (let i = 1; i < 4; i += 1) {
|
|
56
|
-
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
|
|
57
|
-
}
|
|
58
|
-
sColor = sColorNew;
|
|
59
|
-
}
|
|
60
|
-
// 处理六位的颜色值
|
|
61
|
-
const sColorChange = [];
|
|
62
|
-
for (let i = 1; i < 7; i += 2) {
|
|
63
|
-
sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`));
|
|
64
|
-
}
|
|
65
|
-
if (!str) {
|
|
66
|
-
return sColorChange;
|
|
67
|
-
}
|
|
68
|
-
return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`;
|
|
69
|
-
}
|
|
70
|
-
if (/^(rgb|RGB)/.test(sColor)) {
|
|
71
|
-
const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|
72
|
-
return arr.map((val) => Number(val));
|
|
73
|
-
}
|
|
74
|
-
return sColor;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// 将rgb表示方式转换为hex表示方式
|
|
78
|
-
export function rgbToHex(rgb: string) {
|
|
79
|
-
const _this = rgb;
|
|
80
|
-
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
81
|
-
if (/^(rgb|RGB)/.test(_this)) {
|
|
82
|
-
const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|
83
|
-
let strHex = "#";
|
|
84
|
-
for (let i = 0; i < aColor.length; i++) {
|
|
85
|
-
let hex = Number(aColor[i]).toString(16);
|
|
86
|
-
hex = String(hex).length == 1 ? `${0}${hex}` : hex; // 保证每个rgb的值为2位
|
|
87
|
-
if (hex === "0") {
|
|
88
|
-
hex += hex;
|
|
89
|
-
}
|
|
90
|
-
strHex += hex;
|
|
91
|
-
}
|
|
92
|
-
if (strHex.length !== 7) {
|
|
93
|
-
strHex = _this;
|
|
94
|
-
}
|
|
95
|
-
return strHex;
|
|
96
|
-
}
|
|
97
|
-
if (reg.test(_this)) {
|
|
98
|
-
const aNum = _this.replace(/#/, "").split("");
|
|
99
|
-
if (aNum.length === 6) {
|
|
100
|
-
return _this;
|
|
101
|
-
}
|
|
102
|
-
if (aNum.length === 3) {
|
|
103
|
-
let numHex = "#";
|
|
104
|
-
for (let i = 0; i < aNum.length; i += 1) {
|
|
105
|
-
numHex += aNum[i] + aNum[i];
|
|
106
|
-
}
|
|
107
|
-
return numHex;
|
|
108
|
-
}
|
|
109
|
-
} else {
|
|
110
|
-
return _this;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @description 求两个颜色之间的渐变值
|
|
3
|
+
* @param {string} startColor 开始的颜色
|
|
4
|
+
* @param {string} endColor 结束的颜色
|
|
5
|
+
* @param {number} step 颜色等分的份额
|
|
6
|
+
* */
|
|
7
|
+
export const colorGradient = (
|
|
8
|
+
startColor: string = "rgb(0, 0, 0)",
|
|
9
|
+
endColor: string = "rgb(255, 255, 255)",
|
|
10
|
+
step: number = 100,
|
|
11
|
+
): any[] => {
|
|
12
|
+
const startRGB = hexToRgb(startColor, false); // 转换为rgb数组模式
|
|
13
|
+
|
|
14
|
+
const endRGB = hexToRgb(endColor, false);
|
|
15
|
+
|
|
16
|
+
if (typeof startRGB !== "string" && typeof endRGB !== "string") {
|
|
17
|
+
const startR = startRGB[0];
|
|
18
|
+
const startG = startRGB[1];
|
|
19
|
+
const startB = startRGB[2];
|
|
20
|
+
|
|
21
|
+
const endR = endRGB[0];
|
|
22
|
+
const endG = endRGB[1];
|
|
23
|
+
const endB = endRGB[2];
|
|
24
|
+
|
|
25
|
+
const sR = (endR - startR) / step; // 总差值
|
|
26
|
+
const sG = (endG - startG) / step;
|
|
27
|
+
const sB = (endB - startB) / step;
|
|
28
|
+
const colorArr = [];
|
|
29
|
+
for (let i = 0; i < step; i++) {
|
|
30
|
+
// 计算每一步的hex值
|
|
31
|
+
let hex = rgbToHex(
|
|
32
|
+
`rgb(${Math.round(sR * i + startR)},${Math.round(sG * i + startG)},${Math.round(
|
|
33
|
+
sB * i + startB,
|
|
34
|
+
)})`,
|
|
35
|
+
);
|
|
36
|
+
// 确保第一个颜色值为startColor的值
|
|
37
|
+
if (i === 0) hex = rgbToHex(startColor);
|
|
38
|
+
// 确保最后一个颜色值为endColor的值
|
|
39
|
+
if (i === step - 1) hex = rgbToHex(endColor);
|
|
40
|
+
colorArr.push(hex);
|
|
41
|
+
}
|
|
42
|
+
return colorArr;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return [];
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
|
|
49
|
+
export function hexToRgb(sColor: string, str = true): string | number[] {
|
|
50
|
+
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
51
|
+
sColor = String(sColor).toLowerCase();
|
|
52
|
+
if (sColor && reg.test(sColor)) {
|
|
53
|
+
if (sColor.length === 4) {
|
|
54
|
+
let sColorNew = "#";
|
|
55
|
+
for (let i = 1; i < 4; i += 1) {
|
|
56
|
+
sColorNew += sColor.slice(i, i + 1).concat(sColor.slice(i, i + 1));
|
|
57
|
+
}
|
|
58
|
+
sColor = sColorNew;
|
|
59
|
+
}
|
|
60
|
+
// 处理六位的颜色值
|
|
61
|
+
const sColorChange = [];
|
|
62
|
+
for (let i = 1; i < 7; i += 2) {
|
|
63
|
+
sColorChange.push(parseInt(`0x${sColor.slice(i, i + 2)}`));
|
|
64
|
+
}
|
|
65
|
+
if (!str) {
|
|
66
|
+
return sColorChange;
|
|
67
|
+
}
|
|
68
|
+
return `rgb(${sColorChange[0]},${sColorChange[1]},${sColorChange[2]})`;
|
|
69
|
+
}
|
|
70
|
+
if (/^(rgb|RGB)/.test(sColor)) {
|
|
71
|
+
const arr = sColor.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|
72
|
+
return arr.map((val) => Number(val));
|
|
73
|
+
}
|
|
74
|
+
return sColor;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 将rgb表示方式转换为hex表示方式
|
|
78
|
+
export function rgbToHex(rgb: string) {
|
|
79
|
+
const _this = rgb;
|
|
80
|
+
const reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
|
|
81
|
+
if (/^(rgb|RGB)/.test(_this)) {
|
|
82
|
+
const aColor = _this.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
|
|
83
|
+
let strHex = "#";
|
|
84
|
+
for (let i = 0; i < aColor.length; i++) {
|
|
85
|
+
let hex = Number(aColor[i]).toString(16);
|
|
86
|
+
hex = String(hex).length == 1 ? `${0}${hex}` : hex; // 保证每个rgb的值为2位
|
|
87
|
+
if (hex === "0") {
|
|
88
|
+
hex += hex;
|
|
89
|
+
}
|
|
90
|
+
strHex += hex;
|
|
91
|
+
}
|
|
92
|
+
if (strHex.length !== 7) {
|
|
93
|
+
strHex = _this;
|
|
94
|
+
}
|
|
95
|
+
return strHex;
|
|
96
|
+
}
|
|
97
|
+
if (reg.test(_this)) {
|
|
98
|
+
const aNum = _this.replace(/#/, "").split("");
|
|
99
|
+
if (aNum.length === 6) {
|
|
100
|
+
return _this;
|
|
101
|
+
}
|
|
102
|
+
if (aNum.length === 3) {
|
|
103
|
+
let numHex = "#";
|
|
104
|
+
for (let i = 0; i < aNum.length; i += 1) {
|
|
105
|
+
numHex += aNum[i] + aNum[i];
|
|
106
|
+
}
|
|
107
|
+
return numHex;
|
|
108
|
+
}
|
|
109
|
+
} else {
|
|
110
|
+
return _this;
|
|
111
|
+
}
|
|
112
|
+
}
|
package/libs/utils/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from "./utils";
|
|
2
|
-
export * from "./inspect";
|
|
3
|
-
export * from "./base64";
|
|
4
|
-
export * from "./inside";
|
|
5
|
-
export * from "./colorGradient";
|
|
1
|
+
export * from "./utils";
|
|
2
|
+
export * from "./inspect";
|
|
3
|
+
export * from "./base64";
|
|
4
|
+
export * from "./inside";
|
|
5
|
+
export * from "./colorGradient";
|
package/libs/utils/inside.ts
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
// 内部使用方法
|
|
2
|
-
import { inject } from 'vue'
|
|
3
|
-
|
|
4
1
|
/**
|
|
5
2
|
* 生成bem规则类名
|
|
6
3
|
* 由于微信小程序,H5,nvue之间绑定class的差异,无法通过:class="[bem()]"的形式进行同用
|
|
@@ -44,21 +41,6 @@ export const bem = (
|
|
|
44
41
|
)
|
|
45
42
|
}
|
|
46
43
|
|
|
47
|
-
/**
|
|
48
|
-
* @description 在u-form的子组件内容发生变化,或者失去焦点时,尝试通知u-form执行校验方法
|
|
49
|
-
* @param {*} instance
|
|
50
|
-
* @param {*} event
|
|
51
|
-
*/
|
|
52
|
-
export function formValidate(event) {
|
|
53
|
-
// const formItem = $parent.call(instance, "u-form-item");
|
|
54
|
-
const form = inject('uForm')
|
|
55
|
-
// 如果发生变化的input或者textarea等,其父组件中有u-form-item或者u-form等,就执行form的validate方法
|
|
56
|
-
// 同时将form-item的pros传递给form,让其进行精确对象验证
|
|
57
|
-
// if (formItem && form) {
|
|
58
|
-
// form.validateField(formItem.prop, () => {}, event);
|
|
59
|
-
// }
|
|
60
|
-
}
|
|
61
|
-
|
|
62
44
|
/**
|
|
63
45
|
* @description error提示
|
|
64
46
|
* @param {*} err 错误内容
|
|
@@ -70,7 +52,11 @@ export function error(err: string) {
|
|
|
70
52
|
}
|
|
71
53
|
}
|
|
72
54
|
|
|
73
|
-
|
|
55
|
+
/**
|
|
56
|
+
* 定时器同步执行,等待时间
|
|
57
|
+
* @param {Number} value 等待时间
|
|
58
|
+
*/
|
|
59
|
+
export const sleep = (value: number = 100) => {
|
|
74
60
|
return new Promise((resolve) => {
|
|
75
61
|
setTimeout(() => {
|
|
76
62
|
resolve(null)
|
|
@@ -80,10 +66,10 @@ export const sleep = (value = 100) => {
|
|
|
80
66
|
|
|
81
67
|
/**
|
|
82
68
|
* @param {Number} len uuid的长度
|
|
83
|
-
* @param {Boolean} firstU 将返回的首字母置为"
|
|
84
|
-
* @param {
|
|
69
|
+
* @param {Boolean} firstU 将返回的首字母置为"hy"
|
|
70
|
+
* @param {Number | Null} radix 生成uuid的基数(意味着返回的字符串都是这个基数),2-二进制,8-八进制,10-十进制,16-十六进制
|
|
85
71
|
*/
|
|
86
|
-
export function guid(len = 32, firstU = true, radix = null) {
|
|
72
|
+
export function guid(len: number = 32, firstU: boolean = true, radix: number | null = null) {
|
|
87
73
|
const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
|
|
88
74
|
const uuid = []
|
|
89
75
|
radix = radix || chars.length
|
|
@@ -304,9 +290,9 @@ export function chooseFile({
|
|
|
304
290
|
*/
|
|
305
291
|
export function priceFormat(
|
|
306
292
|
number: string | number,
|
|
307
|
-
decimals = 0,
|
|
308
|
-
decimalPoint = '.',
|
|
309
|
-
thousandsSeparator = ','
|
|
293
|
+
decimals: number = 0,
|
|
294
|
+
decimalPoint: string = '.',
|
|
295
|
+
thousandsSeparator: string = ','
|
|
310
296
|
) {
|
|
311
297
|
number = `${number}`.replace(/[^0-9+-Ee.]/g, '')
|
|
312
298
|
const n = !isFinite(+number) ? 0 : +number
|
package/libs/utils/inspect.ts
CHANGED
|
@@ -1,171 +1,171 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @description 判断字符串是否是数字
|
|
3
|
-
* @param {String | Number} text 值
|
|
4
|
-
* @return {Boolean}
|
|
5
|
-
* */
|
|
6
|
-
export const isNumericString = (text: string | number): boolean => {
|
|
7
|
-
return typeof text === "string" && !isNaN(Number(text));
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* @description 判断是否是数字
|
|
12
|
-
* @param {String | Number} text 值
|
|
13
|
-
* @return {Boolean}
|
|
14
|
-
* */
|
|
15
|
-
export const isNumber = (text: string | number): boolean => {
|
|
16
|
-
return typeof text === "number" || isNumericString(text);
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @description 判断是否数组
|
|
21
|
-
* @param {any} arr 传入数组值
|
|
22
|
-
* @return {Boolean}
|
|
23
|
-
*/
|
|
24
|
-
export const isArray = (arr: any): arr is Array<any> => {
|
|
25
|
-
// 如果 Array.isArray 函数可用,直接使用该函数检查
|
|
26
|
-
if (typeof Array.isArray === "function") {
|
|
27
|
-
return Array.isArray(arr);
|
|
28
|
-
}
|
|
29
|
-
// 否则,使用对象原型的 toString 方法进行检查
|
|
30
|
-
return Object.prototype.toString.call(arr) === "[object Array]";
|
|
31
|
-
};
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* @description 判断是否对象
|
|
35
|
-
* @param obj 传入对象值
|
|
36
|
-
* @return {Boolean}
|
|
37
|
-
*/
|
|
38
|
-
export const isObject = (obj: any): obj is Object => {
|
|
39
|
-
return Object.prototype.toString.call(obj) === "[object Object]";
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* @description 是否为base64图片
|
|
44
|
-
* @param {String} url
|
|
45
|
-
* @return
|
|
46
|
-
*/
|
|
47
|
-
export function isBase64Image(url: string) {
|
|
48
|
-
// 使用正则表达式检查URL是否以"data:image"开头,这是Base64图片的常见前缀
|
|
49
|
-
return /^data:image\/(png|jpg|jpeg|gif|bmp);base64,/.test(url);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* @description 是否图片
|
|
54
|
-
* @param {String} url
|
|
55
|
-
* @return
|
|
56
|
-
*/
|
|
57
|
-
export function isImage(url: string) {
|
|
58
|
-
// 使用正则表达式检查URL是否以"data:image"开头,这是Base64图片的常见前缀
|
|
59
|
-
return /(\.jpg|\.jpeg|\.png|\.gif|\.bmp|\.webp)$/i.test(url);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* 是否视频格式
|
|
64
|
-
* @param {String} value
|
|
65
|
-
*/
|
|
66
|
-
export function isVideo(value: string): boolean {
|
|
67
|
-
const VIDEO_REGEXP =
|
|
68
|
-
/\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;
|
|
69
|
-
return VIDEO_REGEXP.test(value);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* 判断是否是日期格式
|
|
74
|
-
* @param {Number | String} value yyyy-mm-dd hh:mm:ss 或 时间戳
|
|
75
|
-
*/
|
|
76
|
-
export const isDate = (value: string | number) => {
|
|
77
|
-
if (!value) return false;
|
|
78
|
-
// number类型,判断是否是时间戳
|
|
79
|
-
if (typeof value === "number") {
|
|
80
|
-
// len === 10 秒级时间戳 len === 13 毫秒级时间戳
|
|
81
|
-
if (value.toString().length !== 10 && value.toString().length !== 13) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
return !isNaN(new Date(value).getTime());
|
|
85
|
-
}
|
|
86
|
-
if (typeof value === "string") {
|
|
87
|
-
// 是否为string类型时间戳
|
|
88
|
-
const numV = Number(value);
|
|
89
|
-
if (!isNaN(numV)) {
|
|
90
|
-
if (numV.toString().length === 10 || numV.toString().length === 13) {
|
|
91
|
-
return !isNaN(new Date(numV).getTime());
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// 非时间戳,且长度在yyyy-mm-dd 至 yyyy-mm-dd hh:mm:ss 之间
|
|
95
|
-
if (value.length < 10 || value.length > 19) {
|
|
96
|
-
return false;
|
|
97
|
-
}
|
|
98
|
-
const dateRegex = /^\d{4}[-\/]\d{2}[-\/]\d{2}( \d{1,2}:\d{2}(:\d{2})?)?$/;
|
|
99
|
-
if (!dateRegex.test(value)) {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
// 检查是否为有效日期
|
|
103
|
-
const dateValue = new Date(value);
|
|
104
|
-
return !isNaN(dateValue.getTime());
|
|
105
|
-
}
|
|
106
|
-
// 非number和string类型,不做校验
|
|
107
|
-
return false;
|
|
108
|
-
};
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* @description 验证是否是手机号格式
|
|
112
|
-
* @param {unknown} phone 手机号
|
|
113
|
-
*/
|
|
114
|
-
export const isPhone = (phone: unknown): boolean => {
|
|
115
|
-
if (typeof phone !== "string" && typeof phone !== "number") return false;
|
|
116
|
-
if (phone === "") return false;
|
|
117
|
-
|
|
118
|
-
const phoneStr = String(phone).trim();
|
|
119
|
-
// 处理 +86 12345678901 格式
|
|
120
|
-
const normalized = phoneStr.replace(/^\+86\s?/, "");
|
|
121
|
-
return /^1[3-9]\d{9}$/.test(normalized) && normalized.length === 11;
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* @description 验证身份证号码
|
|
126
|
-
* @param {unknown} idCard 身份证号
|
|
127
|
-
* @return {Boolean}
|
|
128
|
-
*/
|
|
129
|
-
export const isIdCard = (idCard: unknown): boolean => {
|
|
130
|
-
if (typeof idCard !== "string" && typeof idCard !== "number") return false;
|
|
131
|
-
const str = String(idCard).trim().toUpperCase();
|
|
132
|
-
|
|
133
|
-
// 格式校验:15位或18位
|
|
134
|
-
if (!/(^\d{15}$)|(^\d{17}[\dX]$)/.test(str)) return false;
|
|
135
|
-
|
|
136
|
-
// 18位身份证:校验校验码
|
|
137
|
-
if (str.length === 18) {
|
|
138
|
-
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
|
139
|
-
const checksums = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
|
|
140
|
-
|
|
141
|
-
let sum = 0;
|
|
142
|
-
for (let i = 0; i < 17; i++) {
|
|
143
|
-
sum += parseInt(str[i]) * weights[i];
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
return checksums[sum % 11] === str[17];
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return true; // 15位不校验
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* @description 验证是否是中文
|
|
154
|
-
* @param {String} zh 校验值
|
|
155
|
-
* @return {Boolean}
|
|
156
|
-
*/
|
|
157
|
-
export const isChinese = (zh: string): boolean => {
|
|
158
|
-
const reg = /^[\u4e00-\u9fa5]+$/gi;
|
|
159
|
-
return reg.test(zh);
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* @description 判断环境是否是H5
|
|
164
|
-
*/
|
|
165
|
-
export const isH5 = (() => {
|
|
166
|
-
let isH5 = false;
|
|
167
|
-
// #ifdef H5
|
|
168
|
-
isH5 = true;
|
|
169
|
-
// #endif
|
|
170
|
-
return isH5;
|
|
171
|
-
})();
|
|
1
|
+
/**
|
|
2
|
+
* @description 判断字符串是否是数字
|
|
3
|
+
* @param {String | Number} text 值
|
|
4
|
+
* @return {Boolean}
|
|
5
|
+
* */
|
|
6
|
+
export const isNumericString = (text: string | number): boolean => {
|
|
7
|
+
return typeof text === "string" && !isNaN(Number(text));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @description 判断是否是数字
|
|
12
|
+
* @param {String | Number} text 值
|
|
13
|
+
* @return {Boolean}
|
|
14
|
+
* */
|
|
15
|
+
export const isNumber = (text: string | number): boolean => {
|
|
16
|
+
return typeof text === "number" || isNumericString(text);
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @description 判断是否数组
|
|
21
|
+
* @param {any} arr 传入数组值
|
|
22
|
+
* @return {Boolean}
|
|
23
|
+
*/
|
|
24
|
+
export const isArray = (arr: any): arr is Array<any> => {
|
|
25
|
+
// 如果 Array.isArray 函数可用,直接使用该函数检查
|
|
26
|
+
if (typeof Array.isArray === "function") {
|
|
27
|
+
return Array.isArray(arr);
|
|
28
|
+
}
|
|
29
|
+
// 否则,使用对象原型的 toString 方法进行检查
|
|
30
|
+
return Object.prototype.toString.call(arr) === "[object Array]";
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @description 判断是否对象
|
|
35
|
+
* @param obj 传入对象值
|
|
36
|
+
* @return {Boolean}
|
|
37
|
+
*/
|
|
38
|
+
export const isObject = (obj: any): obj is Object => {
|
|
39
|
+
return Object.prototype.toString.call(obj) === "[object Object]";
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* @description 是否为base64图片
|
|
44
|
+
* @param {String} url
|
|
45
|
+
* @return
|
|
46
|
+
*/
|
|
47
|
+
export function isBase64Image(url: string) {
|
|
48
|
+
// 使用正则表达式检查URL是否以"data:image"开头,这是Base64图片的常见前缀
|
|
49
|
+
return /^data:image\/(png|jpg|jpeg|gif|bmp);base64,/.test(url);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @description 是否图片
|
|
54
|
+
* @param {String} url
|
|
55
|
+
* @return
|
|
56
|
+
*/
|
|
57
|
+
export function isImage(url: string) {
|
|
58
|
+
// 使用正则表达式检查URL是否以"data:image"开头,这是Base64图片的常见前缀
|
|
59
|
+
return /(\.jpg|\.jpeg|\.png|\.gif|\.bmp|\.webp)$/i.test(url);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 是否视频格式
|
|
64
|
+
* @param {String} value
|
|
65
|
+
*/
|
|
66
|
+
export function isVideo(value: string): boolean {
|
|
67
|
+
const VIDEO_REGEXP =
|
|
68
|
+
/\.(mp4|mpg|mpeg|dat|asf|avi|rm|rmvb|mov|wmv|flv|mkv|m3u8)/i;
|
|
69
|
+
return VIDEO_REGEXP.test(value);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* 判断是否是日期格式
|
|
74
|
+
* @param {Number | String} value yyyy-mm-dd hh:mm:ss 或 时间戳
|
|
75
|
+
*/
|
|
76
|
+
export const isDate = (value: string | number) => {
|
|
77
|
+
if (!value) return false;
|
|
78
|
+
// number类型,判断是否是时间戳
|
|
79
|
+
if (typeof value === "number") {
|
|
80
|
+
// len === 10 秒级时间戳 len === 13 毫秒级时间戳
|
|
81
|
+
if (value.toString().length !== 10 && value.toString().length !== 13) {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
return !isNaN(new Date(value).getTime());
|
|
85
|
+
}
|
|
86
|
+
if (typeof value === "string") {
|
|
87
|
+
// 是否为string类型时间戳
|
|
88
|
+
const numV = Number(value);
|
|
89
|
+
if (!isNaN(numV)) {
|
|
90
|
+
if (numV.toString().length === 10 || numV.toString().length === 13) {
|
|
91
|
+
return !isNaN(new Date(numV).getTime());
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// 非时间戳,且长度在yyyy-mm-dd 至 yyyy-mm-dd hh:mm:ss 之间
|
|
95
|
+
if (value.length < 10 || value.length > 19) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
const dateRegex = /^\d{4}[-\/]\d{2}[-\/]\d{2}( \d{1,2}:\d{2}(:\d{2})?)?$/;
|
|
99
|
+
if (!dateRegex.test(value)) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
// 检查是否为有效日期
|
|
103
|
+
const dateValue = new Date(value);
|
|
104
|
+
return !isNaN(dateValue.getTime());
|
|
105
|
+
}
|
|
106
|
+
// 非number和string类型,不做校验
|
|
107
|
+
return false;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @description 验证是否是手机号格式
|
|
112
|
+
* @param {unknown} phone 手机号
|
|
113
|
+
*/
|
|
114
|
+
export const isPhone = (phone: unknown): boolean => {
|
|
115
|
+
if (typeof phone !== "string" && typeof phone !== "number") return false;
|
|
116
|
+
if (phone === "") return false;
|
|
117
|
+
|
|
118
|
+
const phoneStr = String(phone).trim();
|
|
119
|
+
// 处理 +86 12345678901 格式
|
|
120
|
+
const normalized = phoneStr.replace(/^\+86\s?/, "");
|
|
121
|
+
return /^1[3-9]\d{9}$/.test(normalized) && normalized.length === 11;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @description 验证身份证号码
|
|
126
|
+
* @param {unknown} idCard 身份证号
|
|
127
|
+
* @return {Boolean}
|
|
128
|
+
*/
|
|
129
|
+
export const isIdCard = (idCard: unknown): boolean => {
|
|
130
|
+
if (typeof idCard !== "string" && typeof idCard !== "number") return false;
|
|
131
|
+
const str = String(idCard).trim().toUpperCase();
|
|
132
|
+
|
|
133
|
+
// 格式校验:15位或18位
|
|
134
|
+
if (!/(^\d{15}$)|(^\d{17}[\dX]$)/.test(str)) return false;
|
|
135
|
+
|
|
136
|
+
// 18位身份证:校验校验码
|
|
137
|
+
if (str.length === 18) {
|
|
138
|
+
const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
|
|
139
|
+
const checksums = ["1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"];
|
|
140
|
+
|
|
141
|
+
let sum = 0;
|
|
142
|
+
for (let i = 0; i < 17; i++) {
|
|
143
|
+
sum += parseInt(str[i]) * weights[i];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return checksums[sum % 11] === str[17];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return true; // 15位不校验
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @description 验证是否是中文
|
|
154
|
+
* @param {String} zh 校验值
|
|
155
|
+
* @return {Boolean}
|
|
156
|
+
*/
|
|
157
|
+
export const isChinese = (zh: string): boolean => {
|
|
158
|
+
const reg = /^[\u4e00-\u9fa5]+$/gi;
|
|
159
|
+
return reg.test(zh);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @description 判断环境是否是H5
|
|
164
|
+
*/
|
|
165
|
+
export const isH5 = (() => {
|
|
166
|
+
let isH5 = false;
|
|
167
|
+
// #ifdef H5
|
|
168
|
+
isH5 = true;
|
|
169
|
+
// #endif
|
|
170
|
+
return isH5;
|
|
171
|
+
})();
|