LoginController.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Models\User;
  5. use App\Http\Models\UserSubscribe;
  6. use App\Http\Models\UserSubscribeLog;
  7. use Illuminate\Http\Request;
  8. use Response;
  9. use Cache;
  10. use DB;
  11. /**
  12. * 登录接口
  13. * Class LoginController
  14. *
  15. * @package App\Http\Controllers
  16. */
  17. class LoginController extends Controller
  18. {
  19. // 登录返回订阅信息
  20. public function login(Request $request)
  21. {
  22. $username = trim($request->get('username'));
  23. $password = trim($request->get('password'));
  24. $cacheKey = 'request_times_' . md5($request->getClientIp());
  25. // 10分钟内请求失败15次,则封IP一小时
  26. if (Cache::has($cacheKey)) {
  27. if (Cache::get($cacheKey) >= 15) {
  28. return Response::json(['status' => 'fail', 'data' => [], 'message' => '频繁访问失败,禁止访问1小时']);
  29. }
  30. } else {
  31. Cache::put($cacheKey, 1, 10);
  32. }
  33. if (!$username || !$password) {
  34. Cache::increment($cacheKey);
  35. return Response::json(['status' => 'fail', 'data' => [], 'message' => '账号或密码错误']);
  36. }
  37. $user = User::query()->where('username', $username)->where('password', md5($password))->where('status', '>=', 0)->first();
  38. if (!$user) {
  39. Cache::increment($cacheKey);
  40. return Response::json(['status' => 'fail', 'data' => [], 'message' => '账号不存在或已被禁用']);
  41. }
  42. DB::beginTransaction();
  43. try {
  44. // 如果未生成过订阅链接则生成一个
  45. $subscribe = UserSubscribe::query()->where('user_id', $user->id)->first();
  46. if (!$subscribe) {
  47. $code = $this->makeSubscribeCode();
  48. $subscribe = new UserSubscribe();
  49. $subscribe->user_id = $user->id;
  50. $subscribe->code = $code;
  51. $subscribe->times = 0;
  52. $subscribe->save();
  53. } else {
  54. $code = $subscribe->code;
  55. }
  56. // 更新订阅链接访问次数
  57. $subscribe->increment('times', 1);
  58. // 记录每次请求
  59. $this->log($subscribe->id, $request->getClientIp(), 'API访问');
  60. // 处理用户信息
  61. unset($user->password, $user->remember_token);
  62. $data['user'] = $user;
  63. // 订阅链接
  64. $data['link'] = $this->systemConfig['subscribe_domain'] ? $this->systemConfig['subscribe_domain'] . '/s/' . $code : $this->systemConfig['website_url'] . '/s/' . $code;
  65. DB::commit();
  66. return Response::json(['status' => 'success', 'data' => $data, 'message' => '登录成功']);
  67. } catch (\Exception $e) {
  68. DB::rollBack();
  69. return Response::json(['status' => 'success', 'data' => [], 'message' => '登录失败']);
  70. }
  71. }
  72. // 写入订阅访问日志
  73. private function log($subscribeId, $ip, $headers)
  74. {
  75. $log = new UserSubscribeLog();
  76. $log->sid = $subscribeId;
  77. $log->request_ip = $ip;
  78. $log->request_time = date('Y-m-d H:i:s');
  79. $log->request_header = $headers;
  80. $log->save();
  81. }
  82. }