后台发表文章自动保存草稿的设计思路

发表和编辑文章的界面大概如此:
2016-12-27-22-20-37%e5%b1%8f%e5%b9%95%e6%88%aa%e5%9b%be
添加标签和分类的选择使用 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() {

    }
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注