diff --git a/app/data/controller/api/News.php b/app/data/controller/api/News.php index 9489ccc4a..d57f2f2de 100644 --- a/app/data/controller/api/News.php +++ b/app/data/controller/api/News.php @@ -55,8 +55,9 @@ class News extends Controller */ public function getLike() { - $data = $this->_vali(['cid.require' => '文章ID不能为空!']); - $query = $this->app->db->name('DataNewsXLike')->where($data); + $query = $this->app->db->name('DataNewsXCollect')->where($this->_vali([ + 'cid.require' => '文章ID不能为空!', 'type.value' => 2, + ])); $this->success('获取已点赞的会员', ['list' => $query->order('mid asc')->column('mid')]); } @@ -65,8 +66,9 @@ class News extends Controller */ public function getCollect() { - $data = $this->_vali(['cid.require' => '文章ID不能为空!']); - $query = $this->app->db->name('DataNewsXCollect')->where($data); + $query = $this->app->db->name('DataNewsXCollect')->where($this->_vali([ + 'cid.require' => '文章ID不能为空!', 'type.value' => 1, + ])); $this->success('获取已收藏的会员', ['list' => $query->order('mid asc')->column('mid')]); } diff --git a/app/data/controller/api/auth/News.php b/app/data/controller/api/auth/News.php index 37a41cf91..ca75ca063 100644 --- a/app/data/controller/api/auth/News.php +++ b/app/data/controller/api/auth/News.php @@ -31,6 +31,19 @@ class News extends Auth } } + /** + * 获取我的评论 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function getComment() + { + $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); + $query = $this->app->db->name('DataNewsXComment')->where($data)->order('id desc'); + $this->success('获取评论列表成功', ['list' => $query->select()->toArray()]); + } + /** * 删除内容评论 * @throws \think\db\exception\DbException @@ -49,31 +62,18 @@ class News extends Auth } } - /** - * 获取我的评论 - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getComment() - { - $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); - $query = $this->app->db->name('DataNewsXComment')->where($data)->order('id desc'); - $this->success('获取评论列表成功', ['list' => $query->select()->toArray()]); - } - /** * 添加内容收藏 * @throws \think\db\exception\DbException */ public function addCollect() { - $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); - if ($this->app->db->name('DataNewsXCollect')->where($data)->count() > 0) { + $map = $this->_getCollectWhere(1); + if ($this->app->db->name('DataNewsXCollect')->where($map)->count() > 0) { $this->success('您已收藏!'); } - if ($this->app->db->name('DataNewsXCollect')->insert($data) !== false) { - NewsService::instance()->syncNewsTotal($data['cid']); + if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) { + NewsService::instance()->syncNewsTotal($map['cid']); $this->success('收藏成功!'); } else { $this->error('收藏失败!'); @@ -86,7 +86,7 @@ class News extends Auth */ public function delCollect() { - $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '文章ID不能为空!']); + $data = $this->_getCollectWhere(1); if ($this->app->db->name('DataNewsXCollect')->where($data)->delete() !== false) { NewsService::instance()->syncNewsTotal($data['cid']); $this->success('取消收藏成功!'); @@ -96,12 +96,13 @@ class News extends Auth } /** - * 获取我收藏的资讯 + * 获取会员收藏的资讯 * @throws \think\db\exception\DbException */ - public function getMyCollect() + public function getCollect() { - $query = $this->_query('DataNewsXCollect')->where(['mid' => $this->mid]); + $query = $this->_query('DataNewsXCollect'); + $query->where(['mid' => $this->mid, 'type' => 1]); $result = $query->order('id desc')->page(true, false, false, 15); NewsService::instance()->buildListByCid($result['list']); $this->success('获取收藏记录成功!', $result); @@ -113,12 +114,12 @@ class News extends Auth */ public function addLike() { - $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); - if ($this->app->db->name('DataNewsXLike')->where($data)->count() > 0) { + $map = $this->_getCollectWhere(2); + if ($this->app->db->name('DataNewsXCollect')->where($map)->count() > 0) { $this->success('您已点赞!'); } - if ($this->app->db->name('DataNewsXLike')->insert($data) !== false) { - NewsService::instance()->syncNewsTotal($data['cid']); + if ($this->app->db->name('DataNewsXCollect')->insert($map) !== false) { + NewsService::instance()->syncNewsTotal($map['cid']); $this->success('点赞成功!'); } else { $this->error('点赞失败!'); @@ -131,9 +132,9 @@ class News extends Auth */ public function delLike() { - $data = $this->_vali(['mid.value' => $this->mid, 'cid.require' => '内容ID不能为空!']); - if ($this->app->db->name('DataNewsXLike')->where($data)->delete() !== false) { - NewsService::instance()->syncNewsTotal($data['cid']); + $map = $this->_getCollectWhere(2); + if ($this->app->db->name('DataNewsXCollect')->where($map)->delete() !== false) { + NewsService::instance()->syncNewsTotal($map['cid']); $this->success('取消点赞成功!'); } else { $this->error('取消点赞失败!'); @@ -141,18 +142,31 @@ class News extends Auth } /** - * 获取浏览历史 + * 获取会员的浏览历史 * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function getHistory() { - $query = $this->_query('DataNewsXHistory'); - $query->where(['mid' => $this->mid])->order('id desc'); - $result = $query->page(true, false, false, 15); + $query = $this->_query('DataNewsXHistory')->where(['mid' => $this->mid]); + $result = $query->order('id desc')->page(true, false, false, 15); NewsService::instance()->buildListByCid($result['list']); $this->success('获取浏览历史成功!', $result); } + /** + * 获取收藏点赞 + * @param integer $type 数据类型 + * @return array + */ + private function _getCollectWhere($type = 1): array + { + return $this->_vali([ + 'mid.value' => $this->mid, + 'type.value' => $type, + 'cid.require' => '文章ID不能为空!', + ]); + } + } \ No newline at end of file diff --git a/app/data/data.sql b/app/data/data.sql index 6dba4c3f4..634985cf9 100644 --- a/app/data/data.sql +++ b/app/data/data.sql @@ -137,16 +137,17 @@ CREATE TABLE `data_news_mark` ( -- Table structure for data_news_x_collect -- ---------------------------- DROP TABLE IF EXISTS `data_news_x_collect`; -CREATE TABLE `data_news_x_collect` ( - `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, - `cid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章编号', - `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员MID', - `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '评论内容', +CREATE TABLE `data_news_x_collect` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `cid` bigint(20) unsigned DEFAULT '0' COMMENT '文章编号', + `mid` bigint(20) unsigned DEFAULT '0' COMMENT '会员MID', + `type` tinyint(1) unsigned DEFAULT '1' COMMENT '记录类型(1收藏,2点赞)', `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_data_news_x_collect_cid`(`cid`) USING BTREE, - INDEX `idx_data_news_x_collect_mid`(`mid`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1 CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据-文章-会员-收藏' ROW_FORMAT=Compact; + KEY `idx_data_news_x_collect_cid` (`cid`) USING BTREE, + KEY `idx_data_news_x_collect_mid` (`mid`) USING BTREE, + KEY `idx_data_news_x_collect_type` (`type`) +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='数据-文章-会员-收藏'; -- ---------------------------- -- Table structure for data_news_x_comment @@ -177,18 +178,4 @@ CREATE TABLE `data_news_x_history` ( INDEX `idx_data_news_x_history_mid`(`mid`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=1 CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据-文章-会员-历史' ROW_FORMAT=Compact; --- ---------------------------- --- Table structure for data_news_x_like --- ---------------------------- -DROP TABLE IF EXISTS `data_news_x_like`; -CREATE TABLE `data_news_x_like` ( - `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT, - `cid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '文章编号', - `mid` bigint(20) UNSIGNED NULL DEFAULT 0 COMMENT '会员MID', - `create_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - PRIMARY KEY (`id`) USING BTREE, - INDEX `idx_data_news_x_like_cid`(`cid`) USING BTREE, - INDEX `idx_data_news_x_like_mid`(`mid`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1 CHARACTER SET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='数据-文章-会员-点赞' ROW_FORMAT=Compact; - SET FOREIGN_KEY_CHECKS=1; diff --git a/app/data/service/NewsService.php b/app/data/service/NewsService.php index 130340095..6b2028de9 100644 --- a/app/data/service/NewsService.php +++ b/app/data/service/NewsService.php @@ -13,21 +13,25 @@ class NewsService extends Service { /** * 同步文章数据统计 - * @param integer $cid 文章ID + * @param integer $cid 文章记录ID * @throws \think\db\exception\DbException */ - public function syncNewsTotal($cid) + public function syncNewsTotal(int $cid) { - $this->app->db->name('DataNewsItem')->where(['id' => $cid])->update([ - 'num_like' => $this->app->db->name('DataNewsXLike')->where(['cid' => $cid])->count(), - 'num_comment' => $this->app->db->name('DataNewsXComment')->where(['cid' => $cid])->count(), - 'num_collect' => $this->app->db->name('DataNewsXCollect')->where(['cid' => $cid])->count(), + [$map, $total] = [['cid' => $cid], []]; + $query = $this->app->db->name('DataNewsXCollect')->field('count(1) count,type'); + $query->where($map)->group('type')->select()->map(function ($item) use (&$total) { + $total[$item['type']] = $item['count']; + }); + $this->app->db->name('DataNewsItem')->where($map)->update([ + 'num_collect' => $total[2] ?? 0, 'num_like' => $total[1] ?? 0, + 'num_comment' => $this->app->db->name('DataNewsXComment')->where($map)->count(), ]); } /** * 根据CID绑定列表数据 - * @param array $list + * @param array $list 数据列表 * @return array */ public function buildListByCid(array &$list = []): array @@ -43,7 +47,7 @@ class NewsService extends Service /** * 根据MID绑定列表数据 - * @param array $list + * @param array $list 数据列表 * @return array */ public function buildListByMid(array &$list = []): array @@ -59,8 +63,8 @@ class NewsService extends Service /** * 获取列表状态 - * @param array $list - * @param integer $mid + * @param array $list 数据列表 + * @param integer $mid 会员MID * @return array */ public function buildListState(array &$list, int $mid = 0): array