systemLog.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.SystemLogModel = void 0;
  4. const database_1 = require("../config/database");
  5. class SystemLogModel {
  6. static async getAll(limit, offset) {
  7. let query = 'SELECT * FROM system_logs ORDER BY created_at DESC';
  8. const params = [];
  9. if (limit !== undefined) {
  10. query += ' LIMIT ?';
  11. params.push(limit);
  12. if (offset !== undefined) {
  13. query += ' OFFSET ?';
  14. params.push(offset);
  15. }
  16. }
  17. return await (0, database_1.executeQuery)(query, params);
  18. }
  19. static async getById(id) {
  20. const query = 'SELECT * FROM system_logs WHERE id = ?';
  21. const logs = await (0, database_1.executeQuery)(query, [id]);
  22. return logs.length > 0 ? logs[0] : null;
  23. }
  24. static async getByLevel(level, limit, offset) {
  25. let query = 'SELECT * FROM system_logs WHERE level = ? ORDER BY created_at DESC';
  26. const params = [level];
  27. if (limit !== undefined) {
  28. query += ' LIMIT ?';
  29. params.push(limit);
  30. if (offset !== undefined) {
  31. query += ' OFFSET ?';
  32. params.push(offset);
  33. }
  34. }
  35. return await (0, database_1.executeQuery)(query, params);
  36. }
  37. static async getBySource(source, limit, offset) {
  38. let query = 'SELECT * FROM system_logs WHERE source = ? ORDER BY created_at DESC';
  39. const params = [source];
  40. if (limit !== undefined) {
  41. query += ' LIMIT ?';
  42. params.push(limit);
  43. if (offset !== undefined) {
  44. query += ' OFFSET ?';
  45. params.push(offset);
  46. }
  47. }
  48. return await (0, database_1.executeQuery)(query, params);
  49. }
  50. static async getByModule(module, limit, offset) {
  51. let query = 'SELECT * FROM system_logs WHERE module = ? ORDER BY created_at DESC';
  52. const params = [module];
  53. if (limit !== undefined) {
  54. query += ' LIMIT ?';
  55. params.push(limit);
  56. if (offset !== undefined) {
  57. query += ' OFFSET ?';
  58. params.push(offset);
  59. }
  60. }
  61. return await (0, database_1.executeQuery)(query, params);
  62. }
  63. static async getByTimeRange(startTime, endTime, limit, offset) {
  64. let query = 'SELECT * FROM system_logs WHERE created_at BETWEEN ? AND ? ORDER BY created_at DESC';
  65. const params = [startTime, endTime];
  66. if (limit !== undefined) {
  67. query += ' LIMIT ?';
  68. params.push(limit);
  69. if (offset !== undefined) {
  70. query += ' OFFSET ?';
  71. params.push(offset);
  72. }
  73. }
  74. return await (0, database_1.executeQuery)(query, params);
  75. }
  76. static async getCount() {
  77. const query = 'SELECT COUNT(*) as count FROM system_logs';
  78. const result = await (0, database_1.executeQuery)(query);
  79. return result[0].count;
  80. }
  81. static async getLevelStats(startTime, endTime) {
  82. let query = `
  83. SELECT
  84. level,
  85. COUNT(*) as count
  86. FROM system_logs
  87. `;
  88. const params = [];
  89. if (startTime && endTime) {
  90. query += ' WHERE created_at BETWEEN ? AND ?';
  91. params.push(startTime, endTime);
  92. }
  93. query += ' GROUP BY level';
  94. return await (0, database_1.executeQuery)(query, params);
  95. }
  96. static async getSourceStats(startTime, endTime) {
  97. let query = `
  98. SELECT
  99. source,
  100. COUNT(*) as count
  101. FROM system_logs
  102. `;
  103. const params = [];
  104. if (startTime && endTime) {
  105. query += ' WHERE created_at BETWEEN ? AND ?';
  106. params.push(startTime, endTime);
  107. }
  108. query += ' GROUP BY source';
  109. return await (0, database_1.executeQuery)(query, params);
  110. }
  111. static async getDailyStats(days = 7) {
  112. const query = `
  113. SELECT
  114. DATE(created_at) as date,
  115. COUNT(*) as total,
  116. SUM(CASE WHEN level = 'info' THEN 1 ELSE 0 END) as info,
  117. SUM(CASE WHEN level = 'warn' THEN 1 ELSE 0 END) as warn,
  118. SUM(CASE WHEN level = 'error' THEN 1 ELSE 0 END) as error,
  119. SUM(CASE WHEN level = 'debug' THEN 1 ELSE 0 END) as debug
  120. FROM system_logs
  121. WHERE created_at >= DATE_SUB(CURRENT_DATE(), INTERVAL ? DAY)
  122. GROUP BY DATE(created_at)
  123. ORDER BY date DESC
  124. `;
  125. return await (0, database_1.executeQuery)(query, [days]);
  126. }
  127. static async create(systemLog) {
  128. const query = `
  129. INSERT INTO system_logs (level, message, source, module, user_id, username, ip_address, details)
  130. VALUES (?, ?, ?, ?, ?, ?, ?, ?)
  131. `;
  132. const params = [
  133. systemLog.level,
  134. systemLog.message,
  135. systemLog.source,
  136. systemLog.module || null,
  137. systemLog.user_id || null,
  138. systemLog.username || null,
  139. systemLog.ip_address || null,
  140. systemLog.details || null
  141. ];
  142. const result = await (0, database_1.executeQuery)(query, params);
  143. return { ...systemLog, id: result.insertId, created_at: new Date() };
  144. }
  145. static async search(searchTerm, limit, offset) {
  146. let query = `
  147. SELECT * FROM system_logs
  148. WHERE message LIKE ? OR source LIKE ? OR module LIKE ? OR details LIKE ?
  149. ORDER BY created_at DESC
  150. `;
  151. const params = [
  152. `%${searchTerm}%`, `%${searchTerm}%`, `%${searchTerm}%`, `%${searchTerm}%`
  153. ];
  154. if (limit !== undefined) {
  155. query += ' LIMIT ?';
  156. params.push(limit);
  157. if (offset !== undefined) {
  158. query += ' OFFSET ?';
  159. params.push(offset);
  160. }
  161. }
  162. return await (0, database_1.executeQuery)(query, params);
  163. }
  164. static async getSearchCount(searchTerm) {
  165. const query = `
  166. SELECT COUNT(*) as count
  167. FROM system_logs
  168. WHERE message LIKE ? OR source LIKE ? OR module LIKE ? OR details LIKE ?
  169. `;
  170. const params = [
  171. `%${searchTerm}%`, `%${searchTerm}%`, `%${searchTerm}%`, `%${searchTerm}%`
  172. ];
  173. const result = await (0, database_1.executeQuery)(query, params);
  174. return result[0].count;
  175. }
  176. static async cleanup(daysToKeep = 30) {
  177. const query = 'DELETE FROM system_logs WHERE created_at < DATE_SUB(NOW(), INTERVAL ? DAY)';
  178. const result = await (0, database_1.executeQuery)(query, [daysToKeep]);
  179. return result.affectedRows;
  180. }
  181. static async getRecent(limit = 10) {
  182. const query = 'SELECT * FROM system_logs ORDER BY created_at DESC LIMIT ?';
  183. return await (0, database_1.executeQuery)(query, [limit]);
  184. }
  185. static async getByUserId(userId, limit, offset) {
  186. let query = 'SELECT * FROM system_logs WHERE user_id = ? ORDER BY created_at DESC';
  187. const params = [userId];
  188. if (limit !== undefined) {
  189. query += ' LIMIT ?';
  190. params.push(limit);
  191. if (offset !== undefined) {
  192. query += ' OFFSET ?';
  193. params.push(offset);
  194. }
  195. }
  196. return await (0, database_1.executeQuery)(query, params);
  197. }
  198. static async getByUsername(username, limit, offset) {
  199. let query = 'SELECT * FROM system_logs WHERE username = ? ORDER BY created_at DESC';
  200. const params = [username];
  201. if (limit !== undefined) {
  202. query += ' LIMIT ?';
  203. params.push(limit);
  204. if (offset !== undefined) {
  205. query += ' OFFSET ?';
  206. params.push(offset);
  207. }
  208. }
  209. return await (0, database_1.executeQuery)(query, params);
  210. }
  211. static async getFullStats() {
  212. try {
  213. const totalQuery = 'SELECT COUNT(*) as count FROM system_logs';
  214. const totalResult = await (0, database_1.executeQuery)(totalQuery);
  215. const total = totalResult[0].count;
  216. const levelQuery = `
  217. SELECT
  218. level,
  219. COUNT(*) as count
  220. FROM system_logs
  221. GROUP BY level
  222. `;
  223. const levelStats = await (0, database_1.executeQuery)(levelQuery);
  224. const byLevel = {};
  225. levelStats.forEach((stat) => {
  226. byLevel[stat.level] = stat.count;
  227. });
  228. const sourceQuery = `
  229. SELECT
  230. source,
  231. COUNT(*) as count
  232. FROM system_logs
  233. GROUP BY source
  234. `;
  235. const sourceStats = await (0, database_1.executeQuery)(sourceQuery);
  236. const bySource = {};
  237. sourceStats.forEach((stat) => {
  238. bySource[stat.source] = stat.count;
  239. });
  240. const todayQuery = `
  241. SELECT COUNT(*) as count
  242. FROM system_logs
  243. WHERE DATE(created_at) = CURDATE()
  244. `;
  245. const todayResult = await (0, database_1.executeQuery)(todayQuery);
  246. const today = todayResult[0].count;
  247. const weekQuery = `
  248. SELECT COUNT(*) as count
  249. FROM system_logs
  250. WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
  251. `;
  252. const weekResult = await (0, database_1.executeQuery)(weekQuery);
  253. const week = weekResult[0].count;
  254. const monthQuery = `
  255. SELECT COUNT(*) as count
  256. FROM system_logs
  257. WHERE created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
  258. `;
  259. const monthResult = await (0, database_1.executeQuery)(monthQuery);
  260. const month = monthResult[0].count;
  261. return {
  262. total,
  263. byLevel,
  264. bySource,
  265. byTimeRange: {
  266. today,
  267. week,
  268. month
  269. }
  270. };
  271. }
  272. catch (error) {
  273. console.error('获取系统日志统计信息失败:', error);
  274. return {
  275. total: 0,
  276. byLevel: {},
  277. bySource: {},
  278. byTimeRange: {
  279. today: 0,
  280. week: 0,
  281. month: 0
  282. }
  283. };
  284. }
  285. }
  286. static async getCountByMultipleConditions(conditions, startTime, endTime, fuzzyFields) {
  287. let query = 'SELECT COUNT(*) as count FROM system_logs WHERE 1=1';
  288. const params = [];
  289. for (const [key, value] of Object.entries(conditions)) {
  290. if (value !== undefined && value !== null) {
  291. if (fuzzyFields && fuzzyFields.includes(key)) {
  292. query += ` AND ${key} LIKE ?`;
  293. params.push(`%${value}%`);
  294. }
  295. else if (Array.isArray(value)) {
  296. const placeholders = value.map(() => '?').join(', ');
  297. query += ` AND ${key} IN (${placeholders})`;
  298. params.push(...value);
  299. }
  300. else {
  301. query += ` AND ${key} = ?`;
  302. params.push(value);
  303. }
  304. }
  305. }
  306. if (startTime && endTime) {
  307. query += ' AND created_at BETWEEN ? AND ?';
  308. params.push(startTime, endTime);
  309. }
  310. const result = await (0, database_1.executeQuery)(query, params);
  311. return result[0].count;
  312. }
  313. static async getByMultipleConditions(conditions, startTime, endTime, limit, offset, fuzzyFields) {
  314. let query = 'SELECT * FROM system_logs WHERE 1=1';
  315. const params = [];
  316. for (const [key, value] of Object.entries(conditions)) {
  317. if (value !== undefined && value !== null) {
  318. if (fuzzyFields && fuzzyFields.includes(key)) {
  319. query += ` AND ${key} LIKE ?`;
  320. params.push(`%${value}%`);
  321. }
  322. else if (Array.isArray(value)) {
  323. const placeholders = value.map(() => '?').join(', ');
  324. query += ` AND ${key} IN (${placeholders})`;
  325. params.push(...value);
  326. }
  327. else {
  328. query += ` AND ${key} = ?`;
  329. params.push(value);
  330. }
  331. }
  332. }
  333. if (startTime && endTime) {
  334. query += ' AND created_at BETWEEN ? AND ?';
  335. params.push(startTime, endTime);
  336. }
  337. query += ' ORDER BY created_at DESC';
  338. if (limit !== undefined && offset !== undefined) {
  339. query += ' LIMIT ? OFFSET ?';
  340. params.push(limit, offset);
  341. }
  342. return await (0, database_1.executeQuery)(query, params);
  343. }
  344. static async getCountByTimeRange(startTime, endTime) {
  345. const query = 'SELECT COUNT(*) as count FROM system_logs WHERE created_at BETWEEN ? AND ?';
  346. const result = await (0, database_1.executeQuery)(query, [startTime, endTime]);
  347. return result[0].count;
  348. }
  349. static async getCountByLevel(level) {
  350. const query = 'SELECT COUNT(*) as count FROM system_logs WHERE level = ?';
  351. const result = await (0, database_1.executeQuery)(query, [level]);
  352. return result[0].count;
  353. }
  354. static async getCountBySource(source) {
  355. const query = 'SELECT COUNT(*) as count FROM system_logs WHERE source = ?';
  356. const result = await (0, database_1.executeQuery)(query, [source]);
  357. return result[0].count;
  358. }
  359. static async getCountByModule(module) {
  360. const query = 'SELECT COUNT(*) as count FROM system_logs WHERE module = ?';
  361. const result = await (0, database_1.executeQuery)(query, [module]);
  362. return result[0].count;
  363. }
  364. static async getCountByUserId(userId) {
  365. const query = 'SELECT COUNT(*) as count FROM system_logs WHERE user_id = ?';
  366. const result = await (0, database_1.executeQuery)(query, [userId]);
  367. return result[0].count;
  368. }
  369. static async getCountByUsername(username) {
  370. const query = 'SELECT COUNT(*) as count FROM system_logs WHERE username = ?';
  371. const result = await (0, database_1.executeQuery)(query, [username]);
  372. return result[0].count;
  373. }
  374. }
  375. exports.SystemLogModel = SystemLogModel;
  376. //# sourceMappingURL=systemLog.js.map