174 lines
5.4 KiB
Python
174 lines
5.4 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', 20, type=int)
|
|
offset = request.args.get('offset', 0, type=int)
|
|
|
|
# 计算页码
|
|
page = (offset // limit) + 1
|
|
|
|
logs, total = server.stats_db.get_error_logs(days, page, limit)
|
|
|
|
# 补充用户和群组名称
|
|
for log in logs:
|
|
if log.get('user_id'):
|
|
log['user_name'] = server.contact_manager.get_nickname(log['user_id'])
|
|
if log.get('group_id'):
|
|
log['group_name'] = server.contact_manager.get_nickname(log['group_id'])
|
|
|
|
return jsonify({
|
|
"success": True,
|
|
"data": {
|
|
"logs": logs,
|
|
"total": total
|
|
}
|
|
})
|
|
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
|