123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375 |
- <?php
- namespace app\inter\controller;
- use app\common\library\CMCC;
- use think\Controller;
- use think\Db;
- use think\Session;
- use think\Log;
- use think\Request;
- use think\Cache;
- use app\common\library\UUIDs;
- use app\common\library\Verify;
- use think\Validate;
- use app\common\library\send_message;
- class Login extends Controller
- {
- public function _initialize(){
- /*$admin = Cache::get('doctor');
- if($admin){
- //已经登陆过
- return json_encode(array('status'=>'fail','code'=>'1001','msg'=>'您已登陆,请勿重复登录'));
- }*/
- }
- /**
- * 医生登录
- *
- * @ApiTitle (医生登录)
- * @ApiSummary (医生登录)
- * @ApiSector (医生接口)
- * @ApiMethod (POST)
- * @ApiRoute (/inter/login/index)
- * @ApiHeaders (name="sign", type="string", required=true, description="请求头-校验key")
- * @ApiHeaders (name="nonce", type="string", required=true, description="请求头-随机数")
- * @ApiHeaders (name="timestamp", type=string, required=true, description="请求头-时间戳s")
- * @ApiParams (name="param", type="string", required=true, description="参数json字符串")
- * @ApiParams (name="param[userName]", type="string", sample="", description="用户账号<必填>")
- * @ApiParams (name="param[pwd]", type="string", sample="", description="用户密码<必填>")
- * @ApiParams (name="param[capture]", type="string", sample="", description="验证码<选填>")
- * @ApiReturnParams (name="status", type="integer", required=true, sample="0", description="返回码 fail 失败 ok成功"))
- * @ApiReturnParams (name="code", type="integer", required=true, sample="0", description="返回状态码")
- * @ApiReturnParams (name="info", type="string", required=true, sample="返回成功", description="返回信息")
- * @ApiReturnParams (name="sessionid", type="object", sample="{}", description="缓存的数据key")
- * @ApiReturn (data="
- {
- 'status': ok,
- 'code': '0000',
- 'sessionid': 'a17z7a7a8f9g9rh9d89jio',
- 'info' : ''
- }
- *")
- **/
- //登录功能
- public function index(){
- try{
- $param = $_REQUEST['param'];
- Verify::loginCheck($param);
- $sessionid = UUIDs::uuid16();
- log::record($sessionid);
- log::record($_REQUEST);
- if(!empty($param["captcha"])){
- //1. 获取到用户提交的验证码
- $captcha = $param["captcha"];
- //2. 将session中的验证码和用户提交的验证码进行核对,当成功时提示验证码正确,并销毁之前的session值,不成功则重新提交
- if(strtolower($_SESSION["captcha"]) == strtolower($captcha)){
- $_SESSION["captcha"] = "";
- }else{
- return json_encode(['status'=>'fail','code'=>'1002','msg'=>'验证码输入错误']);
- }
- }
- if(empty($param['userName'])){
- return json_encode(['status'=>'fail','code'=>'1100','msg'=>'用户名不能为空']);
- }
- if(empty($param['pwd'])){
- return json_encode(['status'=>'fail','code'=>'1101','msg'=>'密码不能为空']);
- }
- //医生信息
- $info = DB::table('doctors')->where('username',$param['userName'])->field('is_send_message,is_admin,message_push,id,exam_class,attachment,username,password,login_time,login_failure,realname,email,phone,doctor_title,institution_id,department_id,doctor_role,is_report,fail_time')->find();
- log::record($info);
- if(!$info){
- return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户名'.$param['userName'].'或密码错误']);
- }
- if($info['login_failure'] >5)
- {
- $fail = strtotime($info['fail_time']);
- $diff = time()-$fail;
- if($diff < 300)
- {
- return json_encode(['status'=>'fail','code'=>'1009','msg'=>'系统繁忙,请'.(300-$diff).'秒后再试']);
- }else{
- DB::table('doctors')->where('username',$param['userName'])->update(['login_failure'=>0]);
- }
- }
- if(md5($param['pwd']) != $info['password']) {
- //登录失败
- $time = date('Y-m-d', time());
- $datetime = strtotime($time);
- //上次登录时间-今日0点时间
- $t = $info['login_time'] - $datetime;
- if( $t < 0){
- //时间小于0 代表今日未进行登录 登录失败次数归0
- DB::table('doctors')->where('username',$param['userName'])->update(['login_failure'=>0]);
- }
- DB::table('doctors')->where('username',$param['userName'])->setInc('login_failure');
- DB::table('doctors')->where('username',$param['userName'])->update(['fail_time'=>date('Y-m-d H:i:s')]);
- return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户名'.$param['userName'].'或者密码错误','info'=>$info['login_failure']]);
- }
- $check = '';
- if($info['is_send_message'] == "1") {
- $check = $this->check_phone($info['phone']);
- if(!$check){
- return json_encode(['status'=>'fail','code'=>'0912','msg'=>'手机号为空或手机号格式错误']);
- }
- $phone = $info['phone'];
- $code = rand('1000','9999');
- $handle_id = $phone.rand('10000000','99999999');
- Cache::set('sendcode_'.$phone,$code,600);
- Cache::set('sendcode_handle_id'.$handle_id, $phone, 600);
- $info = CMCC::sms($phone,$code);
- // $info = send_message::sendSms2UpDate($phone,$code);
- log::record("login() set code => {handle_id: $handle_id \t code: $code \t phone: $phone \t}");
- return json_encode(['status'=>'ok','code'=>'0000','need_code'=> true, 'phone' => $check, 'handle_id' => $handle_id]);
- }
- //医生类
- $class_info = DB::table('doctor_class')->where('doctor_id',$info['id'])->cache(300)->find();
- $institution = DB::table('institution')->where('id',$info['institution_id'])->cache(300)->field('name')->find();
- $info['institution_name'] = $institution['name'];
- $info['doctor_class_info'] = $class_info;
- //医生权限菜单
- $sql = "SELECT m.id,m.name,m.url,m.parent_id,m.icon_name from menu as m,dr_cla_permission as d where d.type=1 and d.doctor_id='".$info['id']."' and d.pass=m.id order by m.ordernum ";
- $permission = DB::query($sql);
- $info['permission'] = $permission;
- //登录成功则失败次数清0
- DB::table('doctors')->where('username',$param['userName'])->update(['login_failure'=>0,'login_time'=>date('Y-m-d H:i:s')]);
- Cache::set($sessionid,$info,43200);
- log::record('----登录信息----');
- log::record(Cache::get($sessionid));
- log::record('----登录信息----');
- $pwd_preg = $this->pregPassword($param['pwd']);
- unset($info['password']);
- $info['phone'] = $check;
- return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid,'phone'=>$check,'pregPwd'=>$pwd_preg]);
- }catch(\Exception $e){
- return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
- }
- }
- public function loginByLicense(){
- try{
- $param = $_REQUEST['param'];
- $license = $param['license'] ?? false;
- if(!$license || $license != '116c7413be204bf3') { //依据授权码 73090026
- return json_encode(['status'=>'fail','code'=>'2001','msg'=>'授权码校验失败']);
- }
- $sessionid = '116c73e78496739b';
- log::record($sessionid);
- log::record($_REQUEST);
- //医生信息
- $info = DB::table('doctors')->where('username', '73090026')->field('is_send_message,is_admin,message_push,id,exam_class,attachment,username,password,login_time,login_failure,realname,email,phone,doctor_title,institution_id,department_id,doctor_role,is_report')->find();
- log::record($info);
- if(!$info){
- return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户名信息不存在']);
- }
- //医生类
- $class_info = DB::table('doctor_class')->where('doctor_id',$info['id'])->cache(300)->find();
- $institution = DB::table('institution')->where('id',$info['institution_id'])->cache(300)->field('name')->find();
- $info['institution_name'] = $institution['name'];
- $info['doctor_class_info'] = $class_info;
- //医生权限菜单
- $sql = "SELECT m.id,m.name,m.url,m.parent_id,m.icon_name from menu as m,dr_cla_permission as d where d.type=1 and d.doctor_id='".$info['id']."' and d.pass=m.id order by m.ordernum ";
- $permission = DB::query($sql);
- $info['permission'] = $permission;
- Cache::set($sessionid, $info,900);
- log::record('----登录信息----');
- log::record(Cache::get($sessionid));
- log::record('----登录信息----');
- unset($info['password']);
- return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid]);
- }catch(\Exception $e){
- return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
- }
- }
- //手机号检验
- public function check_phone($mobile)
- {
- if(empty($mobile)){
- return false;
- }
- if(strlen($mobile) != 11){
- return false;
- }
- $preg = preg_match('/^1[34578]\d{9}$/', $mobile);
- if(!$preg){
- return false;
- }
- $start = substr($mobile,0,3);
- $end = substr($mobile,7,4);
- $phone = $start.'****'.$end;
- return $phone;
- }
- //再次发送短信
- public function send_message_again()
- {
- try{
- $param = $_REQUEST['param'];
- // 获取 handle_id
- if(!isset($param['handle_id']) || empty($param['handle_id'])) {
- return json_encode(['status'=>'fail','code'=>'2001','msg'=>'系统错误 not find handle id']);
- }
- $handle_id = $param['handle_id'];
- // 获取 phone
- if(!Cache::has('sendcode_handle_id'.$handle_id)) {
- return json_encode(['status'=>'fail','code'=>'2002','msg'=>'操作过时,请重新登录']);
- }
- // 发送验证码并记录
- $phone = Cache::get('sendcode_handle_id'.$handle_id);
- Cache::rm('sendcode_handle_id'.$handle_id);
- $code = rand('1000','9999');
- $info = send_message::sendSms2UpDate($phone,$code);
- $handle_id = $phone.rand('10000000','99999999');
- log::record('目前的手机号是'.$phone.'存储的缓存为sendcode_handle_id'.$handle_id);
- log::record('目前的验证码是'.$code.'存储的手机号为sendcode_'.$phone);
- Cache::set('sendcode_'.$phone, $code, 600);
- Cache::set('sendcode_handle_id'.$handle_id, $phone, 600);
- log::record("send_message_again() set code => {handle_id: $handle_id \t code: $code \t phone: $phone \t}");
- return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'handle_id'=>$handle_id]);
- }catch(\Exception $e){
- return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
- }
- }
- public function check_code()
- {
- try{
- log::record($_REQUEST);
- $param = $_REQUEST['param'];
- if(!isset($param['handle_id']) || !isset($param['code'])) {
- return json_encode(['status'=>'fail','code'=>'2003','msg'=>'系统错误 not find handle id or code']);
- }
- $handle_id = $param['handle_id'];
- $code = $param['code'];
- if(empty($handle_id) || empty($code)) {
- return json_encode(['status'=>'fail','code'=>'2004','msg'=>'handle id or code is null or empty']);
- }
- // 获取 phone
- if(!Cache::has('sendcode_handle_id'.$handle_id)) {
- return json_encode(['status'=>'fail','code'=>'2002','msg'=>'操作过时,请重新登录']);
- }
- $phone = Cache::get('sendcode_handle_id'.$handle_id);
- if(!Cache::has('sendcode_'.$phone)) {
- return json_encode(['status'=>'fail','code'=>'2002','msg'=>'操作过时,请重新登录']);
- }
- $check_code = Cache::get('sendcode_'.$phone);
- if(!empty($check_code) && $code != $check_code) {
- log::record('当前的手机号是'.$phone.'存储的为sendcode_handle_id'.$handle_id);
- log::record('当前的验证码是'.$code);
- log::record('缓存的验证码是'.$check_code.'存储的为sendcode_'.$phone);
- return json_encode(['status'=>'fail','code'=>'0090','msg'=>' 错误的验证码']);
- }
- log::record("check_code() params => {handle_id: $handle_id \t code: $code \t phone: $phone \t check_code: $check_code }");
- $sessionid = UUIDs::uuid16();
- log::record($sessionid);
- //医生信息
- $info = DB::table('doctors')->where('phone',$phone)->field('is_send_message,is_admin,message_push,id,exam_class,attachment,username,password,login_time,login_failure,realname,email,phone,doctor_title,institution_id,department_id,doctor_role,is_report')->find();
- log::record($info);
- if(!$info){
- return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户不存在']);
- }
- //医生类
- $class_info = DB::table('doctor_class')->where('doctor_id',$info['id'])->cache(300)->find();
- $institution = DB::table('institution')->where('id',$info['institution_id'])->cache(300)->field('name')->find();
- $info['institution_name'] = $institution['name'];
- $info['doctor_class_info'] = $class_info;
- //医生权限菜单
- $sql = "SELECT m.id,m.name,m.url,m.parent_id,m.icon_name from menu as m,dr_cla_permission as d where d.type=1 and d.doctor_id='".$info['id']."' and d.pass=m.id order by m.ordernum ";
- $permission = DB::query($sql);
- $info['permission'] = $permission;
- //登录成功则失败次数清0
- DB::table('doctors')->where('phone',$phone)->update(['login_failure'=>0,'login_time'=>date('Y-m-d H:i:s')]);
- Cache::set($sessionid,$info,43200);
- log::record('----登录信息----');
- log::record(Cache::get($sessionid));
- log::record('----登录信息----');
- unset($info['password']);
- return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid]);
- }catch(\Exception $e){
- return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
- }
- }
- //发送短信
- public function send_message()
- {
- try{
- $sessionid = $_REQUEST['sessionid'];
- $doctor = Cache::get($sessionid);
- $phone = $doctor['phone'];
- $code = rand('1000','9999');
- Cache::set($phone,$code,600);
- $info = send_message::sendSms2UpDate($phone,$code);
- return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid]);
- }catch(\Exception $e){
- return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
- }
- }
- //注册功能
- public function register(){
- $param = $_REQUEST['param'];
- $info = DB::table('doctors')->where('username',$param['userName'])->find();
- if($info){
- return json_encode(['status'=>'fail','code'=>'1006']);
- }
- $dat = array();
- $dat['password'] = md5($param['pwd']);
- $dat['username'] = $param['userName'];
- $id = DB::table('doctors')->insertGetId($dat);
- $doctor_class = array();
- $doctor_class['doctor_class'] = $param['doctor_class'];
- $doctor_class['doctor_id'] = $id;
- $doctor_class['department_id'] = $param['second_department_id'];
- //医生类别表
- DB::table('doctor_class')->insert($doctor_class);
- if($id){
- return json_encode(['status'=>'ok','code'=>'0000']);
- }else{
- return json_encode(['status'=>'fail','code'=>'1005','msg'=>'注册失败']);
- }
- }
- //退出登录 清空session值
- public function signOut(){
- // Cache::rm('doctor');
- Cache::clear();
- return json_encode(['status'=>'ok','code'=>'0000']);
- }
- public function change(){
- $id = $_REQUEST['id'];
- $a = DB::table('exams')->where('id',$id)->update(['exam_status'=>'3']);
- if($a){
- echo '已更改';
- }else{
- echo '更改失败';
- }
- }
- }
|