Files
DP/Server/app/api/v1/analytics.py

83 lines
2.5 KiB
Python

"""
用户行为分析 API
记录和分析用户操作
"""
from fastapi import APIRouter, HTTPException, Depends, Header
from pydantic import BaseModel
from typing import Optional, Any
from datetime import datetime
from app.core.security import get_current_user
from app.core.config import settings
router = APIRouter()
# 简单的内存存储(生产环境应该用数据库)
action_logs = []
class ActionLog(BaseModel):
action: str
details: Optional[Any] = None
timestamp: int
session_id: str
device_id: Optional[str] = None
class ActionLogResponse(BaseModel):
success: bool
message: str
@router.post("/log", response_model=ActionLogResponse)
async def log_action(log: ActionLog, current_username: str = Depends(get_current_user)):
"""记录用户行为(仅记录当前登录用户的操作)"""
try:
log_entry = {
"username": current_username,
"action": log.action,
"details": log.details,
"timestamp": log.timestamp,
"session_id": log.session_id,
"device_id": log.device_id,
"server_time": datetime.now().isoformat(),
}
action_logs.append(log_entry)
# 只保留最近 10000 条
if len(action_logs) > 10000:
action_logs.pop(0)
return ActionLogResponse(success=True, message="已记录")
except Exception as e:
return ActionLogResponse(success=False, message=str(e))
@router.get("/stats/me")
async def get_my_stats(current_username: str = Depends(get_current_user)):
"""获取当前用户的统计信息"""
user_logs = [log for log in action_logs if log.get("username") == current_username]
action_counts: dict[str, int] = {}
for log in user_logs:
action = log.get("action", "unknown")
action_counts[action] = action_counts.get(action, 0) + 1
return {
"username": current_username,
"total_actions": len(user_logs),
"action_counts": action_counts,
"recent_actions": user_logs[-10:]
}
@router.get("/recent")
async def get_recent_logs(
limit: int = 100,
admin_token: Optional[str] = Header(None, alias="X-Admin-Token")
):
"""获取最近的操作日志(仅管理员)"""
if admin_token != settings.ADMIN_TOKEN:
raise HTTPException(status_code=403, detail="需要管理员权限")
return {
"total": len(action_logs),
"logs": action_logs[-limit:]
}