youtil 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/CHANGELOG.md ADDED
@@ -0,0 +1,3 @@
1
+ # 1.0.0 (2022-11-14)
2
+
3
+ * 初始化第一个版本;
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # feutil
2
+
3
+ 存放与框架(Vue、React等)、环境(Nodejs、Web等)无关的通用方法工具库。
package/package.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "youtil",
3
+ "version": "1.0.0",
4
+ "description": "Front-ent util",
5
+ "main": "src/index.js",
6
+ "dependencies": {},
7
+ "devDependencies": {},
8
+ "scripts": {
9
+ "test": "echo \"Error: no test specified\" && exit 1"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "github.com/sxei/youtil"
14
+ },
15
+ "keywords": [
16
+ "feutil"
17
+ ],
18
+ "author": "sxei",
19
+ "license": "ISC"
20
+ }
package/src/index.js ADDED
@@ -0,0 +1,217 @@
1
+ export default {
2
+ /**
3
+ * 将日期格式化成指定格式的字符串
4
+ * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳
5
+ * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
6
+ * @returns 返回格式化后的日期字符串
7
+ */
8
+ formatDate(date, fmt) {
9
+ if (!date) {
10
+ return '';
11
+ }
12
+ date = typeof date === 'number' ? new Date(date) : date;
13
+ fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
14
+ const obj = {
15
+ y: date.getFullYear(), // 年份,注意必须用getFullYear
16
+ M: date.getMonth() + 1, // 月份,注意是从0-11
17
+ d: date.getDate(), // 日期
18
+ q: Math.floor((date.getMonth() + 3) / 3), // 季度
19
+ w: date.getDay(), // 星期,注意是0-6
20
+ H: date.getHours(), // 24小时制
21
+ h: date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, // 12小时制
22
+ m: date.getMinutes(), // 分钟
23
+ s: date.getSeconds(), // 秒
24
+ S: date.getMilliseconds(), // 毫秒
25
+ };
26
+ const week = ['天', '一', '二', '三', '四', '五', '六'];
27
+ // eslint-disable-next-line guard-for-in
28
+ for (const i in obj) {
29
+ fmt = fmt.replace(new RegExp(`${i}+`, 'g'), function (m) {
30
+ let val = `${obj[i]}`;
31
+ if (i === 'w') {
32
+ return (m.length > 2 ? '星期' : '周') + week[val];
33
+ }
34
+ for (let j = 0, len = val.length; j < m.length - len; j++) {
35
+ val = `0${val}`;
36
+ }
37
+ return m.length === 1 ? val : val.substring(val.length - m.length);
38
+ });
39
+ }
40
+ return fmt;
41
+ },
42
+ /**
43
+ * 将字符串解析成日期
44
+ * @param str 输入的日期字符串,如'2014-09-13'
45
+ * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
46
+ * @returns 解析后的Date类型日期
47
+ */
48
+ parseDate(str, fmt) {
49
+ fmt = fmt || 'yyyy-MM-dd';
50
+ const obj = { y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0 };
51
+ fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g, function (m, $1, $2, $3, $4) {
52
+ str = str.replace(new RegExp(`${$1}(\\d{${$2.length}})${$4}`), function (_m, _$1) {
53
+ obj[$3] = parseInt(_$1);
54
+ return '';
55
+ });
56
+ return '';
57
+ });
58
+ obj.M--; // 月份是从0开始的,所以要减去1
59
+ const date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
60
+ if (obj.S !== 0) {
61
+ date.setMilliseconds(obj.S); // 如果设置了毫秒
62
+ }
63
+ return date;
64
+ },
65
+ /**
66
+ * 显示全局loading
67
+ * @param {*} text
68
+ * @param {*} seconds
69
+ * @param {*} options
70
+ */
71
+ showLoading(text = '请稍候', seconds = 10, config = {}) {
72
+ const defaultConfig = {
73
+ hasMask: true,
74
+ maskColor: 'transparent',
75
+ onCancel: null,
76
+ cancelInline: false,
77
+ id: 'com_global_page_loading',
78
+ };
79
+ config = Object.assign({}, defaultConfig, config);
80
+ const { id } = config;
81
+ const timeoutKey = `_${id}_timeout`;
82
+ if (window[timeoutKey]) {
83
+ clearTimeout(window[timeoutKey]);
84
+ }
85
+ let dom = document.getElementById(id);
86
+ if (!dom) {
87
+ dom = document.createElement('div');
88
+ dom.id = id;
89
+ dom.className = id;
90
+ document.body.append(dom);
91
+ }
92
+ const styleId = `${id}_style`;
93
+ if (!document.getElementById(styleId)) {
94
+ const style = document.createElement('style');
95
+ style.id = styleId;
96
+ style.innerHTML = `
97
+ .${id} {
98
+ position: fixed;
99
+ top: calc(50vh - 60px);
100
+ left: calc(50vw - 60px);
101
+ width: 120px;
102
+ height: 120px;
103
+ z-index: 8000;
104
+ background: rgba(0, 0, 0, 0.6);
105
+ border-radius: 8px;
106
+ text-align: center;
107
+ color: white;
108
+ padding-top: 20px;
109
+ }
110
+ .${id} img {
111
+ width: 50px;
112
+ margin-bottom: 10px;
113
+ }`;
114
+ document.head.appendChild(style);
115
+ }
116
+ dom.innerHTML = `
117
+ ${config.hasMask ? `<div class="mask-wrapper" style="background-color: ${config.maskColor}"></div>` : ''}
118
+ <div class="loading-wrapper">
119
+ <div class="loading-content">
120
+ <img src="//img.alicdn.com/tfs/TB1bnUsQBLoK1RjSZFuXXXn0XXa-32-32.svg" alt="加载中">
121
+ <div>${text}${config.cancelInline ? ' ' : '</div>'}
122
+ ${config.onCancel ? '<a href="javascript:;" class="cancel">取消</a>' : ''}
123
+ ${config.cancelInline ? '</div>' : ''}
124
+ </div>
125
+ </div>`;
126
+ if (config.onCancel) {
127
+ const btn = dom.querySelector('.cancel');
128
+ btn && btn.addEventListener('click', () => {
129
+ this.hideLoading();
130
+ config.onCancel();
131
+ });
132
+ }
133
+ dom.style.display = 'block';
134
+ if (seconds > 0) {
135
+ window[timeoutKey] = setTimeout(() => {
136
+ this.hideLoading();
137
+ }, seconds * 1000);
138
+ }
139
+ },
140
+ // 隐藏全局loading
141
+ hideLoading() {
142
+ const id = 'com_global_page_loading';
143
+ const loading = document.getElementById(id);
144
+ if (loading) {
145
+ loading.style.display = 'none';
146
+ }
147
+ },
148
+ /**
149
+ * 从URL中获取某个参数,如果不存在返回 undefined ,如果存在多个同名参数,返回第一个匹配值
150
+ * getParam('a', '?a=1&b=&c=3&c=33#abc') // '1'
151
+ * getParam('b', '?a=1&b=&c=3&c=33#abc') // ''
152
+ * getParam('c', '?a=1&b=&c=3&c=33#abc') // 3
153
+ * getParam('d', '?a=1&b=&c=3&c=33#abc') // undefined
154
+ * @param {*} name 参数名
155
+ * @param {*} url 要获取的URL,默认当前地址
156
+ */
157
+ getParam(name, url = location.search) {
158
+ return (new RegExp(`(^|\\?|&)${name}=(.*?)(?=&|#|$)`, 'g').exec(url) || [])[2];
159
+ },
160
+ /**
161
+ * 从URL中获取int参数
162
+ * @param {*} name 参数名
163
+ * @param {*} url 要获取的URL,默认当前地址
164
+ */
165
+ getParamInt(name, url = location.search) {
166
+ return parseInt(this.getParam(name, url) || '0', 10);
167
+ },
168
+ /**
169
+ * 获取某个URL的全部参数
170
+ * getParams('?a=1&b=2#cc') // {a: '1', b: '2'}
171
+ * @param url
172
+ * @returns 参数对象
173
+ */
174
+ getParams(url = location.search) {
175
+ const search = ((url || '').split('?').pop() || '').split('#')[0] || '';
176
+ const params = {};
177
+ search.split('&').map(item => item.split('=')).forEach(([key, value]) => {
178
+ params[key] = value || '';
179
+ });
180
+ return params;
181
+ },
182
+ /**
183
+ * 给URL设置参数,如果已经存在,替换之,兼容hash存在的情况
184
+ * setParam('a', '123', '?a=1&b=2&a=3#d') // '?a=123&b=2&a=123#d'
185
+ * setParam('d', '444', '?a=1&b=2&a=3#d') // '?a=1&b=2&a=3&d=444#d'
186
+ * @param {Object} name 参数名
187
+ * @param {Object} value 参数值
188
+ * @param {Object} url 如果不传默认当前页面URL
189
+ */
190
+ setParam(name, value, url) {
191
+ url = url || `${location.pathname}${location.search}`;
192
+ // 如果参数已经存在,替换之
193
+ if (this.getParam(name, url) !== undefined) {
194
+ return url.replace(new RegExp(`(^|\\?|&)${name}=(.*?)(?=&|#|$)`, 'g'), `$1${name}=${value}`);
195
+ }
196
+ const [pathname, hash] = url.split('#'); // 处理存在hash的情况
197
+ return `${pathname}${pathname.indexOf('?') < 0 ? '?' : '&'}${name}=${value}${hash ? '#' : ''}${hash || ''}`;
198
+ },
199
+ /**
200
+ * 删除URL中某个参数
201
+ * delParam('a', '?a=1&b=2&a=3#d') // '?b=2#d'
202
+ * delParam('b', '?a=1&b=2&a=3#d') // '?a=1&a=3#d'
203
+ * delParam('a', '?a=1#d') // '#d'
204
+ * @param name 参数名
205
+ * @param url 要删除的URL,默认当前页面URL
206
+ * @returns 处理完后的URL
207
+ */
208
+ delParam(name, url) {
209
+ url = url || `${location.pathname}${location.search}`;
210
+ return url.replace(new RegExp(`(^|\\?|&)${name}=.*?(&|#|$)`, 'g'), (_m, $1, $2) => $2 === '&' ? $1 : $2);
211
+ },
212
+ /**
213
+ * 延迟一段时间,单位毫秒
214
+ * await sleep(200) // 休息200毫秒
215
+ */
216
+ sleep: (sec) => new Promise(resolve => setTimeout(resolve, sec)),
217
+ };