tools_dj 1.0.82 → 1.0.83

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/README.md CHANGED
@@ -1,12 +1,278 @@
1
- # 工具库模板
1
+ # DJ 工具库
2
2
 
3
- ## 介绍
4
- tools工具库
5
- 后期可以直接安装和修改
3
+ 一个全面的 JavaScript/TypeScript 工具函数集合,包含数据处理、时间格式化、树结构操作、DOM 操作等常用功能。
6
4
 
7
5
  ## 安装
8
- npm i tools_dj
6
+
7
+ ```bash
8
+ npm install tools_dj
9
+ ```
9
10
 
10
11
  ## 使用
11
- import {方法} from "tools_dj";
12
+
13
+ ```typescript
14
+ import { formatDate, is_empty, formatSize } from "tools_dj";
15
+
16
+ // 格式化日期
17
+ const date = formatDate(new Date(), 'day', '-'); // "2024-03-24"
18
+
19
+ // 检查空值
20
+ const isEmpty = is_empty(""); // true
21
+
22
+ // 格式化文件大小
23
+ const size = formatSize(1024); // "1 KB"
24
+ ```
25
+
26
+ ## API 文档
27
+
28
+ ### 数据类型判断
29
+
30
+ #### `is(obj: any): string`
31
+ 判断数据类型,返回具体类型名称
32
+ ```typescript
33
+ is([1, 2, 3]); // "Array"
34
+ is({}); // "Object"
35
+ is("hello"); // "String"
36
+ ```
37
+
38
+ #### `is_empty(obj: any): boolean`
39
+ 判断值是否为空,支持所有数据类型
40
+ ```typescript
41
+ is_empty(null); // true
42
+ is_empty(""); // true
43
+ is_empty([]); // true
44
+ is_empty({}); // true
45
+ ```
46
+
47
+ #### `isNum(data: any): boolean`
48
+ 判断是否是数字(包括字符型数字)
49
+ ```typescript
50
+ isNum("123"); // true
51
+ isNum(456); // true
52
+ isNum("abc"); // false
53
+ ```
54
+
55
+ ### 数组操作
56
+
57
+ #### `del_repeat(obj: any[]): any[]`
58
+ 删除数组重复元素
59
+ ```typescript
60
+ del_repeat([1, 2, 2, 3]); // [1, 2, 3]
61
+ ```
62
+
63
+ #### `unique(obj: any[]): any[] | false`
64
+ 去除数组重复元素(带空值检查)
65
+ ```typescript
66
+ unique([1, 2, 2, 3]); // [1, 2, 3]
67
+ ```
68
+
69
+ #### `first(obj: any): any`
70
+ 获取数组或对象的第一个元素
71
+ ```typescript
72
+ first([1, 2, 3]); // 1
73
+ ```
74
+
75
+ #### `last(obj: any): any`
76
+ 获取数组或对象的最后一个元素
77
+ ```typescript
78
+ last([1, 2, 3]); // 3
79
+ ```
80
+
81
+ #### `arrayGroup(arr: any[], groupKey: string): object`
82
+ 数组分组
83
+ ```typescript
84
+ arrayGroup([{type: 'A', value: 1}, {type: 'B', value: 2}], 'type');
85
+ // { A: [{type: 'A', value: 1}], B: [{type: 'B', value: 2}] }
86
+ ```
87
+
88
+ ### 时间处理
89
+
90
+ #### `formatDate(time: Date, format: string, type: string): string`
91
+ 格式化时间
92
+ ```typescript
93
+ formatDate(new Date(), 'day', '-'); // "2024-03-24"
94
+ formatDate(new Date(), 'minute', '/'); // "2024/03/24/14/30"
95
+ ```
96
+
97
+ #### `formatTime(time: any, format: string, option?: object): string`
98
+ 高级时间格式化
99
+ ```typescript
100
+ formatTime('2024-03-24', 'YYYY年MM月DD日'); // "2024年03月24日"
101
+ formatTime(new Date(), 'YYYY-MM-DD week'); // "2024-03-24 周日"
102
+ ```
103
+
104
+ #### `getDaysBetween(date1: string, date2: string, negative?: boolean): number`
105
+ 计算两个日期之间的天数
106
+ ```typescript
107
+ getDaysBetween('2024-01-01', '2024-01-05'); // 4
108
+ ```
109
+
110
+ #### `isDateInRange(date: string, startDate: string, endDate: string): boolean`
111
+ 判断日期是否在指定范围内
112
+ ```typescript
113
+ isDateInRange('2024-02-15', '2024-01-01', '2024-12-31'); // true
114
+ ```
115
+
116
+ ### 对象操作
117
+
118
+ #### `merge(obj1: any, obj2: any): any`
119
+ 合并数组或对象
120
+ ```typescript
121
+ merge([1, 2], [3, 4]); // [1, 2, 3, 4] (去重后)
122
+ merge({a: 1}, {b: 2}); // {a: 1, b: 2}
123
+ ```
124
+
125
+ #### `delObj(obj: object, keys?: string | string[]): void`
126
+ 删除对象属性
127
+ ```typescript
128
+ const obj = {a: 1, b: 2, c: 3};
129
+ delObj(obj, 'a'); // {b: 2, c: 3}
130
+ delObj(obj, ['b', 'c']); // {}
131
+ ```
132
+
133
+ #### `delObjEmptyKey(obj: object): void`
134
+ 删除对象中的空属性
135
+ ```typescript
136
+ const obj = {a: 1, b: '', c: null, d: 2};
137
+ delObjEmptyKey(obj); // {a: 1, d: 2}
138
+ ```
139
+
140
+ ### 树结构操作
141
+
142
+ #### `arrToTree(data: any[], option?: object): any[]`
143
+ 平级数组转树形结构
144
+ ```typescript
145
+ const data = [
146
+ {id: 1, parentId: 0, name: 'root'},
147
+ {id: 2, parentId: 1, name: 'child1'}
148
+ ];
149
+ arrToTree(data); // 树形结构
150
+ ```
151
+
152
+ #### `treeToArr(data: any[], option?: object): any[]`
153
+ 树形结构转平级数组
154
+ ```typescript
155
+ treeToArr(treeData); // 扁平化数组
156
+ ```
157
+
158
+ #### `handleTree(data: any[], id: string, parentId: string, children: string): any[]`
159
+ 构造树形结构数据
160
+ ```typescript
161
+ handleTree(data, 'id', 'parentId', 'children');
162
+ ```
163
+
164
+ ### 字符串处理
165
+
166
+ #### `toGetQuery(data: object, option?: object): string`
167
+ 对象转URL查询参数
168
+ ```typescript
169
+ toGetQuery({name: 'test', age: 20}); // "?name=test&age=20"
170
+ ```
171
+
172
+ #### `isLink(str: string): boolean`
173
+ 判断字符串是否为有效链接
174
+ ```typescript
175
+ isLink('https://example.com'); // true
176
+ isLink('not-a-link'); // false
177
+ ```
178
+
179
+ #### `repalce(str: string, index: number, char: string): string`
180
+ 字符串指定位置替换
181
+ ```typescript
182
+ repalce('hello', 1, 'a'); // "hallo"
183
+ ```
184
+
185
+ ### 数字处理
186
+
187
+ #### `formatSize(num: number, option?: object): string`
188
+ 转换大小默认是文件可以是别的
189
+ ```typescript
190
+ formatSize(1024); // "1 KB"
191
+ formatSize(1048576, {decimals: 1}); // "1.0 MB"
192
+ ```
193
+
194
+ #### `numberFixed(number: number, decimalPlaces?: number): number`
195
+ 数字保留小数位(截取不四舍五入)
196
+ ```typescript
197
+ numberFixed(3.14159, 2); // 3.14
198
+ ```
199
+
200
+ #### `numberRepair(str: string, n: number, k: string, d: boolean): string`
201
+ 数字前置补位
202
+ ```typescript
203
+ numberRepair('5', 3, '0'); // "005"
204
+ ```
205
+
206
+ #### `randomNumber(min: number, max: number): number`
207
+ 生成随机数
208
+ ```typescript
209
+ randomNumber(1, 100); // 1-100之间的随机数
210
+ ```
211
+
212
+ ### 工具函数
213
+
214
+ #### `throttle(fn: Function, delay?: number, immediate?: boolean): Function`
215
+ 节流函数
216
+ ```typescript
217
+ const throttled = throttle(() => console.log('throttled'), 1000);
218
+ ```
219
+
220
+ #### `debounce(fn: Function, delay: number): Function`
221
+ 防抖函数
222
+ ```typescript
223
+ const debounced = debounce(() => console.log('debounced'), 300);
224
+ ```
225
+
226
+ #### `memoize(func: Function, options?: object): Function`
227
+ 函数缓存
228
+ ```typescript
229
+ const cachedFn = memoize(expensiveFunction, {ttl: 5000});
230
+ ```
231
+
232
+ ### DOM 相关
233
+
234
+ #### `isMobile(): boolean`
235
+ 检测是否为移动设备
236
+ ```typescript
237
+ isMobile(); // true/false
238
+ ```
239
+
240
+ #### `setMeta(meta: object): void`
241
+ 设置页面meta信息
242
+ ```typescript
243
+ setMeta({title: "页面标题", cZoom: {mobile: 0.8}});
244
+ ```
245
+
246
+ ### 转换工具
247
+
248
+ #### `pxToRem(pxValue: string | number, baseRem?: number): string`
249
+ px转rem
250
+ ```typescript
251
+ pxToRem('16px'); // "0.43rem"
252
+ pxToRem(32, 16); // "2.00rem"
253
+ ```
254
+
255
+ #### `base64Img(base64: string, imgName: string): File`
256
+ base64转文件对象
257
+ ```typescript
258
+ const file = base64Img(base64String, 'image.png');
259
+ ```
260
+
261
+ #### `objToFormData(obj: object, simplify?: boolean): FormData`
262
+ 对象转FormData
263
+ ```typescript
264
+ const formData = objToFormData({name: 'test', files: [file1, file2]});
265
+ ```
266
+
267
+ ## 特性
268
+
269
+ - 🚀 **轻量高效** - 优化的算法实现
270
+ - 📦 **TypeScript 支持** - 完整的类型定义
271
+ - 🔧 **模块化设计** - 按需引入,减少包体积
272
+ - 🌍 **跨平台兼容** - 支持浏览器和 Node.js 环境
273
+ - 📚 **完整文档** - 详细的使用示例和API说明
274
+
275
+ ## 许可证
276
+
277
+ MIT License
12
278
 
package/lib/index.d.ts CHANGED
@@ -279,11 +279,14 @@ export declare function fnRuntime(fn: any, iterations?: number): void;
279
279
  * @return formData 对象
280
280
  */
281
281
  export declare function objToFormData(obj: any, simplify?: boolean): FormData;
282
- /** 2025/3/24 11:19 User: DJ
283
- * content: 自动格式化大小
284
- * @param num number 需要转化的数字
285
- * @param option {decimals:'保留的小数',sizes:单位数组}
286
- * formatSize(1024,{sizes:['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']})=1kb
282
+ /**
283
+ * 转换大小默认是文件可以是别的
284
+ * @param num - 需要转化的字节数
285
+ * @param option - 配置选项
286
+ * @param option.decimals - 保留小数位数,默认为2位
287
+ * @param option.sizes - 单位数组,默认为 ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
288
+ * @param option.perUnit - 转换进制,默认为1024
289
+ * @returns 格式化后的文件大小字符串
287
290
  */
288
291
  export declare function formatSize(num: any, option?: any): string;
289
292
  /** 2025/4/23 15:59 User: DJ
package/lib/index.js CHANGED
@@ -1 +1 @@
1
- function e(e){let t={};return e.forEach((function(e){t[JSON.stringify(e)]=e})),e=Object.keys(t).map((function(e){if("undefined"!=e)return JSON.parse(e)}))}function t(e){let t=!1;switch(Object.prototype.toString.call(e).slice(8,-1)){case"Undefined":case"Null":t=!0;break;case"String":t=0===e.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g,"").length;break;case"Boolean":t=!e;break;case"Array":t=0===e.length;break;case"Number":t=0===e||isNaN(e);break;case"Object":t=0===Object.keys(e).length}return t}function r(e){return Object.prototype.toString.call(e).slice(8,-1)}function n(){return!t(navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))}function o(e,t){return Math.round(Math.random()*(t-e))+e}function s(e){let t=e+"";const r=Number(t);return!isNaN(r)&&t.length>0}function c(e=[],t,r=!1){if(r)return e.indexOf(t);{let r=-1,n=e.length;for(let o=0;o<n;o++)e[o]==t&&(r=o);return r}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.memoize=void 0,exports.del_repeat=e,exports.formatDate=function(e,t="day",r="-"){let n=e.getFullYear(),o=(e.getMonth()+1).toString().padStart(2,"0"),s=e.getDate().toString().padStart(2,"0"),c=e.getHours().toString().padStart(2,"0"),i=e.getMinutes().toString().padStart(2,"0"),a={year:1,month:2,day:3,hour:4,minute:5},l="";for(let e=0;e<a[t];e++)0==e&&(l+=n),1==e&&(l+=o),2==e&&(l+=s),3==e&&(l+=c),4==e&&(l+=i),e!=a[t]-1&&(l+=r);return l},exports.time_change=function(e){return Date.parse(e)},exports.formatTime=function(e,t="YYYY-MM-DD hh:mm:ss",r={}){try{e=e.replaceAll("-","/")}catch(e){}e=new Date(e);let n={0:"周日",1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六"},{weeks:o=n}=r,s=e.getFullYear(),c=(e.getMonth()+1).toString().padStart(2,"0"),i=e.getDate().toString().padStart(2,"0"),a=e.getHours().toString().padStart(2,"0"),l=e.getMinutes().toString().padStart(2,"0"),u=e.getSeconds().toString().padStart(2,"0"),p=o[e.getDay()],f=t;return[{format:"YYYY",data:s},{format:"yyyy",data:s},{format:"MM",data:c},{format:"DD",data:i},{format:"dd",data:i},{format:"hh",data:a},{format:"HH",data:a},{format:"mm",data:l},{format:"ss",data:u},{format:"week",data:p},{format:"time_slot",data:a>12?"下午":"上午"}].forEach((function(e,r){-1!=t.indexOf(e.format)&&(f=f.replace(e.format,""+e.data))})),f},exports.getDaysBetween=function(e,t,r=!1){var n=Date.parse(e),o=Date.parse(t),s=0;n>o&&(s=(n-o)/864e5);n<o&&(s=(o-n)/864e5,r&&(s=-s));return s},exports.is_empty=t,exports.repalce=function(e,t,r){return e.substring(0,t)+r+e.substring(t+1)},exports.toGetQuery=function(e,n={}){if(t(e))return"";{let{prefix:o="?"}=n,s=[],c=["",void 0,null];const i=(e,n="")=>{const o=Object.keys(e);for(const a of o){const o=e[a];if(c.includes(o))continue;let l=r(o),u=encodeURIComponent(a);if(t(n)||(u=`${n}[${u}]`),"Array"===l)for(const e of o)s.push(`${u}[]=${encodeURIComponent(e)}`);else if("Object"===l)i(o,u);else{let e=encodeURIComponent(o);s.push(`${u}=${e}`)}}};return i(e),s.length?o+s.join("&"):""}},exports.isLink=function(e){const t=e.indexOf("://");if(-1===t)return!1;const r=e.slice(0,t+1);return-1!==c(["http:","https:","ftp:","file:"],r.toLowerCase())},exports.merge=function(t,r){const n=Object.prototype.toString.call(t);if("Array"==n.slice(8,-1))return t.push.apply(t,r),e(t);if("Object"==n.slice(8,-1))return Object.assign(t,r)},exports.is=r,exports.unique=function(r){if(0==t(r)){let t=e(r);return console.log(t),t}return console.log(!1),!1},exports.first=function(e){if(0!=t(e))return console.log(!1),!1;if("[object Object]"===Object.prototype.toString.call(e))for(const t of e)return console.log(t),t;else console.log(e[0])},exports.last=function(e){if(0!=t(e))return console.log(!1),!1;if("[object Object]"===Object.prototype.toString.call(e))for(const t of e)console.log(t);else console.log(e[e.length-1])},exports.findByIndex=function(e,t,r){return(e||[]).findIndex((e=>e[t]===r))},exports.setObjData=function(e,t,r,n,o){try{return e.find((function(e){return e[t]==r}))[n]=o,!0}catch(e){return!1}},exports.selectObjData=function(e,t,r){try{return e.find((function(e){return e[t]==r}))}catch(e){return""}},exports.handleTree=function(e,t,r,n){const o={id:t||"id",parentId:r||"parentId",childrenList:n||"children"},s=new Map,c=new Map,i=[];let a=e.length;for(let t=0;t<a;t++){let r=e[t];const n=r[o.parentId];s.has(n)||s.set(n,[]),c.set(r[o.id],r),s.get(n).push(r)}for(let t=0;t<a;t++){let r=e[t];const n=r[o.parentId];c.has(n)||i.push(r)}const l=[...i];for(;l.length>0;){const e=l.pop(),t=s.get(e[o.id]);t&&(e[o.childrenList]=t,l.push(...t))}return i},exports.arrToTree=function(e,t={}){let{id:r="id",pKey:n="parentId",cKey:o="children",strict:s=!0,copy:c=!0}=t,i=[];i=c?JSON.parse(JSON.stringify(e)):e;return i.filter((e=>{const t=i.filter((t=>s?t[n]===e[r]:t[n]==e[r]));return t.length&&(e[o]=t),0===e[n]}))},exports.treeToArr=function(e,t={}){let r=[],{cKey:n="children",copy:o=!0}=t,s=[...e];for(;s.length;){let e=s.pop();if(e[n])if(s.push(...e[n]),o){let t={},o=Object.keys(e),s=o.length;for(let r=0;r<s;r++)o[r]!=n&&(t[o[r]]=e[o[r]]);r.push(t)}else r.push(e)}return r},exports.treeFor=function(e,r,n={}){let{cKey:o="children"}=n,s=[...e];for(;s.length;){let e=s.shift();t(e[o])?r&&r(e):s.push(...e[o])}},exports.treeStack=function(e,r,n={}){let{cKey:o="children"}=n,s=[...e];for(;s.length;){let e=s.shift();t(e[o])?r&&r(e):s.push(...e[o])}},exports.treeRecursion=function(e,t,r={}){},exports.treeFind=function(e,t={}){let r=[],{cKey:n="children",key:o="id",value:s,copy:c=!0}=t,i=[...e];for(;i.length;){let e=i.pop();if(e[n]&&i.push(...e[n]),e[o]==s)if(c){let t={},o=Object.keys(e),s=o.length;for(let r=0;r<s;r++)o[r]!=n&&(t[o[r]]=e[o[r]]);r.push(t)}else r.push(e)}return r},exports.base64Img=function(e,t){return r=function(e){for(var t=e.split(","),r=t[0].match(/:(.*?);/)[1],n=atob(t[1]),o=n.length,s=new Uint8Array(o);o--;)s[o]=n.charCodeAt(o);return new Blob([s],{type:r})}(e),n=t,new File([r],n);var r,n},exports.compareDate=function(e,t="up"){return function(r,n){return"up"==t?Date.parse(r[e])-Date.parse(n[e]):Date.parse(n[e])-Date.parse(r[e])}},exports.compare=function(e,t="up"){return function(r,n){return"up"==t?r[e]-n[e]:n[e]-r[e]}},exports.numberRepair=function(e="",t=2,r="0",n=!1){let o="",s=(""+e).length;if(s>t&&1==n)return s;{let n=t-s;if(n>0)for(let e=0;e<n;e++)o+=r;return(o+e).slice(-1*t)}},exports.isMobile=n,exports.setMeta=function(e){if(!t(e)){let t=[];document.head.childNodes.forEach((r=>{switch(r.tagName){case"META":t.push(r);break;case"TITLE":document.title=e.title||"模板测试"}}));const r=document.createElement("META");let o=1,s="yes";e.cZoom&&(n()?e.cZoom.mobile&&(o=e.cZoom.mobile):e.cZoom.pc&&(o=e.cZoom.pc),e.cZoom.isScale&&(s=e.cZoom.isScale));let c=`width=device-width,minimum-scale=${o},initial-scale=${o},user-scalable=${s}`;"no"==s&&(c+=`,maximum-scale=${o}`);const i=[{charset:"utf-8"},{name:"viewport",content:c}],a=document.createDocumentFragment();i.forEach((e=>{a.append(r.cloneNode()),Object.entries(e).forEach((e=>{a.lastChild.setAttribute(e[0],e[1])}))})),t.forEach((e=>{document.head.removeChild(e)})),document.head.prepend(a)}},exports.colorMix=function(e,t,r){r=Math.max(Math.min(Number(r),1),0);let n=parseInt(e.substring(1,3),16),o=parseInt(e.substring(3,5),16),s=parseInt(e.substring(5,7),16),c=parseInt(t.substring(1,3),16),i=parseInt(t.substring(3,5),16),a=parseInt(t.substring(5,7),16),l=Math.round(n*(1-r)+c*r),u=Math.round(o*(1-r)+i*r),p=Math.round(s*(1-r)+a*r);return l=("0"+(l||0).toString(16)).slice(-2),u=("0"+(u||0).toString(16)).slice(-2),p=("0"+(p||0).toString(16)).slice(-2),"#"+l+u+p},exports.sArrMove=function(e,t,r){e.splice(r,0,e.splice(t,1)[0])},exports.rArrMove=function(e,t,r){let n=[].concat(e);return n.splice(r,0,n.splice(t,1)[0]),n},exports.arrSet=function(e,t,r){e.splice(t,0,r)},exports.randomColor=function(){let e=o(100,255),t=o(100,255),r=o(100,255);return"rgba("+e+","+t+","+r+",1)"},exports.randomNumber=o,exports.isDateInRange=function(e,t,r){const n=new Date(e),o=new Date(t),s=new Date(r);return n>=o&&n<=s},exports.throttle1=function(e,t){let r,n=0;return function(...o){const s=Date.now(),c=s-n;clearTimeout(r),c>=t?(e(...o),n=s):r=setTimeout((()=>{e(...o),n=Date.now()}),t-c)}},exports.throttle=function(e,t=1e3,r=!0){let n;const o=(...o)=>{n&&clearInterval(n),r?(n||e(...o),n=setTimeout((function(){n=null}),t)):n=setTimeout((()=>{e(...o)}),t)};return o.cancel=()=>{n&&(clearTimeout(n),n=null)},o},exports.debounce=function(e,t){let r;const n=function(...n){clearTimeout(r),r=setTimeout((()=>{e(...n)}),t)};return n.cancel=()=>{r&&(clearTimeout(r),r=null)},n},exports.arrayGroup=function(e,t="type"){return e.reduce(((e,r)=>{var n;return Object.assign(Object.assign({},e),{[r[t]]:[...null!==(n=e[r[t]])&&void 0!==n?n:[],r]})}),{})},exports.numberFixed=function(e,t=1){const r=e.toString(),n=r.indexOf(".");if(-1===n)return e;const o=r.slice(0,n+1+t);return parseFloat(o)},exports.delObj=function(e,n=""){try{if(t(n)){let t=Object.keys(e);for(let r of t)delete e[r]}else if("Array"==r(n))for(const t of n)delete e[t];else delete e[n]}catch(e){}},exports.delObjEmptyKey=function(e){try{let n=Object.keys(e);for(let o of n)"Number"!=r(e[o])&&t(e[o])&&delete e[o]}catch(e){}},exports.isNum=s,exports.pxToRem=function(e,t=37.5){let r=e;if(s(e)||-1!=e.indexOf("px")){r=(parseFloat(e)/t).toFixed(2)+"rem"}return r},exports.inArr=c,exports.fnRuntime=function(e,t=1){let r=0;for(let n=0;n<t;n++){const t=performance.now();e();r+=performance.now()-t}const n=r/t;console.log(`平均执行时间 ${t} 次数: ${n.toFixed(6)} ms`)},exports.objToFormData=function(e,t=!0){let n=new FormData;return function e(o,s="",c={}){let{level:i=0,pk:a="",type:l=""}=c,u=r(o);if(-1==["Array","Object"].indexOf(u)){if(null!=o){let e=s;t&&2==i&&"Array"==l&&(e=a),n.append(e,o)}}else if("Array"==u){let t=o.length;for(let r=0;r<t;r++){let t=`${s}[${r}]`,n={level:i+1,type:"Array",pk:s};e(o[r],t,n)}}else if("Object"==u){let t=Object.keys(o),r={level:i+1,type:"Object",pk:s};for(const n of t)e(o[n],`${s}${""==s?"":"."}${n}`,r)}}(e),n},exports.formatSize=function(e,t={}){if(0===e)return"0 Bytes";let{decimals:r=2,sizes:n=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"]}=t;const o=r<0?0:r,s=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,s)).toFixed(o))+" "+n[s]},exports.arrToAryTree=function(e,t={}){let{idKey:r="id",pidKey:n="pid",rKey:o="rgt",lKey:s="lft",levelKey:c="level"}=t;const i={},a={};let l=e.length;for(let t=0;t<l;t++){let o=e[t],s=o[n],c=o[r];i[c]=Object.assign({},o),a[s]||(a[s]=[]),a[s].push(c)}const u=Object.keys(a),p=Object.keys(i),f=new Set(p);let d=[];u.filter((e=>{f.has(e)||d.push(...a[e])}));let h=1;const m=[],g=[];for(let e=d.length-1;e>=0;e--)m.push({[r]:d[e],[c]:1,processed:!1});for(;m.length>0;){const e=m.pop(),t=i[e[r]];if(e.processed)t[o]=h++,g.push(t);else if(t[s]=h++,t[c]=e[c],m.push({[r]:e[r],[c]:e[c],processed:!0}),a[e[r]])for(let t=a[e[r]].length-1;t>=0;t--)m.push({[r]:a[e[r]][t],[c]:e[c]+1,processed:!1})}return g},exports.mergeObj=function(e,t={}){let{callback:n=null,callType:o="",afterBack:s=null}=t,c={};function i(e,t){let c=Object.keys(e);for(const a of c){let c=r(e[a]);n&&c==o?t[a]=n(e,a):"Object"===c?(t[a]||(t[a]={}),i(e[a],t[a])):t[a]=e[a],s&&s(t,a)}}for(const t of e)i(t,c);return c},Number.prototype.repair=function(e=2){let t="";for(let r=1;r<e;r++)t+="0";return(t+this).slice(-1*e)};exports.memoize=(e,t={})=>{const{context:r=null,ttl:n=0}=t,o=new Map,s=e=>{if("object"==typeof e&&null!==e){if(Array.isArray(e))return`[${e.map(s).join(",")}]`;return`{${Object.keys(e).sort().map((t=>`${t}:${s(e[t])}`)).join(",")}}`}return String(e)};return(...t)=>{const c=s(t),i=o.get(c);if(i&&(0===n||Date.now()-i.timestamp<=n))return i.value;const a=r?e.apply(r,t):e(...t);return o.set(c,{value:a,timestamp:Date.now()}),a}};
1
+ function e(e){let t={};return e.forEach((function(e){t[JSON.stringify(e)]=e})),e=Object.keys(t).map((function(e){if("undefined"!=e)return JSON.parse(e)}))}function t(e){let t=!1;switch(Object.prototype.toString.call(e).slice(8,-1)){case"Undefined":case"Null":t=!0;break;case"String":t=0===e.replace(/(^[ \t\n\r]*)|([ \t\n\r]*$)/g,"").length;break;case"Boolean":t=!e;break;case"Array":t=0===e.length;break;case"Number":t=0===e||isNaN(e);break;case"Object":t=0===Object.keys(e).length}return t}function r(e){return Object.prototype.toString.call(e).slice(8,-1)}function n(){return!t(navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))}function o(e,t){return Math.round(Math.random()*(t-e))+e}function s(e){let t=e+"";const r=Number(t);return!isNaN(r)&&t.length>0}function c(e=[],t,r=!1){if(r)return e.indexOf(t);{let r=-1,n=e.length;for(let o=0;o<n;o++)e[o]==t&&(r=o);return r}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.memoize=void 0,exports.del_repeat=e,exports.formatDate=function(e,t="day",r="-"){let n=e.getFullYear(),o=(e.getMonth()+1).toString().padStart(2,"0"),s=e.getDate().toString().padStart(2,"0"),c=e.getHours().toString().padStart(2,"0"),i=e.getMinutes().toString().padStart(2,"0"),a={year:1,month:2,day:3,hour:4,minute:5},l="";for(let e=0;e<a[t];e++)0==e&&(l+=n),1==e&&(l+=o),2==e&&(l+=s),3==e&&(l+=c),4==e&&(l+=i),e!=a[t]-1&&(l+=r);return l},exports.time_change=function(e){return Date.parse(e)},exports.formatTime=function(e,t="YYYY-MM-DD hh:mm:ss",r={}){try{e=e.replaceAll("-","/")}catch(e){}e=new Date(e);let n={0:"周日",1:"周一",2:"周二",3:"周三",4:"周四",5:"周五",6:"周六"},{weeks:o=n}=r,s=e.getFullYear(),c=(e.getMonth()+1).toString().padStart(2,"0"),i=e.getDate().toString().padStart(2,"0"),a=e.getHours().toString().padStart(2,"0"),l=e.getMinutes().toString().padStart(2,"0"),u=e.getSeconds().toString().padStart(2,"0"),p=o[e.getDay()],f=t;return[{format:"YYYY",data:s},{format:"yyyy",data:s},{format:"MM",data:c},{format:"DD",data:i},{format:"dd",data:i},{format:"hh",data:a},{format:"HH",data:a},{format:"mm",data:l},{format:"ss",data:u},{format:"week",data:p},{format:"time_slot",data:a>12?"下午":"上午"}].forEach((function(e,r){-1!=t.indexOf(e.format)&&(f=f.replace(e.format,""+e.data))})),f},exports.getDaysBetween=function(e,t,r=!1){var n=Date.parse(e),o=Date.parse(t),s=0;n>o&&(s=(n-o)/864e5);n<o&&(s=(o-n)/864e5,r&&(s=-s));return s},exports.is_empty=t,exports.repalce=function(e,t,r){return e.substring(0,t)+r+e.substring(t+1)},exports.toGetQuery=function(e,n={}){if(t(e))return"";{let{prefix:o="?"}=n,s=[],c=["",void 0,null];const i=(e,n="")=>{const o=Object.keys(e);for(const a of o){const o=e[a];if(c.includes(o))continue;let l=r(o),u=encodeURIComponent(a);if(t(n)||(u=`${n}[${u}]`),"Array"===l)for(const e of o)s.push(`${u}[]=${encodeURIComponent(e)}`);else if("Object"===l)i(o,u);else{let e=encodeURIComponent(o);s.push(`${u}=${e}`)}}};return i(e),s.length?o+s.join("&"):""}},exports.isLink=function(e){const t=e.indexOf("://");if(-1===t)return!1;const r=e.slice(0,t+1);return-1!==c(["http:","https:","ftp:","file:"],r.toLowerCase())},exports.merge=function(t,r){const n=Object.prototype.toString.call(t);if("Array"==n.slice(8,-1))return t.push.apply(t,r),e(t);if("Object"==n.slice(8,-1))return Object.assign(t,r)},exports.is=r,exports.unique=function(r){if(0==t(r)){let t=e(r);return console.log(t),t}return console.log(!1),!1},exports.first=function(e){if(0!=t(e))return console.log(!1),!1;if("[object Object]"===Object.prototype.toString.call(e))for(const t of e)return console.log(t),t;else console.log(e[0])},exports.last=function(e){if(0!=t(e))return console.log(!1),!1;if("[object Object]"===Object.prototype.toString.call(e))for(const t of e)console.log(t);else console.log(e[e.length-1])},exports.findByIndex=function(e,t,r){return(e||[]).findIndex((e=>e[t]===r))},exports.setObjData=function(e,t,r,n,o){try{return e.find((function(e){return e[t]==r}))[n]=o,!0}catch(e){return!1}},exports.selectObjData=function(e,t,r){try{return e.find((function(e){return e[t]==r}))}catch(e){return""}},exports.handleTree=function(e,t,r,n){const o={id:t||"id",parentId:r||"parentId",childrenList:n||"children"},s=new Map,c=new Map,i=[];let a=e.length;for(let t=0;t<a;t++){let r=e[t];const n=r[o.parentId];s.has(n)||s.set(n,[]),c.set(r[o.id],r),s.get(n).push(r)}for(let t=0;t<a;t++){let r=e[t];const n=r[o.parentId];c.has(n)||i.push(r)}const l=[...i];for(;l.length>0;){const e=l.pop(),t=s.get(e[o.id]);t&&(e[o.childrenList]=t,l.push(...t))}return i},exports.arrToTree=function(e,t={}){let{id:r="id",pKey:n="parentId",cKey:o="children",strict:s=!0,copy:c=!0}=t,i=[];i=c?JSON.parse(JSON.stringify(e)):e;return i.filter((e=>{const t=i.filter((t=>s?t[n]===e[r]:t[n]==e[r]));return t.length&&(e[o]=t),0===e[n]}))},exports.treeToArr=function(e,t={}){let r=[],{cKey:n="children",copy:o=!0}=t,s=[...e];for(;s.length;){let e=s.pop();if(e[n])if(s.push(...e[n]),o){let t={},o=Object.keys(e),s=o.length;for(let r=0;r<s;r++)o[r]!=n&&(t[o[r]]=e[o[r]]);r.push(t)}else r.push(e)}return r},exports.treeFor=function(e,r,n={}){let{cKey:o="children"}=n,s=[...e];for(;s.length;){let e=s.shift();t(e[o])?r&&r(e):s.push(...e[o])}},exports.treeStack=function(e,r,n={}){let{cKey:o="children"}=n,s=[...e];for(;s.length;){let e=s.shift();t(e[o])?r&&r(e):s.push(...e[o])}},exports.treeRecursion=function(e,t,r={}){},exports.treeFind=function(e,t={}){let r=[],{cKey:n="children",key:o="id",value:s,copy:c=!0}=t,i=[...e];for(;i.length;){let e=i.pop();if(e[n]&&i.push(...e[n]),e[o]==s)if(c){let t={},o=Object.keys(e),s=o.length;for(let r=0;r<s;r++)o[r]!=n&&(t[o[r]]=e[o[r]]);r.push(t)}else r.push(e)}return r},exports.base64Img=function(e,t){return r=function(e){for(var t=e.split(","),r=t[0].match(/:(.*?);/)[1],n=atob(t[1]),o=n.length,s=new Uint8Array(o);o--;)s[o]=n.charCodeAt(o);return new Blob([s],{type:r})}(e),n=t,new File([r],n);var r,n},exports.compareDate=function(e,t="up"){return function(r,n){return"up"==t?Date.parse(r[e])-Date.parse(n[e]):Date.parse(n[e])-Date.parse(r[e])}},exports.compare=function(e,t="up"){return function(r,n){return"up"==t?r[e]-n[e]:n[e]-r[e]}},exports.numberRepair=function(e="",t=2,r="0",n=!1){let o="",s=(""+e).length;if(s>t&&1==n)return s;{let n=t-s;if(n>0)for(let e=0;e<n;e++)o+=r;return(o+e).slice(-1*t)}},exports.isMobile=n,exports.setMeta=function(e){if(!t(e)){let t=[];document.head.childNodes.forEach((r=>{switch(r.tagName){case"META":t.push(r);break;case"TITLE":document.title=e.title||"模板测试"}}));const r=document.createElement("META");let o=1,s="yes";e.cZoom&&(n()?e.cZoom.mobile&&(o=e.cZoom.mobile):e.cZoom.pc&&(o=e.cZoom.pc),e.cZoom.isScale&&(s=e.cZoom.isScale));let c=`width=device-width,minimum-scale=${o},initial-scale=${o},user-scalable=${s}`;"no"==s&&(c+=`,maximum-scale=${o}`);const i=[{charset:"utf-8"},{name:"viewport",content:c}],a=document.createDocumentFragment();i.forEach((e=>{a.append(r.cloneNode()),Object.entries(e).forEach((e=>{a.lastChild.setAttribute(e[0],e[1])}))})),t.forEach((e=>{document.head.removeChild(e)})),document.head.prepend(a)}},exports.colorMix=function(e,t,r){r=Math.max(Math.min(Number(r),1),0);let n=parseInt(e.substring(1,3),16),o=parseInt(e.substring(3,5),16),s=parseInt(e.substring(5,7),16),c=parseInt(t.substring(1,3),16),i=parseInt(t.substring(3,5),16),a=parseInt(t.substring(5,7),16),l=Math.round(n*(1-r)+c*r),u=Math.round(o*(1-r)+i*r),p=Math.round(s*(1-r)+a*r);return l=("0"+(l||0).toString(16)).slice(-2),u=("0"+(u||0).toString(16)).slice(-2),p=("0"+(p||0).toString(16)).slice(-2),"#"+l+u+p},exports.sArrMove=function(e,t,r){e.splice(r,0,e.splice(t,1)[0])},exports.rArrMove=function(e,t,r){let n=[].concat(e);return n.splice(r,0,n.splice(t,1)[0]),n},exports.arrSet=function(e,t,r){e.splice(t,0,r)},exports.randomColor=function(){let e=o(100,255),t=o(100,255),r=o(100,255);return"rgba("+e+","+t+","+r+",1)"},exports.randomNumber=o,exports.isDateInRange=function(e,t,r){const n=new Date(e),o=new Date(t),s=new Date(r);return n>=o&&n<=s},exports.throttle1=function(e,t){let r,n=0;return function(...o){const s=Date.now(),c=s-n;clearTimeout(r),c>=t?(e(...o),n=s):r=setTimeout((()=>{e(...o),n=Date.now()}),t-c)}},exports.throttle=function(e,t=1e3,r=!0){let n;const o=(...o)=>{n&&clearInterval(n),r?(n||e(...o),n=setTimeout((function(){n=null}),t)):n=setTimeout((()=>{e(...o)}),t)};return o.cancel=()=>{n&&(clearTimeout(n),n=null)},o},exports.debounce=function(e,t){let r;const n=function(...n){clearTimeout(r),r=setTimeout((()=>{e(...n)}),t)};return n.cancel=()=>{r&&(clearTimeout(r),r=null)},n},exports.arrayGroup=function(e,t="type"){return e.reduce(((e,r)=>{var n;return Object.assign(Object.assign({},e),{[r[t]]:[...null!==(n=e[r[t]])&&void 0!==n?n:[],r]})}),{})},exports.numberFixed=function(e,t=1){const r=e.toString(),n=r.indexOf(".");if(-1===n)return e;const o=r.slice(0,n+1+t);return parseFloat(o)},exports.delObj=function(e,n=""){try{if(t(n)){let t=Object.keys(e);for(let r of t)delete e[r]}else if("Array"==r(n))for(const t of n)delete e[t];else delete e[n]}catch(e){}},exports.delObjEmptyKey=function(e){try{let n=Object.keys(e);for(let o of n)"Number"!=r(e[o])&&t(e[o])&&delete e[o]}catch(e){}},exports.isNum=s,exports.pxToRem=function(e,t=37.5){let r=e;if(s(e)||-1!=e.indexOf("px")){r=(parseFloat(e)/t).toFixed(2)+"rem"}return r},exports.inArr=c,exports.fnRuntime=function(e,t=1){let r=0;for(let n=0;n<t;n++){const t=performance.now();e();r+=performance.now()-t}const n=r/t;console.log(`平均执行时间 ${t} 次数: ${n.toFixed(6)} ms`)},exports.objToFormData=function(e,t=!0){let n=new FormData;return function e(o,s="",c={}){let{level:i=0,pk:a="",type:l=""}=c,u=r(o);if(-1==["Array","Object"].indexOf(u)){if(null!=o){let e=s;t&&2==i&&"Array"==l&&(e=a),n.append(e,o)}}else if("Array"==u){let t=o.length;for(let r=0;r<t;r++){let t=`${s}[${r}]`,n={level:i+1,type:"Array",pk:s};e(o[r],t,n)}}else if("Object"==u){let t=Object.keys(o),r={level:i+1,type:"Object",pk:s};for(const n of t)e(o[n],`${s}${""==s?"":"."}${n}`,r)}}(e),n},exports.formatSize=function(e,t={}){if(0===e)return"0 Bytes";let{decimals:r=2,sizes:n=["Bytes","KB","MB","GB","TB","PB","EB","ZB","YB"],perUnit:o=1024}=t;const s=r<0?0:r,c=Math.floor(Math.log(e)/Math.log(o));return parseFloat((e/Math.pow(o,c)).toFixed(s))+" "+n[c]},exports.arrToAryTree=function(e,t={}){let{idKey:r="id",pidKey:n="pid",rKey:o="rgt",lKey:s="lft",levelKey:c="level"}=t;const i={},a={};let l=e.length;for(let t=0;t<l;t++){let o=e[t],s=o[n],c=o[r];i[c]=Object.assign({},o),a[s]||(a[s]=[]),a[s].push(c)}const u=Object.keys(a),p=Object.keys(i),f=new Set(p);let d=[];u.filter((e=>{f.has(e)||d.push(...a[e])}));let h=1;const m=[],g=[];for(let e=d.length-1;e>=0;e--)m.push({[r]:d[e],[c]:1,processed:!1});for(;m.length>0;){const e=m.pop(),t=i[e[r]];if(e.processed)t[o]=h++,g.push(t);else if(t[s]=h++,t[c]=e[c],m.push({[r]:e[r],[c]:e[c],processed:!0}),a[e[r]])for(let t=a[e[r]].length-1;t>=0;t--)m.push({[r]:a[e[r]][t],[c]:e[c]+1,processed:!1})}return g},exports.mergeObj=function(e,t={}){let{callback:n=null,callType:o="",afterBack:s=null}=t,c={};function i(e,t){let c=Object.keys(e);for(const a of c){let c=r(e[a]);n&&c==o?t[a]=n(e,a):"Object"===c?(t[a]||(t[a]={}),i(e[a],t[a])):t[a]=e[a],s&&s(t,a)}}for(const t of e)i(t,c);return c},Number.prototype.repair=function(e=2){let t="";for(let r=1;r<e;r++)t+="0";return(t+this).slice(-1*e)};exports.memoize=(e,t={})=>{const{context:r=null,ttl:n=0}=t,o=new Map,s=e=>{if("object"==typeof e&&null!==e){if(Array.isArray(e))return`[${e.map(s).join(",")}]`;return`{${Object.keys(e).sort().map((t=>`${t}:${s(e[t])}`)).join(",")}}`}return String(e)};return(...t)=>{const c=s(t),i=o.get(c);if(i&&(0===n||Date.now()-i.timestamp<=n))return i.value;const a=r?e.apply(r,t):e(...t);return o.set(c,{value:a,timestamp:Date.now()}),a}};
package/lib/request.d.ts CHANGED
@@ -1,32 +1,34 @@
1
+ /**
2
+ * 请求配置接口
3
+ */
1
4
  interface conf {
5
+ /** 请求的基础URL前缀 */
2
6
  baseUrl?: string;
7
+ /** 请求超时时间,单位毫秒,默认6000ms */
3
8
  timeout?: number;
4
- callback?: any;
5
- errBack?: any;
6
- abController?: any;
7
- beforeBack?: any;
9
+ /** 请求成功后的回调函数,可以处理响应数据 */
10
+ callback?: (response: Response) => Promise<any> | any;
11
+ /** 请求失败时的错误处理回调函数 */
12
+ errBack?: (error: Error) => void;
13
+ /** 获取AbortController实例的回调,用于手动中断请求 */
14
+ abController?: (controller: AbortController) => void;
15
+ /** 请求发送前的预处理回调,可以修改请求选项 */
16
+ beforeBack?: (options: any) => void;
8
17
  }
9
- /** 2025/3/31 15:54 User: DJ
10
- * content: fetch请求
11
- * method: "POST"
12
- * 指定 HTTP 请求方法。在这里是 POST,意味着客户端请求是为了向服务器发送数据。与之相对的还有 GET、PUT、DELETE 等方法。
13
- * mode: "cors"
14
- * 这个设置指定请求的跨域策略。cors 是跨源资源共享(Cross-Origin Resource Sharing)的缩写。当使用 cors 时,浏览器允许在不同域之间发起请求。如果不设置,默认值通常是 same-origin,即只允许发起同源请求(即 URL 与当前页面相同的请求)。
15
- * cache: "no-cache"
16
- * 缓存策略,设置为 no-cache 时,意味着不使用缓存,每次请求都会从服务器获取最新的数据。其他常见的值有 default(默认策略)、reload(重新加载)、force-cache(强制使用缓存)等。
17
- * credentials: "same-origin"
18
- * 这个设置决定了请求是否包含凭证信息(如 Cookies)。same-origin 表示仅在同源请求中发送凭证信息。如果设置为 include,即使是跨域请求,也会发送凭证。如果设置为 omit,则无论请求是否跨域,均不会发送凭证。
19
- * headers: { "Content-Type": "application/json" }
20
- * 请求头,Content-Type 表示请求体的内容类型。在这里,我们将其设置为 application/json,表示请求体的数据是 JSON 格式。其他常见的类型包括 application/x-www-form-urlencoded、multipart/form-data 等。
21
- * redirect: "follow"
22
- * 这个设置指定如何处理 HTTP 重定向。follow 表示如果服务器返回重定向响应(如 301 或 302),浏览器会自动跟随该重定向。其他选项包括 manual(需要手动处理重定向)和 error(遇到重定向直接报错)。
23
- * referrerPolicy: "no-referrer"
24
- * 这个设置控制请求的引用来源信息(Referrer)的处理方式。no-referrer 表示不发送任何引用来源信息。其他常见的选项有:
25
- * no-referrer-when-downgrade(只有在从 HTTPS 到 HTTP 的情况下才不发送引用信息)
26
- * origin(仅发送源信息)
27
- * strict-origin(仅在 HTTPS 请求中发送完整的引用信息)
28
- * body: JSON.stringify(data)
29
- * 请求的主体内容。我们将 data 对象转化为 JSON 字符串发送到服务器。body 是 POST 请求的主要部分,用来发送需要提交的数据。在这里,我们通过 JSON.stringify(data) 将 JavaScript 对象转换为 JSON 字符串。
18
+ /**
19
+ * Fetch请求客户端类
20
+ * @description 基于fetch API的HTTP请求封装,支持超时、拦截器、错误处理等功能
21
+ * 支持的fetch配置项:
22
+ * - method: HTTP请求方法 (GET, POST, PUT, DELETE等)
23
+ * - mode: 跨域策略 ("cors", "same-origin", "no-cors")
24
+ * - cache: 缓存策略 ("no-cache", "default", "reload", "force-cache")
25
+ * - credentials: 凭证策略 ("same-origin", "include", "omit")
26
+ * - headers: 请求头,如 {"Content-Type": "application/json"}
27
+ * - redirect: 重定向处理 ("follow", "manual", "error")
28
+ * - referrerPolicy: 引用策略 ("no-referrer", "origin", "strict-origin")
29
+ * - body: 请求体,通常使用 JSON.stringify(data) 转换对象
30
+ * @author DJ
31
+ * @since 2025/3/31
30
32
  */
31
33
  export default class {
32
34
  options: any;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tools_dj",
3
- "version": "1.0.82",
3
+ "version": "1.0.83",
4
4
  "description": "dj tools 工具库",
5
5
  "main": "./lib/index.js",
6
6
  "module": "./lib/index.js",