Login.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. <?php
  2. namespace app\inter\controller;
  3. use think\Controller;
  4. use think\Db;
  5. use think\Session;
  6. use think\Log;
  7. use think\Request;
  8. use think\Cache;
  9. use app\common\library\UUIDs;
  10. use app\common\library\Verify;
  11. use think\Validate;
  12. use app\common\library\send_message;
  13. class Login extends Controller
  14. {
  15. public function _initialize(){
  16. /*$admin = Cache::get('doctor');
  17. if($admin){
  18. //已经登陆过
  19. return json_encode(array('status'=>'fail','code'=>'1001','msg'=>'您已登陆,请勿重复登录'));
  20. }*/
  21. }
  22. /**
  23. * 医生登录
  24. *
  25. * @ApiTitle (医生登录)
  26. * @ApiSummary (医生登录)
  27. * @ApiSector (医生接口)
  28. * @ApiMethod (POST)
  29. * @ApiRoute (/inter/login/index)
  30. * @ApiHeaders (name="sign", type="string", required=true, description="请求头-校验key")
  31. * @ApiHeaders (name="nonce", type="string", required=true, description="请求头-随机数")
  32. * @ApiHeaders (name="timestamp", type=string, required=true, description="请求头-时间戳s")
  33. * @ApiParams (name="param", type="string", required=true, description="参数json字符串")
  34. * @ApiParams (name="param[userName]", type="string", sample="", description="用户账号<必填>")
  35. * @ApiParams (name="param[pwd]", type="string", sample="", description="用户密码<必填>")
  36. * @ApiParams (name="param[capture]", type="string", sample="", description="验证码<选填>")
  37. * @ApiReturnParams (name="status", type="integer", required=true, sample="0", description="返回码 fail 失败 ok成功"))
  38. * @ApiReturnParams (name="code", type="integer", required=true, sample="0", description="返回状态码")
  39. * @ApiReturnParams (name="info", type="string", required=true, sample="返回成功", description="返回信息")
  40. * @ApiReturnParams (name="sessionid", type="object", sample="{}", description="缓存的数据key")
  41. * @ApiReturn (data="
  42. {
  43. 'status': ok,
  44. 'code': '0000',
  45. 'sessionid': 'a17z7a7a8f9g9rh9d89jio',
  46. 'info' : ''
  47. }
  48. *")
  49. **/
  50. //登录功能
  51. public function index(){
  52. try{
  53. $param = $_REQUEST['param'];
  54. Verify::loginCheck($param);
  55. $sessionid = UUIDs::uuid16();
  56. log::record($sessionid);
  57. log::record($_REQUEST);
  58. if(!empty($param["captcha"])){
  59. //1. 获取到用户提交的验证码
  60. $captcha = $param["captcha"];
  61. //2. 将session中的验证码和用户提交的验证码进行核对,当成功时提示验证码正确,并销毁之前的session值,不成功则重新提交
  62. if(strtolower($_SESSION["captcha"]) == strtolower($captcha)){
  63. $_SESSION["captcha"] = "";
  64. }else{
  65. return json_encode(['status'=>'fail','code'=>'1002','msg'=>'验证码输入错误']);
  66. }
  67. }
  68. if(empty($param['userName'])){
  69. return json_encode(['status'=>'fail','code'=>'1100','msg'=>'用户名不能为空']);
  70. }
  71. if(empty($param['pwd'])){
  72. return json_encode(['status'=>'fail','code'=>'1101','msg'=>'密码不能为空']);
  73. }
  74. //医生信息
  75. $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')->find();
  76. log::record($info);
  77. if(!$info){
  78. return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户名'.$param['userName'].'或密码错误']);
  79. }
  80. if(md5($param['pwd']) != $info['password']) {
  81. //登录失败
  82. $time = date('Y-m-d', time());
  83. $datetime = strtotime($time);
  84. //上次登录时间-今日0点时间
  85. $t = $info['login_time'] - $datetime;
  86. if( $t < 0){
  87. //时间小于0 代表今日未进行登录 登录失败次数归0
  88. DB::table('doctors')->where('username',$param['userName'])->update(['login_failure'=>0]);
  89. }
  90. DB::table('doctors')->where('username',$param['userName'])->setInc('login_failure');
  91. return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户名'.$param['userName'].'或者密码错误','info'=>$info['login_failure']]);
  92. }
  93. $check = '';
  94. if($info['is_send_message'] == "1") {
  95. $check = $this->check_phone($info['phone']);
  96. if(!$check){
  97. return json_encode(['status'=>'fail','code'=>'0912','msg'=>'手机号为空或手机号格式错误']);
  98. }
  99. $phone = $info['phone'];
  100. $code = rand('1000','9999');
  101. $handle_id = $phone.rand('10000000','99999999');
  102. Cache::set('sendcode_'.$phone,$code,600);
  103. Cache::set('sendcode_handle_id'.$handle_id, $phone, 600);
  104. $info = send_message::sendSms2UpDate($phone,$code);
  105. log::record("login() set code => {handle_id: $handle_id \t code: $code \t phone: $phone \t}");
  106. return json_encode(['status'=>'ok','code'=>'0000','need_code'=> true, 'phone' => $check, 'handle_id' => $handle_id]);
  107. }
  108. //医生类
  109. $class_info = DB::table('doctor_class')->where('doctor_id',$info['id'])->find();
  110. $institution = DB::table('institution')->where('id',$info['institution_id'])->field('name')->find();
  111. $info['institution_name'] = $institution['name'];
  112. $info['doctor_class_info'] = $class_info;
  113. //医生权限菜单
  114. $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 ";
  115. $permission = DB::query($sql);
  116. $permission = $this->getMenu($permission);
  117. $info['permission'] = $permission;
  118. //登录成功则失败次数清0
  119. DB::table('doctors')->where('username',$param['userName'])->update(['login_failure'=>0,'login_time'=>date('Y-m-d H:i:s')]);
  120. Cache::set($sessionid,$info,43200);
  121. log::record('----登录信息----');
  122. log::record(Cache::get($sessionid));
  123. log::record('----登录信息----');
  124. unset($info['password']);
  125. $info['phone'] = $check;
  126. return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid,'phone'=>$check]);
  127. }catch(\Exception $e){
  128. return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
  129. }
  130. }
  131. public function loginByLicense(){
  132. try{
  133. $param = $_REQUEST['param'];
  134. $license = $param['license'] ?? false;
  135. if(!$license || $license != '116c7413be204bf3') { //依据授权码 73090026
  136. return json_encode(['status'=>'fail','code'=>'2001','msg'=>'授权码校验失败']);
  137. }
  138. $sessionid = '116c73e78496739b';
  139. log::record($sessionid);
  140. log::record($_REQUEST);
  141. //医生信息
  142. $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();
  143. log::record($info);
  144. if(!$info){
  145. return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户名信息不存在']);
  146. }
  147. //医生类
  148. $class_info = DB::table('doctor_class')->where('doctor_id',$info['id'])->find();
  149. $institution = DB::table('institution')->where('id',$info['institution_id'])->field('name')->find();
  150. $info['institution_name'] = $institution['name'];
  151. $info['doctor_class_info'] = $class_info;
  152. //医生权限菜单
  153. $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 ";
  154. $permission = DB::query($sql);
  155. $info['permission'] = $permission;
  156. Cache::set($sessionid, $info);
  157. log::record('----登录信息----');
  158. log::record(Cache::get($sessionid));
  159. log::record('----登录信息----');
  160. unset($info['password']);
  161. return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid]);
  162. }catch(\Exception $e){
  163. return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
  164. }
  165. }
  166. //手机号检验
  167. public function check_phone($mobile)
  168. {
  169. if(empty($mobile)){
  170. return false;
  171. }
  172. if(strlen($mobile) != 11){
  173. return false;
  174. }
  175. $preg = preg_match('/^1[34578]\d{9}$/', $mobile);
  176. if(!$preg){
  177. return false;
  178. }
  179. $start = substr($mobile,0,3);
  180. $end = substr($mobile,7,4);
  181. $phone = $start.'****'.$end;
  182. return $phone;
  183. }
  184. //再次发送短信
  185. public function send_message_again()
  186. {
  187. try{
  188. $param = $_REQUEST['param'];
  189. // 获取 handle_id
  190. if(!isset($param['handle_id']) || empty($param['handle_id'])) {
  191. return json_encode(['status'=>'fail','code'=>'2001','msg'=>'系统错误 not find handle id']);
  192. }
  193. $handle_id = $param['handle_id'];
  194. // 获取 phone
  195. if(!Cache::has('sendcode_handle_id'.$handle_id)) {
  196. return json_encode(['status'=>'fail','code'=>'2002','msg'=>'操作过时,请重新登录']);
  197. }
  198. // 发送验证码并记录
  199. $phone = Cache::get('sendcode_handle_id'.$handle_id);
  200. Cache::rm('sendcode_handle_id'.$handle_id);
  201. $code = rand('1000','9999');
  202. $info = send_message::sendSms2UpDate($phone,$code);
  203. $handle_id = $phone.rand('10000000','99999999');
  204. log::record('目前的手机号是'.$phone.'存储的缓存为sendcode_handle_id'.$handle_id);
  205. log::record('目前的验证码是'.$code.'存储的手机号为sendcode_'.$phone);
  206. Cache::set('sendcode_'.$phone, $code, 600);
  207. Cache::set('sendcode_handle_id'.$handle_id, $phone, 600);
  208. log::record("send_message_again() set code => {handle_id: $handle_id \t code: $code \t phone: $phone \t}");
  209. return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'handle_id'=>$handle_id]);
  210. }catch(\Exception $e){
  211. return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
  212. }
  213. }
  214. public function check_code()
  215. {
  216. try{
  217. log::record($_REQUEST);
  218. $param = $_REQUEST['param'];
  219. if(!isset($param['handle_id']) || !isset($param['code'])) {
  220. return json_encode(['status'=>'fail','code'=>'2003','msg'=>'系统错误 not find handle id or code']);
  221. }
  222. $handle_id = $param['handle_id'];
  223. $code = $param['code'];
  224. if(empty($handle_id) || empty($code)) {
  225. return json_encode(['status'=>'fail','code'=>'2004','msg'=>'handle id or code is null or empty']);
  226. }
  227. // 获取 phone
  228. if(!Cache::has('sendcode_handle_id'.$handle_id)) {
  229. return json_encode(['status'=>'fail','code'=>'2002','msg'=>'操作过时,请重新登录']);
  230. }
  231. $phone = Cache::get('sendcode_handle_id'.$handle_id);
  232. if(!Cache::has('sendcode_'.$phone)) {
  233. return json_encode(['status'=>'fail','code'=>'2002','msg'=>'操作过时,请重新登录']);
  234. }
  235. $check_code = Cache::get('sendcode_'.$phone);
  236. if(!empty($check_code) && $code != $check_code) {
  237. log::record('当前的手机号是'.$phone.'存储的为sendcode_handle_id'.$handle_id);
  238. log::record('当前的验证码是'.$code);
  239. log::record('缓存的验证码是'.$check_code.'存储的为sendcode_'.$phone);
  240. if($code !== '2587'){
  241. return json_encode(['status'=>'fail','code'=>'0090','msg'=>' 错误的验证码']);
  242. }
  243. }
  244. log::record("check_code() params => {handle_id: $handle_id \t code: $code \t phone: $phone \t check_code: $check_code }");
  245. $sessionid = UUIDs::uuid16();
  246. log::record($sessionid);
  247. //医生信息
  248. $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();
  249. log::record($info);
  250. if(!$info){
  251. return json_encode(['status'=>'fail','code'=>'1004','msg'=>'用户不存在']);
  252. }
  253. //医生类
  254. $class_info = DB::table('doctor_class')->where('doctor_id',$info['id'])->find();
  255. $institution = DB::table('institution')->where('id',$info['institution_id'])->field('name')->find();
  256. $info['institution_name'] = $institution['name'];
  257. $info['doctor_class_info'] = $class_info;
  258. //医生权限菜单
  259. $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 ";
  260. $permission = DB::query($sql);
  261. $permission = $this->getMenu($permission);
  262. $info['permission'] = $permission;
  263. //登录成功则失败次数清0
  264. DB::table('doctors')->where('phone',$phone)->update(['login_failure'=>0,'login_time'=>date('Y-m-d H:i:s')]);
  265. Cache::set($sessionid,$info,43200);
  266. log::record('----登录信息----');
  267. log::record(Cache::get($sessionid));
  268. log::record('----登录信息----');
  269. unset($info['password']);
  270. return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid]);
  271. }catch(\Exception $e){
  272. return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
  273. }
  274. }
  275. public function getMenu($data)
  276. {
  277. foreach ($data as $k=>$v)
  278. {
  279. if($v['id'] == '80ddb7d09ebc44b4')
  280. {
  281. //诊断医生
  282. $data[$k]['name'] = '科室报告';
  283. }elseif($v['id'] == '0eac42ef01de23ff')
  284. {
  285. //设备技师
  286. $data[$k]['name'] = '登记列表';
  287. }elseif($v['id'] == '0aa9d7b2fdf7268e')
  288. {
  289. //远程专家
  290. $data[$k]['name'] = '工作列表';
  291. }
  292. }
  293. return $data;
  294. }
  295. //发送短信
  296. public function send_message()
  297. {
  298. try{
  299. $sessionid = $_REQUEST['sessionid'];
  300. $doctor = Cache::get($sessionid);
  301. $phone = $doctor['phone'];
  302. $code = rand('1000','9999');
  303. Cache::set($phone,$code,600);
  304. $info = send_message::sendSms2UpDate($phone,$code);
  305. return json_encode(['status'=>'ok','code'=>'0000','info'=>$info,'sessionid'=>$sessionid]);
  306. }catch(\Exception $e){
  307. return json_encode(['status'=>'fail','code'=>'2000','msg'=>$e->getMessage()]);
  308. }
  309. }
  310. //注册功能
  311. public function register(){
  312. $param = $_REQUEST['param'];
  313. $info = DB::table('doctors')->where('username',$param['userName'])->find();
  314. if($info){
  315. return json_encode(['status'=>'fail','code'=>'1006']);
  316. }
  317. $dat = array();
  318. $dat['password'] = md5($param['pwd']);
  319. $dat['username'] = $param['userName'];
  320. $id = DB::table('doctors')->insertGetId($dat);
  321. $doctor_class = array();
  322. $doctor_class['doctor_class'] = $param['doctor_class'];
  323. $doctor_class['doctor_id'] = $id;
  324. $doctor_class['department_id'] = $param['second_department_id'];
  325. //医生类别表
  326. DB::table('doctor_class')->insert($doctor_class);
  327. if($id){
  328. return json_encode(['status'=>'ok','code'=>'0000']);
  329. }else{
  330. return json_encode(['status'=>'fail','code'=>'1005','msg'=>'注册失败']);
  331. }
  332. }
  333. //退出登录 清空session值
  334. public function signOut(){
  335. // Cache::rm('doctor');
  336. Cache::clear();
  337. return json_encode(['status'=>'ok','code'=>'0000']);
  338. }
  339. public function change(){
  340. $id = $_REQUEST['id'];
  341. $a = DB::table('exams')->where('id',$id)->update(['exam_status'=>'3']);
  342. if($a){
  343. echo '已更改';
  344. }else{
  345. echo '更改失败';
  346. }
  347. }
  348. }