ソースを参照

Merge branch 'circle' into develop

xielin 5 年 前
コミット
febb4510f1

+ 142 - 13
app/Http/Controllers/Circle/CircleController.php

@@ -10,11 +10,16 @@
 namespace App\Http\Controllers\Circle;
 
 use App\Repositories\Circle\CircleArticleRepository;
+use App\Repositories\Circle\CircleMemberRepository;
+use App\Repositories\Circle\CircleMessageRepository;
 use App\Repositories\Circle\CircleRepository;
 use App\Transformers\Circle\ArticleListTransformer;
+use App\Transformers\Circle\CircleMemberTransformer;
 use App\Transformers\Circle\DetailTransformer;
 use App\Transformers\Circle\InterestCirclePictureTransformer;
 use App\Transformers\Circle\InterestCircleTransformer;
+use App\Transformers\Circle\MessageListTransformer;
+use App\Transformers\Circle\PostListTransformer;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Validator;
@@ -27,10 +32,16 @@ use League\Fractal\Resource\Item;
 
 class CircleController extends Controller
 {
-    public function __construct(CircleRepository $circleRepository, CircleArticleRepository $circleArticleRepository)
+    public function __construct(CircleRepository $circleRepository,
+                                CircleArticleRepository $circleArticleRepository,
+                                CircleMemberRepository $circleMemberRepository,
+                                CircleMessageRepository $circleMessageRepository
+    )
     {
         $this->circleRepository = $circleRepository;
         $this->circleArticleRepository = $circleArticleRepository;
+        $this->circleMemberRepository = $circleMemberRepository;
+        $this->circleMessageRepository = $circleMessageRepository;
     }
 
     /**
@@ -151,6 +162,12 @@ class CircleController extends Controller
      */
     public function pictureList(Request $request)
     {
+        $validator = Validator::make($request->all(), [
+            'circle_id' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
         $pictureList = $this->circleRepository->pictureLists($request->all());
         $fractal = new Manager();
         $resource = new Collection($pictureList, new InterestCirclePictureTransformer());
@@ -178,6 +195,12 @@ class CircleController extends Controller
      */
     public function articleList(Request $request)
     {
+        $validator = Validator::make($request->all(), [
+            'circle_id' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
         $articleList = $this->circleArticleRepository->lists($request->all());
         $fractal = new Manager();
         $resource = new Collection($articleList, new ArticleListTransformer());
@@ -204,6 +227,46 @@ class CircleController extends Controller
         return $data;
     }
 
+    /**
+     * 可选帖子列表
+     */
+    public function postList(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'circle_id' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        $productList = $this->circleArticleRepository->postList($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($productList, new PostListTransformer($request['circle_id']));
+        $resource->setPaginator(new IlluminatePaginatorAdapter($productList));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'keyword',
+                'content',
+                'topic_ids',
+                'category_ids',
+                'is_suggest',
+                'created_at',
+                'type',
+                'sort'
+            ],
+            'columns' => [
+                'id',
+                'created_at',
+                'uid',
+                'topic',
+                'content',
+                'image',
+                'is_exists_circle',
+            ]
+        ];
+        return $data;
+    }
+
     /**
      * 精品文章 推荐
      */
@@ -219,6 +282,21 @@ class CircleController extends Controller
         return $this->circleArticleRepository->articleRecommend($request->all());
     }
 
+    /**
+     * 精品文章 加入
+     */
+    public function articleInsert(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'post_id' => 'required|integer',
+            'circle_id' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return $this->circleArticleRepository->articleInsert($request->all());
+    }
+
     /**
      * 移出精品文章
      */
@@ -235,33 +313,84 @@ class CircleController extends Controller
     }
 
 
-
-
+    /**
+     * 圈子用户列表
+     */
+    public function memberList(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'circle_id' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        $memberList = $this->circleMemberRepository->lists($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($memberList, new CircleMemberTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($memberList));
+        $data = $fractal->createData($resource)->toArray();
+        $data['extra'] = [
+            'filters' => [
+                'uid',
+                'user_type'
+            ],
+            'columns' => [
+                'id',
+                'created_at',
+                'uid',
+                'topic',
+                'content',
+                'image',
+                'is_exists_circle',
+            ]
+        ];
+        return $data;
+    }
+    /**
+     * 设置圈子黑名单
+     */
+    public function setCircleBlack(Request $request)
+    {
+        $validator = Validator::make($request->all(), [
+            'uid' => 'required|integer',
+            'circle_id' => 'required|integer'
+        ]);
+        if ($validator->fails()) {
+            return $this->response->error($validator->errors()->first(), 500);
+        }
+        return $this->circleMemberRepository->setUserBlack($request->all());
+    }
 
     /**
-     * 评论列表
+     * 圈子留言列表
      */
-    public function commentList(Request $request)
+    public function messageList(Request $request)
     {
-        $commentList = $this->postRepository->commentList($request->all());
+        $commentList = $this->circleMessageRepository->lists($request->all());
         $fractal = new Manager();
-        $resource = new Collection($commentList, new CommentTransformer());
+        $resource = new Collection($commentList, new MessageListTransformer());
         $resource->setPaginator(new IlluminatePaginatorAdapter($commentList));
         $data = $fractal->createData($resource)->toArray();
 
         $data['extra'] = [
             'filters' => [
-
+                'uid',
+                'content',
+                'created_at',
             ],
             'columns' => [
                 'id',
-                'post_id',
-                'parent_id',
+                'created_at',
                 'uid',
+                'username',
+                'avatar',
+                'circle_id',
+                'circle_name',
                 'content',
-                'like_count',
-                'created_at',
-                'is_delete',
+                'good',
+                'bad',
+                'comment_count',
+                'is_recommend',
             ]
         ];
         return $data;

+ 119 - 1
app/Repositories/Circle/CircleArticleRepository.php

@@ -9,6 +9,7 @@
 
 namespace App\Repositories\Circle;
 
+use App\Models\InterestCircle;
 use App\Models\InterestCircleArticle;
 use App\Models\Post;
 use Illuminate\Database\QueryException;
@@ -21,10 +22,11 @@ use Illuminate\Support\Facades\Redis;
 class CircleArticleRepository
 {
 
-    public function __construct(InterestCircleArticle $interestCircleArticle, Post $post)
+    public function __construct(InterestCircleArticle $interestCircleArticle, Post $post,InterestCircle $interestCircle)
     {
         $this->interestCircleArticle = $interestCircleArticle;
         $this->post = $post;
+        $this->interestCircle = $interestCircle;
     }
 
     /**
@@ -39,6 +41,10 @@ class CircleArticleRepository
             $where[] = ['uid', $request['uid']];
         }
 
+        if (isset($request['circle_id'])) {
+            $where[] = ['interest_circle_articles.circle_id', $request['circle_id']];
+        }
+
         $articleModel = $this->post;
 
         return $articleModel
@@ -122,11 +128,14 @@ class CircleArticleRepository
         DB::beginTransaction();
         try {
             $article->delete();
+            $this->interestCircle->decrement('article_count');
             $isRef = $this->interestCircleArticle->where('post_id', $request['post_id'])->exists();
             if (!$isRef) {
                 //todo 移出后需要检测该帖子在其他圈子有没有设为精品,如没有,则删除该帖子的精品标识
                 //$this->post->where('id',$request['post_id'])->update();
             }
+            $key = 'circle_articles_'.$request['circle_id'];
+            Redis::zrem($key,$request['post_id']);
             DB::commit();
             return Response::create();
 
@@ -140,4 +149,113 @@ class CircleArticleRepository
             ]);
         }
     }
+    /**
+     * 新增精品文章
+     */
+    public function articleInsert($request)
+    {
+        $article = $this->interestCircleArticle
+            ->where('post_id', $request['post_id'])
+            ->where('circle_id', $request['circle_id'])
+            ->first();
+        if ($article) {
+            return Response::create([
+                'message' => '该文章已存在当前圈子',
+                'status_code' => 500
+            ]);
+        }
+
+        DB::beginTransaction();
+        try {
+            $this->interestCircleArticle->insert(['post_id'=>$request['post_id'],'circle_id'=>$request['circle_id']]);
+            $this->interestCircle->increment('article_count');
+            //将精品文章存入该圈子的有序集合中
+            $key = 'circle_articles_'.$request['circle_id'];
+            Redis::zadd($key,time(),$request['post_id']);
+            DB::commit();
+            return Response::create();
+
+        } catch (QueryException $exception) {
+            DB::rollBack();
+            Log::debug('设置精品文章:' . $request['post_id'] . '-' . $request['circle_id'] . $exception->getMessage());
+            return Response::create([
+                'message' => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code' => 500
+            ]);
+        }
+    }
+
+    /**
+     * 当前圈子精品文章帖子来源列表
+     * @param $request
+     * @return mixed
+     */
+    public function postList($request){
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if (isset($request['type'])) {
+            $where[] = ['type', $request['type']];
+        }
+
+        if (isset($request['uid'])) {
+            $where[] = ['uid', $request['uid']];
+        }
+
+        if (isset($request['circle_id'])) {
+            $circleInfo = $this->interestCircle->where('id',$request['circle_id'])->first();
+            if($circleInfo && $circleInfo->limit_article_ids){
+                $request['topic_ids'] = "{$circleInfo->limit_article_ids}";
+            }
+        }
+
+        $sort = 'post.id';
+        if (isset($request['sort']) && in_array($request['sort'], ['praise_count', 'share_count', 'pv', 'comment_count', 'create_bean'])) {
+            $sort = $request['sort'];
+        }
+        $post = $this->post;
+
+        return $post
+            ->where($where)
+            ->where(function ($query) use ($request) {
+                if (isset($request['keyword'])) {
+                    $query->where('uid', '=', $request['keyword'])
+                        ->orWhere('username', 'like', "%{$request['keyword']}%")
+                        ->orWhere('mobile', 'like', "%{$request['keyword']}%");
+                }
+            })
+            ->where(function ($query) use ($request) {
+                if (isset($request['content'])) {
+                    $query->where('title', 'like', "%{$request['content']}%")
+                        ->orWhere('content', 'like', "%{$request['content']}%");
+                }
+            })
+            ->where(function ($query) use ($request) {
+                if (isset($request['created_at'])) {
+                    $time = explode('_', $request['created_at']);
+                    $query->whereBetween('post.created_at', $time);
+                }
+            })
+            ->where(function ($query) use ($request) {
+                if (isset($request['category_ids']) || isset($request['topic_ids'])) {
+                    $ids = [];
+                    if (isset($request['category_ids'])) {
+                        $categoryIds = explode(',', $request['category_ids']);
+                        $ids = $this->categoryTopic->whereIn('category_id', $categoryIds)->pluck('topic_id')->toArray();
+                    }
+                    if (isset($request['topic_ids'])) {
+                        $ids = array_merge($ids, explode(',', $request['topic_ids']));
+                    }
+                    foreach ($ids as $key => $id) {
+                        if ($key == 0) {
+                            $query = $query->whereRaw('FIND_IN_SET(' . $id . ',topic_ids)');
+                        } else {
+                            $query = $query->orWhereRaw('FIND_IN_SET(' . $id . ',topic_ids)');
+                        }
+                    }
+                }
+            })
+            ->orderBy($sort, 'desc')
+            ->paginate($perPage);
+    }
 }

+ 98 - 0
app/Repositories/Circle/CircleMemberRepository.php

@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/5
+ * Time: 16:03
+ */
+
+namespace App\Repositories\Circle;
+
+use App\Models\InterestCircle;
+use App\Models\InterestCircleArticle;
+use App\Models\InterestCircleUser;
+use App\Models\Post;
+use Illuminate\Database\QueryException;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+
+class CircleMemberRepository
+{
+
+    public function __construct(InterestCircle $interestCircle,InterestCircleUser $interestCircleUser)
+    {
+        $this->interestCircleUser = $interestCircleUser;
+        $this->interestCircle = $interestCircle;
+    }
+
+    /**
+     * 用户列表
+     */
+    public function lists($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+
+        if (isset($request['uid'])) {
+            $where[] = ['uid', $request['uid']];
+        }
+        if (isset($request['user_type'])) {
+            $where[] = ['is_black', $request['user_type']];
+        }
+
+        if (isset($request['circle_id'])) {
+            $where[] = ['circle_id', $request['circle_id']];
+        }
+
+        $userModel = $this->interestCircleUser;
+
+        return $userModel
+            ->where($where)
+            ->orderBy('created_at', 'desc')
+            ->paginate($perPage);
+    }
+
+    /**
+     * 设置该用户为当前圈子黑名单
+     */
+    public function setUserBlack($request)
+    {
+        $article = $this->interestCircleUser
+            ->where('uid', $request['uid'])
+            ->where('circle_id', $request['circle_id'])
+            ->first();
+        if (!$article) {
+            return Response::create([
+                'message' => '当前用户不在该圈子',
+                'status_code' => 500
+            ]);
+        }
+
+        if ($article->is_black == 1) {
+            $article->is_black = 0;
+        } else {
+            $article->is_black = 1;
+        }
+
+        DB::beginTransaction();
+        try {
+            $article->save();
+
+            DB::commit();
+            return Response::create();
+
+        } catch (QueryException $exception) {
+            DB::rollBack();
+            Log::debug('设置圈子黑名单:' . $request['uid'] . '-' . $request['circle_id'] . $exception->getMessage());
+            return Response::create([
+                'message' => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code' => 500
+            ]);
+        }
+    }
+}

+ 139 - 0
app/Repositories/Circle/CircleMessageRepository.php

@@ -0,0 +1,139 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/5
+ * Time: 16:03
+ */
+
+namespace App\Repositories\Circle;
+
+use App\Models\InterestCircle;
+use App\Models\InterestCircleMessage;
+use Illuminate\Database\QueryException;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+
+class CircleMessageRepository
+{
+
+    public function __construct(InterestCircle $interestCircle, InterestCircleMessage $interestCircleMessage)
+    {
+        $this->interestCircle = $interestCircle;
+        $this->interestCircleMessage = $interestCircleMessage;
+    }
+
+    /**
+     * 圈子留言列表
+     */
+    public function lists($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        if (isset($request['circle_id'])) {
+            $where[] = ['circle_id', $request['circle_id']];
+        }
+        if (isset($request['uid'])) {
+            $where[] = ['uid', $request['uid']];
+        }
+
+        return $this->interestCircleMessage
+            ->where($where)
+            ->where(function ($query) use ($request) {
+                if (isset($request['content'])) {
+                    $query->Where('content', 'like', "%{$request['content']}%");
+                }
+            })
+            ->where(function ($query) use ($request) {
+                if (isset($request['created_at'])) {
+                    $time = explode('_', $request['created_at']);
+                    $query->whereBetween('post.created_at', $time);
+                }
+            })
+            ->orderBy('is_recommend', 'desc')
+            ->orderBy('created_at', 'desc')
+            ->paginate($perPage);
+    }
+
+    /**
+     * 留言详情
+     */
+    public function detail($request, $isTrashed = false)
+    {
+        $model = $this->interestCircleMessage;
+        if ($isTrashed) {
+            $model->withTrashed();
+        }
+        return $model->find($request['id']);
+    }
+
+    /**
+     * 推荐留言
+     */
+    public function messageRecommend($request)
+    {
+        $circle = $this->interestCircleMessage->where('id', $request['id'])->first();
+        if (!$circle) {
+            return Response::create([
+                'message' => '获取留言信息失败',
+                'status_code' => 500
+            ]);
+        }
+
+        if ($circle->is_recommend == 1) {
+            $circle->is_recommend = 0;
+        } else {
+            $circle->is_recommend = 1;
+        }
+
+        DB::beginTransaction();
+        try {
+            $circle->save();
+
+            DB::commit();
+            return Response::create();
+
+        } catch (QueryException $exception) {
+            DB::rollBack();
+            Log::debug('推荐留言:' . $request['id'] . $exception->getMessage());
+            return Response::create([
+                'message' => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code' => 500
+            ]);
+        }
+    }
+
+    /**
+     * 删除留言
+     */
+    public function delete($request)
+    {
+        $circle = $this->interestCircleMessage->where('id', $request['id'])->first();
+        if (!$circle) {
+            return Response::create([
+                'message' => '获取留言信息失败',
+                'status_code' => 500
+            ]);
+        }
+        DB::beginTransaction();
+        try {
+            $circle->delete();
+            DB::commit();
+            return Response::create();
+
+        } catch (QueryException $exception) {
+            DB::rollBack();
+            Log::debug('删除留言:' . $request['id'] . $exception->getMessage());
+            return Response::create([
+                'message' => '操作失败,请重试',
+                'error' => $exception->getMessage(),
+                'status_code' => 500
+            ]);
+        }
+    }
+}

+ 30 - 0
app/Transformers/Circle/CircleMemberTransformer.php

@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/6
+ * Time: 14:08
+ */
+namespace App\Transformers\Circle;
+
+use App\Models\InterestCircleUser;
+use App\Models\Post;
+use App\Traits\PostTrait;
+use App\Traits\UserTrait;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class CircleMemberTransformer extends TransformerAbstract
+{
+    use UserTrait;
+    public function transform(InterestCircleUser $interestCircleUser)
+    {
+        $user = $this->getShortUserInfo($interestCircleUser['uid']);
+        return [
+            'user' => $user?$user:new \stdClass(),
+            'created_at' => Carbon::parse($interestCircleUser['created_at'])->toDateTimeString(),
+            'is_black' => $interestCircleUser['is_black']
+        ];
+    }
+}

+ 46 - 0
app/Transformers/Circle/MessageListTransformer.php

@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/6
+ * Time: 14:08
+ */
+
+namespace App\Transformers\Circle;
+
+use App\Models\InterestCircle;
+use App\Models\InterestCircleMessage;
+use App\Models\Post;
+use App\Traits\PostTrait;
+use App\Traits\UserTrait;
+use Illuminate\Support\Carbon;
+use League\Fractal\TransformerAbstract;
+
+class MessageListTransformer extends TransformerAbstract
+{
+    use UserTrait;
+
+    public function transform(InterestCircleMessage $interestCircleMessage)
+    {
+        $user = $this->getShortUserInfo($interestCircleMessage['uid']);
+        return [
+            'id' => $interestCircleMessage['id'],
+            'created_at' => Carbon::parse($interestCircleMessage['created_at'])->toDateTimeString(),
+            'user' => $user ? $user : new \stdClass(),
+            'circle' => $this->getCircleInfo($interestCircleMessage['circle_id']),
+            'good' => $interestCircleMessage['good'],
+            'bad' => $interestCircleMessage['bad'],
+            'comment_count' => $interestCircleMessage['comment_count'],
+            'is_recommend' => $interestCircleMessage['is_recommend'],
+        ];
+    }
+
+    public function getCircleInfo($circleId)
+    {
+        $info = InterestCircle::find($circleId);
+        $circle['id'] = $info->id;
+        $circle['name'] = $info->name;
+        return $circle;
+    }
+}

+ 42 - 0
app/Transformers/Circle/PostListTransformer.php

@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/6
+ * Time: 14:08
+ */
+
+namespace App\Transformers\Circle;
+
+use App\Models\Post;
+use App\Traits\PostTrait;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\Redis;
+use League\Fractal\TransformerAbstract;
+
+class PostListTransformer extends TransformerAbstract
+{
+    use PostTrait;
+
+    public function __construct($circleId)
+    {
+        $this->circle_id = $circleId;
+    }
+
+    public function transform(Post $post)
+    {
+        $key = 'circle_articles_' . $this->circle_id;
+        $isexists = Redis::zscore($key, $post['id']);
+        return [
+            'id' => $post['id'],
+            'created_at' => Carbon::parse($post['created_at'])->toDateTimeString(),
+            'uid' => $post['uid'],
+            'username' => $post['username'],
+            'topic' => $this->getTopic($post['topic_ids'], 1),
+            'content' => subtext(strip_tags($post['content']), 20),
+            'image' => $post['img'],
+            'is_exists_circle' => $isexists ? 1 : 0,
+        ];
+    }
+}

+ 10 - 2
routes/api.php

@@ -192,11 +192,19 @@ $api->version('v1', [
         $api->delete('circle/picture', 'CircleController@deletePicture');
         //圈子精品文章列表
         $api->get('circle/articles', 'CircleController@articleList');
+        //圈子精品文章来源帖子列表
+        $api->get('circle/posts', 'CircleController@postList');
         //推荐精品文章
         $api->put('circle/article/recommend', 'CircleController@articleRecommend');
         //移出精品文章
         $api->delete('circle/article', 'CircleController@articleRemove');
-
-
+        //加入精品文章
+        $api->post('circle/article', 'CircleController@articleInsert');
+        //圈子用户列表
+        $api->get('circle/members', 'CircleController@memberList');
+        //设置圈子用户黑名单
+        $api->put('circle/member/black', 'CircleController@setCircleBlack');
+        //圈子留言列表
+        $api->get('circle/messages', 'CircleController@messageList');
     });
 });