This commit is contained in:
@@ -55,7 +55,6 @@ class ThemeController extends PluginAdminBaseController
|
|||||||
'side' => $param['side'] ?? [],
|
'side' => $param['side'] ?? [],
|
||||||
'feedback_type' => $param['feedback_type'] ?? [],
|
'feedback_type' => $param['feedback_type'] ?? [],
|
||||||
'honor' => $param['honor'] ?? [],
|
'honor' => $param['honor'] ?? [],
|
||||||
'partner' => $param['partner'] ?? [],
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$model = new ThemeConfigModel();
|
$model = new ThemeConfigModel();
|
||||||
|
|||||||
@@ -41,7 +41,6 @@ class ThemeController extends PluginBaseController
|
|||||||
'dcim_product_link' => $config['site_config']['dcim_product_link'] ?? '',
|
'dcim_product_link' => $config['site_config']['dcim_product_link'] ?? '',
|
||||||
// 以下字段需与 /console/v1/common 保持一致的扁平结构
|
// 以下字段需与 /console/v1/common 保持一致的扁平结构
|
||||||
'honor' => $config['honor'] ?? ($config['site_config']['honor'] ?? []),
|
'honor' => $config['honor'] ?? ($config['site_config']['honor'] ?? []),
|
||||||
'partner' => $config['partner'] ?? ($config['site_config']['partner'] ?? []),
|
|
||||||
'friendly_link' => $config['friendly_link'] ?? [],
|
'friendly_link' => $config['friendly_link'] ?? [],
|
||||||
'banner' => $config['banner'] ?? [],
|
'banner' => $config['banner'] ?? [],
|
||||||
'header_nav' => $config['header_nav'] ?? [],
|
'header_nav' => $config['header_nav'] ?? [],
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
namespace addon\theme_configurator\model;
|
namespace addon\theme_configurator\model;
|
||||||
|
|
||||||
|
use think\facade\Cache;
|
||||||
use think\facade\Config;
|
use think\facade\Config;
|
||||||
use think\facade\Db;
|
use think\facade\Db;
|
||||||
|
|
||||||
@@ -10,6 +11,10 @@ use think\facade\Db;
|
|||||||
class ThemeConfigModel
|
class ThemeConfigModel
|
||||||
{
|
{
|
||||||
public const TABLE = 'addon_theme_configurator';
|
public const TABLE = 'addon_theme_configurator';
|
||||||
|
|
||||||
|
// 缓存配置
|
||||||
|
private const CACHE_KEY = 'theme_config_cache';
|
||||||
|
private const CACHE_TTL = 3600; // 缓存1小时
|
||||||
|
|
||||||
public static function tableName(): string
|
public static function tableName(): string
|
||||||
{
|
{
|
||||||
@@ -25,17 +30,31 @@ class ThemeConfigModel
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取配置
|
* 获取配置 (带缓存)
|
||||||
*/
|
*/
|
||||||
public function getConfig(): array
|
public function getConfig(): array
|
||||||
{
|
{
|
||||||
|
// 尝试从缓存获取
|
||||||
|
$config = Cache::get(self::CACHE_KEY);
|
||||||
|
|
||||||
|
if ($config !== false && $config !== null) {
|
||||||
|
// 缓存命中
|
||||||
|
return $config;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 缓存未命中,从数据库读取
|
||||||
$row = $this->query()->order('id', 'asc')->find();
|
$row = $this->query()->order('id', 'asc')->find();
|
||||||
if (!$row) {
|
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(),
|
'update_time' => time(),
|
||||||
];
|
];
|
||||||
|
|
||||||
$exists = $this->query()->order('id', 'asc')->find();
|
$exists = $this->query()->find();
|
||||||
if ($exists) {
|
if ($exists) {
|
||||||
$this->query()->where('id', $exists['id'])->update($payload);
|
$this->query()->where('id', $exists['id'])->update($payload);
|
||||||
} else {
|
} else {
|
||||||
|
$payload['create_time'] = time();
|
||||||
$this->query()->insert($payload);
|
$this->query()->insert($payload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 清除缓存,确保下次读取最新数据
|
||||||
|
Cache::delete(self::CACHE_KEY);
|
||||||
|
|
||||||
return $config;
|
return $config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -231,15 +231,6 @@
|
|||||||
<button class="btn btn-secondary" id="addFeedbackTypeBtn">+ 添加</button>
|
<button class="btn btn-secondary" id="addFeedbackTypeBtn">+ 添加</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section-card">
|
|
||||||
<div class="section-header">
|
|
||||||
<h2>合作伙伴</h2>
|
|
||||||
</div>
|
|
||||||
<div class="section-body">
|
|
||||||
<div id="partnerList"></div>
|
|
||||||
<button class="btn btn-secondary" id="addPartnerBtn">+ 添加</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<!-- JSON编辑器 -->
|
<!-- JSON编辑器 -->
|
||||||
@@ -334,7 +325,6 @@
|
|||||||
renderFriendlyLinks(data.friendly_link || []);
|
renderFriendlyLinks(data.friendly_link || []);
|
||||||
renderSides(data.side || []);
|
renderSides(data.side || []);
|
||||||
renderFeedbackTypes(data.feedback_type || []);
|
renderFeedbackTypes(data.feedback_type || []);
|
||||||
renderPartners(data.partner || []);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取嵌套属性值
|
// 获取嵌套属性值
|
||||||
@@ -365,7 +355,6 @@
|
|||||||
data.friendly_link = collectFriendlyLinks();
|
data.friendly_link = collectFriendlyLinks();
|
||||||
data.side = collectSides();
|
data.side = collectSides();
|
||||||
data.feedback_type = collectFeedbackTypes();
|
data.feedback_type = collectFeedbackTypes();
|
||||||
data.partner = collectPartners();
|
|
||||||
data.header_nav = collectHeaderNav();
|
data.header_nav = collectHeaderNav();
|
||||||
data.footer_nav = collectFooterNav();
|
data.footer_nav = collectFooterNav();
|
||||||
|
|
||||||
@@ -667,34 +656,88 @@
|
|||||||
renderFeedbackTypes(types);
|
renderFeedbackTypes(types);
|
||||||
};
|
};
|
||||||
|
|
||||||
// ========== 合作伙伴 ==========
|
// ========== 顶部导航 ==========
|
||||||
function renderPartners(partners) {
|
function renderHeaderNav(navs) {
|
||||||
const container = document.getElementById('partnerList');
|
const container = document.getElementById('headerNavList');
|
||||||
container.innerHTML = '';
|
container.innerHTML = '';
|
||||||
partners.forEach((partner, index) => {
|
|
||||||
|
navs.forEach((nav, index) => {
|
||||||
const item = document.createElement('div');
|
const item = document.createElement('div');
|
||||||
item.className = 'config-item';
|
item.className = 'config-item';
|
||||||
|
const hasChildren = Array.isArray(nav.children) && nav.children.length > 0;
|
||||||
|
|
||||||
item.innerHTML = `
|
item.innerHTML = `
|
||||||
<div class="config-item__header">
|
<div class="config-item__header">
|
||||||
<h4>伙伴 ${index + 1}</h4>
|
<h4>导航 ${index + 1}: ${nav.name || '(未命名)'}</h4>
|
||||||
<button class="btn-icon btn-icon-danger" onclick="removePartner(${index})">×</button>
|
<div style="display: flex; gap: 4px;">
|
||||||
|
<button class="btn-icon" onclick="toggleHeaderNavChildren(${index})" title="子菜单">☰${hasChildren ? ` (${nav.children.length})` : ''}</button>
|
||||||
|
<button class="btn-icon btn-icon-danger" onclick="removeHeaderNav(${index})">×</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="config-item__body">
|
<div class="config-item__body">
|
||||||
<div class="form-fields">
|
<div class="form-fields">
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<label>名称</label>
|
<label>名称</label>
|
||||||
<input type="text" class="form-control" data-partner="${index}" data-field="name" value="${partner.name || ''}" placeholder="合作伙伴名称">
|
<input type="text" class="form-control" data-header-nav="${index}" data-field="name" value="${nav.name || ''}" placeholder="产品中心">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<label>Logo地址</label>
|
<label>链接</label>
|
||||||
<div class="upload-control">
|
<input type="text" class="form-control" data-header-nav="${index}" data-field="file_address" value="${nav.file_address || ''}" placeholder="/products.html">
|
||||||
<input type="text" class="form-control" data-partner="${index}" data-field="img" value="${partner.img || ''}" placeholder="/upload/partner.png">
|
</div>
|
||||||
<button class="btn btn-secondary upload-btn" data-target-partner="${index}.img">选择文件</button>
|
<div class="form-item">
|
||||||
|
<div class="form-switch">
|
||||||
|
<label>新窗口</label>
|
||||||
|
<input type="checkbox" data-header-nav="${index}" data-field="blank" ${nav.blank ? 'checked' : ''}>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="header-nav-children-${index}" style="display:${hasChildren ? 'block' : 'none'}; margin-top:12px; padding-top:12px; border-top:1px solid #eee;">
|
||||||
|
<h5 style="margin:0 0 8px; font-size:13px;">子菜单</h5>
|
||||||
|
<div id="header-nav-children-list-${index}"></div>
|
||||||
|
<button class="btn btn-secondary btn-sm" onclick="addHeaderNavChild(${index})" style="margin-top:8px;">+ 添加子菜单</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
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 = `
|
||||||
|
<div class="config-item__header">
|
||||||
|
<h4 style="font-size:13px;">子项 ${childIndex + 1}</h4>
|
||||||
|
<button class="btn-icon btn-icon-danger" onclick="removeHeaderNavChild(${parentIndex},${childIndex})">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="config-item__body">
|
||||||
|
<div class="form-fields">
|
||||||
<div class="form-item">
|
<div class="form-item">
|
||||||
<label>描述</label>
|
<label>名称</label>
|
||||||
<input type="text" class="form-control" data-partner="${index}" data-field="description" value="${partner.description || ''}" placeholder="简介">
|
<input type="text" class="form-control" data-header-nav-child="${parentIndex}.${childIndex}" data-field="name" value="${child.name || ''}" placeholder="轻量云">
|
||||||
|
</div>
|
||||||
|
<div class="form-item">
|
||||||
|
<label>链接</label>
|
||||||
|
<input type="text" class="form-control" data-header-nav-child="${parentIndex}.${childIndex}" data-field="file_address" value="${child.file_address || ''}" placeholder="/light.html">
|
||||||
|
</div>
|
||||||
|
<div class="form-item">
|
||||||
|
<label>图标URL</label>
|
||||||
|
<input type="text" class="form-control" data-header-nav-child="${parentIndex}.${childIndex}" data-field="icon" value="${child.icon || ''}" placeholder="/upload/icon.png">
|
||||||
|
</div>
|
||||||
|
<div class="form-item">
|
||||||
|
<div class="form-switch">
|
||||||
|
<label>新窗口</label>
|
||||||
|
<input type="checkbox" data-header-nav-child="${parentIndex}.${childIndex}" data-field="blank" ${child.blank ? 'checked' : ''}>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -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 = '<div class="alert alert-info">顶部导航较复杂,建议使用JSON编辑器编辑</div>';
|
|
||||||
}
|
|
||||||
|
|
||||||
function collectHeaderNav() {
|
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 () {
|
window.addHeaderNav = function() {
|
||||||
alert('请使用JSON编辑器编辑顶部导航');
|
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) {
|
function renderFooterNav(navs) {
|
||||||
const container = document.getElementById('footerNavList');
|
const container = document.getElementById('footerNavList');
|
||||||
container.innerHTML = '<div class="alert alert-info">底部导航较复杂,建议使用JSON编辑器编辑</div>';
|
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 = `
|
||||||
|
<div class="config-item__header">
|
||||||
|
<h4>栏目 ${colIndex + 1}: ${col.name || '(未命名)'}</h4>
|
||||||
|
<div style="display: flex; gap: 4px;">
|
||||||
|
<button class="btn-icon" onclick="toggleFooterNavChildren(${colIndex})" title="链接列表">☰${hasChildren ? ` (${col.children.length})` : ''}</button>
|
||||||
|
<button class="btn-icon btn-icon-danger" onclick="removeFooterNav(${colIndex})">×</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="config-item__body">
|
||||||
|
<div class="form-item">
|
||||||
|
<label>栏目名称</label>
|
||||||
|
<input type="text" class="form-control" data-footer-nav="${colIndex}" data-field="name" value="${col.name || ''}" placeholder="热门云产品">
|
||||||
|
</div>
|
||||||
|
<div id="footer-nav-children-${colIndex}" style="display:${hasChildren ? 'block' : 'none'}; margin-top:12px; padding-top:12px; border-top:1px solid #eee;">
|
||||||
|
<h5 style="margin:0 0 8px; font-size:13px;">链接列表</h5>
|
||||||
|
<div id="footer-nav-children-list-${colIndex}"></div>
|
||||||
|
<button class="btn btn-secondary btn-sm" onclick="addFooterNavChild(${colIndex})" style="margin-top:8px;">+ 添加链接</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
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 = `
|
||||||
|
<div class="config-item__header">
|
||||||
|
<h4 style="font-size:13px;">链接 ${linkIndex + 1}</h4>
|
||||||
|
<button class="btn-icon btn-icon-danger" onclick="removeFooterNavChild(${colIndex},${linkIndex})">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="config-item__body">
|
||||||
|
<div class="form-fields">
|
||||||
|
<div class="form-item">
|
||||||
|
<label>名称</label>
|
||||||
|
<input type="text" class="form-control" data-footer-nav-child="${colIndex}.${linkIndex}" data-field="name" value="${link.name || ''}" placeholder="云服务器">
|
||||||
|
</div>
|
||||||
|
<div class="form-item">
|
||||||
|
<label>链接</label>
|
||||||
|
<input type="text" class="form-control" data-footer-nav-child="${colIndex}.${linkIndex}" data-field="url" value="${link.url || ''}" placeholder="/products/ecs.html">
|
||||||
|
</div>
|
||||||
|
<div class="form-item">
|
||||||
|
<div class="form-switch">
|
||||||
|
<label>新窗口</label>
|
||||||
|
<input type="checkbox" data-footer-nav-child="${colIndex}.${linkIndex}" data-field="blank" ${link.blank ? 'checked' : ''}>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
container.appendChild(item);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function collectFooterNav() {
|
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 () {
|
window.addFooterNav = function() {
|
||||||
alert('请使用JSON编辑器编辑底部导航');
|
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) => {
|
document.addEventListener('click', (e) => {
|
||||||
if (e.target.closest('.upload-btn')) {
|
if (e.target.closest('.upload-btn')) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const btn = e.target.closest('.upload-btn');
|
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();
|
document.getElementById('fileInput').click();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -836,7 +1010,6 @@
|
|||||||
document.getElementById('addFriendlyLinkBtn').addEventListener('click', addFriendlyLink);
|
document.getElementById('addFriendlyLinkBtn').addEventListener('click', addFriendlyLink);
|
||||||
document.getElementById('addSideBtn').addEventListener('click', addSide);
|
document.getElementById('addSideBtn').addEventListener('click', addSide);
|
||||||
document.getElementById('addFeedbackTypeBtn').addEventListener('click', addFeedbackType);
|
document.getElementById('addFeedbackTypeBtn').addEventListener('click', addFeedbackType);
|
||||||
document.getElementById('addPartnerBtn').addEventListener('click', addPartner);
|
|
||||||
document.getElementById('addHeaderNavBtn').addEventListener('click', addHeaderNav);
|
document.getElementById('addHeaderNavBtn').addEventListener('click', addHeaderNav);
|
||||||
document.getElementById('addFooterNavBtn').addEventListener('click', addFooterNav);
|
document.getElementById('addFooterNavBtn').addEventListener('click', addFooterNav);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user