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 @@
-
+ `;
+ 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 = `
+
+
@@ -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 = `
+
+
+ `;
+ 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 = `
+
+
+ `;
+ 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);