From 518642ddb0a522fd3924fc94a9bfd18e2257686c Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Wed, 15 Apr 2026 17:46:30 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B8=B8=E6=88=8F=E7=AE=A1=E7=90=86]36?= =?UTF-8?q?=E5=AD=97=E8=8A=B1=E5=AD=97=E5=85=B8-=E6=9D=A5=E8=87=AA?= =?UTF-8?q?=E6=B8=B8=E6=88=8F=E9=85=8D=E7=BD=AE=E6=89=A9=E5=B1=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/config/ZiHuaDictionary.php | 130 ++++++++++++++++++ app/admin/controller/game/ZiHuaDictionary.php | 19 +++ .../lang/backend/en/config/ziHuaDictionary.ts | 3 + .../backend/zh-cn/config/ziHuaDictionary.ts | 3 + web/src/router/index.ts | 15 +- .../backend/config/ziHuaDictionary/index.vue | 104 ++++++++++++++ 6 files changed, 272 insertions(+), 2 deletions(-) create mode 100644 app/admin/controller/config/ZiHuaDictionary.php create mode 100644 web/src/lang/backend/en/config/ziHuaDictionary.ts create mode 100644 web/src/lang/backend/zh-cn/config/ziHuaDictionary.ts create mode 100644 web/src/views/backend/config/ziHuaDictionary/index.vue diff --git a/app/admin/controller/config/ZiHuaDictionary.php b/app/admin/controller/config/ZiHuaDictionary.php new file mode 100644 index 0000000..4c9404b --- /dev/null +++ b/app/admin/controller/config/ZiHuaDictionary.php @@ -0,0 +1,130 @@ +auth) { + return false; + } + $controllerPath = get_controller_path($request); + if (!$controllerPath) { + return false; + } + $paths = []; + $paths[] = $controllerPath . '/' . $action; + $parts = explode('/', $controllerPath); + foreach ($parts as &$part) { + if (str_contains($part, '_')) { + $part = lcfirst(str_replace(' ', '', ucwords(str_replace('_', ' ', $part)))); + } + } + $paths[] = implode('/', $parts) . '/' . $action; + foreach (array_values(array_unique($paths)) as $path) { + if ($this->auth->check($path)) { + return true; + } + } + return false; + } + + 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 必须为数组'); + } + try { + $clean = ZiHuaDictionaryLib::prepareItemsForSave($items); + $json = ZiHuaDictionaryLib::encodeForDb($clean); + } catch (InvalidArgumentException $e) { + return $this->error($e->getMessage()); + } + + $now = time(); + 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()); + } + + return $this->success(__('Saved successfully')); + } +} diff --git a/app/admin/controller/game/ZiHuaDictionary.php b/app/admin/controller/game/ZiHuaDictionary.php index 0db50a7..d14d5ed 100644 --- a/app/admin/controller/game/ZiHuaDictionary.php +++ b/app/admin/controller/game/ZiHuaDictionary.php @@ -16,6 +16,19 @@ use Webman\Http\Request as WebmanRequest; class ZiHuaDictionary extends Backend { protected bool $modelValidate = false; + protected array $noNeedPermission = ['index', 'save']; + + private function hasNodePermission(WebmanRequest $request, string $action): bool + { + if (!$this->auth) { + return false; + } + $controllerPath = get_controller_path($request); + if (!$controllerPath) { + return false; + } + return $this->auth->check($controllerPath . '/' . $action); + } protected function initController(WebmanRequest $request): ?Response { @@ -31,6 +44,9 @@ class ZiHuaDictionary extends Backend 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')); } @@ -51,6 +67,9 @@ class ZiHuaDictionary extends Backend 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')); } diff --git a/web/src/lang/backend/en/config/ziHuaDictionary.ts b/web/src/lang/backend/en/config/ziHuaDictionary.ts new file mode 100644 index 0000000..8d74396 --- /dev/null +++ b/web/src/lang/backend/en/config/ziHuaDictionary.ts @@ -0,0 +1,3 @@ +import dict from '../game/ziHuaDictionary' +export default dict + diff --git a/web/src/lang/backend/zh-cn/config/ziHuaDictionary.ts b/web/src/lang/backend/zh-cn/config/ziHuaDictionary.ts new file mode 100644 index 0000000..8d74396 --- /dev/null +++ b/web/src/lang/backend/zh-cn/config/ziHuaDictionary.ts @@ -0,0 +1,3 @@ +import dict from '../game/ziHuaDictionary' +export default dict + diff --git a/web/src/router/index.ts b/web/src/router/index.ts index 694dbde..4d179c9 100644 --- a/web/src/router/index.ts +++ b/web/src/router/index.ts @@ -37,6 +37,12 @@ router.beforeEach((to, from, next) => { // 按需动态加载页面的语言包-start let loadPath: string[] = [] + const toCamelPath = (path: string): string => { + return path + .split('/') + .map((seg) => seg.replace(/_([a-z])/g, (_m, c: string) => c.toUpperCase())) + .join('/') + } const config = useConfig() if (to.path in langAutoLoadMap) { loadPath.push(...langAutoLoadMap[to.path as keyof typeof langAutoLoadMap]) @@ -47,7 +53,10 @@ router.beforeEach((to, from, next) => { // 去除 path 中的 /admin const adminPath = to.path.slice(to.path.indexOf(adminBaseRoutePath) + adminBaseRoutePath.length) - if (adminPath) loadPath.push(prefix + adminPath + '.ts') + if (adminPath) { + loadPath.push(prefix + adminPath + '.ts') + loadPath.push(prefix + toCamelPath(adminPath) + '.ts') + } } else { prefix = './frontend/' + config.lang.defaultLang loadPath.push(prefix + to.path + '.ts') @@ -55,7 +64,9 @@ router.beforeEach((to, from, next) => { // 根据路由 name 加载的语言包 if (to.name) { - loadPath.push(prefix + '/' + to.name.toString() + '.ts') + const routeName = to.name.toString() + loadPath.push(prefix + '/' + routeName + '.ts') + loadPath.push(prefix + '/' + toCamelPath(routeName) + '.ts') } if (!window.loadLangHandle.publicMessageLoaded) window.loadLangHandle.publicMessageLoaded = [] diff --git a/web/src/views/backend/config/ziHuaDictionary/index.vue b/web/src/views/backend/config/ziHuaDictionary/index.vue new file mode 100644 index 0000000..669e4d3 --- /dev/null +++ b/web/src/views/backend/config/ziHuaDictionary/index.vue @@ -0,0 +1,104 @@ + + + + + + +