作者 邓超

1

@@ -5,6 +5,7 @@ @@ -5,6 +5,7 @@
5 "license": "MIT", 5 "license": "MIT",
6 "require": { 6 "require": {
7 "php": "^8.0.2", 7 "php": "^8.0.2",
  8 + "ext-pdo": "*",
8 "phpmailer/phpmailer": "^6.7" 9 "phpmailer/phpmailer": "^6.7"
9 }, 10 },
10 "require-dev": { 11 "require-dev": {
1 <?php 1 <?php
2 2
  3 +error_reporting(E_ERROR | E_NOTICE);
  4 +
3 // 开启4个进程 5 // 开启4个进程
4 define('WORKER_NUM',4); 6 define('WORKER_NUM',4);
5 // 开启100个协程 7 // 开启100个协程
@@ -21,64 +21,63 @@ class Home { @@ -21,64 +21,63 @@ class Home {
21 // $mail,$password,$imap,$smtp 21 // $mail,$password,$imap,$smtp
22 $formData = app()->request(['email','password','imap','smtp']); 22 $formData = app()->request(['email','password','imap','smtp']);
23 23
24 - if(empty($formData['email']) || !preg_match("",$formData['email'])){ 24 + if(empty($formData['email']) || !preg_match("//",$formData['email'])){
25 app()->e('email_verify_error'); 25 app()->e('email_verify_error');
26 } 26 }
27 27
28 -  
29 - $validator = validator($formData,[  
30 - 'email' => ['required','email'],  
31 - 'password' => ['required','min:8','max:32'],  
32 - 'imap' => ['required'],  
33 - 'smtp' => ['required'],  
34 - ],[  
35 -  
36 - ]);  
37 -  
38 - if($validator->fails()){  
39 - return res()  
40 - ->message($validator->errors()->first())  
41 - ->status(400)  
42 - ->toJson(); 28 + if(empty($formData['password'])){
  29 + app()->e('password_verify_error');
43 } 30 }
44 31
45 - // host  
46 - $model = Email::_first($formData['email']);  
47 - if(!$model){  
48 - $model = new Email();  
49 - $model->email = $formData['email']; 32 + if(empty($formData['imap'])){
  33 + app()->e('imap_verify_error');
50 } 34 }
51 35
52 - $model->imap = $formData['imap'];  
53 - $model->smtp = $formData['smtp'];  
54 - $model->status = Email::STATUS_ACTIVE;  
55 - $model->password = @base64_encode($formData['password']);  
56 -  
57 - try {  
58 - Mail::login($model->email,$model->password,$model->imap);  
59 - }catch (\Throwable $e){  
60 - return res()  
61 - ->message($e->getMessage())  
62 - ->status(400)  
63 - ->toJson(); 36 + if(empty($formData['smtp'])){
  37 + app()->e('smtp_verify_error');
64 } 38 }
65 39
66 - // 登录成功了,密码验证字段通过  
67 - $model->pwd_error = 0;  
68 - // 保存好邮箱  
69 - $model->save();  
70 -  
71 - // 设置上id,方便后面使用  
72 - Mail::$client[$model->email]->setId($model->id);  
73 -  
74 - // 开始同步文件夹  
75 -// $folder = Mail::syncFolder($model->email);  
76 -  
77 - return res()  
78 - ->data([  
79 - 'token' => token_en($model->id.','.$model->email.','.time())  
80 - ])  
81 - ->toJson(); 40 + $data = db()->first(\Model\email::first($formData['email']));
  41 +
  42 + app()->_json($data);
  43 +
  44 +// // host
  45 +// $model = Email::_first($formData['email']);
  46 +// if(!$model){
  47 +// $model = new Email();
  48 +// $model->email = $formData['email'];
  49 +// }
  50 +//
  51 +// $model->imap = $formData['imap'];
  52 +// $model->smtp = $formData['smtp'];
  53 +// $model->status = Email::STATUS_ACTIVE;
  54 +// $model->password = @base64_encode($formData['password']);
  55 +//
  56 +// try {
  57 +// Mail::login($model->email,$model->password,$model->imap);
  58 +// }catch (\Throwable $e){
  59 +// return res()
  60 +// ->message($e->getMessage())
  61 +// ->status(400)
  62 +// ->toJson();
  63 +// }
  64 +//
  65 +// // 登录成功了,密码验证字段通过
  66 +// $model->pwd_error = 0;
  67 +// // 保存好邮箱
  68 +// $model->save();
  69 +//
  70 +// // 设置上id,方便后面使用
  71 +// Mail::$client[$model->email]->setId($model->id);
  72 +//
  73 +// // 开始同步文件夹
  74 +//// $folder = Mail::syncFolder($model->email);
  75 +//
  76 +// return res()
  77 +// ->data([
  78 +// 'token' => token_en($model->id.','.$model->email.','.time())
  79 +// ])
  80 +// ->toJson();
82 81
83 } 82 }
84 83
  1 +<?php
  2 +
  3 +echo co::getCid();
@@ -3,31 +3,29 @@ @@ -3,31 +3,29 @@
3 3
4 /** 4 /**
5 * redis 驱动 5 * redis 驱动
6 - * @return RedisPool 6 + * @return \Lib\RedisPool
7 * @author:dc 7 * @author:dc
8 * @time 2023/2/13 9:44 8 * @time 2023/2/13 9:44
9 */ 9 */
10 -function redis():\RedisPool { 10 +function redis():\Lib\RedisPool {
11 11
12 - return \RedisPool::instance(co::getCid()); 12 + return \Lib\RedisPool::instance(co::getCid());
13 13
14 } 14 }
15 15
16 16
17 /** 17 /**
18 * 操作db 18 * 操作db
19 - * @return DbPool 19 + * @return \Lib\DbPool
20 * @author:dc 20 * @author:dc
21 - * @time 2023/2/13 9:43 21 + * @time 2023/2/13 14:15
22 */ 22 */
23 -function db():DbPool{ 23 +function db():\Lib\DbPool{
24 24
25 - return DbPool::instance(co::getCid()); 25 + return \Lib\DbPool::instance(co::getCid());
26 } 26 }
27 27
28 -function model($model){  
29 28
30 -}  
31 29
32 30
33 31
@@ -40,7 +38,7 @@ function model($model){ @@ -40,7 +38,7 @@ function model($model){
40 function logs($message,$filename=null){ 38 function logs($message,$filename=null){
41 @file_put_contents( 39 @file_put_contents(
42 $filename ? $filename : LOG_PATH.'/error.log', 40 $filename ? $filename : LOG_PATH.'/error.log',
43 - print_r($message,true), 41 + print_r($message,true).PHP_EOL,
44 FILE_APPEND 42 FILE_APPEND
45 ); 43 );
46 } 44 }
@@ -9,4 +9,9 @@ return [ @@ -9,4 +9,9 @@ return [
9 'route_not_found' => '页面不存在', 9 'route_not_found' => '页面不存在',
10 10
11 'email_verify_error' => '邮箱验证失败', 11 'email_verify_error' => '邮箱验证失败',
  12 + 'password_verify_error' => '密码必须',
  13 + 'imap_verify_error' => 'imap服务器地址错误',
  14 + 'smtp_verify_error' => 'smtp服务器地址错误',
  15 +
  16 + 'server_error' => '服务器异常',
12 ]; 17 ];
@@ -2,6 +2,12 @@ @@ -2,6 +2,12 @@
2 2
3 namespace Lib; 3 namespace Lib;
4 4
  5 +/**
  6 + * @author:dc
  7 + * @time 2023/2/13 15:07
  8 + * Class App
  9 + * @package Lib
  10 + */
5 class App { 11 class App {
6 12
7 /** 13 /**
@@ -32,6 +38,13 @@ class App { @@ -32,6 +38,13 @@ class App {
32 */ 38 */
33 private array $request = []; 39 private array $request = [];
34 40
  41 +
  42 + /**
  43 + * TODO:: 如果debug打开,错误时会返回错误消息到前端
  44 + * @var bool
  45 + */
  46 + public bool $debug = true;
  47 +
35 /** 48 /**
36 * 输出到前端的数据 49 * 输出到前端的数据
37 * @var array 50 * @var array
@@ -101,10 +114,17 @@ class App { @@ -101,10 +114,17 @@ class App {
101 // 记录日志 114 // 记录日志
102 $filename = LOG_PATH.'/'.$app->nowDate().'.log'; 115 $filename = LOG_PATH.'/'.$app->nowDate().'.log';
103 logs( 116 logs(
104 - $exception->getMessage().PHP_EOL.$exception->getTraceAsString(), 117 + $app->nowDateTime().' '.$exception->getMessage().PHP_EOL.$exception->getTraceAsString(),
105 $filename 118 $filename
106 ); 119 );
  120 +
  121 + // 非 Err 错误类型
  122 + $app->data = [
  123 + 'message' => $app->debug ? $exception->getMessage().PHP_EOL.$exception->getTraceAsString() : __('server_error'),
  124 + 'status' => $exception->getCode() ? $exception->getCode() : 500,
  125 + ];
107 } 126 }
  127 +
108 } 128 }
109 129
110 } 130 }
@@ -124,6 +144,8 @@ class App { @@ -124,6 +144,8 @@ class App {
124 if (is_string($name)){ 144 if (is_string($name)){
125 return $this->request[$name]??$default; 145 return $this->request[$name]??$default;
126 } 146 }
  147 +
  148 + if(is_array($name)){
127 $data = []; 149 $data = [];
128 foreach ($this->request as $key=>$value){ 150 foreach ($this->request as $key=>$value){
129 if(in_array($key,$name)){ 151 if(in_array($key,$name)){
@@ -132,6 +154,8 @@ class App { @@ -132,6 +154,8 @@ class App {
132 } 154 }
133 return $data; 155 return $data;
134 } 156 }
  157 + return null;
  158 + }
135 159
136 160
137 /** 161 /**
1 <?php 1 <?php
2 2
  3 +namespace Lib;
  4 +
  5 +/**
  6 + * db 池
  7 + * @author:dc
  8 + * @time 2023/2/13 15:03
  9 + * Class DbPool
  10 + * @package Lib
  11 + */
3 class DbPool { 12 class DbPool {
4 13
5 /** 14 /**
6 - * @var DbPool[] 15 + * @var \Lib\DbPool[]
7 */ 16 */
8 static $instance = []; 17 static $instance = [];
9 18
@@ -22,6 +31,18 @@ class DbPool { @@ -22,6 +31,18 @@ class DbPool {
22 return $this->client; 31 return $this->client;
23 } 32 }
24 33
  34 + /**
  35 + * 表
  36 + * @var string
  37 + */
  38 + private string $table;
  39 +
  40 + /**
  41 + * 查询条件
  42 + * @var string|array
  43 + */
  44 + private string | array $where;
  45 +
25 46
26 public function __construct() 47 public function __construct()
27 { 48 {
@@ -33,7 +54,7 @@ class DbPool { @@ -33,7 +54,7 @@ class DbPool {
33 [ 54 [
34 \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, 55 \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
35 \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'", 56 \PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8mb4'",
36 - PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 57 + \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
37 ] 58 ]
38 ); 59 );
39 }catch (\PDOException $e){ 60 }catch (\PDOException $e){
@@ -43,17 +64,64 @@ class DbPool { @@ -43,17 +64,64 @@ class DbPool {
43 } 64 }
44 65
45 66
46 - public function query($sql){ 67 + /**
  68 + * 表
  69 + * @param $table
  70 + * @return $this
  71 + * @author:dc
  72 + * @time 2023/2/13 14:36
  73 + */
  74 + public function table($table){
  75 + $this->table = $table;
  76 + return $this;
  77 + }
  78 +
  79 + /**
  80 + * 条件
  81 + * @param string|array $where
  82 + * @return $this
  83 + * @author:dc
  84 + * @time 2023/2/13 14:38
  85 + */
  86 + public function where(string|array $where){
  87 + $this->where = $where;
  88 + return $this;
  89 + }
  90 +
  91 +
  92 + /**
  93 + * @param $sql
  94 + * @param null $params
  95 + * @return false|\PDOStatement
  96 + * @author:dc
  97 + * @time 2023/2/13 14:41
  98 + */
  99 + private function query($sql,$params=null){
47 100
48 } 101 }
49 102
  103 +
50 public function get($sql){ 104 public function get($sql){
51 105
52 } 106 }
53 107
54 108
55 - public function first($sql){ 109 + /**
  110 + * 查询一条数据
  111 + * @param string|array $sql
  112 + * @return mixed|null
  113 + * @author:dc
  114 + * @time 2023/2/13 14:54
  115 + */
  116 + public function first(string|array $sql){
  117 +
  118 + $query = $this->client->prepare(is_array($sql) ? $sql[0] : $sql);
  119 +
  120 + if($query->execute(is_array($sql) ? $sql[1] : null)){
  121 + return $query->fetch();
  122 + }
56 123
  124 + return null;
57 } 125 }
58 126
59 127
@@ -68,9 +136,9 @@ class DbPool { @@ -68,9 +136,9 @@ class DbPool {
68 * @author:dc 136 * @author:dc
69 * @time 2023/2/13 9:39 137 * @time 2023/2/13 9:39
70 */ 138 */
71 - public static function instance($cid){ 139 + public static function instance($cid=0){
72 if(empty(static::$instance[$cid])){ 140 if(empty(static::$instance[$cid])){
73 - static::$instance[$cid] = new \RedisPool(); 141 + static::$instance[$cid] = new DbPool();
74 } 142 }
75 return static::$instance[$cid]; 143 return static::$instance[$cid];
76 } 144 }
1 <?php 1 <?php
2 2
  3 +namespace Lib;
  4 +
3 /** 5 /**
4 * redis 链接池 6 * redis 链接池
5 * @author:dc 7 * @author:dc
@@ -9,7 +11,7 @@ @@ -9,7 +11,7 @@
9 class RedisPool { 11 class RedisPool {
10 12
11 /** 13 /**
12 - * @var RedisPool[] 14 + * @var \Lib\RedisPool[]
13 */ 15 */
14 static $instance = []; 16 static $instance = [];
15 17
@@ -168,13 +170,13 @@ class RedisPool { @@ -168,13 +170,13 @@ class RedisPool {
168 170
169 /** 171 /**
170 * @param $cid 172 * @param $cid
171 - * @return RedisPool 173 + * @return \Lib\RedisPool
172 * @author:dc 174 * @author:dc
173 * @time 2023/2/13 9:38 175 * @time 2023/2/13 9:38
174 */ 176 */
175 public static function instance($cid){ 177 public static function instance($cid){
176 if(empty(static::$instance[$cid])){ 178 if(empty(static::$instance[$cid])){
177 - static::$instance[$cid] = new \RedisPool(); 179 + static::$instance[$cid] = new \Lib\RedisPool();
178 } 180 }
179 return static::$instance[$cid]; 181 return static::$instance[$cid];
180 } 182 }
1 <?php 1 <?php
2 2
  3 +namespace Model;
  4 +
  5 +/**
  6 + * @author:dc
  7 + * @time 2023/2/13 14:11
  8 + * Class email
  9 + */
3 class email { 10 class email {
4 11
  12 +
  13 + /**
  14 + * 通过email查询
  15 + * @param $email
  16 + * @return array
  17 + * @author:dc
  18 + * @time 2023/2/13 14:50
  19 + */
  20 + public static function first($email){
  21 + return [
  22 + "select * from `emails` where `email` = ? limit 1",
  23 + [
  24 + $email
  25 + ]
  26 + ];
  27 + }
  28 +
  29 +
5 } 30 }