Skip to content

Commit fdbd538

Browse files
authored
Merge pull request #218 from Qsnh/dev
v4.8
2 parents 35286e8 + 6683a32 commit fdbd538

File tree

254 files changed

+8210
-4600
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

254 files changed

+8210
-4600
lines changed

.env.example

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,6 @@ TENCENT_COS_SECRET_ID=
5959
TENCENT_COS_SECRET_KEY=
6060
TENCENT_COS_BUCKET=
6161
TENCENT_COS_CDN=
62-
TENCENT_COS_READ_FROM_CDN=false
62+
TENCENT_COS_READ_FROM_CDN=false
63+
64+
CLOSE_DEPRECATED_API=false

.env.install

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,6 @@ TENCENT_COS_SECRET_ID=
5959
TENCENT_COS_SECRET_KEY=
6060
TENCENT_COS_BUCKET=
6161
TENCENT_COS_CDN=
62-
TENCENT_COS_READ_FROM_CDN=false
62+
TENCENT_COS_READ_FROM_CDN=false
63+
64+
CLOSE_DEPRECATED_API=false

.github/workflows/meedu.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ jobs:
4141
- name: 'Directory Permissions'
4242
run: chmod -R 777 storage bootstrap/cache
4343
- name: 'Execute tests (Unit and Feature tests) via PHPUnit'
44+
env:
45+
WECHAT_MP_APP_ID: ${{secrets.WECHAT_MP_APP_ID}}
46+
WECHAT_MP_APP_SECRET: ${{secrets.WECHAT_MP_APP_SECRET}}
47+
WECHAT_MP_TOKEN: ${{secrets.WECHAT_MP_TOKEN}}
4448
run: vendor/bin/phpunit

app/Bus/AdminPermissionBus.php

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Qsnh/meedu.
5+
*
6+
* (c) 杭州白书科技有限公司
7+
*/
8+
9+
namespace App\Bus;
10+
11+
use App\Constant\TableConstant;
12+
use App\Models\AdministratorRole;
13+
use Illuminate\Support\Facades\DB;
14+
use App\Models\AdministratorPermission;
15+
use App\Meedu\ServiceV2\Services\ConfigServiceInterface;
16+
17+
class AdminPermissionBus
18+
{
19+
protected $configService;
20+
21+
public const PERMISSION_WHITE_LIST = [
22+
'user' => 1,
23+
'login' => 1,
24+
'dashboard' => 1,
25+
'dashboard/system/info' => 1,
26+
'dashboard/check' => 1,
27+
'role/all' => 1,
28+
'administrator_permission' => 1,
29+
'course/all' => 1,
30+
'upload/image/tinymce' => 1,
31+
'upload/image/download' => 1,
32+
'administrator/password' => 1,
33+
];
34+
35+
public function __construct(ConfigServiceInterface $configService)
36+
{
37+
$this->configService = $configService;
38+
}
39+
40+
public function inWhitelist(string $path): bool
41+
{
42+
return isset(self::PERMISSION_WHITE_LIST[$path]);
43+
}
44+
45+
public function isSuperAdmin(int $adminId): bool
46+
{
47+
$roleIds = DB::table(TableConstant::TABLE_ADMIN_ROLE_RELATION)
48+
->select(['role_id'])
49+
->where('administrator_id', $adminId)
50+
->get()
51+
->pluck('role_id')
52+
->toArray();
53+
if (!$roleIds) {
54+
return false;
55+
}
56+
57+
return AdministratorRole::query()
58+
->whereIn('id', $roleIds)
59+
->where('slug', $this->configService->getSuperAdministratorSlug())
60+
->exists();
61+
}
62+
63+
public function hasPermission(int $adminId, string $path, string $method): bool
64+
{
65+
$method = strtoupper($method);
66+
67+
$roleIds = DB::table(TableConstant::TABLE_ADMIN_ROLE_RELATION)
68+
->select(['role_id'])
69+
->where('administrator_id', $adminId)
70+
->get()
71+
->pluck('role_id')
72+
->toArray();
73+
if (!$roleIds) {
74+
return false;
75+
}
76+
77+
$permissionIds = DB::table(TableConstant::TABLE_ROLE_PERMISSION_RELATION)
78+
->select(['permission_id'])
79+
->whereIn('role_id', $roleIds)
80+
->get()
81+
->pluck('permission_id')
82+
->toArray();
83+
if (!$permissionIds) {
84+
return false;
85+
}
86+
87+
$permissions = AdministratorPermission::query()
88+
->select(['url', 'method'])
89+
->whereIn('id', $permissionIds)
90+
->get()
91+
->toArray();
92+
93+
foreach ($permissions as $permissionItem) {
94+
$methods = explode('|', strtoupper($permissionItem['method']));
95+
if (preg_match("#${permissionItem['url']}#", $path) && in_array($method, $methods)) {
96+
return true;
97+
}
98+
}
99+
100+
return false;
101+
}
102+
}

app/Bus/AuthBus.php

Lines changed: 78 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -8,109 +8,122 @@
88

99
namespace App\Bus;
1010

11-
use Carbon\Carbon;
1211
use App\Events\UserLoginEvent;
12+
use App\Businesses\BusinessState;
1313
use App\Constant\FrontendConstant;
14+
use Illuminate\Support\Facades\DB;
15+
use App\Exceptions\ServiceException;
1416
use Illuminate\Support\Facades\Auth;
17+
use App\Services\Base\Services\ConfigService;
1518
use App\Services\Member\Services\UserService;
1619
use App\Services\Member\Services\SocialiteService;
20+
use App\Services\Base\Interfaces\ConfigServiceInterface;
1721
use App\Services\Member\Interfaces\UserServiceInterface;
1822
use App\Services\Member\Interfaces\SocialiteServiceInterface;
1923

2024
class AuthBus
2125
{
26+
public const ERROR_CODE_BIND_MOBILE = -100;
27+
28+
/**
29+
* @var SocialiteService
30+
*/
31+
protected $socialiteService;
32+
33+
/**
34+
* @var UserService
35+
*/
36+
protected $userService;
37+
38+
/**
39+
* @var ConfigService
40+
*/
41+
protected $configService;
42+
43+
public function __construct(
44+
SocialiteServiceInterface $socialiteService,
45+
UserServiceInterface $userService,
46+
ConfigServiceInterface $configService
47+
) {
48+
$this->socialiteService = $socialiteService;
49+
$this->userService = $userService;
50+
$this->configService = $configService;
51+
}
52+
2253
public function tokenLogin(int $userId, string $platform)
2354
{
24-
$loginAt = Carbon::now();
25-
26-
$token = Auth::guard('apiv2')
27-
->claims([
28-
FrontendConstant::USER_LOGIN_AT_COOKIE_NAME => $loginAt->timestamp,
29-
])
30-
->tokenById($userId);
31-
32-
event(new UserLoginEvent($userId, $platform, $loginAt->toDateTimeLocalString()));
33-
55+
$token = Auth::guard(FrontendConstant::API_GUARD)->tokenById($userId);
56+
event(new UserLoginEvent($userId, $platform, request()->getClientIp(), request_ua(), $token));
3457
return $token;
3558
}
3659

3760
public function wechatLogin(string $openId, string $unionId, $data): int
3861
{
39-
/**
40-
* @var SocialiteService $socialiteService
41-
*/
42-
$socialiteService = app()->make(SocialiteServiceInterface::class);
43-
44-
if ($unionId && $socialiteRecord = $socialiteService->findUnionId($unionId)) {
62+
if ($unionId && $socialiteRecord = $this->socialiteService->findUnionId($unionId)) {
4563
return $socialiteRecord['user_id'];
4664
}
4765

48-
$socialiteRecord = $socialiteService->findBind(FrontendConstant::WECHAT_LOGIN_SIGN, $openId);
66+
$socialiteRecord = $this->socialiteService->findBind(FrontendConstant::WECHAT_LOGIN_SIGN, $openId);
4967
if ($socialiteRecord) {
5068
// 更新unionId
51-
$unionId && $socialiteService->updateUnionId($socialiteRecord['id'], $unionId);
69+
$unionId && $this->socialiteService->updateUnionId($socialiteRecord['id'], $unionId);
5270

5371
return $socialiteRecord['user_id'];
5472
}
5573

74+
if ($this->configService->getEnabledMobileBindAlert() === 1) {//强制绑定手机号
75+
return self::ERROR_CODE_BIND_MOBILE;
76+
}
77+
5678
// 创建新的用户
5779
$data = [
5880
'nickname' => $data['nickname'] ?? '',
5981
'avatar' => $data['headimgurl'] ?? '',
6082
];
6183

62-
return $socialiteService->bindAppWithNewUser(FrontendConstant::WECHAT_LOGIN_SIGN, $openId, $data, $unionId);
84+
return $this->socialiteService->bindAppWithNewUser(FrontendConstant::WECHAT_LOGIN_SIGN, $openId, $data, $unionId);
6385
}
6486

65-
public function wechatMiniLogin(string $openId, string $unionId)
87+
public function socialiteLogin(string $app, string $id, array $data)
6688
{
67-
/**
68-
* @var SocialiteService $socialiteService
69-
*/
70-
$socialiteService = app()->make(SocialiteServiceInterface::class);
71-
72-
if ($unionId && $socialiteRecord = $socialiteService->findUnionId($unionId)) {
73-
return $socialiteRecord['user_id'];
89+
$userId = $this->socialiteService->getBindUserId($app, $id);
90+
if ($userId > 0) {
91+
return $userId;
7492
}
75-
76-
$socialiteRecord = $socialiteService->findBind(FrontendConstant::WECHAT_MINI_LOGIN_SIGN, $openId);
77-
if ($socialiteRecord) {
78-
// 更新unionId
79-
$unionId && $socialiteService->updateUnionId($socialiteRecord['id'], $unionId);
80-
81-
return $socialiteRecord['user_id'];
93+
if ($this->configService->getEnabledMobileBindAlert() === 1) {//强制绑定手机号
94+
return self::ERROR_CODE_BIND_MOBILE;
8295
}
83-
84-
return 0;
96+
// 自动创建新用户
97+
return $this->socialiteService->bindAppWithNewUser($app, $id, $data);
8598
}
8699

87-
public function wechatMiniMobileLogin(string $openId, string $unionId, string $mobile, $data)
88-
{
89-
/**
90-
* @var SocialiteService $socialiteService
91-
*/
92-
$socialiteService = app()->make(SocialiteServiceInterface::class);
93-
/**
94-
* @var UserService $userService
95-
*/
96-
$userService = app()->make(UserServiceInterface::class);
97-
98-
$user = $userService->findMobile($mobile);
99-
$userSocialites = [];
100-
101-
if ($user) {
102-
// 读取已经绑定的socialite
103-
$userSocialites = $socialiteService->userSocialites($user['id']);
104-
} else {
105-
// 创建新的账户
106-
$user = $userService->createWithMobile($mobile, '', $data['nickName'], $data['avatarUrl']);
107-
}
108-
109-
if (!in_array(FrontendConstant::WECHAT_MINI_LOGIN_SIGN, array_column($userSocialites, 'app'))) {
110-
// 当前用户未绑定当前的小程序账户的话
111-
$socialiteService->bindApp($user['id'], FrontendConstant::WECHAT_MINI_LOGIN_SIGN, $openId, $data, $unionId);
112-
}
113-
114-
return $user;
100+
public function registerWithSocialite(
101+
string $mobile,
102+
string $app,
103+
string $appId,
104+
string $unionId,
105+
string $nickname,
106+
string $avatar,
107+
array $data
108+
) {
109+
return DB::transaction(function () use ($mobile, $app, $appId, $unionId, $nickname, $avatar, $data) {
110+
$user = $this->userService->findMobile($mobile);
111+
if ($user) {
112+
throw new ServiceException(__('手机号已存在'));
113+
}
114+
115+
/**
116+
* @var BusinessState $bus
117+
*/
118+
$bus = app()->make(BusinessState::class);
119+
$bus->socialiteBindCheck(0, $app, $appId);
120+
121+
// 创建用户
122+
$user = $this->userService->createWithMobile($mobile, '', $nickname, $avatar);
123+
124+
$this->socialiteService->bindApp($user['id'], $app, $appId, $data, $unionId);
125+
126+
return $user['id'];
127+
});
115128
}
116129
}

app/Bus/RefundBus.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function wechatHandle(array $order, string $refundNo, int $total, int $am
6565

6666
/**
6767
* 判断给定的订单是否已经处理完成
68-
* @param $refundOrder
68+
* @param array $refundOrder
6969
* @return bool
7070
*/
7171
public function isProcessed(array $refundOrder): bool

0 commit comments

Comments
 (0)