💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
收藏表结构 | 字段 | 含义 | | --- | --- | | id | 主键 | | user_id | 用户id | | title| 收藏内容的标题 | | url | 收藏内容的原文地址,不带域名 | | description | 收藏内容的描述 | | table_name | 收藏实体以前所在表不带前缀 | | object_id | 收藏内容里原来的主键id | | create_time | 收藏时间 | 加入数据后如图所示: ![](https://box.kancloud.cn/252413563974d66266ec1d79e707f74d_1119x79.png) 前端代码: ~~~ <a href="{:url('user/favorite/add')}" class="js-favorite-btn" data-title="{:base64_encode($article.post_title)}" data-url="{:cmf_url_encode('portal/Article/index',array('id'=>$article['id']))}" data-table="portal_post" data-id="{$article['id']}" > <i class="fa fa-star-o"></i> </a> ~~~ 推送到后台其实是由js完成的 js代码如下 public\static\js\frontend.js ~~~ var $js_favorite_btn = $('a.js-favorite-btn'); if ($js_favorite_btn.length) { Wind.use('noty', function () { $js_favorite_btn.on('click', function (e) { e.preventDefault(); var $this = $(this), href = $this.prop('href'), url = $this.data("url"), id = $this.data("id"), table = $this.data('table'), title = $this.data("title"), description = $this.data("description"); $.post(href, { id: id, table: table, url: url, title: title, description: description }, function (data) { if (data.code == 1) { if (data.msg) { noty({ text: data.msg, type: 'success', layout: 'center', callback: { afterClose: function () { if (data.url) { location.href = data.url; } } } }); } } else if (data.code == 0) { noty({ text: data.msg, type: 'error', layout: 'center', callback: { afterClose: function () { if (data.url) { location.href = data.url; } } } }); } }, "json"); }); }); } ~~~ 逻辑很清晰,阻止按钮默认动作,ajax传输数据,成功后重载页面 * * * * * 后台逻辑主要集中在 \app\user\controller\FavoriteController.php \app\user\model\UserFavoriteModel.php 这两个文件 * * * * * 分析 一个用户可以收藏多篇文章 一篇文章可以被多个用户收藏 我们的数据表中因为多了诸如 description title url这样的字段,对于某一用户的收藏文章,就可以用 ~~~ $userQuery = Db::name("UserFavorite"); $favorites = $userQuery->where(['user_id' => $userId])->order('id desc')->paginate(10); ~~~ 来查询并列出表格,这样节省了再次查询文章表所需要的sql