isAjax()) { if (input('selectFields')) { return $this->selectList(); } [$page, $limit, $where, $excludeFields] = $this->buildTableParams(['month']); $month = !empty($excludeFields['month']) ? date('Ym', strtotime($excludeFields['month'])) : date('Ym'); $model = (new self::$model)->setSuffix("_$month")->with('admin')->where($where); try { $count = $model->count(); $list = $model->page($page, $limit)->order($this->sort)->select(); }catch (PDOException|DbException $exception) { $count = 0; $list = []; } $data = [ 'code' => 0, 'msg' => '', 'count' => $count, 'data' => $list, ]; return json($data); } return $this->fetch(); } #[NodeAnnotation(title: '导出', auth: true)] public function export() { if (env('EASYADMIN.IS_DEMO', false)) { $this->error('演示环境下不允许操作'); } [$page, $limit, $where, $excludeFields] = $this->buildTableParams(['month']); $month = !empty($excludeFields['month']) ? date('Ym', strtotime($excludeFields['month'])) : date('Ym'); $tableName = (new self::$model)->setSuffix("_$month")->getName(); $tableName = CommonTool::humpToLine(lcfirst($tableName)); $prefix = config('database.connections.mysql.prefix'); $dbList = Db::query("show full columns from {$prefix}{$tableName}"); $header = []; foreach ($dbList as $vo) { $comment = !empty($vo['Comment']) ? $vo['Comment'] : $vo['Field']; if (!in_array($vo['Field'], $this->noExportFields)) { $header[] = [$comment, $vo['Field']]; } } $model = (new self::$model)->setSuffix("_$month")->with('admin')->where($where); try { $list = $model ->limit(10000) ->order('id', 'desc') ->select() ->toArray(); foreach ($list as &$vo) { $vo['content'] = json_encode($vo['content'], JSON_UNESCAPED_UNICODE); $vo['response'] = json_encode($vo['response'], JSON_UNESCAPED_UNICODE); } exportExcel($header, $list, '操作日志'); }catch (\Throwable $exception) { $this->error($exception->getMessage()); } } #[NodeAnnotation(title: '删除指定日志', auth: true)] public function deleteMonthLog(Request $request) { if (!$request->isAjax()) { return $this->fetch(); } if ($this->isDemo) $this->error('演示环境下不允许操作'); $monthsAgo = $request->param('month/d', 0); if ($monthsAgo < 1) $this->error('月份错误'); $currentDate = new \DateTime(); $currentDate->modify("-$monthsAgo months"); $dbPrefix = env('DB_PREFIX'); $dbLike = "{$dbPrefix}system_log_"; $tables = Db::query("SHOW TABLES LIKE '$dbLike%'"); $threshold = date('Ym', strtotime("-$monthsAgo month")); $tableNames = []; try { foreach ($tables as $table) { $tableName = current($table); if (!preg_match("/^$dbLike\d{6}$/", $tableName)) continue; $datePart = substr($tableName, -6); $issetTable = Db::query("SHOW TABLES LIKE '$tableName'"); if (!$issetTable) continue; if ($datePart - $threshold <= 0) { Db::execute("DROP TABLE `$tableName`"); $tableNames[] = $tableName; } } }catch (PDOException) { } if (empty($tableNames)) $this->error('没有需要删除的表'); $this->success('操作成功 - 共删除 ' . count($tableNames) . ' 张表
' . implode('
', $tableNames)); } #[MiddlewareAnnotation(ignore: MiddlewareAnnotation::IGNORE_LOG)] #[NodeAnnotation(title: '框架日志', auth: true, ignore: NodeAnnotation::IGNORE_NODE)] public function record(): Json|string { return (new \Wolfcode\PhpLogviewer\thinkphp\LogViewer())->fetch(); } }