From a3e31301d2b89e8883604f29b37c0a15e67d6866 Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Fri, 17 Jan 2025 12:38:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/v1/ArticleLeaveMessage.php | 84 ++++++++++++++++++- app/admin/route/v1.php | 3 + 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/app/admin/controller/v1/ArticleLeaveMessage.php b/app/admin/controller/v1/ArticleLeaveMessage.php index 8fd1e941..3205fe2b 100644 --- a/app/admin/controller/v1/ArticleLeaveMessage.php +++ b/app/admin/controller/v1/ArticleLeaveMessage.php @@ -4,6 +4,8 @@ declare (strict_types = 1); namespace app\admin\controller\v1; use app\admin\model\v1\ArticleLeaveMessageModel; +use PhpOffice\PhpSpreadsheet\IOFactory; +use PhpOffice\PhpSpreadsheet\Spreadsheet; class ArticleLeaveMessage { @@ -30,10 +32,10 @@ class ArticleLeaveMessage } }]) ->isAudited($param['is_audited']??null) - ->withSearch(['created_at'], [ - 'created_at' => $param['created_at']??'', + ->withSearch(['article_leave_message_model.created_at'], [ + 'article_leave_message_model.created_at' => $param['created_at']??'', ]) - ->order(['id' => 'desc']) + ->order(['article_leave_message_model.id' => 'desc']) ->hidden(['article_id', 'article']) ->paginate([ 'page' => $param['page'], @@ -80,4 +82,80 @@ class ArticleLeaveMessage return success('操作成功'); } + + // 导出 + public function export() + { + $schema = [ + 'id' => 'ID', + 'article_title' => '文章标题', + 'name' => '姓名', + 'email' => '邮箱', + 'content' => '评论内容', + 'ip' => 'IP', + 'is_audited' => '是否审核', + 'created_at' => '评论时间', + ]; + + // 获取导出数据 + $data = $this->getExportMessageData(); + + // 获取Spreadsheet对象 + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + + // 写入表头 + $title = array_values($schema); + $title_col = 'A'; + foreach ($title as $value) { + // 单元格内容写入 + $sheet->setCellValue($title_col . '1', $value); + $title_col++; + } + + // 写入数据 + $row = 2; + $keys = array_keys($schema); + foreach ($data as $item) { + $data_col = 'A'; + foreach ($keys as $key) { + $sheet->setCellValue($data_col . $row, $item[$key]); + $data_col++; + } + $row++; + } + + flush(); + ob_flush(); + $filename = date('YmdHms'); + header('Access-Control-Expose-Headers: Content-Disposition'); + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet; Charset=UTF-8'); + header('Content-Disposition: attachment;filename=' . $filename . '.xlsx'); + header('Cache-Control: max-age=0'); + $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); + $writer->save('php://output'); + } + private function getExportMessageData() + { + $param = request()->param(['title', 'is_audited', 'created_at']); + $data = ArticleLeaveMessageModel::field([ + '*', + 'CASE WHEN is_audited = 1 THEN "已审核" ELSE "未审核" END' => 'is_audited' + ]) + ->withJoin(['article' => function($query) use($param) { + if (!empty($param['title'])) { + $query->where('article.title', 'like', '%' . $param['title'] . '%'); + } + }]) + ->isAudited($param['is_audited']??null) + ->withSearch(['article_leave_message_model.created_at'], [ + 'article_leave_message_model.created_at' => $param['created_at']??'', + ]) + ->order(['article_leave_message_model.id' => 'desc']) + ->hidden(['article_id', 'article']) + ->select() + ->bindAttr('article', ['article_title' => 'title']); + + return $data->toArray(); + } } diff --git a/app/admin/route/v1.php b/app/admin/route/v1.php index 5255e4a4..339c02dd 100644 --- a/app/admin/route/v1.php +++ b/app/admin/route/v1.php @@ -83,6 +83,9 @@ Route::group('v1', function () { // 删除 Route::delete('delete/:id', 'ArticleLeaveMessage/delete'); + + // 导出 + Route::get('export', 'ArticleLeaveMessage/export'); }); }); })->prefix('v1.');