管理后台 server 使用蓝图模式,降低维护成本,降低修改功能时对其他模块的影响
This commit is contained in:
144
admin/dashboard/blueprints/stats.py
Normal file
144
admin/dashboard/blueprints/stats.py
Normal file
@@ -0,0 +1,144 @@
|
||||
from flask import Blueprint, render_template, jsonify, request
|
||||
from .auth import login_required
|
||||
import logging
|
||||
from datetime import datetime
|
||||
from flask import current_app
|
||||
|
||||
# 创建统计数据蓝图
|
||||
stats_bp = Blueprint('stats', __name__)
|
||||
logger = logging.getLogger("StatsBlueprint")
|
||||
|
||||
# 页面路由
|
||||
@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 = stats_bp.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 = stats_bp.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 = stats_bp.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 = stats_bp.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 = stats_bp.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 = stats_bp.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
|
||||
Reference in New Issue
Block a user