UserOperation.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. /**
  13. * $active_type[10] = "channel_update";
  14. * $active_type[11] = "channel_create";
  15. * $active_type[20] = "article_update";
  16. * $active_type[21] = "article_create";
  17. * $active_type[30] = "dict_lookup";
  18. * $active_type[40] = "term_update";
  19. * $active_type[42] = "term_create";
  20. * $active_type[41] = "term_lookup";
  21. * $active_type[60] = "wbw_update";
  22. * $active_type[61] = "wbw_create";
  23. * $active_type[70] = "sent_update";
  24. * $active_type[71] = "sent_create";
  25. * $active_type[80] = "collection_update";
  26. * $active_type[81] = "collection_create";
  27. * $active_type[90] = "nissaya_open";
  28. */
  29. class UserOperation
  30. {
  31. /**
  32. * Handle an incoming request.
  33. *
  34. * @param \Illuminate\Http\Request $request
  35. * @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
  36. * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
  37. */
  38. public function handle(Request $request, Closure $next)
  39. {
  40. $response = $next($request);
  41. $user = AuthApi::current($request);
  42. if(!$user){
  43. return $response;
  44. }
  45. $api = explode('/',$request->path());
  46. if(count($api)<3){
  47. return $response;
  48. }if($api[0] !== 'api' || $api[1] !=='v2'){
  49. return $response;
  50. }
  51. $method = $request->method();
  52. switch ($api[2]) {
  53. case 'channel':
  54. switch ($method) {
  55. case 'POST':
  56. $newLog = [
  57. "op_type_id"=>11,
  58. "op_type"=>"channel_create",
  59. "content"=>$request->get('studio').'/'.$request->get('name'),
  60. ];
  61. break;
  62. case 'PUT':
  63. $newLog = [
  64. "op_type_id"=>10,
  65. "op_type"=>"channel_update",
  66. "content"=>$request->get('name'),
  67. ];
  68. break;
  69. }
  70. break;
  71. case 'article':
  72. switch ($method) {
  73. case 'POST':
  74. $newLog = [
  75. "op_type_id"=>21,
  76. "op_type"=>"article_create",
  77. "content"=>$request->get('studio').'/'.$request->get('title'),
  78. ];
  79. break;
  80. case 'PUT':
  81. $newLog = [
  82. "op_type_id"=>20,
  83. "op_type"=>"article_update",
  84. "content"=>$request->get('title'),
  85. ];
  86. break;
  87. }
  88. break;
  89. case 'dict':
  90. $newLog = [
  91. "op_type_id"=>30,
  92. "op_type"=>"dict_lookup",
  93. "content"=>$request->get("word")
  94. ];
  95. break;
  96. case 'terms':
  97. switch ($method) {
  98. case 'POST':
  99. $newLog = [
  100. "op_type_id"=>42,
  101. "op_type"=>"term_create",
  102. "content"=>$request->get('word'),
  103. ];
  104. break;
  105. case 'PUT':
  106. $newLog = [
  107. "op_type_id"=>40,
  108. "op_type"=>"term_update",
  109. "content"=>$request->get('word'),
  110. ];
  111. break;
  112. }
  113. break;
  114. case 'sentence':
  115. switch ($method) {
  116. case 'POST':
  117. $newLog = [
  118. "op_type_id"=>71,
  119. "op_type"=>"sent_create",
  120. "content"=>$request->get('channel'),
  121. ];
  122. break;
  123. case 'PUT':
  124. $newLog = [
  125. "op_type_id"=>70,
  126. "op_type"=>"sent_update",
  127. "content"=>$request->get('channel'),
  128. ];
  129. break;
  130. /*
  131. case 'GET':
  132. if($request->get('view')==='sent-can-read' && $request->has('type')){
  133. $newLog = [
  134. "op_type"=>"res_read",
  135. "content"=>$request->get('sentence'),
  136. ];
  137. switch ($request->get('type')) {
  138. case 'translation':
  139. $newLog["op_type_id"] = 101;
  140. break;
  141. case 'nissaya':
  142. $newLog["op_type_id"] = 102;
  143. break;
  144. case 'original':
  145. $newLog["op_type_id"] = 103;
  146. break;
  147. case 'wbw':
  148. $newLog["op_type_id"] = 104;
  149. break;
  150. case 'commentary':
  151. $newLog["op_type_id"] = 105;
  152. break;
  153. default:
  154. unset($newLog);
  155. break;
  156. }
  157. }
  158. break;
  159. */
  160. }
  161. break;
  162. case 'anthology':
  163. switch ($method) {
  164. case 'POST':
  165. $newLog = [
  166. "op_type_id"=>81,
  167. "op_type"=>"collection_create",
  168. "content"=>$request->get('title'),
  169. ];
  170. break;
  171. case 'PUT':
  172. $newLog = [
  173. "op_type_id"=>80,
  174. "op_type"=>"collection_update",
  175. "content"=>$request->get('title'),
  176. ];
  177. break;
  178. }
  179. break;
  180. /*
  181. case 'article-map':
  182. switch ($method) {
  183. case 'POST':
  184. $newLog = [
  185. "op_type_id"=>111,
  186. "op_type"=>"article_map_create",
  187. "content"=>$request->get('anthology_id'),
  188. ];
  189. break;
  190. case 'PUT':
  191. $newLog = [
  192. "op_type_id"=>110,
  193. "op_type"=>"article_map_update",
  194. ];
  195. if(isset($api[3])){
  196. $newLog['content'] = $api[3];
  197. }
  198. break;
  199. }
  200. break;
  201. */
  202. case 'wbw':
  203. switch ($method) {
  204. case 'POST':
  205. $newLog = [
  206. "op_type_id"=>60,
  207. "op_type"=>"wbw_update",
  208. "content"=>$request->get('book')."_".$request->get('para')."_".$request->get('channel_id'),
  209. ];
  210. break;
  211. }
  212. break;
  213. }
  214. if(isset($newLog)){
  215. $currTime = round((microtime(true))*1000,0);
  216. #获取客户端时区偏移 beijing = +8
  217. if (isset($_COOKIE["timezone"])) {
  218. $client_timezone = (0 - (int) $_COOKIE["timezone"]) * 60 * 1000;
  219. } else {
  220. $client_timezone = 0;
  221. }
  222. $log = new UserOperationLog();
  223. $log->id = app('snowflake')->id();
  224. $log->user_id = $user['user_id'];
  225. $log->op_type_id = $newLog["op_type_id"];
  226. $log->op_type = $newLog["op_type"];
  227. $log->content = $newLog["content"];
  228. $log->timezone = $client_timezone;
  229. $log->create_time = $currTime;
  230. $log->save();
  231. //frame
  232. // 查询上次编辑活跃结束时间
  233. $last = UserOperationFrame::where("user_id",$user['user_id'])->orderBy("updated_at","desc")->first();
  234. if($last){
  235. //找到,判断是否超时,超时新建,未超时修改
  236. $id = (int) $last["id"];
  237. $start_time = (int) $last["op_start"];
  238. $endtime = (int) $last["op_end"];
  239. $hit = (int) $last["hit"];
  240. if ($currTime - $endtime > MAX_INTERVAL) {
  241. //超时新建
  242. $new_record = true;
  243. } else {
  244. //未超时修改
  245. $new_record = false;
  246. }
  247. }else{
  248. //没找到,新建
  249. $new_record = true;
  250. }
  251. $this_active_time = 0; //时间增量
  252. if ($new_record) {
  253. #新建
  254. $newFrame = new UserOperationFrame();
  255. #最小思考时间 MIN_INTERVAL
  256. $newFrame->id = app('snowflake')->id();
  257. $newFrame->user_id = $user['user_id'];
  258. $newFrame->op_start = $currTime - MIN_INTERVAL;
  259. $newFrame->op_end = $currTime;
  260. $newFrame->duration = MIN_INTERVAL;
  261. $newFrame->hit = 1;
  262. $newFrame->timezone = $client_timezone;
  263. $newFrame->save();
  264. $this_active_time = MIN_INTERVAL;
  265. } else {
  266. #修改
  267. $last->op_end = $currTime;
  268. $last->duration = $currTime - $start_time;
  269. $last->hit = $last->hit + 1;
  270. $last->save();
  271. }
  272. #更新经验总量表
  273. #计算客户端日期 unix时间戳 以毫秒计
  274. $client_currtime = $currTime + $client_timezone;
  275. $client_date = strtotime(gmdate("Y-m-d", $client_currtime / 1000)) * 1000;
  276. #查询是否存在
  277. $daily = UserOperationDaily::where("user_id",$user['user_id'])->where("date_int",$client_date)->first();
  278. if ($daily) {
  279. #更新
  280. $daily->duration = $daily->duration + $this_active_time;
  281. $daily->hit = $daily->hit + 1;
  282. $daily->save();
  283. } else {
  284. #新建
  285. $daily = new UserOperationDaily();
  286. $daily->id = app('snowflake')->id();
  287. $daily->user_id = $user['user_id'];
  288. $daily->date_int = $client_date;
  289. $daily->duration = MIN_INTERVAL;
  290. $daily->hit = 1;
  291. $daily->save();
  292. }
  293. #更新经验总量表结束
  294. }
  295. return $response;
  296. }
  297. }