CheckActiveMenuService.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. namespace App\Services;
  3. use App\Menu;
  4. use App\UserVisitMenuLog;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\Redis;
  8. class CheckActiveMenuService
  9. {
  10. public static function sync()
  11. {
  12. try {
  13. $userVisitMenuLogsL1 = Redis::LRANGE('UserVisitMenuLogsL1', 0, -1);
  14. UserVisitMenuLog::query()->insert(self::redisListToArray($userVisitMenuLogsL1));
  15. self::switchL1ToL2();
  16. } catch (\Exception $e) {
  17. return;
  18. }
  19. }
  20. /**
  21. * @param Request $request
  22. */
  23. public static function set(Request $request): void
  24. {
  25. $uri = substr($request->getRequestUri(), 1);
  26. // 请求方法为get
  27. if ($request->method() == 'GET') {
  28. $menu = Menu::query()->where('route', $uri)->first();
  29. if ($menu) {
  30. //redis正常保存在缓存中
  31. $date = date('Y-m-d H:i:s');
  32. $userVisitMenuLog = new UserVisitMenuLog([
  33. 'user_id' => Auth::user()['id'],
  34. 'menu_id' => $menu->id,
  35. 'created_at' => $date,
  36. 'updated_at' => $date,
  37. ]);
  38. try {
  39. //菜单点击入缓存
  40. Redis::LPUSH('UserVisitMenuLogsL1', $userVisitMenuLog);
  41. } catch (\Exception $e) {
  42. //连接不上缓存。直接入库
  43. $userVisitMenuLog->save();
  44. }
  45. }
  46. }
  47. }
  48. /**
  49. * 将缓存中的数据拿出保存,转换为数组,方便数据库保存
  50. * @param $userVisitMenuLogsStr
  51. * @return array
  52. */
  53. public static function redisListToArray($userVisitMenuLogsStr): array
  54. {
  55. $userVisitMenuLogsArr = [];
  56. foreach ($userVisitMenuLogsStr as $userVisitMenuLog) {
  57. $userVisitMenuLogObj = json_decode($userVisitMenuLog);
  58. $userVisitMenuLogsArr[] = [
  59. 'user_id' => $userVisitMenuLogObj->user_id,
  60. 'menu_id' => $userVisitMenuLogObj->menu_id,
  61. 'created_at' => $userVisitMenuLogObj->created_at,
  62. 'updated_at' => $userVisitMenuLogObj->updated_at,
  63. ];
  64. }
  65. return $userVisitMenuLogsArr;
  66. }
  67. /**
  68. *将L1缓存转移到L2
  69. */
  70. public static function switchL1ToL2(): void
  71. {
  72. while (Redis::LLEN('UserVisitMenuLogsL1') > 0) {
  73. Redis::LPUSH('UserVisitMenuLogsL2', Redis::LPOP('UserVisitMenuLogsL1'));
  74. }
  75. }
  76. }