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/') @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