From b6b094ce9296e03af031b4f81ca7d980a34143a3 Mon Sep 17 00:00:00 2001 From: tsf <460834639@qq.com> Date: Fri, 15 Mar 2024 18:15:17 +0800 Subject: [PATCH] =?UTF-8?q?=E9=83=A8=E5=88=86=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/admin/view/login/login.html | 1 - application/app/controller/Card.php | 104 +++++++++++ application/app/controller/Index.php | 81 +++++++-- application/app/controller/Login.php | 222 ++++++++++++++++++++++-- composer.json | 3 +- public/tsf/demoooo.jpg | Bin 0 -> 25803 bytes 6 files changed, 376 insertions(+), 35 deletions(-) create mode 100644 application/app/controller/Card.php create mode 100644 public/tsf/demoooo.jpg diff --git a/application/admin/view/login/login.html b/application/admin/view/login/login.html index be4a295..b1b7bf5 100644 --- a/application/admin/view/login/login.html +++ b/application/admin/view/login/login.html @@ -19,7 +19,6 @@
教育体测管理后台
-

diff --git a/application/app/controller/Card.php b/application/app/controller/Card.php new file mode 100644 index 0000000..25b949c --- /dev/null +++ b/application/app/controller/Card.php @@ -0,0 +1,104 @@ +select(); + $data = []; + if($type == 1){ + for ($i=0; $i < count($result); $i++) { + array_push($data,['id'=>$result[$i]['id'],'name'=>$result[$i]['name']]); + } + }else{ + // 如果需要详细信息再从中编辑信息 + $data = $result; + } + return $this->msg(0,'success',$data); + } + + // 获取默认卡片规则 + // $type 1获取列表,2获取详细信息 + public function get_card_rule(){ + $result = Db::table('app_card_data')->select(); + $data = []; + if($type == 1){ + for ($i=0; $i < count($result); $i++) { + array_push($data,['id'=>$result[$i]['id'],'name'=>$result[$i]['name']]); + } + }else{ + // 如果需要详细信息再从中编辑信息 + $data = $result; + } + return $this->msg(0,'success',$data); + } + + // 新建卡片 + public function create_card(){ + + } + + + + + + ################################################################other################################################################ + ################################################################other################################################################ + ################################################################other################################################################ + + public function verify_parameters($data,$type){ + // 设置验证 + $rule = [ + 'aan_id' => 'require|number', + 'nickname' => 'require|chsAlpha', + 'birthday' => 'require|date', + 'gender' => 'require|number|in:0,1,2', + ]; + $msg = [ + 'aan_id.require' => '账号信息缺失', + 'nickname.require' => '昵称缺失', + 'birthday.require' => '生日缺失', + 'gender.require' => '性别缺失', + + 'aan_id.number' => '账号信息格式错误', + 'nickname.chsAlpha' => '昵称只能是只能是汉字、字母', + 'birthday.date' => '生日信息格式错误', + 'gender.number' => '性别格式错误', + 'gender.in' => '性别信息错误', + ]; + $validate = new Validate($rule,$msg); + $result = $validate->check($data); + if(!$result){ + return $validate->getError(); + } + + $parameter['aan_id'] = $data['aan_id']; + $parameter['nickname'] = $data['nickname']; + $parameter['birthday'] = $data['birthday']; + $parameter['gender'] = $data['gender']; + $parameter['create_time'] = date('Y-m-d H:i:s'); + $parameter['last_update_time'] = date('Y-m-d H:i:s'); + + + return $parameter; + } + + public function msg($code,$msg='',$data=[]){ + return json(['code'=>$code,'msg'=>$msg,'data'=>$data]); + } + +} \ No newline at end of file diff --git a/application/app/controller/Index.php b/application/app/controller/Index.php index 103039b..2f72b35 100644 --- a/application/app/controller/Index.php +++ b/application/app/controller/Index.php @@ -24,26 +24,35 @@ class Index extends Controller{ } // 创建用户卡片 - public function create_user_card(){ + public function create_user_data(){ $data = input(); - $result = Db::table('app_user_card')->insert([ - 'aan_id'=>$data['id'], - 'nickname'=>$data['nickname'], - 'birthday'=>$data['birthday'], - 'gender'=>$data['gender'], - 'create_time'=>date('Y-m-d H:i:s'), - 'last_update_time'=>date('Y-m-d H:i:s'), - ]); + + $result = Db::table('app_user_data')->insert($verify_result); if($result){ return $this->msg(0,'success'); }else{ return $this->msg(10001,'创建失败'); } } - // 获取账号下用户卡片列表 + + // 切换用户 + public function switch_user(){ + $data = input(); + $verify_result = $this->verify_parameters($data,'register'); + $result = Db::table('app_user_data')->insert($verify_result); + if($result){ + return $this->msg(0,'success'); + }else{ + return $this->msg(10001,'创建失败'); + } + } + + + // 获取账号下用户列表 // $type 1获取列表,2获取详细信息 - public function user_card_list($aan_id = 1,$type=1){ - $result = Db::table('app_user_card')->where(['aan_id'=>$aan_id])->select(); + public function user_card_list($aan_id,$type=1){ + $result = Db::table('app_user_data')->where(['aan_id'=>$aan_id])->select(); + // $result = Db::table('app_user_data')->where(['aan_id'=>$aan_id])->field('id,nickname')->select(); $data = []; if($type == 1){ for ($i=0; $i < count($result); $i++) { @@ -52,18 +61,21 @@ class Index extends Controller{ }else{ $data = $result; } - return $data; + return $this->msg(0,'success',$data); } - // 获取账号下用户卡片详细信息 + + // 获取账号下用户详细信息 public function user_card_information($id){ $result = Db::table('app_user_card')->where(['id'=>$id])->find(); if($result){ - return $result; + return $this->msg(0,'success',$result); }else{ - return false; + return $this->msg(10001,'error'); } } + + // 创建身体数据 public function create_body_data(){ $data = input(); @@ -117,6 +129,43 @@ class Index extends Controller{ ################################################################other################################################################ ################################################################other################################################################ + public function verify_parameters($data,$type){ + // 设置验证 + $rule = [ + 'aan_id' => 'require|number', + 'nickname' => 'require|chsAlpha', + 'birthday' => 'require|date', + 'gender' => 'require|number|in:0,1,2', + ]; + $msg = [ + 'aan_id.require' => '账号信息缺失', + 'nickname.require' => '昵称缺失', + 'birthday.require' => '生日缺失', + 'gender.require' => '性别缺失', + + 'aan_id.number' => '账号信息格式错误', + 'nickname.chsAlpha' => '昵称只能是只能是汉字、字母', + 'birthday.date' => '生日信息格式错误', + 'gender.number' => '性别格式错误', + 'gender.in' => '性别信息错误', + ]; + $validate = new Validate($rule,$msg); + $result = $validate->check($data); + if(!$result){ + return $validate->getError(); + } + + $parameter['aan_id'] = $data['aan_id']; + $parameter['nickname'] = $data['nickname']; + $parameter['birthday'] = $data['birthday']; + $parameter['gender'] = $data['gender']; + $parameter['create_time'] = date('Y-m-d H:i:s'); + $parameter['last_update_time'] = date('Y-m-d H:i:s'); + + + return $parameter; + } + public function msg($code,$msg='',$data=[]){ return json(['code'=>$code,'msg'=>$msg,'data'=>$data]); } diff --git a/application/app/controller/Login.php b/application/app/controller/Login.php index ffe97bb..0f1a0f2 100644 --- a/application/app/controller/Login.php +++ b/application/app/controller/Login.php @@ -4,9 +4,11 @@ namespace app\app\controller; use think\Controller; use think\Db; +use think\Cache; use app\bj\controller\Common; use think\Log; use \think\Validate; +use PHPMailer\PHPMailer\PHPMailer; class Login extends Controller{ @@ -18,41 +20,153 @@ class Login extends Controller{ // 注册 public function register_action(){ $data = input(); - $result = Db::table('app_register')->insert([ - 'account_number'=>$data['account_number'], - 'password'=>$data['password'], - ]); + + $verify_result = $this->verify_parameters($data,'register'); + + if(!is_array($verify_result)){ + return $this->msg(10001,$verify_result); + } + // 记录 + $result = Db::table('app_account_number')->insert($verify_result); if($result){ return $this->msg(0,'success'); }else{ - return $this->msg(10001,'注册失败'); + return $this->msg(10003,'注册失败'); } } // 登录 public function login_action(){ $data = input(); - $result = Db::table('app_register')->where([ - 'account_number'=>$data['account_number'], - 'password'=>$data['password'], - ])->count(); + $verify_result = $this->verify_parameters($data,'login'); + if(!is_array($verify_result)){ + return $this->msg(10001,$verify_result); + } + $result = Db::table('app_register')->where($verify_result)->field('id')->find(); + dump($result); + die; if($result){ + $user_data = Db::table('app_user_data')->where(['aan_id'=>$result['id']])->field('id,nickname')->select(); return $this->msg(0,'success'); }else{ return $this->msg(10001,'未找到账户'); } } - // 登录 - public function phone_code(){ - $data = '696969'; - return $this->msg(0,'success',['phone_code'=>$data]); + // 手机/邮箱验证 + /* 接口说明(发邮件) + * $data(手机或者邮箱信息) 字符串 + * $type(验证类型,是注册用,还是其他用途) 字符串 默认register(注册) + * $road(是手机还是邮箱还是其他) 字符串 默认tel或email + */ + public function phone_email_code(){ + $data = input(); + if(!array_key_exists('data', $data) || !array_key_exists('type', $data) || !array_key_exists('road', $data)){ + return $this->msg(10001,'数据&场景&通道必须'); + } + $num = $this->rand_int(); + if($data['road'] == 'tel'){ + $result = $this->send_tel_code($data['tel'],$num); + }else if($data['road'] == 'email'){ + + } + + if(is_array($result) && $result['code'] == 0){ + cache($data['data']."_".$data['road']."_".$data['type'], $num, 20); + return $this->msg(0,'success'); + }else{ + return $this->msg(10001,'error'); + } } - // 登录 - public function email_code(){ - $data = '696969'; - return $this->msg(0,'success',['email_code'=>$data]); + + + /* 接口说明(发邮件) + * $address(收件人的邮箱地址) 数组 格式: ['460834639@qq.com','460834639@qq.com'.......] + * $content(邮件的主题数据信息) 数组 格式:['title'=>'123','from_user_name'=>'123','content'=>'123'] + * $annex(附件路径信息) 字符串 + */ + public function send_email_code($address,$content,$annex=''){ + // $ad = '460834639@qq.com'; + $ad1 = '295155911@qq.com'; + $mail = new PHPMailer(); //实例化 + $mail->IsSMTP(); // 启用SMTP + $mail->Host = "smtp.126.com"; //SMTP服务器 163邮箱例子 + $mail->Port = 465; //邮件发送端口 + $mail->SMTPAuth = true; //启用SMTP认证 + $mail->SMTPSecure = 'ssl'; + $mail->CharSet = "UTF-8"; //字符集 + $mail->Encoding = "base64"; //编码方式 + $mail->Username = "tsf3920322@126.com"; //你的邮箱 + $mail->Password = "HLWXNRPUCTHJFIIX"; //你的密码(邮箱后台的授权密码) + $mail->From = "tsf3920322@126.com"; //发件人地址(也就是你的邮箱) + + // $mail->Subject = "微盟测试邮件"; //邮件标题 + $mail->Subject = $content['title']; //邮件标题 + + // $mail->FromName = "微盟体测中心"; //发件人姓名 + $mail->FromName = $content['from_user_name']; //发件人姓名 + + for ($i=0; $i < count($address); $i++) { + $mail->AddAddress($address[$i], ""); //添加收件人(地址,昵称) + } + if($annex != ''){ + // $url = ROOT_PATH. 'public' . DS . 'tsf' . DS .'demoooo.jpg'; + $mail->AddAttachment($annex,''); // 添加附件,并指定名称 + } + + $mail->IsHTML(true); //支持html格式内容 + + $mail->Body = $content['content']; //邮件主体内容 + + //发送 + if (!$mail->Send()) { + return $this->msg(10001,$mail->ErrorInfo); + // return $mail->ErrorInfo; + } else { + return $this->msg(0,'success'); + // return 'success'; + } + } + + public function send_tel_code($tel,$code){ + // 初始化cURL会话 + $ch = curl_init(); + $headers = [ + 'Accept: application/json', + 'Content-Type: application/json', + ]; + // 设置头部信息 + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + // 设置请求的URL + $url = "http://sms.ybhdmob.com/Message/Send?token=ybhdmob"; + curl_setopt($ch, CURLOPT_URL, $url); + // 设置为POST请求 + curl_setopt($ch, CURLOPT_POST, 1); + // 设置POST数据 + $postData = array( + 'phone' => $tel, + 'content' => '【xxxx】您好,欢迎使用xxx,,您的手机验证码是:'.$code.',验证码一分钟内有效,若非本人操作,请忽略!' + ); + $postData = json_encode($postData); + curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); + // 设置返回结果不直接输出,而是返回到变量中 + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + // 发送请求并获取响应 + $response = curl_exec($ch); + // 检查是否有错误发生 + if (curl_errno($ch)) { + $error_message = curl_error($ch); + return "请求错误: " . $error_message; + } + // 关闭cURL会话 + curl_close($ch); + // 处理响应 + if ($response) { + return json_decode($response,true); + } else { + echo "未收到响应"; + } } @@ -60,6 +174,80 @@ class Login extends Controller{ ################################################################other################################################################ ################################################################other################################################################ + public function test(){ + dump($this->send_tel_code('18530934717',$this->rand_int())); + // dump(['code']); + + } + + public function rand_int(){ + return mt_rand(100000,999999); + } + + public function verify_parameters($data,$type){ + // 设置验证 + $rule = [ + 'tel' => 'number|length:11', + 'password' => 'require', + 'email' => 'email', + 'code' => 'number', + ]; + $msg = [ + 'password.require' => '密码必须', + 'tel.number' => '手机必须是数字', + 'code.number' => '验证码必须是数字', + 'tel.length' => '手机必须是11位', + 'email' => '邮箱格式错误', + ]; + $validate = new Validate($rule,$msg); + $result = $validate->check($data); + if(!$result){ + return $validate->getError(); + } + + // 判断参数 + if(array_key_exists('tel', $data)){ + $parameter['tel'] = $data['tel']; + $parameter['password'] = $data['password']; + $montage_data = 'tel'; + }else if(array_key_exists('email', $data)){ + $parameter['email'] = $data['email']; + $parameter['password'] = $data['password']; + $montage_data = 'email'; + }else{ + return '手机/邮箱必须'; + } + + // 检验是否注册过 + if($montage_data == 'tel'){ + $inspect_repeat = Db::table('app_account_number')->where(['tel'=>$parameter['tel'],'password'=>$parameter['password']])->count(); + }else{ + $inspect_repeat = Db::table('app_account_number')->where(['email'=>$parameter['email'],'password'=>$parameter['password']])->count(); + } + + if($inspect_repeat){ + return '注册失败,账号已存在'; + } + + + if($type == 'register'){ + if(array_key_exists('code', $data)){ + if(cache($parameter[$montage_data]."_".$montage_data."_register") == false){ + return '验证码过期'; + }else{ + if($data['code'] != cache($parameter[$montage_data]."_".$montage_data."_register")){ + return '验证码错误'; + } + } + }else{ + return '验证码必须'; + } + $parameter['create_time'] = date('Y-m-d H:i:s'); + } + + return $parameter; + } + public function msg($code,$msg='',$data=[]){ return json(['code'=>$code,'msg'=>$msg,'data'=>$data]); } diff --git a/composer.json b/composer.json index 61d3fa7..161c830 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,8 @@ ], "require": { "php": ">=5.4.0", - "topthink/framework": "5.0.*" + "topthink/framework": "5.0.*", + "phpmailer/phpmailer": "^6.9" }, "autoload": { "psr-4": { diff --git a/public/tsf/demoooo.jpg b/public/tsf/demoooo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cac00d1fbce24bdd45dc039940a180132d1bc28f GIT binary patch literal 25803 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