From aebdb3c799712c2f4e19a10f80ac2d09f3966c75 Mon Sep 17 00:00:00 2001 From: jsasg <735273025@qq.com> Date: Thu, 20 Feb 2025 15:46:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=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 --- app/admin/controller/v1/Video.php | 101 ++++++++++++++++++++++++++++++ app/admin/model/v1/VideoModel.php | 1 + app/admin/route/v1.php | 3 + 3 files changed, 105 insertions(+) diff --git a/app/admin/controller/v1/Video.php b/app/admin/controller/v1/Video.php index 139cf151..a194426e 100644 --- a/app/admin/controller/v1/Video.php +++ b/app/admin/controller/v1/Video.php @@ -6,6 +6,9 @@ namespace app\admin\controller\v1; use app\admin\model\v1\VideoModel; use app\admin\validate\v1\VideoValidate; +use PhpOffice\PhpSpreadsheet\IOFactory; +use PhpOffice\PhpSpreadsheet\Spreadsheet; +use think\facade\Config; /** * 视频管理控制器 @@ -20,6 +23,7 @@ class Video $params = request()->param([ 'name', 'category_id', + 'created_at', 'page/d' => 1, 'size/d' => 10 ]); @@ -167,6 +171,103 @@ class Video return success('操作成功'); } + /** + * 导出接口 + */ + public function export() + { + $schema = [ + 'category_name' => '分类', + 'name' => '视频名称', + 'desc' => '描述', + 'image' => '封面图片', + 'video' => '视频URL', + 'link' => '外链', + 'sort' => '排序', + 'recommend' => '是否推荐', + 'status' => '状态', + 'seo_title' => 'seo标题', + 'seo_keywords' => 'seo关键词', + 'seo_desc' => 'seo描述', + 'created_at' => '创建时间' + ]; + + // 获取导出数据 + $data = $this->getExportVideoData(); + + // 获取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 getExportVideoData() + { + $params = request()->param([ + 'name', + 'category_id', + 'created_at' + ]); + + $domain = request()->domain(); + $image_path = Config::get('filesystem.disks.image.url'); + $video_path = Config::get('filesystem.disks.video.url'); + + return VideoModel::withoutField([ + 'language_id', + 'updated_at', + 'deleted_at' + ]) + ->with(['category' => function ($query) { + $query->field(['id', 'name']); + }]) + ->withSearch(['name', 'createtd_at'], [ + 'name' => $params['name']??null, + 'created_at' => !empty($params['created_at']) ? explode(',', $params['created_at']) : null, + ]) + ->categoryId($params['category_id']??null) + ->order(['sort' => 'asc', 'id' => 'desc']) + ->select() + ->bindAttr('category', ['category_name' => 'name']) + ->hidden(['category_id', 'category']) + ->each(function ($item) use($domain, $image_path, $video_path) { + $item->image = $domain . $image_path . '/' . $item->image; + $item->video = $domain . $video_path . '/' . $item->video; + $item->recommend = $item->recommend == 1 ? '是' : '否'; + $item->status = $item->status == 1 ? '启用' : '禁用'; + return $item; + }); + } + /** * 视频信息删除 */ diff --git a/app/admin/model/v1/VideoModel.php b/app/admin/model/v1/VideoModel.php index 027da4a2..ce32ae73 100644 --- a/app/admin/model/v1/VideoModel.php +++ b/app/admin/model/v1/VideoModel.php @@ -4,6 +4,7 @@ declare (strict_types = 1); namespace app\admin\model\v1; use app\common\model\VideoBaseModel; +use think\model\concern\SoftDelete; /** * 视频信息模型 diff --git a/app/admin/route/v1.php b/app/admin/route/v1.php index 95ed2590..54965e31 100644 --- a/app/admin/route/v1.php +++ b/app/admin/route/v1.php @@ -61,6 +61,9 @@ Route::group('v1', function () { // 视频信息设置排序值 Route::post('sort/:id', 'Video/sort'); + // 视频信息导出 + Route::get('export', 'Video/export'); + // 视频信息删除 Route::delete('delete/:id', 'Video/delete'); });