/** * 统计数据路由 * @file stats.js * @description 定义统计数据相关的API路由 */ const express = require('express'); const router = express.Router(); const statsController = require('../controllers/statsController'); const { verifyToken } = require('../middleware/auth'); // 公开API路由,不需要验证token const publicRoutes = express.Router(); router.use('/public', publicRoutes); // 公开获取仪表盘统计数据 publicRoutes.get('/dashboard', statsController.getDashboardStats); // 公开获取监控数据 publicRoutes.get('/monitoring', statsController.getMonitorData); // 公开获取月度数据趋势 publicRoutes.get('/monthly-trends', statsController.getMonthlyTrends); // 公开获取农场总数统计(实时数据库查询) publicRoutes.get('/farm-count', statsController.getFarmCount); // 公开获取动物总数统计(实时数据库查询) publicRoutes.get('/animal-count', statsController.getAnimalCount); /** * @swagger * tags: * name: Statistics * description: 统计数据API */ /** * @swagger * /api/stats/dashboard: * get: * summary: 获取仪表盘统计数据 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取仪表盘统计数据 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * farmCount: * type: integer * example: 12 * animalCount: * type: integer * example: 5000 * deviceCount: * type: integer * example: 150 * alertCount: * type: integer * example: 25 * deviceOnlineRate: * type: number * format: float * example: 0.95 * alertsByLevel: * type: object * properties: * low: * type: integer * example: 5 * medium: * type: integer * example: 10 * high: * type: integer * example: 8 * critical: * type: integer * example: 2 * 401: * description: 未授权 * 500: * description: 服务器错误 */ router.get('/dashboard', verifyToken, statsController.getDashboardStats); /** * @swagger * /api/stats/farms: * get: * summary: 获取养殖场统计数据 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取养殖场统计数据 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * totalFarms: * type: integer * example: 12 * farmsByType: * type: array * items: * type: object * properties: * type: * type: string * example: 猪场 * count: * type: integer * example: 5 * farmsByStatus: * type: array * items: * type: object * properties: * status: * type: string * example: active * count: * type: integer * example: 10 * 401: * description: 未授权 * 500: * description: 服务器错误 */ router.get('/farms', verifyToken, statsController.getFarmStats); /** * @swagger * /api/stats/animals: * get: * summary: 获取动物统计数据 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取动物统计数据 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * totalAnimals: * type: integer * example: 5000 * animalsByType: * type: array * items: * type: object * properties: * type: * type: string * example: 猪 * count: * type: integer * example: 3000 * animalsByHealth: * type: array * items: * type: object * properties: * health_status: * type: string * example: healthy * count: * type: integer * example: 4500 * 401: * description: 未授权 * 500: * description: 服务器错误 */ router.get('/animals', verifyToken, statsController.getAnimalStats); /** * @swagger * /api/stats/devices: * get: * summary: 获取设备统计数据 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取设备统计数据 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * totalDevices: * type: integer * example: 150 * devicesByType: * type: array * items: * type: object * properties: * type: * type: string * example: 温度传感器 * count: * type: integer * example: 50 * devicesByStatus: * type: array * items: * type: object * properties: * status: * type: string * example: online * count: * type: integer * example: 140 * onlineRate: * type: number * format: float * example: 0.95 * 401: * description: 未授权 * 500: * description: 服务器错误 */ router.get('/devices', verifyToken, statsController.getDeviceStats); /** * @swagger * /api/stats/alerts: * get: * summary: 获取预警统计数据 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取预警统计数据 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * totalAlerts: * type: integer * example: 25 * alertsByType: * type: array * items: * type: object * properties: * type: * type: string * example: 温度异常 * count: * type: integer * example: 10 * alertsByLevel: * type: array * items: * type: object * properties: * level: * type: string * example: high * count: * type: integer * example: 8 * alertsByStatus: * type: array * items: * type: object * properties: * status: * type: string * example: active * count: * type: integer * example: 15 * recentAlerts: * type: array * items: * type: object * properties: * id: * type: integer * example: 1 * type: * type: string * example: 温度异常 * level: * type: string * example: high * message: * type: string * example: 温度超过阈值 * createdAt: * type: string * format: date-time * example: 2023-01-01T12:00:00Z * 401: * description: 未授权 * 500: * description: 服务器错误 */ router.get('/alerts', verifyToken, statsController.getAlertStats); /** * @swagger * /api/stats/monitoring: * get: * summary: 获取实时监控数据 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取实时监控数据 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * deviceStatus: * type: object * properties: * online: * type: integer * example: 140 * offline: * type: integer * example: 10 * maintenance: * type: integer * example: 5 * recentAlerts: * type: array * items: * type: object * properties: * id: * type: integer * example: 1 * type: * type: string * example: 温度异常 * level: * type: string * example: high * message: * type: string * example: 温度超过阈值 * createdAt: * type: string * format: date-time * example: 2023-01-01T12:00:00Z * environmentalData: * type: object * properties: * temperature: * type: array * items: * type: object * properties: * timestamp: * type: string * format: date-time * example: 2023-01-01T12:00:00Z * value: * type: number * format: float * example: 25.5 * humidity: * type: array * items: * type: object * properties: * timestamp: * type: string * format: date-time * example: 2023-01-01T12:00:00Z * value: * type: number * format: float * example: 60.2 * 401: * description: 未授权 * 500: * description: 服务器错误 */ router.get('/monitoring', verifyToken, statsController.getMonitorData); /** * @swagger * /api/stats/monthly-trends: * get: * summary: 获取月度数据趋势 * tags: [Statistics] * security: * - bearerAuth: [] * responses: * 200: * description: 成功获取月度数据趋势 * content: * application/json: * schema: * type: object * properties: * success: * type: boolean * example: true * data: * type: object * properties: * xAxis: * type: array * items: * type: string * description: 月份标签 * series: * type: array * items: * type: object * properties: * name: * type: string * type: * type: string * data: * type: array * items: * type: number * itemStyle: * type: object * areaStyle: * type: object * 500: * description: 服务器错误 */ router.get('/monthly-trends', verifyToken, statsController.getMonthlyTrends); module.exports = router;