From 4a3ba818ec7aa848ea26399591496cf02d3361cf Mon Sep 17 00:00:00 2001 From: liutk <961510893@qq.com> Date: Sun, 19 May 2024 11:51:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BB=91=E5=AE=9A=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Controllers/UserController.php | 7 +-- .../Api/ActivityGameController.php | 2 +- app/Http/Controllers/Api/ApiController.php | 4 +- app/Http/Controllers/Api/AuthController.php | 8 +--- app/Http/Controllers/Api/UserController.php | 45 +++++++++++++++++++ app/Http/Requests/CodeRequest.php | 44 ++++++++++++++++++ app/Models/User.php | 14 +++++- app/Services/Api/UserService.php | 13 ++++++ lang/zh_CN/admin.php | 1 + routes/api.php | 3 ++ 10 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 app/Http/Controllers/Api/UserController.php create mode 100644 app/Http/Requests/CodeRequest.php diff --git a/app/Admin/Controllers/UserController.php b/app/Admin/Controllers/UserController.php index 24b5c41..c37c453 100644 --- a/app/Admin/Controllers/UserController.php +++ b/app/Admin/Controllers/UserController.php @@ -38,10 +38,11 @@ class UserController extends AdminController amis()->TableColumn('avatar', __('admin.users.avatar'))->type('image')->height('50px')->width('50px')->enlargeAble(true), amis()->TableColumn('phone', __('admin.users.phone')), amis()->TableColumn('mini_openid', __('admin.users.mini_openid')), - amis()->TableColumn('last_login_at', __('admin.users.last_login_at')), - amis()->TableColumn('last_login_ip', __('admin.users.last_login_ip')), - amis()->TableColumn('created_at', __('admin.users.created_at'))->type('datetime')->sortable(true), + amis()->TableColumn('bind_phone_at', __('admin.users.bind_phone_at'))->type('datetime')->sortable(true), + amis()->TableColumn('last_login_at', __('admin.users.last_login_at')), + amis()->TableColumn('last_ip', __('admin.users.last_login_ip')), + Operation::make()->label(__('admin.actions'))->buttons([ $this->rowShowTypeButton('drawer', 'xl'), ]) diff --git a/app/Http/Controllers/Api/ActivityGameController.php b/app/Http/Controllers/Api/ActivityGameController.php index dd86ff9..b3416aa 100644 --- a/app/Http/Controllers/Api/ActivityGameController.php +++ b/app/Http/Controllers/Api/ActivityGameController.php @@ -22,7 +22,7 @@ class ActivityGameController extends ApiController //若已经没有最新的活动了, 则拿取当天最后一个 if(!$game){ - $activity?->games()->show() + $game = $activity?->games()->show() ->whereDate('game_at', now()) ->orderBy('game_at', 'desc')->first(); } diff --git a/app/Http/Controllers/Api/ApiController.php b/app/Http/Controllers/Api/ApiController.php index 83b9141..e5b2870 100644 --- a/app/Http/Controllers/Api/ApiController.php +++ b/app/Http/Controllers/Api/ApiController.php @@ -25,12 +25,12 @@ class ApiController extends BaseController return response()->json($result); } - public function success($data = [], $message = '') + public function success($data = null, $message = '') { return $this->json($data, Response::HTTP_OK, $message); } - public function error($message = '', $code = Response::HTTP_BAD_REQUEST, $data = []) + public function error($message = '', $code = Response::HTTP_BAD_REQUEST, $data = null) { return $this->json($data, $code, $message); } diff --git a/app/Http/Controllers/Api/AuthController.php b/app/Http/Controllers/Api/AuthController.php index 8b0a8e3..67f6321 100644 --- a/app/Http/Controllers/Api/AuthController.php +++ b/app/Http/Controllers/Api/AuthController.php @@ -7,6 +7,7 @@ use Carbon\Carbon; use Illuminate\Http\Request; use App\Services\Api\UserService; use App\Http\Resources\Api\UserResource; +use App\Http\Requests\CodeRequest; use Overtrue\LaravelWeChat\EasyWeChat; use Illuminate\Support\Arr; @@ -14,13 +15,8 @@ class AuthController extends ApiController { protected string $serviceName = UserService::class; - public function codeToSession(Request $request) + public function codeToSession(CodeRequest $request) { - $request->validate([ - 'code' => 'required', - ], [ - 'code.required' => '授权码必填', - ]); //绑定OPenid $code = $request->input('code'); $app = EasyWeChat::miniApp(); diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php new file mode 100644 index 0000000..5548eb9 --- /dev/null +++ b/app/Http/Controllers/Api/UserController.php @@ -0,0 +1,45 @@ +input('code'); + $app = EasyWeChat::miniApp(); + + try { + $response = $app->getClient()->postJson('wxa/business/getuserphonenumber', [ + 'code' => $code + ]); + }catch (\Throwable $th) { + return $this->error($th->getMessage()); + } + + if (Arr::get($response, 'errcode')) { + return $this->error(Arr::get($response, 'errmsg')); + } + + $phone = Arr::get($response['phone_info'], 'phoneNumber'); + // $phone = '17784326301'; + $res = $this->service->bindPhone(auth('api')->user(), $phone); + + if($res){ + return $this->success(null, '绑定成功'); + } + + return $this->error('绑定失败,请稍后重试'); + } +} \ No newline at end of file diff --git a/app/Http/Requests/CodeRequest.php b/app/Http/Requests/CodeRequest.php new file mode 100644 index 0000000..25051ce --- /dev/null +++ b/app/Http/Requests/CodeRequest.php @@ -0,0 +1,44 @@ + 'required|string|max:100', + ]; + } + + public function messages(){ + $message = [ + 'code.required' => 'code码必填', + ]; + return $message; + } + + protected function failedValidation(Validator $validator){ + $error = $validator->errors()->all(); + throw new HttpResponseException(response()->json(['data' => null, 'code' => 400, 'message' => $error[0]])); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index aaf4b80..bbc6146 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,11 +8,13 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; use EloquentFilter\Filterable; +use Illuminate\Database\Eloquent\Casts\Attribute; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable, Filterable; + protected $appends = ['last_ip']; /** * The attributes that are mass assignable. * @@ -25,6 +27,16 @@ class User extends Authenticatable 'mini_openid', 'union_id', 'last_login_at', - 'last_login_ip' + 'last_login_ip', + 'bind_phone_at' ]; + + //ip + protected function lastIp():Attribute + { + return Attribute::make( + get: fn($value) => $this->last_login_ip ? long2ip($this->last_login_ip) : "未知", + ); + } + } diff --git a/app/Services/Api/UserService.php b/app/Services/Api/UserService.php index aee57f9..c26834c 100644 --- a/app/Services/Api/UserService.php +++ b/app/Services/Api/UserService.php @@ -3,6 +3,7 @@ namespace App\Services\Api; use App\Models\User; +use Illuminate\Http\Response; /** * @method User getModel() @@ -43,4 +44,16 @@ class UserService )->plainTextToken; } + public function bindPhone(User $user, $phone) + { + if(User::where('phone', $phone)->where('id', '<>', $user->id)->exists()){ + return response()->json(['data'=>[], 'code'=> Response::HTTP_BAD_REQUEST, 'message' => '该手机号已被其他微信号绑定,请更换手机号绑定']); + } + + return $user->update([ + 'phone' => $phone, + 'bind_phone_at' => now() + ]); + } + } \ No newline at end of file diff --git a/lang/zh_CN/admin.php b/lang/zh_CN/admin.php index ef95a0a..30c71d2 100644 --- a/lang/zh_CN/admin.php +++ b/lang/zh_CN/admin.php @@ -323,6 +323,7 @@ return [ 'avatar' => '头像', 'phone' => '手机号', 'mini_openid' => '小程序唯一标识', + 'bind_phone_at' => '绑定手机时间', 'last_login_at' => '上次登录时间', 'last_login_ip' => '上次登录IP', 'created_at' => '首次进入时间', diff --git a/routes/api.php b/routes/api.php index 2a6b548..6e34dd2 100644 --- a/routes/api.php +++ b/routes/api.php @@ -30,6 +30,9 @@ Route::group(['prefix' => 'miniprogram', 'namespace' => 'Api\Miniprogram'], func Route::get('articles', [App\Http\Controllers\Api\ArticleController::class, 'index']); Route::get('articles/{article}', [App\Http\Controllers\Api\ArticleController::class, 'show']); + // 绑定接口 + Route::put('users/bind-phone', [App\Http\Controllers\Api\UserController::class, 'bindPhone']); + // 已授权绑定手机号 Route::middleware([HasBindPhone::class])->group(function(){