You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

723 lines
30 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* 用户
*/
namespace App\Http\Controllers\Mobile;
use App\Helpers\ResponseCode;
use App\Helpers\StarterResponseCode;
use App\Jobs\SendAppointCar;
use App\Jobs\SendCourseCar;
use App\Models\Appointment;
use App\Models\Company;
use App\Models\Config;
use App\Models\CourseContentCheck;
use App\Models\CourseSign;
use App\Models\RelatedModel;
use App\Models\ScoreLog;
use App\Models\ThirdAppointmentLog;
use App\Models\Sms;
use App\Models\User;
use App\Repositories\DoorRepository;
use App\Repositories\YuanheRepository;
use EasyWeChat\Factory;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Overtrue\Pinyin\Pinyin;
class UserController extends CommonController
{
/**
* @OA\Get(
* path="/api/mobile/user/applet-login",
* tags={"小程序-用户管理"},
* summary="小程序静默登陆",
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=false, description="code"),
* @OA\Parameter(name="pid", in="query", @OA\Schema(type="string"), required=false, description="上级id"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function appletLogin()
{
$all = \request()->all();
$messages = [
'code.required' => 'code必填',
];
$validator = Validator::make($all, [
'code' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$pid = request('pid', 0);
// 获取配置信息
$appid = \config('app.applet_appid');
$appSecret = \config('app.applet_secret');
$url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $appid . "&secret=" . $appSecret . "&js_code={$all['code']}&grant_type=authorization_code";
$userInfo = json_decode(file_get_contents($url), true);
if (!isset($userInfo['openid'])) {
return $this->fail([ResponseCode::ERROR_PARAMETER, 'code异常']);
}
$user = User::where('openid', $userInfo['openid'])->first();
if (empty($user)) {
$user = User::create([
'openid' => $userInfo['openid'],
'pid' => $pid,
'code' => randStr(8)
]);
if (!empty($pid)) {
// 给上级奖励
$score = Config::getValueByKey('share_score');
ScoreLog::add($pid, $score, '分享获得');
}
}
$token = $user->createToken("mobile-token")->plainTextToken;
return $this->success(compact('token'));
}
/**
* @OA\Get(
* path="/api/mobile/user/account-login",
* tags={"小程序-用户管理"},
* summary="账号密码登陆",
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=false, description="mobile"),
* @OA\Parameter(name="password", in="query", @OA\Schema(type="string"), required=false, description="password"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function accountLogin()
{
$all = \request()->all();
$messages = [
'mobile.required' => '手机号必填',
'password.required' => '密码必填',
];
$validator = Validator::make($all, [
'mobile' => 'required',
'password' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$user = User::where('mobile', $all['mobile'])->where('id', $this->getUserId())->first();
if (!$user || !Hash::check($all['password'], $user->password)) {
return $this->fail([ResponseCode::ERROR_PARAMETER, '账号密码不正确']);
}
return $this->success("验证通过");
}
/**
* @OA\Post(
* path="/api/mobile/user/update-user",
* tags={"小程序-用户管理"},
* summary="更新用户信息",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="认证token"),
* @OA\Parameter(name="openid", in="query", @OA\Schema(type="string"), description="用户的openid"),
* @OA\Parameter(name="sex", in="query", @OA\Schema(type="string"), description="性别男/女"),
* @OA\Parameter(name="nickname", in="query", @OA\Schema(type="string"), description="昵称"),
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), description="手机号"),
* @OA\Parameter(name="country", in="query", @OA\Schema(type="string"), description="国家"),
* @OA\Parameter(name="province", in="query", @OA\Schema(type="string"), description="省份"),
* @OA\Parameter(name="city", in="query", @OA\Schema(type="string"), description="城市"),
* @OA\Parameter(name="headimgurl", in="query", @OA\Schema(type="string"), description="头像url"),
* @OA\Parameter(name="username", in="query", @OA\Schema(type="string"), description="用户名"),
* @OA\Parameter(name="old_password", in="query", @OA\Schema(type="string"), description="旧密码"),
* @OA\Parameter(name="password", in="query", @OA\Schema(type="string"), description="密码"),
* @OA\Parameter(name="name", in="query", @OA\Schema(type="string"), description="名字"),
* @OA\Parameter(name="birthday", in="query", @OA\Schema(type="string"), description="生日"),
* @OA\Parameter(name="email", in="query", @OA\Schema(type="string"), description="邮箱"),
* @OA\Parameter(name="education", in="query", @OA\Schema(type="integer"), description="学历"),
* @OA\Parameter(name="school", in="query", @OA\Schema(type="string"), description="学校"),
* @OA\Parameter(name="speciality", in="query", @OA\Schema(type="string"), description="专业"),
* @OA\Parameter(name="honour", in="query", @OA\Schema(type="string"), description="荣誉"),
* @OA\Parameter(name="introduce", in="query", @OA\Schema(type="string"), description="介绍"),
* @OA\Parameter(name="company_name", in="query", @OA\Schema(type="string"), description="公司名称"),
* @OA\Parameter(name="company_position", in="query", @OA\Schema(type="string"), description="个人职务"),
* @OA\Parameter(name="company_has_share", in="query", @OA\Schema(type="string"), description="是否有股份"),
* @OA\Parameter(name="company_build_date", in="query", @OA\Schema(type="string"), description="公司成立日期"),
* @OA\Parameter(name="company_area", in="query", @OA\Schema(type="string"), description="公司区域"),
* @OA\Parameter(name="company_type", in="query", @OA\Schema(type="string"), description="公司性质"),
* @OA\Parameter(name="company_industry", in="query", @OA\Schema(type="string"), description="公司所属行业"),
* @OA\Parameter(name="company_business", in="query", @OA\Schema(type="string"), description="公司主营业务"),
* @OA\Parameter(name="company_fund", in="query", @OA\Schema(type="string"), description="公司融资情况"),
* @OA\Parameter(name="company_need_fund", in="query", @OA\Schema(type="boolean"), description="公司是否需要融资"),
* @OA\Parameter(name="sign_from", in="query", @OA\Schema(type="string"), description="报名信息来源"),
* @OA\Parameter(name="remark", in="query", @OA\Schema(type="string"), description="备注"),
* @OA\Parameter(name="idcard", in="query", @OA\Schema(type="string"), description="身份证号码"),
* @OA\Parameter(name="plate", in="query", @OA\Schema(type="string"), description="车牌号多个英文逗号分隔"),
* @OA\Parameter(name="type", in="query", @OA\Schema(type="string"), description="人才类型"),
* @OA\Parameter(name="open_course_types", in="query", @OA\Schema(type="string"), description="开放手机号的课程体系多个英文逗号分隔"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function updateUser()
{
$all = \request()->except(['id', 'mobile', 'openid']);
$model = User::find($this->getUserId());
if (isset($all['password'])) {
// 判断旧密码是否正确
if (!Hash::check($all['old_password'], $model->password)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '旧密码不正确']);
}
$model->password = Hash::make($all['password']);
}
if (isset($all['username']) && !empty($all['username'])) {
// 去除左右两边和中间的空格
$all['username'] = str_replace(' ', '', trim($all['username']));
$all['name'] = $all['username'];
}
if (isset($all['name']) && !empty($all['name'])) {
$all['letter'] = strtoupper(Pinyin::abbr(mb_substr($all['name'], 0, 1))[0]);
}
// 如果上传了company_name检测是否包含特殊符号
if (isset($all['company_name']) && !empty($all['company_name'])) {
$validation = Company::validateCompanyName($all['company_name']);
if (!$validation['valid']) {
return $this->fail([ResponseCode::ERROR_BUSINESS, $validation['message']]);
}
}
$model->fill($all);
$model->save();
// 如果有公司信息,就更新一下公司
if (isset($all['company_name']) && !empty($all['company_name']) && $model->company_name != $all['company_name']) {
// 设置待更新标记,由定时任务处理
$model->company_id = -1;
$model->save();
}
// 判断下,如果用户新加入车牌号,并且有未开始或者进行中的预约,则直接预约车牌号
$appointmentModel = Appointment::where('user_id', $this->getUserId())
->where('status', 1)
->where('end_time', '>', date('Y-m-d H:i:s'))
->get();
// 有预约数据并且车牌号不为空
if ($appointmentModel->isNotEmpty() && $model->plate) {
foreach ($appointmentModel as $appointment) {
$appointment->plate = $model->plate;
$appointment->save();
$plateArray = explode(',', $model->plate);
foreach ($plateArray as $plate) {
// 判断是否已预约
$has = ThirdAppointmentLog::where('appointment_id', $appointment->id)
->where('plate', $plate)
->where('plate_status', 1)
->first();
if ($has)
continue;
// 车辆预约
dispatch((new SendAppointCar($appointment, $plate)));
}
}
}
return $this->success('更新成功');
}
/**
* @OA\Get(
* path="/api/mobile/user/get-user-info",
* tags={"小程序-用户管理"},
* summary="获取用户信息",
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=false, description="token"),
* @OA\Response(
* response=200,
* description="操作成功"
* )
* )
*/
public function getUserInfo()
{
$user = User::with('appointments')
->withCount([
'appointments as pass_appointments' => function ($query) {
$query->whereIn('status', [0, 1]);
}
])->with([
'courseSigns' => function ($query) {
$query->whereHas('course')->with('course.typeDetail')->where('status', 1)->where('fee_status', 1);
}
])->find($this->getUserId());
$doorRepository = new DoorRepository();
$door_appointments = Appointment::where('user_id', $this->getUserId())
->where('status', 1)
->orderBy('id', 'desc')
->first();
if ($door_appointments) {
$out = null;
$qrcode = $doorRepository->getEmpQrCode($door_appointments, $out, 2);
$door_appointments->qrcode = ($qrcode !== false && $qrcode !== null) ? $qrcode : null;
}
// 进行中的课程
$course_signs = CourseSign::where('user_id', $this->getUserId())
->with('course')->where('status', 1)
->whereHas('course', function ($query) {
$nowDate = date('Y-m-d');
$query->where('start_date', '<=', $nowDate)->where('end_date', '>=', $nowDate);
})->first();
if ($course_signs) {
$out = null;
$qrcode = $doorRepository->getEmpQrCodeByCourse($course_signs, $out, 2);
$course_signs->qrcode = ($qrcode !== false && $qrcode !== null) ? $qrcode : null;
}
// 是否有资格进入校友库
$enter_schoolmate = User::whereHas('courseSigns', function ($query) {
$query->where('fee_status', 1)->where('status', 1);
})->where('id', $this->getUserId())->count();
// 是否生日
$is_birthday = 0;
if (isset($user->birthday) && date('m-d', strtotime($user->birthday)) == date('m-d')) {
$is_birthday = 1;
}
return $this->success(compact('user', 'door_appointments', 'course_signs', 'enter_schoolmate', 'is_birthday'));
}
/**
* @OA\Get(
* path="/api/mobile/user/mobile",
* tags={"小程序-用户管理"},
* summary="获取微信授权手机号",
* description="",
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=false, description="code"),
* @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"),
* @OA\Response(
* response="200",
* description=""
* )
* )
*/
public function mobile()
{
$all = \request()->all();
$messages = [
'code.required' => 'code必填',
];
$validator = Validator::make($all, [
'code' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([ResponseCode::ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$config = [
'app_id' => \config('app.applet_appid'),
'secret' => \config('app.applet_secret')
];
$app = Factory::miniProgram($config);
$result = $app->phone_number->getUserPhoneNumber($all['code']);
$mobile = $result['phone_info']['purePhoneNumber'] ?? '';
// 判断手机号是否存在
$hasMobile = User::where('mobile', $mobile)->first();
if ($hasMobile) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '手机号已存在']);
}
$hasMobile->mobile = $mobile;
$hasMobile->save();
return $this->success($hasMobile);
}
/**
* @OA\Get(
* path="/api/mobile/user/bind-mobile",
* tags={"手机端-用户管理"},
* summary="验证码绑定手机号",
* description="",
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"),
* @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=true, description="验证码"),
* @OA\Parameter(name="is_bind", 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 bindMobile()
{
$all = \request()->all();
$clientIp = request()->ip();
// 检查IP锁定状态
$lockCheck = Sms::checkIpLock($clientIp, 'bind_mobile');
if ($lockCheck['locked']) {
return $this->fail([ResponseCode::ERROR_BUSINESS, $lockCheck['message']]);
}
$messages = [
'mobile.required' => '手机号必填',
'mobile.numeric' => '手机号格式错误',
'code' => '验证码必填',
'is_bind' => '是否绑定必填',
];
$validator = Validator::make($all, [
'mobile' => 'required|numeric',
'code' => 'required',
'is_bind' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$key = 'sms_' . $all['mobile'];
$check = Cache::get($key);
if (empty($check)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '请先发送验证码']);
}
if ($check['code'] != $all['code']) {
$errorResult = Sms::recordError($clientIp, 'bind_mobile');
return $this->fail([ResponseCode::ERROR_BUSINESS, $errorResult['message']]);
}
// 验证码正确,清除错误计数
Sms::clearError($clientIp, 'bind_mobile');
// 删除验证码缓存
Cache::forget($key);
// 判断手机号是否存在
$hasMobile = User::where('mobile', $all['mobile'])->where('id', '!=', $this->getUserId())->first();
if ($hasMobile) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '手机号已存在']);
}
$model = User::find($this->getUserId());
if ($all['is_bind']) {
$model->mobile = $all['mobile'];
$model->save();
}
return $this->success($model);
}
/**
* @OA\Get(
* path="/api/mobile/user/check-mobile",
* tags={"手机端-用户管理"},
* summary="检测手机号",
* description="",
* @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"),
* @OA\Parameter(name="code", 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 checkMobile()
{
$all = \request()->all();
$clientIp = request()->ip();
// 检查IP锁定状态
$lockCheck = Sms::checkIpLock($clientIp, 'check_mobile');
if ($lockCheck['locked']) {
return $this->fail([ResponseCode::ERROR_BUSINESS, $lockCheck['message']]);
}
$messages = [
'mobile.required' => '手机号必填',
'mobile.numeric' => '手机号格式错误',
'code' => '验证码必填',
];
$validator = Validator::make($all, [
'mobile' => 'required|numeric',
'code' => 'required',
], $messages);
if ($validator->fails()) {
return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$key = 'sms_' . $all['mobile'];
$check = Cache::get($key);
if (empty($check)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '请先发送验证码']);
}
if ($check['code'] != $all['code']) {
$errorResult = Sms::recordError($clientIp, 'check_mobile');
return $this->fail([ResponseCode::ERROR_BUSINESS, $errorResult['message']]);
}
// 验证码正确,清除错误计数
Sms::clearError($clientIp, 'check_mobile');
// 删除验证码缓存
Cache::forget($key);
// 判断手机号是否存在
$hasMobile = User::where('mobile', $all['mobile'])->first();
if ($hasMobile) {
if ($hasMobile->id != $this->getUserId()) {
$openid = $this->getUser()->openid;
$code = $this->getUser()->code ?? randStr(8);
// 当前用户绑定的相关报名,修改成新用户
CourseSign::where('user_id', $this->getUserId())->update(['user_id' => $hasMobile->id]);
// 删除当前用户
User::where('id', $this->getUserId())->delete();
// 旧用户绑定新用户
$hasMobile->openid = $openid;
$hasMobile->code = $code;
$hasMobile->save();
}
$token = $hasMobile->createToken("mobile-token")->plainTextToken;
return $this->success(compact('token'));
}
return $this->fail([ResponseCode::ERROR_BUSINESS, '校友库中还没有您的信息,请先注册']);
}
/**
* @OA\Get (
* path="/api/mobile/user/send-sms",
* tags={"手机端-用户管理"},
* summary="短信发送",
* description="",
* @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 sendSms()
{
$all = \request()->all();
$messages = [
'mobile.required' => '手机号必填',
'mobile.numeric' => '手机号格式错误',
];
$validator = Validator::make($all, [
'mobile' => 'required|numeric',
], $messages);
if ($validator->fails()) {
return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]);
}
$key = 'sms_' . $all['mobile'];
$check = Cache::get($key);
if (isset($check) && time() - $check['time'] <= 60) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '请勿频繁发送']);
}
$code = rand(100000, 999999);
$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, "发送失败"]);
}
/**
* @OA\Post (
* path="/api/mobile/user/update-donates",
* tags={"手机端-用户管理"},
* summary="新增校友捐赠",
* description="",
* @OA\Parameter(name="xxx", 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 updateDonates()
{
$all = request()->all();
$model = (new RelatedModel())->setTable('donates');
$model->fill($all);
$model->save();
// 短信通知审核人
$smsSign = Config::getValueByKey('sms_sign');
$appointment_mobile = Config::getValueByKey('appointment_mobile');
$appointment_mobile = explode(',', $appointment_mobile);
$content = "{$smsSign}您收到一个新捐赠信息,请您登陆管理后台进行查看。";
foreach ($appointment_mobile as $mobile) {
ymSms($mobile, $content);
}
return $this->success("新增成功");
}
public function h5Show()
{
$code = request('code');
if (empty($code)) {
return '编码不存在';
}
$appointment = Appointment::where('code', $code)->first();
if (empty($appointment)) {
return '预约不存在';
}
if ($appointment->status != 1) {
return '预约状态异常';
}
$appointment->start_time = date('Y/m/d', strtotime($appointment->start_time));
$appointment->end_time = date('Y/m/d', strtotime($appointment->end_time));
return view('h5_show', compact('appointment'));
}
/**
* 刷新二维码
*/
public function qrcodeRefresh()
{
$code = request('code');
if (empty($code)) {
return '编码不存在';
}
$appointment = Appointment::where('code', $code)->first();
if (empty($appointment)) {
return '预约不存在';
}
// 获取二维码
$doorRepository = new DoorRepository();
// 获取门禁二维码
$qrcode = $doorRepository->getEmpQrCode($appointment, $out);
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();
$clientIp = request()->ip();
// 检查IP锁定状态
$lockCheck = Sms::checkIpLock($clientIp, 'mobile_login');
if ($lockCheck['locked']) {
return $this->fail([ResponseCode::ERROR_BUSINESS, $lockCheck['message']]);
}
$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']) {
$errorResult = Sms::recordError($clientIp, 'mobile_login');
return $this->fail([ResponseCode::ERROR_BUSINESS, $errorResult['message']]);
}
// 验证码正确,清除错误计数
Sms::clearError($clientIp, 'mobile_login');
// 删除验证码缓存
Cache::forget($key);
$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="course_content_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, '未报名课程']);
}
$user = User::where('mobile', $all['mobile'])->first();
if (empty($user)) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '用户不存在']);
}
$list = CourseContentCheck::where('course_id', $all['course_id'])
->where(function ($query) use ($all) {
if (isset($all['course_content_id'])) {
$query->where('course_content_id', $all['course_content_id']);
}
})->where('user_id', $user->id)
->orderBy('created_at', 'desc')
->get();
if ($list->isNotEmpty()) {
return $this->success($list);
}
$key = 'sms_login_' . $all['mobile'];
$check = Cache::get($key);
if (isset($check) && time() - $check['time'] <= 60) {
return $this->fail([ResponseCode::ERROR_BUSINESS, '请勿频繁发送']);
}
$code = rand(100000, 999999);
$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, "发送失败"]);
}
}