Procházet zdrojové kódy

Merge branch 'develop'

xielin před 5 roky
rodič
revize
cbd2eeb306

+ 44 - 1
app/Helper/helper.php

@@ -26,7 +26,7 @@ function generateSign(array $params, $secret_key)
 {
     unset($params['sign']);
     // 将删除参数组中所有等值为FALSE的参数(包括:NULL, 空字符串,0, false)
-    $params = array_filter($params);
+    // $params = array_filter($params);
 
     // 按照键名对参数数组进行升序排序
     ksort($params);
@@ -78,3 +78,46 @@ function http($url, $param, $method = 'post')
 
 }
 
+function jsonSuccess($data = [], $msg = "成功")
+{
+    $response = array(
+        'code' => 0,
+        'msg' => $msg,
+        'data' => new stdClass()
+    );
+    if ($data) {
+        if (is_array($data)) {
+            //带有分页格式转换
+            if (isset($data['meta'])) {
+                // 更改元数据格式,全部包含在data下
+                $temp = array(
+                    'data' => array(
+                        'data' => $data['data'],
+                        'pagination' => $data['meta']['pagination']
+                    )
+                );
+                $response = array_merge($response, $temp);
+            } elseif(isset($data['data'])) {
+                $response = array_merge($response, $data);
+            }else{
+                $temp = array(
+                    'data' => $data
+                );
+                $response = array_merge($response, $temp);
+            }
+        } else {
+            $response['data'] = $data;
+        }
+    }
+    return $response;
+}
+
+function jsonError($msg)
+{
+    $response = array(
+        'code' => 1,
+        'msg' => $msg,
+        'data' => ""
+    );
+    return $response;
+}

+ 54 - 0
app/Http/Controllers/V2/Controller.php

@@ -0,0 +1,54 @@
+<?php
+
+namespace App\Http\Controllers\V2;
+
+use Dingo\Api\Routing\Helpers;
+use Illuminate\Routing\Controller as BaseController;
+
+class Controller extends BaseController
+{
+    use Helpers;
+    public function jsonSuccess($data = [], $msg = "成功")
+    {
+        $response = array(
+            'code' => 0,
+            'msg' => $msg,
+            'data' => []
+        );
+        if ($data) {
+            if (is_array($data)) {
+                //带有分页格式转换
+                if (isset($data['meta'])) {
+                    // 更改元数据格式,全部包含在data下
+                    $temp = array(
+                        'data' => array(
+                            'data' => $data['data'],
+                            'pagination' => $data['meta']['pagination']
+                        )
+                    );
+                    $response = array_merge($response, $temp);
+                } elseif (isset($data['data'])) {
+                    $response = array_merge($response, $data);
+                } else {
+                    $temp = array(
+                        'data' => $data
+                    );
+                    $response = array_merge($response, $temp);
+                }
+            } else {
+                $response['data'] = $data;
+            }
+        }
+        return $response;
+    }
+
+    public function jsonError($msg)
+    {
+        $response = array(
+            'code' => 1,
+            'msg' => $msg,
+            'data' => ""
+        );
+        return $response;
+    }
+}

+ 51 - 0
app/Http/Controllers/V2/FloorController.php

@@ -0,0 +1,51 @@
+<?php
+namespace App\Http\Controllers\V2;
+use App\Http\Controllers\BaseController;
+use App\Repositories\FloorRepository;
+use App\Transformers\FloorTransformer;
+use Illuminate\Http\Request;
+use League\Fractal\Resource\Collection;
+use League\Fractal\Manager;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+/**
+ * Created by PhpStorm.
+ * User: durong
+ * Date: 2019/6/15
+ * Time: 下午4:30
+ */
+
+class FloorController extends BaseController
+{
+    public function __construct(FloorRepository $floorRepository)
+    {
+        $this->floorRepository = $floorRepository;
+    }
+
+    //楼层列表
+    public function index(Request $request)
+    {
+        $floor = $this->floorRepository->index($request->all());
+        $fractal = new Manager();
+        $resource = new Collection($floor , new FloorTransformer());
+        $resource->setPaginator(new IlluminatePaginatorAdapter($floor));
+        $data = $fractal->createData($resource)->toArray();
+        return $this->jsonSuccess($data);
+    }
+
+    /**
+     * 推荐内容列表
+     */
+    public function info()
+    {
+        return $this->floorRepository->info();
+    }
+
+    /**
+     * 热门视频ids
+     */
+    public function hotVideoIds()
+    {
+        return $this->floorRepository->hotVideoIds();
+    }
+
+}

+ 32 - 0
app/Http/Controllers/V2/MemberGroupController.php

@@ -0,0 +1,32 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-20
+ * Time: 14:18
+ */
+
+namespace App\Http\Controllers\V2;
+
+
+use App\Repositories\MemberGroupRepository;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Http\Request;
+
+
+class MemberGroupController extends Controller {
+    public function __construct(MemberGroupRepository $memberGroupRepository) {
+        $this->memberGroupRepository = $memberGroupRepository;
+    }
+    //获取推荐用户列表
+    public function memberList(Request $request){
+        $data = $request->all();
+        $validator = Validator::make($data, [
+            'take_count' => 'integer|max:50',
+        ]);
+        if ($validator->fails()) {
+            return $this->jsonError($validator->errors()->first());
+        }
+       return $this->memberGroupRepository->isSuggestMember($data['take_count']);
+    }
+}

+ 16 - 0
app/Models/Floor.php

@@ -0,0 +1,16 @@
+<?php
+
+namespace App\Models;
+
+
+class Floor extends BaseModel
+{
+    protected  $table = 'cms_floor';
+    /**
+     * 可被批量赋值的字段
+     * @var array
+     */
+    protected $fillable = ['name','floor_location','group_ids','floor_type','is_open'];
+
+
+}

+ 24 - 0
app/Models/MemberGroup.php

@@ -0,0 +1,24 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/20
+ * Time: 9:45
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class MemberGroup extends Model
+{
+    //
+    use SoftDeletes;
+    protected $table = 'member_group';
+    protected $guarded = [];
+
+    public function info()
+    {
+        return $this->hasMany('App\Models\MemberGroupInfo', 'id', 'member_group_id');
+    }
+}

+ 19 - 0
app/Models/MemberGroupInfo.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/20
+ * Time: 9:45
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class MemberGroupInfo extends Model
+{
+    //
+    use SoftDeletes;
+    protected $table = 'member_group_info';
+    protected $guarded = [];
+}

+ 24 - 0
app/Models/TopicGroup.php

@@ -0,0 +1,24 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/19
+ * Time: 14:34
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class TopicGroup extends Model
+{
+    //
+    use SoftDeletes;
+    protected $table = 'topic_group';
+    protected $guarded = [];
+
+    public function info()
+    {
+        return $this->hasMany('App\Models\TopicGroupInfo', 'id', 'topic_group_id');
+    }
+}

+ 19 - 0
app/Models/TopicGroupInfo.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/19
+ * Time: 14:35
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class TopicGroupInfo extends Model
+{
+    //
+    use SoftDeletes;
+    protected $table = 'topic_group_info';
+    protected $guarded = [];
+}

+ 24 - 0
app/Models/VideoGroup.php

@@ -0,0 +1,24 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/19
+ * Time: 15:26
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class VideoGroup extends Model
+{
+    //
+    use SoftDeletes;
+    protected $table = 'video_group';
+    protected $guarded = [];
+
+    public function info()
+    {
+        return $this->hasMany('App\Models\VideoGroupInfo', 'id', 'video_group_id');
+    }
+}

+ 19 - 0
app/Models/VideoGroupInfo.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/6/19
+ * Time: 15:27
+ */
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class VideoGroupInfo extends Model
+{
+    //
+    use SoftDeletes;
+    protected $table = 'video_group_info';
+    protected $guarded = [];
+}

+ 167 - 0
app/Repositories/FloorRepository.php

@@ -0,0 +1,167 @@
+<?php
+namespace App\Repositories;
+use App\Models\Floor;
+use App\Models\MemberGroup;
+use App\Models\MemberGroupInfo;
+use App\Models\TopicGroup;
+use App\Models\TopicGroupInfo;
+use App\Models\VideoGroup;
+use App\Models\VideoGroupInfo;
+use App\Traits\UserTrait;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Redis;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+use Dingo\Api\Http\Response;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Database\QueryException;
+
+/**
+ * Created by PhpStorm.
+ * User: durong
+ * Date: 2019/6/15
+ * Time: 下午4:36
+ */
+
+class FloorRepository
+{
+    use UserTrait;
+    public function __construct(Floor $floor,
+                                MemberGroup $memberGroup,
+                                MemberGroupInfo $memberGroupInfo,
+                                VideoGroup $videoGroup,
+                                VideoGroupInfo $videoGroupInfo,
+                                TopicGroup $topicGroup,
+                                TopicGroupInfo $topicGroupInfo)
+    {
+        $this->floor = $floor;
+        $this->memberGroup = $memberGroup;
+        $this->memberGroupInfo = $memberGroupInfo;
+        $this->videoGroup = $videoGroup;
+        $this->videoGroupInfo = $videoGroupInfo;
+        $this->topicGroup = $topicGroup;
+        $this->topicGroupInfo = $topicGroupInfo;
+    }
+
+    public function index($request)
+    {
+        $perPage = isset($request['per_page']) ? $request['per_page'] : 20;
+        $where = [];
+        $where[] = ['is_open', 1];
+
+        return $this->floor->where($where)->orderBy('floor_location', 'asc')->paginate($perPage);
+    }
+
+    public function info()
+    {
+        Log::debug('推荐内容楼层-开始请求');
+        $userInfo = $this->getUserInfo();
+        if(!$userInfo){
+            return jsonError('获取用户信息失败');
+        }
+        Log::debug('推荐内容楼层-用户信息'.json_encode($userInfo));
+        $floor = $this->floor
+            ->where('is_open', 1)
+            ->whereIn('floor_type', [0,1,2,3])
+            ->whereBetween('floor_location', [1,20])
+            ->get();
+        Log::debug('推荐内容楼层-楼层列表'.json_encode($floor));
+        $data = [];
+        foreach($floor as $item){
+            if($item->floor_type == 0){
+                //banner
+                $banner = $this->getBanner($item->group_ids);
+                Log::debug('推荐内容楼层-banner'.json_encode($banner));
+                if($banner){
+                    $data[$item->floor_location] = [
+                        'show_type' => 'banner',
+                        'data' => $banner
+                    ];
+                }
+            }elseif($item->floor_type == 1){
+                //user
+                $memberIds = $this->memberGroup
+                    ->join('member_group_info', '.member_group_id', '=', 'member_group.id')
+                    ->where('member_group.id', $item->group_ids)
+                    ->orderBy('member_group_info.sort', 'asc')
+                    ->limit(20)
+                    ->pluck('member_group_info.uid')
+                    ->toArray();
+                if(!$memberIds) continue;
+                $memberIds = implode($memberIds, ',');
+                $member = $this->getMemberGroup($memberIds);
+                Log::debug('推荐内容楼层-user'.json_encode($member));
+                if(!$member) continue;
+                $data[$item->floor_location] = [
+                    'show_type' => 'user',
+                    'data' => $member
+                ];
+            }elseif($item->floor_type == 2){
+                //video
+                $videoIds = $this->videoGroup
+                    ->join('video_group_info', 'video_group_info.video_group_id', '=', 'video_group.id')
+                    ->where('video_group.id', $item->group_ids)
+                    ->orderBy('video_group_info.sort', 'asc')
+                    ->limit(20)
+                    ->pluck('video_group_info.post_id')
+                    ->toArray();
+                if(!$videoIds) continue;
+                $videoIds = implode($videoIds, ',');
+                $video = $this->getPostVideo($videoIds);
+                Log::debug('推荐内容楼层-video'.json_encode($video));
+                if(!$video) continue;
+                $data[$item->floor_location] = [
+                    'show_type' => 'video',
+                    'data' => $video
+                ];
+            }elseif($item->floor_type == 3){
+                //topic
+                $topicIds = $this->topicGroup
+                    ->join('topic_group_info', 'topic_group_info.topic_group_id', '=', 'topic_group.id')
+                    ->where('topic_group.id', $item->group_ids)
+                    ->limit(20)
+                    ->pluck('topic_group_info.topic_id')
+                    ->toArray();
+                if(!$topicIds) continue;
+                $topicIds = implode($topicIds, ',');
+                Log::debug('推荐内容楼层-topicIds'.$topicIds);
+                $topic = $this->getTopic($topicIds);
+                Log::debug('推荐内容楼层-topic'.json_encode($topic));
+                if(!$topic) continue;
+                $data[$item->floor_location] = [
+                    'show_type' => 'topic',
+                    'data' => $topic
+                ];
+            }
+        }
+        Log::debug('推荐内容楼层-data'.json_encode($data));
+        return jsonSuccess($data);
+    }
+
+    public function hotVideoIds()
+    {
+        $id = $this->floor
+            ->where('is_open', 1)
+            ->where('floor_type', 2)
+            ->value('group_ids');
+        $data = '';
+        if($id){
+            //video
+            $videoIds = $this->videoGroup
+                ->join('video_group_info', 'video_group_info.video_group_id', '=', 'video_group.id')
+                ->where('video_group.id', $id)
+                ->orderBy('video_group_info.sort', 'asc')
+                ->pluck('video_group_info.post_id')
+                ->toArray();
+            if($videoIds){
+                $data = implode($videoIds, ',');
+                $key = 'hotVideoIds';
+                Redis::SET($key, $data);
+                Redis::EXPIRE($key, 600);
+            }
+        }
+        Log::debug('热门视频ids'.$data);
+        return jsonSuccess($data);
+    }
+
+}
+

+ 58 - 0
app/Repositories/MemberGroupRepository.php

@@ -0,0 +1,58 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019-06-20
+ * Time: 14:23
+ */
+
+namespace App\Repositories;
+
+
+use App\Models\MemberGroup;
+use App\Models\MemberGroupInfo;
+use App\Traits\UserTrait;
+
+class MemberGroupRepository {
+    use UserTrait;
+    public function __construct(MemberGroup $memberGroup,MemberGroupInfo $memberGroupInfo) {
+        $this->memberGroup = $memberGroup;
+        $this->memberGroupInfo = $memberGroupInfo;
+    }
+
+    /**
+     * @param $request
+     * @return array
+     * 获取推荐用户
+     */
+    public function isSuggestMember($request){
+       $group = $this->memberGroup->where('is_suggest',1)->first();
+       $take = 50;
+       if(!empty($request['take_count'])){
+           $take = $request['take_count'];
+       }
+       if($group){
+           $groupInfo = $this->memberGroupInfo
+               ->where('member_group_id',$group->id)
+               ->orderBy('sort')
+               ->take($take)
+               ->select('uid','sort')
+               ->get();
+           if($groupInfo){
+               $array  = $groupInfo->toArray();
+               $userData = [];
+               foreach ($array as $key=>$value){
+                   $userData[] = $value['uid'];
+               }
+               //请求用户接口获取用户信息
+               $uids = implode(',',$userData);
+               $data = $this->getMemberSortIdList($uids);
+               if($data){
+                   return jsonSuccess(['list'=>$data]);
+               }
+               return jsonSuccess();
+           }
+       }
+       return jsonSuccess();
+    }
+}

+ 99 - 0
app/Traits/UserTrait.php

@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: wangzhiqiang
+ * Date: 2019/5/5
+ * Time: 17:11
+ */
+namespace App\Traits;
+use Tymon\JWTAuth\Facades\JWTAuth;
+
+trait UserTrait
+{
+
+    public function getUserInfo() {
+        try {
+            $sign = generateSign([], config('customer.app_secret'));
+            $url = config("customer.app_service_url").'/user/userInfo';
+            $array = [
+                'json' => ['sign' => $sign], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array);
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+
+    public function getBanner($ids) {
+        try {
+            $sign = generateSign(['ids' => $ids], config('customer.app_secret'));
+            $url = config("customer.app_service_url").'/config/v2/bannerSet/lists';
+            $array = [
+                'json' => ['sign' => $sign, 'ids' => $ids], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array,'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+
+    public function getTopic($ids) {
+        try {
+            $sign = generateSign(['ids' => $ids], config('customer.app_secret'));
+            $url = config("customer.app_service_url").'/community/topic/group';
+            $array = [
+                'json' => ['sign' => $sign, 'ids' => $ids], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array,'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+
+    public function getPostVideo($ids) {
+        try {
+            $sign = generateSign(['ids' => $ids], config('customer.app_secret'));
+            $url = config("customer.app_service_url").'/community/post/video/group';
+            $array = [
+                'json' => ['sign' => $sign, 'ids' => $ids], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array,'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+
+    public function getMemberGroup($ids) {
+        try {
+            $sign = generateSign(['ids' => $ids], config('customer.app_secret'));
+            $url = config("customer.app_service_url").'/user/userGroup';
+            $array = [
+                'json' => ['sign' => $sign, 'ids' => $ids], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array,'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+    //获取推荐用户根据id排序
+    public function getMemberSortIdList($ids) {
+        try {
+            $sign = generateSign(['uids' => $ids], config('customer.app_secret'));
+            $url = config("customer.app_service_url").'/user/v2/member/memberSortIdList';
+            //$url = 'http://localhost:8080/v2/member/memberSortIdList';
+            $array = [
+                'json' => ['sign' => $sign, 'uids' => $ids], 'query' => [], 'http_errors' => false,'headers'=>['Authorization'=>"Bearer ".JWTAuth::getToken()]
+            ];
+            return http($url,$array,'get');
+        } catch (\Exception $e) {
+            return [];
+        }
+
+    }
+}

+ 30 - 0
app/Transformers/FloorTransformer.php

@@ -0,0 +1,30 @@
+<?php
+namespace App\Transformers;
+/**
+ * Created by PhpStorm.
+ * User: durong
+ * Date: 2019/6/15
+ * Time: 下午4:32
+ */
+
+use App\Models\Floor;
+use League\Fractal\TransformerAbstract;
+
+class FloorTransformer extends TransformerAbstract
+{
+
+    public function transform(Floor $floor)
+    {
+        $showType = [
+            0 => 'banner',
+            1 => 'user',
+            2 => 'video',
+            3 => 'topic',
+        ];
+        return [
+            'floor_location'    => $floor['floor_location'],
+            'group_ids'    => $floor['group_ids'],
+            'show_type'    => $showType[$floor['floor_type']],
+        ];
+    }
+}

+ 1 - 1
bootstrap/app.php

@@ -28,8 +28,8 @@ $app->withEloquent();
 $app->configure('api');
 $app->configure('apollo');
 $app->configure('auth');
-$app->configure('jwt');
 $app->configure('customer');
+$app->configure('jwt');
 $app->configure('elasticsearch');
 $app->configure('database');
 $app->configure('constants');

+ 20 - 0
routes/api.php

@@ -31,4 +31,24 @@ $api->version('v1', [
 
     });
 
+});
+
+$api->version('v1', [
+    'namespace' => 'App\Http\Controllers\V2',
+], function ($api) {
+
+    $api->group([
+        'prefix' => 'v2'
+    ], function ($api) {
+        $api->group(['middleware' => 'chxq_jwt_auth'], function ($api) {
+            //楼层列表
+            $api->get('/floor/index', 'FloorController@index');
+            //获取楼层信息
+            $api->get('/floor/info', 'FloorController@info');
+            //热门视频ids
+            $api->get('/floor/hotVideoIds', 'FloorController@hotVideoIds');
+            //获取推荐用户组内容
+            $api->get('memberList', 'MemberGroupController@memberList');
+        });
+    });
 });