feat: 导航页文案可后台配置 + webhook修复 + 企业微信通知可用

- 导航页所有文案(标题/副标题/标签/咨询区/页脚/工作室名称)均可在后台「导航页设置」页配置
- 新增公开API GET /api/v1/nav-settings,导航页加载时自动拉取配置覆盖默认值
- CustomerHandler改为从数据库读取webhook URL,不再依赖config.yaml
- 新增默认企业微信webhook地址,开箱即用
- 后台新增webhook测试专用接口 POST /api/v1/admin/webhook/test
- 后台新增批量配置保存接口 PUT /api/v1/admin/config-batch
- 后台新增「导航页设置」管理页面,支持分组编辑保存
- 页脚添加工作室名称展示位
This commit is contained in:
2026-09-09 02:49:39 +08:00
parent 5e47757c73
commit 3580066a13
7 changed files with 328 additions and 58 deletions

76
web/dist/index.html vendored
View File

@@ -105,19 +105,19 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
</button>
<div class="wrap">
<div class="hero">
<h1>Gotest <span>模板导航</span></h1>
<p>6 大行业,19 套精心设计的网站模板,一键切换,即刻预览</p>
<h1><span id="s_hero_title">Gotest</span> <span id="s_hero_highlight">模板导航</span></h1>
<p id="s_hero_desc">6 大行业,19 套精心设计的网站模板,一键切换,即刻预览</p>
<div class="hero-pills">
<span class="pill"><b>19</b> 套模板</span>
<span class="pill"><b>6</b> 大行业</span>
<span class="pill"><b>3</b> 套 / 行业</span>
<span class="pill">响应式设计</span>
<span class="pill"><b id="s_pill_templates">19</b> 套模板</span>
<span class="pill"><b id="s_pill_lines">6</b> 大行业</span>
<span class="pill"><b id="s_pill_per_industry">3</b> 套 / 行业</span>
<span class="pill" id="s_pill_responsive">响应式设计</span>
</div>
</div>
<!-- 企业官网 -->
<div class="sec">
<div class="sec-head"><h2>企业官网</h2><span class="sub">3 套风格</span><div class="sec-line"></div></div>
<div class="sec-head"><h2 id="s_sec_enterprise_title">企业官网</h2><span class="sub" id="s_sec_enterprise_sub">3 套风格</span><div class="sec-line"></div></div>
<div class="grid">
<a class="item" href="/site1" target="_blank"><div class="item-banner g-enterprise"><div class="glow"></div><div class="pattern"></div><span class="item-tag">科技蓝</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">科技企业 · site1</div><div class="item-desc">现代科技公司风格,蓝色主调</div></div></a>
<a class="item" href="/site2" target="_blank"><div class="item-banner g-enterprise"><div class="glow" style="background:linear-gradient(135deg,#1c1917 0%,#b45309 40%,#fbbf24 100%)"></div><div class="pattern"></div><span class="item-tag">制造金</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">制造企业 · site2</div><div class="item-desc">工业制造风格,深色金调</div></div></a>
@@ -127,7 +127,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
<!-- 跨境电商 -->
<div class="sec">
<div class="sec-head"><h2>跨境电商</h2><span class="sub">4 套风格</span><div class="sec-line"></div></div>
<div class="sec-head"><h2 id="s_sec_shop_title">跨境电商</h2><span class="sub" id="s_sec_shop_sub">4 套风格</span><div class="sec-line"></div></div>
<div class="grid">
<a class="item" href="/shop" target="_blank"><div class="item-banner g-shop"><div class="glow"></div><div class="pattern"></div><span class="item-tag">红色经典</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">经典电商 · shop</div><div class="item-desc">经典电商红,大促风格</div></div></a>
<a class="item" href="/shop2" target="_blank"><div class="item-banner g-shop"><div class="glow" style="background:linear-gradient(135deg,#18181b 0%,#3f3f46 40%,#71717a 100%)"></div><div class="pattern"></div><span class="item-tag">暗黑模式</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">暗黑电商 · shop2</div><div class="item-desc">黑色高端,极简暗色</div></div></a>
@@ -138,7 +138,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
<!-- 外卖平台 -->
<div class="sec">
<div class="sec-head"><h2>外卖平台</h2><span class="sub">3 套风格</span><div class="sec-line"></div></div>
<div class="sec-head"><h2 id="s_sec_food_title">外卖平台</h2><span class="sub" id="s_sec_food_sub">3 套风格</span><div class="sec-line"></div></div>
<div class="grid">
<a class="item" href="/food1" target="_blank"><div class="item-banner g-food"><div class="glow"></div><div class="pattern"></div><span class="item-tag">橙黄活力</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">美味达 · food1</div><div class="item-desc">暖橙食欲风格,活力满满</div></div></a>
<a class="item" href="/food2" target="_blank"><div class="item-banner g-food"><div class="glow" style="background:linear-gradient(135deg,#18181b 0%,#44403c 40%,#78716c 100%)"></div><div class="pattern"></div><span class="item-tag">深色模式</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">GOURMET · food2</div><div class="item-desc">暗色高端外卖平台</div></div></a>
@@ -148,7 +148,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
<!-- 游戏平台 -->
<div class="sec">
<div class="sec-head"><h2>游戏平台</h2><span class="sub">3 套风格</span><div class="sec-line"></div></div>
<div class="sec-head"><h2 id="s_sec_game_title">游戏平台</h2><span class="sub" id="s_sec_game_sub">3 套风格</span><div class="sec-line"></div></div>
<div class="grid">
<a class="item" href="/game1" target="_blank"><div class="item-banner g-game"><div class="glow"></div><div class="pattern"></div><span class="item-tag">赛博朋克</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">NEON ARCADE · game1</div><div class="item-desc">霓虹未来,赛博朋克风格</div></div></a>
<a class="item" href="/game2" target="_blank"><div class="item-banner g-game"><div class="glow" style="background:linear-gradient(135deg,#052e16 0%,#16a34a 40%,#4ade80 100%)"></div><div class="pattern"></div><span class="item-tag">像素复古</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">PIXEL GAMES · game2</div><div class="item-desc">8-bit 像素复古游戏风</div></div></a>
@@ -158,7 +158,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
<!-- 应用商店 -->
<div class="sec">
<div class="sec-head"><h2>应用商店</h2><span class="sub">3 套风格</span><div class="sec-line"></div></div>
<div class="sec-head"><h2 id="s_sec_app_title">应用商店</h2><span class="sub" id="s_sec_app_sub">3 套风格</span><div class="sec-line"></div></div>
<div class="grid">
<a class="item" href="/app1" target="_blank"><div class="item-banner g-app"><div class="glow" style="background:linear-gradient(135deg,#f8fafc 0%,#e2e8f0 40%,#cbd5e1 100%)"></div><div class="pattern" style="opacity:.06"></div><span class="item-tag" style="background:rgba(0,0,0,.08);color:#1e293b;border-color:rgba(0,0,0,.08)">极简白</span><div class="item-go" style="color:#1e293b">→</div></div><div class="item-body"><div class="item-title">极简白 · app1</div><div class="item-desc">Apple 风格,简洁清爽</div></div></a>
<a class="item" href="/app2" target="_blank"><div class="item-banner g-app"><div class="glow" style="background:linear-gradient(135deg,#052e16 0%,#10b981 40%,#34d399 100%)"></div><div class="pattern"></div><span class="item-tag">暗黑模式</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">暗黑应用 · app2</div><div class="item-desc">霓虹绿暗色,科技感十足</div></div></a>
@@ -168,7 +168,7 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
<!-- 音乐平台 -->
<div class="sec">
<div class="sec-head"><h2>音乐平台</h2><span class="sub">3 套风格</span><div class="sec-line"></div></div>
<div class="sec-head"><h2 id="s_sec_music_title">音乐平台</h2><span class="sub" id="s_sec_music_sub">3 套风格</span><div class="sec-line"></div></div>
<div class="grid">
<a class="item" href="/music1" target="_blank"><div class="item-banner g-music"><div class="glow" style="background:linear-gradient(135deg,#1e1b4b 0%,#4f46e5 40%,#818cf8 100%)"></div><div class="pattern"></div><span class="item-tag">暗黑播放器</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">云音 Music · music1</div><div class="item-desc">暗夜沉浸式音乐播放器</div></div></a>
<a class="item" href="/music2" target="_blank"><div class="item-banner g-music"><div class="glow" style="background:linear-gradient(135deg,#451a03 0%,#92400e 40%,#d97706 100%)"></div><div class="pattern"></div><span class="item-tag">黑胶复古</span><div class="item-go">→</div></div><div class="item-body"><div class="item-title">Vinyl · music2</div><div class="item-desc">黑胶唱片复古风格</div></div></a>
@@ -187,8 +187,8 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
<!-- 客户咨询表单 -->
<div class="consult-section">
<div class="consult-header">
<h2>需要定制网站?</h2>
<p>只需几百块,即可拥有同款精美站点!留下您的信息,我们尽快联系您</p>
<h2 id="s_consult_title">需要定制网站?</h2>
<p id="s_consult_desc">只需几百块,即可拥有同款精美站点!留下您的信息,我们尽快联系您</p>
</div>
<form class="consult-form" id="consultForm">
<div class="form-row">
@@ -222,12 +222,13 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
</form>
<div class="consult-success" id="consultSuccess" style="display:none">
<div class="success-icon">✓</div>
<h3>提交成功!</h3>
<h3 id="s_consult_success">提交成功!</h3>
<p>我们会尽快联系您,请保持电话畅通</p>
</div>
</div>
<div class="foot">Gotest · 多行业网站模板集合 · 点击卡片进入对应模板</div>
<div class="foot" id="s_footer">Gotest · 多行业网站模板集合 · 点击卡片进入对应模板</div>
<div class="foot" id="s_company" style="margin-top:4px;font-size:11px;opacity:.6"></div>
</div>
<script>
@@ -242,6 +243,49 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
});
})();
// 加载后台配置,覆盖默认文案
(async function(){
try {
var resp = await fetch('/api/v1/nav-settings');
var result = await resp.json();
if (result.code !== 0 || !result.data) return;
var s = result.data;
var map = {
s_hero_title: 'nav_hero_title',
s_hero_highlight: 'nav_hero_highlight',
s_hero_desc: 'nav_hero_desc',
s_pill_templates: 'nav_pill_templates',
s_pill_lines: 'nav_pill_lines',
s_pill_per_industry: 'nav_pill_per_industry',
s_pill_responsive: 'nav_pill_responsive',
s_consult_title: 'nav_consult_title',
s_consult_desc: 'nav_consult_desc',
s_consult_success: 'nav_consult_success',
s_footer_text: 'nav_footer_text',
s_company_name: 'nav_company_name',
s_sec_enterprise_title: 'nav_sec_enterprise_title',
s_sec_enterprise_sub: 'nav_sec_enterprise_sub',
s_sec_shop_title: 'nav_sec_shop_title',
s_sec_shop_sub: 'nav_sec_shop_sub',
s_sec_food_title: 'nav_sec_food_title',
s_sec_food_sub: 'nav_sec_food_sub',
s_sec_game_title: 'nav_sec_game_title',
s_sec_game_sub: 'nav_sec_game_sub',
s_sec_app_title: 'nav_sec_app_title',
s_sec_app_sub: 'nav_sec_app_sub',
s_sec_music_title: 'nav_sec_music_title',
s_sec_music_sub: 'nav_sec_music_sub',
};
for (var elId in map) {
var val = s[map[elId]];
if (val) {
var el = document.getElementById(elId);
if (el) el.textContent = val;
}
}
} catch(e) {}
})();
document.getElementById('consultForm').addEventListener('submit', async function(e) {
e.preventDefault();