Login.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <?php
  2. /**
  3. * 登录控制器
  4. */
  5. namespace app\mcpsapi\controller;
  6. use app\common\model\Admin as AdminModel;
  7. use app\common\model\Setting;
  8. use app\common\model\GameInfo;
  9. use app\common\library\Sms;
  10. use app\common\logic\Websocket;
  11. use think\Db;
  12. use think\Session;
  13. use think\Config;
  14. class Login extends Guild
  15. {
  16. public function _initialize(){}//不需要继承父级构造
  17. /**
  18. * 登录验证
  19. * @param integer $allow_channel_id [description]
  20. * @return [type] [description]
  21. */
  22. public function checklogin($allow_channel_id=0)
  23. {
  24. if (!empty(session('guild_info'))) {
  25. return json(['data'=>session('guild_info'),'code'=>20000,'msg'=>'用户已经登录']);
  26. }
  27. $username = input('post.username','','trim');
  28. $password = input('post.password');
  29. $result = $this->validate(['username' => $username,'password' => $password],
  30. [
  31. ['username', 'require', '请输入用户名'],
  32. ['password', 'require', '请输入密码'],
  33. ]);
  34. if (true !== $result) {
  35. return json(['data'=>'','code'=>'10005','msg'=>$result]);
  36. }
  37. $adminModel = new AdminModel();
  38. $settingModel = new Setting();
  39. //外部渠道用户
  40. $adminInfo = Db::name('nw_channel_admin')->where(['username' => $username])->find();
  41. //后台登录密码有效期
  42. $password_valid_day = $settingModel::getSetting('PASSWORD_VALID_DAY');
  43. //短信验证码登录开关
  44. $isSmsLogin = (int)$settingModel::getSetting('ADMIN_SMS_SWITCH');
  45. // halt($isSmsLogin);
  46. if ( empty($adminInfo) ) {
  47. return json(['data'=>'','code'=>'10001','msg'=>'用户不存在']);
  48. }
  49. elseif($adminInfo['status']==0){
  50. return json(['data'=>'','code'=>'10002','msg'=>'该账号已被冻结,请联系相关人员']);
  51. }
  52. elseif ( $adminInfo['password'] != mg_password($password) ) {
  53. return json(['data'=>'','code'=>'10003','msg'=>'用户名或密码错误']);
  54. }
  55. //密码过期
  56. // elseif(empty($adminInfo['password_update_time']) || (time() - $adminInfo['password_update_time'] > $password_valid_day*86400)) {
  57. // return json(['data'=>['id'=>$adminInfo['id']],'code'=>'10004','msg'=>'密码已过有效期,请重新设置']);
  58. // }
  59. //短信验证登录
  60. else if ( $adminInfo['login_check'] && $isSmsLogin) {
  61. if(empty($adminInfo['mobile'])){
  62. return json(['data'=>'','code'=>'10005','msg'=>'用户的手机号未填写,无法进行短信辅助验证']);
  63. }
  64. else{
  65. session('cps_loginsms_info',['id'=>$adminInfo['id'],'mobile'=>$adminInfo['mobile']]); //需要短信验证时的临时session
  66. log_message('loginProcess:sms username='.$username.' mobile='.$adminInfo['mobile'].' session_id='.session_id(),'log',LOG_PATH . 'guildlogin/');
  67. if(empty(session('cps_loginsms_info'))){
  68. log_message('loginProcess: no session username='.$username.' mobile='.$adminInfo['mobile'].' session_id='.session_id(),'log',LOG_PATH . 'guildlogin/');
  69. }
  70. return json(['data'=>['mobilelogin' => $adminInfo['mobile']],'code'=>20000,'msg'=>'需要短信验证']);
  71. }
  72. }
  73. if($adminInfo['channel_id'] && $allow_channel_id){
  74. $allowChannelIds = model('Channel')->getChildIds($allow_channel_id);
  75. $allowChannelIds = array_merge($allowChannelIds,array($allow_channel_id));
  76. if(!in_array($adminInfo['channel_id'],$allowChannelIds)){
  77. return json(['data'=>'','code'=>'10006','msg'=>'该用户不属于规定的渠道']);
  78. }
  79. }
  80. // 登录
  81. return $this->doLogin($adminInfo);
  82. }
  83. /**
  84. * 发送验证码
  85. */
  86. public function sendSmsCode()
  87. {
  88. //需要短信验证时的临时session不存在时
  89. if(empty(session('cps_loginsms_info'))){
  90. log_message('sendSmsCode: no session post_data:'.print_r(input(),true).' session_id='.session_id(),'log',LOG_PATH . 'adminlogin/');
  91. return json(['data'=>'','code'=>10006,'msg'=>'短信辅助验证的用户不存在,请重新操作']);
  92. }
  93. $mobile = session('cps_loginsms_info')['mobile'];
  94. if (empty($mobile)) {
  95. return json(['data'=>'','code'=>'10006','msg'=>'手机号不能为空']);
  96. }
  97. $result = (new \app\common\library\Sms)->sendCode($mobile);
  98. if ($result['status']) {
  99. return json(['data'=>'','code'=>20000,'msg'=>'发送成功,请查收']);
  100. } else {
  101. return json(['data'=>'','code'=>10016,'msg'=>$result['msg']]);
  102. }
  103. }
  104. /**
  105. * 验证码登录
  106. */
  107. public function loginSms()
  108. {
  109. $code = input('post.sms_code');
  110. if($code==''){
  111. return json(['data'=>'','code'=>10016,'msg'=>'短信验证码不能为空']);
  112. }
  113. //需要短信验证时的临时session不存在时
  114. if(empty(session('cps_loginsms_info'))){
  115. log_message('loginSms: no session post_data:'.print_r(input(),true).' session_id='.session_id(),'log',LOG_PATH . 'adminlogin/');
  116. return json(['data'=>'','code'=>10016,'msg'=>'短信辅助验证的用户不存在,请重新操作']);
  117. }
  118. $mobile = session('cps_loginsms_info')['mobile'];
  119. if($mobile==''){
  120. return json(['data'=>'','code'=>10016,'msg'=>'手机号不能为空']);
  121. }
  122. $sms = new Sms();
  123. $codeResult = $sms->checkCode($mobile, $code);
  124. if(!$codeResult['status']) {
  125. return json(['data'=>'','code'=>10016,'msg'=>$codeResult['msg']]);
  126. }
  127. $adminInfo = Db::name('nw_channel_admin')->where(['id' => session('cps_loginsms_info')['id']])->find();
  128. if ( empty($adminInfo) ) {
  129. return json(['data'=>'','code'=>10016,'msg'=>'用户名不存在或已被禁用']);
  130. }
  131. session('cps_loginsms_info',null);
  132. // 登录
  133. return $this->doLogin($adminInfo);
  134. }
  135. /**
  136. * 登录验证成功后处理
  137. *
  138. * @param $adminInfo array 登录用户信息
  139. *
  140. */
  141. private function doLogin($adminInfo)
  142. {
  143. $ws = new Websocket;
  144. $guild_info = $this->getDetailInfo($adminInfo);
  145. session('guild_info', $guild_info);//记录Session
  146. //写入登入日志
  147. Db::name('cy_loginlog')->insert([
  148. 'username' => $adminInfo['username'],
  149. 'create_time' => NOW_TIMESTAMP,
  150. 'admin_id' => $adminInfo['id'],
  151. 'type' => 2,
  152. 'ip' => $this->request->ip()
  153. ]);
  154. //Websocket绑定token和后台uid
  155. $ws->registerToken(session_id(), 'cps'.$adminInfo['id']);
  156. return json(['data'=>$guild_info,'code'=>20000,'msg'=>'登录成功']);
  157. }
  158. /**
  159. * 用户详情
  160. * @return [type] [description]
  161. */
  162. public function getInfo()
  163. {
  164. if (session('guild_info') == null) {
  165. return json(['data'=>'','code'=>10007,'msg'=>'您还没有登录!']);
  166. }
  167. $adminInfo = session('guild_info');
  168. $guild_info = $this->getDetailInfo($adminInfo);
  169. $guild_info['name,'] = $guild_info['username'];
  170. $guild_info['avatar'] = 'B';
  171. $guild_info['introduction'] = 'B类用户';
  172. return json(['data'=>$guild_info,'code'=>20000,'msg'=>'成功']);
  173. }
  174. private function getDetailInfo($adminInfo)
  175. {
  176. $pwd = $this->encode($adminInfo['channel_id'].' '.date('Y-m-d H:i:s'));//水印加密
  177. $level = Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('level');//权限等级
  178. $roles = $level;
  179. $deposit_amt = 0;
  180. if ($level == 1) {
  181. $parent_id = Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('parent_id');
  182. if (Db::name('nw_channel')->where(['id' => $parent_id])->value('channel_tg_type') == 1) {
  183. $roles = 4;
  184. }
  185. $deposit_amt = Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('deposit_amt');
  186. }elseif ($level == 0) {
  187. if (Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('channel_tg_type') == 1) {
  188. $roles = 5;
  189. }
  190. }
  191. $channel_name = Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('name');//渠道名称
  192. //个人认证状态 0已提交未审核 1已提交审核成功 2已提交审核失败 3未提交
  193. $apply_status = Db::name('nw_channel_info_apply')->where(['channel_id' => $adminInfo['channel_id']])->order('id desc')->value('status');
  194. $apply_status === null && $apply_status = 3;
  195. //身份认证
  196. $person_id = Db::name('nw_channel_info')->where(['channel_id' => $adminInfo['channel_id']])->value('person_id');
  197. $leson_pid = Db::name('nw_channel_info')->where(['channel_id' => $adminInfo['channel_id']])->value('leson_person_id');
  198. //身份认证
  199. $amount = Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('amount');
  200. $js_amount = Db::name('nw_channel')->where(['id' => $adminInfo['channel_id']])->value('js_amount');
  201. $checkSePwd = !isset($adminInfo['checkSePwd'])?'N':$adminInfo['checkSePwd'];
  202. if ($leson_pid || $person_id) {
  203. $person_id = 1;
  204. }else{
  205. $person_id = 0;
  206. }
  207. //账户信息相关
  208. $editInfo = Db::name('nw_channel_admin')->field(['id','username','mobile','qq','sex','head_img','secondary_password','pay_password','read_status'])->where(['channel_id' => $adminInfo['channel_id']])->find();
  209. if ($editInfo['head_img'] === null || empty($editInfo['head_img'])) {
  210. $editInfo['head_img'] = 'image/game/icons/2020073016105f228087109a0.png';
  211. }
  212. $editInfo['secondary_password'] && $editInfo['secondary_password'] = 1;
  213. $editInfo['pay_password'] && $editInfo['pay_password'] = 1;
  214. $guild_info = ['id'=>$adminInfo['id'],'username'=>$adminInfo['username'],'channel_name'=>$channel_name,'channel_id'=>$adminInfo['channel_id'],'waterPwd'=>$pwd,'level'=>$level,'head_img'=>$editInfo['head_img'],'token'=>session_id(),'person_id'=>$person_id,'mobile'=>$editInfo['mobile'],'qq'=>$editInfo['qq'],'sex'=>$editInfo['sex'],'secondary_password'=>$editInfo['secondary_password'],'pay_password'=>$editInfo['pay_password'],'roles'=>[$roles],'checkSePwd'=>$checkSePwd,'read_status'=>$editInfo['read_status'],'apply_status'=>$apply_status,'amount'=>$amount,'js_amount'=>$js_amount,'deposit_amt'=>$deposit_amt];
  215. return $guild_info;
  216. }
  217. /**
  218. * 确认二级密码
  219. * @return [type] [description]
  220. */
  221. public function checkSePwd()
  222. {
  223. $pwd = input('pwd');
  224. if (!$pwd) {
  225. return json(['data'=>'','code'=>10030,'msg'=>'请输入二级密码!']);
  226. }
  227. $guild_info = session('guild_info');
  228. $id = $guild_info['id'];
  229. $pwd = mg_password($pwd);
  230. $res = Db::name('nw_channel_admin')->where(['id'=>$id,'secondary_password'=>$pwd])->value('id');
  231. if ($res) {
  232. $guild_info['checkSePwd'] = 'Y';
  233. session('guild_info', $guild_info);
  234. return json(['data'=>'','code'=>20000,'msg'=>'二级密码验证成功']);
  235. }else{
  236. return json(['data'=>'','code'=>10032,'msg'=>'二级密码验证失败']);
  237. }
  238. }
  239. /**
  240. * 首页热门游戏推荐
  241. * @param string $value [description]
  242. */
  243. public function hotGameList()
  244. {
  245. $limit = input('limit',4);
  246. $list = model('ChannelLoginPicture')->field('id,filename,url,isjump')->limit(4)->select();
  247. // $gameInfoModel = new GameInfo;
  248. // $hotGameList = $gameInfoModel->getGameInfoByLanmu(['g.lanmu'=>2],$limit);
  249. return json(['data'=>$list,'code'=>20000,'msg'=>'获取热门游戏成功']);
  250. }
  251. /**
  252. * 用户登出
  253. */
  254. public function logout()
  255. {
  256. $ws = new Websocket;
  257. //Websocket注销token和后台uid的绑定关系
  258. $ws->destroyToken(session_id(), session('guild_info')['id']);
  259. session('guild_info', null);
  260. return json(['data'=>'','code'=>20000,'msg'=>'注销成功']);
  261. }
  262. /**
  263. * 加密规则
  264. * @param string $string [description]
  265. * @param string $skey [description]
  266. * @return [type] [description]
  267. */
  268. private function encode($string = '', $skey = 'pwd') {
  269. $strArr = str_split($string);
  270. $strCount = count($strArr);
  271. foreach (str_split($skey) as $key => $value)
  272. $key < $strCount && $strArr[$key].=$value;
  273. return str_replace(array('-', ' ', ':'), array('ATR', 'MSS', 'XXL'), join('', $strArr));
  274. }
  275. /**
  276. * 解密规则
  277. * @param string $string [description]
  278. * @param string $skey [description]
  279. * @return [type] [description]
  280. */
  281. private function decode($string = '', $skey = 'pwd') {
  282. $strArr = str_split(str_replace(array('ATR', 'MSS', 'XXL'), array('-', ' ', ':'), $string), 2);
  283. $strCount = count($strArr);
  284. foreach (str_split($skey) as $key => $value)
  285. $key <= $strCount && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];
  286. return join('', $strArr);
  287. }
  288. /**
  289. * 测试方法
  290. * @param string $value [description]
  291. * @return [type] [description]
  292. */
  293. public function testFun()
  294. {
  295. return json(['data'=>'','code'=>10007,'msg'=>'您还没有登录!']);
  296. }
  297. }