sino-bc-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +311 -0
- package/dist/SKILL.md +466 -0
- package/dist/commands/bc-mcp.command.d.ts +53 -0
- package/dist/commands/bc-mcp.command.js +208 -0
- package/dist/commands/bc-mcp.command.js.map +1 -0
- package/dist/commands/homepage.command.d.ts +19 -0
- package/dist/commands/homepage.command.js +96 -0
- package/dist/commands/homepage.command.js.map +1 -0
- package/dist/commands/index.d.ts +10 -0
- package/dist/commands/index.js +23 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/nexus-swagger.command.d.ts +19 -0
- package/dist/commands/nexus-swagger.command.js +95 -0
- package/dist/commands/nexus-swagger.command.js.map +1 -0
- package/dist/constants/api-doc.d.ts +6 -0
- package/dist/constants/api-doc.js +80 -0
- package/dist/constants/api-doc.js.map +1 -0
- package/dist/constants/gateway.d.ts +31 -0
- package/dist/constants/gateway.js +109 -0
- package/dist/constants/gateway.js.map +1 -0
- package/dist/constants/index.d.ts +38 -0
- package/dist/constants/index.js +52 -0
- package/dist/constants/index.js.map +1 -0
- package/dist/core/cli-app.d.ts +51 -0
- package/dist/core/cli-app.js +281 -0
- package/dist/core/cli-app.js.map +1 -0
- package/dist/core/command-registry.d.ts +71 -0
- package/dist/core/command-registry.js +195 -0
- package/dist/core/command-registry.js.map +1 -0
- package/dist/core/index.d.ts +2 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +120 -0
- package/dist/types/index.js +46 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/browser.d.ts +36 -0
- package/dist/utils/browser.js +143 -0
- package/dist/utils/browser.js.map +1 -0
- package/dist/utils/common.d.ts +97 -0
- package/dist/utils/common.js +198 -0
- package/dist/utils/common.js.map +1 -0
- package/dist/utils/crypto.d.ts +53 -0
- package/dist/utils/crypto.js +153 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/http.d.ts +58 -0
- package/dist/utils/http.js +187 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +16 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +56 -0
- package/dist/utils/logger.js +161 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/prompt.d.ts +18 -0
- package/dist/utils/prompt.js +77 -0
- package/dist/utils/prompt.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import dayjs from 'dayjs';
|
|
2
|
+
/**
|
|
3
|
+
* 通用工具类
|
|
4
|
+
* 封装常用的通用工具方法,使用 lodash 和 dayjs 提升开发效率
|
|
5
|
+
* 所有方法均为无副作用的纯函数,便于测试和复用
|
|
6
|
+
*/
|
|
7
|
+
export declare class CommonUtils {
|
|
8
|
+
/**
|
|
9
|
+
* 格式化日期时间
|
|
10
|
+
* 封装 dayjs,提供统一的日期格式化入口
|
|
11
|
+
* @param date 日期(Date 对象、时间戳、日期字符串等)
|
|
12
|
+
* @param format 格式化模板,默认 'YYYY-MM-DD HH:mm:ss'
|
|
13
|
+
* @returns 格式化后的日期字符串
|
|
14
|
+
*/
|
|
15
|
+
static formatDate(date?: dayjs.ConfigType, format?: string): string;
|
|
16
|
+
/**
|
|
17
|
+
* 计算两个日期之间的差值(天数)
|
|
18
|
+
* @param start 开始日期
|
|
19
|
+
* @param end 结束日期,默认为当前时间
|
|
20
|
+
* @returns 相差天数(取整)
|
|
21
|
+
*/
|
|
22
|
+
static diffDays(start: dayjs.ConfigType, end?: dayjs.ConfigType): number;
|
|
23
|
+
/**
|
|
24
|
+
* 生成唯一 ID(基于时间戳 + 随机数)
|
|
25
|
+
* 使用 lodash 的 uniqueId 结合时间戳,避免 ID 碰撞
|
|
26
|
+
* @param prefix 可选的前缀
|
|
27
|
+
* @returns 唯一 ID 字符串
|
|
28
|
+
*/
|
|
29
|
+
static generateUniqueId(prefix?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* 深拷贝对象
|
|
32
|
+
* 封装 lodash 的 cloneDeep,提供类型安全的深拷贝
|
|
33
|
+
* @param obj 待拷贝对象
|
|
34
|
+
* @returns 深拷贝后的对象
|
|
35
|
+
*/
|
|
36
|
+
static deepClone<T>(obj: T): T;
|
|
37
|
+
/**
|
|
38
|
+
* 深度比较两个对象是否相等
|
|
39
|
+
* 封装 lodash 的 isEqual
|
|
40
|
+
* @param a 对象 A
|
|
41
|
+
* @param b 对象 B
|
|
42
|
+
* @returns 是否深度相等
|
|
43
|
+
*/
|
|
44
|
+
static deepEqual(a: unknown, b: unknown): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* 防抖函数包装
|
|
47
|
+
* 封装 lodash 的 debounce
|
|
48
|
+
* @param func 要防抖的函数
|
|
49
|
+
* @param wait 等待时间(毫秒),默认 300ms
|
|
50
|
+
* @returns 防抖后的函数
|
|
51
|
+
*/
|
|
52
|
+
static debounce<T extends (...args: unknown[]) => unknown>(func: T, wait?: number): (...args: Parameters<T>) => void;
|
|
53
|
+
/**
|
|
54
|
+
* 节流函数包装
|
|
55
|
+
* 封装 lodash 的 throttle
|
|
56
|
+
* @param func 要节流的函数
|
|
57
|
+
* @param wait 节流间隔(毫秒),默认 300ms
|
|
58
|
+
* @returns 节流后的函数
|
|
59
|
+
*/
|
|
60
|
+
static throttle<T extends (...args: unknown[]) => unknown>(func: T, wait?: number): (...args: Parameters<T>) => ReturnType<T> | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* 从对象中提取指定的属性
|
|
63
|
+
* 封装 lodash 的 pick,提供类型安全的属性提取
|
|
64
|
+
* @param obj 源对象
|
|
65
|
+
* @param keys 要提取的属性名数组
|
|
66
|
+
* @returns 包含指定属性的新对象
|
|
67
|
+
*/
|
|
68
|
+
static pick<T extends object, K extends keyof T>(obj: T, keys: K[]): Pick<T, K>;
|
|
69
|
+
/**
|
|
70
|
+
* 从对象中排除指定的属性
|
|
71
|
+
* 封装 lodash 的 omit,提供类型安全的属性排除
|
|
72
|
+
* @param obj 源对象
|
|
73
|
+
* @param keys 要排除的属性名数组
|
|
74
|
+
* @returns 排除指定属性后的新对象
|
|
75
|
+
*/
|
|
76
|
+
static omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K>;
|
|
77
|
+
/**
|
|
78
|
+
* 延迟执行(Promise 封装的 setTimeout)
|
|
79
|
+
* @param ms 延迟毫秒数
|
|
80
|
+
*/
|
|
81
|
+
static sleep(ms: number): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* 安全解析 JSON 字符串
|
|
84
|
+
* 解析失败时返回默认值而不是抛出异常
|
|
85
|
+
* @param jsonString JSON 字符串
|
|
86
|
+
* @param defaultValue 解析失败时的默认值,默认 undefined
|
|
87
|
+
* @returns 解析后的对象或默认值
|
|
88
|
+
*/
|
|
89
|
+
static safeJsonParse<T = unknown>(jsonString: string, defaultValue?: T): T | undefined;
|
|
90
|
+
/**
|
|
91
|
+
* 截断字符串并添加省略号
|
|
92
|
+
* @param str 源字符串
|
|
93
|
+
* @param maxLength 最大长度
|
|
94
|
+
* @param suffix 后缀,默认 '...'
|
|
95
|
+
*/
|
|
96
|
+
static truncate(str: string, maxLength: number, suffix?: string): string;
|
|
97
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CommonUtils = void 0;
|
|
40
|
+
const _ = __importStar(require("lodash"));
|
|
41
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
42
|
+
const logger_1 = require("./logger");
|
|
43
|
+
/**
|
|
44
|
+
* 通用工具类
|
|
45
|
+
* 封装常用的通用工具方法,使用 lodash 和 dayjs 提升开发效率
|
|
46
|
+
* 所有方法均为无副作用的纯函数,便于测试和复用
|
|
47
|
+
*/
|
|
48
|
+
class CommonUtils {
|
|
49
|
+
/**
|
|
50
|
+
* 格式化日期时间
|
|
51
|
+
* 封装 dayjs,提供统一的日期格式化入口
|
|
52
|
+
* @param date 日期(Date 对象、时间戳、日期字符串等)
|
|
53
|
+
* @param format 格式化模板,默认 'YYYY-MM-DD HH:mm:ss'
|
|
54
|
+
* @returns 格式化后的日期字符串
|
|
55
|
+
*/
|
|
56
|
+
static formatDate(date, format = 'YYYY-MM-DD HH:mm:ss') {
|
|
57
|
+
if (_.isNil(date)) {
|
|
58
|
+
return (0, dayjs_1.default)().format(format);
|
|
59
|
+
}
|
|
60
|
+
const d = (0, dayjs_1.default)(date);
|
|
61
|
+
if (!d.isValid()) {
|
|
62
|
+
logger_1.logger.warn(`无效的日期值: ${String(date)}`);
|
|
63
|
+
return '';
|
|
64
|
+
}
|
|
65
|
+
return d.format(format);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 计算两个日期之间的差值(天数)
|
|
69
|
+
* @param start 开始日期
|
|
70
|
+
* @param end 结束日期,默认为当前时间
|
|
71
|
+
* @returns 相差天数(取整)
|
|
72
|
+
*/
|
|
73
|
+
static diffDays(start, end = (0, dayjs_1.default)()) {
|
|
74
|
+
const startDate = (0, dayjs_1.default)(start);
|
|
75
|
+
const endDate = (0, dayjs_1.default)(end);
|
|
76
|
+
if (!startDate.isValid() || !endDate.isValid()) {
|
|
77
|
+
logger_1.logger.warn('计算日期差值时存在无效日期');
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
return endDate.diff(startDate, 'day');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 生成唯一 ID(基于时间戳 + 随机数)
|
|
84
|
+
* 使用 lodash 的 uniqueId 结合时间戳,避免 ID 碰撞
|
|
85
|
+
* @param prefix 可选的前缀
|
|
86
|
+
* @returns 唯一 ID 字符串
|
|
87
|
+
*/
|
|
88
|
+
static generateUniqueId(prefix = '') {
|
|
89
|
+
const timestamp = (0, dayjs_1.default)().valueOf().toString(36);
|
|
90
|
+
const random = Math.random().toString(36).substring(2, 8);
|
|
91
|
+
const uniquePart = _.uniqueId();
|
|
92
|
+
return _.isEmpty(prefix)
|
|
93
|
+
? `${timestamp}-${random}-${uniquePart}`
|
|
94
|
+
: `${prefix}-${timestamp}-${random}-${uniquePart}`;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 深拷贝对象
|
|
98
|
+
* 封装 lodash 的 cloneDeep,提供类型安全的深拷贝
|
|
99
|
+
* @param obj 待拷贝对象
|
|
100
|
+
* @returns 深拷贝后的对象
|
|
101
|
+
*/
|
|
102
|
+
static deepClone(obj) {
|
|
103
|
+
return _.cloneDeep(obj);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 深度比较两个对象是否相等
|
|
107
|
+
* 封装 lodash 的 isEqual
|
|
108
|
+
* @param a 对象 A
|
|
109
|
+
* @param b 对象 B
|
|
110
|
+
* @returns 是否深度相等
|
|
111
|
+
*/
|
|
112
|
+
static deepEqual(a, b) {
|
|
113
|
+
return _.isEqual(a, b);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* 防抖函数包装
|
|
117
|
+
* 封装 lodash 的 debounce
|
|
118
|
+
* @param func 要防抖的函数
|
|
119
|
+
* @param wait 等待时间(毫秒),默认 300ms
|
|
120
|
+
* @returns 防抖后的函数
|
|
121
|
+
*/
|
|
122
|
+
static debounce(func, wait = 300) {
|
|
123
|
+
return _.debounce(func, wait);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* 节流函数包装
|
|
127
|
+
* 封装 lodash 的 throttle
|
|
128
|
+
* @param func 要节流的函数
|
|
129
|
+
* @param wait 节流间隔(毫秒),默认 300ms
|
|
130
|
+
* @returns 节流后的函数
|
|
131
|
+
*/
|
|
132
|
+
static throttle(func, wait = 300) {
|
|
133
|
+
return _.throttle(func, wait);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* 从对象中提取指定的属性
|
|
137
|
+
* 封装 lodash 的 pick,提供类型安全的属性提取
|
|
138
|
+
* @param obj 源对象
|
|
139
|
+
* @param keys 要提取的属性名数组
|
|
140
|
+
* @returns 包含指定属性的新对象
|
|
141
|
+
*/
|
|
142
|
+
static pick(obj, keys) {
|
|
143
|
+
return _.pick(obj, keys);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* 从对象中排除指定的属性
|
|
147
|
+
* 封装 lodash 的 omit,提供类型安全的属性排除
|
|
148
|
+
* @param obj 源对象
|
|
149
|
+
* @param keys 要排除的属性名数组
|
|
150
|
+
* @returns 排除指定属性后的新对象
|
|
151
|
+
*/
|
|
152
|
+
static omit(obj, keys) {
|
|
153
|
+
return _.omit(obj, keys);
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* 延迟执行(Promise 封装的 setTimeout)
|
|
157
|
+
* @param ms 延迟毫秒数
|
|
158
|
+
*/
|
|
159
|
+
static sleep(ms) {
|
|
160
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 安全解析 JSON 字符串
|
|
164
|
+
* 解析失败时返回默认值而不是抛出异常
|
|
165
|
+
* @param jsonString JSON 字符串
|
|
166
|
+
* @param defaultValue 解析失败时的默认值,默认 undefined
|
|
167
|
+
* @returns 解析后的对象或默认值
|
|
168
|
+
*/
|
|
169
|
+
static safeJsonParse(jsonString, defaultValue) {
|
|
170
|
+
if (_.isEmpty(jsonString) || !_.isString(jsonString)) {
|
|
171
|
+
return defaultValue;
|
|
172
|
+
}
|
|
173
|
+
try {
|
|
174
|
+
return JSON.parse(jsonString);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
logger_1.logger.warn('JSON 解析失败:', error instanceof Error ? error.message : String(error));
|
|
178
|
+
return defaultValue;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* 截断字符串并添加省略号
|
|
183
|
+
* @param str 源字符串
|
|
184
|
+
* @param maxLength 最大长度
|
|
185
|
+
* @param suffix 后缀,默认 '...'
|
|
186
|
+
*/
|
|
187
|
+
static truncate(str, maxLength, suffix = '...') {
|
|
188
|
+
if (!_.isString(str)) {
|
|
189
|
+
return '';
|
|
190
|
+
}
|
|
191
|
+
if (str.length <= maxLength) {
|
|
192
|
+
return str;
|
|
193
|
+
}
|
|
194
|
+
return str.substring(0, maxLength - suffix.length) + suffix;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.CommonUtils = CommonUtils;
|
|
198
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/utils/common.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 加密工具类
|
|
3
|
+
* 封装 CryptoJS 常用加密/解密方法,提供统一的加密服务
|
|
4
|
+
* 遵循高内聚原则,将所有加解密相关逻辑集中在此模块
|
|
5
|
+
*/
|
|
6
|
+
export declare class CryptoUtils {
|
|
7
|
+
/**
|
|
8
|
+
* 计算字符串的 MD5 哈希值
|
|
9
|
+
* @param input 输入字符串
|
|
10
|
+
* @returns MD5 哈希值(32位小写)
|
|
11
|
+
*/
|
|
12
|
+
static md5(input: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* 计算字符串的 SHA-256 哈希值
|
|
15
|
+
* @param input 输入字符串
|
|
16
|
+
* @returns SHA-256 哈希值
|
|
17
|
+
*/
|
|
18
|
+
static sha256(input: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* 使用 AES 加密字符串
|
|
21
|
+
* @param plaintext 明文
|
|
22
|
+
* @param secretKey 密钥
|
|
23
|
+
* @returns 加密后的密文(Base64 编码)
|
|
24
|
+
*/
|
|
25
|
+
static aesEncrypt(plaintext: string, secretKey: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* 使用 AES 解密字符串
|
|
28
|
+
* @param ciphertext 密文
|
|
29
|
+
* @param secretKey 密钥
|
|
30
|
+
* @returns 解密后的明文,失败返回空字符串
|
|
31
|
+
*/
|
|
32
|
+
static aesDecrypt(ciphertext: string, secretKey: string): string;
|
|
33
|
+
/**
|
|
34
|
+
* 使用 Base64 编码字符串
|
|
35
|
+
* @param input 输入字符串
|
|
36
|
+
* @returns Base64 编码结果
|
|
37
|
+
*/
|
|
38
|
+
static base64Encode(input: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* 使用 Base64 解码字符串
|
|
41
|
+
* @param input Base64 编码字符串
|
|
42
|
+
* @returns 解码后的字符串
|
|
43
|
+
*/
|
|
44
|
+
static base64Decode(input: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* 生成带时间戳的签名(用于接口请求等场景)
|
|
47
|
+
* 组合应用ID、时间戳、密钥进行签名,防止请求篡改
|
|
48
|
+
* @param appId 应用ID
|
|
49
|
+
* @param secretKey 密钥
|
|
50
|
+
* @returns 签名字符串
|
|
51
|
+
*/
|
|
52
|
+
static generateSignature(appId: string, secretKey: string): string;
|
|
53
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.CryptoUtils = void 0;
|
|
40
|
+
const _ = __importStar(require("lodash"));
|
|
41
|
+
const CryptoJS = __importStar(require("crypto-js"));
|
|
42
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
43
|
+
const logger_1 = require("./logger");
|
|
44
|
+
/**
|
|
45
|
+
* 加密工具类
|
|
46
|
+
* 封装 CryptoJS 常用加密/解密方法,提供统一的加密服务
|
|
47
|
+
* 遵循高内聚原则,将所有加解密相关逻辑集中在此模块
|
|
48
|
+
*/
|
|
49
|
+
class CryptoUtils {
|
|
50
|
+
/**
|
|
51
|
+
* 计算字符串的 MD5 哈希值
|
|
52
|
+
* @param input 输入字符串
|
|
53
|
+
* @returns MD5 哈希值(32位小写)
|
|
54
|
+
*/
|
|
55
|
+
static md5(input) {
|
|
56
|
+
if (_.isEmpty(input)) {
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
return CryptoJS.MD5(input).toString();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 计算字符串的 SHA-256 哈希值
|
|
63
|
+
* @param input 输入字符串
|
|
64
|
+
* @returns SHA-256 哈希值
|
|
65
|
+
*/
|
|
66
|
+
static sha256(input) {
|
|
67
|
+
if (_.isEmpty(input)) {
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
return CryptoJS.SHA256(input).toString();
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* 使用 AES 加密字符串
|
|
74
|
+
* @param plaintext 明文
|
|
75
|
+
* @param secretKey 密钥
|
|
76
|
+
* @returns 加密后的密文(Base64 编码)
|
|
77
|
+
*/
|
|
78
|
+
static aesEncrypt(plaintext, secretKey) {
|
|
79
|
+
if (_.isEmpty(plaintext) || _.isEmpty(secretKey)) {
|
|
80
|
+
return '';
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return CryptoJS.AES.encrypt(plaintext, secretKey).toString();
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
logger_1.logger.error('AES 加密失败:', error);
|
|
87
|
+
return '';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* 使用 AES 解密字符串
|
|
92
|
+
* @param ciphertext 密文
|
|
93
|
+
* @param secretKey 密钥
|
|
94
|
+
* @returns 解密后的明文,失败返回空字符串
|
|
95
|
+
*/
|
|
96
|
+
static aesDecrypt(ciphertext, secretKey) {
|
|
97
|
+
if (_.isEmpty(ciphertext) || _.isEmpty(secretKey)) {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
const bytes = CryptoJS.AES.decrypt(ciphertext, secretKey);
|
|
102
|
+
return bytes.toString(CryptoJS.enc.Utf8);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
logger_1.logger.error('AES 解密失败:', error);
|
|
106
|
+
return '';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 使用 Base64 编码字符串
|
|
111
|
+
* @param input 输入字符串
|
|
112
|
+
* @returns Base64 编码结果
|
|
113
|
+
*/
|
|
114
|
+
static base64Encode(input) {
|
|
115
|
+
if (_.isEmpty(input)) {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
const wordArray = CryptoJS.enc.Utf8.parse(input);
|
|
119
|
+
return CryptoJS.enc.Base64.stringify(wordArray);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 使用 Base64 解码字符串
|
|
123
|
+
* @param input Base64 编码字符串
|
|
124
|
+
* @returns 解码后的字符串
|
|
125
|
+
*/
|
|
126
|
+
static base64Decode(input) {
|
|
127
|
+
if (_.isEmpty(input)) {
|
|
128
|
+
return '';
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
const words = CryptoJS.enc.Base64.parse(input);
|
|
132
|
+
return words.toString(CryptoJS.enc.Utf8);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
logger_1.logger.error('Base64 解码失败:', error);
|
|
136
|
+
return '';
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* 生成带时间戳的签名(用于接口请求等场景)
|
|
141
|
+
* 组合应用ID、时间戳、密钥进行签名,防止请求篡改
|
|
142
|
+
* @param appId 应用ID
|
|
143
|
+
* @param secretKey 密钥
|
|
144
|
+
* @returns 签名字符串
|
|
145
|
+
*/
|
|
146
|
+
static generateSignature(appId, secretKey) {
|
|
147
|
+
const timestamp = (0, dayjs_1.default)().unix().toString();
|
|
148
|
+
const rawString = `${appId}${timestamp}${secretKey}`;
|
|
149
|
+
return this.sha256(rawString);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.CryptoUtils = CryptoUtils;
|
|
153
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { AxiosRequestConfig } from 'axios';
|
|
2
|
+
/**
|
|
3
|
+
* HTTP 请求工具类
|
|
4
|
+
* 封装 axios,提供统一的 HTTP 请求接口,包含请求拦截、响应拦截、错误处理
|
|
5
|
+
* 具备超时设置、自动重试、日志记录等功能
|
|
6
|
+
*/
|
|
7
|
+
export declare class HttpUtils {
|
|
8
|
+
/** axios 实例 */
|
|
9
|
+
private static instance;
|
|
10
|
+
/**
|
|
11
|
+
* 获取 axios 实例(单例模式)
|
|
12
|
+
*/
|
|
13
|
+
private static getInstance;
|
|
14
|
+
/**
|
|
15
|
+
* 发送 GET 请求
|
|
16
|
+
* @param url 请求 URL
|
|
17
|
+
* @param config 请求配置
|
|
18
|
+
* @returns Promise<T> 响应数据
|
|
19
|
+
*/
|
|
20
|
+
static get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
21
|
+
/**
|
|
22
|
+
* 发送 POST 请求
|
|
23
|
+
* @param url 请求 URL
|
|
24
|
+
* @param data 请求数据
|
|
25
|
+
* @param config 请求配置
|
|
26
|
+
* @returns Promise<T> 响应数据
|
|
27
|
+
*/
|
|
28
|
+
static post<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* 发送 PUT 请求
|
|
31
|
+
* @param url 请求 URL
|
|
32
|
+
* @param data 请求数据
|
|
33
|
+
* @param config 请求配置
|
|
34
|
+
* @returns Promise<T> 响应数据
|
|
35
|
+
*/
|
|
36
|
+
static put<T = unknown>(url: string, data?: unknown, config?: AxiosRequestConfig): Promise<T>;
|
|
37
|
+
/**
|
|
38
|
+
* 发送 DELETE 请求
|
|
39
|
+
* @param url 请求 URL
|
|
40
|
+
* @param config 请求配置
|
|
41
|
+
* @returns Promise<T> 响应数据
|
|
42
|
+
*/
|
|
43
|
+
static delete<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T>;
|
|
44
|
+
/**
|
|
45
|
+
* 带重试机制的 GET 请求
|
|
46
|
+
* @param url 请求 URL
|
|
47
|
+
* @param maxRetries 最大重试次数,默认 3 次
|
|
48
|
+
* @param retryDelay 重试间隔(毫秒),默认 1000ms
|
|
49
|
+
* @param config 请求配置
|
|
50
|
+
* @returns Promise<T> 响应数据
|
|
51
|
+
*/
|
|
52
|
+
static getWithRetry<T = unknown>(url: string, maxRetries?: number, retryDelay?: number, config?: AxiosRequestConfig): Promise<T>;
|
|
53
|
+
/**
|
|
54
|
+
* 延时函数
|
|
55
|
+
* @param ms 延时毫秒数
|
|
56
|
+
*/
|
|
57
|
+
private static sleep;
|
|
58
|
+
}
|