gxxc-util 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.
@@ -0,0 +1,260 @@
1
+ 'use strict';
2
+
3
+ var printJS = require('print-js');
4
+ var detectBrowser = require('detect-browser');
5
+ var dayjs = require('dayjs');
6
+ var quarterOfYear = require('dayjs/plugin/quarterOfYear');
7
+ require('dayjs/locale/zh-cn');
8
+
9
+ function _interopNamespaceDefault(e) {
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var detectBrowser__namespace = /*#__PURE__*/_interopNamespaceDefault(detectBrowser);
27
+
28
+ dayjs.extend(quarterOfYear);
29
+ dayjs.locale("zh-cn");
30
+ /**
31
+ * 函数"sys_print"接受具有“url”属性的对象,并使用它通过“printJS”函数打印文档。
32
+ * @param props - `props` 参数是一个具有单个属性 `url` 的对象,该属性是一个字符串。
33
+ */
34
+ const sys_print = (props) => {
35
+ printJS(props?.url);
36
+ };
37
+ const BrowserNameVersion = [
38
+ { name: "chrome", version: 88 },
39
+ { name: "safari", version: 14 },
40
+ { name: "firefox", version: 78 },
41
+ { name: "opera", version: 74 },
42
+ { name: "edge-chromium", version: 88 },
43
+ ];
44
+ /**
45
+ * 函数"sys_detectBrowser"检查浏览器版本,版本在当前系统兼容之外,将弹出提示
46
+ */
47
+ const sys_detectBrowser = () => {
48
+ const browser = detectBrowser__namespace.detect();
49
+ if (browser) {
50
+ let isShowAlert = false;
51
+ const currentBrowser = BrowserNameVersion?.filter((item) => item.name === browser.name)?.[0];
52
+ if (currentBrowser?.version && browser?.version && parseInt(browser?.version) < currentBrowser?.version) {
53
+ isShowAlert = true;
54
+ }
55
+ if (isShowAlert) {
56
+ alert("您当前的浏览器版本较低,请考虑升级浏览器版本或使用其他浏览器以获取最佳体验。");
57
+ }
58
+ }
59
+ };
60
+ /**
61
+ * 函数“win_dynamic_fontSize”根据当前屏幕宽度计算并设置文档的字体大小。
62
+ */
63
+ const win_dynamic_fontSize = () => {
64
+ const screenWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
65
+ const baseScreenWidth = 1920;
66
+ const baseFontSize = 16;
67
+ const fontSize = (screenWidth / baseScreenWidth) * baseFontSize;
68
+ document.documentElement.style.fontSize = fontSize + "px";
69
+ };
70
+ // 废弃
71
+ const tem_compare_version = (version1, version2) => {
72
+ const v1Array = version1.split(".").map(Number);
73
+ const v2Array = version2.split(".").map(Number);
74
+ for (let i = 0; i < Math.max(v1Array.length, v2Array.length); i++) {
75
+ const v1Part = v1Array[i] || 0;
76
+ const v2Part = v2Array[i] || 0;
77
+ if (v1Part > v2Part) {
78
+ return true;
79
+ }
80
+ else if (v1Part < v2Part) {
81
+ return false;
82
+ }
83
+ }
84
+ return true;
85
+ };
86
+ /**
87
+ * 新的表头数据转译
88
+ * @param {KeyVal} keyVal 接口返回的存在的表头
89
+ * @param {TableHeaderItem} cache 存储
90
+ * @param {TableHeaderItem} initial 默认
91
+ */
92
+ const tem_get_tableHeader = (keyVal, cache, initial) => {
93
+ const returnList = [];
94
+ const transformList = [];
95
+ if (keyVal) {
96
+ Object.keys(keyVal)?.forEach((key) => {
97
+ const item = {};
98
+ item.key = key;
99
+ item.name = keyVal[key];
100
+ transformList.push(item);
101
+ });
102
+ }
103
+ transformList.forEach((i) => {
104
+ initial?.forEach((j) => {
105
+ if (cache?.length > 0 && initial?.length === cache?.length) {
106
+ cache?.forEach((k) => {
107
+ if (i?.key === j?.key && i?.key === k?.key) {
108
+ i = { ...i, ...j, ...k };
109
+ i.width = j?.width;
110
+ i.sort = k?.sort ? k?.sort : j.sort;
111
+ i.selected = k?.selected === undefined ? true : k?.selected;
112
+ returnList.push(i);
113
+ }
114
+ });
115
+ }
116
+ else {
117
+ if (i?.key === j?.key) {
118
+ i = { ...i, ...j };
119
+ i.selected = true;
120
+ returnList.push(i);
121
+ }
122
+ }
123
+ });
124
+ });
125
+ if (initial[initial.length - 1]?.key === "operate") {
126
+ returnList.push(initial[initial.length - 1]);
127
+ }
128
+ returnList.sort((a, b) => {
129
+ return (a?.sort ?? 1) - (b?.sort ?? 2);
130
+ });
131
+ return returnList;
132
+ };
133
+ /**
134
+ * 获取枚举配置
135
+ * @param {*} value 当前value值
136
+ * @param {*} array 当前枚举配置
137
+ */
138
+ const getOptionConfig = (value, array) => {
139
+ if (!!value || value === 0) {
140
+ const findItem = array?.find((item) => item.value === value);
141
+ return findItem ? findItem : {};
142
+ }
143
+ else {
144
+ return {};
145
+ }
146
+ };
147
+ /**
148
+ * 获取url 文件名 除后缀名以外的地址名 后缀名
149
+ * @param {*} url 地址
150
+ */
151
+ const getUrlConfig = (url) => {
152
+ if (!!url) {
153
+ const urlObj = new URL(url);
154
+ const path = urlObj.pathname;
155
+ const fileName = decodeURIComponent(path.substring(path.lastIndexOf("/") + 1));
156
+ const suffix = fileName.substring(fileName.lastIndexOf(".") + 1);
157
+ const prefixPath = url.substring(0, url.lastIndexOf("."));
158
+ return {
159
+ fileName: fileName ?? "",
160
+ prefix: prefixPath ?? "",
161
+ suffix: suffix ?? "",
162
+ };
163
+ }
164
+ else {
165
+ return null;
166
+ }
167
+ };
168
+ /**
169
+ * timejs 依赖于 dayjs 构建,形成管理时间的工具函数
170
+ * TypeScript 中的 `timejs` 函数接受一个参数 `props`,并返回使用 `props` 调用 `dayjs` 的结果。
171
+ * @param {any} props - `timejs` 函数中的 `props` 参数预计为 `any` 类型,这意味着它可以接受任何数据类型作为其值。
172
+ *
173
+ * @returns `timejs` 函数正在返回使用 `props` 参数调用 `dayjs` 函数的结果。
174
+ */
175
+ const timejs = (props, props1, props2) => {
176
+ return dayjs(props, props1, props2);
177
+ };
178
+ /**
179
+ * 从视频地址中提取第一帧作为预览图(base64 格式)
180
+ * @param videoUrl 视频地址(支持跨域或 Blob URL)
181
+ * @param frameTime 预览帧时间点(number)
182
+ * @returns 返回一个Promise,成功时返回 base64 图片,失败返回空字符串
183
+ */
184
+ const video_preview = (videoUrl, frameTime = 0.1) => {
185
+ return new Promise((resolve) => {
186
+ // 参数校验:无效地址或非法时间直接返回空
187
+ if (!videoUrl || typeof videoUrl !== "string" || frameTime < 0) {
188
+ return resolve("");
189
+ }
190
+ // 创建 video 元素用于加载视频
191
+ const video = document.createElement("video");
192
+ video.crossOrigin = "anonymous"; // 解决跨域问题
193
+ video.src = videoUrl; // 设置视频地址
194
+ video.muted = true; // 静音播放,避免浏览器限制
195
+ // 超时控制:10 秒内未完成则中断并返回空
196
+ const timeout = setTimeout(() => {
197
+ cleanup();
198
+ resolve("");
199
+ }, 10000);
200
+ // 清理函数:释放资源
201
+ const cleanup = () => {
202
+ clearTimeout(timeout); // 清除超时定时器
203
+ video.pause(); // 暂停播放
204
+ video.removeAttribute("src"); // 清除 src 属性
205
+ video.load(); // 重新加载资源(释放内存)
206
+ };
207
+ // 视频元数据加载完成后触发
208
+ video.onloadedmetadata = () => {
209
+ // 如果宽高为 0,说明视频未正确加载
210
+ if (video.videoWidth === 0 || video.videoHeight === 0) {
211
+ return resolve("");
212
+ }
213
+ // 设置到指定帧位置
214
+ video.currentTime = frameTime;
215
+ };
216
+ // seeked 事件表示视频已经跳转到目标时间点(即已准备好绘制)
217
+ video.onseeked = () => {
218
+ try {
219
+ // 创建 canvas 用于绘制视频帧
220
+ const canvas = document.createElement("canvas");
221
+ canvas.width = video.videoWidth;
222
+ canvas.height = video.videoHeight;
223
+ // 获取 canvas 的绘图上下文
224
+ const ctx = canvas.getContext("2d");
225
+ if (!ctx)
226
+ return resolve("");
227
+ // 将当前帧绘制到 canvas 上
228
+ ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
229
+ // 将 canvas 内容转换为 base64 图片
230
+ const imgUrl = canvas.toDataURL("image/jpeg");
231
+ // 清理资源并返回结果
232
+ cleanup();
233
+ resolve(imgUrl);
234
+ }
235
+ catch (error) {
236
+ console.error("Canvas draw error:", error);
237
+ // 绘制过程中出错,清理并返回空
238
+ cleanup();
239
+ resolve("");
240
+ }
241
+ };
242
+ // 视频加载错误处理
243
+ video.onerror = () => {
244
+ cleanup();
245
+ resolve("");
246
+ };
247
+ // 开始加载视频
248
+ video.load();
249
+ });
250
+ };
251
+
252
+ exports.getOptionConfig = getOptionConfig;
253
+ exports.getUrlConfig = getUrlConfig;
254
+ exports.sys_detectBrowser = sys_detectBrowser;
255
+ exports.sys_print = sys_print;
256
+ exports.tem_compare_version = tem_compare_version;
257
+ exports.tem_get_tableHeader = tem_get_tableHeader;
258
+ exports.timejs = timejs;
259
+ exports.video_preview = video_preview;
260
+ exports.win_dynamic_fontSize = win_dynamic_fontSize;
@@ -0,0 +1,189 @@
1
+ 'use strict';
2
+
3
+ // 数字文本
4
+ const val_number = (_, value) => {
5
+ if (value) {
6
+ if (/\s/.test(value)) {
7
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
8
+ }
9
+ else if (isNaN(Number(value))) {
10
+ return Promise.reject(new Error("请输入有效的数字文本!"));
11
+ }
12
+ else {
13
+ return Promise.resolve();
14
+ }
15
+ }
16
+ else {
17
+ return Promise.resolve();
18
+ }
19
+ };
20
+ // 两位小数点百分比
21
+ const val_two_percent = (_, value) => {
22
+ if (value) {
23
+ if (/\s/.test(value)) {
24
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
25
+ }
26
+ else if (isNaN(Number(value))) {
27
+ return Promise.reject(new Error("请输入有效的数字文本!"));
28
+ }
29
+ else if (Number(value) <= 0 || Number(value) >= 100) {
30
+ return Promise.reject(new Error("范围必须在0到100之间!"));
31
+ }
32
+ else if (!/^\d+(\.\d{1,2})?$/.test(value)) {
33
+ return Promise.reject(new Error("最多支持两位小数!"));
34
+ }
35
+ else {
36
+ return Promise.resolve();
37
+ }
38
+ }
39
+ else {
40
+ return Promise.resolve();
41
+ }
42
+ };
43
+ // 三位小数点百分比
44
+ const val_three_percent = (_, value) => {
45
+ if (value) {
46
+ if (/\s/.test(value)) {
47
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
48
+ }
49
+ else if (isNaN(Number(value))) {
50
+ return Promise.reject(new Error("请输入有效的数字文本!"));
51
+ }
52
+ else if (Number(value) <= 0 || Number(value) >= 100) {
53
+ return Promise.reject(new Error("范围必须在0到100之间!"));
54
+ }
55
+ else if (!/^\d+(\.\d{1,3})?$/.test(value)) {
56
+ return Promise.reject(new Error("最多支持三位小数!"));
57
+ }
58
+ else {
59
+ return Promise.resolve();
60
+ }
61
+ }
62
+ else {
63
+ return Promise.resolve();
64
+ }
65
+ };
66
+ // 金额文本 支持到小数点后两位
67
+ const val_amount = (_, value) => {
68
+ if (value) {
69
+ if (/\s/.test(value)) {
70
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
71
+ }
72
+ else if (isNaN(Number(value))) {
73
+ return Promise.reject(new Error("请输入有效的数字文本!"));
74
+ }
75
+ else if (!/^\d+(\.\d{1,2})?$/.test(value)) {
76
+ return Promise.reject(new Error("最多支持两位小数!"));
77
+ }
78
+ else {
79
+ return Promise.resolve();
80
+ }
81
+ }
82
+ else {
83
+ return Promise.resolve();
84
+ }
85
+ };
86
+ // 身份证
87
+ const val_idcard = (_rule, value) => {
88
+ if (value) {
89
+ const idCardRegex = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|10|11|12)(0[1-9]|[1-2]\d|30|31)\d{3}[0-9X]$/;
90
+ if (/\s/.test(value)) {
91
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
92
+ }
93
+ else if (!idCardRegex.test(value)) {
94
+ return Promise.reject(new Error("身份证号格式不正确!"));
95
+ }
96
+ else {
97
+ return Promise.resolve();
98
+ }
99
+ }
100
+ else {
101
+ return Promise.resolve();
102
+ }
103
+ };
104
+ // 手机号
105
+ const val_phone = (_, value) => {
106
+ if (value) {
107
+ const phoneRegex = /^1[0-9]{10}$/;
108
+ if (/\s/.test(value)) {
109
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
110
+ }
111
+ else if (!phoneRegex.test(value)) {
112
+ return Promise.reject(new Error("手机号格式不正确!"));
113
+ }
114
+ else {
115
+ return Promise.resolve();
116
+ }
117
+ }
118
+ else {
119
+ return Promise.resolve();
120
+ }
121
+ };
122
+ // 联系电话校验(只校验座机格式 例如 010-12345678 010 12345678 (010)12345678)
123
+ const val_landline = (_, value) => {
124
+ if (value) {
125
+ const landlinePhoneRegex = /^[\d\s()-]+$/;
126
+ if (!landlinePhoneRegex.test(value)) {
127
+ return Promise.reject(new Error("联系电话格式不正确!"));
128
+ }
129
+ else {
130
+ return Promise.resolve();
131
+ }
132
+ }
133
+ else {
134
+ return Promise.resolve();
135
+ }
136
+ };
137
+ // 邮箱校验
138
+ const val_email = (_, value) => {
139
+ if (!value || value === "/") {
140
+ return Promise.resolve();
141
+ }
142
+ if (/\s/.test(value)) {
143
+ return Promise.reject(new Error("请去除文本前后及内容中的空格!"));
144
+ }
145
+ else {
146
+ const emailRegex = /^[\p{L}\d_\-.]+@[\p{L}\d-]+(\.[\p{L}\d-]+)*\.[\p{L}]{2,}$/u;
147
+ if (!emailRegex.test(value)) {
148
+ return Promise.reject(new Error("邮箱格式不正确!"));
149
+ }
150
+ else {
151
+ return Promise.resolve();
152
+ }
153
+ }
154
+ };
155
+ //空格校验
156
+ const val_space = (_, value) => {
157
+ if (!value) {
158
+ return Promise.resolve();
159
+ }
160
+ else if (/\s/.test(value)) {
161
+ return Promise.reject(new Error("文本内容包含空格!"));
162
+ }
163
+ else {
164
+ return Promise.resolve();
165
+ }
166
+ };
167
+ //前后空格
168
+ const val_beforeAfter_space = (_, value) => {
169
+ if (!value) {
170
+ return Promise.resolve();
171
+ }
172
+ else if (/^\s|\s$/g.test(value)) {
173
+ return Promise.reject(new Error("文本内容前后包含空格!"));
174
+ }
175
+ else {
176
+ return Promise.resolve();
177
+ }
178
+ };
179
+
180
+ exports.val_amount = val_amount;
181
+ exports.val_beforeAfter_space = val_beforeAfter_space;
182
+ exports.val_email = val_email;
183
+ exports.val_idcard = val_idcard;
184
+ exports.val_landline = val_landline;
185
+ exports.val_number = val_number;
186
+ exports.val_phone = val_phone;
187
+ exports.val_space = val_space;
188
+ exports.val_three_percent = val_three_percent;
189
+ exports.val_two_percent = val_two_percent;