Login.php 16 KB

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