dashboard.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. """
  2. 仪表盘统计接口
  3. """
  4. from fastapi import APIRouter, Depends
  5. from sqlalchemy.orm import Session
  6. from sqlalchemy import func, and_
  7. from app.database import get_db
  8. from app.api.deps import get_current_admin
  9. from app.models.user import User
  10. from app.models.software import Software
  11. from app.models.card import Card
  12. from app.models.api_log import APILog
  13. from datetime import datetime, timedelta
  14. router = APIRouter()
  15. @router.get("/stats")
  16. async def get_dashboard_stats(
  17. db: Session = Depends(get_db),
  18. current_admin = Depends(get_current_admin)
  19. ):
  20. """获取仪表盘统计数据"""
  21. # 用户总数
  22. total_users = db.query(func.count(User.id)).scalar() or 0
  23. # 今日新增用户
  24. today_start = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
  25. today_new_users = db.query(func.count(User.id)).filter(
  26. User.created_at >= today_start
  27. ).scalar() or 0
  28. # 软件数量
  29. total_software = db.query(func.count(Software.id)).scalar() or 0
  30. # 卡密总数
  31. total_cards = db.query(func.count(Card.id)).scalar() or 0
  32. # 已激活卡密数
  33. activated_cards = db.query(func.count(Card.id)).filter(
  34. Card.status == 1
  35. ).scalar() or 0
  36. # 未激活卡密数
  37. unactivated_cards = db.query(func.count(Card.id)).filter(
  38. Card.status == 0
  39. ).scalar() or 0
  40. # 日志总数
  41. total_logs = db.query(func.count(APILog.id)).scalar() or 0
  42. # 今日日志数
  43. today_logs = db.query(func.count(APILog.id)).filter(
  44. APILog.created_at >= today_start
  45. ).scalar() or 0
  46. # 有效用户数(未过期)
  47. active_users = db.query(func.count(User.id)).filter(
  48. and_(
  49. User.expire_time.isnot(None),
  50. User.expire_time > datetime.now()
  51. )
  52. ).scalar() or 0
  53. # 过期用户数
  54. expired_users = db.query(func.count(User.id)).filter(
  55. and_(
  56. User.expire_time.isnot(None),
  57. User.expire_time <= datetime.now()
  58. )
  59. ).scalar() or 0
  60. # 最近7天新增用户趋势
  61. seven_days_ago = datetime.now() - timedelta(days=7)
  62. recent_users = db.query(
  63. func.date(User.created_at).label('date'),
  64. func.count(User.id).label('count')
  65. ).filter(
  66. User.created_at >= seven_days_ago
  67. ).group_by(func.date(User.created_at)).all()
  68. user_trend = [
  69. {
  70. "date": str(row.date),
  71. "count": row.count
  72. }
  73. for row in recent_users
  74. ]
  75. # 最近7天日志趋势
  76. recent_logs = db.query(
  77. func.date(APILog.created_at).label('date'),
  78. func.count(APILog.id).label('count')
  79. ).filter(
  80. APILog.created_at >= seven_days_ago
  81. ).group_by(func.date(APILog.created_at)).all()
  82. log_trend = [
  83. {
  84. "date": str(row.date),
  85. "count": row.count
  86. }
  87. for row in recent_logs
  88. ]
  89. return {
  90. "code": 200,
  91. "msg": "成功",
  92. "data": {
  93. "users": {
  94. "total": total_users,
  95. "today_new": today_new_users,
  96. "active": active_users,
  97. "expired": expired_users,
  98. "trend": user_trend
  99. },
  100. "software": {
  101. "total": total_software
  102. },
  103. "cards": {
  104. "total": total_cards,
  105. "activated": activated_cards,
  106. "unactivated": unactivated_cards
  107. },
  108. "logs": {
  109. "total": total_logs,
  110. "today": today_logs,
  111. "trend": log_trend
  112. }
  113. }
  114. }