// +---------------------------------------------------------------------- declare (strict_types = 1); namespace addon\articles\controller\member; use addon\articles\library\HtmlSanitizer; use addon\articles\model\Article as ArticleModel; use addon\articles\model\ArticleCategory; use think\Validate; use ywxapp\controller\MemberBase; /** * 会员中心 · 我的投稿 * * 投稿统一写入 status=2(待审核),由后台审核通过后(status=1)才对前台可见。 * 会员只能查看/编辑/删除【自己】的文章。 */ class Article extends MemberBase { /** 投稿必须登录 */ protected $noNeedLogin = []; /** * 我的投稿列表 */ public function index() { $uid = $this->uid(); $list = ArticleModel::where('uid', $uid) ->field(ArticleModel::listFields()) ->order('id', 'desc') ->paginate(['list_rows' => 10, 'page' => (int) input('page', 1)]); return $this->fetch('article/index', ['list' => $list]); } /** * 写新稿件 */ public function add() { return $this->fetch('article/edit', [ 'article' => null, 'categories' => $this->categories(), ]); } /** * 编辑自己的稿件 */ public function edit($id = 0) { $article = ArticleModel::where('id', (int) $id)->where('uid', $this->uid())->find(); if (!$article) { $this->result->error('文章不存在或不属于你'); } return $this->fetch('article/edit', [ 'article' => $article, 'categories' => $this->categories(), ]); } /** * 保存投稿(新增或编辑,保存后一律置为待审核) */ public function save() { if (!$this->request->isPost()) { return redirect((string) url('articles/member/article/index')); } $uid = $this->uid(); $data = $this->request->post(); $id = (int) ($data['id'] ?? 0); $validate = new Validate([ 'title|标题' => 'require|max:255', 'content|内容' => 'require', 'cid|分类' => 'require|number', ]); if (!$validate->check($data)) { $this->result->error($validate->getError()); } // 正文必须净化(前台来源不可信) $data['content'] = HtmlSanitizer::clean((string) $data['content']); $data['status'] = 2; // 待审核 $data['uid'] = $uid; $data['author'] = $this->auth->info['nickname'] ?? ''; $data['is_top'] = 0; $data['is_recommend'] = 0; $data['update_at'] = time(); $allow = ['title', 'content', 'summary', 'cover_image', 'uid', 'author', 'cid', 'status', 'is_top', 'is_recommend', 'create_at', 'update_at']; if ($id) { $article = ArticleModel::where('id', $id)->where('uid', $uid)->find(); if (!$article) { $this->result->error('文章不存在或不属于你'); } $article->allowField($allow)->save($data); } else { $data['create_at'] = time(); ArticleModel::create($data, $allow); } $this->result->success(null, '投稿已提交,等待管理员审核'); } /** * 删除自己的稿件(软删) */ public function delete($id = 0) { $id = (int) ($id ?: input('id', 0)); $article = ArticleModel::where('id', $id)->where('uid', $this->uid())->find(); if (!$article) { $this->result->error('文章不存在或不属于你'); } $article->delete(); $this->result->success(null, '已删除'); } /** * 当前会员UID */ private function uid(): int { return (int) ($this->auth->info['uid'] ?? 0); } /** * 可选分类 */ private function categories() { return ArticleCategory::where('delete_at', 0)->where('status', 1)->select(); } }