From 91b0d4f1e4a13f12b7f4a9569864352a4d9909c8 Mon Sep 17 00:00:00 2001 From: yiqiu Date: Sun, 28 Dec 2025 14:48:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ThemeController.php | 1 - .../controller/clientarea/ThemeController.php | 1 - .../model/ThemeConfigModel.php | 35 +- .../template/admin/index.html | 299 ++++++++++++++---- 4 files changed, 265 insertions(+), 71 deletions(-) diff --git a/plugins/addon/theme_configurator/controller/ThemeController.php b/plugins/addon/theme_configurator/controller/ThemeController.php index e97976a..a9c4a5c 100644 --- a/plugins/addon/theme_configurator/controller/ThemeController.php +++ b/plugins/addon/theme_configurator/controller/ThemeController.php @@ -55,7 +55,6 @@ class ThemeController extends PluginAdminBaseController 'side' => $param['side'] ?? [], 'feedback_type' => $param['feedback_type'] ?? [], 'honor' => $param['honor'] ?? [], - 'partner' => $param['partner'] ?? [], ]; $model = new ThemeConfigModel(); diff --git a/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php b/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php index 1007df8..a44d5fe 100644 --- a/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php +++ b/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php @@ -41,7 +41,6 @@ class ThemeController extends PluginBaseController 'dcim_product_link' => $config['site_config']['dcim_product_link'] ?? '', // 以下字段需与 /console/v1/common 保持一致的扁平结构 'honor' => $config['honor'] ?? ($config['site_config']['honor'] ?? []), - 'partner' => $config['partner'] ?? ($config['site_config']['partner'] ?? []), 'friendly_link' => $config['friendly_link'] ?? [], 'banner' => $config['banner'] ?? [], 'header_nav' => $config['header_nav'] ?? [], diff --git a/plugins/addon/theme_configurator/model/ThemeConfigModel.php b/plugins/addon/theme_configurator/model/ThemeConfigModel.php index ae66a8f..debc9a7 100644 --- a/plugins/addon/theme_configurator/model/ThemeConfigModel.php +++ b/plugins/addon/theme_configurator/model/ThemeConfigModel.php @@ -1,6 +1,7 @@ query()->order('id', 'asc')->find(); if (!$row) { - return $this->defaultConfig(); + $config = $this->defaultConfig(); + } else { + $config = json_decode($row['config'], true); + $config = is_array($config) ? $config : $this->defaultConfig(); } - - $config = json_decode($row['config'], true); - return is_array($config) ? $config : $this->defaultConfig(); + + // 写入缓存 + Cache::set(self::CACHE_KEY, $config, self::CACHE_TTL); + + return $config; } /** @@ -48,13 +67,17 @@ class ThemeConfigModel 'update_time' => time(), ]; - $exists = $this->query()->order('id', 'asc')->find(); + $exists = $this->query()->find(); if ($exists) { $this->query()->where('id', $exists['id'])->update($payload); } else { + $payload['create_time'] = time(); $this->query()->insert($payload); } + // 清除缓存,确保下次读取最新数据 + Cache::delete(self::CACHE_KEY); + return $config; } diff --git a/plugins/addon/theme_configurator/template/admin/index.html b/plugins/addon/theme_configurator/template/admin/index.html index ce19efe..df05522 100644 --- a/plugins/addon/theme_configurator/template/admin/index.html +++ b/plugins/addon/theme_configurator/template/admin/index.html @@ -231,15 +231,6 @@ -
-
-

合作伙伴

-
-
-
- -
-
@@ -334,7 +325,6 @@ renderFriendlyLinks(data.friendly_link || []); renderSides(data.side || []); renderFeedbackTypes(data.feedback_type || []); - renderPartners(data.partner || []); } // 获取嵌套属性值 @@ -365,7 +355,6 @@ data.friendly_link = collectFriendlyLinks(); data.side = collectSides(); data.feedback_type = collectFeedbackTypes(); - data.partner = collectPartners(); data.header_nav = collectHeaderNav(); data.footer_nav = collectFooterNav(); @@ -667,34 +656,88 @@ renderFeedbackTypes(types); }; - // ========== 合作伙伴 ========== - function renderPartners(partners) { - const container = document.getElementById('partnerList'); + // ========== 顶部导航 ========== + function renderHeaderNav(navs) { + const container = document.getElementById('headerNavList'); container.innerHTML = ''; - partners.forEach((partner, index) => { + + navs.forEach((nav, index) => { const item = document.createElement('div'); item.className = 'config-item'; + const hasChildren = Array.isArray(nav.children) && nav.children.length > 0; + item.innerHTML = `
-

伙伴 ${index + 1}

- +

导航 ${index + 1}: ${nav.name || '(未命名)'}

+
+ + +
- +
- -
- - + + +
+
+
+ +
+
+
+
子菜单
+
+ +
+
+ `; + container.appendChild(item); + + if (hasChildren) { + renderHeaderNavChildren(index, nav.children); + } + }); + } + + function renderHeaderNavChildren(parentIndex, children) { + const container = document.getElementById(`header-nav-children-list-${parentIndex}`); + container.innerHTML = ''; + + children.forEach((child, childIndex) => { + const item = document.createElement('div'); + item.className = 'config-item'; + item.style.marginLeft = '20px'; + item.innerHTML = ` +
+

子项 ${childIndex + 1}

+ +
+
+
- - + + +
+
+ + +
+
+ + +
+
+
+ + +
@@ -703,63 +746,194 @@ }); } - function collectPartners() { - const partners = []; - document.querySelectorAll('[data-partner]').forEach(input => { - const index = parseInt(input.dataset.partner); - const field = input.dataset.field; - if (!partners[index]) partners[index] = {}; - partners[index][field] = input.value; - }); - return partners.filter(p => p); - } - - window.addPartner = function () { - const partners = collectPartners(); - partners.push({ name: '', img: '', description: '' }); - renderPartners(partners); - }; - - window.removePartner = function (index) { - const partners = collectPartners(); - partners.splice(index, 1); - renderPartners(partners); - }; - - // ========== 顶部导航(简化版) ========== - function renderHeaderNav(navs) { - const container = document.getElementById('headerNavList'); - container.innerHTML = '
顶部导航较复杂,建议使用JSON编辑器编辑
'; - } - function collectHeaderNav() { - return config.header_nav || []; + const navs = []; + document.querySelectorAll('[data-header-nav]').forEach(input => { + const index = parseInt(input.dataset.headerNav); + const field = input.dataset.field; + if (!navs[index]) navs[index] = { children: [] }; + navs[index][field] = input.type === 'checkbox' ? input.checked : input.value; + }); + + document.querySelectorAll('[data-header-nav-child]').forEach(input => { + const [parentIndex, childIndex] = input.dataset.headerNavChild.split('.').map(Number); + const field = input.dataset.field; + if (!navs[parentIndex].children[childIndex]) navs[parentIndex].children[childIndex] = {}; + navs[parentIndex].children[childIndex][field] = input.type === 'checkbox' ? input.checked : input.value; + }); + + return navs.filter(n => n); } - window.addHeaderNav = function () { - alert('请使用JSON编辑器编辑顶部导航'); + window.addHeaderNav = function() { + const navs = collectHeaderNav(); + navs.push({ name: '', file_address: '', blank: false, children: [] }); + renderHeaderNav(navs); }; - // ========== 底部导航(简化版) ========== + window.removeHeaderNav = function(index) { + if(confirm('确定删除此导航项吗?')) { + const navs = collectHeaderNav(); + navs.splice(index, 1); + renderHeaderNav(navs); + } + }; + + window.toggleHeaderNavChildren = function(index) { + const container = document.getElementById(`header-nav-children-${index}`); + container.style.display = container.style.display === 'none' ? 'block' : 'none'; + }; + + window.addHeaderNavChild = function(parentIndex) { + const navs = collectHeaderNav(); + if (!navs[parentIndex].children) navs[parentIndex].children = []; + navs[parentIndex].children.push({ name: '', file_address: '', blank: false, icon: '', description: '' }); + renderHeaderNav(navs); + document.getElementById(`header-nav-children-${parentIndex}`).style.display = 'block'; + }; + + window.removeHeaderNavChild = function(parentIndex, childIndex) { + if(confirm('确定删除此子菜单吗?')) { + const navs = collectHeaderNav(); + navs[parentIndex].children.splice(childIndex, 1); + renderHeaderNav(navs); + } + }; + + // ========== 底部导航 ========== function renderFooterNav(navs) { const container = document.getElementById('footerNavList'); - container.innerHTML = '
底部导航较复杂,建议使用JSON编辑器编辑
'; + container.innerHTML = ''; + + navs.forEach((col, colIndex) => { + const item = document.createElement('div'); + item.className = 'config-item'; + const hasChildren = Array.isArray(col.children) && col.children.length > 0; + + item.innerHTML = ` +
+

栏目 ${colIndex + 1}: ${col.name || '(未命名)'}

+
+ + +
+
+
+
+ + +
+ +
+ `; + container.appendChild(item); + + if (hasChildren) { + renderFooterNavChildren(colIndex, col.children); + } + }); + } + + function renderFooterNavChildren(colIndex, children) { + const container = document.getElementById(`footer-nav-children-list-${colIndex}`); + container.innerHTML = ''; + + children.forEach((link, linkIndex) => { + const item = document.createElement('div'); + item.className = 'config-item'; + item.style.marginLeft = '20px'; + item.innerHTML = ` +
+

链接 ${linkIndex + 1}

+ +
+
+
+
+ + +
+
+ + +
+
+
+ + +
+
+
+
+ `; + container.appendChild(item); + }); } function collectFooterNav() { - return config.footer_nav || []; + const navs = []; + document.querySelectorAll('[data-footer-nav]').forEach(input => { + const index = parseInt(input.dataset.footerNav); + if (!navs[index]) navs[index] = { children: [] }; + navs[index][input.dataset.field] = input.value; + }); + + document.querySelectorAll('[data-footer-nav-child]').forEach(input => { + const [colIndex, linkIndex] = input.dataset.footerNavChild.split('.').map(Number); + const field = input.dataset.field; + if (!navs[colIndex].children[linkIndex]) navs[colIndex].children[linkIndex] = {}; + navs[colIndex].children[linkIndex][field] = input.type === 'checkbox' ? input.checked : input.value; + }); + + return navs.filter(n => n); } - window.addFooterNav = function () { - alert('请使用JSON编辑器编辑底部导航'); + window.addFooterNav = function() { + const navs = collectFooterNav(); + navs.push({ name: '', children: [] }); + renderFooterNav(navs); }; + window.removeFooterNav = function(index) { + if(confirm('确定删除此栏目吗?')) { + const navs = collectFooterNav(); + navs.splice(index, 1); + renderFooterNav(navs); + } + }; + + window.toggleFooterNavChildren = function(index) { + const container = document.getElementById(`footer-nav-children-${index}`); + container.style.display = container.style.display === 'none' ? 'block' : 'none'; + }; + + window.addFooterNavChild = function(colIndex) { + const navs = collectFooterNav(); + if (!navs[colIndex].children) navs[colIndex].children = []; + navs[colIndex].children.push({ name: '', url: '', blank: false }); + renderFooterNav(navs); + document.getElementById(`footer-nav-children-${colIndex}`).style.display = 'block'; + }; + + window.removeFooterNavChild = function(colIndex, linkIndex) { + if(confirm('确定删除此链接吗?')) { + const navs = collectFooterNav(); + navs[colIndex].children.splice(linkIndex, 1); + renderFooterNav(navs); + } + }; + + // 文件上传 document.addEventListener('click', (e) => { if (e.target.closest('.upload-btn')) { e.preventDefault(); const btn = e.target.closest('.upload-btn'); - currentUploadTarget = btn.dataset.target || btn.dataset.targetBanner || btn.dataset.targetHonor || btn.dataset.targetSide || btn.dataset.targetPartner; + currentUploadTarget = btn.dataset.target || btn.dataset.targetBanner || btn.dataset.targetHonor || btn.dataset.targetSide; document.getElementById('fileInput').click(); } }); @@ -836,7 +1010,6 @@ document.getElementById('addFriendlyLinkBtn').addEventListener('click', addFriendlyLink); document.getElementById('addSideBtn').addEventListener('click', addSide); document.getElementById('addFeedbackTypeBtn').addEventListener('click', addFeedbackType); - document.getElementById('addPartnerBtn').addEventListener('click', addPartner); document.getElementById('addHeaderNavBtn').addEventListener('click', addHeaderNav); document.getElementById('addFooterNavBtn').addEventListener('click', addFooterNav);