Files
nxxmdata/backend/routes/stats.js
shenquanyi 2bd1d8c032 buider
2025-08-27 15:36:36 +08:00

490 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);
// 公开获取农场总数统计(实时数据库查询)
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;