Files
abot/admin/dashboard/blueprints/stats.py
2025-04-30 13:22:33 +08:00

143 lines
4.9 KiB
Python

from flask import Blueprint, render_template, jsonify, request
from .auth import login_required
from loguru import logger
from datetime import datetime
from flask import current_app
# 创建统计数据蓝图
stats_bp = Blueprint('stats', __name__)
# 页面路由
@stats_bp.route('/plugins')
@login_required
def plugins():
return render_template('plugins.html')
@stats_bp.route('/users')
@login_required
def users_page():
return render_template('users.html')
@stats_bp.route('/groups')
@login_required
def groups():
return render_template('groups.html')
@stats_bp.route('/errors')
@login_required
def errors():
return render_template('errors.html')
# API路由
@stats_bp.route('/api/user_stats')
@login_required
def api_user_stats():
try:
server = current_app.dashboard_server
days = request.args.get('days', 7, type=int)
limit = request.args.get('limit', 10, type=int)
stats = server.stats_db.get_user_stats(days, limit)
# 将用户ID转换为名称
for item in stats:
if 'user_id' in item:
user_id = item['user_id']
item['user_name'] = server.contact_manager.get_nickname(user_id)
return jsonify({"success": True, "data": stats})
except Exception as e:
logger.error(f"获取用户统计失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@stats_bp.route('/api/group_stats')
@login_required
def api_group_stats():
try:
server = current_app.dashboard_server
days = request.args.get('days', 7, type=int)
limit = request.args.get('limit', 10, type=int)
stats = server.stats_db.get_group_stats(days, limit)
# 将群ID转换为名称
for item in stats:
if 'group_id' in item:
group_id = item['group_id']
item['group_name'] = server.contact_manager.get_nickname(group_id)
return jsonify({"success": True, "data": stats})
except Exception as e:
logger.error(f"获取群组统计失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@stats_bp.route('/api/plugin_stats')
@login_required
def api_plugin_stats():
try:
server = current_app.dashboard_server
days = request.args.get('days', 7, type=int)
stats = server.stats_db.get_plugin_stats(days)
return jsonify({"success": True, "data": stats})
except Exception as e:
logger.error(f"获取插件统计失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@stats_bp.route('/api/error_logs')
@login_required
def api_error_logs():
try:
server = current_app.dashboard_server
days = request.args.get('days', 7, type=int)
limit = request.args.get('limit', 100, type=int)
logs = server.stats_db.get_error_logs(days, limit)
return jsonify({"success": True, "data": logs})
except Exception as e:
logger.error(f"获取错误日志失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@stats_bp.route('/api/dashboard_summary')
@login_required
def api_dashboard_summary():
try:
server = current_app.dashboard_server
days = request.args.get('days', 7, type=int)
summary = server.stats_db.get_dashboard_summary(days)
# 转换用户和群组ID为名称
if 'top_users' in summary:
for user in summary['top_users']:
if 'user_id' in user:
user['user_name'] = server.contact_manager.get_nickname(user['user_id'])
if 'top_groups' in summary:
for group in summary['top_groups']:
if 'group_id' in group:
group['group_name'] = server.contact_manager.get_nickname(group['group_id'])
return jsonify({"success": True, "data": summary})
except Exception as e:
logger.error(f"获取仪表盘摘要数据出错: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@stats_bp.route('/api/plugin_trend')
@login_required
def api_plugin_trend():
try:
server = current_app.dashboard_server
days = request.args.get('days', 7, type=int)
plugin_name = request.args.get('plugin_name', '')
trend = server.stats_db.get_plugin_trend(plugin_name, days)
return jsonify({"success": True, "data": trend})
except Exception as e:
logger.error(f"获取插件趋势失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500
@stats_bp.route('/api/error_detail/<int:error_id>')
@login_required
def api_error_detail(error_id):
try:
server = current_app.dashboard_server
detail = server.stats_db.get_error_detail(error_id)
return jsonify({"success": True, "data": detail})
except Exception as e:
logger.error(f"获取错误详情失败: {e}")
return jsonify({"success": False, "error": str(e)}), 500