@boteteam/utils 0.0.30 → 0.0.32
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/dist/cjs/file.js +4 -4
- package/dist/cjs/file.js.map +2 -2
- package/dist/cjs/formatModule/formatModuleData.d.ts +3 -1
- package/dist/cjs/formatModule/formatModuleData.js +102 -17
- package/dist/cjs/formatModule/formatModuleData.js.map +3 -3
- package/dist/cjs/formatModule/helpers/checkDataSourceOfFn.d.ts +2 -0
- package/dist/cjs/formatModule/helpers/checkDataSourceOfFn.js +33 -0
- package/dist/cjs/formatModule/helpers/checkDataSourceOfFn.js.map +7 -0
- package/dist/cjs/formatModule/helpers/cssToJson.d.ts +22 -0
- package/dist/cjs/formatModule/helpers/cssToJson.js +78 -0
- package/dist/cjs/formatModule/helpers/cssToJson.js.map +7 -0
- package/dist/cjs/formatModule/helpers/formatDataProps.d.ts +19 -0
- package/dist/cjs/formatModule/helpers/formatDataProps.js +65 -0
- package/dist/cjs/formatModule/helpers/formatDataProps.js.map +7 -0
- package/dist/cjs/formatModule/helpers/formatFormProps.js +7 -0
- package/dist/cjs/formatModule/helpers/formatFormProps.js.map +3 -3
- package/dist/cjs/formatModule/helpers/formatListProps.js +25 -9
- package/dist/cjs/formatModule/helpers/formatListProps.js.map +3 -3
- package/dist/cjs/formatModule/helpers/formatLoopProps.d.ts +1 -4
- package/dist/cjs/formatModule/helpers/formatLoopProps.js +20 -8
- package/dist/cjs/formatModule/helpers/formatLoopProps.js.map +3 -3
- package/dist/cjs/formatModule/helpers/formatStepsProps.js +49 -32
- package/dist/cjs/formatModule/helpers/formatStepsProps.js.map +3 -3
- package/dist/cjs/formatModule/helpers/formatStyleProps.d.ts +16 -3
- package/dist/cjs/formatModule/helpers/formatStyleProps.js +100 -37
- package/dist/cjs/formatModule/helpers/formatStyleProps.js.map +3 -3
- package/dist/cjs/formatModule/helpers/formatTableProps.d.ts +7 -1
- package/dist/cjs/formatModule/helpers/formatTableProps.js +46 -11
- package/dist/cjs/formatModule/helpers/formatTableProps.js.map +3 -3
- package/dist/cjs/formatModule/helpers/formatTabsProps.d.ts +15 -0
- package/dist/cjs/formatModule/helpers/formatTabsProps.js +49 -0
- package/dist/cjs/formatModule/helpers/formatTabsProps.js.map +7 -0
- package/dist/cjs/formatModule/helpers/formatVideoProps.d.ts +12 -0
- package/dist/cjs/formatModule/helpers/formatVideoProps.js +45 -0
- package/dist/cjs/formatModule/helpers/formatVideoProps.js.map +7 -0
- package/dist/cjs/formatModule/helpers/index.d.ts +6 -1
- package/dist/cjs/formatModule/helpers/index.js +15 -0
- package/dist/cjs/formatModule/helpers/index.js.map +3 -3
- package/dist/cjs/formatModule/helpers/stringScriptExecution.js +1 -1
- package/dist/cjs/formatModule/helpers/stringScriptExecution.js.map +1 -1
- package/dist/cjs/http.d.ts +17 -0
- package/dist/cjs/http.js +123 -1
- package/dist/cjs/http.js.map +2 -2
- package/dist/cjs/index.d.ts +5 -4
- package/dist/cjs/index.js +19 -0
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/treeUtils.d.ts +31 -3
- package/dist/cjs/treeUtils.js +53 -10
- package/dist/cjs/treeUtils.js.map +3 -3
- package/dist/cjs/watermark.d.ts +80 -0
- package/dist/cjs/watermark.js +350 -0
- package/dist/cjs/watermark.js.map +7 -0
- package/dist/esm/file.js +5 -4
- package/dist/esm/file.js.map +1 -1
- package/dist/esm/formatModule/formatModuleData.d.ts +3 -1
- package/dist/esm/formatModule/formatModuleData.js +121 -40
- package/dist/esm/formatModule/formatModuleData.js.map +1 -1
- package/dist/esm/formatModule/helpers/checkDataSourceOfFn.d.ts +2 -0
- package/dist/esm/formatModule/helpers/checkDataSourceOfFn.js +9 -0
- package/dist/esm/formatModule/helpers/checkDataSourceOfFn.js.map +1 -0
- package/dist/esm/formatModule/helpers/cssToJson.d.ts +22 -0
- package/dist/esm/formatModule/helpers/cssToJson.js +103 -0
- package/dist/esm/formatModule/helpers/cssToJson.js.map +1 -0
- package/dist/esm/formatModule/helpers/formatDataProps.d.ts +19 -0
- package/dist/esm/formatModule/helpers/formatDataProps.js +26 -0
- package/dist/esm/formatModule/helpers/formatDataProps.js.map +1 -0
- package/dist/esm/formatModule/helpers/formatFormProps.js +6 -0
- package/dist/esm/formatModule/helpers/formatFormProps.js.map +1 -1
- package/dist/esm/formatModule/helpers/formatListProps.js +26 -9
- package/dist/esm/formatModule/helpers/formatListProps.js.map +1 -1
- package/dist/esm/formatModule/helpers/formatLoopProps.d.ts +1 -4
- package/dist/esm/formatModule/helpers/formatLoopProps.js +13 -12
- package/dist/esm/formatModule/helpers/formatLoopProps.js.map +1 -1
- package/dist/esm/formatModule/helpers/formatStepsProps.js +38 -31
- package/dist/esm/formatModule/helpers/formatStepsProps.js.map +1 -1
- package/dist/esm/formatModule/helpers/formatStyleProps.d.ts +16 -3
- package/dist/esm/formatModule/helpers/formatStyleProps.js +90 -43
- package/dist/esm/formatModule/helpers/formatStyleProps.js.map +1 -1
- package/dist/esm/formatModule/helpers/formatTableProps.d.ts +7 -1
- package/dist/esm/formatModule/helpers/formatTableProps.js +57 -8
- package/dist/esm/formatModule/helpers/formatTableProps.js.map +1 -1
- package/dist/esm/formatModule/helpers/formatTabsProps.d.ts +15 -0
- package/dist/esm/formatModule/helpers/formatTabsProps.js +46 -0
- package/dist/esm/formatModule/helpers/formatTabsProps.js.map +1 -0
- package/dist/esm/formatModule/helpers/formatVideoProps.d.ts +12 -0
- package/dist/esm/formatModule/helpers/formatVideoProps.js +31 -0
- package/dist/esm/formatModule/helpers/formatVideoProps.js.map +1 -0
- package/dist/esm/formatModule/helpers/index.d.ts +6 -1
- package/dist/esm/formatModule/helpers/index.js +6 -1
- package/dist/esm/formatModule/helpers/index.js.map +1 -1
- package/dist/esm/formatModule/helpers/stringScriptExecution.js +1 -1
- package/dist/esm/formatModule/helpers/stringScriptExecution.js.map +1 -1
- package/dist/esm/http.d.ts +17 -0
- package/dist/esm/http.js +208 -43
- package/dist/esm/http.js.map +1 -1
- package/dist/esm/index.d.ts +5 -4
- package/dist/esm/index.js +4 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/treeUtils.d.ts +31 -3
- package/dist/esm/treeUtils.js +118 -15
- package/dist/esm/treeUtils.js.map +1 -1
- package/dist/esm/watermark.d.ts +80 -0
- package/dist/esm/watermark.js +487 -0
- package/dist/esm/watermark.js.map +1 -0
- package/dist/umd/index.min.js +1 -1
- package/dist/umd/index.min.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
2
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
3
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
4
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
5
|
+
/**
|
|
6
|
+
* 水印工具函数
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 水印行配置
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* 上下文变量类型
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 会话信息类型
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* XML 转义
|
|
23
|
+
*/
|
|
24
|
+
export function escapeXml(str) {
|
|
25
|
+
return str.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/'/g, ''');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* 根据 key 获取变量的真实值
|
|
30
|
+
* @param key 变量 key,支持格式:${system.now}、${system.today}、${system.ip}、${session.userId}、${session.userName}、${session.realName}、${contextParams.xxx}
|
|
31
|
+
*/
|
|
32
|
+
export function getVariableRealValue(key) {
|
|
33
|
+
// 从 sessionStorage 获取用户信息
|
|
34
|
+
var sessionInfo = getUserInfoFromStorage();
|
|
35
|
+
|
|
36
|
+
// 从 storage 获取 contextParams
|
|
37
|
+
var contextParams = getContextParamsFromStorage();
|
|
38
|
+
|
|
39
|
+
// 获取客户端 IP(从缓存读取,如果没有则返回默认值)
|
|
40
|
+
var clientIp = getClientIp();
|
|
41
|
+
var now = new Date();
|
|
42
|
+
|
|
43
|
+
// 处理 ${system.xxx} 格式
|
|
44
|
+
var systemMatch = key.match(/^\$\{system\.(\w+)\}$/);
|
|
45
|
+
if (systemMatch) {
|
|
46
|
+
var systemKey = systemMatch[1];
|
|
47
|
+
switch (systemKey) {
|
|
48
|
+
case 'now':
|
|
49
|
+
{
|
|
50
|
+
// 当前时间:格式为 YYYY-MM-DD HH:mm:ss
|
|
51
|
+
var year = now.getFullYear();
|
|
52
|
+
var month = String(now.getMonth() + 1).padStart(2, '0');
|
|
53
|
+
var day = String(now.getDate()).padStart(2, '0');
|
|
54
|
+
var hours = String(now.getHours()).padStart(2, '0');
|
|
55
|
+
var minutes = String(now.getMinutes()).padStart(2, '0');
|
|
56
|
+
var seconds = String(now.getSeconds()).padStart(2, '0');
|
|
57
|
+
return "".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds);
|
|
58
|
+
}
|
|
59
|
+
case 'today':
|
|
60
|
+
{
|
|
61
|
+
// 当前日期:格式为 YYYY-MM-DD
|
|
62
|
+
var _year = now.getFullYear();
|
|
63
|
+
var _month = String(now.getMonth() + 1).padStart(2, '0');
|
|
64
|
+
var _day = String(now.getDate()).padStart(2, '0');
|
|
65
|
+
return "".concat(_year, "-").concat(_month, "-").concat(_day);
|
|
66
|
+
}
|
|
67
|
+
case 'ip':
|
|
68
|
+
return clientIp;
|
|
69
|
+
default:
|
|
70
|
+
return '';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 处理 ${session.xxx} 格式
|
|
75
|
+
var sessionMatch = key.match(/^\$\{session\.(\w+)\}$/);
|
|
76
|
+
if (sessionMatch) {
|
|
77
|
+
var sessionKey = sessionMatch[1];
|
|
78
|
+
switch (sessionKey) {
|
|
79
|
+
case 'userId':
|
|
80
|
+
return sessionInfo.userId || '';
|
|
81
|
+
case 'userName':
|
|
82
|
+
return sessionInfo.userName || '';
|
|
83
|
+
case 'realName':
|
|
84
|
+
return sessionInfo.realName || '';
|
|
85
|
+
default:
|
|
86
|
+
return '';
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 处理 ${contextParams.xxx} 格式
|
|
91
|
+
var contextParamsMatch = key.match(/^\$\{contextParams\.(\w+)\}$/);
|
|
92
|
+
if (contextParamsMatch) {
|
|
93
|
+
var contextParamsKey = contextParamsMatch[1];
|
|
94
|
+
if (contextParams && _typeof(contextParams) === 'object') {
|
|
95
|
+
var value = contextParams[contextParamsKey];
|
|
96
|
+
// 如果值是 null 或 undefined,返回空字符串;否则转换为字符串
|
|
97
|
+
return value != null ? String(value) : '';
|
|
98
|
+
}
|
|
99
|
+
return '';
|
|
100
|
+
}
|
|
101
|
+
return '';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* 生成水印样式对象
|
|
106
|
+
* @param styles 样式配置
|
|
107
|
+
*/
|
|
108
|
+
export function generateWatermarkStyle(styles) {
|
|
109
|
+
return {
|
|
110
|
+
color: styles.color,
|
|
111
|
+
fontSize: "".concat(styles.fontSize, "px"),
|
|
112
|
+
opacity: styles.opacity / 100,
|
|
113
|
+
transform: "rotate(".concat(styles.angle, "deg)"),
|
|
114
|
+
whiteSpace: 'nowrap',
|
|
115
|
+
lineHeight: 1.2
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* 从 storage 获取用户信息(优先从 sessionStorage,其次从 localStorage)
|
|
121
|
+
*/
|
|
122
|
+
function getUserInfoFromStorage() {
|
|
123
|
+
try {
|
|
124
|
+
var _userStores$state;
|
|
125
|
+
if (typeof window === 'undefined') {
|
|
126
|
+
return {};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// 优先从 sessionStorage 读取,如果没有则从 localStorage 读取
|
|
130
|
+
var userStoresStr = null;
|
|
131
|
+
if (window.sessionStorage) {
|
|
132
|
+
userStoresStr = window.sessionStorage.getItem('userStores');
|
|
133
|
+
}
|
|
134
|
+
if (!userStoresStr && window.localStorage) {
|
|
135
|
+
userStoresStr = window.localStorage.getItem('userStores');
|
|
136
|
+
}
|
|
137
|
+
if (!userStoresStr) {
|
|
138
|
+
return {};
|
|
139
|
+
}
|
|
140
|
+
var userStores = JSON.parse(userStoresStr);
|
|
141
|
+
var userInfo = userStores === null || userStores === void 0 || (_userStores$state = userStores.state) === null || _userStores$state === void 0 ? void 0 : _userStores$state.userInfo;
|
|
142
|
+
if (!userInfo) {
|
|
143
|
+
return {};
|
|
144
|
+
}
|
|
145
|
+
return {
|
|
146
|
+
userId: userInfo.userId || '',
|
|
147
|
+
userName: userInfo.userName || '',
|
|
148
|
+
realName: userInfo.realName || ''
|
|
149
|
+
};
|
|
150
|
+
} catch (e) {
|
|
151
|
+
console.warn('Failed to get user info from storage:', e);
|
|
152
|
+
return {};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* 从 storage 获取 contextParams(优先从 sessionStorage,其次从 localStorage)
|
|
158
|
+
*/
|
|
159
|
+
function getContextParamsFromStorage() {
|
|
160
|
+
try {
|
|
161
|
+
if (typeof window === 'undefined') {
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// 优先从 sessionStorage 读取,如果没有则从 localStorage 读取
|
|
166
|
+
var contextParamsStr = null;
|
|
167
|
+
if (window.sessionStorage) {
|
|
168
|
+
contextParamsStr = window.sessionStorage.getItem('contextParams');
|
|
169
|
+
}
|
|
170
|
+
if (!contextParamsStr && window.localStorage) {
|
|
171
|
+
contextParamsStr = window.localStorage.getItem('contextParams');
|
|
172
|
+
}
|
|
173
|
+
if (!contextParamsStr) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
return JSON.parse(contextParamsStr) || null;
|
|
177
|
+
} catch (e) {
|
|
178
|
+
console.warn('Failed to get contextParams from storage:', e);
|
|
179
|
+
return null;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* 从 storage 获取缓存的客户端 IP
|
|
185
|
+
*/
|
|
186
|
+
function getClientIpFromStorage() {
|
|
187
|
+
try {
|
|
188
|
+
if (typeof window === 'undefined') {
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// 优先从 sessionStorage 读取,如果没有则从 localStorage 读取
|
|
193
|
+
var cachedIp = null;
|
|
194
|
+
if (window.sessionStorage) {
|
|
195
|
+
cachedIp = window.sessionStorage.getItem('clientIp');
|
|
196
|
+
}
|
|
197
|
+
if (!cachedIp && window.localStorage) {
|
|
198
|
+
cachedIp = window.localStorage.getItem('clientIp');
|
|
199
|
+
}
|
|
200
|
+
return cachedIp;
|
|
201
|
+
} catch (e) {
|
|
202
|
+
console.warn('Failed to get client IP from storage:', e);
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* 缓存客户端 IP 到 storage
|
|
209
|
+
*/
|
|
210
|
+
function setClientIpToStorage(ip) {
|
|
211
|
+
try {
|
|
212
|
+
if (typeof window === 'undefined') {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// 优先保存到 sessionStorage,同时保存到 localStorage 作为备份
|
|
217
|
+
if (window.sessionStorage) {
|
|
218
|
+
window.sessionStorage.setItem('clientIp', ip);
|
|
219
|
+
}
|
|
220
|
+
if (window.localStorage) {
|
|
221
|
+
window.localStorage.setItem('clientIp', ip);
|
|
222
|
+
}
|
|
223
|
+
} catch (e) {
|
|
224
|
+
console.warn('Failed to save client IP to storage:', e);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* 异步获取客户端 IP(通过第三方 API)
|
|
230
|
+
* @returns Promise<string> 返回客户端 IP 地址
|
|
231
|
+
*/
|
|
232
|
+
export function fetchClientIp() {
|
|
233
|
+
return _fetchClientIp.apply(this, arguments);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* 获取客户端 IP(同步方法,从缓存读取)
|
|
238
|
+
* @returns string 返回客户端 IP 地址,如果缓存中没有则返回默认值 '127.0.0.1'
|
|
239
|
+
*/
|
|
240
|
+
function _fetchClientIp() {
|
|
241
|
+
_fetchClientIp = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
242
|
+
var cachedIp, ipServices, _i, _ipServices, serviceUrl, response, ip, contentType, data, defaultIp;
|
|
243
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
244
|
+
while (1) switch (_context.prev = _context.next) {
|
|
245
|
+
case 0:
|
|
246
|
+
// 先检查缓存
|
|
247
|
+
cachedIp = getClientIpFromStorage();
|
|
248
|
+
if (!cachedIp) {
|
|
249
|
+
_context.next = 3;
|
|
250
|
+
break;
|
|
251
|
+
}
|
|
252
|
+
return _context.abrupt("return", cachedIp);
|
|
253
|
+
case 3:
|
|
254
|
+
// 尝试多个 IP 查询服务(按优先级)
|
|
255
|
+
ipServices = ['https://api.ipify.org?format=json', 'https://api.ip.sb/ip', 'https://api.ipify.org'];
|
|
256
|
+
_i = 0, _ipServices = ipServices;
|
|
257
|
+
case 5:
|
|
258
|
+
if (!(_i < _ipServices.length)) {
|
|
259
|
+
_context.next = 34;
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
serviceUrl = _ipServices[_i];
|
|
263
|
+
_context.prev = 7;
|
|
264
|
+
_context.next = 10;
|
|
265
|
+
return fetch(serviceUrl, {
|
|
266
|
+
method: 'GET',
|
|
267
|
+
headers: {
|
|
268
|
+
Accept: 'application/json'
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
case 10:
|
|
272
|
+
response = _context.sent;
|
|
273
|
+
if (!response.ok) {
|
|
274
|
+
_context.next = 27;
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
ip = void 0;
|
|
278
|
+
contentType = response.headers.get('content-type');
|
|
279
|
+
if (!(contentType && contentType.includes('application/json'))) {
|
|
280
|
+
_context.next = 21;
|
|
281
|
+
break;
|
|
282
|
+
}
|
|
283
|
+
_context.next = 17;
|
|
284
|
+
return response.json();
|
|
285
|
+
case 17:
|
|
286
|
+
data = _context.sent;
|
|
287
|
+
ip = data.ip || data.query || data.origin || '';
|
|
288
|
+
_context.next = 24;
|
|
289
|
+
break;
|
|
290
|
+
case 21:
|
|
291
|
+
_context.next = 23;
|
|
292
|
+
return response.text();
|
|
293
|
+
case 23:
|
|
294
|
+
ip = _context.sent.trim();
|
|
295
|
+
case 24:
|
|
296
|
+
if (!(ip && /^(\d{1,3}\.){3}\d{1,3}$/.test(ip))) {
|
|
297
|
+
_context.next = 27;
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
// 缓存 IP
|
|
301
|
+
setClientIpToStorage(ip);
|
|
302
|
+
return _context.abrupt("return", ip);
|
|
303
|
+
case 27:
|
|
304
|
+
_context.next = 31;
|
|
305
|
+
break;
|
|
306
|
+
case 29:
|
|
307
|
+
_context.prev = 29;
|
|
308
|
+
_context.t0 = _context["catch"](7);
|
|
309
|
+
case 31:
|
|
310
|
+
_i++;
|
|
311
|
+
_context.next = 5;
|
|
312
|
+
break;
|
|
313
|
+
case 34:
|
|
314
|
+
// 所有服务都失败,返回默认值
|
|
315
|
+
defaultIp = '127.0.0.1';
|
|
316
|
+
console.warn('Failed to fetch client IP, using default:', defaultIp);
|
|
317
|
+
return _context.abrupt("return", defaultIp);
|
|
318
|
+
case 37:
|
|
319
|
+
case "end":
|
|
320
|
+
return _context.stop();
|
|
321
|
+
}
|
|
322
|
+
}, _callee, null, [[7, 29]]);
|
|
323
|
+
}));
|
|
324
|
+
return _fetchClientIp.apply(this, arguments);
|
|
325
|
+
}
|
|
326
|
+
export function getClientIp() {
|
|
327
|
+
var cachedIp = getClientIpFromStorage();
|
|
328
|
+
if (cachedIp) {
|
|
329
|
+
return cachedIp;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// 如果没有缓存,尝试异步获取(不阻塞当前调用)
|
|
333
|
+
// 下次调用时会使用缓存的 IP
|
|
334
|
+
if (typeof window !== 'undefined') {
|
|
335
|
+
fetchClientIp().catch(function () {
|
|
336
|
+
// 静默失败,不影响当前调用
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
return '127.0.0.1';
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* 解析 content 中的所有变量并替换为真实值
|
|
344
|
+
* @param content 原始内容,可能包含变量如 ${system.now}、${session.userId}、${contextParams.userName} 等
|
|
345
|
+
*/
|
|
346
|
+
export function parseContentVariables(content) {
|
|
347
|
+
// 匹配所有变量:${system.xxx}、${session.xxx} 或 ${contextParams.xxx}
|
|
348
|
+
var variableRegex = /\$\{(system|session|contextParams)\.(\w+)\}/g;
|
|
349
|
+
|
|
350
|
+
// 缓存 storage 读取结果,避免在解析多个变量时重复读取
|
|
351
|
+
var cachedSessionInfo = null;
|
|
352
|
+
var cachedContextParams = null;
|
|
353
|
+
var contextParamsRead = false; // 标记是否已读取 contextParams
|
|
354
|
+
|
|
355
|
+
return content.replace(variableRegex, function (match, type, key) {
|
|
356
|
+
var variableKey = "${".concat(type, ".").concat(key, "}");
|
|
357
|
+
|
|
358
|
+
// 对于需要 storage 数据的变量类型,使用缓存
|
|
359
|
+
if (type === 'session' && cachedSessionInfo === null) {
|
|
360
|
+
cachedSessionInfo = getUserInfoFromStorage();
|
|
361
|
+
}
|
|
362
|
+
if (type === 'contextParams' && !contextParamsRead) {
|
|
363
|
+
cachedContextParams = getContextParamsFromStorage();
|
|
364
|
+
contextParamsRead = true;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
// 如果变量需要 session 或 contextParams,使用缓存的版本
|
|
368
|
+
if (type === 'session' || type === 'contextParams') {
|
|
369
|
+
return getVariableRealValueWithCache(variableKey, cachedSessionInfo, cachedContextParams);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// 其他类型(system)直接调用
|
|
373
|
+
return getVariableRealValue(variableKey);
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* 带缓存的变量值获取(内部使用)
|
|
379
|
+
*/
|
|
380
|
+
function getVariableRealValueWithCache(key, sessionInfo, contextParams) {
|
|
381
|
+
// 获取客户端 IP(从缓存读取,如果没有则返回默认值)
|
|
382
|
+
var clientIp = getClientIp();
|
|
383
|
+
var now = new Date();
|
|
384
|
+
|
|
385
|
+
// 处理 ${system.xxx} 格式
|
|
386
|
+
var systemMatch = key.match(/^\$\{system\.(\w+)\}$/);
|
|
387
|
+
if (systemMatch) {
|
|
388
|
+
var systemKey = systemMatch[1];
|
|
389
|
+
switch (systemKey) {
|
|
390
|
+
case 'now':
|
|
391
|
+
{
|
|
392
|
+
var year = now.getFullYear();
|
|
393
|
+
var month = String(now.getMonth() + 1).padStart(2, '0');
|
|
394
|
+
var day = String(now.getDate()).padStart(2, '0');
|
|
395
|
+
var hours = String(now.getHours()).padStart(2, '0');
|
|
396
|
+
var minutes = String(now.getMinutes()).padStart(2, '0');
|
|
397
|
+
var seconds = String(now.getSeconds()).padStart(2, '0');
|
|
398
|
+
return "".concat(year, "-").concat(month, "-").concat(day, " ").concat(hours, ":").concat(minutes, ":").concat(seconds);
|
|
399
|
+
}
|
|
400
|
+
case 'today':
|
|
401
|
+
{
|
|
402
|
+
var _year2 = now.getFullYear();
|
|
403
|
+
var _month2 = String(now.getMonth() + 1).padStart(2, '0');
|
|
404
|
+
var _day2 = String(now.getDate()).padStart(2, '0');
|
|
405
|
+
return "".concat(_year2, "-").concat(_month2, "-").concat(_day2);
|
|
406
|
+
}
|
|
407
|
+
case 'ip':
|
|
408
|
+
return clientIp;
|
|
409
|
+
default:
|
|
410
|
+
return '';
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// 处理 ${session.xxx} 格式
|
|
415
|
+
var sessionMatch = key.match(/^\$\{session\.(\w+)\}$/);
|
|
416
|
+
if (sessionMatch) {
|
|
417
|
+
var sessionKey = sessionMatch[1];
|
|
418
|
+
if (sessionInfo) {
|
|
419
|
+
switch (sessionKey) {
|
|
420
|
+
case 'userId':
|
|
421
|
+
return sessionInfo.userId || '';
|
|
422
|
+
case 'userName':
|
|
423
|
+
return sessionInfo.userName || '';
|
|
424
|
+
case 'realName':
|
|
425
|
+
return sessionInfo.realName || '';
|
|
426
|
+
default:
|
|
427
|
+
return '';
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
return '';
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// 处理 ${contextParams.xxx} 格式
|
|
434
|
+
var contextParamsMatch = key.match(/^\$\{contextParams\.(\w+)\}$/);
|
|
435
|
+
if (contextParamsMatch) {
|
|
436
|
+
var contextParamsKey = contextParamsMatch[1];
|
|
437
|
+
if (contextParams && _typeof(contextParams) === 'object') {
|
|
438
|
+
var value = contextParams[contextParamsKey];
|
|
439
|
+
return value != null ? String(value) : '';
|
|
440
|
+
}
|
|
441
|
+
return '';
|
|
442
|
+
}
|
|
443
|
+
return '';
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* 生成水印的 base64 数据 URL
|
|
448
|
+
* 当前环境localStore中存有数据 :key=userStores value={"state":{"userInfo":{"token":"16fe343c-78ae-4fd8-93eb-410256dd483b","userId":"1","userName":"admin","phoneNo":"13800138002","email":"admin@localhost.com","realName":"admin2","defaultTenantId":"0","avatar":"./images/avatar/img-user-avatar-10.png","userIcon":"./images/avatar/img-user-avatar-10.png"},"currentTenantId":"1273556018761138176","userSelectedBotOrder":["1211941633166168064","1212229286675095552"],"activeSession":null},"version":0}
|
|
449
|
+
* config参考: {"enabled":true,"content":"测试水印 ${session.userId}","styles":{"color":"#999999","opacity":20,"fontSize":16,"angle":-15},"layout":{"density":"medium","horizontalSpacing":100,"verticalSpacing":100,"arrangement":"tile"}}
|
|
450
|
+
*/
|
|
451
|
+
export function generateWatermarkBase64(config) {
|
|
452
|
+
var styleConfig = config.styles,
|
|
453
|
+
layout = config.layout,
|
|
454
|
+
content = config.content;
|
|
455
|
+
|
|
456
|
+
// 解析 content 中的所有变量并替换为真实值
|
|
457
|
+
var realContent = parseContentVariables(content || '');
|
|
458
|
+
|
|
459
|
+
// 处理多行文本(按换行符分割,保留非空行)
|
|
460
|
+
var textLines = realContent.split('\n').filter(function (line) {
|
|
461
|
+
return line.trim() !== '';
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// 如果没有有效文本,使用空字符串
|
|
465
|
+
if (textLines.length === 0) {
|
|
466
|
+
return "data:image/svg+xml;charset=utf-8,".concat(encodeURIComponent("<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"".concat(layout.horizontalSpacing, "\" height=\"").concat(layout.verticalSpacing, "\"></svg>")));
|
|
467
|
+
}
|
|
468
|
+
var escapedColor = escapeXml(styleConfig.color);
|
|
469
|
+
var lineHeight = styleConfig.fontSize * 1.2; // 行高为字体大小的1.2倍
|
|
470
|
+
|
|
471
|
+
// 计算文本总高度
|
|
472
|
+
var textHeight = textLines.length * lineHeight;
|
|
473
|
+
// 垂直居中:从垂直间距的中心位置开始,向上偏移文本高度的一半
|
|
474
|
+
var startY = layout.verticalSpacing / 2 - textHeight / 2 + lineHeight;
|
|
475
|
+
|
|
476
|
+
// 使用 tspan 来显示多行文本
|
|
477
|
+
var tspanElements = textLines.map(function (line, index) {
|
|
478
|
+
var escapedLine = escapeXml(line);
|
|
479
|
+
var y = startY + index * lineHeight;
|
|
480
|
+
return "<tspan x=\"10\" y=\"".concat(y, "\">").concat(escapedLine, "</tspan>");
|
|
481
|
+
}).join('');
|
|
482
|
+
var svgContent = "\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"".concat(layout.horizontalSpacing, "\" height=\"").concat(layout.verticalSpacing, "\">\n <text\n font-size=\"").concat(styleConfig.fontSize, "\"\n fill=\"").concat(escapedColor, "\"\n fill-opacity=\"").concat(styleConfig.opacity / 100, "\"\n transform=\"rotate(").concat(styleConfig.angle, " ").concat(layout.horizontalSpacing / 2, " ").concat(layout.verticalSpacing / 2, ")\"\n >\n ").concat(tspanElements, "\n </text>\n </svg>\n ").replace(/\s+/g, ' ');
|
|
483
|
+
|
|
484
|
+
// 使用 encodeURIComponent 而不是 btoa,以支持中文字符
|
|
485
|
+
return "data:image/svg+xml;charset=utf-8,".concat(encodeURIComponent(svgContent));
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=watermark.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_regeneratorRuntime","e","t","r","Object","prototype","n","hasOwnProperty","o","defineProperty","value","i","Symbol","a","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","arg","call","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","forEach","_invoke","AsyncIterator","invoke","_typeof","resolve","__await","then","callInvokeWithMethodAndArg","Error","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","push","resetTryEntry","completion","reset","isNaN","length","displayName","isGeneratorFunction","constructor","name","mark","setPrototypeOf","__proto__","awrap","async","Promise","keys","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","catch","_catch","delegateYield","asyncGeneratorStep","gen","reject","_next","_throw","key","info","error","_asyncToGenerator","fn","self","args","arguments","apply","err","undefined","escapeXml","str","replace","getVariableRealValue","sessionInfo","getUserInfoFromStorage","contextParams","getContextParamsFromStorage","clientIp","getClientIp","now","Date","systemMatch","match","systemKey","year","getFullYear","month","String","getMonth","padStart","day","getDate","hours","getHours","minutes","getMinutes","seconds","getSeconds","concat","sessionMatch","sessionKey","userId","userName","realName","contextParamsMatch","contextParamsKey","generateWatermarkStyle","styles","color","fontSize","opacity","transform","angle","whiteSpace","lineHeight","_userStores$state","window","userStoresStr","sessionStorage","getItem","localStorage","userStores","JSON","parse","userInfo","state","console","warn","contextParamsStr","getClientIpFromStorage","cachedIp","setClientIpToStorage","ip","setItem","fetchClientIp","_fetchClientIp","_callee","ipServices","_i","_ipServices","serviceUrl","response","contentType","data","defaultIp","_callee$","_context","fetch","headers","Accept","ok","get","includes","json","query","origin","text","trim","test","t0","parseContentVariables","content","variableRegex","cachedSessionInfo","cachedContextParams","contextParamsRead","variableKey","getVariableRealValueWithCache","generateWatermarkBase64","config","styleConfig","layout","realContent","textLines","split","filter","line","encodeURIComponent","horizontalSpacing","verticalSpacing","escapedColor","textHeight","startY","tspanElements","map","index","escapedLine","join","svgContent"],"sources":["../../src/watermark.ts"],"sourcesContent":["/**\n * 水印工具函数\n */\n\nimport type { CSSProperties } from 'react';\n\nexport interface WatermarkStyles {\n color: string;\n opacity: number;\n fontSize: number;\n angle: number;\n}\n\nexport interface WatermarkLayout {\n density: string;\n horizontalSpacing: number;\n verticalSpacing: number;\n arrangement: string;\n}\n\n/**\n * 水印行配置\n */\nexport interface WatermarkRow {\n enabled: boolean;\n variable?: string;\n text?: string;\n}\n\nexport interface WatermarkConfig {\n content: string;\n styles: WatermarkStyles;\n layout: WatermarkLayout;\n rows?: WatermarkRow[]; // 可选,用于向后兼容\n}\n\n/**\n * 上下文变量类型\n */\nexport interface ContextVariable {\n code: string;\n name: string;\n}\n\n/**\n * 会话信息类型\n */\nexport interface SessionInfo {\n userId?: string;\n userName?: string;\n realName?: string;\n}\n\n/**\n * XML 转义\n */\nexport function escapeXml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * 根据 key 获取变量的真实值\n * @param key 变量 key,支持格式:${system.now}、${system.today}、${system.ip}、${session.userId}、${session.userName}、${session.realName}、${contextParams.xxx}\n */\nexport function getVariableRealValue(\n key: string,\n): string {\n // 从 sessionStorage 获取用户信息\n const sessionInfo = getUserInfoFromStorage();\n \n // 从 storage 获取 contextParams\n const contextParams = getContextParamsFromStorage();\n \n // 获取客户端 IP(从缓存读取,如果没有则返回默认值)\n const clientIp = getClientIp();\n\n const now = new Date();\n\n // 处理 ${system.xxx} 格式\n const systemMatch = key.match(/^\\$\\{system\\.(\\w+)\\}$/);\n if (systemMatch) {\n const systemKey = systemMatch[1];\n switch (systemKey) {\n case 'now': {\n // 当前时间:格式为 YYYY-MM-DD HH:mm:ss\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n case 'today': {\n // 当前日期:格式为 YYYY-MM-DD\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n case 'ip':\n return clientIp;\n default:\n return '';\n }\n }\n\n // 处理 ${session.xxx} 格式\n const sessionMatch = key.match(/^\\$\\{session\\.(\\w+)\\}$/);\n if (sessionMatch) {\n const sessionKey = sessionMatch[1];\n switch (sessionKey) {\n case 'userId':\n return sessionInfo.userId || '';\n case 'userName':\n return sessionInfo.userName || '';\n case 'realName':\n return sessionInfo.realName || '';\n default:\n return '';\n }\n }\n\n // 处理 ${contextParams.xxx} 格式\n const contextParamsMatch = key.match(/^\\$\\{contextParams\\.(\\w+)\\}$/);\n if (contextParamsMatch) {\n const contextParamsKey = contextParamsMatch[1];\n if (contextParams && typeof contextParams === 'object') {\n const value = contextParams[contextParamsKey];\n // 如果值是 null 或 undefined,返回空字符串;否则转换为字符串\n return value != null ? String(value) : '';\n }\n return '';\n }\n return '';\n}\n\n/**\n * 生成水印样式对象\n * @param styles 样式配置\n */\nexport function generateWatermarkStyle(styles: WatermarkStyles): CSSProperties {\n return {\n color: styles.color,\n fontSize: `${styles.fontSize}px`,\n opacity: styles.opacity / 100,\n transform: `rotate(${styles.angle}deg)`,\n whiteSpace: 'nowrap' as const,\n lineHeight: 1.2,\n };\n}\n\n/**\n * 从 storage 获取用户信息(优先从 sessionStorage,其次从 localStorage)\n */\nfunction getUserInfoFromStorage(): SessionInfo {\n try {\n if (typeof window === 'undefined') {\n return {};\n }\n\n // 优先从 sessionStorage 读取,如果没有则从 localStorage 读取\n let userStoresStr = null;\n if (window.sessionStorage) {\n userStoresStr = window.sessionStorage.getItem('userStores');\n }\n if (!userStoresStr && window.localStorage) {\n userStoresStr = window.localStorage.getItem('userStores');\n }\n\n if (!userStoresStr) {\n return {};\n }\n\n const userStores = JSON.parse(userStoresStr);\n const userInfo = userStores?.state?.userInfo;\n if (!userInfo) {\n return {};\n }\n return {\n userId: userInfo.userId || '',\n userName: userInfo.userName || '',\n realName: userInfo.realName || '',\n };\n } catch (e) {\n console.warn('Failed to get user info from storage:', e);\n return {};\n }\n}\n\n/**\n * 从 storage 获取 contextParams(优先从 sessionStorage,其次从 localStorage)\n */\nfunction getContextParamsFromStorage(): { [key: string]: any } | null {\n try {\n if (typeof window === 'undefined') {\n return null;\n }\n\n // 优先从 sessionStorage 读取,如果没有则从 localStorage 读取\n let contextParamsStr = null;\n if (window.sessionStorage) {\n contextParamsStr = window.sessionStorage.getItem('contextParams');\n }\n if (!contextParamsStr && window.localStorage) {\n contextParamsStr = window.localStorage.getItem('contextParams');\n }\n\n if (!contextParamsStr) {\n return null;\n }\n\n return JSON.parse(contextParamsStr) || null;\n } catch (e) {\n console.warn('Failed to get contextParams from storage:', e);\n return null;\n }\n}\n\n/**\n * 从 storage 获取缓存的客户端 IP\n */\nfunction getClientIpFromStorage(): string | null {\n try {\n if (typeof window === 'undefined') {\n return null;\n }\n\n // 优先从 sessionStorage 读取,如果没有则从 localStorage 读取\n let cachedIp = null;\n if (window.sessionStorage) {\n cachedIp = window.sessionStorage.getItem('clientIp');\n }\n if (!cachedIp && window.localStorage) {\n cachedIp = window.localStorage.getItem('clientIp');\n }\n\n return cachedIp;\n } catch (e) {\n console.warn('Failed to get client IP from storage:', e);\n return null;\n }\n}\n\n/**\n * 缓存客户端 IP 到 storage\n */\nfunction setClientIpToStorage(ip: string): void {\n try {\n if (typeof window === 'undefined') {\n return;\n }\n\n // 优先保存到 sessionStorage,同时保存到 localStorage 作为备份\n if (window.sessionStorage) {\n window.sessionStorage.setItem('clientIp', ip);\n }\n if (window.localStorage) {\n window.localStorage.setItem('clientIp', ip);\n }\n } catch (e) {\n console.warn('Failed to save client IP to storage:', e);\n }\n}\n\n/**\n * 异步获取客户端 IP(通过第三方 API)\n * @returns Promise<string> 返回客户端 IP 地址\n */\nexport async function fetchClientIp(): Promise<string> {\n // 先检查缓存\n const cachedIp = getClientIpFromStorage();\n if (cachedIp) {\n return cachedIp;\n }\n\n // 尝试多个 IP 查询服务(按优先级)\n const ipServices = [\n 'https://api.ipify.org?format=json',\n 'https://api.ip.sb/ip',\n 'https://api.ipify.org',\n ];\n\n for (const serviceUrl of ipServices) {\n try {\n const response = await fetch(serviceUrl, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n },\n });\n\n if (response.ok) {\n let ip: string;\n const contentType = response.headers.get('content-type');\n \n if (contentType && contentType.includes('application/json')) {\n const data = await response.json();\n ip = data.ip || data.query || data.origin || '';\n } else {\n ip = (await response.text()).trim();\n }\n\n // 验证 IP 格式\n if (ip && /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(ip)) {\n // 缓存 IP\n setClientIpToStorage(ip);\n return ip;\n }\n }\n } catch (e) {\n // 继续尝试下一个服务(静默失败)\n }\n }\n\n // 所有服务都失败,返回默认值\n const defaultIp = '127.0.0.1';\n console.warn('Failed to fetch client IP, using default:', defaultIp);\n return defaultIp;\n}\n\n/**\n * 获取客户端 IP(同步方法,从缓存读取)\n * @returns string 返回客户端 IP 地址,如果缓存中没有则返回默认值 '127.0.0.1'\n */\nexport function getClientIp(): string {\n const cachedIp = getClientIpFromStorage();\n if (cachedIp) {\n return cachedIp;\n }\n\n // 如果没有缓存,尝试异步获取(不阻塞当前调用)\n // 下次调用时会使用缓存的 IP\n if (typeof window !== 'undefined') {\n fetchClientIp().catch(() => {\n // 静默失败,不影响当前调用\n });\n }\n\n return '127.0.0.1';\n}\n\n/**\n * 解析 content 中的所有变量并替换为真实值\n * @param content 原始内容,可能包含变量如 ${system.now}、${session.userId}、${contextParams.userName} 等\n */\nexport function parseContentVariables(\n content: string,\n): string {\n // 匹配所有变量:${system.xxx}、${session.xxx} 或 ${contextParams.xxx}\n const variableRegex = /\\$\\{(system|session|contextParams)\\.(\\w+)\\}/g;\n \n // 缓存 storage 读取结果,避免在解析多个变量时重复读取\n let cachedSessionInfo: SessionInfo | null = null;\n let cachedContextParams: { [key: string]: any } | null = null;\n let contextParamsRead = false; // 标记是否已读取 contextParams\n \n return content.replace(variableRegex, (match, type, key) => {\n const variableKey = `\\${${type}.${key}}`;\n \n // 对于需要 storage 数据的变量类型,使用缓存\n if (type === 'session' && cachedSessionInfo === null) {\n cachedSessionInfo = getUserInfoFromStorage();\n }\n if (type === 'contextParams' && !contextParamsRead) {\n cachedContextParams = getContextParamsFromStorage();\n contextParamsRead = true;\n }\n \n // 如果变量需要 session 或 contextParams,使用缓存的版本\n if (type === 'session' || type === 'contextParams') {\n return getVariableRealValueWithCache(variableKey, cachedSessionInfo, cachedContextParams);\n }\n \n // 其他类型(system)直接调用\n return getVariableRealValue(variableKey);\n });\n}\n\n/**\n * 带缓存的变量值获取(内部使用)\n */\nfunction getVariableRealValueWithCache(\n key: string,\n sessionInfo: SessionInfo | null,\n contextParams: { [key: string]: any } | null\n): string {\n // 获取客户端 IP(从缓存读取,如果没有则返回默认值)\n const clientIp = getClientIp();\n const now = new Date();\n\n // 处理 ${system.xxx} 格式\n const systemMatch = key.match(/^\\$\\{system\\.(\\w+)\\}$/);\n if (systemMatch) {\n const systemKey = systemMatch[1];\n switch (systemKey) {\n case 'now': {\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n const hours = String(now.getHours()).padStart(2, '0');\n const minutes = String(now.getMinutes()).padStart(2, '0');\n const seconds = String(now.getSeconds()).padStart(2, '0');\n return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;\n }\n case 'today': {\n const year = now.getFullYear();\n const month = String(now.getMonth() + 1).padStart(2, '0');\n const day = String(now.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n }\n case 'ip':\n return clientIp;\n default:\n return '';\n }\n }\n\n // 处理 ${session.xxx} 格式\n const sessionMatch = key.match(/^\\$\\{session\\.(\\w+)\\}$/);\n if (sessionMatch) {\n const sessionKey = sessionMatch[1];\n if (sessionInfo) {\n switch (sessionKey) {\n case 'userId':\n return sessionInfo.userId || '';\n case 'userName':\n return sessionInfo.userName || '';\n case 'realName':\n return sessionInfo.realName || '';\n default:\n return '';\n }\n }\n return '';\n }\n\n // 处理 ${contextParams.xxx} 格式\n const contextParamsMatch = key.match(/^\\$\\{contextParams\\.(\\w+)\\}$/);\n if (contextParamsMatch) {\n const contextParamsKey = contextParamsMatch[1];\n if (contextParams && typeof contextParams === 'object') {\n const value = contextParams[contextParamsKey];\n return value != null ? String(value) : '';\n }\n return '';\n }\n return '';\n}\n\n/**\n * 生成水印的 base64 数据 URL\n * 当前环境localStore中存有数据 :key=userStores value={\"state\":{\"userInfo\":{\"token\":\"16fe343c-78ae-4fd8-93eb-410256dd483b\",\"userId\":\"1\",\"userName\":\"admin\",\"phoneNo\":\"13800138002\",\"email\":\"admin@localhost.com\",\"realName\":\"admin2\",\"defaultTenantId\":\"0\",\"avatar\":\"./images/avatar/img-user-avatar-10.png\",\"userIcon\":\"./images/avatar/img-user-avatar-10.png\"},\"currentTenantId\":\"1273556018761138176\",\"userSelectedBotOrder\":[\"1211941633166168064\",\"1212229286675095552\"],\"activeSession\":null},\"version\":0}\n * config参考: {\"enabled\":true,\"content\":\"测试水印 ${session.userId}\",\"styles\":{\"color\":\"#999999\",\"opacity\":20,\"fontSize\":16,\"angle\":-15},\"layout\":{\"density\":\"medium\",\"horizontalSpacing\":100,\"verticalSpacing\":100,\"arrangement\":\"tile\"}}\n */\nexport function generateWatermarkBase64(\n config: WatermarkConfig,\n): string {\n const { styles: styleConfig, layout, content } = config;\n\n // 解析 content 中的所有变量并替换为真实值\n const realContent = parseContentVariables(content || '');\n \n // 处理多行文本(按换行符分割,保留非空行)\n const textLines = realContent.split('\\n').filter(line => line.trim() !== '');\n \n // 如果没有有效文本,使用空字符串\n if (textLines.length === 0) {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(`<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${layout.horizontalSpacing}\" height=\"${layout.verticalSpacing}\"></svg>`)}`;\n }\n \n const escapedColor = escapeXml(styleConfig.color);\n const lineHeight = styleConfig.fontSize * 1.2; // 行高为字体大小的1.2倍\n \n // 计算文本总高度\n const textHeight = textLines.length * lineHeight;\n // 垂直居中:从垂直间距的中心位置开始,向上偏移文本高度的一半\n const startY = layout.verticalSpacing / 2 - textHeight / 2 + lineHeight;\n\n // 使用 tspan 来显示多行文本\n const tspanElements = textLines.map((line: string, index: number) => {\n const escapedLine = escapeXml(line);\n const y = startY + index * lineHeight;\n return `<tspan x=\"10\" y=\"${y}\">${escapedLine}</tspan>`;\n }).join('');\n\n const svgContent = `\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${layout.horizontalSpacing}\" height=\"${layout.verticalSpacing}\">\n <text\n font-size=\"${styleConfig.fontSize}\"\n fill=\"${escapedColor}\"\n fill-opacity=\"${styleConfig.opacity / 100}\"\n transform=\"rotate(${styleConfig.angle} ${layout.horizontalSpacing / 2} ${layout.verticalSpacing / 2})\"\n >\n ${tspanElements}\n </text>\n </svg>\n `.replace(/\\s+/g, ' ');\n\n // 使用 encodeURIComponent 而不是 btoa,以支持中文字符\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgContent)}`;\n}\n"],"mappings":"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"}
|