发表和编辑文章的界面大概如此:
添加标签和分类的选择使用 ajax来完成,标题和内容间隔一段时间ajax自动保存。
数据库里面有标签表,和文章表由专门一张表建立多对多的关系,这样就导致当要保存标签的时候,需要文章id。所以应该先插入文章表,然后取得返回的id,放入 session中。(当然也有其他方法,比如保存如暂存的表中,最后集中处理) 然后在根据添加的标签,检索或者插入tag表取得tagid,然后建立关联。
具体流程如下:
如果是新建文章,那么当要添加 tag的时候,会首先插入文章表,取得文章id,放入session。如果是编辑草稿,那么载入页面的时候就把文章id放入session。使用 thinkphp5的前置操作很方便实现。
源码实现:
namespace app\admin\controller; use think\Session; use think\Db; use app\admin\controller\CommonAjax; use app\admin\model\Article; use app\admin\model\Tag; class ArticleAjaxController extends CommonAjax { protected $article; protected $tag; //Rest控制器似乎不支持前置操作也不支持 _initialize函数 //public function _initialize() { // parent::_initialize(); // TODO: Change the autogenerated stub // $this->article = new Article(); //} /** * 查询草稿id */ protected function checkSession() { parent::_initialize(); $this->article = new Article(); $this->tag = new Tag(); if (!Session::has('draft_id')) { $id = $this->addDraft(); Session::set('draft_id',$id); } } /** * 添加草稿 */ protected function addDraft() { $this->article->data([ 'title' => 'draft_title', 'content' => 'draft_content', ]); $this->article->save(); return $this->article->id; } public function saveDraft() { } public function addTag() { $this->checkSession(); if (request()->isPost()) { //取得文章id $article_id = Session::get('draft_id'); //取得标签id 插入或者查询 $tag_name = input('name'); $res = $this->tag->where('name',$tag_name)->find(); if (!$res) { $this->tag->data(['name'=>$tag_name]); $this->tag->save(); $tag_id = $this->tag->id; } else { $tag_id = $res['id']; } //插入表 article_tag $data = [ 'article_id' => $article_id, 'tag_id' => $tag_id ]; if (!Db::name('article_tag')->where(['article_id'=>$article_id,'tag_id'=>$tag_id])->find()) { Db::name('article_tag')->insert($data); } $data = ['code'=>'1','tag_id'=>$tag_id,'tag_name'=>$tag_name]; return json($data, 200); } } public function delTag() { } }