diff --git a/admin/dashboard/blueprints/stats.py b/admin/dashboard/blueprints/stats.py index 74ceaf1..59cc1c7 100644 --- a/admin/dashboard/blueprints/stats.py +++ b/admin/dashboard/blueprints/stats.py @@ -95,9 +95,28 @@ 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}) + 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 diff --git a/db/stats_db.py b/db/stats_db.py index 1862d3b..f517570 100644 --- a/db/stats_db.py +++ b/db/stats_db.py @@ -320,25 +320,39 @@ class StatsDBOperator(BaseDBOperator): """ return self.execute_query(sql, (days, limit)) or [] - def get_error_logs(self, days: int = 7, limit: int = 100) -> List[Dict]: + def get_error_logs(self, days: int = 7, page: int = 1, limit: int = 20) -> Tuple[List[Dict], int]: """获取错误日志 Args: days: 统计天数 - limit: 返回记录数量限制 + page: 页码 + limit: 每页数量 Returns: - 错误日志列表 + (日志列表, 总数) """ + # 1. 获取总数 + count_sql = """ + SELECT COUNT(*) as total + FROM t_error_logs + WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY) + """ + count_result = self.execute_query(count_sql, (days,), fetch_one=True) + total = count_result['total'] if count_result else 0 + + # 2. 获取分页数据 + offset = (page - 1) * limit sql = """ SELECT id, plugin_name, command, user_id, group_id, error_message, stack_trace, created_at FROM t_error_logs WHERE created_at >= DATE_SUB(CURDATE(), INTERVAL %s DAY) ORDER BY created_at DESC - LIMIT %s + LIMIT %s OFFSET %s """ - return self.execute_query(sql, (days, limit)) or [] + logs = self.execute_query(sql, (days, limit, offset)) or [] + + return logs, total def get_error_detail(self, error_id: int) -> Optional[Dict]: """获取错误详情 diff --git a/plugins/weather/main.py b/plugins/weather/main.py index 339ae01..d1f69ec 100644 --- a/plugins/weather/main.py +++ b/plugins/weather/main.py @@ -232,8 +232,6 @@ class WeatherPlugin(MessagePluginInterface): # ================= 定时任务系统 ================= - - async def _execute_daily_push(self): """执行全量推送 (基于 ID 聚合)""" self.LOG.info("🚀 执行每日推送...")