CheckActiveMenuService.php 3.6 KB

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