""" 仪表盘统计接口 """ from fastapi import APIRouter, Depends from sqlalchemy.orm import Session from sqlalchemy import func, and_ from app.database import get_db from app.api.deps import get_current_admin from app.models.user import User from app.models.software import Software from app.models.card import Card from app.models.api_log import APILog from datetime import datetime, timedelta router = APIRouter() @router.get("/stats") async def get_dashboard_stats( db: Session = Depends(get_db), current_admin = Depends(get_current_admin) ): """获取仪表盘统计数据""" # 用户总数 total_users = db.query(func.count(User.id)).scalar() or 0 # 今日新增用户 today_start = datetime.now().replace(hour=0, minute=0, second=0, microsecond=0) today_new_users = db.query(func.count(User.id)).filter( User.created_at >= today_start ).scalar() or 0 # 软件数量 total_software = db.query(func.count(Software.id)).scalar() or 0 # 卡密总数 total_cards = db.query(func.count(Card.id)).scalar() or 0 # 已激活卡密数 activated_cards = db.query(func.count(Card.id)).filter( Card.status == 1 ).scalar() or 0 # 未激活卡密数 unactivated_cards = db.query(func.count(Card.id)).filter( Card.status == 0 ).scalar() or 0 # 日志总数 total_logs = db.query(func.count(APILog.id)).scalar() or 0 # 今日日志数 today_logs = db.query(func.count(APILog.id)).filter( APILog.created_at >= today_start ).scalar() or 0 # 有效用户数(未过期) active_users = db.query(func.count(User.id)).filter( and_( User.expire_time.isnot(None), User.expire_time > datetime.now() ) ).scalar() or 0 # 过期用户数 expired_users = db.query(func.count(User.id)).filter( and_( User.expire_time.isnot(None), User.expire_time <= datetime.now() ) ).scalar() or 0 # 最近7天新增用户趋势 seven_days_ago = datetime.now() - timedelta(days=7) recent_users = db.query( func.date(User.created_at).label('date'), func.count(User.id).label('count') ).filter( User.created_at >= seven_days_ago ).group_by(func.date(User.created_at)).all() user_trend = [ { "date": str(row.date), "count": row.count } for row in recent_users ] # 最近7天日志趋势 recent_logs = db.query( func.date(APILog.created_at).label('date'), func.count(APILog.id).label('count') ).filter( APILog.created_at >= seven_days_ago ).group_by(func.date(APILog.created_at)).all() log_trend = [ { "date": str(row.date), "count": row.count } for row in recent_logs ] return { "code": 200, "msg": "成功", "data": { "users": { "total": total_users, "today_new": today_new_users, "active": active_users, "expired": expired_users, "trend": user_trend }, "software": { "total": total_software }, "cards": { "total": total_cards, "activated": activated_cards, "unactivated": unactivated_cards }, "logs": { "total": total_logs, "today": today_logs, "trend": log_trend } } }