dashboardController.js 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.DashboardController = void 0;
  4. const device_1 = require("../models/device");
  5. const clientConnection_1 = require("../models/clientConnection");
  6. const mqttMessage_1 = require("../models/mqttMessage");
  7. class DashboardController {
  8. static async getOverview(req, res) {
  9. try {
  10. const [deviceCount, deviceStats, connectionCount, connectionStats, connectionEventStats, messageCount, messageTypeStats, recentConnections, recentMessages] = await Promise.all([
  11. device_1.DeviceModel.getCount(),
  12. device_1.DeviceModel.getStatusStats(),
  13. clientConnection_1.ClientConnectionModel.getCount(),
  14. clientConnection_1.ClientConnectionModel.getConnectionStats(),
  15. clientConnection_1.ClientConnectionModel.getEventStats(),
  16. mqttMessage_1.MqttMessageModel.getCount(),
  17. mqttMessage_1.MqttMessageModel.getTypeStats(),
  18. clientConnection_1.ClientConnectionModel.getAll(10),
  19. mqttMessage_1.MqttMessageModel.getAll(10)
  20. ]);
  21. const deviceStatusCounts = {
  22. online: 0,
  23. offline: 0,
  24. unknown: 0
  25. };
  26. deviceStats.forEach(stat => {
  27. deviceStatusCounts[stat.status] = stat.count;
  28. });
  29. const connectionEventCounts = {
  30. connected: 0,
  31. disconnected: 0
  32. };
  33. connectionStats.forEach(stat => {
  34. if (stat.connection_type in connectionEventCounts) {
  35. connectionEventCounts[stat.connection_type] = stat.count;
  36. }
  37. });
  38. const messageTypeCounts = {
  39. publish: 0,
  40. subscribe: 0,
  41. unsubscribe: 0
  42. };
  43. messageTypeStats.forEach(stat => {
  44. messageTypeCounts[stat.message_type] = stat.count;
  45. });
  46. const dailyStats = await clientConnection_1.ClientConnectionModel.getDailyStats(7);
  47. const hourlyStats = await mqttMessage_1.MqttMessageModel.getHourlyStats(24);
  48. res.status(200).json({
  49. success: true,
  50. data: {
  51. summary: {
  52. totalDevices: deviceCount,
  53. onlineDevices: deviceStatusCounts.online,
  54. totalConnections: connectionCount,
  55. totalMessages: messageCount
  56. },
  57. deviceStats: deviceStatusCounts,
  58. connectionStats: connectionEventCounts,
  59. messageStats: messageTypeCounts,
  60. dailyStats: dailyStats || [],
  61. hourlyStats: hourlyStats || [],
  62. recentConnections: recentConnections || [],
  63. recentMessages: recentMessages || []
  64. }
  65. });
  66. }
  67. catch (error) {
  68. console.error('获取仪表板概览数据失败:', error);
  69. res.status(500).json({
  70. success: false,
  71. message: '获取仪表板概览数据失败',
  72. error: error instanceof Error ? error.message : '未知错误'
  73. });
  74. }
  75. }
  76. static async getChartData(req, res) {
  77. try {
  78. const { type, period } = req.query;
  79. let data;
  80. switch (type) {
  81. case 'connections':
  82. const days = Number(period) || 7;
  83. data = await clientConnection_1.ClientConnectionModel.getDailyStats(days);
  84. break;
  85. case 'messages':
  86. const hours = Number(period) || 24;
  87. data = await mqttMessage_1.MqttMessageModel.getHourlyStats(hours);
  88. break;
  89. case 'deviceStatus':
  90. data = await device_1.DeviceModel.getStatusStats();
  91. break;
  92. case 'messageTypes':
  93. data = await mqttMessage_1.MqttMessageModel.getTypeStats();
  94. break;
  95. case 'qosLevels':
  96. data = await mqttMessage_1.MqttMessageModel.getQosStats();
  97. break;
  98. case 'popularTopics':
  99. const limit = Number(period) || 10;
  100. data = await mqttMessage_1.MqttMessageModel.getPopularTopics(limit);
  101. break;
  102. case 'activeClients':
  103. const clientLimit = Number(period) || 10;
  104. data = await mqttMessage_1.MqttMessageModel.getActiveClients(clientLimit);
  105. break;
  106. default:
  107. res.status(400).json({
  108. success: false,
  109. message: '无效的图表类型'
  110. });
  111. return;
  112. }
  113. res.status(200).json({
  114. success: true,
  115. data
  116. });
  117. }
  118. catch (error) {
  119. console.error('获取图表数据失败:', error);
  120. res.status(500).json({
  121. success: false,
  122. message: '获取图表数据失败',
  123. error: error instanceof Error ? error.message : '未知错误'
  124. });
  125. }
  126. }
  127. static async getDeviceStats(req, res) {
  128. try {
  129. const stats = await device_1.DeviceModel.getDeviceStats();
  130. res.status(200).json({
  131. success: true,
  132. data: stats,
  133. message: '获取设备统计成功'
  134. });
  135. }
  136. catch (error) {
  137. res.status(500).json({
  138. success: false,
  139. message: '获取设备统计失败',
  140. error: error instanceof Error ? error.message : String(error)
  141. });
  142. }
  143. }
  144. static async getSystemInfo(req, res) {
  145. try {
  146. const uptimeSeconds = process.uptime();
  147. const days = Math.floor(uptimeSeconds / 86400);
  148. const hours = Math.floor((uptimeSeconds % 86400) / 3600);
  149. const minutes = Math.floor((uptimeSeconds % 3600) / 60);
  150. let uptimeStr = '';
  151. if (days > 0)
  152. uptimeStr += `${days}天 `;
  153. if (hours > 0 || days > 0)
  154. uptimeStr += `${hours}小时 `;
  155. uptimeStr += `${minutes}分钟`;
  156. res.status(200).json({
  157. success: true,
  158. data: {
  159. nodeVersion: process.version.replace('v', ''),
  160. uptime: uptimeStr,
  161. platform: process.platform,
  162. arch: process.arch,
  163. memoryUsage: process.memoryUsage()
  164. }
  165. });
  166. }
  167. catch (error) {
  168. res.status(500).json({
  169. success: false,
  170. message: '获取系统信息失败',
  171. error: error instanceof Error ? error.message : String(error)
  172. });
  173. }
  174. }
  175. }
  176. exports.DashboardController = DashboardController;
  177. //# sourceMappingURL=dashboardController.js.map