From 36319853b90bc271336f7d9768429cab4013f589 Mon Sep 17 00:00:00 2001 From: dengjingyuan <602754659@qq.com> Date: Wed, 22 Sep 2021 20:42:49 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BB=98=E8=B4=B9=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/Middleware/CheckoutSite.php | 66 ++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/Http/Middleware/CheckoutSite.php b/src/Http/Middleware/CheckoutSite.php index 70627a7..7775def 100644 --- a/src/Http/Middleware/CheckoutSite.php +++ b/src/Http/Middleware/CheckoutSite.php @@ -20,6 +20,8 @@ namespace Discuz\Http\Middleware; use App\Common\ResponseCode; use App\Models\Group; +use App\Models\GroupUser; +use App\Models\GroupUserMq; use App\Models\Invite; use App\Models\Order; use App\Repositories\UserRepository; @@ -38,6 +40,9 @@ class CheckoutSite implements MiddlewareInterface { use AssertPermissionTrait; + const CACHE_GROUP_USER_TIME = 300; + const CACHE_GROUP_USER_MQS_TIME = 300; + protected $app; protected $settings; @@ -99,6 +104,7 @@ class CheckoutSite implements MiddlewareInterface // } // $siteClose && $this->assertAdmin($actor); $this->checkPayMode($request, $actor); + $this->judgeGroupUser($actor); // 处理 付费模式 逻辑, 过期之后 加入待付费组 if (!$actor->isAdmin() && $siteMode === 'pay' && ( Carbon::now()->gt($actor->expired_at) || $actor->isGuest() )) { if (!$this->getOrder($actor) && !$this->getInvite($actor)) { @@ -164,4 +170,64 @@ class CheckoutSite implements MiddlewareInterface ->where('status', Invite::STATUS_USED) ->first(); } + + private function judgeGroupUser($actor) + { + if($actor->isGuest() || $actor->isAdmin()){ + return; + } + $group_user = app('cache')->get('judge_group_user_'.$actor->id); + if(empty($group_user)){ + // 目前的业务中,保持着 user 与 group_user 一对一的关系,所以这里可以只取一个 + $group_user = GroupUser::query()->where('user_id', $actor->id)->first(); + app('cache')->put('judge_group_user_'.$actor->id, $group_user, self::CACHE_GROUP_USER_TIME); + } + if($group_user->expiration_time < Carbon::now()){ + $empty_group_user_mqs = app('cache')->get('empty_group_user_mqs_'.$actor->id); + if(!empty($empty_group_user_mqs)){ + return; + } + //用户当前用户组到期,需要切换用户组 + $group_user_mqs = GroupUserMq::query() + ->select('groups.id','group_user_mqs.remain_days') + ->join('groups', 'group_user_mqs.group_id','=','groups.id') + ->where('group_user_mqs.user_id', $actor->id) + ->orderBy('groups.level') + ->first(); + if(empty($group_user_mqs)){ + app('cache')->put('empty_group_user_mqs_'.$actor->id, 1, self::CACHE_GROUP_USER_MQS_TIME); + return; + } + //更换用户组 + $db = $this->app->make('db'); + $log = $this->app->make('log'); + $db->beginTransaction(); + //先删掉之前的 group_user + $res = GroupUser::query()->where('user_id', $actor->id)->delete(); + if($res === false){ + $db->rollBack(); + $log->error('删除 group_user 出错', [$actor]); + return; + } + //再新增新的 group_user + $res = $db->insert([ + 'group_id' => $group_user_mqs->id, + 'user_id' => $actor->id, + 'expiration_time' => Carbon::now()->addDays($group_user_mqs->remain_days) + ]); + if($res === false){ + $db->rollBack(); + $log->error('新增 group_user 出错', [$actor]); + return; + } + //最后删除 group_user_mqs + $res = GroupUserMq::query()->where(['user_id' => $actor->id, 'group_id' => $group_user_mqs->id])->delete(); + if($res === false){ + $db->rollBack(); + $log->error('删除 group_user_mqs 出错', [$actor]); + return; + } + $db->commit(); + } + } } -- Gitee From dae0987bd0a156eaaaeedda84b3efe9bdc3529f2 Mon Sep 17 00:00:00 2001 From: dengjingyuan <602754659@qq.com> Date: Fri, 24 Sep 2021 13:01:12 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=AE=8C=E5=96=84=20=E4=BB=98=E8=B4=B9?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/Middleware/CheckoutSite.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Middleware/CheckoutSite.php b/src/Http/Middleware/CheckoutSite.php index 7775def..51bd434 100644 --- a/src/Http/Middleware/CheckoutSite.php +++ b/src/Http/Middleware/CheckoutSite.php @@ -192,7 +192,7 @@ class CheckoutSite implements MiddlewareInterface ->select('groups.id','group_user_mqs.remain_days') ->join('groups', 'group_user_mqs.group_id','=','groups.id') ->where('group_user_mqs.user_id', $actor->id) - ->orderBy('groups.level') + ->orderBy('groups.level', 'desc') ->first(); if(empty($group_user_mqs)){ app('cache')->put('empty_group_user_mqs_'.$actor->id, 1, self::CACHE_GROUP_USER_MQS_TIME); -- Gitee From 9d215e8b84886399dc2ee0abb02e028c8cd42dce Mon Sep 17 00:00:00 2001 From: dengjingyuan <602754659@qq.com> Date: Thu, 30 Sep 2021 12:13:55 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20group=5Fuser=20?= =?UTF-8?q?=EF=BC=8C=E5=BF=98=E8=AE=B0=E5=86=99=E8=A1=A8=E5=90=8D=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/Middleware/CheckoutSite.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Http/Middleware/CheckoutSite.php b/src/Http/Middleware/CheckoutSite.php index 51bd434..6a96188 100644 --- a/src/Http/Middleware/CheckoutSite.php +++ b/src/Http/Middleware/CheckoutSite.php @@ -210,7 +210,7 @@ class CheckoutSite implements MiddlewareInterface return; } //再新增新的 group_user - $res = $db->insert([ + $res = $db->table('group_user')->insert([ 'group_id' => $group_user_mqs->id, 'user_id' => $actor->id, 'expiration_time' => Carbon::now()->addDays($group_user_mqs->remain_days) -- Gitee From ff82fbc6a78ebaf4bc76a6ca9d58313c94cb8f33 Mon Sep 17 00:00:00 2001 From: dengjingyuan <602754659@qq.com> Date: Thu, 30 Sep 2021 17:47:11 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=AE=8C=E5=96=84=20=E4=BB=98=E8=B4=B9?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/Middleware/CheckoutSite.php | 53 ++++++++++++++++++---------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/Http/Middleware/CheckoutSite.php b/src/Http/Middleware/CheckoutSite.php index 6a96188..7a539ef 100644 --- a/src/Http/Middleware/CheckoutSite.php +++ b/src/Http/Middleware/CheckoutSite.php @@ -20,6 +20,7 @@ namespace Discuz\Http\Middleware; use App\Common\ResponseCode; use App\Models\Group; +use App\Models\GroupPaidUser; use App\Models\GroupUser; use App\Models\GroupUserMq; use App\Models\Invite; @@ -176,6 +177,8 @@ class CheckoutSite implements MiddlewareInterface if($actor->isGuest() || $actor->isAdmin()){ return; } + $db = $this->app->make('db'); + $log = $this->app->make('log'); $group_user = app('cache')->get('judge_group_user_'.$actor->id); if(empty($group_user)){ // 目前的业务中,保持着 user 与 group_user 一对一的关系,所以这里可以只取一个 @@ -183,8 +186,9 @@ class CheckoutSite implements MiddlewareInterface app('cache')->put('judge_group_user_'.$actor->id, $group_user, self::CACHE_GROUP_USER_TIME); } if($group_user->expiration_time < Carbon::now()){ - $empty_group_user_mqs = app('cache')->get('empty_group_user_mqs_'.$actor->id); - if(!empty($empty_group_user_mqs)){ + //判断用户当前是否为付费用户组,如果是付费用户组,还需要切换成普通用户组 + $paid_group = $group_user->groups()->where('is_paid', Group::IS_PAID)->first(); + if(empty($paid_group)){ //如果是普通用户组了,就不再进行切换身份操作了 return; } //用户当前用户组到期,需要切换用户组 @@ -194,13 +198,7 @@ class CheckoutSite implements MiddlewareInterface ->where('group_user_mqs.user_id', $actor->id) ->orderBy('groups.level', 'desc') ->first(); - if(empty($group_user_mqs)){ - app('cache')->put('empty_group_user_mqs_'.$actor->id, 1, self::CACHE_GROUP_USER_MQS_TIME); - return; - } - //更换用户组 - $db = $this->app->make('db'); - $log = $this->app->make('log'); + $db->beginTransaction(); //先删掉之前的 group_user $res = GroupUser::query()->where('user_id', $actor->id)->delete(); @@ -209,22 +207,39 @@ class CheckoutSite implements MiddlewareInterface $log->error('删除 group_user 出错', [$actor]); return; } - //再新增新的 group_user - $res = $db->table('group_user')->insert([ - 'group_id' => $group_user_mqs->id, - 'user_id' => $actor->id, - 'expiration_time' => Carbon::now()->addDays($group_user_mqs->remain_days) - ]); + //修改对应的 group_paid_user 的 delete_type 为 1 + $res = GroupPaidUser::query() + ->where('group_id', $group_user->group_id) + ->where('user_id', $group_user->user_id) + ->where('delete_type', 0) + ->update(['deleted_at' => Carbon::now(), 'delete_type' => GroupPaidUser::DELETE_TYPE_EXPIRE]); if($res === false){ $db->rollBack(); - $log->error('新增 group_user 出错', [$actor]); + $log->error('删除 group_paid_user 出错', [$actor]); return; } - //最后删除 group_user_mqs - $res = GroupUserMq::query()->where(['user_id' => $actor->id, 'group_id' => $group_user_mqs->id])->delete(); + //再新增新的 group_user ,默认普通用户组 + $change_group_id = Group::query()->where('default', true)->value('id') ?? Group::MEMBER_ID; + $change_expired_at = $actor->expired_at; + if(!empty($group_user_mqs)){ + $change_group_id = $group_user_mqs->id; + $change_expired_at = Carbon::now()->addDays($group_user_mqs->remain_days); + //删除对应的 group_user_mqs + $res = GroupUserMq::query()->where(['user_id' => $actor->id, 'group_id' => $group_user_mqs->id])->delete(); + if($res === false){ + $db->rollBack(); + $log->error('删除 group_user_mqs 出错', [$actor]); + return; + } + } + $res = $db->table('group_user')->insert([ + 'group_id' => $change_group_id, + 'user_id' => $actor->id, + 'expiration_time' => $change_expired_at + ]); if($res === false){ $db->rollBack(); - $log->error('删除 group_user_mqs 出错', [$actor]); + $log->error('切换 group_user 成默认用户组出错', [$actor]); return; } $db->commit(); -- Gitee From a1b1599ba70d538064ca7606eef54d1643b1d745 Mon Sep 17 00:00:00 2001 From: dengjingyuan <602754659@qq.com> Date: Fri, 8 Oct 2021 22:40:23 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=AE=8C=E5=96=84=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=84=E8=BF=87=E6=9C=9F=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/Middleware/CheckoutSite.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Http/Middleware/CheckoutSite.php b/src/Http/Middleware/CheckoutSite.php index 7a539ef..3605fe1 100644 --- a/src/Http/Middleware/CheckoutSite.php +++ b/src/Http/Middleware/CheckoutSite.php @@ -201,7 +201,7 @@ class CheckoutSite implements MiddlewareInterface $db->beginTransaction(); //先删掉之前的 group_user - $res = GroupUser::query()->where('user_id', $actor->id)->delete(); + $res = GroupUser::query()->where(['user_id' => $actor->id, 'group_id' => $group_user->group_id])->delete(); if($res === false){ $db->rollBack(); $log->error('删除 group_user 出错', [$actor]); @@ -232,6 +232,7 @@ class CheckoutSite implements MiddlewareInterface return; } } + $res = $db->table('group_user')->insert([ 'group_id' => $change_group_id, 'user_id' => $actor->id, @@ -242,6 +243,9 @@ class CheckoutSite implements MiddlewareInterface $log->error('切换 group_user 成默认用户组出错', [$actor]); return; } + // 更新 group_user 之后需要刷新缓存 + $group_user = GroupUser::query()->where('user_id', $actor->id)->first(); + app('cache')->put('judge_group_user_'.$actor->id, $group_user, self::CACHE_GROUP_USER_TIME); $db->commit(); } } -- Gitee