common-utils-kit 1.1.5 → 1.1.19

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/src/directives.js DELETED
@@ -1,248 +0,0 @@
1
-
2
- // 自定义指令基础配置
3
- const directives = {
4
- debounce: { // 按钮或者输入框防抖
5
- // 例子 <el-input v-model="aa" v-debounce="[reset,`input`,1000]" placeholder="输入框数组防抖" />
6
- // <el-button v-debounce="[reset,`click`,1000]">刷新</el-button>
7
- inserted: function(el, binding) {
8
- const [fn, event = "click", time = 1000] = binding.value;
9
- let timer;
10
- let flag = true; // 输入法标记
11
- if (event === "input") {
12
- el.addEventListener("compositionstart", () => { // 监听中文输入开始
13
- flag = false;
14
- });
15
- el.addEventListener("compositionend", () => { // 监听中文输入结束
16
- flag = true;
17
- });
18
- }
19
- el.addEventListener(event, () => {
20
- timer && clearTimeout(timer);
21
- timer = setTimeout(() => {
22
- if (flag) fn();
23
- }, time);
24
- });
25
- },
26
- },
27
- inputDebounce: { // 输入框防抖
28
- inserted: function (el, binding) {
29
- const fn = binding.value;
30
- const time = binding.arg || 500;
31
- let timer;
32
- let flag = true; // 输入法标记
33
- el.addEventListener("compositionstart", () => { // 监听中文输入开始
34
- flag = false;
35
- });
36
- el.addEventListener("compositionend", () => { // 监听中文输入结束
37
- flag = true;
38
- });
39
- el.addEventListener('input', () => {
40
- timer && clearTimeout(timer);
41
- timer = setTimeout(() => {
42
- if (flag) fn();
43
- }, time);
44
- });
45
- },
46
- },
47
- btnDebounce: { // 按钮防抖
48
- inserted: (el, binding) => {
49
- const time = binding.arg || 1000; // 防抖时间
50
- let debounce = null;
51
- el.addEventListener('click', event => {
52
- if (debounce !== null) {
53
- clearTimeout(debounce)
54
- event && event.stopImmediatePropagation();
55
- }
56
- debounce = setTimeout(() => {
57
- debounce = null
58
- }, time)
59
- }, true);
60
- }
61
- },
62
- btnThrottle: { // 按钮节流
63
- inserted: (el, binding) => {
64
- const time = binding.arg || 1000; // 间隔时间
65
- let cbFun;
66
- el.addEventListener('click', event => {
67
- if (!cbFun) { // 第一次执行
68
- cbFun = setTimeout(() => {
69
- cbFun = null;
70
- }, time);
71
- } else {
72
- event && event.stopImmediatePropagation();
73
- }
74
- }, true);
75
- }
76
- },
77
- relativeTime: { // 时间转换
78
- bind(el, binding) {
79
- var intervalTime = 60000
80
- var Time = {
81
- getUnix: function () { // 获取当前时间戳
82
- var date = new Date();
83
- return date.getTime();
84
- },
85
- getTodayUnix: function () { // 获取今天0点0分0秒的时间戳
86
- var date = new Date();
87
- date.setHours(0);
88
- date.setMinutes(0);
89
- date.setSeconds(0);
90
- date.setMilliseconds(0);
91
- return date.getTime();
92
- },
93
- getYearUnix: function () { // 获取今年1月1日0点0分0秒的时间戳
94
- var date = new Date();
95
- date.setMonth(0);
96
- date.setDate(1);
97
- date.setHours(0);
98
- date.setMinutes(0);
99
- date.setSeconds(0);
100
- date.setMilliseconds(0);
101
- return date.getTime();
102
- },
103
- getLastDate: function () { // 获取标准年月日
104
- var date = new Date();
105
- var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
106
- var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
107
- return date.getFullYear() + '-' + month + '-' + day;
108
- },
109
- getFormatTime: function (timestamp) { // 转换时间
110
- var now = this.getUnix();// 当前时间戳
111
- var today = this.getTodayUnix();// 今天0点时间戳
112
- var timer = (now - timestamp) / 1000;// 转换为妙级别时间戳
113
- var tip = '';
114
- if (timer <= 0) {
115
- tip = '刚刚';
116
- } else if (Math.floor(timer / 60) <= 0) {
117
- tip = '刚刚';
118
- } else if (timer < 3600) {
119
- tip = Math.floor(timer / 60) + '分钟前';
120
- } else if (timer >= 3600 && (timestamp - today >= 0)) {
121
- tip = Math.floor(timer / 3600) + '小时前';
122
- intervalTime = 3600000;
123
- } else if (timer / 86400 <= 31) {
124
- tip = Math.ceil(timer / 86400) + '天前';
125
- intervalTime = 3600000 * 24;
126
- } else {
127
- tip = this.getLastDate(timestamp);
128
- intervalTime = 3600000 * 24;
129
- }
130
- return tip;
131
- }
132
- }
133
- el.innerHTML = Time.getFormatTime(binding.value)
134
- el.__timeout__ = setInterval(() => {
135
- el.innerHTML = Time.getFormatTime(binding.value)
136
- }, intervalTime)
137
- },
138
- unbind(el) {
139
- clearInterval(el.innerHTML)
140
- delete el.__timeout__
141
- }
142
- },
143
- replace: {//限制input输入内容
144
- inserted: function (el, binding, vnode) {
145
- const element = el.tagName === "INPUT" ? el : el.querySelector("input");
146
- let flag = true; // 输入法标记
147
- element.addEventListener("compositionstart", () => {
148
- flag = false;
149
- }); // 监听中文输入开始
150
- element.addEventListener("compositionend", () => {
151
- flag = true;
152
- }); // 监听中文输入结束
153
- element.addEventListener("keyup", () => {
154
- // 监听中文输入结束
155
- if (flag) {
156
- switch (binding.arg) {
157
- case "price": // 正负的两位小数金额 -和.只能出现一次 并且-只能在首位
158
- element.value = element.value.replace(/^([-+])?\D*(\d*(?:\.\d{0,2})?).*$/, "$1$2");
159
- break;
160
- case "plusPrice": // 验证正的两位小数金额
161
- element.value = element.value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g, "$1");
162
- break;
163
- case "num": // 只能输入正整数
164
- element.value = element.value.replace(/[^\d]|^[0]/g, "");
165
- break;
166
- case "natural": // 只能输入自然数
167
- element.value = element.value.replace(/[^\d]/g, "");
168
- break;
169
- }
170
- }
171
- });
172
- },
173
- },
174
- elDragDialog: {
175
- bind(el, binding, vnode) {
176
- const dialogHeaderEl = el.querySelector('.el-dialog__header')
177
- const dragDom = el.querySelector('.el-dialog')
178
- dialogHeaderEl.style.cssText += ';cursor:move;'
179
- dragDom.style.cssText += ';top:0px;'
180
- // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
181
- const getStyle = (function () {
182
- if (window.document.currentStyle) {
183
- return (dom, attr) => dom.currentStyle[attr]
184
- } else {
185
- return (dom, attr) => getComputedStyle(dom, false)[attr]
186
- }
187
- })()
188
- dialogHeaderEl.onmousedown = (e) => {
189
- // 鼠标按下,计算当前元素距离可视区的距离
190
- const disX = e.clientX - dialogHeaderEl.offsetLeft
191
- const disY = e.clientY - dialogHeaderEl.offsetTop
192
- const dragDomWidth = dragDom.offsetWidth
193
- const dragDomHeight = dragDom.offsetHeight
194
- const screenWidth = document.body.clientWidth
195
- const screenHeight = document.body.clientHeight
196
- const minDragDomLeft = dragDom.offsetLeft
197
- const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
198
- const minDragDomTop = dragDom.offsetTop
199
- const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
200
- // 获取到的值带px 正则匹配替换
201
- let styL = getStyle(dragDom, 'left')
202
- let styT = getStyle(dragDom, 'top')
203
- if (styL.includes('%')) {
204
- styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
205
- styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
206
- } else {
207
- styL = +styL.replace(/\px/g, '')
208
- styT = +styT.replace(/\px/g, '')
209
- }
210
- document.onmousemove = function (e) {
211
- // 通过事件委托,计算移动的距离
212
- let left = e.clientX - disX
213
- let top = e.clientY - disY
214
- // 边界处理
215
- if (-(left) > minDragDomLeft) {
216
- left = -minDragDomLeft
217
- } else if (left > maxDragDomLeft) {
218
- left = maxDragDomLeft
219
- }
220
- if (-(top) > minDragDomTop) {
221
- top = -minDragDomTop
222
- } else if (top > maxDragDomTop) {
223
- top = maxDragDomTop
224
- }
225
- // 移动当前元素
226
- dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
227
- // emit onDrag event
228
- vnode.child.$emit('dragDialog')
229
- }
230
- document.onmouseup = function (e) {
231
- document.onmousemove = null
232
- document.onmouseup = null
233
- }
234
- }
235
- }
236
- },
237
-
238
- }
239
- // 批量注册自定义指令
240
- export default {
241
- install(Vue) {
242
- Object.keys(directives).forEach((key) => {
243
- const name = key.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
244
- Vue.directive(name, directives[key]);
245
- });
246
- },
247
- };
248
-
package/src/files.js DELETED
@@ -1,237 +0,0 @@
1
- /**
2
- * 下载 base64 编码的文件
3
- * @param {string} url - base64 编码的数据
4
- * @param {string} type - 文件类型的后缀名
5
- * @param {string} name - 文件名
6
- * @returns {Promise<string>} - Promise 对象,包含文件下载成功时的消息或失败时的错误信息
7
- * @example
8
- * const base64Data = "data:image/png;base64,R0lGODlhHAAmAKIHAKqqqsvLy0hISObm5vf394uLiwAAAP///yH5B…EoqQqJKAIBaQOVKHAXr3t7txgBjboSvB8EpLoFZywOAo3LFE5lYs/QW9LT1TRk1V7S2xYJADs=";
9
- * downloadBase64File(base64Data, "png", "myImage").then((message) => {
10
- * console.log(message); // 文件下载成功
11
- * }).catch((error) => {
12
- * console.error(error); // 文件下载失败或其他错误信息
13
- * });
14
- */
15
- export function downloadBase64File(url, type = "pdf", name = "文件" + Date.now()) {
16
- return new Promise((resolve, reject) => {
17
- if (!url) return reject('文件不存在');
18
- const imgType = ["png", "jpg", "gif", "jpeg", "webp", "bmp", "tif", "pcx", "tga", "exif", "fpx", "svg", "psd", "cdr", "pcd", "dxf", "ufo", "eps", "ai", "raw", "WMF",];
19
- const createBlob = (data, mimeType) => {
20
- try {
21
- return new Blob([data], { type: mimeType });
22
- } catch (e) {
23
- reject('创建 Blob 失败');
24
- }
25
- };
26
- let myBlob = null;
27
- if (imgType.includes(type)) {
28
- const arr = url.split(",");
29
- const mime = arr[0].match(/:(.*?);/)[1];
30
- const bstr = atob(arr[1]);
31
- const u8arr = new Uint8Array(bstr.length);
32
- let n = bstr.length;
33
- for (let i = 0; i < bstr.length; i++) {
34
- u8arr[i] = bstr.charCodeAt(i);
35
- }
36
- myBlob = createBlob(u8arr, mime);
37
- } else {
38
- const bstr = atob(url);
39
- const u8arr = new Uint8Array(bstr.length);
40
- for (let i = 0; i < bstr.length; i++) {
41
- u8arr[i] = bstr.charCodeAt(i);
42
- }
43
- myBlob = createBlob(u8arr, type);
44
- }
45
- const myUrl = URL.createObjectURL(myBlob);
46
- const a = document.createElement("a");
47
- a.setAttribute("href", myUrl);
48
- const fileName = name;
49
- a.setAttribute("download", fileName);
50
- a.setAttribute("target", "_blank");
51
- const clickEvent = document.createEvent("MouseEvents");
52
- clickEvent.initEvent("click", true, true);
53
- a.addEventListener("click", () => {
54
- window.requestAnimationFrame(() => {
55
- setTimeout(() => {
56
- URL.revokeObjectURL(myUrl);
57
- resolve('文件下载成功');
58
- }, 0);
59
- });
60
- });
61
- a.dispatchEvent(clickEvent);
62
- });
63
- }
64
- /**
65
- * 文件地址下载文件
66
- * @param {string} url - 文件地址
67
- * @param {string} filename - 下载后的文件名
68
- * @returns {Promise<boolean>} - Promise 对象,表示下载成功(true)或失败(false)
69
- * @example
70
- * const fileUrl = "https://example.com/file/document.pdf";
71
- * const customFileName = "myDocument";
72
- * downloadFiles(fileUrl, customFileName).then((message) => {
73
- * console.log(message); // 文件下载成功
74
- * }).catch((error) => {
75
- * console.error(error); // 文件下载失败或其他错误信息
76
- * });
77
- */
78
- export function downloadFiles(url, filename) {
79
- return new Promise((resolve, reject) => {
80
- const xhr = new XMLHttpRequest();
81
- xhr.open("GET", url, true);
82
- xhr.responseType = "blob";
83
- xhr.onload = () => {
84
- if (xhr.status === 200) {
85
- const decodedUrl = decodeURIComponent(url);
86
- const matches = decodedUrl.match(/\/([^\/?#]+)[^\/]*$/);
87
- const newFileName = filename ? (filename.includes('.') ? filename : `${filename}.${matches[1].split('.').pop()}`) : matches[1]
88
- if (window.navigator.msSaveOrOpenBlob) {
89
- navigator.msSaveBlob(xhr.response, newFileName);
90
- } else {
91
- const link = document.createElement("a");
92
- link.href = window.URL.createObjectURL(xhr.response);
93
- link.download = newFileName;
94
- link.style.position = "absolute";
95
- link.style.opacity = "0";
96
- link.style.pointerEvents = "none";
97
- document.body.appendChild(link);
98
- link.click();
99
- document.body.removeChild(link);
100
- window.URL.revokeObjectURL(link.href);
101
- }
102
- resolve("文件下载成功")
103
- } else {
104
- reject("文件下载失败")
105
- }
106
- };
107
- xhr.send();
108
- });
109
- }
110
- /**
111
- * File转Base64
112
- * @param {File} file - File对象格式文件数据
113
- * @example
114
- * fileToBase64(file).then((base64) => {
115
- * console.log(base64); // base64格式的文件
116
- * }).catch((error) => {
117
- * console.error(error); // 转换失败或其他错误信息
118
- * });
119
- */
120
- export function fileToBase64(file) {
121
- return new Promise((resolve, reject) => {
122
- const reader = new FileReader();
123
- reader.readAsDataURL(file);
124
- this.aa = reader.result;
125
- reader.onload = () => resolve(reader.result);
126
- reader.onerror = (error) => reject(error);
127
- });
128
- }
129
- /**
130
- * Base64转File
131
- * @param {String} base64 - base64格式文件数据
132
- * @example
133
- * base64ToFile(base64).then((file) => {
134
- * console.log(file); // File格式的文件
135
- * }).catch((error) => {
136
- * console.error(error); // 转换失败或其他错误信息
137
- * });
138
- */
139
- export function base64ToFile(base64, filename = "file") { //将base64转换为文件
140
- return new Promise((resolve, reject) => {
141
- const arr = base64.split(',')
142
- const mime = arr[0].match(/:(.*?);/)[1]
143
- const suffix = mime.split('/')[1]
144
- const bstr = atob(arr[1])
145
- let n = bstr.length
146
- const u8arr = new Uint8Array(n)
147
- while (n--) {
148
- u8arr[n] = bstr.charCodeAt(n)
149
- }
150
- const fileData = new File([u8arr], `${filename}.${suffix}`, { type: mime })
151
- resolve(fileData)
152
- })
153
- }
154
- /**
155
- * Base64转Blob
156
- * @param {String} base64 - base64格式文件数据
157
- * @example
158
- * base64ToFile(base64).then((blob) => {
159
- * console.log(blob); // blob格式的文件
160
- * }).catch((error) => {
161
- * console.error(error); // 转换失败或其他错误信息
162
- * });
163
- */
164
- export function base64ToFileBlob(dataurl) {
165
- return new Promise((resolve, reject) => {
166
- var arr = dataurl.split(','),
167
- mime = arr[0].match(/:(.*?);/)[1],
168
- bstr = atob(arr[1]),
169
- n = bstr.length,
170
- u8arr = new Uint8Array(n)
171
- while (n--) {
172
- u8arr[n] = bstr.charCodeAt(n)
173
- }
174
- const blobData = new Blob([u8arr], { type: mime })
175
- resolve(blobData)
176
- })
177
- }
178
- // 使用canvas压缩图片
179
- export function uploadCompress(file, config) {
180
- return new Promise((resolve, reject) => {
181
- const image = new Image();
182
- image.src = URL.createObjectURL(file);
183
- image.onload = () => {
184
- let resultBlob = "";
185
- // 压缩图片
186
- resultBlob = compressUpload(image, file, config);
187
- resolve(resultBlob);
188
- };
189
- image.onerror = (err) => { reject(err) };
190
- /* 图片压缩-canvas压缩 */
191
- function compressUpload(image, file, compressConfig={}) {
192
- const canvas = document.createElement("canvas");
193
- const ctx = canvas.getContext("2d");
194
- let width = compressConfig.width || image.width;
195
- let height = compressConfig.height || image.height;
196
-
197
- // 只设置宽度时,等比计算高度
198
- if (compressConfig.width && !compressConfig.height) {
199
- height = (compressConfig.width / image.width) * image.height;
200
- }
201
- // 只设置高度时,等比计算宽度
202
- if (compressConfig.height && !compressConfig.width) {
203
- width = (compressConfig.height / image.height) * image.width;
204
- }
205
-
206
- canvas.width = width;
207
- canvas.height = height;
208
- ctx.fillRect(0, 0, canvas.width, canvas.height);
209
- ctx.drawImage(image, 0, 0, width, height);
210
-
211
- // 进行最小压缩0.1
212
- const compressData = canvas.toDataURL(
213
- file.type || "image/jpeg",
214
- compressConfig.rate || 0.5
215
- );
216
- // base64转Blob
217
- const blobImg = dataURItoBlob(compressData);
218
- console.log(" ", (blobImg.size / 1024 / 1024).toFixed(2));
219
- return blobImg;
220
- }
221
- /* 图片格式转换——base64转Blob对象 */
222
- function dataURItoBlob(data) {
223
- let byteString;
224
- if (data.split(",")[0].indexOf("base64") >= 0) {
225
- byteString = data.split(",")[1];
226
- } else {
227
- byteString = unescape(data.split(",")[1]);
228
- }
229
- const mimeString = data.split(",")[0].split(":")[1].split(";")[0];
230
- const ia = new Uint8Array(byteString.length);
231
- for (let i = 0; i < byteString.length; i += 1) {
232
- ia[i] = byteString.charCodeAt(i);
233
- }
234
- return new Blob([ia], { type: mimeString });
235
- }
236
- });
237
- }