svc = new KioskService(); } public function bundle(): Response { try { $data = $this->svc->getBundle(); return json(['code' => 0, 'data' => $data]); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } /** 天文知识库专用列表(与 bundle 内 knowledge 同源,便于页面独立刷新) */ public function knowledge(): Response { try { return json(['code' => 0, 'data' => ['entries' => $this->svc->getKnowledgeList()]]); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function dataDisplay(): Response { try { return json(['code' => 0, 'data' => $this->svc->getDataDisplay()]); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function observatoryHistory(): Response { try { return json(['code' => 0, 'data' => $this->svc->getObservatoryHistory()]); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function saveHomeBackgrounds(): Response { $urls = $this->request->post('urls'); if (!is_array($urls)) { return json(['code' => 400, 'msg' => 'urls must be array'], 400); } $clean = array_values(array_filter($urls, fn ($u) => is_string($u) && $u !== '')); try { $this->svc->setJsonKv(\app\common\KioskDefaults::KEY_HOME_BG, $clean); return json(['code' => 0, 'msg' => 'ok']); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function saveWelcome(): Response { $w = $this->request->post(); $payload = [ 'zh-CN' => (string) ($w['zh-CN'] ?? ''), 'en' => (string) ($w['en'] ?? ''), 'bo' => (string) ($w['bo'] ?? ''), ]; try { $this->svc->setJsonKv(\app\common\KioskDefaults::KEY_WELCOME, $payload); return json(['code' => 0, 'msg' => 'ok']); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function saveGuide(): Response { $g = $this->request->post('guide'); if (!is_array($g)) { return json(['code' => 400, 'msg' => 'guide must be object'], 400); } try { $this->svc->setJsonKv(\app\common\KioskDefaults::KEY_GUIDE, $g); return json(['code' => 0, 'msg' => 'ok']); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function saveKnowledge(): Response { $entries = $this->request->post('entries'); if (!is_array($entries)) { return json(['code' => 400, 'msg' => 'entries must be array'], 400); } try { $this->svc->replaceKnowledge($entries); return json(['code' => 0, 'msg' => 'ok']); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } public function seedKnowledge(): Response { $entries = \app\common\KioskDefaults::knowledge(); if ($entries === []) { return json([ 'code' => 400, 'msg' => '演示知识种子已关闭,请使用 knowledge/sync 同步真实条目,勿调用本接口清空库表', ], 400); } try { $this->svc->replaceKnowledge($entries); return json(['code' => 0, 'msg' => 'ok']); } catch (\Throwable $e) { return json(['code' => 500, 'msg' => $e->getMessage()], 500); } } }