@neatui/nuxt 0.1.0 → 1.0.0
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/BUILD.md +128 -0
- package/README.md +98 -1
- package/SSR_COMPATIBILITY.md +201 -0
- package/USAGE.md +260 -0
- package/nuxt.config.example.ts +37 -0
- package/package.json +29 -11
- package/src/components/basic/IDraggable.vue +87 -65
- package/src/components/basic/IFollowView.vue +32 -23
- package/src/components/basic/IRouterView.vue +38 -23
- package/src/components/basic/IScrollView.vue +11 -7
- package/src/components/basic/Icon.vue +17 -17
- package/src/components/basic/LayerView/Layer.vue +33 -106
- package/src/components/basic/follow.ts +133 -0
- package/src/components/display/Calendar.vue +14 -14
- package/src/components/display/CalendarReg.vue +14 -14
- package/src/components/display/Image.vue +8 -8
- package/src/components/display/PhotoEditor.vue +36 -36
- package/src/components/display/PhotoViewer.vue +8 -8
- package/src/components/display/Tree.vue +6 -6
- package/src/components/display/TreeView.vue +4 -4
- package/src/components/display/index.ts +2 -2
- package/src/components/form/Cascader.vue +19 -19
- package/src/components/form/Checkbox.vue +64 -0
- package/src/components/form/DatePicker.vue +6 -7
- package/src/components/form/DateRangePicker@v3.vue +4 -4
- package/src/components/form/DateRangeView@v3.vue +18 -19
- package/src/components/form/DateView.vue +14 -14
- package/src/components/form/DateView@v2.vue +14 -14
- package/src/components/form/DateView@v3.vue +331 -318
- package/src/components/form/ImgUpload.vue +7 -7
- package/src/components/form/Input@v3.vue +11 -11
- package/src/components/form/MoreSelect@v3.vue +87 -17
- package/src/components/form/MoreSelectList.vue +8 -8
- package/src/components/form/MoreSelectPanel@v3.vue +3 -3
- package/src/components/form/MoreSelectPicker.vue +7 -7
- package/src/components/form/MoreSelectTags.vue +8 -8
- package/src/components/form/PageMoreSelect.vue +14 -14
- package/src/components/form/PageSelect.vue +16 -16
- package/src/components/form/SearchMoreSelect.vue +12 -12
- package/src/components/form/SearchSelect@v3.vue +3 -3
- package/src/components/form/Select@v3.vue +229 -23
- package/src/components/form/SelectList.vue +8 -8
- package/src/components/form/SelectPicker.vue +6 -6
- package/src/components/form/SelectTags.vue +7 -7
- package/src/components/form/SelectTree/SelectTree@v1.vue +5 -5
- package/src/components/form/Switch.vue +38 -103
- package/src/components/form/TextArea.vue +18 -18
- package/src/components/form/Textarea@v2.vue +275 -0
- package/src/components/form/TimeView.vue +14 -14
- package/src/components/form/Upload.vue +806 -297
- package/src/components/form/date.ts +321 -0
- package/src/components/form/index.ts +7 -5
- package/src/components/form/number.ts +3 -0
- package/src/components/form/type.ts +224 -0
- package/src/components/icon/OrderIcon.vue +113 -0
- package/src/components/loader/FormLoader/FormLoader@v2.vue +193 -195
- package/src/components/loader/FormLoader/FormLoader@v3.vue.backup +372 -291
- package/src/components/loader/FormLoader/FormRender@v3.vue.backup +4 -0
- package/src/components/loader/FormLoader/NodeLoader.vue +85 -0
- package/src/components/loader/FormLoader@v1/FormLoader.vue +1 -1
- package/src/components/loader/FormLoader@v1/FormRender.vue +49 -24
- package/src/components/loader/LayerLoader/LayerLoader.vue +318 -0
- package/src/components/loader/LayerLoader/index.ts +2 -0
- package/src/components/loader/LayerLoader/style.scss +77 -0
- package/src/components/loader/LimitLoader/LimitLoader@v3.vue +39 -28
- package/src/components/loader/MoveLoader/MoveLoader.vue +628 -0
- package/src/components/loader/MoveLoader/index.ts +2 -0
- package/src/components/loader/MoveLoader/style.scss +77 -0
- package/src/components/loader/TableLoader/TableLoader.vue +227 -195
- package/src/components/loader/TableLoader/TableRender.vue +141 -0
- package/src/components/loader/TableLoader/index.ts +47 -0
- package/src/components/loader/index.ts +3 -2
- package/src/components/tools/Pagination@a.vue +17 -18
- package/src/components/tools/Pagination@b.vue +16 -16
- package/src/index.ts +2 -1
- package/src/module.ts +169 -0
- package/src/runtime/types.d.ts +36 -0
- package/src/store/{myui.ts → frame.ts} +4 -4
- package/src/utils/theme.ts +14 -0
- package/tsconfig.json +1 -1
- package/src/components/loader/FormLoader/index.ts +0 -2
- package/src/components/loader/LimitLoader/LimitLoader.vue.backup +0 -131
- package/src/components/loader/LimitLoader/LimitLoader@v2.vue.backup +0 -174
- package/src/components/loader/TableLoader/TableColView.vue +0 -115
@@ -0,0 +1,321 @@
|
|
1
|
+
import { isDate, isDateString, isNumber, isString } from './type';
|
2
|
+
import { numfill } from './number';
|
3
|
+
|
4
|
+
interface UpdateParam {
|
5
|
+
y?: number;
|
6
|
+
m?: number;
|
7
|
+
d?: number;
|
8
|
+
h?: number;
|
9
|
+
n?: number;
|
10
|
+
s?: number;
|
11
|
+
}
|
12
|
+
|
13
|
+
interface CalendarParam {
|
14
|
+
group?: boolean;
|
15
|
+
value?: Array<string>;
|
16
|
+
}
|
17
|
+
|
18
|
+
export default class IDate {
|
19
|
+
source: any = '';
|
20
|
+
attr: any;
|
21
|
+
lang: any;
|
22
|
+
date: any;
|
23
|
+
time: any;
|
24
|
+
year: any;
|
25
|
+
month: any;
|
26
|
+
days: number;
|
27
|
+
valid: boolean;
|
28
|
+
constructor(lang: any = 'zh') {
|
29
|
+
this.lang = lang;
|
30
|
+
this.days = 0;
|
31
|
+
this.valid = false;
|
32
|
+
}
|
33
|
+
// 生成日期
|
34
|
+
create(obj?: any, opts: any = {}) {
|
35
|
+
const zone = opts.zone || '';
|
36
|
+
|
37
|
+
// 统一预处理:如果是字符串就先把-替换成/,解决iOS兼容性
|
38
|
+
if (isString(obj)) {
|
39
|
+
obj = obj.replace(/-/g, '/');
|
40
|
+
|
41
|
+
// 明确格式处理
|
42
|
+
if (opts.format) {
|
43
|
+
const [a1, a2, a3] = obj.split(/[-/]/).map((i: any) => i.length);
|
44
|
+
const [b1, b2, b3] = opts.format?.split(/[-/]/).map((i: any) => i.length);
|
45
|
+
if (a1 === b1 && a2 === b2 && a3 === b3) {
|
46
|
+
obj = `${a1 || '01'}/${a2 || '01'}/${a3 || '01'}`;
|
47
|
+
} else {
|
48
|
+
console.warn(`${obj} is not a valid date`);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
// 不合法日期是否应该抛出错误?
|
54
|
+
if (!isDate(obj) && !isDateString(obj)) {
|
55
|
+
console.log(53, obj);
|
56
|
+
console.warn(`${obj} is not a valid date`);
|
57
|
+
} else {
|
58
|
+
this.valid = true;
|
59
|
+
}
|
60
|
+
|
61
|
+
function utc(obj: any) {
|
62
|
+
if (!isString(obj)) {
|
63
|
+
return new Date();
|
64
|
+
}
|
65
|
+
const parts = obj.split(/[-/]/).map(Number);
|
66
|
+
const [year, month, day] = parts;
|
67
|
+
return new Date(Date.UTC(year, month - 1, day));
|
68
|
+
}
|
69
|
+
|
70
|
+
// 如果是10位时间戳
|
71
|
+
if (isNumber(obj)) {
|
72
|
+
const _len = obj?.toString()?.length;
|
73
|
+
if (_len === 10) {
|
74
|
+
obj = obj * 1000;
|
75
|
+
} else if (_len === 11) {
|
76
|
+
obj = obj * 100;
|
77
|
+
} else if (_len === 12) {
|
78
|
+
obj = obj * 10;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
// 判断是否有入参
|
82
|
+
if (obj === undefined) {
|
83
|
+
obj = new Date();
|
84
|
+
}
|
85
|
+
// 判断是否是日期
|
86
|
+
if (obj) {
|
87
|
+
this.source = obj;
|
88
|
+
const date = isDate(obj) ? obj : isDateString(obj) ? (isString(obj) ? (zone === 'utc' ? utc(obj) : new Date(obj)) : new Date(obj)) : new Date();
|
89
|
+
|
90
|
+
this.date = date;
|
91
|
+
const cnWeek = ['日', '一', '二', '三', '四', '五', '六'];
|
92
|
+
this.time = date.getTime();
|
93
|
+
|
94
|
+
this.attr = {
|
95
|
+
time: date.getTime(),
|
96
|
+
year: date.getFullYear(),
|
97
|
+
YYYY: date.getFullYear(),
|
98
|
+
yyyy: date.getFullYear(),
|
99
|
+
YY: `${date.getFullYear()}`.slice(-2),
|
100
|
+
yy: `${date.getFullYear()}`.slice(-2),
|
101
|
+
Y: date.getFullYear(),
|
102
|
+
y: date.getFullYear(),
|
103
|
+
month: date.getMonth() + 1,
|
104
|
+
MM: numfill(date.getMonth() + 1),
|
105
|
+
M: date.getMonth() + 1,
|
106
|
+
DD: numfill(date.getDate()),
|
107
|
+
dd: numfill(date.getDate()),
|
108
|
+
D: date.getDate(),
|
109
|
+
date: date.getDate(),
|
110
|
+
d: date.getDate(),
|
111
|
+
H: date.getHours(),
|
112
|
+
h: date.getHours() > 12 ? date.getHours() - 12 : date.getHours(),
|
113
|
+
HH: numfill(date.getHours()),
|
114
|
+
hh: numfill(date.getHours()),
|
115
|
+
mm: numfill(date.getMinutes()),
|
116
|
+
m: date.getMinutes(),
|
117
|
+
ss: numfill(date.getSeconds()),
|
118
|
+
s: date.getSeconds(),
|
119
|
+
w: date.getDay(),
|
120
|
+
W: cnWeek[date.getDay()],
|
121
|
+
};
|
122
|
+
// 本月天数
|
123
|
+
this.days = new Date(this.attr.y, this.attr.M, 0).getDate();
|
124
|
+
}
|
125
|
+
return this;
|
126
|
+
}
|
127
|
+
|
128
|
+
// 日期格式
|
129
|
+
format(format = 'YYYY-MM-DD') {
|
130
|
+
if (this.date) {
|
131
|
+
return format.replace(/(YYYY|yyyy|YY|yy|MM|M|DD|dd|D|d|HH|hh|H|h|mm|m|ss|s|w)/g, (_: any, key: any) => this.attr[key]);
|
132
|
+
} else {
|
133
|
+
return this.source;
|
134
|
+
}
|
135
|
+
}
|
136
|
+
|
137
|
+
// 时间更新
|
138
|
+
update(obj: UpdateParam) {
|
139
|
+
if (this.date) {
|
140
|
+
const { y = 0, m = 0, d = 0, h = 0, n = 0, s = 0 }: any = obj || {};
|
141
|
+
if (y) {
|
142
|
+
this.date.setFullYear(this.date.getFullYear() + y);
|
143
|
+
}
|
144
|
+
if (m) {
|
145
|
+
this.date.setMonth(this.date.getMonth() + m);
|
146
|
+
}
|
147
|
+
if (d) {
|
148
|
+
this.date.setDate(this.date.getDate() + d);
|
149
|
+
}
|
150
|
+
if (h) {
|
151
|
+
this.date.setHours(this.date.getHours() + h);
|
152
|
+
}
|
153
|
+
if (n) {
|
154
|
+
this.date.setMinutes(this.date.getMinutes() + n);
|
155
|
+
}
|
156
|
+
if (s) {
|
157
|
+
this.date.setSeconds(this.date.getSeconds() + s);
|
158
|
+
}
|
159
|
+
this.create(this.date);
|
160
|
+
}
|
161
|
+
return this;
|
162
|
+
}
|
163
|
+
|
164
|
+
// 人性化
|
165
|
+
humanized(words: any = {}) {
|
166
|
+
if (this.date) {
|
167
|
+
const now = new Date();
|
168
|
+
const diff = now.getTime() - this.date.getTime();
|
169
|
+
const minute = 60 * 1000;
|
170
|
+
const hour = 60 * minute;
|
171
|
+
const day = 24 * hour;
|
172
|
+
const week = 7 * day;
|
173
|
+
const month = 30 * day;
|
174
|
+
const year = 365 * day;
|
175
|
+
|
176
|
+
const {
|
177
|
+
NOW = 'Just now',
|
178
|
+
MIN = ' minute ago',
|
179
|
+
HRS = ' hour ago',
|
180
|
+
DAY = ' day ago',
|
181
|
+
WKS = ' week ago',
|
182
|
+
MON = ' month ago',
|
183
|
+
YRS = ' year ago',
|
184
|
+
MINS = ' minutes ago',
|
185
|
+
HRSS = ' hours ago',
|
186
|
+
DAYS = ' days ago',
|
187
|
+
WKSS = ' weeks ago',
|
188
|
+
MONS = ' months ago',
|
189
|
+
YRSS = ' years ago',
|
190
|
+
}: any = words || {};
|
191
|
+
|
192
|
+
if (diff < minute) {
|
193
|
+
return NOW;
|
194
|
+
} else if (diff < hour) {
|
195
|
+
const minutes = Math.floor(diff / minute);
|
196
|
+
return `${minutes}${minutes > 1 ? MINS : MIN}`;
|
197
|
+
} else if (diff < day) {
|
198
|
+
const hours = Math.floor(diff / hour);
|
199
|
+
return `${hours}${hours > 1 ? HRSS : HRS}`;
|
200
|
+
} else if (diff < week) {
|
201
|
+
const days = Math.floor(diff / day);
|
202
|
+
return `${days}${days > 1 ? DAYS : DAY}`;
|
203
|
+
} else if (diff < month) {
|
204
|
+
const weeks = Math.floor(diff / week);
|
205
|
+
return `${weeks}${weeks > 1 ? WKSS : WKS}`;
|
206
|
+
} else if (diff < year) {
|
207
|
+
const months = Math.floor(diff / month);
|
208
|
+
return `${months}${months > 1 ? MONS : MON}`;
|
209
|
+
} else {
|
210
|
+
const years = Math.floor(diff / year);
|
211
|
+
return `${years}${years > 1 ? YRSS : YRS}`;
|
212
|
+
}
|
213
|
+
} else {
|
214
|
+
return this.source;
|
215
|
+
}
|
216
|
+
}
|
217
|
+
|
218
|
+
// 日历
|
219
|
+
calendar(param: CalendarParam = {}) {
|
220
|
+
if (!this.date) {
|
221
|
+
this.create(new Date());
|
222
|
+
}
|
223
|
+
const { group = false, value = [] }: any = param;
|
224
|
+
const values: any = value
|
225
|
+
.filter((day: any) => {
|
226
|
+
return day && isDateString(day);
|
227
|
+
})
|
228
|
+
.sort((a: any, b: any) => {
|
229
|
+
return idate(a).time - idate(b).time;
|
230
|
+
})
|
231
|
+
.map((day: any) => idate(day).format('YYYY-MM-DD'));
|
232
|
+
|
233
|
+
// 年
|
234
|
+
const y: any = this.date?.getFullYear();
|
235
|
+
// 月
|
236
|
+
const m: any = this.date?.getMonth() + 1;
|
237
|
+
// 本月第一天星期几
|
238
|
+
const w = new Date(y, m - 1, 1).getDay();
|
239
|
+
// 当前月份一共几天
|
240
|
+
const days = new Date(y, m, 0).getDate();
|
241
|
+
|
242
|
+
// 当前
|
243
|
+
const curr = new Date();
|
244
|
+
const curr_y = curr.getFullYear();
|
245
|
+
const curr_m = curr.getMonth() + 1;
|
246
|
+
const curr_d = curr.getDate();
|
247
|
+
|
248
|
+
// 上月
|
249
|
+
const last = new Date(y, m - 1, 0);
|
250
|
+
const last_y = last.getFullYear();
|
251
|
+
const last_m = last.getMonth() + 1;
|
252
|
+
let prevdays = last.getDate();
|
253
|
+
|
254
|
+
// 下月
|
255
|
+
const next = new Date(y, m + 1, 0);
|
256
|
+
const next_y = next.getFullYear();
|
257
|
+
const next_m = next.getMonth() + 1;
|
258
|
+
const _calendar: any = [];
|
259
|
+
|
260
|
+
// 上月的日期
|
261
|
+
for (let i = 0; i < w; i++) {
|
262
|
+
_calendar.unshift({
|
263
|
+
date: `${last_y}-${numfill(last_m)}-${numfill(prevdays)}`,
|
264
|
+
day: prevdays,
|
265
|
+
isLastMonth: true,
|
266
|
+
});
|
267
|
+
prevdays = prevdays - 1;
|
268
|
+
}
|
269
|
+
|
270
|
+
// 本月的日期
|
271
|
+
for (let d = 1; d <= days; d++) {
|
272
|
+
_calendar.push({
|
273
|
+
date: `${y}-${numfill(m)}-${numfill(d)}`,
|
274
|
+
day: d,
|
275
|
+
today: curr_y === y && curr_m === m && curr_d === d,
|
276
|
+
isCurrMonth: true,
|
277
|
+
});
|
278
|
+
}
|
279
|
+
|
280
|
+
// 下月的日期
|
281
|
+
for (let i = 1; _calendar.length < 42; i++) {
|
282
|
+
const _i = i;
|
283
|
+
_calendar.push({
|
284
|
+
date: `${next_y}-${numfill(next_m)}-${numfill(_i)}`,
|
285
|
+
day: _i,
|
286
|
+
isNextMonth: true,
|
287
|
+
});
|
288
|
+
}
|
289
|
+
|
290
|
+
let calendar = _calendar.map((item: any) => {
|
291
|
+
const _idx = values.indexOf(idate(item.date).format('YYYY-MM-DD'));
|
292
|
+
// 判断是否在选
|
293
|
+
if (_idx !== -1) {
|
294
|
+
if (item.isCurrMonth) {
|
295
|
+
item.selected = true;
|
296
|
+
}
|
297
|
+
if (_idx === 0) {
|
298
|
+
item.sta = true;
|
299
|
+
}
|
300
|
+
if (_idx === values.length - 1) {
|
301
|
+
item.end = true;
|
302
|
+
}
|
303
|
+
}
|
304
|
+
// 判断是否在范围内
|
305
|
+
if (values.length > 1) {
|
306
|
+
if (item.isCurrMonth && idate(item.date).time >= idate(values[0]).time && idate(item.date).time <= idate(values[values.length - 1]).time) {
|
307
|
+
item.range = true;
|
308
|
+
}
|
309
|
+
}
|
310
|
+
return item;
|
311
|
+
});
|
312
|
+
// 是否按周分组
|
313
|
+
if (group) {
|
314
|
+
calendar = Array.from({ length: Math.ceil(_calendar.length / 7) }, (_v, index) => _calendar.slice(index * 7, index * 7 + 7));
|
315
|
+
}
|
316
|
+
|
317
|
+
return calendar;
|
318
|
+
}
|
319
|
+
}
|
320
|
+
|
321
|
+
export const idate = (obj?: any) => new IDate().create(obj);
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import Input from './Input@v3.vue';
|
2
2
|
import InputRange from './InputRange.vue';
|
3
3
|
import Switch from './Switch.vue';
|
4
|
-
import
|
4
|
+
import Textarea from './Textarea@v2.vue';
|
5
5
|
|
6
|
+
import Checkbox from './Checkbox.vue';
|
6
7
|
import Select from './Select@v3.vue';
|
7
8
|
import SelectList from './SelectList.vue';
|
8
9
|
import SelectTags from './SelectTags.vue';
|
@@ -17,8 +18,8 @@ import PageSelect from './PageSelect.vue';
|
|
17
18
|
import SelectTree from './SelectTree/SelectTree@v1.vue';
|
18
19
|
|
19
20
|
// import DateView from './DateView.vue';
|
20
|
-
import DateView from './DateView@v2.vue';
|
21
|
-
|
21
|
+
// import DateView from './DateView@v2.vue';
|
22
|
+
import DateView from './DateView@v3.vue';
|
22
23
|
import DateRangeView from './DateRangeView@v3.vue';
|
23
24
|
import DatePicker from './DatePicker.vue';
|
24
25
|
import TimePicker from './TimePicker.vue';
|
@@ -31,7 +32,8 @@ export {
|
|
31
32
|
Input,
|
32
33
|
InputRange,
|
33
34
|
Switch,
|
34
|
-
|
35
|
+
Textarea,
|
36
|
+
Checkbox,
|
35
37
|
Select,
|
36
38
|
SelectList,
|
37
39
|
SelectTags,
|
@@ -52,7 +54,7 @@ export {
|
|
52
54
|
DateRangePicker,
|
53
55
|
ImgUpload,
|
54
56
|
Upload,
|
55
|
-
Cascader
|
57
|
+
Cascader,
|
56
58
|
};
|
57
59
|
|
58
60
|
// 单选
|
@@ -0,0 +1,224 @@
|
|
1
|
+
/**
|
2
|
+
* 对象类型相关判断
|
3
|
+
* @module type
|
4
|
+
*/
|
5
|
+
|
6
|
+
/**
|
7
|
+
* 获取指定对象的类型
|
8
|
+
* @param {type} obj 对象
|
9
|
+
* @return {string} 对象类型值
|
10
|
+
*/
|
11
|
+
export function getType(obj: any): string {
|
12
|
+
return Object.prototype.toString.call(obj);
|
13
|
+
}
|
14
|
+
|
15
|
+
/**
|
16
|
+
* 判断是否是function
|
17
|
+
* @param {object} obj 对象
|
18
|
+
* @return {Boolean}
|
19
|
+
*/
|
20
|
+
export function isFunction(obj: any): boolean {
|
21
|
+
return typeof obj === 'function';
|
22
|
+
}
|
23
|
+
|
24
|
+
/**
|
25
|
+
* 判断是否是Object
|
26
|
+
* @param {object} obj 对象
|
27
|
+
* @return {Boolean}
|
28
|
+
*/
|
29
|
+
export function isObject(obj: any): boolean {
|
30
|
+
return '[object Object]' === getType(obj);
|
31
|
+
}
|
32
|
+
|
33
|
+
/**
|
34
|
+
* 判断是否是array
|
35
|
+
* @param {object} obj 对象
|
36
|
+
* @return {Boolean}
|
37
|
+
*/
|
38
|
+
export function isArray(obj: any): boolean {
|
39
|
+
return '[object Array]' === getType(obj);
|
40
|
+
}
|
41
|
+
|
42
|
+
/**
|
43
|
+
* 判断是否是undefined
|
44
|
+
* @param {object} obj 对象
|
45
|
+
* @return {Boolean}
|
46
|
+
*/
|
47
|
+
export function isUndefined(obj: any): boolean {
|
48
|
+
return '[object Undefined]' === getType(obj);
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* 判断是否是null
|
53
|
+
* @param {object} obj 对象
|
54
|
+
* @return {Boolean}
|
55
|
+
*/
|
56
|
+
export function isNull(obj: any): boolean {
|
57
|
+
return '[object Null]' === getType(obj);
|
58
|
+
}
|
59
|
+
|
60
|
+
/**
|
61
|
+
* 判断是否是字符串
|
62
|
+
* @param {object} obj 对象
|
63
|
+
* @return {Boolean}
|
64
|
+
*/
|
65
|
+
export function isString(obj: any): boolean {
|
66
|
+
return typeof obj === 'string';
|
67
|
+
}
|
68
|
+
|
69
|
+
/**
|
70
|
+
* 判断是否是布尔类型
|
71
|
+
* @param {object} obj 对象
|
72
|
+
* @return {Boolean}
|
73
|
+
*/
|
74
|
+
export function isBoolean(obj: any): boolean {
|
75
|
+
return typeof obj === 'boolean';
|
76
|
+
}
|
77
|
+
|
78
|
+
/**
|
79
|
+
* 判断是否是一个数字
|
80
|
+
* @param {number} num 数字
|
81
|
+
* @return {Boolean}
|
82
|
+
*/
|
83
|
+
export function isNumber(num: any): boolean {
|
84
|
+
return '[object Number]' === getType(num) && !isNaN(num);
|
85
|
+
}
|
86
|
+
|
87
|
+
/**
|
88
|
+
* 判断是否是一个日期
|
89
|
+
* @param {object} obj 对象
|
90
|
+
* @return {Boolean}
|
91
|
+
*/
|
92
|
+
export function isDate(obj: any): boolean {
|
93
|
+
return '[object Date]' === getType(obj);
|
94
|
+
}
|
95
|
+
|
96
|
+
/**
|
97
|
+
* 判断是否是一个日期字符串
|
98
|
+
* @param {string} str 字符
|
99
|
+
* @return {Boolean}
|
100
|
+
*/
|
101
|
+
export function isDateString(str: any): boolean {
|
102
|
+
try {
|
103
|
+
return new Date(str?.replace(/-/g, '/')).toString() !== 'Invalid Date';
|
104
|
+
} catch (err) {
|
105
|
+
return false;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
|
109
|
+
/**
|
110
|
+
* 判断是否是一个DOM节点
|
111
|
+
* @param {object} obj 对象
|
112
|
+
* @return {Boolean}
|
113
|
+
*/
|
114
|
+
export function isElement(obj: any): boolean {
|
115
|
+
return /\[object\sHTML\w*Element\]/.test(getType(obj)) || getType(obj) === '[object HTMLDocument]';
|
116
|
+
}
|
117
|
+
|
118
|
+
/**
|
119
|
+
* 判断是否是一个DOM节点列表
|
120
|
+
* @param {object} obj 对象
|
121
|
+
* @return {Boolean}
|
122
|
+
*/
|
123
|
+
export function isNodeList(obj: any): boolean {
|
124
|
+
return getType(obj) === '[object NodeList]';
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* 判断是否为空
|
129
|
+
* @param {object} obj 对象
|
130
|
+
* @return {Boolean}
|
131
|
+
*/
|
132
|
+
export function isEmpty(obj: any): boolean {
|
133
|
+
if (isArray(obj)) {
|
134
|
+
return obj.length === 0;
|
135
|
+
} else if (isObject(obj)) {
|
136
|
+
return Object.keys(obj).length === 0;
|
137
|
+
} else {
|
138
|
+
return isUndefined(obj) || isNull(obj) || obj === '';
|
139
|
+
}
|
140
|
+
}
|
141
|
+
|
142
|
+
/**
|
143
|
+
* 判断是否为Base64字符串
|
144
|
+
* @param {string} obj 对象
|
145
|
+
* @return {Boolean}
|
146
|
+
*/
|
147
|
+
export function isBase64(obj: any): boolean {
|
148
|
+
return isString(obj) && /data:\w*\/\w*;base64,/.test(obj);
|
149
|
+
}
|
150
|
+
|
151
|
+
/**
|
152
|
+
* 判断是否为Blob对象
|
153
|
+
* @param {object} obj 对象
|
154
|
+
* @return {Boolean}
|
155
|
+
*/
|
156
|
+
export function isBlob(obj: any): boolean {
|
157
|
+
return obj instanceof Blob;
|
158
|
+
}
|
159
|
+
|
160
|
+
/**
|
161
|
+
* 判断是不是JSON字符串
|
162
|
+
* @param {object} obj 任意类型
|
163
|
+
* @return {Boolean}
|
164
|
+
*/
|
165
|
+
export function isJsonString(obj: any): boolean {
|
166
|
+
try {
|
167
|
+
JSON.parse(obj);
|
168
|
+
return true;
|
169
|
+
} catch (e) {
|
170
|
+
return false;
|
171
|
+
}
|
172
|
+
}
|
173
|
+
|
174
|
+
/**
|
175
|
+
* 判断是不是数组字符串
|
176
|
+
* @param {object} obj 任意类型
|
177
|
+
* @return {Boolean}
|
178
|
+
*/
|
179
|
+
export function isArrayString(obj: any): boolean {
|
180
|
+
try {
|
181
|
+
const a = JSON.parse(obj);
|
182
|
+
return isArray(a);
|
183
|
+
} catch (e) {
|
184
|
+
return false;
|
185
|
+
}
|
186
|
+
}
|
187
|
+
|
188
|
+
/**
|
189
|
+
* 判断是不是对象字符串
|
190
|
+
* @param {object} obj 任意类型
|
191
|
+
* @return {Boolean}
|
192
|
+
*/
|
193
|
+
export function isObjectString(obj: any): boolean {
|
194
|
+
try {
|
195
|
+
const o = JSON.parse(obj);
|
196
|
+
return isObject(o);
|
197
|
+
} catch (e) {
|
198
|
+
return false;
|
199
|
+
}
|
200
|
+
}
|
201
|
+
|
202
|
+
/**
|
203
|
+
* 判断是不是经过编码的字符串
|
204
|
+
* @param {object} str 字符串
|
205
|
+
* @return {Boolean}
|
206
|
+
*/
|
207
|
+
export const isEncoded = (str: any) => {
|
208
|
+
try {
|
209
|
+
return str !== decodeURIComponent(str);
|
210
|
+
} catch (_e) {
|
211
|
+
// 如果解码失败,说明字符串未被正确编码
|
212
|
+
return false;
|
213
|
+
}
|
214
|
+
};
|
215
|
+
|
216
|
+
/**
|
217
|
+
* 检查对象是否拥有指定的自身属性(不检查原型链)
|
218
|
+
* @param obj 要检查的对象
|
219
|
+
* @param key 属性名
|
220
|
+
* @returns {boolean} 如果对象自身包含该属性则返回 true,否则返回 false
|
221
|
+
*/
|
222
|
+
export const hasOwnProp = (obj: unknown, key: PropertyKey): boolean => {
|
223
|
+
return obj != null && Object.prototype.hasOwnProperty.call(obj, key);
|
224
|
+
};
|
@@ -0,0 +1,113 @@
|
|
1
|
+
<template>
|
2
|
+
<span class="pr full" ui-flex="row cm">
|
3
|
+
<span :ui-order="`@b ${status}`" :style="{ width: size + '%', height: size + '%' }">
|
4
|
+
<i></i>
|
5
|
+
<b></b>
|
6
|
+
<u></u>
|
7
|
+
</span>
|
8
|
+
</span>
|
9
|
+
</template>
|
10
|
+
<script setup lang="ts">
|
11
|
+
// 类型
|
12
|
+
interface Props {
|
13
|
+
status?: number;
|
14
|
+
size?: number;
|
15
|
+
}
|
16
|
+
withDefaults(defineProps<Props>(), {
|
17
|
+
status: 0,
|
18
|
+
size: 100,
|
19
|
+
});
|
20
|
+
</script>
|
21
|
+
<style lang="scss">
|
22
|
+
[ui-order~='@b'] {
|
23
|
+
position: relative;
|
24
|
+
cursor: pointer;
|
25
|
+
overflow: hidden;
|
26
|
+
|
27
|
+
i,
|
28
|
+
b,
|
29
|
+
u {
|
30
|
+
position: absolute;
|
31
|
+
display: block;
|
32
|
+
width: 100%;
|
33
|
+
height: 100%;
|
34
|
+
left: 0;
|
35
|
+
top: 0;
|
36
|
+
}
|
37
|
+
|
38
|
+
i {
|
39
|
+
opacity: 0;
|
40
|
+
|
41
|
+
&::before,
|
42
|
+
&::after {
|
43
|
+
display: block;
|
44
|
+
content: '';
|
45
|
+
position: absolute;
|
46
|
+
width: 100%;
|
47
|
+
height: 100%;
|
48
|
+
left: 0;
|
49
|
+
top: 0;
|
50
|
+
}
|
51
|
+
|
52
|
+
&::before {
|
53
|
+
background:
|
54
|
+
linear-gradient(45deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 28.7% 95% / 30% 35%,
|
55
|
+
linear-gradient(-45deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 71.3% 95% / 30% 35%;
|
56
|
+
transform: translateY(-50%);
|
57
|
+
}
|
58
|
+
|
59
|
+
&::after {
|
60
|
+
background:
|
61
|
+
linear-gradient(135deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 28.5% 10% / 30% 35%,
|
62
|
+
linear-gradient(-135deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 71.3% 10% / 30% 35%;
|
63
|
+
transform: translateY(50%);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
67
|
+
b {
|
68
|
+
background:
|
69
|
+
linear-gradient(45deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 28.7% 95% / 30% 35%,
|
70
|
+
linear-gradient(-45deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 71.3% 95% / 30% 35%,
|
71
|
+
linear-gradient(90deg, transparent 35%, currentColor 40%, currentColor 60%, transparent 65%) no-repeat 50% 45% / 33% 70%;
|
72
|
+
transform: translateY(-110%);
|
73
|
+
}
|
74
|
+
|
75
|
+
u {
|
76
|
+
background:
|
77
|
+
linear-gradient(135deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 28.5% 10% / 30% 35%,
|
78
|
+
linear-gradient(-135deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 71.3% 10% / 30% 35%,
|
79
|
+
linear-gradient(90deg, transparent 35%, currentColor 40%, currentColor 60%, transparent 65%) no-repeat 50% 45% / 33% 70%;
|
80
|
+
transform: translateY(110%);
|
81
|
+
}
|
82
|
+
|
83
|
+
&[ui-order~='0'] i {
|
84
|
+
opacity: 0.3;
|
85
|
+
|
86
|
+
&::before {
|
87
|
+
background:
|
88
|
+
linear-gradient(45deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 28.7% 95% / 30% 35%,
|
89
|
+
linear-gradient(-45deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 71.3% 95% / 30% 35%;
|
90
|
+
transform: translateY(0%);
|
91
|
+
transition: all 0.2s cubic-bezier(0.65, 0, 0.35, 1);
|
92
|
+
}
|
93
|
+
|
94
|
+
&::after {
|
95
|
+
background:
|
96
|
+
linear-gradient(135deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 28.5% 15% / 30% 35%,
|
97
|
+
linear-gradient(-135deg, transparent 48%, currentColor 53%, currentColor 67%, transparent 72%) no-repeat 71.3% 15% / 30% 35%;
|
98
|
+
transform: translateY(0%);
|
99
|
+
transition: all 0.2s cubic-bezier(0.65, 0, 0.35, 1);
|
100
|
+
}
|
101
|
+
}
|
102
|
+
|
103
|
+
&[ui-order~='1'] u {
|
104
|
+
transform: translateY(5%);
|
105
|
+
transition: transform 0.3s cubic-bezier(0.65, 0, 0.35, 1);
|
106
|
+
}
|
107
|
+
|
108
|
+
&[ui-order~='2'] b {
|
109
|
+
transform: translateY(0%);
|
110
|
+
transition: transform 0.3s cubic-bezier(0.65, 0, 0.35, 1);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
</style>
|