| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- """
- 仪表盘统计接口
- """
- 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
- }
- }
- }
|