WeightConfigController.php 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Api\WeightConfigController as ApiWeightConfigController;
  4. use App\Http\Controllers\Controller;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Redis;
  7. class WeightConfigController extends Controller
  8. {
  9. public function index()
  10. {
  11. $config = ApiWeightConfigController::getConfig();
  12. $totalRaw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_CLICKS);
  13. $totalClicks = [];
  14. foreach (ApiWeightConfigController::VALID_IDS as $id) {
  15. $totalClicks[$id] = isset($totalRaw[$id]) ? intval($totalRaw[$id]) : 0;
  16. }
  17. $showRaw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_SHOW);
  18. $totalShows = [];
  19. foreach (ApiWeightConfigController::VALID_IDS as $id) {
  20. $totalShows[$id] = isset($showRaw[$id]) ? intval($showRaw[$id]) : 0;
  21. }
  22. $days = 3;
  23. $dailyClicks = [];
  24. $dailyShows = [];
  25. for ($i = $days - 1; $i >= 0; $i--) {
  26. $date = date('Y-m-d', strtotime("-{$i} days"));
  27. $raw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX . $date);
  28. $row = ['date' => $date];
  29. foreach (ApiWeightConfigController::VALID_IDS as $id) {
  30. $row[$id] = isset($raw[$id]) ? intval($raw[$id]) : 0;
  31. }
  32. $dailyClicks[] = $row;
  33. $rawShow = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX . $date);
  34. $rowShow = ['date' => $date];
  35. foreach (ApiWeightConfigController::VALID_IDS as $id) {
  36. $rowShow[$id] = isset($rawShow[$id]) ? intval($rawShow[$id]) : 0;
  37. }
  38. $dailyShows[] = $rowShow;
  39. }
  40. $today = date('Y-m-d');
  41. $todayClickRaw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX . $today);
  42. $todayShowRaw = Redis::hgetall(ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX . $today);
  43. $todayClicks = [];
  44. $todayShows = [];
  45. foreach (ApiWeightConfigController::VALID_IDS as $id) {
  46. $todayClicks[$id] = isset($todayClickRaw[$id]) ? intval($todayClickRaw[$id]) : 0;
  47. $todayShows[$id] = isset($todayShowRaw[$id]) ? intval($todayShowRaw[$id]) : 0;
  48. }
  49. return view('admin.weight_config.index', compact(
  50. 'config',
  51. 'totalClicks',
  52. 'totalShows',
  53. 'todayClicks',
  54. 'todayShows',
  55. 'dailyClicks',
  56. 'dailyShows'
  57. ));
  58. }
  59. public function update(Request $request)
  60. {
  61. $config = $request->input('config');
  62. if (is_string($config)) {
  63. $config = json_decode($config, true);
  64. }
  65. if (!is_array($config)) {
  66. return response()->json(['status' => 'error', 'message' => '参数错误']);
  67. }
  68. $save = [];
  69. foreach (ApiWeightConfigController::VALID_IDS as $id) {
  70. $val = isset($config[$id]) ? intval($config[$id]) : 0;
  71. if ($val < 0) $val = 0;
  72. $save[$id] = $val;
  73. }
  74. if (array_sum($save) <= 0) {
  75. return response()->json(['status' => 'error', 'message' => '权重之和必须大于 0']);
  76. }
  77. Redis::set(ApiWeightConfigController::REDIS_KEY_CONFIG, json_encode($save));
  78. return response()->json(['status' => 'success', 'message' => '更新成功', 'config' => $save]);
  79. }
  80. public function resetStats(Request $request)
  81. {
  82. $type = $request->input('type');
  83. if (!$type) {
  84. return response()->json(['status' => 'error', 'message' => '缺少操作类型']);
  85. }
  86. $prefix = config('database.redis.options.prefix', '');
  87. $stripPrefix = function ($keys) use ($prefix) {
  88. if (!$prefix || empty($keys)) {
  89. return $keys;
  90. }
  91. return array_map(function ($k) use ($prefix) {
  92. return strpos($k, $prefix) === 0 ? substr($k, strlen($prefix)) : $k;
  93. }, $keys);
  94. };
  95. $hdelFieldFromDailyKeys = function (string $dailyPrefix, string $field) use ($stripPrefix) {
  96. $keys = Redis::keys($dailyPrefix . '*');
  97. foreach ($stripPrefix($keys) as $k) {
  98. Redis::hdel($k, $field);
  99. }
  100. };
  101. if ($type === 'all') {
  102. Redis::del(ApiWeightConfigController::REDIS_KEY_CLICKS);
  103. Redis::del(ApiWeightConfigController::REDIS_KEY_SHOW);
  104. foreach ([
  105. ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX,
  106. ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX,
  107. ] as $dailyPrefix) {
  108. $keys = Redis::keys($dailyPrefix . '*');
  109. foreach ($stripPrefix($keys) as $k) {
  110. Redis::del($k);
  111. }
  112. }
  113. } elseif ($type === 'click_id') {
  114. $id = intval($request->input('id'));
  115. if (!in_array($id, ApiWeightConfigController::VALID_IDS, true)) {
  116. return response()->json(['status' => 'error', 'message' => '无效 id']);
  117. }
  118. $field = (string) $id;
  119. Redis::hdel(ApiWeightConfigController::REDIS_KEY_CLICKS, $field);
  120. $hdelFieldFromDailyKeys(ApiWeightConfigController::REDIS_KEY_CLICKS_DAILY_PREFIX, $field);
  121. } elseif ($type === 'show_id') {
  122. $id = intval($request->input('id'));
  123. if (!in_array($id, ApiWeightConfigController::VALID_IDS, true)) {
  124. return response()->json(['status' => 'error', 'message' => '无效 id']);
  125. }
  126. $field = (string) $id;
  127. Redis::hdel(ApiWeightConfigController::REDIS_KEY_SHOW, $field);
  128. $hdelFieldFromDailyKeys(ApiWeightConfigController::REDIS_KEY_SHOW_DAILY_PREFIX, $field);
  129. } else {
  130. return response()->json(['status' => 'error', 'message' => '未知操作类型']);
  131. }
  132. return response()->json(['status' => 'success', 'message' => '清除成功']);
  133. }
  134. }