From a420257c5298badaaa65ad5bbfa5f6105dccc6a1 Mon Sep 17 00:00:00 2001 From: tsf <460834639@qq.com> Date: Mon, 20 May 2024 18:49:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/app/controller/Base.php | 54 ++++- application/app/controller/Card.php | 284 +++++++++++++++++---------- application/app/controller/Index.php | 42 ++-- application/app/controller/Login.php | 114 +++++++---- application/route.php | 18 +- public/tsf/demoooo.jpg | Bin 25803 -> 10839 bytes 6 files changed, 339 insertions(+), 173 deletions(-) diff --git a/application/app/controller/Base.php b/application/app/controller/Base.php index 52295f7..e2197cf 100644 --- a/application/app/controller/Base.php +++ b/application/app/controller/Base.php @@ -4,10 +4,13 @@ namespace app\app\controller; use think\Controller; use think\Db; +use think\Cache; +use think\Log; class Base extends Controller{ protected $base_call_method = ['内部']; + protected $token_time = 86400*1; ################################################################接口################################################################ ################################################################接口################################################################ @@ -25,7 +28,7 @@ class Base extends Controller{ } // 检查变量是否是一个只有数字的一维数组 - function is_num_array($array = [1,2,3]) { + public function is_num_array($array = [1,2,3]) { if (!is_array($array)) { return false; // 变量不是数组 } @@ -34,12 +37,10 @@ class Base extends Controller{ return false; // 数组中包含非数字元素 } } - - // $result = Db::table('app_card_data')->where(['is_del'=>1])->cache(true,3600)->column('id');//查询结果缓存3600秒 $result = Db::table('app_card_data')->where(['is_del'=>0])->cache(true,3600)->select();//查询结果缓存3600秒 - dump($result); - die; + // dump($result); + // die; // dump(array_column($result, 'id')); // die; if(empty(array_diff($array, array_column($result, 'id')))){ @@ -49,9 +50,30 @@ class Base extends Controller{ } } + // 判断字符串是手机还是邮箱 + public function is_tel_email($str) { + // 手机号码的正则表达式(中国大陆格式)(下面正则实际判断的是是否为11位数字) + $mobilePattern = '/^\d{11}$/'; + + // 电子邮件地址的正则表达式 + $emailPattern = '/^[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/'; + + // 判断是否为手机号码 + if (preg_match($mobilePattern, $str)) { + return 'tel'; + } + + // 判断是否为电子邮件地址 + if (preg_match($emailPattern, $str)) { + return 'email'; + } + + // 如果都不是,返回其他 + return false; + } // 计算年龄 - function calculate_age($data = '1991-04-20'){ + public function calculate_age($data = '1991-04-20'){ $today = time(); // 获取当前时间的 Unix 时间戳 $birthDate = strtotime($data); // 将出生日期字符串转换为 Unix 时间戳 @@ -68,8 +90,24 @@ class Base extends Controller{ } } + // 判断token是否过期 + public function token_time_validate($token){ + // cache($token,time()); + $time = cache($token); + // dump($time); + if($time === false){ + return false; + } + $diff_time = time() - $time; + if($diff_time > $this->token_time){ + return false; + } + cache($token, time()); + return true; + } + // 计算天数 - function daysSince($pastDate,$now = false) + public function daysSince($pastDate,$now = false) { // 创建一个表示过去日期的 DateTime 对象 $past = new \DateTime($pastDate); @@ -86,7 +124,7 @@ class Base extends Controller{ } // 计算月份 - function calculateAgeInMonthsWithPrecision($birthDateStr) { + public function calculateAgeInMonthsWithPrecision($birthDateStr) { // 获取当前日期 $now = new \DateTime(); diff --git a/application/app/controller/Card.php b/application/app/controller/Card.php index 0ea7633..3b3ff55 100644 --- a/application/app/controller/Card.php +++ b/application/app/controller/Card.php @@ -71,93 +71,88 @@ class Card extends Base{ - // 获取卡片列表 - // $data = ['id'=>'2','time'=>'1991-04-20',content=>'15个'] - public function get_card_list(){ - $data = input(); - if(!array_key_exists('ann_id', $data) || !array_key_exists('time', $data) || !array_key_exists('content', $data)){ - return $this->msg(10001,'数据格式错误'); - } + // // 获取卡片列表 + // // $data = ['id'=>'2','time'=>'1991-04-20',content=>'15个'] + // public function get_card_list($data = ['aud_id'=>'2','time'=>'1991-04-20','content'=>'15个']){ + // $data = input(); + // if(!array_key_exists('aud_id', $data) || !array_key_exists('time', $data) || !array_key_exists('content', $data)){ + // return $this->msg(10001,'数据格式错误'); + // } - $result = Db::table('app_card_data_log')->insert(['aud_id'=>$data['id'],'log_time'=>$data['time'],'content'=>$data['content'],'create_time'=>date('Y-m-d H:i:s')]); - if($result){ - return $this->msg(0,'success'); - }else{ - return $this->msg(10003,'添加失败'); - } - } + // $result = Db::table('app_card_data_log')->insert(['aud_id'=>$data['id'],'log_time'=>$data['time'],'content'=>$data['content'],'create_time'=>date('Y-m-d H:i:s')]); + // if($result){ + // return $this->msg(0,'success'); + // }else{ + // return $this->msg(10003,'添加失败'); + // } + // } // 获取基础卡片信息 // $data = ['id'=>'2'] - public function card_data_base(){ - $data = input(); - if(!array_key_exists('id', $data)){ - return $this->msg(10001,'数据格式错误'); - } - $result = Db::table('app_card_body_data')->where(['aud_id'=>$data['id']])->order('record_time desc')->field('record_time,height,weight,bmi')->find(); - if(!$result){ - return $this->msg(10002,'未找到数据'); - }else{ - return $this->msg(0,'success',$result); - } - } + // public function card_data_base($data = ['aud_id'=>'11']){ + // if(count(input()) > 0){ + // $data = input(); + // } + // if(!array_key_exists('aud_id', $data)){ + // return $this->msg(10001,'数据格式错误'); + // } + // $result = Db::table('app_card_body_data')->where(['aud_id'=>$data['aud_id']])->order('record_time desc')->field('record_time,height,weight,bmi')->find(); + // if(!$result){ + // return $this->msg(10002,'未找到数据'); + // }else{ + // return $this->msg(0,'success',$result); + // } + // } // 详细卡片信息 // $data = ['id'=>'2'] - public function card_data_detailed($data=['id'=>'7','acd_id'=>'2']){ - // public function body_data_detailed($data=['id'=>'9','acd_id'=>'2']){ - // $data = input(); - - if(!array_key_exists('id', $data) || !array_key_exists('acd_id', $data)){ + public function card_data_detailed($data=['aud_id'=>'11','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input()) > 0){ + $data = input(); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); + if(!array_key_exists('aud_id', $data)){ return $this->msg(10001,'关键参数缺失'); } - if($data['acd_id'] == '2'){ - // 基础身体信息卡片 + + return $this->get_user_body_data($data); + // if($data['acd_id'] == '2'){ + // // 基础身体信息卡片 - return $this->get_user_body_data($data); - } + + // } } // 手动记录 // $data = ['id'=>'2','time'=>'1991-04-20 10:10:10','height'=>'15.1','weight'=>'75.1'] - public function card_manual_recording($data = ['acd_id'=>'2','aud_id'=>'11','time'=>'2024-04-11 10:10:10','data'=>['height'=>'175.1','weight'=>'77.1']]){ - if(!array_key_exists('acd_id', $data) || !array_key_exists('aud_id', $data)){ + // public function card_manual_recording($data = ['acd_id'=>'2','aud_id'=>'11','time'=>'2024-04-11 10:10:10','data'=>['height'=>'175.1','weight'=>'77.1']]){ + public function card_manual_recording($data = ['aud_id'=>'11','time'=>'2024-04-11 10:10:10','height'=>'165.3','weight'=>'66.1','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ + if(count(input()) > 0){ + $data = input(); + } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); + if(!array_key_exists('aud_id', $data) || !array_key_exists('time', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data)){ return $this->msg(10001,'关键参数缺失'); } - - $afferent_data = []; - - foreach ($data as $key => $value) { - if(is_array($value)){ - foreach ($value as $k => $v) { - $afferent_data[$k] = $v; - } - }else{ - $afferent_data[$key] = $value; - } - } - - if($data['acd_id'] == '2'){ - return $this->set_user_body_data($data); - }else if($data['acd_id'] == '6'){ - - } + $data['acd_id'] = '2'; + return $this->set_user_body_data($data); } // 获取记录信息列表 - function get_card_record_data($data = ['acd_id'=>'6','aud_id'=>'11','s_time'=>'2024-04-01 10:10:10','e_time'=>'2024-04-12 10:10:10']){ - if(!array_key_exists('acd_id', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ + function get_card_record_data($data = ['aud_id'=>'11','s_time'=>'2024-04-01 10:10:10','e_time'=>'2024-04-12 10:10:10']){ + if(!array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ return $this->msg(10001,'关键参数缺失'); } - + $data['acd_id'] = '2'; return $this->get_all_record_data($data); - // if($data['acd_id'] == '2'){ - - // }else if($data['acd_id'] == '6'){ - // $skip = new Skip(); - // return $skip->get_skip_record_data($data); - // } + } // 数据对比 @@ -165,7 +160,6 @@ class Card extends Base{ if(!array_key_exists('acd_id', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){ return $this->msg(10001,'关键参数缺失'); } - if($data['acd_id'] == '2'){ return $this->body_data_contrast($data); }else if($data['acd_id'] == '6'){ @@ -244,8 +238,8 @@ class Card extends Base{ $return_result[$value['r_t']] = [['id'=>$value['id'],'v1'=>$value['v1'],'v2'=>$value['v2'],'v3'=>$value['v3']]]; } } - dump(['original'=>$result,'optimization'=>$return_result]); - die; + // dump(['original'=>$result,'optimization'=>$return_result]); + // die; return ['original'=>$result,'optimization'=>$return_result]; } @@ -307,9 +301,10 @@ class Card extends Base{ ################################################################身体数据卡片业务 // 用户身体数据卡片记录 function set_user_body_data($data){ - if(!array_key_exists('time', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data)){ - return $this->msg(10001,'数据格式错误'); - } + // if(!array_key_exists('time', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data)){ + // return $this->msg(10001,'数据格式错误'); + // } + $data['type'] = 1; $user_data = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->field('birthday,gender')->find(); $result_data['height'] = $data['height']; $result_data['weight'] = $data['weight']; @@ -360,65 +355,58 @@ class Card extends Base{ $result = Db::table('app_card_body_data') ->alias('acbd') ->join('app_user_data aud','acbd.aud_id = aud.id','LEFT') - ->where(['acbd.id'=>$data['id']]) + ->where(['acbd.aud_id'=>$data['aud_id']]) + ->order('record_time desc') ->field('acbd.*,aud.birthday,aud.gender') ->find(); - + // dump($data); + // dump($result['age']); + // $result['age'] = 14; + // die; if(!$result){ return $this->msg(10002,'未找到数据'); }else{ - $result_end = $this->processing_return_data($result); + $result_end = $this->processing_return_data_new($result); // dump($result_end); // die; return $this->msg(0,'success',$result_end); } } - // 返回数据处理 - function processing_return_data($data){ + function processing_return_data_new($data){ $result_end_data = []; $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday'])*100; $gender_val = $data['gender']; foreach ($data as $key => $value) { if($key != 'aud_id' && $key != 'id' && $key != 'create_time' && $key != 'last_update_time' && $key != 'acd_id' && $key != 'ROW_NUMBER' && $key != 'record_time' && $key != 'gender' && $key != 'birthday'){ + + // 设置单个数据格式 + $result_end_data[$key] = $this->result_end_data_mould; + if(array_key_exists($key, $this->unit_name)){ + $result_end_data[$key]['name'] = $this->unit_name[$key]; + } + if(array_key_exists($key, $this->unit_symbol)){ + $result_end_data[$key]['unit'] = $this->unit_symbol[$key]; + } + $result_end_data[$key]['value'] = explode(',',$value)[0]; + if(strpos($value, ',')){ + $result_end_data[$key]['standard'] = explode(',',$value)[1]; + } + if(array_key_exists($key, $this->standard_color)){ + $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']]; + } + + // 如果大于16岁(成人) - if($data['age'] >= $this->age_limit){ - $result_end_data[$key] = $this->result_end_data_mould; - if(array_key_exists($key, $this->unit_name)){ - $result_end_data[$key]['name'] = $this->unit_name[$key]; - } - if(array_key_exists($key, $this->unit_symbol)){ - $result_end_data[$key]['unit'] = $this->unit_symbol[$key]; - } - $result_end_data[$key]['value'] = explode(',',$value)[0]; - if(strpos($value, ',')){ - $result_end_data[$key]['standard'] = explode(',',$value)[1]; - } - if(array_key_exists($key, $this->standard_color)){ - $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']]; - } - }else{ + if($data['age'] < $this->age_limit){ if(array_key_exists($key, $this->bhw_list)){ - $result_end_data[$key] = $this->result_end_data_mould; $result_end_data[$key]['list'] = $this->bhw_list[$key]; - if(array_key_exists($key, $this->unit_name)){ - $result_end_data[$key]['name'] = $this->unit_name[$key]; - } - if(array_key_exists($key, $this->unit_symbol)){ - $result_end_data[$key]['unit'] = $this->unit_symbol[$key]; - } - $result_end_data[$key]['value'] = explode(',',$value)[0]; - if(strpos($value, ',')){ - $result_end_data[$key]['standard'] = explode(',',$value)[1]; - } - if(array_key_exists($key, $this->standard_color)){ - $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']]; - } if($key == 'bmi'){ // dump($month_num); $bhw_date = Db::table('pc_bmistand2')->where("month >= $month_num and sex = '$gender_val'")->order('month')->limit(1)->select(); + // dump($bhw_date); if($bhw_date){ $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f1sd']; $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f1sd']; @@ -462,6 +450,92 @@ class Card extends Base{ } return $result_end_data; } + // // 返回数据处理 + // function processing_return_data($data){ + // $result_end_data = []; + // $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday'])*100; + // $gender_val = $data['gender']; + // foreach ($data as $key => $value) { + // if($key != 'aud_id' && $key != 'id' && $key != 'create_time' && $key != 'last_update_time' && $key != 'acd_id' && $key != 'ROW_NUMBER' && $key != 'record_time' && $key != 'gender' && $key != 'birthday'){ + // // 如果大于16岁(成人) + // if($data['age'] >= $this->age_limit){ + // $result_end_data[$key] = $this->result_end_data_mould; + // if(array_key_exists($key, $this->unit_name)){ + // $result_end_data[$key]['name'] = $this->unit_name[$key]; + // } + // if(array_key_exists($key, $this->unit_symbol)){ + // $result_end_data[$key]['unit'] = $this->unit_symbol[$key]; + // } + // $result_end_data[$key]['value'] = explode(',',$value)[0]; + // if(strpos($value, ',')){ + // $result_end_data[$key]['standard'] = explode(',',$value)[1]; + // } + // if(array_key_exists($key, $this->standard_color)){ + // $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']]; + // } + // }else{ + // if(array_key_exists($key, $this->bhw_list)){ + // $result_end_data[$key] = $this->result_end_data_mould; + // $result_end_data[$key]['list'] = $this->bhw_list[$key]; + // if(array_key_exists($key, $this->unit_name)){ + // $result_end_data[$key]['name'] = $this->unit_name[$key]; + // } + // if(array_key_exists($key, $this->unit_symbol)){ + // $result_end_data[$key]['unit'] = $this->unit_symbol[$key]; + // } + // $result_end_data[$key]['value'] = explode(',',$value)[0]; + // if(strpos($value, ',')){ + // $result_end_data[$key]['standard'] = explode(',',$value)[1]; + // } + // if(array_key_exists($key, $this->standard_color)){ + // $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']]; + // } + // if($key == 'bmi'){ + // // dump($month_num); + // $bhw_date = Db::table('pc_bmistand2')->where("month >= $month_num and sex = '$gender_val'")->order('month')->limit(1)->select(); + // if($bhw_date){ + // $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f1sd']; + // $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f1sd']; + // $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['z1sd']; + // $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['z1sd']; + // $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z2sd']; + // $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z2sd']; + // } + // }else if($key == 'height'){ + // $bhw_date = Db::table('pc_heightstand2')->where("month >= $month_num")->order('month')->limit(1)->select(); + // if($bhw_date){ + // $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f2sd']; + // $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f2sd']; + // $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['f1sd']; + // $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['f1sd']; + // $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z1sd']; + // $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z1sd']; + // $result_end_data[$key]['list'][3]['max_val'] = $bhw_date[0]['z2sd']; + // $result_end_data[$key]['list'][4]['min_val'] = $bhw_date[0]['z2sd']; + // $result_end_data[$key]['list'][4]['max_val'] = $bhw_date[0]['z3sd']; + // } + // }else if($key == 'weight'){ + // $bhw_date = Db::table('pc_weightstand2')->where("month >= $month_num")->order('month')->limit(1)->select(); + // // dump($value); + // // dump($bhw_date);/ + // if($bhw_date){ + // $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f2sd']; + // $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f2sd']; + // $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['f1sd']; + // $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['f1sd']; + // $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z1sd']; + // $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z1sd']; + // $result_end_data[$key]['list'][3]['max_val'] = $bhw_date[0]['z2sd']; + // $result_end_data[$key]['list'][4]['min_val'] = $bhw_date[0]['z2sd']; + // $result_end_data[$key]['list'][4]['max_val'] = $bhw_date[0]['z3sd']; + // } + // } + // } + // } + // } + // } + // return $result_end_data; + // } ################################################################跳绳数据卡片接口################################################################ ################################################################跳绳数据卡片接口################################################################ diff --git a/application/app/controller/Index.php b/application/app/controller/Index.php index 2c16e00..6fe6bab 100644 --- a/application/app/controller/Index.php +++ b/application/app/controller/Index.php @@ -29,10 +29,14 @@ class Index extends Base{ // dump($result); // } // 创建用户 - public function create_user_data($data = ['aan_id'=>66,'nickname'=>'王小二','birthday'=>'2019-01-01','gender'=>1,'grade'=>'二年级']){ + public function create_user_data($data = ['aan_id'=>66,'nickname'=>'王小二','birthday'=>'2019-01-01','gender'=>1,'grade'=>'二年级','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input()) > 0){ $data = input(); } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); $verify_result = $this->verify_parameters($data,'register'); if(!is_array($verify_result)){ return $this->msg(10002,$verify_result); @@ -47,10 +51,14 @@ class Index extends Base{ // 获取账号下用户列表 // $type 1获取列表,2获取详细信息 - public function get_user_card_list($data = ['aan_id'=>66,'type'=>1]){ + public function get_user_card_list($data = ['aan_id'=>66,'type'=>1,'token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input()) > 0){ $data = input(); } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); $result = Db::table('app_user_data')->where(['aan_id'=>$data['aan_id']])->select(); // $result = Db::table('app_user_data')->where(['aan_id'=>$aan_id])->field('id,nickname')->select(); $temporary_data = []; @@ -65,10 +73,14 @@ class Index extends Base{ } // 获取指定用户详细信息 - public function get_user_data_information($data = ['aud_id'=>11]){ + public function get_user_data_information($data = ['aud_id'=>11,'token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input()) > 0){ $data = input(); } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); $result = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->field('id,aan_id,nickname,birthday,gender,card_order')->find(); unset($result['ROW_NUMBER']); if($result['card_order'] === ''){ @@ -79,14 +91,23 @@ class Index extends Base{ $result['card_order'] = explode(',',$result['card_order']); $result['card_data_list'] = $this->get_user_card_data_list($result['card_order'],$result['id']); } + + $result['birthday'] = str_replace('-', '/', $result['birthday']); + foreach ($result['card_data_list'] as $key => $value) { + $result['card_data_list'][$key]['record_time'] = str_replace('-', '/', $result['card_data_list'][$key]['record_time']); + } return $this->msg(0,'success',$result); } // 获取所有卡片列表信息 - public function get_card_all_list($data = ['aud_id'=>11]){ + public function get_card_all_list($data = ['aud_id'=>11,'token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input()) > 0){ $data = input(); } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); $user_card_list = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->field('id,card_order')->find(); unset($user_card_list['ROW_NUMBER']); $user_card_list['card_order'] = explode(',',$user_card_list['card_order']); @@ -106,23 +127,20 @@ class Index extends Base{ } // 保存用户的卡片排序 - public function save_user_card_order($data=['aud_id'=>11,'card_order'=>'2,8']){ + public function save_user_card_order($data=['aud_id'=>11,'card_order'=>'2,8','token'=>'0dafb98a10995c98b5a33b7d59d986ca']){ if(count(input()) > 0){ $data = input(); } + if($this->token_time_validate($data['token']) === false){ + return $this->msg(20001,'登录失效'); + } + unset($data['token']); if(!array_key_exists('aud_id', $data) || !array_key_exists('card_order', $data)){ return $this->msg(10001,'数据参数错误'); } - // dump($data['card_order']); - // dump(explode(',',$data['card_order'])); - // die; - dump($this->is_num_array(explode(',',$data['card_order']))); - die; if(!$this->is_num_array(explode(',',$data['card_order']))){ return $this->msg(10002,'数据内参数格式或值错误'); } - - $data['card_order'] = json_encode($data['card_order']); $result = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->update(['card_order'=>$data['card_order']]); if($result){ return $this->msg(0,'success'); diff --git a/application/app/controller/Login.php b/application/app/controller/Login.php index 4ee8ebb..053f46d 100644 --- a/application/app/controller/Login.php +++ b/application/app/controller/Login.php @@ -5,20 +5,18 @@ 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 Base{ - - + protected $code_time = 3600; ################################################################个人资料卡################################################################ ################################################################个人资料卡################################################################ ################################################################个人资料卡################################################################ // 注册 - public function register_action($data = ['data'=>15588885555,'password'=>'ceshi','code'=>'123456']){ + public function register_action($data = ['data'=>18530934717,'password'=>'ceshi','code'=>'746119']){ // dump('123'); // phpinfo(); @@ -33,16 +31,49 @@ class Login extends Base{ // dump($verify_result); // die; // 记录 - $result = Db::table('app_account_number')->insert($verify_result); + $result = Db::table('app_account_number')->insertGetId($verify_result); if($result){ - return $this->msg(0,'success'); + cache($verify_result['token'], time()); + return $this->msg(0,'success',['token'=>$verify_result['token'],'aan_id'=>$result]); }else{ return $this->msg(10003,'注册失败'); } } + // 重置密码 + public function reset_password($data = ['data'=>'18530934717','password'=>'ceshi1','c_password'=>'ceshi1','code'=>'491661']){ + if(count(input()) > 0){ + $data = input(); + } + if(!array_key_exists('data', $data) || !array_key_exists('password', $data) || !array_key_exists('c_password', $data) || !array_key_exists('code', $data)){ + return $this->msg(10001,'参数缺失'); + } + + if($data['password'] != $data['c_password']){ + return $this->msg(10002,'两次密码不一致'); + } + $code_result = $this->check_code($data['data'],$data['code']); + if($code_result !== true){ + return $this->msg(10003,$code_result); + } + $t_y = $this->is_tel_email($data['data']); + if($t_y === false){ + return $this->msg(10004,'账号格式错误'); + } + $find_data = Db::table('app_account_number')->where([$t_y=>$data['data']])->field('id,token')->find(); + if(!$find_data){ + return $this->msg(10006,'未核实到账号信息'); + } + $result = Db::table('app_account_number')->where([$t_y=>$data['data']])->update(['password'=>$data['password']]); + if($result){ + cache($find_data['token'], time()); + return $this->msg(0,'success',['token'=>$find_data['token'],'aan_id'=>$find_data['id']]); + }else{ + return $this->msg(10005,'注册失败'); + } + } // 登录 - public function login_action($data = ['data'=>'18530934717','validate_data'=>'734626','type'=>'login','validate_type'=>'code']){ + public function login_action($data = ['data'=>'18530934717','validate_data'=>'746119','type'=>'login','validate_type'=>'code']){ if(count(input()) > 0){ $data = input(); @@ -59,15 +90,20 @@ class Login extends Base{ $verify_result['email'] = $data['data']; $road = 'email'; } + // dump($verify_result); + // die; + // $find_token = Db::table('app_account_number')->where([$t_y=>$data['data']])->field('id,token')->find(); // 检测校验途径 if($data['validate_type'] == 'code'){ $code_name = $data['data']; // dump(cache($code_name)); // die; - if(cache($code_name) == $data['validate_data']){ - $result = Db::table('app_account_number')->where(['tel'=>$verify_result['tel']])->find(); + // if(cache($code_name) == $data['validate_data']){ + if($this->check_code($code_name,$data['validate_data']) === true){ + $result = Db::table('app_account_number')->where($verify_result)->field('id,token')->find(); if($result){ - return $this->msg(0,'success',$result['id']); + cache($result['token'], time()); + return $this->msg(0,'success',['token'=>$result['token'],'aan_id'=>$result['id']]); }else{ return $this->msg(10002,'登录失败,无效账号'); } @@ -76,9 +112,10 @@ class Login extends Base{ } }else if($data['validate_type'] == 'password'){ $verify_result['password'] = $data['validate_data']; - $result = Db::table('app_account_number')->where($verify_result)->find(); + $result = Db::table('app_account_number')->where($verify_result)->field('id,token')->find(); if($result){ - return $this->msg(0,'success',$result['id']); + cache($result['token'], time()); + return $this->msg(0,'success',['token'=>$result['token'],'aan_id'=>$result['id']]); }else{ return $this->msg(10001,'登录失败,账号/密码错误'); } @@ -111,7 +148,7 @@ class Login extends Base{ $road = 'email'; } if(is_array($result) && $result['code'] == 0){ - cache($data['data'], $num, 60); + cache($data['data'], $num, $this->code_time); // dump($data['data']."_".$data['road']."_".$data['type']); return $this->msg(0,'success',$num); // return true; @@ -121,16 +158,6 @@ class Login extends Base{ } } - - - - - - - public function check_code($data = []){ - - } - ################################内部调用################################ /* 接口说明(发邮件) * $address(收件人的邮箱地址) 数组 格式: ['460834639@qq.com','460834639@qq.com'.......] @@ -219,6 +246,21 @@ class Login extends Base{ echo "未收到响应"; } } + + public function check_code($data = 18530934717 , $code = 123456){ + return true; + // dump($data); + // dump(cache($data)); + // die; + if(cache($data) == false){ + return '验证码过期'; + }else{ + if($code != cache($data)){ + return '验证码错误'; + } + } + return true; + } ################################################################other################################################################ ################################################################other################################################################ ################################################################other################################################################ @@ -265,13 +307,13 @@ class Login extends Base{ // dump($montage_data); // dump( $parameter); // 检验是否注册过 - if($montage_data == 'tel'){ - $inspect_repeat = Db::table('app_account_number')->where(['tel'=>$parameter['tel']])->count(); - // $inspect_repeat = Db::query("select count(*) from app_account_number where tel='".$parameter['tel']."'and password='".$parameter['password']); - }else{ - $inspect_repeat = Db::table('app_account_number')->where(['email'=>$parameter['email']])->count(); - } - + // if($montage_data == 'tel'){ + // $inspect_repeat = Db::table('app_account_number')->where(['tel'=>$parameter['tel']])->count(); + // // $inspect_repeat = Db::query("select count(*) from app_account_number where tel='".$parameter['tel']."'and password='".$parameter['password']); + // }else{ + // $inspect_repeat = Db::table('app_account_number')->where(['email'=>$parameter['email']])->count(); + // } + $inspect_repeat = Db::table('app_account_number')->where([$montage_data=>$data['data']])->count(); // dump( $inspect_repeat); // die; // dump($inspect_repeat); @@ -283,19 +325,15 @@ class Login extends Base{ if($type == 'register'){ if(array_key_exists('code', $data)){ - // dump($parameter[$montage_data]."_".$montage_data."_register".'='.cache($parameter[$montage_data]."_".$montage_data."_register")); - if(cache($parameter[$montage_data]) == false){ - return '验证码过期'; - }else{ - if($data['code'] != cache($parameter[$montage_data])){ - return '验证码错误'; - } + $code_result = $this->check_code($parameter[$montage_data],$data['code']); + if($code_result !== true){ + return $code_result; } }else{ return '验证码必须'; } $parameter['create_time'] = date('Y-m-d H:i:s'); - $parameter['token'] = md5($parameter['tel'].$this->create_random_string(12).time()); + $parameter['token'] = md5($data['data'].$this->create_random_string(12).time()); } return $parameter; diff --git a/application/route.php b/application/route.php index ca3483a..26034d4 100644 --- a/application/route.php +++ b/application/route.php @@ -39,6 +39,8 @@ Route::any('/admin/index', 'admin/index/index'); // ################################登录接口################################ // 注册接口 Route::any('/register_action', 'app/login/register_action'); +// 注册接口 +Route::any('/reset_password', 'app/login/reset_password'); // 登录接口 Route::any('/login_action', 'app/login/login_action'); // 手机或者邮箱验证码接口接口 @@ -54,17 +56,13 @@ Route::any('/get_user_data_information', 'app/index/get_user_data_information'); Route::any('/get_card_all_list', 'app/index/get_card_all_list'); // 保存用户的卡片排序 Route::any('/save_user_card_order', 'app/index/save_user_card_order'); -// ################################身体接口################################ -// 查找设备 +// ################################身体数据卡片接口################################ +// 报告页详情 +Route::any('/card_data_detailed', 'app/card/card_data_detailed'); +// 手动记录接口 +Route::any('/card_manual_recording', 'app/card/card_manual_recording'); +// 获取所有记录接口 Route::any('/get_card_record_data', 'app/card/get_card_record_data'); -// // 今日数据 -Route::any('/card_data_contrast', 'app/card/card_data_contrast'); -// // 数据记录 -// Route::any('/skip_record_data', 'app/skip/skip_record_data'); -// // 运动曲线 -Route::any('/skip_motion_curve', 'app/skip/skip_motion_curve'); -Route::any('/body_curve_data', 'app/card/body_curve_data'); -// Route::any('/generateRandomJumpData', 'app/skip/generateRandomJumpData'); // ################################跳绳接口################################ // 查找设备 Route::any('/skip_device_check', 'app/skip/skip_device_check'); diff --git a/public/tsf/demoooo.jpg b/public/tsf/demoooo.jpg index cac00d1fbce24bdd45dc039940a180132d1bc28f..08dab6c15ece5f072926a8351c94e7f928d1823b 100644 GIT binary patch literal 10839 zcmbW6Wl$VI)8`i_goFgQ1;TD{2@b(SaDuxAm&IKIi@O8}i$idSAd9=Zy9I~E9fH0* zcUSLK-KV>osrfWhGySXSn(pcU^ZfG~;GK+wv;+VN2?_B1r30Rq0Ac`4baV`KG)xQ( zj90HPv9R&qV84EiO@fPugAXL7qyUnVlT(3NXsM`~K;-0fJoHST*f=>kDQWoxdD#V6 zI5^q=vkB6xSFf;NV-vr5L(Kkx`~&;{b9-(FyvGFe1Nu>rr~%0DkxW`(fgLiOs6)cm?86J|!@6 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