From 6cf50274479cc0af126fccc93f7424645fe58690 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Thu, 4 Sep 2025 14:53:24 +0800 Subject: [PATCH] update --- .../Controllers/Mobile/CourseController.php | 42 ++++----- .../Controllers/Mobile/UserController.php | 92 +++++++++++++++++++ routes/api.php | 7 +- 3 files changed, 119 insertions(+), 22 deletions(-) diff --git a/app/Http/Controllers/Mobile/CourseController.php b/app/Http/Controllers/Mobile/CourseController.php index 2ce7756..59f31a3 100755 --- a/app/Http/Controllers/Mobile/CourseController.php +++ b/app/Http/Controllers/Mobile/CourseController.php @@ -553,25 +553,25 @@ class CourseController extends CommonController { $all = \request()->all(); $messages = [ - 'longitude.required' => '经度必填', - 'latitude.required' => '纬度必填', + // 'longitude.required' => '经度必填', + // 'latitude.required' => '纬度必填', 'course_content_id.required' => '课表id必填', ]; $validator = Validator::make($all, [ - 'longitude' => 'required', - 'latitude' => 'required', + // 'longitude' => 'required', + // 'latitude' => 'required', 'course_content_id' => 'required' ], $messages); if ($validator->fails()) { return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } // 获取打卡范围,千米 - $content_check_range = Config::getValueByKey('content_check_range'); +// $content_check_range = Config::getValueByKey('content_check_range'); $courseContent = CourseContent::find($all['course_content_id']); - $distance = getDistance($courseContent->longitude, $courseContent->latitude, $all['longitude'], $all['latitude']); - if ($distance > $content_check_range) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); - } +// $distance = getDistance($courseContent->longitude, $courseContent->latitude, $all['longitude'], $all['latitude']); +// if ($distance > $content_check_range) { +// return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); +// } // 判断当天才能签到 $today = date('Y-m-d'); if ($today != $courseContent->date) { @@ -639,12 +639,12 @@ class CourseController extends CommonController $all = \request()->all(); $messages = [ 'longitude.required' => '经度必填', - 'latitude.required' => '纬度必填', - 'course_id.required' => '课表id必填', + // 'latitude.required' => '纬度必填', + // 'course_id.required' => '课表id必填', ]; $validator = Validator::make($all, [ - 'longitude' => 'required', - 'latitude' => 'required', + // 'longitude' => 'required', + // 'latitude' => 'required', 'course_id' => 'required' ], $messages); if ($validator->fails()) { @@ -652,14 +652,14 @@ class CourseController extends CommonController } // 获取打卡范围,千米 $content_check_range = Config::getValueByKey('content_check_range'); - $course = Course::find($all['course_id']); - if (empty($course->longitude) || empty($course->latitude)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '请先设置课程经纬度']); - } - $distance = getDistance($course->longitude, $course->latitude, $all['longitude'], $all['latitude']); - if ($distance > $content_check_range) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); - } +// $course = Course::find($all['course_id']); +// if (empty($course->longitude) || empty($course->latitude)) { +// return $this->fail([ResponseCode::ERROR_BUSINESS, '请先设置课程经纬度']); +// } +// $distance = getDistance($course->longitude, $course->latitude, $all['longitude'], $all['latitude']); +// if ($distance > $content_check_range) { +// return $this->fail([ResponseCode::ERROR_BUSINESS, '超出打卡范围']); +// } // 判断当天才能签到 $today = date('Y-m-d'); if ($today != $course->start_date) { diff --git a/app/Http/Controllers/Mobile/UserController.php b/app/Http/Controllers/Mobile/UserController.php index 54b3677..989b9bc 100755 --- a/app/Http/Controllers/Mobile/UserController.php +++ b/app/Http/Controllers/Mobile/UserController.php @@ -521,4 +521,96 @@ class UserController extends CommonController return $this->success(compact('qrcode')); } + /** + * @OA\Get( + * path="/api/mobile/user/mobile-login", + * tags={"小程序-用户管理"}, + * summary="手机号登陆", + * @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=false, description="code"), + * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="手机号"), + * @OA\Response( + * response=200, + * description="操作成功" + * ) + * ) + */ + public function mobileLogin() + { + $all = \request()->all(); + $messages = [ + 'code.required' => 'code必填', + 'mobile.required' => '手机号必填' + ]; + $validator = Validator::make($all, [ + 'code' => 'required', + 'mobile' => 'required' + ], $messages); + if ($validator->fails()) { + return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + $key = 'sms_login_' . $all['mobile']; + $check = Cache::get($key); + if (empty($check)) return $this->fail([ResponseCode::ERROR_BUSINESS, '请先发送验证码']); + if ($check['code'] != $all['code']) return $this->fail([ResponseCode::ERROR_BUSINESS, '验证码错误']); + $user = User::where('mobile', $all['mobile'])->first(); + $token = $user->createToken("mobile-token")->plainTextToken; + return $this->success(compact('token')); + } + + /** + * @OA\Get ( + * path="/api/mobile/user/mobile-login-code", + * tags={"手机端-用户管理"}, + * summary="短信登陆发送验证码", + * description="", + * @OA\Parameter(name="course_id", in="query", @OA\Schema(type="string"), required=true, description="课程id"), + * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"), + * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\Response( + * response="200", + * description="" + * ) + * ) + */ + public function mobileLoginCode() + { + $all = \request()->all(); + $messages = [ + 'course_id.required' => '课程id必填', + 'mobile.required' => '手机号必填', + 'mobile.numeric' => '手机号格式错误', + ]; + $validator = Validator::make($all, [ + 'course_id' => 'required', + 'mobile' => 'required|numeric' + ], $messages); + if ($validator->fails()) { + return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]); + } + // 监测是否正常报名并通过 + $courseSigns = CourseSign::where('course_id', $all['course_id']) + ->whereHas('user', function ($query) use ($all) { + $query->where('mobile', $all['mobile']); + })->where('status', 1) + ->first(); + if (empty($courseSigns)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '未报名课程']); + } + $key = 'sms_login_' . $all['mobile']; + $check = Cache::get($key); + if (isset($check) && time() - $check['time'] <= 60) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '请勿频繁发送']); + } + $code = rand(1000, 9999); + $smsSign = Config::getValueByKey('sms_sign'); + $content = "{$smsSign}您的验证码是:{$code},验证码五分钟内有效,如非本人操作,请忽略。"; + $result = ymSms($all['mobile'], $content); + if ($result) { + // 缓存 + Cache::put($key, ['code' => $code, 'time' => time()], 300); + return $this->success("发送成功"); + } + return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, "发送失败"]); + } + } diff --git a/routes/api.php b/routes/api.php index 43b04d2..0fa4a4f 100755 --- a/routes/api.php +++ b/routes/api.php @@ -255,10 +255,15 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () { Route::get('course/course-detail-pc', [\App\Http\Controllers\Mobile\CourseController::class, "courseDetailPc"]); // 小程序登陆 Route::get('user/applet-login', [\App\Http\Controllers\Mobile\UserController::class, "appletLogin"]); + // 手机号登陆 + Route::get('user/mobile-login', [\App\Http\Controllers\Mobile\UserController::class, "mobileLogin"]); + // 手机号登陆发送验证码 + Route::get('user/mobile-login-code', [\App\Http\Controllers\Mobile\UserController::class, "mobileLoginCode"]); // 新闻列表 Route::get('course/news', [\App\Http\Controllers\Mobile\CourseController::class, "news"]); // 新闻详情 Route::get('course/news-detail', [\App\Http\Controllers\Mobile\CourseController::class, "newsDetail"]); + Route::get('course/course-detail', [\App\Http\Controllers\Mobile\CourseController::class, "courseDetail"]); // 支付回调 Route::any('course/pay_callback', [\App\Http\Controllers\Mobile\CourseController::class, "payCallback"]); Route::group(['middleware' => ['sanctum.jwt:mobile']], function () { @@ -275,7 +280,7 @@ Route::group(["namespace" => "Mobile", "prefix" => "mobile"], function () { Route::post('user/update-donates', [\App\Http\Controllers\Mobile\UserController::class, "updateDonates"]); // 课程信息 - Route::get('course/course-detail', [\App\Http\Controllers\Mobile\CourseController::class, "courseDetail"]); + Route::get('course/evaluation-detail', [\App\Http\Controllers\Mobile\CourseController::class, "evaluationDetail"]); Route::post('course/sign', [\App\Http\Controllers\Mobile\CourseController::class, "sign"]);