LoginController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Components\Helpers;
  4. use App\Components\QQWry;
  5. use App\Http\Models\User;
  6. use App\Http\Models\UserLoginLog;
  7. use Illuminate\Http\Request;
  8. use Response;
  9. use Redirect;
  10. use Captcha;
  11. use Session;
  12. use Cache;
  13. use Log;
  14. /**
  15. * 登录控制器
  16. * Class LoginController
  17. *
  18. * @package App\Http\Controllers
  19. */
  20. class LoginController extends Controller
  21. {
  22. protected static $systemConfig;
  23. function __construct()
  24. {
  25. self::$systemConfig = Helpers::systemConfig();
  26. }
  27. // 登录页
  28. public function index(Request $request)
  29. {
  30. if ($request->method() == 'POST') {
  31. $username = trim($request->get('username'));
  32. $password = trim($request->get('password'));
  33. $captcha = trim($request->get('captcha'));
  34. if (empty($username) || empty($password)) {
  35. Session::flash('errorMsg', '请输入用户名和密码');
  36. return Redirect::back();
  37. }
  38. // 是否校验验证码
  39. if (self::$systemConfig['is_captcha']) {
  40. if (!Captcha::check($captcha)) {
  41. Session::flash('errorMsg', '验证码错误,请重新输入');
  42. return Redirect::back()->withInput();
  43. }
  44. }
  45. $user = User::query()->where('username', $username)->where('password', md5($password))->first();
  46. if (!$user) {
  47. Session::flash('errorMsg', '用户名或密码错误');
  48. return Redirect::back()->withInput();
  49. } elseif (!$user->is_admin && $user->status < 0) {
  50. Session::flash('errorMsg', '账号已禁用');
  51. return Redirect::back();
  52. } elseif ($user->status == 0 && self::$systemConfig['is_active_register'] && $user->is_admin == 0) {
  53. Session::flash('errorMsg', '账号未激活,请点击<a href="/activeUser?username=' . $user->username . '" target="_blank"><span style="color:#000">【激活账号】</span></a>');
  54. return Redirect::back()->withInput();
  55. }
  56. // 更新登录信息
  57. $remember_token = "";
  58. if ($request->get('remember')) {
  59. $remember_token = makeRandStr(20);
  60. User::query()->where('id', $user->id)->update(['last_login' => time(), 'remember_token' => $remember_token]);
  61. } else {
  62. User::query()->where('id', $user->id)->update(['last_login' => time(), 'remember_token' => '']);
  63. }
  64. // 登录送积分
  65. if (self::$systemConfig['login_add_score']) {
  66. if (!Cache::has('loginAddScore_' . md5($username))) {
  67. $score = mt_rand(self::$systemConfig['min_rand_score'], self::$systemConfig['max_rand_score']);
  68. $ret = User::query()->where('id', $user->id)->increment('score', $score);
  69. if ($ret) {
  70. $this->addUserScoreLog($user->id, $user->score, $user->score + $score, $score, '登录送积分');
  71. // 登录多久后再登录可以获取积分
  72. $ttl = self::$systemConfig['login_add_score_range'] ? self::$systemConfig['login_add_score_range'] : 1440;
  73. Cache::put('loginAddScore_' . md5($username), '1', $ttl);
  74. Session::flash('successMsg', '欢迎回来,系统自动赠送您 ' . $score . ' 积分,您可以用它兑换流量包');
  75. }
  76. }
  77. }
  78. // 写入登录日志
  79. $this->addUserLoginLog($user->id, getClientIp());
  80. // 重新取出用户信息
  81. $userInfo = User::query()->where('id', $user->id)->first();
  82. Session::put('user', $userInfo->toArray());
  83. // 根据权限跳转
  84. if ($user->is_admin) {
  85. return Redirect::to('admin')->cookie('remember', $remember_token, 36000);
  86. }
  87. return Redirect::to('/')->cookie('remember', $remember_token, 36000);
  88. } else {
  89. if ($request->cookie("remember")) {
  90. $u = User::query()->where('status', '>=', 0)->where("remember_token", $request->cookie("remember"))->first();
  91. if ($u) {
  92. Session::put('user', $u->toArray());
  93. if ($u->is_admin) {
  94. return Redirect::to('admin');
  95. }
  96. return Redirect::to('/');
  97. }
  98. }
  99. $view['is_captcha'] = self::$systemConfig['is_captcha'];
  100. $view['is_register'] = self::$systemConfig['is_register'];
  101. $view['website_home_logo'] = self::$systemConfig['website_home_logo'];
  102. $view['website_analytics'] = self::$systemConfig['website_analytics'];
  103. $view['website_customer_service'] = self::$systemConfig['website_customer_service'];
  104. return Response::view('login', $view);
  105. }
  106. }
  107. // 退出
  108. public function logout(Request $request)
  109. {
  110. Session::flush();
  111. return Redirect::to('login')->cookie('remember', "", 36000);
  112. }
  113. // 添加用户登录日志
  114. private function addUserLoginLog($userId, $ip)
  115. {
  116. // 解析IP信息
  117. $qqwry = new QQWry();
  118. $ipInfo = $qqwry->ip($ip);
  119. if (isset($ipInfo['error'])) {
  120. Log::info('无法识别IP,可能是IPv6,尝试解析:' . $ip);
  121. $ipInfo = getIPv6($ip);
  122. }
  123. if (empty($ipInfo) || empty($ipInfo['country'])) {
  124. \Log::warning("获取IP地址信息异常:" . $ip);
  125. }
  126. $log = new UserLoginLog();
  127. $log->user_id = $userId;
  128. $log->ip = $ip;
  129. $log->country = $ipInfo['country'] ?? '';
  130. $log->province = $ipInfo['province'] ?? '';
  131. $log->city = $ipInfo['city'] ?? '';
  132. $log->county = $ipInfo['county'] ?? '';
  133. $log->isp = $ipInfo['isp'] ?? ($ipInfo['organization'] ?? '');
  134. $log->area = $ipInfo['area'] ?? '';
  135. $log->save();
  136. }
  137. }