= 0; $i--) { $date = date('Y-m-d', strtotime("-{$i} days")); $raw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX . $date); $row = ['date' => $date]; foreach (ApiWeightConfigController::VALID_IDS as $id) { $row[$id] = isset($raw[$id]) ? intval($raw[$id]) : 0; } $dailyClicks[] = $row; $rawShow = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX . $date); $rowShow = ['date' => $date]; foreach (ApiWeightConfigController::VALID_IDS as $id) { $rowShow[$id] = isset($rawShow[$id]) ? intval($rawShow[$id]) : 0; } $dailyShows[] = $rowShow; } $today = date('Y-m-d'); $todayClickRaw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX . $today); $todayShowRaw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX . $today); $todayClicks = []; $todayShows = []; foreach (ApiWeightConfigController::VALID_IDS as $id) { $todayClicks[$id] = isset($todayClickRaw[$id]) ? intval($todayClickRaw[$id]) : 0; $todayShows[$id] = isset($todayShowRaw[$id]) ? intval($todayShowRaw[$id]) : 0; } return view('admin.weight_config.index', compact( 'config', 'totalClicks', 'totalShows', 'todayClicks', 'todayShows', 'dailyClicks', 'dailyShows' )); } public function update(Request $request) { $config = $request->input('config'); if (is_string($config)) { $config = json_decode($config, true); } if (!is_array($config)) { return response()->json(['status' => 'error', 'message' => '参数错误']); } $save = []; foreach (ApiWeightConfigController::VALID_IDS as $id) { $val = isset($config[$id]) ? intval($config[$id]) : 0; if ($val < 0) $val = 0; $save[$id] = $val; } if (array_sum($save) <= 0) { return response()->json(['status' => 'error', 'message' => '权重之和必须大于 0']); } Redis::set(ApiWeightConfigController::REDIS_KEY_CONFIG, json_encode($save)); return response()->json(['status' => 'success', 'message' => '更新成功', 'config' => $save]); } public function resetStats(Request $request) { $type = $request->input('type'); if (!$type) { return response()->json(['status' => 'error', 'message' => '缺少操作类型']); } $prefix = config('database.redis.options.prefix', ''); $stripPrefix = function ($keys) use ($prefix) { if (!$prefix || empty($keys)) { return $keys; } return array_map(function ($k) use ($prefix) { return strpos($k, $prefix) === 0 ? substr($k, strlen($prefix)) : $k; }, $keys); }; $hdelFieldFromDailyKeys = function (string $dailyPrefix, string $field) use ($stripPrefix) { $keys = Redis::keys($dailyPrefix . '*'); foreach ($stripPrefix($keys) as $k) { Redis::hdel($k, $field); } }; if ($type === 'all') { Redis::del(ApiWeightConfigController::REDIS_KEY_CLICKS); Redis::del(ApiWeightConfigController::REDIS_KEY_SHOW); foreach ([ ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX, ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX, ] as $dailyPrefix) { $keys = Redis::keys($dailyPrefix . '*'); foreach ($stripPrefix($keys) as $k) { Redis::del($k); } } } elseif ($type === 'click_id') { $id = intval($request->input('id')); if (!in_array($id, ApiWeightConfigController::VALID_IDS, true)) { return response()->json(['status' => 'error', 'message' => '无效 id']); } $field = (string) $id; Redis::hdel(ApiWeightConfigController::REDIS_KEY_CLICKS, $field); $hdelFieldFromDailyKeys(ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX, $field); } elseif ($type === 'show_id') { $id = intval($request->input('id')); if (!in_array($id, ApiWeightConfigController::VALID_IDS, true)) { return response()->json(['status' => 'error', 'message' => '无效 id']); } $field = (string) $id; Redis::hdel(ApiWeightConfigController::REDIS_KEY_SHOW, $field); $hdelFieldFromDailyKeys(ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX, $field); } else { return response()->json(['status' => 'error', 'message' => '未知操作类型']); } return response()->json(['status' => 'success', 'message' => '清除成功']); } }