auth) { return false; } $controllerPath = get_controller_path($request); if (!$controllerPath) { return false; } return $this->auth->check($controllerPath . '/' . $action); } protected function initController(WebmanRequest $request): ?Response { return null; } /** * GET:读取 36 条;POST 不支持 */ public function index(WebmanRequest $request): Response { $response = $this->initializeBackend($request); if ($response !== null) { return $response; } if (!$this->hasNodePermission($request, 'index')) { return $this->error(__('You have no permission'), [], 401); } if ($request->method() !== 'GET') { return $this->error(__('Parameter error')); } $row = Db::name('game_config')->where('config_key', ZiHuaDictionaryLib::CONFIG_KEY)->find(); $items = ZiHuaDictionaryLib::parseFromConfigValue($row['config_value'] ?? null); return $this->success('', [ 'items' => $items, 'categories' => ZiHuaDictionaryLib::CATEGORIES, ]); } /** * 保存 JSON 数组(仅 value_type=json) */ public function save(WebmanRequest $request): Response { $response = $this->initializeBackend($request); if ($response !== null) { return $response; } if (!$this->hasNodePermission($request, 'save')) { return $this->error(__('You have no permission'), [], 401); } if ($request->method() !== 'POST') { return $this->error(__('Parameter error')); } $payload = $request->post(); if (!is_array($payload)) { return $this->error(__('Parameter %s can not be empty', [''])); } $items = $payload['items'] ?? null; if (!is_array($items)) { return $this->error(__('Items must be an array')); } try { $clean = ZiHuaDictionaryLib::prepareItemsForSave($items); $json = ZiHuaDictionaryLib::encodeForDb($clean); } catch (InvalidArgumentException $e) { return $this->error($e->getMessage()); } $now = time(); $resourceKey = GameHotDataLock::safeResourceKeyForConfig(ZiHuaDictionaryLib::CONFIG_KEY); $lock = GameHotDataLock::tryAcquire(GameHotDataLock::TYPE_GAME_CONFIG, $resourceKey); if (!$lock['acquired']) { return $this->error(__('This config is locked by another operation, please try again later')); } try { try { $exists = Db::name('game_config')->where('config_key', ZiHuaDictionaryLib::CONFIG_KEY)->find(); if ($exists) { Db::name('game_config')->where('config_key', ZiHuaDictionaryLib::CONFIG_KEY)->update([ 'config_value' => $json, 'value_type' => 'json', 'update_time' => $now, ]); } else { Db::name('game_config')->insert([ 'config_key' => ZiHuaDictionaryLib::CONFIG_KEY, 'config_value' => $json, 'value_type' => 'json', 'remark' => '36字花字典 JSON 数组(独立表单维护)', 'create_time' => $now, 'update_time' => $now, ]); } } catch (Throwable $e) { return $this->error($e->getMessage()); } GameHotDataCoordinator::afterGameConfigKeyCommitted(ZiHuaDictionaryLib::CONFIG_KEY); return $this->success(__('Saved successfully')); } finally { GameHotDataLock::release(GameHotDataLock::TYPE_GAME_CONFIG, $resourceKey, $lock['token'], $lock['redis_lock']); } } }