From 10d4e19517d2722615e9c4071536b9b8999aae90 Mon Sep 17 00:00:00 2001 From: Summer Date: Fri, 20 Sep 2019 04:19:16 +0000 Subject: [PATCH] =?UTF-8?q?=E6=B4=BB=E8=B7=83=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/CalculateActiveUser.php | 26 ++++ app/Console/Kernel.php | 4 + app/Http/Controllers/CategoriesController.php | 7 +- app/Http/Controllers/TopicsController.php | 6 +- app/Models/Traits/ActiveUserHelper.php | 117 ++++++++++++++++++ app/Models/User.php | 1 + resources/views/topics/_sidebar.blade.php | 21 +++- 7 files changed, 177 insertions(+), 5 deletions(-) create mode 100644 app/Console/Commands/CalculateActiveUser.php create mode 100644 app/Models/Traits/ActiveUserHelper.php diff --git a/app/Console/Commands/CalculateActiveUser.php b/app/Console/Commands/CalculateActiveUser.php new file mode 100644 index 000000000..5736273ad --- /dev/null +++ b/app/Console/Commands/CalculateActiveUser.php @@ -0,0 +1,26 @@ +info("开始计算..."); + + $user->calculateAndCacheActiveUsers(); + + $this->info("成功生成!"); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index a8c515859..abcf92dff 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -26,6 +26,10 @@ protected function schedule(Schedule $schedule) { // $schedule->command('inspire') // ->hourly(); + + + // 一小时执行一次『活跃用户』数据生成的命令 + $schedule->command('larabbs:calculate-active-user')->hourly(); } /** diff --git a/app/Http/Controllers/CategoriesController.php b/app/Http/Controllers/CategoriesController.php index ee493478a..054d8f85e 100644 --- a/app/Http/Controllers/CategoriesController.php +++ b/app/Http/Controllers/CategoriesController.php @@ -5,17 +5,20 @@ use Illuminate\Http\Request; use App\Models\Topic; use App\Models\Category; +use App\Models\User; class CategoriesController extends Controller { - public function show(Category $category, Request $request, Topic $topic) + public function show(Category $category, Request $request, Topic $topic, User $user) { // 读取分类 ID 关联的话题,并按每 20 条分页 $topics = $topic->withOrder($request->order) ->where('category_id', $category->id) ->paginate(20); + // 活跃用户列表 + $active_users = $user->getActiveUsers(); // 传参变量话题和分类到模板中 - return view('topics.index', compact('topics', 'category')); + return view('topics.index', compact('topics', 'category', 'active_users')); } } diff --git a/app/Http/Controllers/TopicsController.php b/app/Http/Controllers/TopicsController.php index 7c62e5461..2eb533c05 100644 --- a/app/Http/Controllers/TopicsController.php +++ b/app/Http/Controllers/TopicsController.php @@ -7,6 +7,7 @@ use App\Http\Controllers\Controller; use App\Http\Requests\TopicRequest; use App\Models\Category; +use App\Models\User; use Auth; use App\Handlers\ImageUploadHandler; @@ -17,10 +18,11 @@ public function __construct() $this->middleware('auth', ['except' => ['index', 'show']]); } - public function index(Request $request, Topic $topic) + public function index(Request $request, Topic $topic, User $user) { $topics = $topic->withOrder($request->order)->paginate(20); - return view('topics.index', compact('topics')); + $active_users = $user->getActiveUsers(); + return view('topics.index', compact('topics', 'active_users')); } public function show(Request $request, Topic $topic) diff --git a/app/Models/Traits/ActiveUserHelper.php b/app/Models/Traits/ActiveUserHelper.php new file mode 100644 index 000000000..70a6f1a96 --- /dev/null +++ b/app/Models/Traits/ActiveUserHelper.php @@ -0,0 +1,117 @@ +cache_key, $this->cache_expire_in_seconds, function(){ + return $this->calculateActiveUsers(); + }); + } + + public function calculateAndCacheActiveUsers() + { + // 取得活跃用户列表 + $active_users = $this->calculateActiveUsers(); + // 并加以缓存 + $this->cacheActiveUsers($active_users); + } + + private function calculateActiveUsers() + { + $this->calculateTopicScore(); + $this->calculateReplyScore(); + + // 数组按照得分排序 + $users = Arr::sort($this->users, function ($user) { + return $user['score']; + }); + + // 我们需要的是倒序,高分靠前,第二个参数为保持数组的 KEY 不变 + $users = array_reverse($users, true); + + // 只获取我们想要的数量 + $users = array_slice($users, 0, $this->user_number, true); + + // 新建一个空集合 + $active_users = collect(); + + foreach ($users as $user_id => $user) { + // 找寻下是否可以找到用户 + $user = $this->find($user_id); + + // 如果数据库里有该用户的话 + if ($user) { + + // 将此用户实体放入集合的末尾 + $active_users->push($user); + } + } + + // 返回数据 + return $active_users; + } + + private function calculateTopicScore() + { + // 从话题数据表里取出限定时间范围($pass_days)内,有发表过话题的用户 + // 并且同时取出用户此段时间内发布话题的数量 + $topic_users = Topic::query()->select(DB::raw('user_id, count(*) as topic_count')) + ->where('created_at', '>=', Carbon::now()->subDays($this->pass_days)) + ->groupBy('user_id') + ->get(); + // 根据话题数量计算得分 + foreach ($topic_users as $value) { + $this->users[$value->user_id]['score'] = $value->topic_count * $this->topic_weight; + } + } + + private function calculateReplyScore() + { + // 从回复数据表里取出限定时间范围($pass_days)内,有发表过回复的用户 + // 并且同时取出用户此段时间内发布回复的数量 + $reply_users = Reply::query()->select(DB::raw('user_id, count(*) as reply_count')) + ->where('created_at', '>=', Carbon::now()->subDays($this->pass_days)) + ->groupBy('user_id') + ->get(); + // 根据回复数量计算得分 + foreach ($reply_users as $value) { + $reply_score = $value->reply_count * $this->reply_weight; + if (isset($this->users[$value->user_id])) { + $this->users[$value->user_id]['score'] += $reply_score; + } else { + $this->users[$value->user_id]['score'] = $reply_score; + } + } + } + + private function cacheActiveUsers($active_users) + { + // 将数据放入缓存中 + Cache::put($this->cache_key, $active_users, $this->cache_expire_in_seconds); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 268a67e61..b151c12fa 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -14,6 +14,7 @@ class User extends Authenticatable implements MustVerifyEmailContract { use HasRoles; use MustVerifyEmailTrait; + use Traits\ActiveUserHelper; use Notifiable { notify as protected laravelNotify; diff --git a/resources/views/topics/_sidebar.blade.php b/resources/views/topics/_sidebar.blade.php index 391e1c0d3..78234b328 100644 --- a/resources/views/topics/_sidebar.blade.php +++ b/resources/views/topics/_sidebar.blade.php @@ -1,7 +1,26 @@
+ +@if (count($active_users)) +
+
+
活跃用户
+
+ @foreach ($active_users as $active_user) + +
+ +
+
+ {{ $active_user->name }} +
+
+ @endforeach +
+
+@endif