Files
nxxmdata/backend/routes/stats.js
2025-08-25 15:00:46 +08:00

484 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 统计数据路由
* @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);
/**
* @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;