param([ 'title', 'category_id', 'created_at', 'page/d' => 1, 'limit/d' => 10, ]); $article = ArticleModel::withoutField([ 'language_id', 'author', 'source', 'desc', 'link', 'content', 'updated_at', 'deleted_at', 'seo_title', 'seo_keywords', 'seo_desc' ]) ->with('category') ->language(request()->lang_id) ->where(function($query) use($param) { if (isset($param['category_id'])) { $query->where('category_id', '=', $param['category_id']); } }) ->withSearch(['title', 'created_at'], (function() use($param) { $condition = []; if (isset($param['title'])) { $condition['title'] = $param['title']; } if (isset($param['created_at'])) { $condition = [ 'created_at' => explode(',', $param['created_at']) ]; } return $condition; })()) ->order('sort', 'desc') ->paginate([ 'page' => $param['page'], 'list_rows' => $param['limit'], ]) ->hidden([ 'category', 'category_id' ]) ->bindAttr('category', ['category_name' => 'name']); return success('获取成功', $article); } // 文章详情 public function read() { $article = ArticleModel::withoutField([ 'language_id', 'updated_at', 'deleted_at', ]) ->id(request()->param('id')) ->find(); if (is_null($article)) { return error('文章不存在'); } if (!$article->inc('view_count', 1)->save()) { return error('记录浏览量失败'); } return success('获取成功', $article); } // 添加文章 public function save() { $post = request()->post([ 'category_id', 'title', 'image', 'link', 'sort' => 0, 'desc', 'content', 'recommend', 'release_time', 'seo_title', 'seo_keywords', 'seo_desc', ]); $data = array_merge($post, ['language_id' => request()->lang_id]); $validate = new ArticleValidate; if (!$validate->check($data)) { return error($validate->getError()); } $article = new ArticleModel; if (!$article->save($data)) { return error('操作失败'); } return success('操作成功'); } // 更新文章 public function update() { $id = request()->param('id'); $put = request()->put([ 'category_id', 'title', 'image', 'link', 'sort', 'desc', 'content', 'recommend', 'release_time', 'seo_title', 'seo_keywords', 'seo_desc', ]); $data = array_merge($put, ['language_id' => request()->lang_id]); $validate = new ArticleValidate; if (!$validate->check(array_merge($data, ['id' => $id]))) { return error($validate->getError()); } $article = ArticleModel::id($id)->find(); if (is_null($article)) { return error('请确认操作对象是否存在'); } if (!$article->save($data)) { return error('操作失败'); } return success('操作成功'); } // 删除文章 public function delete() { $id = request()->param('id'); $article = ArticleModel::id($id)->find(); if (is_null($article)) { return error('请确认操作对象是否存在'); } if (!$article->useSoftDelete('deleted_at', date('Y-m-d H:m:s', time()))->delete()) { return error('操作失败'); } return success('操作成功'); } // 文章导出 public function export() { $schema = [ 'id' => 'ID', 'category_name' => '分类名称', 'title' => '标题', 'author' => '作者', 'source' => '来源', 'image' => '封面图片', 'link' => '外链', 'desc' => '描述', 'content' => '内容详情', 'recommend' => '是否推荐', 'sort' => '排序值', 'view_count' => '浏览量', 'praise_count' => '点赞数', 'seo_title' => 'seo标题', 'seo_keywords' => 'seo关键词', 'seo_desc' => 'seo描述', 'enabled' => '是否启用', 'release_time' => '发布时间', 'created_at' => '添加时间', 'updated_at' => '最后更新时间' ]; // 获取导出数据 $data = $this->getExportArticleData(); // 获取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 getExportArticleData() { $server = request()->server(); $image_host = $server['REQUEST_SCHEME'] . "://" . $server['SERVER_NAME'] . config('filesystem.disks.public.url') . '/'; $param = request()->param(['title', 'category_id', 'created_at']); $data = ArticleModel::field([ '*', 'CONCAT("' . $image_host . '", `image`)' => 'image', 'CASE WHEN recommend = 1 THEN "是" ELSE "否" END' => 'recommend', 'CASE WHEN enabled = 1 THEN "是" ELSE "否" END' => 'enabled', ]) ->with('category', function($query) { return $query->field(['id', 'name']); }) ->language(request()->lang_id) ->categoryNullable($param['category_id']??null) ->withSearch(['title', 'created_at'], [ 'title' => $param['title']??'', 'created_at' => !empty($param['created_at'])?explode(',', $param['created_at']):'' ]) ->order('sort', 'desc') ->select() ->hidden([ 'language_id', 'category_id', 'category', ]) ->bindAttr('category', ['category_name' => 'name']); return $data->toArray(); } }