作者 邓超

1

正在显示 67 个修改的文件 包含 167 行增加4511 行删除

要显示太多修改。

为保证性能只显示 67 of 67+ 个文件。

1 -root = true  
2 -  
3 -[*]  
4 -charset = utf-8  
5 -end_of_line = lf  
6 -indent_size = 4  
7 -indent_style = space  
8 -insert_final_newline = true  
9 -trim_trailing_whitespace = true  
10 -  
11 -[*.md]  
12 -trim_trailing_whitespace = false  
13 -  
14 -[*.{yml,yaml}]  
15 -indent_size = 2  
16 -  
17 -[docker-compose.yml]  
18 -indent_size = 4  
1 -APP_NAME=Laravel  
2 -APP_ENV=local  
3 -APP_KEY=  
4 -APP_DEBUG=true  
5 -APP_URL=http://localhost  
6 -  
7 -LOG_CHANNEL=stack  
8 -LOG_DEPRECATIONS_CHANNEL=null  
9 -LOG_LEVEL=debug  
10 -  
11 -DB_CONNECTION=mysql  
12 -DB_HOST=127.0.0.1  
13 -DB_PORT=3306  
14 -DB_DATABASE=laravel  
15 -DB_USERNAME=root  
16 -DB_PASSWORD=  
17 -  
18 -BROADCAST_DRIVER=log  
19 -CACHE_DRIVER=file  
20 -FILESYSTEM_DISK=local  
21 -QUEUE_CONNECTION=sync  
22 -SESSION_DRIVER=file  
23 -SESSION_LIFETIME=120  
24 -  
25 -MEMCACHED_HOST=127.0.0.1  
26 -  
27 -REDIS_HOST=127.0.0.1  
28 -REDIS_PASSWORD=null  
29 -REDIS_PORT=6379  
30 -  
31 -MAIL_MAILER=smtp  
32 -MAIL_HOST=mailpit  
33 -MAIL_PORT=1025  
34 -MAIL_USERNAME=null  
35 -MAIL_PASSWORD=null  
36 -MAIL_ENCRYPTION=null  
37 -MAIL_FROM_ADDRESS="hello@example.com"  
38 -MAIL_FROM_NAME="${APP_NAME}"  
39 -  
40 -AWS_ACCESS_KEY_ID=  
41 -AWS_SECRET_ACCESS_KEY=  
42 -AWS_DEFAULT_REGION=us-east-1  
43 -AWS_BUCKET=  
44 -AWS_USE_PATH_STYLE_ENDPOINT=false  
45 -  
46 -PUSHER_APP_ID=  
47 -PUSHER_APP_KEY=  
48 -PUSHER_APP_SECRET=  
49 -PUSHER_HOST=  
50 -PUSHER_PORT=443  
51 -PUSHER_SCHEME=https  
52 -PUSHER_APP_CLUSTER=mt1  
53 -  
54 -VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"  
55 -VITE_PUSHER_HOST="${PUSHER_HOST}"  
56 -VITE_PUSHER_PORT="${PUSHER_PORT}"  
57 -VITE_PUSHER_SCHEME="${PUSHER_SCHEME}"  
58 -VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"  
1 -* text=auto  
2 -  
3 -*.blade.php diff=html  
4 -*.css diff=css  
5 -*.html diff=html  
6 -*.md diff=markdown  
7 -*.php diff=php  
8 -  
9 -/.github export-ignore  
10 -CHANGELOG.md export-ignore  
11 -.styleci.yml export-ignore  
1 -<p align="center"><a href="https://laravel.com" target="_blank"><img src="https://raw.githubusercontent.com/laravel/art/master/logo-lockup/5%20SVG/2%20CMYK/1%20Full%20Color/laravel-logolockup-cmyk-red.svg" width="400" alt="Laravel Logo"></a></p>  
2 -  
3 -<p align="center">  
4 -<a href="https://github.com/laravel/framework/actions"><img src="https://github.com/laravel/framework/workflows/tests/badge.svg" alt="Build Status"></a>  
5 -<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/dt/laravel/framework" alt="Total Downloads"></a>  
6 -<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/v/laravel/framework" alt="Latest Stable Version"></a>  
7 -<a href="https://packagist.org/packages/laravel/framework"><img src="https://img.shields.io/packagist/l/laravel/framework" alt="License"></a>  
8 -</p>  
9 -  
10 -## About Laravel  
11 -  
12 -Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:  
13 -  
14 -- [Simple, fast routing engine](https://laravel.com/docs/routing).  
15 -- [Powerful dependency injection container](https://laravel.com/docs/container).  
16 -- Multiple back-ends for [session](https://laravel.com/docs/session) and [cache](https://laravel.com/docs/cache) storage.  
17 -- Expressive, intuitive [database ORM](https://laravel.com/docs/eloquent).  
18 -- Database agnostic [schema migrations](https://laravel.com/docs/migrations).  
19 -- [Robust background job processing](https://laravel.com/docs/queues).  
20 -- [Real-time event broadcasting](https://laravel.com/docs/broadcasting).  
21 -  
22 -Laravel is accessible, powerful, and provides tools required for large, robust applications.  
23 -  
24 -## Learning Laravel  
25 -  
26 -Laravel has the most extensive and thorough [documentation](https://laravel.com/docs) and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.  
27 -  
28 -You may also try the [Laravel Bootcamp](https://bootcamp.laravel.com), where you will be guided through building a modern Laravel application from scratch.  
29 -  
30 -If you don't feel like reading, [Laracasts](https://laracasts.com) can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript. Boost your skills by digging into our comprehensive video library.  
31 -  
32 -## Laravel Sponsors  
33 -  
34 -We would like to extend our thanks to the following sponsors for funding Laravel development. If you are interested in becoming a sponsor, please visit the Laravel [Patreon page](https://patreon.com/taylorotwell).  
35 -  
36 -### Premium Partners  
37 -  
38 -- **[Vehikl](https://vehikl.com/)**  
39 -- **[Tighten Co.](https://tighten.co)**  
40 -- **[Kirschbaum Development Group](https://kirschbaumdevelopment.com)**  
41 -- **[64 Robots](https://64robots.com)**  
42 -- **[Cubet Techno Labs](https://cubettech.com)**  
43 -- **[Cyber-Duck](https://cyber-duck.co.uk)**  
44 -- **[Many](https://www.many.co.uk)**  
45 -- **[Webdock, Fast VPS Hosting](https://www.webdock.io/en)**  
46 -- **[DevSquad](https://devsquad.com)**  
47 -- **[Curotec](https://www.curotec.com/services/technologies/laravel/)**  
48 -- **[OP.GG](https://op.gg)**  
49 -- **[WebReinvent](https://webreinvent.com/?utm_source=laravel&utm_medium=github&utm_campaign=patreon-sponsors)**  
50 -- **[Lendio](https://lendio.com)**  
51 -  
52 -## Contributing  
53 -  
54 -Thank you for considering contributing to the Laravel framework! The contribution guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions).  
55 -  
56 -## Code of Conduct  
57 -  
58 -In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).  
59 -  
60 -## Security Vulnerabilities  
61 -  
62 -If you discover a security vulnerability within Laravel, please send an e-mail to Taylor Otwell via [taylor@laravel.com](mailto:taylor@laravel.com). All security vulnerabilities will be promptly addressed.  
63 -  
64 -## License  
65 -  
66 -The Laravel framework is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).  
1 -<?php  
2 -  
3 -namespace App\Console\Commands;  
4 -  
5 -use App\Models\EList;  
6 -use Helper\Mail\Mail;  
7 -use Illuminate\Console\Command;  
8 -use function Co\run;  
9 -  
10 -class Demo extends Command  
11 -{  
12 - /**  
13 - * The name and signature of the console command.  
14 - *  
15 - * @var string  
16 - */  
17 - protected $signature = 'demo';  
18 -  
19 - /**  
20 - * The console command description.  
21 - *  
22 - * @var string  
23 - */  
24 - protected $description = '测试命令';  
25 -  
26 - /**  
27 - * Execute the console command.  
28 - *  
29 - * @return int  
30 - */  
31 - public function handle()  
32 - {  
33 -  
34 -// run(function (){  
35 -// go(function (){  
36 -//  
37 -//  
38 -// $redis = swoole_redis();  
39 -////// $a = $redis->eval(...swoole_redis_add('asdad:1',1,600));  
40 -////// var_dump($a);  
41 -// for ($i=1;$i<=345;$i++){  
42 -// $redis->rPush('syncMailBody',$i);  
43 -// }  
44 -//  
45 -//// $redis->rPush('syncMailBody',301);  
46 -//// $redis->rPush('syncMailBody',302);  
47 -//// $redis->rPush('syncMailBody',303);  
48 -//// $redis->rPush('syncMailBody',304);  
49 -//// $redis->rPush('syncMailBody',305);  
50 -//// $redis->rPush('syncMailBody',306);  
51 -//// $redis->rPush('syncMailBody',307);  
52 -//// $redis->rPush('syncMailBody',308);  
53 -//// $redis->rPush('syncMailBody',309);  
54 -//  
55 -// $redis->set('syncmailbodystop',1);  
56 -//  
57 -// });  
58 -//  
59 -// });  
60 -//  
61 -  
62 -  
63 -  
64 -  
65 - return Command::SUCCESS;  
66 - }  
67 -  
68 -  
69 -  
70 -}  
1 -<?php  
2 -  
3 -namespace App\Console\Commands;  
4 -  
5 -use App\Models\EList;  
6 -use App\Models\Email;  
7 -use App\Models\Folder;  
8 -use Helper\Mail\Mail;  
9 -use Illuminate\Console\Command;  
10 -use Illuminate\Support\Facades\Cache;  
11 -use Illuminate\Support\Facades\Log;  
12 -use Swoole\Coroutine\MySQL;  
13 -use Swoole\Coroutine\Redis;  
14 -use function Co\run;  
15 -  
16 -class SyncBody extends Command  
17 -{  
18 - /**  
19 - * The name and signature of the console command.  
20 - *  
21 - * @var string  
22 - */  
23 - protected $signature = 'SyncBody';  
24 -  
25 - /**  
26 - * The console command description.  
27 - *  
28 - * @var string  
29 - */  
30 - protected $description = '同步邮箱中邮件的内容';  
31 -  
32 - /**  
33 - * Execute the console command.  
34 - *  
35 - * @return int  
36 - */  
37 - public function handle()  
38 - {  
39 -  
40 - // 携程数量越大,需要的内存越大  
41 - $max_coroutine = 1000;  
42 - // 最大携程数量  
43 - \co::set(['max_coroutine'=>$max_coroutine]);  
44 -  
45 - run(function (){  
46 - // 删除key  
47 - swoole_redis()->delete('syncmailbodystop');  
48 -  
49 - // 先开100个携程  
50 - for ($i = 100; $i > 0; $i--) {  
51 - // 创建携程  
52 - go(function () {  
53 - // 需要获取邮件的id  
54 - $isRun = true;  
55 - // @var $redis 这个必须放携程里面  
56 - $redis = swoole_redis();  
57 - $db = swoole_db();  
58 - while ($isRun){  
59 -  
60 - // 获取到邮件的数据id  
61 - $id = $redis->lPop('syncMailBody');  
62 -  
63 - if($id){  
64 - $this->sync($redis,$db,$id);  
65 - }else {  
66 - // 暂停1秒  
67 - \co::sleep(1);  
68 - }  
69 -  
70 -  
71 - // 是否暂停同步  
72 - if($redis->get('syncmailbodystop') == 1){  
73 - $isRun = false;  
74 - }  
75 -  
76 - }  
77 -// 关闭redis  
78 - $redis->close();  
79 - $redis = null;  
80 -  
81 - $db->close();  
82 - $db = null;  
83 -  
84 - });  
85 - }  
86 -  
87 -  
88 - });  
89 -  
90 - return Command::SUCCESS;  
91 - }  
92 -  
93 -  
94 - /**  
95 - * 执行  
96 - * @param $redis Redis  
97 - * @param $db MySQL  
98 - * @param $id  
99 - * @author:dc  
100 - * @time 2023/2/8 11:44  
101 - */  
102 - public function sync(&$redis,$db,$id){  
103 - try {  
104 - // 先暂用,锁上这个id  
105 - if($redis->eval(...swoole_redis_add('syncmailbodyrun:'.$id,$id,3))){  
106 - $this->echoStr('number:'.$id);  
107 - // 读取邮件信息  
108 - $mail = swoole_db_first(  
109 - $db,  
110 - 'select `id`,`uid`,`msgno`,`folder_id`,`email_id` from `lists` where `id` = '.$id  
111 - );  
112 - if(!$mail){  
113 - return false;  
114 - }  
115 -  
116 - $email_id = $mail['email_id'];  
117 - $folder_id = $mail['folder_id'];  
118 -  
119 - /*** 获取邮箱信息 ***/  
120 - $email_key = 'email_list:'.$email_id;  
121 - // 判断是否有携程在查询了  
122 - if($redis->eval(...swoole_redis_add($email_key,1,600))){  
123 - // 查询邮箱  
124 - $emailModel = swoole_db_first(  
125 - $db,  
126 - 'select * from `emails` where `id` = '.$email_id  
127 - );  
128 - if($emailModel){  
129 - // 设置缓存  
130 - $redis->set($email_key,$emailModel,600);  
131 - }else {  
132 - // 删除缓存  
133 - $redis->delete($email_key);  
134 - }  
135 - }else {  
136 - // 等待读取缓存  
137 - $is_while = 1;  
138 - while (true){  
139 - $emailModel = $redis->get($email_key);  
140 - // 等待中没有邮箱信息,跳过  
141 - if(!$emailModel || is_array($emailModel) || $is_while>100){  
142 - break;  
143 - }  
144 - $is_while++;  
145 - // 暂停0.5秒  
146 - \co::sleep(0.5);  
147 - }  
148 - }  
149 -  
150 - /*** end 获取邮箱信息 ***/  
151 - if($emailModel){  
152 - $this->echoStr('找到:'.$emailModel['email']);  
153 - $email = $emailModel['email'];  
154 - $password = $emailModel['password'];  
155 - $imap = $emailModel['imap'];  
156 -  
157 - /** 获取文件夹等情况 **/  
158 - $folder_key = 'email_folder:'.$folder_id;  
159 - if($redis->eval(...swoole_redis_add($folder_key,1,600))){  
160 - // 查询邮箱  
161 - $folder_name = Folder::getOriginName($folder_id);  
162 - if($folder_name){  
163 - // 设置缓存  
164 - $redis->set($folder_key,$folder_name,600);  
165 - }else {  
166 - // 删除缓存  
167 - $redis->delete($folder_key);  
168 - }  
169 - }else {  
170 - // 等待读取缓存  
171 - $is_while = 1; // 防止死循环  
172 - while ($is_while){  
173 - $folder_name = $redis->get($folder_key);  
174 - // 等待中没有邮箱信息,跳过  
175 - if(!$folder_name || $folder_name!=1 || $is_while>=100){  
176 - break;  
177 - }  
178 - $is_while++;  
179 - // 暂停0.5秒  
180 - \co::sleep(0.5);  
181 - }  
182 - }  
183 - $this->echoStr('目录:'.$folder_name);  
184 - if($folder_name){  
185 - // 登录imap服务器  
186 - Mail::login($email,$password,$imap);  
187 - // 设置id  
188 - Mail::$client[$email]->setId($email_id);  
189 -  
190 - Mail::syncBody(  
191 - $id,  
192 - $mail['msgno'],  
193 - $email_id,  
194 - $folder_name,  
195 - $email  
196 - );  
197 - }  
198 - }  
199 -  
200 - }  
201 -  
202 - }catch (\Throwable $e){  
203 - echo "协程(".\co::getCid()."): ".$e->getMessage().PHP_EOL.$e->getTraceAsString();  
204 - Log::error($e->getMessage().$e->getTraceAsString());  
205 - // 再次发布  
206 - $redis->rPush('syncMailBody',$id);  
207 - }  
208 -  
209 - return true;  
210 - }  
211 -  
212 - public function echoStr(string $str){  
213 - echo '协程('.\co::getCid().'): '.$str.PHP_EOL;  
214 - }  
215 -  
216 -  
217 -}  
1 -<?php  
2 -//  
3 -//namespace App\Console\Commands;  
4 -//  
5 -//use App\Models\Email;  
6 -//use App\Models\Folder;  
7 -//use Helper\Mail\Mail;  
8 -//use Illuminate\Console\Command;  
9 -//use Illuminate\Support\Facades\Cache;  
10 -//use Illuminate\Support\Facades\Log;  
11 -//use function Co\run;  
12 -//  
13 -//class SyncFolder extends Command  
14 -//{  
15 -// /**  
16 -// * The name and signature of the console command.  
17 -// *  
18 -// * @var string  
19 -// */  
20 -// protected $signature = 'SyncFolder';  
21 -//  
22 -// /**  
23 -// * The console command description.  
24 -// *  
25 -// * @var string  
26 -// */  
27 -// protected $description = '同步邮箱的文件夹';  
28 -//  
29 -// /**  
30 -// * Execute the console command.  
31 -// *  
32 -// * @return int  
33 -// */  
34 -// public function handle()  
35 -// {  
36 -//  
37 -// // 这个是防止前一个任务没有完成,反而无法取得资源。  
38 -// $rand = date('dHi');  
39 -// // 携程数量越大,需要的内存越大  
40 -// $max_coroutine = 10000;  
41 -// // 最大携程数量  
42 -// \co::set(['max_coroutine'=>$max_coroutine]);  
43 -//  
44 -// run(function () use ($rand){  
45 -// // 获取邮箱总数量  
46 -// $size = Email::where(['status'=>1,'pwd_error'=>0])->count();  
47 -//// Cache::set('syncMail:total',$size);  
48 -// // 创建的携程数量  
49 -// $max_coroutine = $size > 3000 ? 3000 : $size;  
50 -// if ($max_coroutine){  
51 -// for ($i = $max_coroutine; $i > 0; $i--) {  
52 -// // 创建携程  
53 -// go(function () use ($size,$rand){  
54 -//// Log::error('携程:'.\co::getCid());  
55 -//  
56 -// $n = 0;  
57 -// while ($n <= $size){  
58 -// // 是否已存在  
59 -// if(Cache::add('syncMail'.$rand.':'.$n,$n,7200)) {  
60 -// $this->sync($n);  
61 -// }  
62 -// $n++;  
63 -// }  
64 -//  
65 -// });  
66 -// }  
67 -// }  
68 -//  
69 -// });  
70 -//  
71 -// return Command::SUCCESS;  
72 -// }  
73 -//  
74 -// /**  
75 -// * 开始同步执行  
76 -// * @param int $n 第几条数据  
77 -// * @author:dc  
78 -// * @time 2023/2/5 17:21  
79 -// */  
80 -// private function sync(int $n = 0){  
81 -//  
82 -// $email = Email::where(['status'=>1,'pwd_error'=>0])  
83 -// ->orderBy('id','asc')  
84 -// ->select()->limit($n,1)  
85 -// ->first();  
86 -//  
87 -// if($email){  
88 -// // 登录imap服务器  
89 -// Mail::login($email->email,$email->password,$email->imap);  
90 -// // 设置id  
91 -// Mail::$client[$email]->setId($email->id);  
92 -// // 同步文件夹  
93 -// Mail::syncFolder($email->email);  
94 -//  
95 -// // 获取当前邮箱的所有文件夹  
96 -// $folders = Folder::_all($email->id);  
97 -// // 目前只发现最高2级  
98 -// foreach ($folders as $folder){  
99 -// if(empty($folder['_child'])){  
100 -// // 同步邮件  
101 -// Mail::syncMail($email->email,$folder['origin_folder']);  
102 -// }else{  
103 -// // 循环子级目录,有子级的情况,父级不可操作,且不会有邮件  
104 -// foreach ($folder['_child'] as $f){  
105 -// // 同步邮件  
106 -// Mail::syncMail($email->email,$folder['origin_folder'].'/'.$f['origin_folder']);  
107 -// }  
108 -// }  
109 -//  
110 -// }  
111 -//  
112 -//  
113 -//  
114 -// }  
115 -//  
116 -// }  
117 -//  
118 -//  
119 -//  
120 -//}  
1 -<?php  
2 -  
3 -namespace App\Console\Commands;  
4 -  
5 -use App\Models\Email;  
6 -use App\Models\Folder;  
7 -use Helper\Mail\Mail;  
8 -use Illuminate\Console\Command;  
9 -use Illuminate\Support\Facades\Cache;  
10 -use Illuminate\Support\Facades\Log;  
11 -use Swoole\Coroutine\MySQL;  
12 -use Swoole\Coroutine\Redis;  
13 -use function Co\run;  
14 -  
15 -class SyncMailList extends Command  
16 -{  
17 - /**  
18 - * The name and signature of the console command.  
19 - *  
20 - * @var string  
21 - */  
22 - protected $signature = 'SyncMailList';  
23 -  
24 - /**  
25 - * The console command description.  
26 - *  
27 - * @var string  
28 - */  
29 - protected $description = '同步邮箱的邮件到本地';  
30 -  
31 - /**  
32 - * Execute the console command.  
33 - *  
34 - * @return int  
35 - */  
36 - public function handle()  
37 - {  
38 -  
39 - // 这个是防止前一个任务没有完成,反而无法取得资源。  
40 - $rand = date('dHi');  
41 - // 携程数量越大,需要的内存越大  
42 - $max_coroutine = 10000;  
43 - // swoole全局设置,需要在swoole运行前设置  
44 - \co::set([  
45 - 'max_coroutine'=>$max_coroutine, // 最大携程数量  
46 - 'hook_flags'=>SWOOLE_HOOK_TCP, // redis需要的配置  
47 - ]);  
48 -  
49 -  
50 - run(function () use ($rand,$max_coroutine){  
51 - // 获取邮箱总数量  
52 - $size = Email::where([])->count();  
53 - // 最后一条数据的id  
54 - $lastId = Email::where([])->orderBy('id','desc')->value('id');  
55 - // 创建的携程数量  
56 - $max_coroutine = $size > $max_coroutine ? $max_coroutine : $size;  
57 - if ($max_coroutine){  
58 - for ($i = $max_coroutine; $i > 0; $i--) {  
59 - // 创建携程  
60 - go(function () use ($size,$rand,$lastId){  
61 -  
62 - // redis 携程中无法使用laravel的cache的redis驱动  
63 - $redis = swoole_redis();  
64 - $db = swoole_db();  
65 - $n = 1;  
66 - while ($n <= $lastId){  
67 - echo 'syncMail'.$rand.':'.$n;echo PHP_EOL;  
68 - // 使用lua脚本  
69 - $add = $redis->eval(  
70 - ...swoole_redis_add('syncMail'.$rand.':'.$n,$n,7200)  
71 - );  
72 - // 是否已存在  
73 - if($add) {  
74 - try {  
75 - $this->sync($n,$db);  
76 - }catch (\Throwable $e){  
77 - echo "协程(".\co::getCid()."):".$e->getMessage();  
78 - }  
79 -  
80 - }  
81 -  
82 - $n++;  
83 - }  
84 - $redis->close();  
85 - $db->close();  
86 - $redis = $db = null;  
87 -  
88 - });  
89 - }  
90 - }  
91 -  
92 - });  
93 -  
94 - return Command::SUCCESS;  
95 - }  
96 -  
97 - /**  
98 - * 开始同步执行  
99 - * @param int $n  
100 - * @param MySQL $db  
101 - * @author:dc  
102 - * @time 2023/2/9 11:40  
103 - */  
104 - private function sync(int $n,MySQL $db){  
105 -  
106 - /** @var $email Email */  
107 - $email = swoole_db_first(  
108 - $db,  
109 - 'select * from `emails` where `id` = '.$n  
110 - );  
111 -  
112 - // 密码没有错误,且状态正常的  
113 - if ($email && $email['pwd_error'] == 0 && $email['status'] == Email::STATUS_ACTIVE){  
114 - // 登录imap服务器  
115 - Mail::login($email['email'],base64_decode($email['password']),$email['imap']);  
116 - // 设置id  
117 - Mail::$client[$email['email']]->setId($email['id']);  
118 - // 同步文件夹  
119 - Mail::syncFolder($email['email']);  
120 -  
121 - // 获取当前邮箱的所有文件夹  
122 - $folders = Folder::_all($email['id']);  
123 - // 目前只发现最高2级  
124 - foreach ($folders as $folder){  
125 - if(empty($folder['_child'])){  
126 - // 同步邮件  
127 - Mail::syncMail($email['email'],$email['id'],$folder['id'],$folder['origin_folder']);  
128 - }else{  
129 - // 循环子级目录,有子级的情况,父级不可操作,且不会有邮件  
130 - foreach ($folder['_child'] as $f){  
131 - // 同步邮件  
132 - Mail::syncMail($email['email'],$email['id'],$f['id'],$folder['origin_folder'].'/'.$f['origin_folder']);  
133 - }  
134 - }  
135 -  
136 - }  
137 - }  
138 -  
139 - }  
140 -  
141 -  
142 -  
143 -}  
1 -<?php  
2 -  
3 -namespace App\Console;  
4 -  
5 -use Illuminate\Console\Scheduling\Schedule;  
6 -use Illuminate\Foundation\Console\Kernel as ConsoleKernel;  
7 -  
8 -class Kernel extends ConsoleKernel  
9 -{  
10 - /**  
11 - * Define the application's command schedule.  
12 - *  
13 - * @param \Illuminate\Console\Scheduling\Schedule $schedule  
14 - * @return void  
15 - */  
16 - protected function schedule(Schedule $schedule)  
17 - {  
18 - // $schedule->command('inspire')->hourly();  
19 - }  
20 -  
21 - /**  
22 - * Register the commands for the application.  
23 - *  
24 - * @return void  
25 - */  
26 - protected function commands()  
27 - {  
28 - $this->load(__DIR__.'/Commands');  
29 -  
30 - require base_path('routes/console.php');  
31 - }  
32 -}  
1 -<?php  
2 -  
3 -namespace App\Exceptions;  
4 -  
5 -use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;  
6 -use Throwable;  
7 -  
8 -class Handler extends ExceptionHandler  
9 -{  
10 - /**  
11 - * A list of exception types with their corresponding custom log levels.  
12 - *  
13 - * @var array<class-string<\Throwable>, \Psr\Log\LogLevel::*>  
14 - */  
15 - protected $levels = [  
16 - //  
17 - ];  
18 -  
19 - /**  
20 - * A list of the exception types that are not reported.  
21 - *  
22 - * @var array<int, class-string<\Throwable>>  
23 - */  
24 - protected $dontReport = [  
25 - //  
26 - ];  
27 -  
28 - /**  
29 - * A list of the inputs that are never flashed to the session on validation exceptions.  
30 - *  
31 - * @var array<int, string>  
32 - */  
33 - protected $dontFlash = [  
34 - 'current_password',  
35 - 'password',  
36 - 'password_confirmation',  
37 - ];  
38 -  
39 - /**  
40 - * Register the exception handling callbacks for the application.  
41 - *  
42 - * @return void  
43 - */  
44 - public function register()  
45 - {  
46 - $this->reportable(function (Throwable $e) {  
47 - //  
48 - });  
49 - }  
50 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Controllers;  
4 -  
5 -use Illuminate\Foundation\Auth\Access\AuthorizesRequests;  
6 -use Illuminate\Foundation\Bus\DispatchesJobs;  
7 -use Illuminate\Foundation\Validation\ValidatesRequests;  
8 -use Illuminate\Routing\Controller as BaseController;  
9 -  
10 -class Controller extends BaseController  
11 -{  
12 - use AuthorizesRequests, DispatchesJobs, ValidatesRequests;  
13 -}  
1 -<?php  
2 -  
3 -namespace App\Http;  
4 -  
5 -use Illuminate\Foundation\Http\Kernel as HttpKernel;  
6 -  
7 -class Kernel extends HttpKernel  
8 -{  
9 - /**  
10 - * The application's global HTTP middleware stack.  
11 - *  
12 - * These middleware are run during every request to your application.  
13 - *  
14 - * @var array<int, class-string|string>  
15 - */  
16 - protected $middleware = [  
17 - // \App\Http\Middleware\TrustHosts::class,  
18 - \App\Http\Middleware\TrustProxies::class,  
19 - \Illuminate\Http\Middleware\HandleCors::class,  
20 - \App\Http\Middleware\PreventRequestsDuringMaintenance::class,  
21 - \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,  
22 - \App\Http\Middleware\TrimStrings::class,  
23 - \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,  
24 - ];  
25 -  
26 - /**  
27 - * The application's route middleware groups.  
28 - *  
29 - * @var array<string, array<int, class-string|string>>  
30 - */  
31 - protected $middlewareGroups = [  
32 - 'web' => [  
33 - \App\Http\Middleware\EncryptCookies::class,  
34 - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,  
35 - \Illuminate\Session\Middleware\StartSession::class,  
36 - \Illuminate\View\Middleware\ShareErrorsFromSession::class,  
37 - \App\Http\Middleware\VerifyCsrfToken::class,  
38 - \Illuminate\Routing\Middleware\SubstituteBindings::class,  
39 - ],  
40 -  
41 - 'api' => [  
42 - // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,  
43 - 'throttle:api',  
44 - \Illuminate\Routing\Middleware\SubstituteBindings::class,  
45 - ],  
46 - ];  
47 -  
48 - /**  
49 - * The application's route middleware.  
50 - *  
51 - * These middleware may be assigned to groups or used individually.  
52 - *  
53 - * @var array<string, class-string|string>  
54 - */  
55 - protected $routeMiddleware = [  
56 - 'auth' => \App\Http\Middleware\Authenticate::class,  
57 - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,  
58 - 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class,  
59 - 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,  
60 - 'can' => \Illuminate\Auth\Middleware\Authorize::class,  
61 - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,  
62 - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,  
63 - 'signed' => \App\Http\Middleware\ValidateSignature::class,  
64 - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,  
65 - 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,  
66 - ];  
67 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Auth\Middleware\Authenticate as Middleware;  
6 -  
7 -class Authenticate extends Middleware  
8 -{  
9 - /**  
10 - * Get the path the user should be redirected to when they are not authenticated.  
11 - *  
12 - * @param \Illuminate\Http\Request $request  
13 - * @return string|null  
14 - */  
15 - protected function redirectTo($request)  
16 - {  
17 - if (! $request->expectsJson()) {  
18 - return route('login');  
19 - }  
20 - }  
21 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Cookie\Middleware\EncryptCookies as Middleware;  
6 -  
7 -class EncryptCookies extends Middleware  
8 -{  
9 - /**  
10 - * The names of the cookies that should not be encrypted.  
11 - *  
12 - * @var array<int, string>  
13 - */  
14 - protected $except = [  
15 - //  
16 - ];  
17 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance as Middleware;  
6 -  
7 -class PreventRequestsDuringMaintenance extends Middleware  
8 -{  
9 - /**  
10 - * The URIs that should be reachable while maintenance mode is enabled.  
11 - *  
12 - * @var array<int, string>  
13 - */  
14 - protected $except = [  
15 - //  
16 - ];  
17 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use App\Providers\RouteServiceProvider;  
6 -use Closure;  
7 -use Illuminate\Http\Request;  
8 -use Illuminate\Support\Facades\Auth;  
9 -  
10 -class RedirectIfAuthenticated  
11 -{  
12 - /**  
13 - * Handle an incoming request.  
14 - *  
15 - * @param \Illuminate\Http\Request $request  
16 - * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next  
17 - * @param string|null ...$guards  
18 - * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse  
19 - */  
20 - public function handle(Request $request, Closure $next, ...$guards)  
21 - {  
22 - $guards = empty($guards) ? [null] : $guards;  
23 -  
24 - foreach ($guards as $guard) {  
25 - if (Auth::guard($guard)->check()) {  
26 - return redirect(RouteServiceProvider::HOME);  
27 - }  
28 - }  
29 -  
30 - return $next($request);  
31 - }  
32 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;  
6 -  
7 -class TrimStrings extends Middleware  
8 -{  
9 - /**  
10 - * The names of the attributes that should not be trimmed.  
11 - *  
12 - * @var array<int, string>  
13 - */  
14 - protected $except = [  
15 - 'current_password',  
16 - 'password',  
17 - 'password_confirmation',  
18 - ];  
19 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Http\Middleware\TrustHosts as Middleware;  
6 -  
7 -class TrustHosts extends Middleware  
8 -{  
9 - /**  
10 - * Get the host patterns that should be trusted.  
11 - *  
12 - * @return array<int, string|null>  
13 - */  
14 - public function hosts()  
15 - {  
16 - return [  
17 - $this->allSubdomainsOfApplicationUrl(),  
18 - ];  
19 - }  
20 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Http\Middleware\TrustProxies as Middleware;  
6 -use Illuminate\Http\Request;  
7 -  
8 -class TrustProxies extends Middleware  
9 -{  
10 - /**  
11 - * The trusted proxies for this application.  
12 - *  
13 - * @var array<int, string>|string|null  
14 - */  
15 - protected $proxies;  
16 -  
17 - /**  
18 - * The headers that should be used to detect proxies.  
19 - *  
20 - * @var int  
21 - */  
22 - protected $headers =  
23 - Request::HEADER_X_FORWARDED_FOR |  
24 - Request::HEADER_X_FORWARDED_HOST |  
25 - Request::HEADER_X_FORWARDED_PORT |  
26 - Request::HEADER_X_FORWARDED_PROTO |  
27 - Request::HEADER_X_FORWARDED_AWS_ELB;  
28 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Routing\Middleware\ValidateSignature as Middleware;  
6 -  
7 -class ValidateSignature extends Middleware  
8 -{  
9 - /**  
10 - * The names of the query string parameters that should be ignored.  
11 - *  
12 - * @var array<int, string>  
13 - */  
14 - protected $except = [  
15 - // 'fbclid',  
16 - // 'utm_campaign',  
17 - // 'utm_content',  
18 - // 'utm_medium',  
19 - // 'utm_source',  
20 - // 'utm_term',  
21 - ];  
22 -}  
1 -<?php  
2 -  
3 -namespace App\Http\Middleware;  
4 -  
5 -use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;  
6 -  
7 -class VerifyCsrfToken extends Middleware  
8 -{  
9 - /**  
10 - * The URIs that should be excluded from CSRF verification.  
11 - *  
12 - * @var array<int, string>  
13 - */  
14 - protected $except = [  
15 - //  
16 - ];  
17 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -  
7 -/**  
8 - * 邮件body  
9 - * @time 2022/7/29 15:09  
10 - * Class EmailList  
11 - * @package App\Mail\Models  
12 - */  
13 -class Body extends Model{  
14 -  
15 - const UPDATED_AT = null;  
16 -  
17 - const CREATED_AT = null;  
18 -  
19 - // 主键  
20 - protected $primaryKey = 'email_lists_id';  
21 -  
22 - /**  
23 - * 是否转换成html实体,返回前端时要注意,邮件内容的编码不统一,会导致程序异常  
24 - * @var bool  
25 - */  
26 - public $is_base64_de = true;  
27 -  
28 - /**  
29 - * 内容  
30 - * @param $v  
31 - * @return array|mixed  
32 - * @author:dc  
33 - * @time 2022/10/25 11:44  
34 - */  
35 - public function getTextHtmlAttribute($v)  
36 - {  
37 - if($v){  
38 - $v = json_decode($v,true);  
39 -  
40 - if($this->is_base64_de){  
41 - $v = self::_base64($v,false);  
42 - }  
43 - }  
44 -  
45 - return $v;  
46 - }  
47 -  
48 -  
49 - /**  
50 - * 查询一条  
51 - * @param int $email_lists_id  
52 - * @return mixed  
53 - * @time 2022/8/2 14:14  
54 - */  
55 - public static function _first(int $email_lists_id){  
56 - return static::where('email_lists_id',$email_lists_id)->first();  
57 - }  
58 -  
59 - /**  
60 - * 插入  
61 - * @param $id  
62 - * @param $text_html  
63 - * @return bool  
64 - * @time 2022/8/2 14:59  
65 - */  
66 - public static function _insert($id,$text_html){  
67 - $model = new static();  
68 - $model->email_lists_id = $id;  
69 -  
70 - $model->text_html = json_encode(self::_base64($text_html));  
71 - return $model->save();  
72 - }  
73 -  
74 -  
75 - /**  
76 - * 挨个进行base64处理,避免出现乱码无法存储,编码不统一  
77 - * @param $content  
78 - * @param bool $is_en  
79 - * @return array|mixed  
80 - * @author:dc  
81 - * @time 2022/8/12 14:49  
82 - */  
83 - private static function _base64($content, $is_en = true){  
84 - if($content){  
85 - if(is_array($content)){  
86 - foreach ($content as $key=>$item){  
87 - if(is_array($item)){  
88 - $content[$key] = self::_base64($item, $is_en);  
89 - }else{  
90 - $content[$key] = $is_en ? base64_encode($item) : base64_decode($item);  
91 - }  
92 - }  
93 - }  
94 - }  
95 - return $content;  
96 - }  
97 -  
98 -  
99 -  
100 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use App\Repositories\LengthAwarePaginator;  
6 -use Illuminate\Container\Container;  
7 -use Illuminate\Database\Eloquent\Model;  
8 -use Illuminate\Pagination\Paginator;  
9 -  
10 -/**  
11 - * 邮件列表  
12 - * @time 2022/7/29 15:09  
13 - * Class EmailList  
14 - * @package App\Mail\Models  
15 - */  
16 -class EList extends Model{  
17 -  
18 - /**  
19 - * 表名  
20 - * @var string  
21 - */  
22 - protected $table = 'lists';  
23 -  
24 - /**  
25 - * 追加自动完成  
26 - * @var string[]  
27 - */  
28 - protected $appends = ['to_time'];  
29 -  
30 - // 收到的时间  
31 - public function getToTimeAttribute()  
32 - {  
33 - if($this->udate){  
34 - $date = date('Y-m-d',$this->udate);  
35 - if($date==date('Y-m-d')){  
36 - return date('今天 H:i',$this->udate);  
37 - }  
38 - return $date;  
39 - }  
40 - return '';  
41 - }  
42 -  
43 -  
44 - /**  
45 - * 批量插入  
46 - * @param array $datas  
47 - * @return array  
48 - * @time 2022/8/1 18:14  
49 - */  
50 - public static function _insertAll(array $datas){  
51 - $ids = [];  
52 - foreach ($datas as $data){  
53 - try {  
54 - if($data['id']){  
55 - $id = $data['id'];  
56 - }else{  
57 - $id = static::where('uuid',$data['uuid'])->value('id');  
58 - }  
59 - unset($data['id']);  
60 - if($id){  
61 - static::where('id',$id)->update($data);  
62 - }else{  
63 - $id = static::insertGetId($data);  
64 - }  
65 -  
66 - if($id){  
67 - $ids[] = $id;  
68 -  
69 - // 插入列表,方便脚本读取邮件内容  
70 - $redis = swoole_redis();  
71 - $redis->rPush('syncMailBody',$id);  
72 -  
73 - }  
74 - }catch (\Throwable $e){  
75 - EmailLog::error([$data,$e->getMessage(),$e->getTraceAsString()]);  
76 - }  
77 - }  
78 - return $ids;  
79 - }  
80 -  
81 - /**  
82 - * 来自某某标题  
83 - * @param $val  
84 - * @return string  
85 - * @author:dc  
86 - * @time 2022/10/24 17:04  
87 - */  
88 - public function getFromAttribute($val)  
89 - {  
90 - if($val){  
91 - return htmlspecialchars($val);  
92 - }  
93 - return '';  
94 -  
95 - }  
96 -  
97 - /**  
98 - * 最后一次获取到邮件的时间,以收到时间为准,发送时间有时没有  
99 - * @param int $email_id  
100 - * @param int $folder_id  
101 - * @return mixed  
102 - * @time 2022/8/1 17:32  
103 - */  
104 - public static function _lastDate(int $email_id, int $folder_id = 0 ){  
105 - return static::where(['email_id'=>$email_id,'folder_id'=>$folder_id])  
106 - ->orderBy('udate','desc')  
107 - ->value('udate');  
108 - }  
109 -  
110 - /**  
111 - * 获取邮件消息序号最大的一个,邮件序号是可变的  
112 - * @param int $email_id  
113 - * @param int $folder_id  
114 - * @return mixed  
115 - * @author:dc  
116 - * @time 2022/10/27 13:48  
117 - */  
118 - public static function _lastMsgno(int $email_id, int $folder_id = 0 ){  
119 - return static::where(['email_id'=>$email_id,'folder_id'=>$folder_id])  
120 - ->max('msgno');  
121 - }  
122 -  
123 - /**  
124 - * 查询某天已存在的uid  
125 - * @param string $email_id  
126 - * @param int $date  
127 - * @param int $folder_id  
128 - * @return array  
129 - * @time 2022/8/4 15:27  
130 - */  
131 - public static function _lastExistUid(string $email_id, int $date, int $folder_id = 0 ):array {  
132 - $uids = static::where(['email_id'=>$email_id,'folder_id'=>$folder_id])  
133 - ->where('udate','>',$date)  
134 - ->get(['uid'])  
135 - ->pluck('uid','uid')  
136 - ->toArray();  
137 - return $uids ? $uids : [];  
138 - }  
139 -  
140 - /**  
141 - * 查询详情  
142 - * @param int $id  
143 - * @return \Illuminate\Database\Eloquent\Builder|Model|object|null  
144 - * @time 2022/8/2 14:25  
145 - */  
146 - public static function _firstWithBody(int $id){  
147 - return static::with('body')->where('id',$id)->first();  
148 - }  
149 -  
150 - /**  
151 - * 查询列表  
152 - * @param $where  
153 - * @param int $perPage  
154 - * @param int $total  
155 - * @return mixed|object  
156 - * @throws \Illuminate\Contracts\Container\BindingResolutionException  
157 - * @time 2022/8/16 17:34  
158 - */  
159 - public static function _paginate($where, int $perPage = 20, $total = 0){  
160 -  
161 - $currentPage = Paginator::resolveCurrentPage();  
162 -  
163 - if(!$total){  
164 - $total = static::where($where)->count();  
165 - }  
166 -  
167 - $items = static::where($where)->orderBy('udate','desc')->orderBy('id','desc')->forPage($currentPage, $perPage)->get();  
168 -  
169 - $options = [  
170 - 'path' => Paginator::resolveCurrentPath(),  
171 - 'pageName' => 'page',  
172 - ];  
173 -  
174 - return Container::getInstance()->makeWith(LengthAwarePaginator::class, compact(  
175 - 'items', 'total', 'perPage', 'currentPage', 'options'  
176 - ));  
177 -  
178 - }  
179 -  
180 - /**  
181 - * 未读邮件,只有inbox才有  
182 - * @param $email_ids  
183 - * @return mixed  
184 - * @author:dc  
185 - * @time 2022/10/31 17:21  
186 - */  
187 - public static function _getUnseenNum($email_ids){  
188 - return static::whereIn('email_id',$email_ids)->where('seen',0)->count();  
189 - }  
190 -  
191 -  
192 - /**  
193 - * 一条数据  
194 - * @param $id  
195 - * @return array  
196 - * @author:dc  
197 - * @time 2022/11/8 22:38  
198 - */  
199 - public static function _first($id){  
200 - $data = static::where('id',$id)->first();  
201 - return $data ? $data->toArray() : [];  
202 - }  
203 -  
204 -  
205 - /**  
206 - * 关于body  
207 - * @return \Illuminate\Database\Eloquent\Relations\HasOne  
208 - * @time 2022/8/2 14:25  
209 - */  
210 - public function body(){  
211 - return $this->hasOne(Body::class,'email_lists_id','id');  
212 - }  
213 -  
214 -  
215 - /**  
216 - * 更加id获取邮件的uid  
217 - * @param array $ids  
218 - * @param int $email_id  
219 - * @return array  
220 - * @author:dc  
221 - * @time 2022/10/26 17:28  
222 - */  
223 - public static function _getUidsByIds(array $ids, int $email_id):array {  
224 - $uids = static::whereIn('id',$ids)->where('email_id',$email_id)->get(['id','uid'])->pluck('uid','id')->toArray();  
225 - return is_array($uids) ? $uids : [];  
226 - }  
227 -  
228 - /**  
229 - * 设置标记  
230 - * @param array $ids  
231 - * @param int $email_id  
232 - * @param string $key  
233 - * @param int $value  
234 - * @return bool  
235 - * @author:dc  
236 - * @time 2022/10/26 17:43  
237 - */  
238 - public static function _setFlags(array $ids, int $email_id, string $key, int $value):bool{  
239 - return static::whereIn('id',$ids)->where('email_id',$email_id)->update([$key=>$value]);  
240 - }  
241 -  
242 -  
243 - /**  
244 - * 根据编号查询id  
245 - * @param $email_id  
246 - * @param $folder  
247 - * @param $msgno  
248 - * @return mixed  
249 - * @author:dc  
250 - * @time 2022/11/8 17:38  
251 - */  
252 - public static function _getIdsByMsgno($email_id,$folder,$msgno){  
253 - return static::where([  
254 - 'email_id'=>$email_id,  
255 - 'folder_id' =>$folder  
256 - ])  
257 - ->whereIn('msgno',$msgno)  
258 - ->get(['id','msgno'])->pluck('id','msgno')->toArray();  
259 - }  
260 -  
261 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -use Illuminate\Support\Facades\DB;  
7 -  
8 -/**  
9 - * 邮箱  
10 - * @time 2022/7/29 15:09  
11 - * Class Email  
12 - * @package App\Mail\Models  
13 - */  
14 -class Email extends Model {  
15 -  
16 - // 启用  
17 - const STATUS_ACTIVE = 1;  
18 - // 禁用  
19 - const STATUS_DISABLED = 0;  
20 -  
21 -  
22 - /**  
23 - * @param string $v  
24 - * @return mixed|string  
25 - * @time 2022/7/29 17:34  
26 - */  
27 - public function getPasswordAttribute($v)  
28 - {  
29 - return $v ? @base64_decode($v) : '';  
30 - }  
31 -  
32 - /**  
33 - * 添加邮箱  
34 - * @param int $user_id  
35 - * @param string $email  
36 - * @param string $password  
37 - * @param string $email_name  
38 - * @param array $host  
39 - * @return false|static  
40 - * @time 2022/8/17 11:12  
41 - */  
42 - public static function _add(int $user_id, string $email, string $password='', string $email_name = '',$host = []) {  
43 - // 这里可以用事务提交,允许断层  
44 -  
45 - // 是否已存在邮箱  
46 - $model = static::where('email',$email)->first();  
47 - if(!$model){  
48 - // 新增  
49 - $model = new static();  
50 - $model->email = $email;  
51 - }  
52 -  
53 - $password && $model->password = encrypt($password);  
54 - $model->status = self::STATUS_ACTIVE;  
55 - $model->email_name = $email_name;  
56 - if(!empty($host['imap'])){  
57 - $model->imap = $host['imap'];  
58 - }  
59 - if(!empty($host['smtp'])){  
60 - $model->smtp = $host['smtp'];  
61 - }  
62 -  
63 - if(!$model->save()){  
64 - return false;  
65 - }  
66 -  
67 - // 是否已绑定  
68 - $userEmail = EmailJoinUser::isBind($user_id,$model->id);  
69 - if(!$userEmail){  
70 - if(!EmailJoinUser::insert([  
71 - 'user_id' => $user_id,  
72 - 'email_id' => $model->id  
73 - ])){  
74 - return false;  
75 - };  
76 - }  
77 -  
78 - return $model;  
79 - }  
80 -  
81 -  
82 - /**  
83 - * 修改密码  
84 - * @param string $email  
85 - * @param string $password  
86 - * @return bool  
87 - * @time 2022/7/29 17:32  
88 - */  
89 - public static function _changePwd(string $email, string $password):bool {  
90 - $data = static::where([  
91 - 'email' => $email  
92 - ])  
93 - ->first();  
94 -  
95 - if($data){  
96 - $data->password = encrypt($password);  
97 - $data->pwd_error = 0;  
98 - $data->save();  
99 - }  
100 - return false;  
101 - }  
102 -  
103 -  
104 - /**  
105 - * 读取列表  
106 - * @return mixed  
107 - * @author:dc  
108 - * @time 2023/2/5 14:27  
109 - */  
110 - public static function _all() {  
111 - $lists = static::where([  
112 - 'status' => self::STATUS_ACTIVE,  
113 - 'pwd_error' => 0,  
114 - ])->get();  
115 - return $lists;  
116 - }  
117 -  
118 -  
119 -  
120 - public static function _getById($user_id){  
121 - return DB::table('email_join_users as eu')  
122 - ->leftJoin('emails as e','eu.email_id','=','e.id')  
123 - ->where([  
124 -// 'eu.user_id'=>$user_id,  
125 - 'e.status' => self::STATUS_ACTIVE  
126 - ])->get(['e.id'])  
127 - ->toArray();  
128 - }  
129 -  
130 - /**  
131 - * 读取一条  
132 - * @param string $email  
133 - * @return mixed  
134 - * @author:dc  
135 - * @time 2023/2/4 15:50  
136 - */  
137 - public static function _first(string $email) {  
138 - return static::where([  
139 - 'email' => $email  
140 - ])  
141 - ->first();  
142 - }  
143 -  
144 - /**  
145 - * 根据主键获取数据  
146 - * @param $id  
147 - * @return array  
148 - * @author:dc  
149 - * @time 2022/10/24 11:38  
150 - */  
151 - public static function _firstById($id):array {  
152 - $data = static::where('id',$id)->first();  
153 -  
154 - return $data ? $data->toArray() : [];  
155 - }  
156 -  
157 -  
158 - /**  
159 - * 禁用邮箱  
160 - * @param string $email  
161 - * @return bool  
162 - * @time 2022/7/29 16:18  
163 - */  
164 - public static function disabled(string $email):bool{  
165 - $data = static::where([  
166 - 'email' => $email,  
167 - ])->first();  
168 -  
169 - if ($data){  
170 - $data->status = self::STATUS_DISABLED;  
171 - return $data->save();  
172 - }  
173 - return false;  
174 - }  
175 -  
176 - /**  
177 - * 启用  
178 - * @param string $email  
179 - * @return bool  
180 - * @time 2022/7/29 16:20  
181 - */  
182 - public static function active(string $email):bool{  
183 - $data = static::where([  
184 - 'email' => $email,  
185 - ])->first();  
186 -  
187 - if ($data){  
188 - $data->status = self::STATUS_ACTIVE;  
189 - return $data->save();  
190 - }  
191 - return false;  
192 - }  
193 -  
194 -  
195 - /**  
196 - * 更新  
197 - * @param $where  
198 - * @param $data  
199 - * @return mixed  
200 - * @time 2022/8/1 15:54  
201 - */  
202 - public static function _update($where,$data){  
203 - return static::where($where)->update($data);  
204 - }  
205 -  
206 - /**  
207 - * @param $email  
208 - * @return mixed  
209 - * @time 2022/8/17 11:38  
210 - */  
211 - public static function _getIds($email){  
212 - return static::where('email',is_array($email)?'in':'=',$email)->get(['id'])->pluck('id')->toArray();  
213 - }  
214 -  
215 -  
216 - /**  
217 - * 读取发布同步任务 的 列表  
218 - * @param int $p 分页  
219 - * @return mixed  
220 - * @author:dc  
221 - * @time 2023/2/6 11:25  
222 - */  
223 - public static function getPushEmailList(int $p){  
224 - $emails = Email::where(['status'=>1,'pwd_error'=>0])  
225 - ->orderBy('id','asc')  
226 - ->select()  
227 - ->limit($p*100,100)  
228 - ->get();  
229 -  
230 - return $emails->isEmpty() ? [] :$emails;  
231 - }  
232 -  
233 -  
234 -  
235 -  
236 -  
237 -  
238 -  
239 -  
240 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -  
7 -/**  
8 - * 邮箱联系人  
9 - * @time 2022/7/29 15:09  
10 - * Class EmailList  
11 - * @package App\Mail\Models  
12 - */  
13 -class EmailContact extends Model{  
14 -  
15 - /**  
16 - * 当前邮箱下的所有联系人  
17 - * @param $mail_id  
18 - * @return mixed  
19 - * @time 2022/8/3 16:45  
20 - */  
21 - public static function _all($mail_id,$is_group=false){  
22 - return static::with($is_group ? 'group' : [])->where(['email_id' => $mail_id, 'is_del' => 0])  
23 - ->orderBy('id','desc')  
24 - ->get(['id','email','email_name','group_id'])  
25 - ->toArray();  
26 - }  
27 -  
28 -// public static function _paginate($mail_id)  
29 -// {  
30 -// return static::where(['email_id' => $mail_id, 'is_del' => 0])  
31 -// ->get(['id','email','email_name'])  
32 -// ->toArray();  
33 -//  
34 -// }  
35 -  
36 - /**  
37 - * 添加联系人  
38 - * @param $mail_id  
39 - * @param $email  
40 - * @param $name  
41 - * @return static  
42 - * @time 2022/8/3 16:35  
43 - */  
44 - public static function _save($mail_id,$data){  
45 - if (!empty($data['id'])){  
46 - $model = static::where(['id'=>$data['id'],'email_id'=>$mail_id])->first();  
47 - if(!$model){  
48 - goto EmailContactNewSave;  
49 - }  
50 - }else{  
51 - EmailContactNewSave:  
52 - $model = new static();  
53 - $model->email_id = $mail_id;  
54 - }  
55 -  
56 - $model->group_id = $data['group_id'];  
57 - $model->email = $data['email'];  
58 - $model->email_name = $data['email_name'];  
59 - $model->remark = $data['remark']??'';  
60 - $model->is_del = 0;  
61 - $model->save();  
62 - return $model;  
63 - }  
64 -  
65 -  
66 - /**  
67 - * 删除  
68 - * @param int $email_id  
69 - * @param int $id  
70 - * @return mixed  
71 - * @time 2022/8/4 9:57  
72 - */  
73 - public static function _del(int $email_id, int $id){  
74 - return static::where(['id'=>$id,'email_id'=>$email_id])->update([  
75 - 'is_del' => 1,  
76 - 'updated_at' => date('Y-m-d H:i:s')  
77 - ]);  
78 - }  
79 -  
80 -  
81 - /**  
82 - * 读取一条信息  
83 - * @param $email_id  
84 - * @param $id  
85 - * @param false $is_del  
86 - * @return array  
87 - * @author:dc  
88 - * @time 2022/11/4 16:39  
89 - */  
90 - public static function _first($email_id,$id, $is_del = false){  
91 - $data = static::where([  
92 - 'email_id' => $email_id,  
93 - 'id' => $id,  
94 - 'is_del' => $is_del ? 1 : 0  
95 - ])->first();  
96 -  
97 - return $data ? $data->toArray() : [];  
98 - }  
99 -  
100 -  
101 -  
102 -  
103 -  
104 - public function group(){  
105 - return $this->hasOne(EmailContactGroup::class,'id','group_id')->where('is_del',0)->select(['id','group_name']);  
106 - }  
107 -  
108 -  
109 - /**  
110 - * @param $group_id  
111 - * @param $email_id  
112 - * @return mixed  
113 - * @author:dc  
114 - * @time 2022/11/4 14:30  
115 - */  
116 - public static function _count($group_id,$email_id){  
117 - return static::where(['email_id'=>$email_id,'group_id'=>$group_id,'is_del'=>0])->count();  
118 - }  
119 -  
120 -  
121 -  
122 -  
123 -  
124 -  
125 -  
126 -  
127 -  
128 -  
129 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -use Illuminate\Support\Facades\DB;  
7 -  
8 -/**  
9 - * 邮箱联系分组  
10 - * @time 2022/7/29 15:09  
11 - * Class EmailContactGroup  
12 - * @package App\Mail\Models  
13 - */  
14 -class EmailContactGroup extends Model{  
15 -  
16 - /**  
17 - * 当前邮箱下的所有联系人  
18 - * @param $mail_id  
19 - * @return mixed  
20 - * @time 2022/8/3 16:45  
21 - */  
22 - public static function _all(int $mail_id,$is_contact=false){  
23 - return static::with($is_contact?'contacts':[])  
24 - ->where(['email_id' => $mail_id, 'is_del' => 0])  
25 - ->get(['id','group_name'])  
26 - ->toArray();  
27 - }  
28 -  
29 - /**  
30 - * 关联联系人  
31 - * @return \Illuminate\Database\Eloquent\Relations\HasMany  
32 - * @author:dc  
33 - * @time 2022/11/5 9:43  
34 - */  
35 - public function contacts(){  
36 - return $this->hasMany(EmailContact::class,'group_id','id')  
37 - ->where(['is_del'=>0])->select(['id','email','email_name','group_id']);  
38 - }  
39 -  
40 - /**  
41 - * 添加联系人  
42 - * @param int $mail_id  
43 - * @param string $name  
44 - * @param int $id  
45 - * @return static  
46 - * @author:dc  
47 - * @time 2022/11/4 11:21  
48 - */  
49 - public static function _save(int $mail_id, string $name,$id = 0){  
50 -  
51 - if($id) {  
52 - $model = static::where(['id' => $id, 'email_id' => $mail_id])->first();  
53 - if (!$model){  
54 - return new static;  
55 - }  
56 - } else {  
57 - $model = new static();  
58 - $model->email_id = $mail_id;  
59 - }  
60 -  
61 - $model->group_name = $name;  
62 - $model->save();  
63 - return $model;  
64 - }  
65 -  
66 - /**  
67 - * 查询一条  
68 - * @param int $mail_id  
69 - * @param string $name  
70 - * @author:dc  
71 - * @time 2022/11/3 10:42  
72 - */  
73 - public static function _firstByName(int $mail_id, string $name){  
74 - return static::where(['email_id'=>$mail_id,'group_name'=>$name,'is_del'=>0])->first();  
75 - }  
76 -  
77 -  
78 - /**  
79 - * 删除  
80 - * @param int $id  
81 - * @param int $email_id  
82 - * @return mixed  
83 - * @time 2022/8/4 10:49  
84 - */  
85 - public static function _del(int $id, int $email_id){  
86 - return static::where(['id'=>$id,'email_id'=>$email_id])->update([  
87 - 'is_del' => 1,  
88 - 'updated_at' => date('Y-m-d H:i:s')  
89 - ]);  
90 - }  
91 -  
92 -  
93 - /**  
94 - * 读取一条信息  
95 - * @param $id  
96 - * @param false $is_del  
97 - * @return mixed  
98 - * @time 2022/8/3 16:52  
99 - */  
100 - public static function _first(int $id, bool $is_del = false){  
101 - $data = static::where([  
102 - 'id' => $id,  
103 - 'is_del' => $is_del ? 1 : 0  
104 - ])->first();  
105 -  
106 - return $data ? $data->toArray() : [];  
107 - }  
108 -  
109 -  
110 -  
111 -  
112 -  
113 -  
114 -  
115 -  
116 -  
117 -  
118 -  
119 -  
120 -  
121 -  
122 -  
123 -  
124 -  
125 -  
126 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -  
7 -/**  
8 - * 关系表  
9 - * @time 2022/7/29 15:09  
10 - * Class EmailJoinUser  
11 - * @package App\Mail\Models  
12 - */  
13 -class EmailJoinUser extends Model {  
14 -  
15 -  
16 - /**  
17 - * @param $user_id  
18 - * @param $email_id  
19 - * @return mixed  
20 - * @author:dc  
21 - * @time 2022/10/25 15:04  
22 - */  
23 - public static function isBind($user_id,$email_id){  
24 - return static::where(['email_id'=>$email_id,'user_id'=>$user_id])->count();  
25 - }  
26 -  
27 - /**  
28 - * @param $user_id  
29 - * @return mixed  
30 - * @author:dc  
31 - * @time 2022/10/25 15:04  
32 - */  
33 - public static function getEmailIds($user_id){  
34 - return static::where('user_id',$user_id)->get(['email_id'])->pluck('email_id')->toArray();  
35 - }  
36 -  
37 -  
38 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -use Illuminate\Support\Facades\Log;  
7 -  
8 -/**  
9 - * 邮件日志记录,一般只用于观察  
10 - * @time 2022/7/29 15:09  
11 - * Class EmailList  
12 - * @package App\Mail\Models  
13 - */  
14 -class EmailLog extends Model{  
15 -  
16 -  
17 - public static function error($message){  
18 -  
19 - try {  
20 - if($message instanceof \Throwable){  
21 - $message = [$message->getMessage(),$message->getTraceAsString()];  
22 - }  
23 -  
24 - static::insert([  
25 - 'error' => print_r($message,true),  
26 - 'datetime' => date('Y-m-d H:i:s')  
27 - ]);  
28 - }catch (\Throwable $e){  
29 - Log::error(print_r($message,true));  
30 - }  
31 -  
32 - }  
33 -  
34 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -use Illuminate\Support\Facades\DB;  
7 -use Illuminate\Support\Facades\Log;  
8 -  
9 -/**  
10 - * 邮件发送任务  
11 - * @author:dc  
12 - * @time 2022/11/9 11:17  
13 - * Class EmailSendJob  
14 - * @package App\Http\Mail\Models  
15 - */  
16 -class EmailSendJob extends Model{  
17 -  
18 - const STATUS_RUNING = 1;  
19 - const STATUS_WAIT = 0;  
20 - const STATUS_SUCCESS = 2;  
21 -  
22 - const STATUS_DISCARD = 3;  
23 -  
24 -  
25 -  
26 - /**  
27 - * 新增一个job  
28 - * @param $data  
29 - * @return false|mixed  
30 - * @throws \Throwable  
31 - * @author:dc  
32 - * @time 2022/11/9 11:34  
33 - */  
34 - public static function _insert($data){  
35 - $model = new static();  
36 -  
37 - $model->email_id = $data['email_id'];// 发送邮件的id,好像要随机发送  
38 - $model->the_manage_id = $data['the_manage_id'];  
39 - $model->user_id = $data['user_id'];  
40 - if(isset($data['data']['to'])){unset($data['data']['to']);}  
41 - $model->maildata = json_encode($data['data']);  
42 - $model->title = $data['title'];  
43 - $model->total = sizeof($data['to']);  
44 - $model->send_time = $data['send_time']; // 发送时间  
45 - $model->tags = implode(',',$data['tags']??[]); // tag标签  
46 - DB::beginTransaction();  
47 - if($model->save()){  
48 - foreach ($data['to'] as $email){  
49 - $id = EmailSendJobStatu::insertGetId([  
50 - 'job_id' => $model->id,  
51 - 'to_email' => $email['email'],  
52 - 'status' => 0,  
53 - 'created_at' => date('Y-m-d H:i:s')  
54 - ]);  
55 - if(!$id){  
56 - DB::rollBack();  
57 - return false;  
58 - }  
59 - }  
60 - DB::commit();  
61 - return $model->id;  
62 - }  
63 - DB::rollBack();  
64 - return false;  
65 - }  
66 -  
67 -  
68 - public function getStatusTextAttribute($key)  
69 - {  
70 - switch ($this->status){  
71 - case self::STATUS_WAIT:{  
72 - return '等待中';  
73 - }  
74 - case self::STATUS_RUNING:{  
75 - return '发送中';  
76 - }  
77 - case self::STATUS_SUCCESS:{  
78 - return '已完成';  
79 - }  
80 - case self::STATUS_DISCARD:{  
81 - return '废弃';  
82 - }  
83 - }  
84 - return '';  
85 - }  
86 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -  
7 -  
8 -/**  
9 - * 邮件发送任务,状态  
10 - * @author:dc  
11 - * @time 2022/11/9 11:17  
12 - * Class EmailSendJob  
13 - * @package App\Http\Mail\Models  
14 - */  
15 -class EmailSendJobStatu extends Model{  
16 -  
17 - const STATUS_WAIT = 0; // 等待发送  
18 - const STATUS_SUCCESS = 1; // 发送成功  
19 - const STATUS_ERROR = 2; // 发送失败  
20 - const STATUS_STOP = 3; // 暂停发送  
21 -  
22 - static $status_text = [  
23 - self::STATUS_WAIT => '等待',  
24 - self::STATUS_SUCCESS => '成功',  
25 - self::STATUS_ERROR => '失败',  
26 - self::STATUS_STOP => '暂停',  
27 - ];  
28 -  
29 -  
30 - public function getStatusTextAttribute()  
31 - {  
32 - return static::$status_text[$this->status];  
33 - }  
34 -  
35 -  
36 -  
37 - public function getErrorAttribute($val)  
38 - {  
39 -  
40 - return $val ? json_decode($val,true) : [];  
41 - }  
42 -  
43 - public function getLinksAttribute($val)  
44 - {  
45 - return $val ? json_decode($val,true) : [];  
46 - }  
47 -  
48 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use App\Mail\lib\MailFun;  
6 -use Illuminate\Database\Eloquent\Model;  
7 -  
8 -/**  
9 - * 邮件文件夹  
10 - * @time 2022/8/1 11:26  
11 - * Class EmailFolder  
12 - * @package App\Mail\Models  
13 - */  
14 -class Folder extends Model {  
15 -  
16 - const UPDATED_AT = null;  
17 -  
18 - const CREATED_AT = null;  
19 -  
20 - static $allData;  
21 -  
22 - /**  
23 - *  
24 - * @param $email_id  
25 - * @param bool $is_tree  
26 - * @return array  
27 - * @author:dc  
28 - * @time 2022/11/8 14:32  
29 - */  
30 - public static function _all($email_id, $is_tree = true):array {  
31 -  
32 - if(is_array($email_id)){  
33 - $folders = static::where('is_del',0)  
34 - ->whereIn('email_id',$email_id);  
35 - }else{  
36 - $folders = static::where([  
37 - 'email_id'=>$email_id,  
38 - 'is_del' => 0  
39 - ]);  
40 - }  
41 -  
42 - $folders = $folders  
43 - ->get(['id','folder','pid','exsts','unseen','origin_folder'])  
44 - ->toArray();  
45 -  
46 - if(is_array($email_id)){  
47 - $fs = [];  
48 - foreach ($email_id as $item){  
49 - foreach ($folders as $folder){  
50 - if($item == $folder['email_id']){  
51 - $fs[$item][] = $folder;  
52 - }  
53 - }  
54 - }  
55 -  
56 - foreach ($fs as $fk=>$f){  
57 - $fs[$fk] = list_to_tree($f);  
58 - }  
59 -  
60 - return $fs;  
61 - }else{  
62 - if($folders && $is_tree){  
63 - $folders = list_to_tree($folders);  
64 - }  
65 -  
66 - return $folders ? $folders : [];  
67 - }  
68 -  
69 - }  
70 -  
71 - /**  
72 - * 查询一条  
73 - * @param $id  
74 - * @param false $is_del  
75 - * @return mixed  
76 - * @time 2022/8/17 9:14  
77 - */  
78 - public static function _first($id){  
79 - return static::where('id',$id)->get()->toArray();  
80 - }  
81 -  
82 - /**  
83 - * @param $id  
84 - * @param $email_id  
85 - * @return mixed  
86 - * @author:dc  
87 - * @time 2022/10/26 10:10  
88 - */  
89 - public static function _firstAndEmailId($id,$email_id){  
90 - return static::where(['id'=>$id,'email_id'=>$email_id])->get()->toArray();  
91 - }  
92 -  
93 - /**  
94 - * 获取文件夹id  
95 - * @param $email_id  
96 - * @param string $folder  
97 - * @return mixed  
98 - * @author:dc  
99 - * @time 2022/11/8 14:44  
100 - */  
101 - public static function _user_folders($email_id,$folder='INBOX'){  
102 - $where = [  
103 -// 'user_id'=>$user_id,  
104 - 'is_del' => 0,  
105 - 'folder' => $folder  
106 - ];  
107 -// if($email_id) $where['email_id'] = $email_id;  
108 -  
109 - return static::where($where)  
110 - ->where(function ($query)use($email_id){  
111 - if(is_array($email_id)){  
112 - $query->whereIn('email_id',$email_id);  
113 - }else{  
114 - $query->where('email_id',$email_id);  
115 - }  
116 - })  
117 - ->get(['id','exsts','unseen'])  
118 - ->toArray();  
119 - }  
120 -  
121 - /**  
122 - * 删除  
123 - * @param int $id  
124 - * @param string $folder  
125 - * @return bool  
126 - * @time 2022/8/4 15:23  
127 - */  
128 - public static function _del(int $id, string $folder = ''):bool {  
129 -  
130 - $where = [];  
131 - if($folder){  
132 - $where['email_id'] = $id;  
133 - $where['folder'] = $folder;  
134 - }else{  
135 - $where['id'] = $id;  
136 - }  
137 - $where['is_del'] = 0;  
138 - // 已删除  
139 - if(static::where($where)->value('id')){  
140 - return true;  
141 - }  
142 -  
143 - unset($where['is_del']);  
144 -  
145 - return static::where($where)  
146 - ->update(['is_del'=>1]);  
147 - }  
148 -  
149 - /**  
150 - * 插入  
151 - * @param int $email_id  
152 - * @param string $name  
153 - * @param string $origin_name  
154 - * @param int $pid  
155 - * @return mixed  
156 - * @time 2022/8/5 17:36  
157 - */  
158 - public static function _insert(int $email_id, string $name, string $origin_name, int $pid=0){  
159 - $data = [];  
160 -  
161 - $data['email_id'] = $email_id;  
162 - $data['folder'] = $name;  
163 - $data['origin_folder'] = $origin_name;  
164 - $data['pid'] = $pid;  
165 -  
166 - $model = static::where($data)->first();  
167 -  
168 - if($model){  
169 - if($model->is_del){  
170 - $model->is_del = 0;  
171 - $model->save();  
172 - }  
173 - return $model->id;  
174 - }  
175 -  
176 - return static::insertGetId($data);  
177 -  
178 - }  
179 -  
180 - /**  
181 - * 返回 dir/dir/dir  
182 - * @param array $lists  
183 - * @param int $id  
184 - * @param string $folder  
185 - * @param string $field 获取什么名字  
186 - * @author:dc  
187 - * @time 2022/10/31 16:30  
188 - */  
189 - public static function _firstTree(array $lists, int $id,string &$folder,$field='folder'):void {  
190 -  
191 - foreach ($lists as $list){  
192 - if($list['id'] == $id){  
193 - $folder = $list[$field].($folder ? '/'.$folder : '');  
194 - if ($list['pid']!=0){  
195 - self::_firstTree($list,$list['pid'],$folder,$field);  
196 - }  
197 - }  
198 - }  
199 -  
200 - }  
201 -  
202 - /**  
203 - * @param $id  
204 - * @param null $exsts  
205 - * @param null $unseen  
206 - * @return false  
207 - * @time 2022/8/8 9:21  
208 - */  
209 - public static function _updateNum($id, $exsts = null, $unseen = null){  
210 - $model = static::where('id',$id)->first();  
211 - if($model){  
212 - $u = false;  
213 - if($exsts != null) {  
214 - $u = true;  
215 - $model->exsts = $exsts;  
216 - }  
217 - if($unseen != null) {  
218 - $u = true;  
219 - $model->unseen = $unseen;  
220 - }  
221 - if ($u){  
222 - return $model->save();  
223 - }  
224 - }  
225 - return false;  
226 - }  
227 -  
228 -  
229 - /**  
230 - * 读取源名称  
231 - * @param $id  
232 - * @return string  
233 - * @author:dc  
234 - * @time 2023/2/7 17:29  
235 - */  
236 - public static function getOriginName($id){  
237 - $folder = static::where('id',$id)->select(['id','pid','origin_folder'])->first();  
238 - $folder_name = '';  
239 - if ($folder){  
240 - $folder_name = $folder->origin_folder;  
241 - if($folder->pid){  
242 - $pfolder = static::where('id',$folder->pid)->select(['id','pid','origin_folder'])->first();  
243 - if($pfolder){  
244 - $folder_name .= '/'.$pfolder->origin_folder;  
245 - }  
246 - }  
247 - }  
248 -  
249 - return $folder_name;  
250 - }  
251 -  
252 -  
253 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -use Illuminate\Database\Eloquent\Model;  
6 -  
7 -/**  
8 - * 邮件服务器地址  
9 - * @time 2022/7/29 15:09  
10 - * Class EmailHost  
11 - * @package App\Mail\Models  
12 - */  
13 -class Host extends Model {  
14 -  
15 - /**  
16 - * 添加  
17 - * @param string $suffix qq.com  
18 - * @param string $host imap.qq.com  
19 - * @param string $smtp smtp.qq.com  
20 - * @param string $title 服务器名称  
21 - * @return int  
22 - * @time 2022/7/29 15:36  
23 - */  
24 - public static function _insert(string $suffix, string $host, string $smtp, $title=''):int {  
25 - try {  
26 - // 插入新的  
27 - return static::insertGetId([  
28 - 'suffix' => $suffix,  
29 - 'imap' => $host,  
30 - 'smtp' => $smtp ? $smtp : str_replace('imap.','smtp.',$host),  
31 - 'title' => $title  
32 - ]);  
33 - }catch (\Throwable $e){  
34 - // 查询是否存在  
35 - return self::_get($suffix)['id']??0;  
36 - }  
37 -  
38 - }  
39 -  
40 - /**  
41 - * 读取详情  
42 - * @param $idOrSuffix  
43 - * @time 2022/7/29 15:44  
44 - * @return array  
45 - */  
46 - public static function _get($idOrSuffix):array {  
47 - $data = static::where(is_numeric($idOrSuffix) ? 'id' : 'suffix', $idOrSuffix)->first();  
48 - return $data ? $data->toArray() : [];  
49 - }  
50 -  
51 - /**  
52 - * 获取所有  
53 - * @return array  
54 - * @time 2022/7/29 15:51  
55 - */  
56 - public static function _all():array{  
57 - // 读取所有  
58 - $all = static::all()->toArray();  
59 - foreach ($all as $key => $item){  
60 - // 处理  
61 - $all[$item['suffix']] = $item;  
62 - unset($all[$item['suffix']]['suffix']);  
63 - unset($all[$item['suffix']]['id']);  
64 - unset($all[$key]);  
65 - }  
66 - return $all ? $all : [];  
67 - }  
68 -  
69 -  
70 -  
71 -  
72 -  
73 -}  
1 -<?php  
2 -  
3 -namespace App\Models;  
4 -  
5 -// use Illuminate\Contracts\Auth\MustVerifyEmail;  
6 -use Illuminate\Database\Eloquent\Factories\HasFactory;  
7 -use Illuminate\Foundation\Auth\User as Authenticatable;  
8 -use Illuminate\Notifications\Notifiable;  
9 -use Laravel\Sanctum\HasApiTokens;  
10 -  
11 -class User extends Authenticatable  
12 -{  
13 - use HasApiTokens, HasFactory, Notifiable;  
14 -  
15 - /**  
16 - * The attributes that are mass assignable.  
17 - *  
18 - * @var array<int, string>  
19 - */  
20 - protected $fillable = [  
21 - 'name',  
22 - 'email',  
23 - 'password',  
24 - ];  
25 -  
26 - /**  
27 - * The attributes that should be hidden for serialization.  
28 - *  
29 - * @var array<int, string>  
30 - */  
31 - protected $hidden = [  
32 - 'password',  
33 - 'remember_token',  
34 - ];  
35 -  
36 - /**  
37 - * The attributes that should be cast.  
38 - *  
39 - * @var array<string, string>  
40 - */  
41 - protected $casts = [  
42 - 'email_verified_at' => 'datetime',  
43 - ];  
44 -}  
1 -<?php  
2 -  
3 -namespace App\Providers;  
4 -  
5 -use Illuminate\Support\ServiceProvider;  
6 -  
7 -class AppServiceProvider extends ServiceProvider  
8 -{  
9 - /**  
10 - * Register any application services.  
11 - *  
12 - * @return void  
13 - */  
14 - public function register()  
15 - {  
16 - //  
17 - }  
18 -  
19 - /**  
20 - * Bootstrap any application services.  
21 - *  
22 - * @return void  
23 - */  
24 - public function boot()  
25 - {  
26 - //  
27 - }  
28 -}  
1 -<?php  
2 -  
3 -namespace App\Providers;  
4 -  
5 -// use Illuminate\Support\Facades\Gate;  
6 -use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;  
7 -  
8 -class AuthServiceProvider extends ServiceProvider  
9 -{  
10 - /**  
11 - * The model to policy mappings for the application.  
12 - *  
13 - * @var array<class-string, class-string>  
14 - */  
15 - protected $policies = [  
16 - // 'App\Models\Model' => 'App\Policies\ModelPolicy',  
17 - ];  
18 -  
19 - /**  
20 - * Register any authentication / authorization services.  
21 - *  
22 - * @return void  
23 - */  
24 - public function boot()  
25 - {  
26 - $this->registerPolicies();  
27 -  
28 - //  
29 - }  
30 -}  
1 -<?php  
2 -  
3 -namespace App\Providers;  
4 -  
5 -use Illuminate\Support\Facades\Broadcast;  
6 -use Illuminate\Support\ServiceProvider;  
7 -  
8 -class BroadcastServiceProvider extends ServiceProvider  
9 -{  
10 - /**  
11 - * Bootstrap any application services.  
12 - *  
13 - * @return void  
14 - */  
15 - public function boot()  
16 - {  
17 - Broadcast::routes();  
18 -  
19 - require base_path('routes/channels.php');  
20 - }  
21 -}  
1 -<?php  
2 -  
3 -namespace App\Providers;  
4 -  
5 -use Illuminate\Auth\Events\Registered;  
6 -use Illuminate\Auth\Listeners\SendEmailVerificationNotification;  
7 -use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;  
8 -use Illuminate\Support\Facades\Event;  
9 -  
10 -class EventServiceProvider extends ServiceProvider  
11 -{  
12 - /**  
13 - * The event to listener mappings for the application.  
14 - *  
15 - * @var array<class-string, array<int, class-string>>  
16 - */  
17 - protected $listen = [  
18 - Registered::class => [  
19 - SendEmailVerificationNotification::class,  
20 - ],  
21 - ];  
22 -  
23 - /**  
24 - * Register any events for your application.  
25 - *  
26 - * @return void  
27 - */  
28 - public function boot()  
29 - {  
30 - //  
31 - }  
32 -  
33 - /**  
34 - * Determine if events and listeners should be automatically discovered.  
35 - *  
36 - * @return bool  
37 - */  
38 - public function shouldDiscoverEvents()  
39 - {  
40 - return false;  
41 - }  
42 -}  
1 -<?php  
2 -  
3 -namespace App\Providers;  
4 -  
5 -use Illuminate\Cache\RateLimiting\Limit;  
6 -use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;  
7 -use Illuminate\Http\Request;  
8 -use Illuminate\Support\Facades\RateLimiter;  
9 -use Illuminate\Support\Facades\Route;  
10 -  
11 -class RouteServiceProvider extends ServiceProvider  
12 -{  
13 - /**  
14 - * The path to the "home" route for your application.  
15 - *  
16 - * Typically, users are redirected here after authentication.  
17 - *  
18 - * @var string  
19 - */  
20 - public const HOME = '/home';  
21 -  
22 - /**  
23 - * Define your route model bindings, pattern filters, and other route configuration.  
24 - *  
25 - * @return void  
26 - */  
27 - public function boot()  
28 - {  
29 - $this->configureRateLimiting();  
30 -  
31 - $this->routes(function () {  
32 - Route::middleware('api')  
33 - ->prefix('api')  
34 - ->group(base_path('routes/api.php'));  
35 -  
36 - Route::middleware('web')  
37 - ->group(base_path('routes/web.php'));  
38 - });  
39 - }  
40 -  
41 - /**  
42 - * Configure the rate limiters for the application.  
43 - *  
44 - * @return void  
45 - */  
46 - protected function configureRateLimiting()  
47 - {  
48 - RateLimiter::for('api', function (Request $request) {  
49 - return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());  
50 - });  
51 - }  
52 -}  
1 -#!/usr/bin/env php  
2 -<?php  
3 -  
4 -define('LARAVEL_START', microtime(true));  
5 -  
6 -/*  
7 -|--------------------------------------------------------------------------  
8 -| Register The Auto Loader  
9 -|--------------------------------------------------------------------------  
10 -|  
11 -| Composer provides a convenient, automatically generated class loader  
12 -| for our application. We just need to utilize it! We'll require it  
13 -| into the script here so that we do not have to worry about the  
14 -| loading of any of our classes manually. It's great to relax.  
15 -|  
16 -*/  
17 -  
18 -require __DIR__.'/vendor/autoload.php';  
19 -  
20 -$app = require_once __DIR__.'/bootstrap/app.php';  
21 -  
22 -/*  
23 -|--------------------------------------------------------------------------  
24 -| Run The Artisan Application  
25 -|--------------------------------------------------------------------------  
26 -|  
27 -| When we run the console application, the current CLI command will be  
28 -| executed in this console and the response sent back to a terminal  
29 -| or another output device for the developers. Here goes nothing!  
30 -|  
31 -*/  
32 -  
33 -$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);  
34 -  
35 -$status = $kernel->handle(  
36 - $input = new Symfony\Component\Console\Input\ArgvInput,  
37 - new Symfony\Component\Console\Output\ConsoleOutput  
38 -);  
39 -  
40 -/*  
41 -|--------------------------------------------------------------------------  
42 -| Shutdown The Application  
43 -|--------------------------------------------------------------------------  
44 -|  
45 -| Once Artisan has finished running, we will fire off the shutdown events  
46 -| so that any final work may be done by the application before we shut  
47 -| down the process. This is the last thing to happen to the request.  
48 -|  
49 -*/  
50 -  
51 -$kernel->terminate($input, $status);  
52 -  
53 -exit($status);  
1 -<?php  
2 -  
3 -/*  
4 -|--------------------------------------------------------------------------  
5 -| Create The Application  
6 -|--------------------------------------------------------------------------  
7 -|  
8 -| The first thing we will do is create a new Laravel application instance  
9 -| which serves as the "glue" for all the components of Laravel, and is  
10 -| the IoC container for the system binding all of the various parts.  
11 -|  
12 -*/  
13 -  
14 -$app = new Illuminate\Foundation\Application(  
15 - $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)  
16 -);  
17 -  
18 -/*  
19 -|--------------------------------------------------------------------------  
20 -| Bind Important Interfaces  
21 -|--------------------------------------------------------------------------  
22 -|  
23 -| Next, we need to bind some important interfaces into the container so  
24 -| we will be able to resolve them when needed. The kernels serve the  
25 -| incoming requests to this application from both the web and CLI.  
26 -|  
27 -*/  
28 -  
29 -$app->singleton(  
30 - Illuminate\Contracts\Http\Kernel::class,  
31 - App\Http\Kernel::class  
32 -);  
33 -  
34 -$app->singleton(  
35 - Illuminate\Contracts\Console\Kernel::class,  
36 - App\Console\Kernel::class  
37 -);  
38 -  
39 -$app->singleton(  
40 - Illuminate\Contracts\Debug\ExceptionHandler::class,  
41 - App\Exceptions\Handler::class  
42 -);  
43 -  
44 -/*  
45 -|--------------------------------------------------------------------------  
46 -| Return The Application  
47 -|--------------------------------------------------------------------------  
48 -|  
49 -| This script returns the application instance. The instance is given to  
50 -| the calling script so we can separate the building of the instances  
51 -| from the actual running of the application and sending responses.  
52 -|  
53 -*/  
54 -  
55 -return $app;  
1 { 1 {
2 - "name": "laravel/laravel", 2 + "name": "globalso/email",
3 "type": "project", 3 "type": "project",
4 - "description": "The Laravel Framework.",  
5 - "keywords": ["framework", "laravel"], 4 + "description": "邮件管理",
6 "license": "MIT", 5 "license": "MIT",
7 "require": { 6 "require": {
8 "php": "^8.0.2", 7 "php": "^8.0.2",
9 - "guzzlehttp/guzzle": "^7.2",  
10 - "laravel/framework": "^9.19",  
11 - "laravel/sanctum": "^3.0",  
12 - "laravel/tinker": "^2.7",  
13 "phpmailer/phpmailer": "^6.7" 8 "phpmailer/phpmailer": "^6.7"
14 }, 9 },
15 "require-dev": { 10 "require-dev": {
16 - "fakerphp/faker": "^1.9.1",  
17 - "laravel/pint": "^1.0",  
18 - "laravel/sail": "^1.0.1",  
19 - "mockery/mockery": "^1.4.4",  
20 - "nunomaduro/collision": "^6.1",  
21 - "phpunit/phpunit": "^9.5.10",  
22 - "spatie/laravel-ignition": "^1.0" 11 +
23 }, 12 },
24 "autoload": { 13 "autoload": {
25 "psr-4": { 14 "psr-4": {
26 - "App\\": "app/",  
27 - "Helper\\": "helper/",  
28 - "Database\\Factories\\": "database/factories/",  
29 - "Database\\Seeders\\": "database/seeders/" 15 + "Model\\": "model/",
  16 + "Controller\\": "controller/",
  17 + "Lib\\": "lib/"
30 }, 18 },
31 "files": [ 19 "files": [
32 - "helper/function.php" 20 + "config.php",
  21 + "function.php"
33 ] 22 ]
34 }, 23 },
35 - "autoload-dev": {  
36 - "psr-4": {  
37 - "Tests\\": "tests/"  
38 - }  
39 - },  
40 "scripts": { 24 "scripts": {
41 - "post-autoload-dump": [  
42 - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",  
43 - "@php artisan package:discover --ansi"  
44 - ],  
45 - "post-update-cmd": [  
46 - "@php artisan vendor:publish --tag=laravel-assets --ansi --force"  
47 - ],  
48 - "post-root-package-install": [  
49 - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""  
50 - ],  
51 - "post-create-project-cmd": [  
52 - "@php artisan key:generate --ansi"  
53 - ]  
54 - },  
55 - "extra": {  
56 - "laravel": {  
57 - "dont-discover": []  
58 - } 25 +
59 }, 26 },
60 "config": { 27 "config": {
61 "optimize-autoloader": true, 28 "optimize-autoloader": true,
此 diff 太大无法显示。
  1 +<?php
  2 +
  3 +// 开启4个进程
  4 +define('WORKER_NUM',4);
  5 +// 开启100个协程
  6 +define('COROUTINE_NUM',100);
  7 +// 是否继续运行
  8 +define('RUNNING_REDIS_KEY','worker_is_running');
  9 +// 记录日志的目录
  10 +define('LOG_PATH',__DIR__.'/log');
  11 +
  12 +// 默认语言
  13 +define('APP_LANG','zh');
  14 +
  15 +// 根目录
  16 +define('ROOT_PATH',__DIR__);
  17 +
  18 +
  19 +// redis
  20 +define('REDIS_HOST', '127.0.0.1');
  21 +define('REDIS_PORT', 6379);
  22 +define('REDIS_PASSWORD', '');
  23 +define('REDIS_DB', 4);
  24 +
  25 +//db
  26 +define('DB_HOST','127.0.0.1');
  27 +define('DB_PORT',3306);
  28 +define('DB_DATABASE','www_mail_cn');
  29 +define('DB_USER','www_mail_cn');
  30 +define('DB_PASSWORD','pKnXKwhAFRpwcZAM');
  31 +
  32 +
  33 +
  34 +
  35 +// 创建 必须 目录
  36 +if(!is_dir(LOG_PATH)){
  37 + mkdir(LOG_PATH,0777,true);
  38 +}
1 -<?php  
2 -  
3 -use Illuminate\Support\Facades\Facade;  
4 -  
5 -return [  
6 -  
7 - /*  
8 - |--------------------------------------------------------------------------  
9 - | Application Name  
10 - |--------------------------------------------------------------------------  
11 - |  
12 - | This value is the name of your application. This value is used when the  
13 - | framework needs to place the application's name in a notification or  
14 - | any other location as required by the application or its packages.  
15 - |  
16 - */  
17 -  
18 - 'name' => env('APP_NAME', 'Laravel'),  
19 -  
20 - /*  
21 - |--------------------------------------------------------------------------  
22 - | Application Environment  
23 - |--------------------------------------------------------------------------  
24 - |  
25 - | This value determines the "environment" your application is currently  
26 - | running in. This may determine how you prefer to configure various  
27 - | services the application utilizes. Set this in your ".env" file.  
28 - |  
29 - */  
30 -  
31 - 'env' => env('APP_ENV', 'production'),  
32 -  
33 - /*  
34 - |--------------------------------------------------------------------------  
35 - | Application Debug Mode  
36 - |--------------------------------------------------------------------------  
37 - |  
38 - | When your application is in debug mode, detailed error messages with  
39 - | stack traces will be shown on every error that occurs within your  
40 - | application. If disabled, a simple generic error page is shown.  
41 - |  
42 - */  
43 -  
44 - 'debug' => (bool) env('APP_DEBUG', false),  
45 -  
46 - /*  
47 - |--------------------------------------------------------------------------  
48 - | Application URL  
49 - |--------------------------------------------------------------------------  
50 - |  
51 - | This URL is used by the console to properly generate URLs when using  
52 - | the Artisan command line tool. You should set this to the root of  
53 - | your application so that it is used when running Artisan tasks.  
54 - |  
55 - */  
56 -  
57 - 'url' => env('APP_URL', 'http://localhost'),  
58 -  
59 - 'asset_url' => env('ASSET_URL'),  
60 -  
61 - /*  
62 - |--------------------------------------------------------------------------  
63 - | Application Timezone  
64 - |--------------------------------------------------------------------------  
65 - |  
66 - | Here you may specify the default timezone for your application, which  
67 - | will be used by the PHP date and date-time functions. We have gone  
68 - | ahead and set this to a sensible default for you out of the box.  
69 - |  
70 - */  
71 -  
72 - 'timezone' => 'UTC',  
73 -  
74 - /*  
75 - |--------------------------------------------------------------------------  
76 - | Application Locale Configuration  
77 - |--------------------------------------------------------------------------  
78 - |  
79 - | The application locale determines the default locale that will be used  
80 - | by the translation service provider. You are free to set this value  
81 - | to any of the locales which will be supported by the application.  
82 - |  
83 - */  
84 -  
85 - 'locale' => 'en',  
86 -  
87 - /*  
88 - |--------------------------------------------------------------------------  
89 - | Application Fallback Locale  
90 - |--------------------------------------------------------------------------  
91 - |  
92 - | The fallback locale determines the locale to use when the current one  
93 - | is not available. You may change the value to correspond to any of  
94 - | the language folders that are provided through your application.  
95 - |  
96 - */  
97 -  
98 - 'fallback_locale' => 'en',  
99 -  
100 - /*  
101 - |--------------------------------------------------------------------------  
102 - | Faker Locale  
103 - |--------------------------------------------------------------------------  
104 - |  
105 - | This locale will be used by the Faker PHP library when generating fake  
106 - | data for your database seeds. For example, this will be used to get  
107 - | localized telephone numbers, street address information and more.  
108 - |  
109 - */  
110 -  
111 - 'faker_locale' => 'en_US',  
112 -  
113 - /*  
114 - |--------------------------------------------------------------------------  
115 - | Encryption Key  
116 - |--------------------------------------------------------------------------  
117 - |  
118 - | This key is used by the Illuminate encrypter service and should be set  
119 - | to a random, 32 character string, otherwise these encrypted strings  
120 - | will not be safe. Please do this before deploying an application!  
121 - |  
122 - */  
123 -  
124 - 'key' => env('APP_KEY'),  
125 -  
126 - 'cipher' => 'AES-256-CBC',  
127 -  
128 - /*  
129 - |--------------------------------------------------------------------------  
130 - | Maintenance Mode Driver  
131 - |--------------------------------------------------------------------------  
132 - |  
133 - | These configuration options determine the driver used to determine and  
134 - | manage Laravel's "maintenance mode" status. The "cache" driver will  
135 - | allow maintenance mode to be controlled across multiple machines.  
136 - |  
137 - | Supported drivers: "file", "cache"  
138 - |  
139 - */  
140 -  
141 - 'maintenance' => [  
142 - 'driver' => 'file',  
143 - // 'store' => 'redis',  
144 - ],  
145 -  
146 - /*  
147 - |--------------------------------------------------------------------------  
148 - | Autoloaded Service Providers  
149 - |--------------------------------------------------------------------------  
150 - |  
151 - | The service providers listed here will be automatically loaded on the  
152 - | request to your application. Feel free to add your own services to  
153 - | this array to grant expanded functionality to your applications.  
154 - |  
155 - */  
156 -  
157 - 'providers' => [  
158 -  
159 - /*  
160 - * Laravel Framework Service Providers...  
161 - */  
162 - Illuminate\Auth\AuthServiceProvider::class,  
163 - Illuminate\Broadcasting\BroadcastServiceProvider::class,  
164 - Illuminate\Bus\BusServiceProvider::class,  
165 - Illuminate\Cache\CacheServiceProvider::class,  
166 - Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,  
167 - Illuminate\Cookie\CookieServiceProvider::class,  
168 - Illuminate\Database\DatabaseServiceProvider::class,  
169 - Illuminate\Encryption\EncryptionServiceProvider::class,  
170 - Illuminate\Filesystem\FilesystemServiceProvider::class,  
171 - Illuminate\Foundation\Providers\FoundationServiceProvider::class,  
172 - Illuminate\Hashing\HashServiceProvider::class,  
173 - Illuminate\Mail\MailServiceProvider::class,  
174 - Illuminate\Notifications\NotificationServiceProvider::class,  
175 - Illuminate\Pagination\PaginationServiceProvider::class,  
176 - Illuminate\Pipeline\PipelineServiceProvider::class,  
177 - Illuminate\Queue\QueueServiceProvider::class,  
178 - Illuminate\Redis\RedisServiceProvider::class,  
179 - Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,  
180 - Illuminate\Session\SessionServiceProvider::class,  
181 - Illuminate\Translation\TranslationServiceProvider::class,  
182 - Illuminate\Validation\ValidationServiceProvider::class,  
183 - Illuminate\View\ViewServiceProvider::class,  
184 -  
185 - /*  
186 - * Package Service Providers...  
187 - */  
188 -  
189 - /*  
190 - * Application Service Providers...  
191 - */  
192 - App\Providers\AppServiceProvider::class,  
193 - App\Providers\AuthServiceProvider::class,  
194 - // App\Providers\BroadcastServiceProvider::class,  
195 - App\Providers\EventServiceProvider::class,  
196 - App\Providers\RouteServiceProvider::class,  
197 -  
198 - ],  
199 -  
200 - /*  
201 - |--------------------------------------------------------------------------  
202 - | Class Aliases  
203 - |--------------------------------------------------------------------------  
204 - |  
205 - | This array of class aliases will be registered when this application  
206 - | is started. However, feel free to register as many as you wish as  
207 - | the aliases are "lazy" loaded so they don't hinder performance.  
208 - |  
209 - */  
210 -  
211 - 'aliases' => Facade::defaultAliases()->merge([  
212 - // 'ExampleClass' => App\Example\ExampleClass::class,  
213 - ])->toArray(),  
214 -  
215 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Authentication Defaults  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | This option controls the default authentication "guard" and password  
11 - | reset options for your application. You may change these defaults  
12 - | as required, but they're a perfect start for most applications.  
13 - |  
14 - */  
15 -  
16 - 'defaults' => [  
17 - 'guard' => 'web',  
18 - 'passwords' => 'users',  
19 - ],  
20 -  
21 - /*  
22 - |--------------------------------------------------------------------------  
23 - | Authentication Guards  
24 - |--------------------------------------------------------------------------  
25 - |  
26 - | Next, you may define every authentication guard for your application.  
27 - | Of course, a great default configuration has been defined for you  
28 - | here which uses session storage and the Eloquent user provider.  
29 - |  
30 - | All authentication drivers have a user provider. This defines how the  
31 - | users are actually retrieved out of your database or other storage  
32 - | mechanisms used by this application to persist your user's data.  
33 - |  
34 - | Supported: "session"  
35 - |  
36 - */  
37 -  
38 - 'guards' => [  
39 - 'web' => [  
40 - 'driver' => 'session',  
41 - 'provider' => 'users',  
42 - ],  
43 - ],  
44 -  
45 - /*  
46 - |--------------------------------------------------------------------------  
47 - | User Providers  
48 - |--------------------------------------------------------------------------  
49 - |  
50 - | All authentication drivers have a user provider. This defines how the  
51 - | users are actually retrieved out of your database or other storage  
52 - | mechanisms used by this application to persist your user's data.  
53 - |  
54 - | If you have multiple user tables or models you may configure multiple  
55 - | sources which represent each model / table. These sources may then  
56 - | be assigned to any extra authentication guards you have defined.  
57 - |  
58 - | Supported: "database", "eloquent"  
59 - |  
60 - */  
61 -  
62 - 'providers' => [  
63 - 'users' => [  
64 - 'driver' => 'eloquent',  
65 - 'model' => App\Models\User::class,  
66 - ],  
67 -  
68 - // 'users' => [  
69 - // 'driver' => 'database',  
70 - // 'table' => 'users',  
71 - // ],  
72 - ],  
73 -  
74 - /*  
75 - |--------------------------------------------------------------------------  
76 - | Resetting Passwords  
77 - |--------------------------------------------------------------------------  
78 - |  
79 - | You may specify multiple password reset configurations if you have more  
80 - | than one user table or model in the application and you want to have  
81 - | separate password reset settings based on the specific user types.  
82 - |  
83 - | The expire time is the number of minutes that each reset token will be  
84 - | considered valid. This security feature keeps tokens short-lived so  
85 - | they have less time to be guessed. You may change this as needed.  
86 - |  
87 - */  
88 -  
89 - 'passwords' => [  
90 - 'users' => [  
91 - 'provider' => 'users',  
92 - 'table' => 'password_resets',  
93 - 'expire' => 60,  
94 - 'throttle' => 60,  
95 - ],  
96 - ],  
97 -  
98 - /*  
99 - |--------------------------------------------------------------------------  
100 - | Password Confirmation Timeout  
101 - |--------------------------------------------------------------------------  
102 - |  
103 - | Here you may define the amount of seconds before a password confirmation  
104 - | times out and the user is prompted to re-enter their password via the  
105 - | confirmation screen. By default, the timeout lasts for three hours.  
106 - |  
107 - */  
108 -  
109 - 'password_timeout' => 10800,  
110 -  
111 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Default Broadcaster  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | This option controls the default broadcaster that will be used by the  
11 - | framework when an event needs to be broadcast. You may set this to  
12 - | any of the connections defined in the "connections" array below.  
13 - |  
14 - | Supported: "pusher", "ably", "redis", "log", "null"  
15 - |  
16 - */  
17 -  
18 - 'default' => env('BROADCAST_DRIVER', 'null'),  
19 -  
20 - /*  
21 - |--------------------------------------------------------------------------  
22 - | Broadcast Connections  
23 - |--------------------------------------------------------------------------  
24 - |  
25 - | Here you may define all of the broadcast connections that will be used  
26 - | to broadcast events to other systems or over websockets. Samples of  
27 - | each available type of connection are provided inside this array.  
28 - |  
29 - */  
30 -  
31 - 'connections' => [  
32 -  
33 - 'pusher' => [  
34 - 'driver' => 'pusher',  
35 - 'key' => env('PUSHER_APP_KEY'),  
36 - 'secret' => env('PUSHER_APP_SECRET'),  
37 - 'app_id' => env('PUSHER_APP_ID'),  
38 - 'options' => [  
39 - 'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',  
40 - 'port' => env('PUSHER_PORT', 443),  
41 - 'scheme' => env('PUSHER_SCHEME', 'https'),  
42 - 'encrypted' => true,  
43 - 'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',  
44 - ],  
45 - 'client_options' => [  
46 - // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html  
47 - ],  
48 - ],  
49 -  
50 - 'ably' => [  
51 - 'driver' => 'ably',  
52 - 'key' => env('ABLY_KEY'),  
53 - ],  
54 -  
55 - 'redis' => [  
56 - 'driver' => 'redis',  
57 - 'connection' => 'default',  
58 - ],  
59 -  
60 - 'log' => [  
61 - 'driver' => 'log',  
62 - ],  
63 -  
64 - 'null' => [  
65 - 'driver' => 'null',  
66 - ],  
67 -  
68 - ],  
69 -  
70 -];  
1 -<?php  
2 -  
3 -use Illuminate\Support\Str;  
4 -  
5 -return [  
6 -  
7 - /*  
8 - |--------------------------------------------------------------------------  
9 - | Default Cache Store  
10 - |--------------------------------------------------------------------------  
11 - |  
12 - | This option controls the default cache connection that gets used while  
13 - | using this caching library. This connection is used when another is  
14 - | not explicitly specified when executing a given caching function.  
15 - |  
16 - */  
17 -  
18 - 'default' => env('CACHE_DRIVER', 'file'),  
19 -  
20 - /*  
21 - |--------------------------------------------------------------------------  
22 - | Cache Stores  
23 - |--------------------------------------------------------------------------  
24 - |  
25 - | Here you may define all of the cache "stores" for your application as  
26 - | well as their drivers. You may even define multiple stores for the  
27 - | same cache driver to group types of items stored in your caches.  
28 - |  
29 - | Supported drivers: "apc", "array", "database", "file",  
30 - | "memcached", "redis", "dynamodb", "octane", "null"  
31 - |  
32 - */  
33 -  
34 - 'stores' => [  
35 -  
36 - 'apc' => [  
37 - 'driver' => 'apc',  
38 - ],  
39 -  
40 - 'array' => [  
41 - 'driver' => 'array',  
42 - 'serialize' => false,  
43 - ],  
44 -  
45 - 'database' => [  
46 - 'driver' => 'database',  
47 - 'table' => 'cache',  
48 - 'connection' => null,  
49 - 'lock_connection' => null,  
50 - ],  
51 -  
52 - 'file' => [  
53 - 'driver' => 'file',  
54 - 'path' => storage_path('framework/cache/data'),  
55 - ],  
56 -  
57 - 'memcached' => [  
58 - 'driver' => 'memcached',  
59 - 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),  
60 - 'sasl' => [  
61 - env('MEMCACHED_USERNAME'),  
62 - env('MEMCACHED_PASSWORD'),  
63 - ],  
64 - 'options' => [  
65 - // Memcached::OPT_CONNECT_TIMEOUT => 2000,  
66 - ],  
67 - 'servers' => [  
68 - [  
69 - 'host' => env('MEMCACHED_HOST', '127.0.0.1'),  
70 - 'port' => env('MEMCACHED_PORT', 11211),  
71 - 'weight' => 100,  
72 - ],  
73 - ],  
74 - ],  
75 -  
76 - 'redis' => [  
77 - 'driver' => 'redis',  
78 - 'connection' => 'cache',  
79 - 'lock_connection' => 'default',  
80 - ],  
81 -  
82 - 'dynamodb' => [  
83 - 'driver' => 'dynamodb',  
84 - 'key' => env('AWS_ACCESS_KEY_ID'),  
85 - 'secret' => env('AWS_SECRET_ACCESS_KEY'),  
86 - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),  
87 - 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),  
88 - 'endpoint' => env('DYNAMODB_ENDPOINT'),  
89 - ],  
90 -  
91 - 'octane' => [  
92 - 'driver' => 'octane',  
93 - ],  
94 -  
95 - ],  
96 -  
97 - /*  
98 - |--------------------------------------------------------------------------  
99 - | Cache Key Prefix  
100 - |--------------------------------------------------------------------------  
101 - |  
102 - | When utilizing the APC, database, memcached, Redis, or DynamoDB cache  
103 - | stores there might be other applications using the same cache. For  
104 - | that reason, you may prefix every cache key to avoid collisions.  
105 - |  
106 - */  
107 -  
108 - 'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache_'),  
109 -  
110 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Cross-Origin Resource Sharing (CORS) Configuration  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | Here you may configure your settings for cross-origin resource sharing  
11 - | or "CORS". This determines what cross-origin operations may execute  
12 - | in web browsers. You are free to adjust these settings as needed.  
13 - |  
14 - | To learn more: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS  
15 - |  
16 - */  
17 -  
18 - 'paths' => ['api/*', 'sanctum/csrf-cookie'],  
19 -  
20 - 'allowed_methods' => ['*'],  
21 -  
22 - 'allowed_origins' => ['*'],  
23 -  
24 - 'allowed_origins_patterns' => [],  
25 -  
26 - 'allowed_headers' => ['*'],  
27 -  
28 - 'exposed_headers' => [],  
29 -  
30 - 'max_age' => 0,  
31 -  
32 - 'supports_credentials' => false,  
33 -  
34 -];  
1 -<?php  
2 -  
3 -use Illuminate\Support\Str;  
4 -  
5 -return [  
6 -  
7 - /*  
8 - |--------------------------------------------------------------------------  
9 - | Default Database Connection Name  
10 - |--------------------------------------------------------------------------  
11 - |  
12 - | Here you may specify which of the database connections below you wish  
13 - | to use as your default connection for all database work. Of course  
14 - | you may use many connections at once using the Database library.  
15 - |  
16 - */  
17 -  
18 - 'default' => env('DB_CONNECTION', 'mysql'),  
19 -  
20 - /*  
21 - |--------------------------------------------------------------------------  
22 - | Database Connections  
23 - |--------------------------------------------------------------------------  
24 - |  
25 - | Here are each of the database connections setup for your application.  
26 - | Of course, examples of configuring each database platform that is  
27 - | supported by Laravel is shown below to make development simple.  
28 - |  
29 - |  
30 - | All database work in Laravel is done through the PHP PDO facilities  
31 - | so make sure you have the driver for your particular database of  
32 - | choice installed on your machine before you begin development.  
33 - |  
34 - */  
35 -  
36 - 'connections' => [  
37 -  
38 - 'sqlite' => [  
39 - 'driver' => 'sqlite',  
40 - 'url' => env('DATABASE_URL'),  
41 - 'database' => env('DB_DATABASE', database_path('database.sqlite')),  
42 - 'prefix' => '',  
43 - 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),  
44 - ],  
45 -  
46 - 'mysql' => [  
47 - 'driver' => 'mysql',  
48 - 'url' => env('DATABASE_URL'),  
49 - 'host' => env('DB_HOST', '127.0.0.1'),  
50 - 'port' => env('DB_PORT', '3306'),  
51 - 'database' => env('DB_DATABASE', 'forge'),  
52 - 'username' => env('DB_USERNAME', 'forge'),  
53 - 'password' => env('DB_PASSWORD', ''),  
54 - 'unix_socket' => env('DB_SOCKET', ''),  
55 - 'charset' => 'utf8mb4',  
56 - 'collation' => 'utf8mb4_unicode_ci',  
57 - 'prefix' => '',  
58 - 'prefix_indexes' => true,  
59 - 'strict' => true,  
60 - 'engine' => null,  
61 - 'options' => extension_loaded('pdo_mysql') ? array_filter([  
62 - PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),  
63 - ]) : [],  
64 - ],  
65 -  
66 - 'pgsql' => [  
67 - 'driver' => 'pgsql',  
68 - 'url' => env('DATABASE_URL'),  
69 - 'host' => env('DB_HOST', '127.0.0.1'),  
70 - 'port' => env('DB_PORT', '5432'),  
71 - 'database' => env('DB_DATABASE', 'forge'),  
72 - 'username' => env('DB_USERNAME', 'forge'),  
73 - 'password' => env('DB_PASSWORD', ''),  
74 - 'charset' => 'utf8',  
75 - 'prefix' => '',  
76 - 'prefix_indexes' => true,  
77 - 'search_path' => 'public',  
78 - 'sslmode' => 'prefer',  
79 - ],  
80 -  
81 - 'sqlsrv' => [  
82 - 'driver' => 'sqlsrv',  
83 - 'url' => env('DATABASE_URL'),  
84 - 'host' => env('DB_HOST', 'localhost'),  
85 - 'port' => env('DB_PORT', '1433'),  
86 - 'database' => env('DB_DATABASE', 'forge'),  
87 - 'username' => env('DB_USERNAME', 'forge'),  
88 - 'password' => env('DB_PASSWORD', ''),  
89 - 'charset' => 'utf8',  
90 - 'prefix' => '',  
91 - 'prefix_indexes' => true,  
92 - // 'encrypt' => env('DB_ENCRYPT', 'yes'),  
93 - // 'trust_server_certificate' => env('DB_TRUST_SERVER_CERTIFICATE', 'false'),  
94 - ],  
95 -  
96 - ],  
97 -  
98 - /*  
99 - |--------------------------------------------------------------------------  
100 - | Migration Repository Table  
101 - |--------------------------------------------------------------------------  
102 - |  
103 - | This table keeps track of all the migrations that have already run for  
104 - | your application. Using this information, we can determine which of  
105 - | the migrations on disk haven't actually been run in the database.  
106 - |  
107 - */  
108 -  
109 - 'migrations' => 'migrations',  
110 -  
111 - /*  
112 - |--------------------------------------------------------------------------  
113 - | Redis Databases  
114 - |--------------------------------------------------------------------------  
115 - |  
116 - | Redis is an open source, fast, and advanced key-value store that also  
117 - | provides a richer body of commands than a typical key-value system  
118 - | such as APC or Memcached. Laravel makes it easy to dig right in.  
119 - |  
120 - */  
121 -  
122 - 'redis' => [  
123 -  
124 - 'client' => env('REDIS_CLIENT', 'phpredis'),  
125 -  
126 - 'options' => [  
127 - 'cluster' => env('REDIS_CLUSTER', 'redis'),  
128 - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),  
129 - ],  
130 -  
131 - 'default' => [  
132 - 'url' => env('REDIS_URL'),  
133 - 'host' => env('REDIS_HOST', '127.0.0.1'),  
134 - 'username' => env('REDIS_USERNAME'),  
135 - 'password' => env('REDIS_PASSWORD'),  
136 - 'port' => env('REDIS_PORT', '6379'),  
137 - 'database' => env('REDIS_DB', '0'),  
138 - ],  
139 -  
140 - 'cache' => [  
141 - 'url' => env('REDIS_URL'),  
142 - 'host' => env('REDIS_HOST', '127.0.0.1'),  
143 - 'username' => env('REDIS_USERNAME'),  
144 - 'password' => env('REDIS_PASSWORD'),  
145 - 'port' => env('REDIS_PORT', '6379'),  
146 - 'database' => env('REDIS_CACHE_DB', '1'),  
147 - ],  
148 -  
149 - ],  
150 -  
151 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Default Filesystem Disk  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | Here you may specify the default filesystem disk that should be used  
11 - | by the framework. The "local" disk, as well as a variety of cloud  
12 - | based disks are available to your application. Just store away!  
13 - |  
14 - */  
15 -  
16 - 'default' => env('FILESYSTEM_DISK', 'local'),  
17 -  
18 - /*  
19 - |--------------------------------------------------------------------------  
20 - | Filesystem Disks  
21 - |--------------------------------------------------------------------------  
22 - |  
23 - | Here you may configure as many filesystem "disks" as you wish, and you  
24 - | may even configure multiple disks of the same driver. Defaults have  
25 - | been set up for each driver as an example of the required values.  
26 - |  
27 - | Supported Drivers: "local", "ftp", "sftp", "s3"  
28 - |  
29 - */  
30 -  
31 - 'disks' => [  
32 -  
33 - 'local' => [  
34 - 'driver' => 'local',  
35 - 'root' => storage_path('app'),  
36 - 'throw' => false,  
37 - ],  
38 -  
39 - 'public' => [  
40 - 'driver' => 'local',  
41 - 'root' => storage_path('app/public'),  
42 - 'url' => env('APP_URL').'/storage',  
43 - 'visibility' => 'public',  
44 - 'throw' => false,  
45 - ],  
46 -  
47 - 's3' => [  
48 - 'driver' => 's3',  
49 - 'key' => env('AWS_ACCESS_KEY_ID'),  
50 - 'secret' => env('AWS_SECRET_ACCESS_KEY'),  
51 - 'region' => env('AWS_DEFAULT_REGION'),  
52 - 'bucket' => env('AWS_BUCKET'),  
53 - 'url' => env('AWS_URL'),  
54 - 'endpoint' => env('AWS_ENDPOINT'),  
55 - 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),  
56 - 'throw' => false,  
57 - ],  
58 -  
59 - ],  
60 -  
61 - /*  
62 - |--------------------------------------------------------------------------  
63 - | Symbolic Links  
64 - |--------------------------------------------------------------------------  
65 - |  
66 - | Here you may configure the symbolic links that will be created when the  
67 - | `storage:link` Artisan command is executed. The array keys should be  
68 - | the locations of the links and the values should be their targets.  
69 - |  
70 - */  
71 -  
72 - 'links' => [  
73 - public_path('storage') => storage_path('app/public'),  
74 - ],  
75 -  
76 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Default Hash Driver  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | This option controls the default hash driver that will be used to hash  
11 - | passwords for your application. By default, the bcrypt algorithm is  
12 - | used; however, you remain free to modify this option if you wish.  
13 - |  
14 - | Supported: "bcrypt", "argon", "argon2id"  
15 - |  
16 - */  
17 -  
18 - 'driver' => 'bcrypt',  
19 -  
20 - /*  
21 - |--------------------------------------------------------------------------  
22 - | Bcrypt Options  
23 - |--------------------------------------------------------------------------  
24 - |  
25 - | Here you may specify the configuration options that should be used when  
26 - | passwords are hashed using the Bcrypt algorithm. This will allow you  
27 - | to control the amount of time it takes to hash the given password.  
28 - |  
29 - */  
30 -  
31 - 'bcrypt' => [  
32 - 'rounds' => env('BCRYPT_ROUNDS', 10),  
33 - ],  
34 -  
35 - /*  
36 - |--------------------------------------------------------------------------  
37 - | Argon Options  
38 - |--------------------------------------------------------------------------  
39 - |  
40 - | Here you may specify the configuration options that should be used when  
41 - | passwords are hashed using the Argon algorithm. These will allow you  
42 - | to control the amount of time it takes to hash the given password.  
43 - |  
44 - */  
45 -  
46 - 'argon' => [  
47 - 'memory' => 65536,  
48 - 'threads' => 1,  
49 - 'time' => 4,  
50 - ],  
51 -  
52 -];  
1 -<?php  
2 -  
3 -use Monolog\Handler\NullHandler;  
4 -use Monolog\Handler\StreamHandler;  
5 -use Monolog\Handler\SyslogUdpHandler;  
6 -  
7 -return [  
8 -  
9 - /*  
10 - |--------------------------------------------------------------------------  
11 - | Default Log Channel  
12 - |--------------------------------------------------------------------------  
13 - |  
14 - | This option defines the default log channel that gets used when writing  
15 - | messages to the logs. The name specified in this option should match  
16 - | one of the channels defined in the "channels" configuration array.  
17 - |  
18 - */  
19 -  
20 - 'default' => env('LOG_CHANNEL', 'stack'),  
21 -  
22 - /*  
23 - |--------------------------------------------------------------------------  
24 - | Deprecations Log Channel  
25 - |--------------------------------------------------------------------------  
26 - |  
27 - | This option controls the log channel that should be used to log warnings  
28 - | regarding deprecated PHP and library features. This allows you to get  
29 - | your application ready for upcoming major versions of dependencies.  
30 - |  
31 - */  
32 -  
33 - 'deprecations' => [  
34 - 'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),  
35 - 'trace' => false,  
36 - ],  
37 -  
38 - /*  
39 - |--------------------------------------------------------------------------  
40 - | Log Channels  
41 - |--------------------------------------------------------------------------  
42 - |  
43 - | Here you may configure the log channels for your application. Out of  
44 - | the box, Laravel uses the Monolog PHP logging library. This gives  
45 - | you a variety of powerful log handlers / formatters to utilize.  
46 - |  
47 - | Available Drivers: "single", "daily", "slack", "syslog",  
48 - | "errorlog", "monolog",  
49 - | "custom", "stack"  
50 - |  
51 - */  
52 -  
53 - 'channels' => [  
54 - 'stack' => [  
55 - 'driver' => 'stack',  
56 - 'channels' => ['single'],  
57 - 'ignore_exceptions' => false,  
58 - ],  
59 -  
60 - 'single' => [  
61 - 'driver' => 'single',  
62 - 'path' => storage_path('logs/laravel.log'),  
63 - 'level' => env('LOG_LEVEL', 'debug'),  
64 - ],  
65 -  
66 - 'daily' => [  
67 - 'driver' => 'daily',  
68 - 'path' => storage_path('logs/laravel.log'),  
69 - 'level' => env('LOG_LEVEL', 'debug'),  
70 - 'days' => 14,  
71 - ],  
72 -  
73 - 'slack' => [  
74 - 'driver' => 'slack',  
75 - 'url' => env('LOG_SLACK_WEBHOOK_URL'),  
76 - 'username' => 'Laravel Log',  
77 - 'emoji' => ':boom:',  
78 - 'level' => env('LOG_LEVEL', 'critical'),  
79 - ],  
80 -  
81 - 'papertrail' => [  
82 - 'driver' => 'monolog',  
83 - 'level' => env('LOG_LEVEL', 'debug'),  
84 - 'handler' => env('LOG_PAPERTRAIL_HANDLER', SyslogUdpHandler::class),  
85 - 'handler_with' => [  
86 - 'host' => env('PAPERTRAIL_URL'),  
87 - 'port' => env('PAPERTRAIL_PORT'),  
88 - 'connectionString' => 'tls://'.env('PAPERTRAIL_URL').':'.env('PAPERTRAIL_PORT'),  
89 - ],  
90 - ],  
91 -  
92 - 'stderr' => [  
93 - 'driver' => 'monolog',  
94 - 'level' => env('LOG_LEVEL', 'debug'),  
95 - 'handler' => StreamHandler::class,  
96 - 'formatter' => env('LOG_STDERR_FORMATTER'),  
97 - 'with' => [  
98 - 'stream' => 'php://stderr',  
99 - ],  
100 - ],  
101 -  
102 - 'syslog' => [  
103 - 'driver' => 'syslog',  
104 - 'level' => env('LOG_LEVEL', 'debug'),  
105 - ],  
106 -  
107 - 'errorlog' => [  
108 - 'driver' => 'errorlog',  
109 - 'level' => env('LOG_LEVEL', 'debug'),  
110 - ],  
111 -  
112 - 'null' => [  
113 - 'driver' => 'monolog',  
114 - 'handler' => NullHandler::class,  
115 - ],  
116 -  
117 - 'emergency' => [  
118 - 'path' => storage_path('logs/laravel.log'),  
119 - ],  
120 - ],  
121 -  
122 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Default Mailer  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | This option controls the default mailer that is used to send any email  
11 - | messages sent by your application. Alternative mailers may be setup  
12 - | and used as needed; however, this mailer will be used by default.  
13 - |  
14 - */  
15 -  
16 - 'default' => env('MAIL_MAILER', 'smtp'),  
17 -  
18 - /*  
19 - |--------------------------------------------------------------------------  
20 - | Mailer Configurations  
21 - |--------------------------------------------------------------------------  
22 - |  
23 - | Here you may configure all of the mailers used by your application plus  
24 - | their respective settings. Several examples have been configured for  
25 - | you and you are free to add your own as your application requires.  
26 - |  
27 - | Laravel supports a variety of mail "transport" drivers to be used while  
28 - | sending an e-mail. You will specify which one you are using for your  
29 - | mailers below. You are free to add additional mailers as required.  
30 - |  
31 - | Supported: "smtp", "sendmail", "mailgun", "ses",  
32 - | "postmark", "log", "array", "failover"  
33 - |  
34 - */  
35 -  
36 - 'mailers' => [  
37 - 'smtp' => [  
38 - 'transport' => 'smtp',  
39 - 'host' => env('MAIL_HOST', 'smtp.mailgun.org'),  
40 - 'port' => env('MAIL_PORT', 587),  
41 - 'encryption' => env('MAIL_ENCRYPTION', 'tls'),  
42 - 'username' => env('MAIL_USERNAME'),  
43 - 'password' => env('MAIL_PASSWORD'),  
44 - 'timeout' => null,  
45 - 'local_domain' => env('MAIL_EHLO_DOMAIN'),  
46 - ],  
47 -  
48 - 'ses' => [  
49 - 'transport' => 'ses',  
50 - ],  
51 -  
52 - 'mailgun' => [  
53 - 'transport' => 'mailgun',  
54 - ],  
55 -  
56 - 'postmark' => [  
57 - 'transport' => 'postmark',  
58 - ],  
59 -  
60 - 'sendmail' => [  
61 - 'transport' => 'sendmail',  
62 - 'path' => env('MAIL_SENDMAIL_PATH', '/usr/sbin/sendmail -bs -i'),  
63 - ],  
64 -  
65 - 'log' => [  
66 - 'transport' => 'log',  
67 - 'channel' => env('MAIL_LOG_CHANNEL'),  
68 - ],  
69 -  
70 - 'array' => [  
71 - 'transport' => 'array',  
72 - ],  
73 -  
74 - 'failover' => [  
75 - 'transport' => 'failover',  
76 - 'mailers' => [  
77 - 'smtp',  
78 - 'log',  
79 - ],  
80 - ],  
81 - ],  
82 -  
83 - /*  
84 - |--------------------------------------------------------------------------  
85 - | Global "From" Address  
86 - |--------------------------------------------------------------------------  
87 - |  
88 - | You may wish for all e-mails sent by your application to be sent from  
89 - | the same address. Here, you may specify a name and address that is  
90 - | used globally for all e-mails that are sent by your application.  
91 - |  
92 - */  
93 -  
94 - 'from' => [  
95 - 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),  
96 - 'name' => env('MAIL_FROM_NAME', 'Example'),  
97 - ],  
98 -  
99 - /*  
100 - |--------------------------------------------------------------------------  
101 - | Markdown Mail Settings  
102 - |--------------------------------------------------------------------------  
103 - |  
104 - | If you are using Markdown based email rendering, you may configure your  
105 - | theme and component paths here, allowing you to customize the design  
106 - | of the emails. Or, you may simply stick with the Laravel defaults!  
107 - |  
108 - */  
109 -  
110 - 'markdown' => [  
111 - 'theme' => 'default',  
112 -  
113 - 'paths' => [  
114 - resource_path('views/vendor/mail'),  
115 - ],  
116 - ],  
117 -  
118 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Default Queue Connection Name  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | Laravel's queue API supports an assortment of back-ends via a single  
11 - | API, giving you convenient access to each back-end using the same  
12 - | syntax for every one. Here you may define a default connection.  
13 - |  
14 - */  
15 -  
16 - 'default' => env('QUEUE_CONNECTION', 'sync'),  
17 -  
18 - /*  
19 - |--------------------------------------------------------------------------  
20 - | Queue Connections  
21 - |--------------------------------------------------------------------------  
22 - |  
23 - | Here you may configure the connection information for each server that  
24 - | is used by your application. A default configuration has been added  
25 - | for each back-end shipped with Laravel. You are free to add more.  
26 - |  
27 - | Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"  
28 - |  
29 - */  
30 -  
31 - 'connections' => [  
32 -  
33 - 'sync' => [  
34 - 'driver' => 'sync',  
35 - ],  
36 -  
37 - 'database' => [  
38 - 'driver' => 'database',  
39 - 'table' => 'jobs',  
40 - 'queue' => 'default',  
41 - 'retry_after' => 90,  
42 - 'after_commit' => false,  
43 - ],  
44 -  
45 - 'beanstalkd' => [  
46 - 'driver' => 'beanstalkd',  
47 - 'host' => 'localhost',  
48 - 'queue' => 'default',  
49 - 'retry_after' => 90,  
50 - 'block_for' => 0,  
51 - 'after_commit' => false,  
52 - ],  
53 -  
54 - 'sqs' => [  
55 - 'driver' => 'sqs',  
56 - 'key' => env('AWS_ACCESS_KEY_ID'),  
57 - 'secret' => env('AWS_SECRET_ACCESS_KEY'),  
58 - 'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),  
59 - 'queue' => env('SQS_QUEUE', 'default'),  
60 - 'suffix' => env('SQS_SUFFIX'),  
61 - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),  
62 - 'after_commit' => false,  
63 - ],  
64 -  
65 - 'redis' => [  
66 - 'driver' => 'redis',  
67 - 'connection' => 'default',  
68 - 'queue' => env('REDIS_QUEUE', 'default'),  
69 - 'retry_after' => 90,  
70 - 'block_for' => null,  
71 - 'after_commit' => false,  
72 - ],  
73 -  
74 - ],  
75 -  
76 - /*  
77 - |--------------------------------------------------------------------------  
78 - | Failed Queue Jobs  
79 - |--------------------------------------------------------------------------  
80 - |  
81 - | These options configure the behavior of failed queue job logging so you  
82 - | can control which database and table are used to store the jobs that  
83 - | have failed. You may change them to any database / table you wish.  
84 - |  
85 - */  
86 -  
87 - 'failed' => [  
88 - 'driver' => env('QUEUE_FAILED_DRIVER', 'database-uuids'),  
89 - 'database' => env('DB_CONNECTION', 'mysql'),  
90 - 'table' => 'failed_jobs',  
91 - ],  
92 -  
93 -];  
1 -<?php  
2 -  
3 -use Laravel\Sanctum\Sanctum;  
4 -  
5 -return [  
6 -  
7 - /*  
8 - |--------------------------------------------------------------------------  
9 - | Stateful Domains  
10 - |--------------------------------------------------------------------------  
11 - |  
12 - | Requests from the following domains / hosts will receive stateful API  
13 - | authentication cookies. Typically, these should include your local  
14 - | and production domains which access your API via a frontend SPA.  
15 - |  
16 - */  
17 -  
18 - 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(  
19 - '%s%s',  
20 - 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',  
21 - Sanctum::currentApplicationUrlWithPort()  
22 - ))),  
23 -  
24 - /*  
25 - |--------------------------------------------------------------------------  
26 - | Sanctum Guards  
27 - |--------------------------------------------------------------------------  
28 - |  
29 - | This array contains the authentication guards that will be checked when  
30 - | Sanctum is trying to authenticate a request. If none of these guards  
31 - | are able to authenticate the request, Sanctum will use the bearer  
32 - | token that's present on an incoming request for authentication.  
33 - |  
34 - */  
35 -  
36 - 'guard' => ['web'],  
37 -  
38 - /*  
39 - |--------------------------------------------------------------------------  
40 - | Expiration Minutes  
41 - |--------------------------------------------------------------------------  
42 - |  
43 - | This value controls the number of minutes until an issued token will be  
44 - | considered expired. If this value is null, personal access tokens do  
45 - | not expire. This won't tweak the lifetime of first-party sessions.  
46 - |  
47 - */  
48 -  
49 - 'expiration' => null,  
50 -  
51 - /*  
52 - |--------------------------------------------------------------------------  
53 - | Sanctum Middleware  
54 - |--------------------------------------------------------------------------  
55 - |  
56 - | When authenticating your first-party SPA with Sanctum you may need to  
57 - | customize some of the middleware Sanctum uses while processing the  
58 - | request. You may change the middleware listed below as required.  
59 - |  
60 - */  
61 -  
62 - 'middleware' => [  
63 - 'verify_csrf_token' => App\Http\Middleware\VerifyCsrfToken::class,  
64 - 'encrypt_cookies' => App\Http\Middleware\EncryptCookies::class,  
65 - ],  
66 -  
67 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | Third Party Services  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | This file is for storing the credentials for third party services such  
11 - | as Mailgun, Postmark, AWS and more. This file provides the de facto  
12 - | location for this type of information, allowing packages to have  
13 - | a conventional file to locate the various service credentials.  
14 - |  
15 - */  
16 -  
17 - 'mailgun' => [  
18 - 'domain' => env('MAILGUN_DOMAIN'),  
19 - 'secret' => env('MAILGUN_SECRET'),  
20 - 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),  
21 - 'scheme' => 'https',  
22 - ],  
23 -  
24 - 'postmark' => [  
25 - 'token' => env('POSTMARK_TOKEN'),  
26 - ],  
27 -  
28 - 'ses' => [  
29 - 'key' => env('AWS_ACCESS_KEY_ID'),  
30 - 'secret' => env('AWS_SECRET_ACCESS_KEY'),  
31 - 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),  
32 - ],  
33 -  
34 -];  
1 -<?php  
2 -  
3 -use Illuminate\Support\Str;  
4 -  
5 -return [  
6 -  
7 - /*  
8 - |--------------------------------------------------------------------------  
9 - | Default Session Driver  
10 - |--------------------------------------------------------------------------  
11 - |  
12 - | This option controls the default session "driver" that will be used on  
13 - | requests. By default, we will use the lightweight native driver but  
14 - | you may specify any of the other wonderful drivers provided here.  
15 - |  
16 - | Supported: "file", "cookie", "database", "apc",  
17 - | "memcached", "redis", "dynamodb", "array"  
18 - |  
19 - */  
20 -  
21 - 'driver' => env('SESSION_DRIVER', 'file'),  
22 -  
23 - /*  
24 - |--------------------------------------------------------------------------  
25 - | Session Lifetime  
26 - |--------------------------------------------------------------------------  
27 - |  
28 - | Here you may specify the number of minutes that you wish the session  
29 - | to be allowed to remain idle before it expires. If you want them  
30 - | to immediately expire on the browser closing, set that option.  
31 - |  
32 - */  
33 -  
34 - 'lifetime' => env('SESSION_LIFETIME', 120),  
35 -  
36 - 'expire_on_close' => false,  
37 -  
38 - /*  
39 - |--------------------------------------------------------------------------  
40 - | Session Encryption  
41 - |--------------------------------------------------------------------------  
42 - |  
43 - | This option allows you to easily specify that all of your session data  
44 - | should be encrypted before it is stored. All encryption will be run  
45 - | automatically by Laravel and you can use the Session like normal.  
46 - |  
47 - */  
48 -  
49 - 'encrypt' => false,  
50 -  
51 - /*  
52 - |--------------------------------------------------------------------------  
53 - | Session File Location  
54 - |--------------------------------------------------------------------------  
55 - |  
56 - | When using the native session driver, we need a location where session  
57 - | files may be stored. A default has been set for you but a different  
58 - | location may be specified. This is only needed for file sessions.  
59 - |  
60 - */  
61 -  
62 - 'files' => storage_path('framework/sessions'),  
63 -  
64 - /*  
65 - |--------------------------------------------------------------------------  
66 - | Session Database Connection  
67 - |--------------------------------------------------------------------------  
68 - |  
69 - | When using the "database" or "redis" session drivers, you may specify a  
70 - | connection that should be used to manage these sessions. This should  
71 - | correspond to a connection in your database configuration options.  
72 - |  
73 - */  
74 -  
75 - 'connection' => env('SESSION_CONNECTION'),  
76 -  
77 - /*  
78 - |--------------------------------------------------------------------------  
79 - | Session Database Table  
80 - |--------------------------------------------------------------------------  
81 - |  
82 - | When using the "database" session driver, you may specify the table we  
83 - | should use to manage the sessions. Of course, a sensible default is  
84 - | provided for you; however, you are free to change this as needed.  
85 - |  
86 - */  
87 -  
88 - 'table' => 'sessions',  
89 -  
90 - /*  
91 - |--------------------------------------------------------------------------  
92 - | Session Cache Store  
93 - |--------------------------------------------------------------------------  
94 - |  
95 - | While using one of the framework's cache driven session backends you may  
96 - | list a cache store that should be used for these sessions. This value  
97 - | must match with one of the application's configured cache "stores".  
98 - |  
99 - | Affects: "apc", "dynamodb", "memcached", "redis"  
100 - |  
101 - */  
102 -  
103 - 'store' => env('SESSION_STORE'),  
104 -  
105 - /*  
106 - |--------------------------------------------------------------------------  
107 - | Session Sweeping Lottery  
108 - |--------------------------------------------------------------------------  
109 - |  
110 - | Some session drivers must manually sweep their storage location to get  
111 - | rid of old sessions from storage. Here are the chances that it will  
112 - | happen on a given request. By default, the odds are 2 out of 100.  
113 - |  
114 - */  
115 -  
116 - 'lottery' => [2, 100],  
117 -  
118 - /*  
119 - |--------------------------------------------------------------------------  
120 - | Session Cookie Name  
121 - |--------------------------------------------------------------------------  
122 - |  
123 - | Here you may change the name of the cookie used to identify a session  
124 - | instance by ID. The name specified here will get used every time a  
125 - | new session cookie is created by the framework for every driver.  
126 - |  
127 - */  
128 -  
129 - 'cookie' => env(  
130 - 'SESSION_COOKIE',  
131 - Str::slug(env('APP_NAME', 'laravel'), '_').'_session'  
132 - ),  
133 -  
134 - /*  
135 - |--------------------------------------------------------------------------  
136 - | Session Cookie Path  
137 - |--------------------------------------------------------------------------  
138 - |  
139 - | The session cookie path determines the path for which the cookie will  
140 - | be regarded as available. Typically, this will be the root path of  
141 - | your application but you are free to change this when necessary.  
142 - |  
143 - */  
144 -  
145 - 'path' => '/',  
146 -  
147 - /*  
148 - |--------------------------------------------------------------------------  
149 - | Session Cookie Domain  
150 - |--------------------------------------------------------------------------  
151 - |  
152 - | Here you may change the domain of the cookie used to identify a session  
153 - | in your application. This will determine which domains the cookie is  
154 - | available to in your application. A sensible default has been set.  
155 - |  
156 - */  
157 -  
158 - 'domain' => env('SESSION_DOMAIN'),  
159 -  
160 - /*  
161 - |--------------------------------------------------------------------------  
162 - | HTTPS Only Cookies  
163 - |--------------------------------------------------------------------------  
164 - |  
165 - | By setting this option to true, session cookies will only be sent back  
166 - | to the server if the browser has a HTTPS connection. This will keep  
167 - | the cookie from being sent to you when it can't be done securely.  
168 - |  
169 - */  
170 -  
171 - 'secure' => env('SESSION_SECURE_COOKIE'),  
172 -  
173 - /*  
174 - |--------------------------------------------------------------------------  
175 - | HTTP Access Only  
176 - |--------------------------------------------------------------------------  
177 - |  
178 - | Setting this value to true will prevent JavaScript from accessing the  
179 - | value of the cookie and the cookie will only be accessible through  
180 - | the HTTP protocol. You are free to modify this option if needed.  
181 - |  
182 - */  
183 -  
184 - 'http_only' => true,  
185 -  
186 - /*  
187 - |--------------------------------------------------------------------------  
188 - | Same-Site Cookies  
189 - |--------------------------------------------------------------------------  
190 - |  
191 - | This option determines how your cookies behave when cross-site requests  
192 - | take place, and can be used to mitigate CSRF attacks. By default, we  
193 - | will set this value to "lax" since this is a secure default value.  
194 - |  
195 - | Supported: "lax", "strict", "none", null  
196 - |  
197 - */  
198 -  
199 - 'same_site' => 'lax',  
200 -  
201 -];  
1 -<?php  
2 -  
3 -return [  
4 -  
5 - /*  
6 - |--------------------------------------------------------------------------  
7 - | View Storage Paths  
8 - |--------------------------------------------------------------------------  
9 - |  
10 - | Most templating systems load templates from disk. Here you may specify  
11 - | an array of paths that should be checked for your views. Of course  
12 - | the usual Laravel view path has already been registered for you.  
13 - |  
14 - */  
15 -  
16 - 'paths' => [  
17 - resource_path('views'),  
18 - ],  
19 -  
20 - /*  
21 - |--------------------------------------------------------------------------  
22 - | Compiled View Path  
23 - |--------------------------------------------------------------------------  
24 - |  
25 - | This option determines where all the compiled Blade templates will be  
26 - | stored for your application. Typically, this is within the storage  
27 - | directory. However, as usual, you are free to change this value.  
28 - |  
29 - */  
30 -  
31 - 'compiled' => env(  
32 - 'VIEW_COMPILED_PATH',  
33 - realpath(storage_path('framework/views'))  
34 - ),  
35 -  
36 -];  
1 -<?php  
2 -  
3 -namespace Database\Factories;  
4 -  
5 -use Illuminate\Database\Eloquent\Factories\Factory;  
6 -use Illuminate\Support\Str;  
7 -  
8 -/**  
9 - * @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\User>  
10 - */  
11 -class UserFactory extends Factory  
12 -{  
13 - /**  
14 - * Define the model's default state.  
15 - *  
16 - * @return array<string, mixed>  
17 - */  
18 - public function definition()  
19 - {  
20 - return [  
21 - 'name' => fake()->name(),  
22 - 'email' => fake()->unique()->safeEmail(),  
23 - 'email_verified_at' => now(),  
24 - 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password  
25 - 'remember_token' => Str::random(10),  
26 - ];  
27 - }  
28 -  
29 - /**  
30 - * Indicate that the model's email address should be unverified.  
31 - *  
32 - * @return static  
33 - */  
34 - public function unverified()  
35 - {  
36 - return $this->state(fn (array $attributes) => [  
37 - 'email_verified_at' => null,  
38 - ]);  
39 - }  
40 -}  
1 -<?php  
2 -  
3 -use Illuminate\Database\Migrations\Migration;  
4 -use Illuminate\Database\Schema\Blueprint;  
5 -use Illuminate\Support\Facades\Schema;  
6 -  
7 -return new class extends Migration  
8 -{  
9 - /**  
10 - * Run the migrations.  
11 - *  
12 - * @return void  
13 - */  
14 - public function up()  
15 - {  
16 - Schema::create('users', function (Blueprint $table) {  
17 - $table->id();  
18 - $table->string('name');  
19 - $table->string('email')->unique();  
20 - $table->timestamp('email_verified_at')->nullable();  
21 - $table->string('password');  
22 - $table->rememberToken();  
23 - $table->timestamps();  
24 - });  
25 - }  
26 -  
27 - /**  
28 - * Reverse the migrations.  
29 - *  
30 - * @return void  
31 - */  
32 - public function down()  
33 - {  
34 - Schema::dropIfExists('users');  
35 - }  
36 -};  
1 -<?php  
2 -  
3 -use Illuminate\Database\Migrations\Migration;  
4 -use Illuminate\Database\Schema\Blueprint;  
5 -use Illuminate\Support\Facades\Schema;  
6 -  
7 -return new class extends Migration  
8 -{  
9 - /**  
10 - * Run the migrations.  
11 - *  
12 - * @return void  
13 - */  
14 - public function up()  
15 - {  
16 - Schema::create('password_resets', function (Blueprint $table) {  
17 - $table->string('email')->primary();  
18 - $table->string('token');  
19 - $table->timestamp('created_at')->nullable();  
20 - });  
21 - }  
22 -  
23 - /**  
24 - * Reverse the migrations.  
25 - *  
26 - * @return void  
27 - */  
28 - public function down()  
29 - {  
30 - Schema::dropIfExists('password_resets');  
31 - }  
32 -};  
1 -<?php  
2 -  
3 -use Illuminate\Database\Migrations\Migration;  
4 -use Illuminate\Database\Schema\Blueprint;  
5 -use Illuminate\Support\Facades\Schema;  
6 -  
7 -return new class extends Migration  
8 -{  
9 - /**  
10 - * Run the migrations.  
11 - *  
12 - * @return void  
13 - */  
14 - public function up()  
15 - {  
16 - Schema::create('failed_jobs', function (Blueprint $table) {  
17 - $table->id();  
18 - $table->string('uuid')->unique();  
19 - $table->text('connection');  
20 - $table->text('queue');  
21 - $table->longText('payload');  
22 - $table->longText('exception');  
23 - $table->timestamp('failed_at')->useCurrent();  
24 - });  
25 - }  
26 -  
27 - /**  
28 - * Reverse the migrations.  
29 - *  
30 - * @return void  
31 - */  
32 - public function down()  
33 - {  
34 - Schema::dropIfExists('failed_jobs');  
35 - }  
36 -};  
1 -<?php  
2 -  
3 -use Illuminate\Database\Migrations\Migration;  
4 -use Illuminate\Database\Schema\Blueprint;  
5 -use Illuminate\Support\Facades\Schema;  
6 -  
7 -return new class extends Migration  
8 -{  
9 - /**  
10 - * Run the migrations.  
11 - *  
12 - * @return void  
13 - */  
14 - public function up()  
15 - {  
16 - Schema::create('personal_access_tokens', function (Blueprint $table) {  
17 - $table->id();  
18 - $table->morphs('tokenable');  
19 - $table->string('name');  
20 - $table->string('token', 64)->unique();  
21 - $table->text('abilities')->nullable();  
22 - $table->timestamp('last_used_at')->nullable();  
23 - $table->timestamp('expires_at')->nullable();  
24 - $table->timestamps();  
25 - });  
26 - }  
27 -  
28 - /**  
29 - * Reverse the migrations.  
30 - *  
31 - * @return void  
32 - */  
33 - public function down()  
34 - {  
35 - Schema::dropIfExists('personal_access_tokens');  
36 - }  
37 -};  
1 -<?php  
2 -  
3 -namespace Database\Seeders;  
4 -  
5 -// use Illuminate\Database\Console\Seeds\WithoutModelEvents;  
6 -use Illuminate\Database\Seeder;  
7 -  
8 -class DatabaseSeeder extends Seeder  
9 -{  
10 - /**  
11 - * Seed the application's database.  
12 - *  
13 - * @return void  
14 - */  
15 - public function run()  
16 - {  
17 - // \App\Models\User::factory(10)->create();  
18 -  
19 - // \App\Models\User::factory()->create([  
20 - // 'name' => 'Test User',  
21 - // 'email' => 'test@example.com',  
22 - // ]);  
23 - }  
24 -}  
  1 +<?php
  2 +
  3 +
  4 +/**
  5 + * redis 驱动
  6 + * @return RedisPool
  7 + * @author:dc
  8 + * @time 2023/2/13 9:44
  9 + */
  10 +function redis():\RedisPool {
  11 +
  12 + return \RedisPool::instance(co::getCid());
  13 +
  14 +}
  15 +
  16 +
  17 +/**
  18 + * 操作db
  19 + * @return DbPool
  20 + * @author:dc
  21 + * @time 2023/2/13 9:43
  22 + */
  23 +function db():DbPool{
  24 +
  25 + return DbPool::instance(co::getCid());
  26 +}
  27 +
  28 +function model($model){
  29 +
  30 +}
  31 +
  32 +
  33 +
  34 +/**
  35 + * 记录日志
  36 + * @param $message
  37 + * @author:dc
  38 + * @time 2023/2/10 14:58
  39 + */
  40 +function logs($message,$filename=null){
  41 + @file_put_contents(
  42 + $filename ? $filename : LOG_PATH.'/error.log',
  43 + print_r($message,true),
  44 + FILE_APPEND
  45 + );
  46 +}
  47 +
  48 +
  49 +/**
  50 + * 消息输出
  51 + * @param $message
  52 + * @author:dc
  53 + * @time 2023/2/10 15:42
  54 + */
  55 +function _echo($message){
  56 + echo date('Y-m-d H:i:s').' '.$message."\n";
  57 +}
  58 +
  59 +
  60 +
  61 +/**
  62 + * 文本消息,多语言
  63 + * @param $key
  64 + * @return mixed
  65 + * @author:dc
  66 + * @time 2023/2/13 10:51
  67 + */
  68 +function __($key):mixed{
  69 + return $key ? \Lib\Lang::msg($key) : '';
  70 +}
  71 +
  72 +
  73 +/**
  74 + * @return \Lib\App
  75 + * @author:dc
  76 + * @time 2023/2/13 11:48
  77 + */
  78 +function app():\Lib\App{
  79 + return \Lib\App::instance();
  80 +}
  81 +
  82 +
  83 +/**
  84 + * 过滤函数
  85 + * @param $value
  86 + * @param null $filter
  87 + * @return array|false|float|int|mixed
  88 + * @author:dc
  89 + * @time 2023/2/13 11:54
  90 + */
  91 +function my_filter($value,$filter=null){
  92 + if(is_array($value)){
  93 + foreach ($value as $key=>$val){
  94 + $value[$key] = my_filter($val,$filter);
  95 + }
  96 + } else {
  97 + // 过滤函数
  98 + if(!is_array($filter)){
  99 + $filter = [$filter];
  100 + }
  101 + // 合并默认过滤
  102 + $filter = array_merge(['trim'], $filter);
  103 +
  104 + // 循环过滤
  105 + foreach ($filter as $fil){
  106 + $fil && $value = call_user_func($fil,$value);
  107 + }
  108 + }
  109 + // 强制转类型
  110 + if(is_numeric($value)&&strlen($value)<10&&intval(substr($value,0,1))!==0){
  111 + if(strpos($value,'.')!==false){
  112 +// $value = doubleval($value); 这个要报毒,华为电脑
  113 + $value = floatval($value);
  114 + }else{
  115 + $value = intval($value);
  116 + }
  117 + }
  118 +
  119 + return $value;
  120 +}