| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- <?php
- namespace App\Services;
- use App\Menu;
- use App\User;
- use App\UserVisitMenuLog;
- use Illuminate\Http\Request;
- use Illuminate\Support\Arr;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\Redis;
- class CheckActiveMenuService
- {
- public static function sync()
- {
- try {
- $userVisitMenuLogsL1 = Redis::LRANGE('UserVisitMenuLogsL1', 0, -1);
- UserVisitMenuLog::query()->insert(self::redisListToArray($userVisitMenuLogsL1));
- self::switchL1ToL2();
- } catch (\Exception $e) {
- return;
- }
- }
- /**
- * @param Request $request
- */
- public static function set(Request $request): void
- {
- $uri = substr($request->getRequestUri(), 1);
- // 请求方法为get
- if ($request->method() == 'GET') {
- $menu = Menu::query()->where('route', $uri)->first();
- if ($menu) {
- //redis正常保存在缓存中
- $date = date('Y-m-d H:i:s');
- $userVisitMenuLog = new UserVisitMenuLog([
- 'user_id' => Auth::user()['id'],
- 'menu_id' => $menu->id,
- 'created_at' => $date,
- 'updated_at' => $date,
- ]);
- try {
- //菜单点击入缓存
- Redis::LPUSH('UserVisitMenuLogsL1', $userVisitMenuLog);
- } catch (\Exception $e) {
- //连接不上缓存。直接入库
- $userVisitMenuLog->save();
- }
- }
- }
- }
- public static function activeMenus()
- {
- if (Redis::LLEN('UserVisitMenuLogsL1') + Redis::LLEN('UserVisitMenuLogsL2') > 0) {
- //缓存中有数据
- $array1 = self::redisListToArray(Redis::LRANGE('UserVisitMenuLogsL1', 0, -1));
- $array2 = self::redisListToArray(Redis::LRANGE('UserVisitMenuLogsL2', 0, -1));
- $array = array_merge($array1, $array2);
- $conller = collect($array);
- $user_id = 1;
- if (Auth::user()) {
- $user_id = Auth::user()->id;
- }
- $arr = $conller->filter(function ($item) use ($user_id){
- return $user_id === $item['user_id'];
- })->groupBy('menu_id')->sortByDesc(function ($item){
- return $item->count();
- })->forPage(0,5)->keys();
- $menus = Menu::query()->find($arr)->sortBy(function($item)use($arr){
- return $arr->search($item->id);
- });
- dd($menus,$arr);
- }
- }
- /**
- * 将缓存中的数据拿出保存,转换为数组,方便数据库保存
- * @param $userVisitMenuLogsStr
- * @return array
- */
- public static function redisListToArray($userVisitMenuLogsStr): array
- {
- $userVisitMenuLogsArr = [];
- foreach ($userVisitMenuLogsStr as $userVisitMenuLog) {
- $userVisitMenuLogObj = json_decode($userVisitMenuLog);
- $userVisitMenuLogsArr[] = [
- 'user_id' => $userVisitMenuLogObj->user_id,
- 'menu_id' => $userVisitMenuLogObj->menu_id,
- 'created_at' => $userVisitMenuLogObj->created_at,
- 'updated_at' => $userVisitMenuLogObj->updated_at,
- ];
- }
- return $userVisitMenuLogsArr;
- }
- /**
- *将L1缓存转移到L2
- */
- public static function switchL1ToL2(): void
- {
- while (Redis::LLEN('UserVisitMenuLogsL1') > 0) {
- Redis::LPUSH('UserVisitMenuLogsL2', Redis::LPOP('UserVisitMenuLogsL1'));
- }
- }
- }
|