UserOperation.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Storage;
  6. use App\Models\UserOperationLog;
  7. use App\Models\UserOperationFrame;
  8. use App\Models\UserOperationDaily;
  9. use App\Http\Api\AuthApi;
  10. define("MAX_INTERVAL", 600000);
  11. define("MIN_INTERVAL", 60000);
  12. class UserOperation
  13. {
  14. /**
  15. * Handle an incoming request.
  16. *
  17. * @param \Illuminate\Http\Request $request
  18. * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  19. * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  20. */
  21. public function handle(Request $request, Closure $next)
  22. {
  23. $response = $next($request);
  24. $user = AuthApi::current($request);
  25. if(!$user){
  26. return $response;
  27. }
  28. $method = $request->method();
  29. $api = substr($request->path(),7);
  30. switch ($api) {
  31. case 'dict':
  32. $newLog = [
  33. "op_type_id"=>30,
  34. "op_type"=>"dict_lookup",
  35. "content"=>$request->get("word")
  36. ];
  37. break;
  38. default:
  39. # code...
  40. break;
  41. }
  42. if(isset($newLog)){
  43. $currTime = round((microtime(true))*1000,0);
  44. #获取客户端时区偏移 beijing = +8
  45. if (isset($_COOKIE["timezone"])) {
  46. $client_timezone = (0 - (int) $_COOKIE["timezone"]) * 60 * 1000;
  47. } else {
  48. $client_timezone = 0;
  49. }
  50. $log = new UserOperationLog();
  51. $log->id = app('snowflake')->id();
  52. $log->user_id = $user['user_id'];
  53. $log->op_type_id = $newLog["op_type_id"];
  54. $log->op_type = $newLog["op_type"];
  55. $log->content = $newLog["content"];
  56. $log->timezone = $client_timezone;
  57. $log->create_time = $currTime;
  58. $log->save();
  59. //frame
  60. // 查询上次编辑活跃结束时间
  61. $last = UserOperationFrame::where("user_id",$user['user_id'])->orderBy("updated_at","desc")->first();
  62. if($last){
  63. //找到,判断是否超时,超时新建,未超时修改
  64. $id = (int) $last["id"];
  65. $start_time = (int) $last["op_start"];
  66. $endtime = (int) $last["op_end"];
  67. $hit = (int) $last["hit"];
  68. if ($currTime - $endtime > MAX_INTERVAL) {
  69. //超时新建
  70. $new_record = true;
  71. } else {
  72. //未超时修改
  73. $new_record = false;
  74. }
  75. }else{
  76. //没找到,新建
  77. $new_record = true;
  78. }
  79. $this_active_time = 0; //时间增量
  80. if ($new_record) {
  81. #新建
  82. $newFrame = new UserOperationFrame();
  83. #最小思考时间 MIN_INTERVAL
  84. $newFrame->id = app('snowflake')->id();
  85. $newFrame->user_id = $user['user_id'];
  86. $newFrame->op_start = $currTime - MIN_INTERVAL;
  87. $newFrame->op_end = $currTime;
  88. $newFrame->duration = MIN_INTERVAL;
  89. $newFrame->hit = 1;
  90. $newFrame->timezone = $client_timezone;
  91. $newFrame->save();
  92. $this_active_time = MIN_INTERVAL;
  93. } else {
  94. #修改
  95. $last->op_end = $currTime;
  96. $last->duration = $currTime - $start_time;
  97. $last->hit = $last->hit + 1;
  98. $last->save();
  99. }
  100. #更新经验总量表
  101. #计算客户端日期 unix时间戳 以毫秒计
  102. $client_currtime = $currTime + $client_timezone;
  103. $client_date = strtotime(gmdate("Y-m-d", $client_currtime / 1000)) * 1000;
  104. #查询是否存在
  105. $daily = UserOperationDaily::where("user_id",$user['user_id'])->where("date_int",$client_date)->first();
  106. if ($daily) {
  107. #更新
  108. $daily->duration = $daily->duration + $this_active_time;
  109. $daily->hit = $daily->hit + 1;
  110. $daily->save();
  111. } else {
  112. #新建
  113. $daily = new UserOperationDaily();
  114. $daily->id = app('snowflake')->id();
  115. $daily->user_id = $user['user_id'];
  116. $daily->date_int = $client_date;
  117. $daily->duration = MIN_INTERVAL;
  118. $daily->hit = 1;
  119. $daily->save();
  120. }
  121. #更新经验总量表结束
  122. }
  123. return $response;
  124. }
  125. }