=', OrderEnum::ORDER_STATUS_NO_PAID], ]; $order_id = Order::where($condition)->column('id'); $goods_id = OrderGoods::whereIn('order_id', $order_id)->column('goods_id'); $where[] = ['id', 'in', $goods_id]; } if (!empty($params['keyword'])) { $where[] = ['name', 'like', '%' . $params['keyword'] . '%']; } $model = new Goods(); $field = ['id' => 'goods_id', 'image', 'name' => 'goods_name', 'min_price' => 'goods_price', 'shop_id']; $goods = $model->field($field)->where($where)->select(); $count = $model->where($where)->count(); foreach ($goods as &$item) { $item['shop_name'] = $item->shop->name; } $goods->hidden(['shop']); return [ 'list' => $goods->toArray(), 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size) ]; } /** * @notes 已购买店铺或全部营业店铺 * @param $user_id * @param $params * @param $page * @param $size * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/4/29 15:39 */ public static function getShopLists($user_id, $params, $page, $size) { $where = [ ['is_freeze', '=', ShopEnum::SHOP_FREEZE_NORMAL], // 未冻结 ['del', '=', 0], // 未删除 ['is_run', '=', ShopEnum::SHOP_RUN_OPEN], // 未暂停营业 ]; $type = !empty($params['type']) ? $params['type'] : 'all'; if ('buy' == $type) { $condition = [ ['order_status', '>=', OrderEnum::ORDER_STATUS_NO_PAID], ['user_id', '=', $user_id] ]; $shop_id = Order::where($condition)->column('shop_id'); $where[] = ['id', 'in', $shop_id]; } if (!empty($params['keyword'])) { $where[] = ['name', 'like', '%' . $params['keyword'] . '%']; } $whereRaw = 'expire_time =0 OR expire_time > '. time(); $field = ['id', 'name', 'logo']; $lists = Shop::field($field)->where($where)->whereRaw($whereRaw)->select()->toArray(); $count = Shop::where($where)->whereRaw($whereRaw)->count(); return [ 'list' => $lists, 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size) ]; } /** * @notes 获取指定数量话题 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/4/29 15:59 */ public static function getRecommendTopic() { return CommunityTopic::field(['id', 'name', 'cid', 'image']) ->where(['is_show' => 1, 'del' => 0]) ->order(['sort' => 'desc', 'id' => 'desc']) ->limit(3) ->select()->toArray(); } /** * @notes 获取话题列表 * @param $get * @return mixed * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/4/29 17:24 */ public static function getTopicLists($get) { $where[] = ['t.del', '=', 0]; $where[] = ['t.is_show', '=', 1]; if (!empty($get['name'])) { $where[] = ['t.name', 'like', '%' . $get['name'] . '%']; } $model = new CommunityCategory(); $lists = $model->alias('c') ->field(['c.id, c.name']) ->with(['topic' => function ($query) use ($where) { $query->alias('t')->field(['id', 'cid', 'name', 'image', 'click']) ->where($where) ->order(['sort' => 'desc', 'id' => 'desc']); }]) ->where($where) ->join('community_topic t', 't.cid = c.id') ->group('c.id') ->select() ->toArray(); if (empty($get['name'])) { $recommend_topic = (new CommunityTopic())->field(['id', 'cid', 'name', 'image', 'click']) ->where(['del' => 0, 'is_show' => 1, 'is_recommend' => 1]) ->select() ->toArray(); $recommend = ['id' => 0, 'name' => '推荐', 'topic' => $recommend_topic]; array_unshift($lists, $recommend); } return $lists; } /** * @notes 获取分类 * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/4/29 17:49 */ public static function getCate() { $lists = CommunityCategory::field(['id', 'name']) ->where(['is_show' => 1, 'del' => 0]) ->order(['sort' => 'asc', 'id' => 'desc']) ->select()->toArray(); return $lists; } /** * @notes 获取文章列表 * @param $get * @param $page * @param $size * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/4/29 18:09 */ public static function getArticleLists($get, $page, $size, $user_id = null) { $where[] = ['del', '=', 0]; $where[] = ['status', '=', CommunityArticleEnum::STATUS_SUCCESS]; if (!empty($get['cate_id'])) { $where[] = ['cate_id', '=', $get['cate_id']]; } if (!empty($get['topic_id'])) { $where[] = ['topic_id', '=', $get['topic_id']]; } if (!empty($get['keyword'])) { $where[] = ['content', 'like', '%' . trim($get['keyword']) . '%']; if (!is_null($user_id)) { // 记录关键词 CommunitySearchRecordLogic::recordKeyword(trim($get['keyword']), $user_id); } } $sort = []; if (!empty($get['sort_hot'])) { $sort = ['like' => $get['sort_hot'], 'id' => 'desc']; } if (!empty($get['sort_new'])) { $sort = ['id' => $get['sort_new'], 'like' => 'desc']; } if (empty($sort)) { $sort = ['like' => 'desc', 'id' => 'desc']; } $model = new CommunityArticle(); $count = $model->where($where)->count(); $lists = $model ->with(['user' => function ($query) { $query->field(['id', 'nickname', 'avatar']); }]) ->where($where) ->field(['id', 'user_id', 'cate_id', 'image', 'content', 'like', 'create_time']) ->page($page, $size) ->order($sort) ->select() ->bindAttr('user', ['nickname', 'avatar']) ->hidden(['user']) ->toArray(); // 点赞的文章 $likes_article = []; if (!is_null($user_id)) { // 点赞的文章 $likes_article = CommunityLike::where([ 'user_id' => $user_id, 'type' => CommunityLikeEnum::TYPE_ARTICLE ])->column('relation_id'); } foreach ($lists as &$item) { $item['avatar'] = !empty($item['avatar']) ? UrlServer::getFileUrl($item['avatar']) : ''; $item['is_like'] = in_array($item['id'], $likes_article) ? 1 : 0; } // 关注的人是否有新作品 $has_new = CommunityArticleLogic::hasNew($user_id); return [ 'has_new' => $has_new, 'list' => $lists, 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size) ]; } /** * @notes 发布文章 * @param int $user_id * @param array $post * @return bool * @author 段誉 * @date 2022/4/29 10:46 */ public static function addArticle(int $user_id, array $post): bool { Db::startTrans(); try { // 处理数据 $data = self::getEditArticleData($user_id, $post); // 新增文章信息 $article = CommunityArticle::create($data); // 新增文章关联图片 self::addArticleImage($post['image'], $article['id']); // 更新关联话题文章数量 if (!empty($post['topic_id'])) { CommunityTopic::where(['id' => $post['topic_id']])->inc('article_num')->update(); } // 通知粉丝有新作品 CommunityArticleLogic::noticeFans($user_id, $article['status']); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 编辑文章 * @param int $user_id * @param array $post * @return bool * @author 段誉 * @date 2022/5/7 9:42 */ public static function editArticle(int $user_id, array $post) { Db::startTrans(); try { // 更新文章数据 $data = self::getEditArticleData($user_id, $post); $article = CommunityArticle::findOrEmpty($post['id']); if ($article->isEmpty()) { throw new \Exception('信息缺失'); } $article->save($data); // 删除旧的关联图片 CommunityArticleImage::where(['article_id' => $post['id']])->delete(); self::addArticleImage($post['image'], $post['id']); Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 删除文章 * @param int $user_id * @param $post * @return bool * @author 段誉 * @date 2022/5/10 16:16 */ public static function delArticle(int $user_id, $post) { Db::startTrans(); try { // 删除文章 $article = CommunityArticle::where(['user_id' => $user_id, 'id' => $post['id']])->find(); $article->del = 1; $article->update_time = time(); $article->save(); if (!empty($article['topic_id'])) { // 更新话题文章数量 CommunityTopic::decArticleNum($article['topic_id']); } Db::commit(); return true; } catch (\Exception $e) { Db::rollback(); self::$error = $e->getMessage(); return false; } } /** * @notes 文章详情 * @param $user_id * @param $id * @return array * @author 段誉 * @date 2022/5/6 18:08 */ public static function detail($user_id, $id) { $result = CommunityArticle::with([ 'images', 'user' => function ($query) { $query->field(['id', 'nickname', 'avatar']); }, 'topic' => function ($query) { $query->field(['id', 'name']); }]) ->append(['status_desc', 'goods_data', 'shop_data']) ->findOrEmpty($id) ->toArray(); // 是否已关注 $is_follow = CommunityFollow::where([ 'user_id' => $user_id, 'follow_id' => $result['user_id'], 'status' => 1 ])->findOrEmpty(); // 是否已点赞 $is_like = CommunityLike::where([ 'user_id' => $user_id, 'relation_id' =>$id, 'type' => CommunityLikeEnum::TYPE_ARTICLE ])->findOrEmpty(); $comment_count = CommunityComment::where([ 'del' => 0, 'article_id' => $id, 'status' => CommunityCommentEnum::STATUS_SUCCESS ])->count(); $result['is_follow'] = !$is_follow->isEmpty() ? 1 : 0; $result['is_like'] = !$is_like->isEmpty() ? 1 : 0; // 关联商品数量 $result['total_goods'] = count($result['goods']); // 关联店铺数量 $result['total_shop'] = count($result['shop']); // 评论数量 $result['total_comment'] = $comment_count; // 当前用户是否为文章作者 $result['is_author'] = ($user_id == $result['user_id']) ? 1 : 0; $result['user']['avatar'] = !empty($result['user']['avatar']) ? UrlServer::getFileUrl($result['user']['avatar']) : ''; // 增加话题点击量 CommunityTopic::where(['id' => $result['topic_id']])->inc('click')->update(); // 审核状态描述 $result['audit_remark_desc'] = CommunityArticleEnum::getStatusRemarkDesc($result); return $result; } /** * @notes 获取编辑文章数据 * @param int $user_id * @param array $post * @return array * @throws \Exception * @author 段誉 * @date 2022/5/7 9:52 */ public static function getEditArticleData(int $user_id, array $post) { $data = [ 'user_id' => $user_id, 'content' => $post['content'], 'image' => !empty($post['image']) ? reset($post['image']) : '', 'goods' => !empty($post['goods']) ? array_unique(array_values($post['goods'])) : '', 'shop' => !empty($post['shop']) ? array_unique(array_values($post['shop'])) : '', 'topic_id' => 0 ]; if (!empty($post['topic_id'])) { $topic = CommunityTopic::where(['id' => $post['topic_id'], 'is_show' => 1])->findOrEmpty(); if ($topic->isEmpty()) { throw new \Exception('所选话题不存在'); } $data['cate_id'] = $topic['cid']; $data['topic_id'] = $post['topic_id']; } // 如果是无需审核的,状态直接为已审核 $config = ConfigServer::get('community', 'audit_article', 1); if ($config == 0) { $data['status'] = CommunityArticleEnum::STATUS_SUCCESS; $data['audit_time'] = time(); } else { $data['status'] = CommunityArticleEnum::STATUS_WAIT; } return $data; } /** * @notes 添加文章关联图片 * @param $image * @param $article_id * @throws \Exception * @author 段誉 * @date 2022/5/7 9:52 */ public static function addArticleImage($image, $article_id) { if (!empty($image)) { $images = []; foreach ($image as $item) { $images[] = [ 'article_id' => $article_id, 'image' => $item, ]; } (new CommunityArticleImage())->saveAll($images); } } /** * @notes 关注用户 * @param $user_id * @param $post * @return bool * @author 段誉 * @date 2022/5/5 15:44 */ public static function followRelation($user_id, $post) { try { if (!isset($post['follow_id']) || !isset($post['status'])) { throw new \Exception('参数缺失'); } if ($user_id == $post['follow_id']) { throw new \Exception('不可关注自己喔'); } // 要关注的用户是否存在 $follow = User::where(['del' => 0, 'id' => $post['follow_id']])->findOrEmpty(); if ($follow->isEmpty()) { throw new \Exception('该用户信息缺失'); } // 是否已有关注记录 $where = ['user_id' => $user_id, 'follow_id' => $post['follow_id']]; $relation = CommunityFollow::where($where)->findOrEmpty(); // 取消关注 if ($relation->isEmpty()) { CommunityFollow::create([ 'user_id' => $user_id, 'follow_id' => $post['follow_id'], 'status' => $post['status'] ]); } else { CommunityFollow::where(['id' => $relation['id']])->update([ 'status' => $post['status'] ]); } return true; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 点赞 * @param $user_id * @param $post * @return bool * @author 段誉 * @date 2022/5/9 15:39 */ public static function giveLike($user_id, $post) { try { if (!isset($post['status']) || !isset($post['id'])) { throw new \Exception('参数缺失'); } if (isset($post['type']) && !in_array($post['type'], CommunityLikeEnum::LIKE_TYPE)) { throw new \Exception('类型错误'); } $type = $post['type'] ?? CommunityLikeEnum::TYPE_ARTICLE; $where = [ 'user_id' => $user_id, 'relation_id' => $post['id'], 'type' => $type ]; // 点赞 if ($post['status']) { $record = CommunityLike::where($where)->findOrEmpty(); if (!$record->isEmpty()) { return true; } CommunityLike::create([ 'type' => $type, 'user_id' => $user_id, 'relation_id' => $post['id'], ]); if ($type == CommunityLikeEnum::TYPE_ARTICLE) { CommunityArticle::incLike($post['id']); } else { CommunityComment::incLike($post['id']); } return true; } // 取消点赞 $res = CommunityLike::where($where)->delete(); if ($res) { if ($type == CommunityLikeEnum::TYPE_ARTICLE) { CommunityArticle::decLike($post['id']); } else { CommunityComment::decLike($post['id']); } } return true; } catch (\Exception $e) { self::$error = $e->getMessage(); return false; } } /** * @notes 获取关注的文章列表 * @param $user_id * @param $page * @param $size * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/5/6 9:48 */ public static function getFollowArticle($user_id, $page, $size) { $follow_ids = CommunityFollow::where(['user_id' => $user_id])->column('follow_id'); $lists = CommunityArticle::with([ 'images', 'user' => function ($query) { $query->field(['id', 'nickname', 'avatar']); }, 'topic' => function ($query) { $query->field(['id', 'name']); }]) ->where(['status' => CommunityArticleEnum::STATUS_SUCCESS, 'del' => 0]) ->whereIn('user_id', $follow_ids) ->page($page, $size) ->order(['id' => 'desc', 'like' => 'desc']) ->append(['goods_data', 'shop_data']) ->select(); $count = CommunityArticle::where(['status' => CommunityArticleEnum::STATUS_SUCCESS, 'del' => 0]) ->whereIn('user_id', $follow_ids) ->count(); $likes = CommunityLike::where([ 'user_id' => $user_id, 'type' => CommunityLikeEnum::TYPE_ARTICLE ])->column('relation_id'); foreach ($lists as $item) { $item['user']['avatar'] = UrlServer::getFileUrl($item['user']['avatar']); $item['create_time'] = friend_date(strtotime($item['create_time'])); $item['total_goods'] = count($item['goods']); $item['total_shop'] = count($item['shop']); $item['total_comment'] = 0; $item['is_like'] = in_array($item['id'], $likes) ? 1 : 0; } // 清除未读缓存 CommunityArticleLogic::delUnRead($user_id); $result = [ 'list' => $lists->toArray(), 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size) ]; return $result; } /** * @notes 文章关联商品或店铺 * @param $get * @param string $type * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/5/10 17:05 */ public static function getRelationGoodsOrShop($get, $type) { if (empty($get['id'])) { return []; } $article = CommunityArticle::findOrEmpty($get['id']); if ($article->isEmpty() || $article['del'] == 1) { return []; } if ($type == 'goods') { $field = ['id', 'image', 'name', 'min_price' => 'goods_price', 'shop_id']; $lists = Goods::field($field) ->where('id', 'in', $article['goods']) ->select() ->toArray(); } else { $field = ['id', 'name', 'logo']; $lists = Shop::field($field) ->where('id', 'in', $article['shop']) ->select() ->toArray(); foreach ($lists as &$item) { $item['logo'] = UrlServer::getFileUrl($item['logo']); } } return $lists; } /** * @notes 获取作品列表 * @param $user_id * @param $get * @param $page * @param $size * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/5/6 10:46 */ public static function getWorksLists($user_id, $get, $page, $size) { $field = ['id', 'image', 'content', 'like', 'status', 'create_time', 'audit_remark']; // 文章查询条件 $where = [['user_id', '=', $user_id]]; if (!empty($get['user_id'])) { $where = [['user_id', '=', $get['user_id']]]; $where[] = ['status', '=', CommunityArticleEnum::STATUS_SUCCESS]; } $where[] = ['del', '=', 0]; $count = CommunityArticle::where($where)->count(); $lists = CommunityArticle::field($field) ->where($where) ->page($page, $size) ->order(['id' => 'desc', 'like' => 'desc']) ->append(['status_desc']) ->select(); $likes = CommunityLike::where([ 'user_id' => $user_id, 'type' => CommunityLikeEnum::TYPE_ARTICLE ])->column('relation_id'); foreach ($lists as $item) { $item['create_time'] = friend_date(strtotime($item['create_time'])); $item['is_like'] = in_array($item['id'], $likes) ? 1 : 0; $item['audit_remark_desc'] = CommunityArticleEnum::getStatusRemarkDesc($item, false); } $result = [ 'list' => $lists->toArray(), 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size) ]; return $result; } /** * @notes 获取点赞的列表 * @param $user_id * @param $get * @param $page * @param $size * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/5/6 14:21 */ public static function getLikeLists($user_id, $get, $page, $size) { $where = [['user_id', '=', $user_id]]; if (!empty($get['user_id'])) { $where = [['user_id', '=', $get['user_id']]]; } $article_ids = CommunityLike::where($where) ->where(['type' => CommunityLikeEnum::TYPE_ARTICLE]) ->column('relation_id'); $article_where[] = ['del', '=', 0]; $article_where[] = ['status', '=', CommunityArticleEnum::STATUS_SUCCESS]; $article_where[] = ['id', 'in', $article_ids]; $field = ['id', 'image', 'content', 'like', 'status', 'create_time', 'user_id']; $count = CommunityArticle::where($article_where)->count(); $lists = CommunityArticle::with(['user' => function($query) { $query->field(['id', 'nickname', 'avatar']); }])->field($field) ->where($article_where) ->page($page, $size) ->order(['id' => 'desc', 'like' => 'desc']) ->select() ->bindAttr('user', ['nickname', 'avatar']) ->hidden(['user']); foreach ($lists as $item) { $item['create_time'] = friend_date(strtotime($item['create_time'])); $item['is_like'] = 1; $item['avatar'] = !empty($item['avatar']) ? UrlServer::getFileUrl($item['avatar']) : ''; } $result = [ 'list' => $lists->toArray(), 'page' => $page, 'size' => $size, 'count' => $count, 'more' => is_more($count, $page, $size) ]; return $result; } /** * @notes 话题关联文章 * @param $get * @param $page * @param $size * @return array|false * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/5/6 16:22 */ public static function getTopicArticle($get, $page, $size) { $topic_id = $get['topic_id'] ?? 0; $topic = CommunityTopic::findOrEmpty($topic_id); if ($topic->isEmpty()) { self::$error = '话题信息不存在'; return false; } $result = [ 'click' => $topic['click'], 'lists' => self::getArticleLists($get, $page, $size), ]; return $result; } }