作者 李美松

Merge branch 'develop' into lms

@@ -15,7 +15,7 @@ use App\Models\AyrShare\AyrShare as AyrShareModel; @@ -15,7 +15,7 @@ use App\Models\AyrShare\AyrShare as AyrShareModel;
15 class AyrShareController extends BaseController 15 class AyrShareController extends BaseController
16 { 16 {
17 //生成名称前缀 17 //生成名称前缀
18 - const TITLE = 'global_so_'; 18 + const TITLE = 'globalso';
19 /** 19 /**
20 * @name :(社交列表)lists 20 * @name :(社交列表)lists
21 * @author :lyh 21 * @author :lyh
@@ -82,7 +82,7 @@ class AyrShareController extends BaseController @@ -82,7 +82,7 @@ class AyrShareController extends BaseController
82 public function create_account(AyrShareRequest $ayrShareRequest,AyrShareLogic $ayrShareLogic){ 82 public function create_account(AyrShareRequest $ayrShareRequest,AyrShareLogic $ayrShareLogic){
83 $ayrShareRequest->validated(); 83 $ayrShareRequest->validated();
84 $param = [ 84 $param = [
85 - 'title'=>self::TITLE.$this->user['project_id'].':'.$this->param['name'], 85 + 'title'=>self::TITLE . ':' . $this->user['project_id'] . '-' . $this->param['name'],
86 ]; 86 ];
87 //发送请求注册社交用户 87 //发送请求注册社交用户
88 $ayrShareHelper = new AyrShareHelper(); 88 $ayrShareHelper = new AyrShareHelper();
@@ -9,9 +9,11 @@ use App\Models\AyrShare\AyrRelease as AyrReleaseModel; @@ -9,9 +9,11 @@ use App\Models\AyrShare\AyrRelease as AyrReleaseModel;
9 use App\Models\AyrShare\AyrShare as AyrShareModel; 9 use App\Models\AyrShare\AyrShare as AyrShareModel;
10 use App\Models\Project\Project; 10 use App\Models\Project\Project;
11 use App\Models\Project\Project as ProjectModel; 11 use App\Models\Project\Project as ProjectModel;
  12 +use App\Models\SmsLog;
12 use App\Models\User\ProjectMenu as ProjectMenuModel; 13 use App\Models\User\ProjectMenu as ProjectMenuModel;
13 use App\Models\User\ProjectRole as ProjectRoleModel; 14 use App\Models\User\ProjectRole as ProjectRoleModel;
14 use App\Models\User\User as UserModel; 15 use App\Models\User\User as UserModel;
  16 +use App\Models\User\User;
15 use Carbon\Carbon; 17 use Carbon\Carbon;
16 use Illuminate\Http\Request; 18 use Illuminate\Http\Request;
17 use Illuminate\Support\Facades\Cache; 19 use Illuminate\Support\Facades\Cache;
@@ -29,12 +31,12 @@ class ComController extends BaseController @@ -29,12 +31,12 @@ class ComController extends BaseController
29 */ 31 */
30 public function login(){ 32 public function login(){
31 $this->request->validate([ 33 $this->request->validate([
32 - 'mobile'=>['required'], 34 + 'mobile'=>['required', 'regex:/^1[3-9]\d{9}$/'],
33 'password'=>['required'], 35 'password'=>['required'],
34 ],[ 36 ],[
35 'mobile.required'=>'电话号码必须填写', 37 'mobile.required'=>'电话号码必须填写',
36 'password.required'=>'内容必须填写', 38 'password.required'=>'内容必须填写',
37 - 'mobile.max' => 'mobile不大于12字符.', 39 + 'mobile.regex' => '请输入正确的手机号码',
38 ]); 40 ]);
39 $userModel = new UserModel(); 41 $userModel = new UserModel();
40 $res = $userModel->login($this->param); 42 $res = $userModel->login($this->param);
@@ -120,60 +122,37 @@ class ComController extends BaseController @@ -120,60 +122,37 @@ class ComController extends BaseController
120 $this->response('success'); 122 $this->response('success');
121 } 123 }
122 124
123 -  
124 /** 125 /**
125 - * @name : (测试定时任务)检测用户是否无操作记录  
126 - * @author :lyh  
127 - * @method :post  
128 - * @time :2023/5/12 14:55 126 + * 发送登录短信
  127 + * @param Request $request
  128 + * @return \Illuminate\Http\JsonResponse
129 */ 129 */
130 - protected function ceShi(){  
131 - $this->error = 0;  
132 - //获取所有ayr_share用户  
133 - $ayr_share_model = new AyrShareModel();  
134 - $ayr_share_list = $ayr_share_model->list($this->map);  
135 - if(!empty($ayr_share_list)){  
136 - foreach ($ayr_share_list as $k => $v){  
137 - //查询当前用户是否有未推送的博文  
138 - $ayr_release = new AyrReleaseModel();  
139 - $release_info = $ayr_release->read(['schedule_date'=>['>',date('Y-m-d H:i:s',time())],'share_id'=>$v['id']]);  
140 - //有推文时,直接跳出循环  
141 - if($release_info !== false){  
142 - continue;  
143 - }  
144 - //查看用户是否在一周内有发送博客  
145 - $start_at = Carbon::now()->modify('-7 days')->toDateString();  
146 - $end_at = Carbon::now()->toDateString();  
147 - $release_info = $ayr_release->read(['created_at'=>['between',[$start_at,$end_at]]]);  
148 - //有发送博文,则跳出循环  
149 - if($release_info == false){  
150 - continue;  
151 - }  
152 - //删除用户第三方配置  
153 - $ayr_share_helper = new AyrShareHelper();  
154 - $data_profiles = [  
155 - 'title'=>$v['title'],  
156 - 'profileKey'=>$v['profile_key']  
157 - ];  
158 - $res = $ayr_share_helper->deleted_profiles($data_profiles);  
159 - if($res['status'] == 'fail'){  
160 - $this->error++;  
161 - continue;  
162 - }  
163 - //更新数据库  
164 - $data = [  
165 - 'title'=>null,  
166 - 'bind_plat_from'=>null,  
167 - 'profile_key'=>null,  
168 - 'ref_id'=>null,  
169 - ];  
170 - $res = $ayr_share_model->edit($data,['id'=>$v['id']]);  
171 - if($res == false){  
172 - $this->error++;  
173 - }  
174 - }  
175 - }  
176 - return $this->error; 130 + public function sendLoginSms(Request $request)
  131 + {
  132 + $this->request->validate([
  133 + 'mobile'=>['required', 'regex:/^1[3-9]\d{9}$/'],
  134 + ],[
  135 + 'mobile.required' => '手机号码不能为空',
  136 + 'mobile.regex' => '请输入正确的手机号码',
  137 + ]);
  138 + $mobile = $request->input('mobile');
  139 + $user = User::where(['mobile' => $mobile])->first();
  140 + if (empty($user)) {
  141 + return $this->response('请输入正确的手机号码!', Code::USER_LOGIN_ERROE);
  142 + }
  143 + $last_sms = SmsLog::getLastLog($mobile, SmsLog::TYPE_LOGIN);
  144 + if ($last_sms && $last_sms->use = SmsLog::USE_USABLE && time() - strtotime($last_sms->created_at) < 60) {
  145 + return $this->response('请不要重复发送短信!', Code::USER_LOGIN_ERROE);
  146 + }
  147 + $template = config('alisms.login_sms_temp');
  148 + $code['code'] = rand(100000,999999);
  149 + $ali_sms = new AliSms();
  150 + $send = $ali_sms->sendSms(strval($mobile), $template, $code);
  151 + if (empty($send->Code) && $send->Code != 'OK') {
  152 + return $this->response('发送失败, 请稍后重试!', Code::USER_LOGIN_ERROE);
  153 + }
  154 + SmsLog::createLog($mobile, $code['code']);
  155 + return $this->response('success');
177 } 156 }
178 157
179 } 158 }
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2023/6/3
  6 + * Time: 17:42
  7 + */
  8 +namespace App\Models;
  9 +
  10 +use Illuminate\Database\Eloquent\Model;
  11 +
  12 +class SmsLog extends Model
  13 +{
  14 + //设置关联表名
  15 + protected $table = 'gl_sms_log';
  16 +
  17 + const TYPE_REGISTER = 'register';
  18 + const TYPE_LOGIN = 'login';
  19 + const TYPE_NOTICE = 'notice';
  20 +
  21 + const USE_USABLE = 0;
  22 + const USE_DISABLE = 1;
  23 +
  24 + /**
  25 + * 创建日志
  26 + * @param $mobile
  27 + * @param $code
  28 + * @param $type
  29 + * @param string $content
  30 + * @return mixed
  31 + */
  32 + public static function createLog($mobile, $code, $type = self::TYPE_LOGIN, $content = '')
  33 + {
  34 + $created_at = $updated_at = date('Y-m-d H:i:s');
  35 + $array = compact('type', 'mobile', 'code', 'content', 'updated_at', 'created_at');
  36 + return self::insert($array);
  37 + }
  38 +
  39 + /**
  40 + * 查询最后一条日志
  41 + * @param $mobile
  42 + * @param $type
  43 + * @return mixed
  44 + */
  45 + public static function getLastLog($mobile, $type)
  46 + {
  47 + return self::where(compact('type', 'mobile'))->orderBy('id', 'desc')->first();
  48 + }
  49 +}
@@ -5,6 +5,7 @@ namespace App\Models\User; @@ -5,6 +5,7 @@ namespace App\Models\User;
5 //use Illuminate\Contracts\Auth\MustVerifyEmail; 5 //use Illuminate\Contracts\Auth\MustVerifyEmail;
6 use App\Helper\Common; 6 use App\Helper\Common;
7 use App\Models\Base; 7 use App\Models\Base;
  8 +use App\Models\SmsLog;
8 use App\Models\User\ProjectRole as ProjectRoleModel; 9 use App\Models\User\ProjectRole as ProjectRoleModel;
9 use Illuminate\Database\Eloquent\Factories\HasFactory; 10 use Illuminate\Database\Eloquent\Factories\HasFactory;
10 use Illuminate\Notifications\Notifiable; 11 use Illuminate\Notifications\Notifiable;
@@ -59,18 +60,21 @@ class User extends Base @@ -59,18 +60,21 @@ class User extends Base
59 * @method 60 * @method
60 */ 61 */
61 public function login($param){ 62 public function login($param){
62 - if(!isset($param['login_method'])){  
63 - //密码加密  
64 - $param['password'] = base64_encode(md5($param['password']));  
65 - $info = $this->read(['mobile'=>$param['mobile']  
66 - ,'password'=>$param['password'],'status'=>0], ['id','mobile','role_id','token','name','project_id']);  
67 - }else{  
68 - //TODO::验证验证码是否正确  
69 - $info = $this->read(['mobile'=>$param['mobile']],['*']);  
70 - } 63 + //验证账号密码
  64 + $password = base64_encode(md5($param['password']));
  65 + $info = $this->read(['mobile'=>$param['mobile'],'password'=>$password,'status'=>0], ['id','mobile','role_id','token','name','project_id']);
  66 + if($info === false){
  67 + //账号密码没通过时,验证验证码
  68 + $info = $this->read(['mobile'=>$param['mobile'],'status'=>0], ['id','mobile','role_id','token','name','project_id']);
71 if($info === false){ 69 if($info === false){
72 return false; 70 return false;
73 } 71 }
  72 + //验证验证码是否准备
  73 + $last_sms = SmsLog::getLastLog($param['mobile'], SmsLog::TYPE_LOGIN);
  74 + if($param['password'] != $last_sms->code){
  75 + return false;
  76 + }
  77 + }
74 //当前用户角色是否被禁用 78 //当前用户角色是否被禁用
75 $projectRoleModel = new ProjectRoleModel(); 79 $projectRoleModel = new ProjectRoleModel();
76 $role_info = $projectRoleModel->read(['id'=>$info['role_id'],'status'=>0]); 80 $role_info = $projectRoleModel->read(['id'=>$info['role_id'],'status'=>0]);
@@ -119,5 +123,4 @@ class User extends Base @@ -119,5 +123,4 @@ class User extends Base
119 Cache::pull($info['token']); 123 Cache::pull($info['token']);
120 return true; 124 return true;
121 } 125 }
122 -  
123 } 126 }
@@ -15,7 +15,8 @@ @@ -15,7 +15,8 @@
15 "laravel/sanctum": "^2.11", 15 "laravel/sanctum": "^2.11",
16 "laravel/tinker": "^2.5", 16 "laravel/tinker": "^2.5",
17 "mongodb/mongodb": "^1.6", 17 "mongodb/mongodb": "^1.6",
18 - "phpoffice/phpspreadsheet": "^1.28" 18 + "phpoffice/phpspreadsheet": "^1.28",
  19 + "mrgoon/aliyun-sms": "^2.0"
19 }, 20 },
20 "require-dev": { 21 "require-dev": {
21 "facade/ignition": "^2.5", 22 "facade/ignition": "^2.5",
  1 +<?php
  2 +/**
  3 + * Created by PhpStorm.
  4 + * User: zhl
  5 + * Date: 2023/6/3
  6 + * Time: 17:39
  7 + */
  8 +
  9 +return [
  10 + 'access_key' => env('ALIYUN_SMS_AK'), // accessKey
  11 + 'access_secret' => env('ALIYUN_SMS_AS'), // accessSecret
  12 + 'sign_name' => env('ALIYUN_SMS_SIGN_NAME'), // 签名
  13 + // login
  14 + 'login_sms_temp' => 'SMS_272545773',
  15 + // 注册
  16 + 'register_sms_temp' => 'SMS_272430790',
  17 +];
@@ -293,7 +293,7 @@ Route::middleware(['bloginauth'])->group(function () { @@ -293,7 +293,7 @@ Route::middleware(['bloginauth'])->group(function () {
293 //无需登录验证的路由组 293 //无需登录验证的路由组
294 Route::group([], function () { 294 Route::group([], function () {
295 Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login'); 295 Route::any('/login', [\App\Http\Controllers\Bside\ComController::class, 'login'])->name('login');
296 - Route::any('/', [\App\Http\Controllers\Bside\ComController::class, 'ceShi'])->name('ce_shi'); 296 + Route::any('/sendLoginSms', [\App\Http\Controllers\Bside\ComController::class, 'sendLoginSms'])->name('sendLoginSms');
297 Route::get('/file/download', [\App\Http\Controllers\Bside\FileController::class, 'download'])->name('file_download'); 297 Route::get('/file/download', [\App\Http\Controllers\Bside\FileController::class, 'download'])->name('file_download');
298 Route::any('/image/{hash}/{w?}/{h?}', [\App\Http\Controllers\File\ImageController::class,'index'])->name('image_show'); 298 Route::any('/image/{hash}/{w?}/{h?}', [\App\Http\Controllers\File\ImageController::class,'index'])->name('image_show');
299 Route::any('/file_hash/{hash}', [\App\Http\Controllers\File\FileController::class,'index'])->name('file_show'); 299 Route::any('/file_hash/{hash}', [\App\Http\Controllers\File\FileController::class,'index'])->name('file_show');