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:
@@ -43,7 +43,6 @@ func (h *ConfigHandler) SetConfig(c *gin.Context) {
|
|||||||
var config model.Config
|
var config model.Config
|
||||||
result := h.db.Where("`key` = ?", key).First(&config)
|
result := h.db.Where("`key` = ?", key).First(&config)
|
||||||
if result.Error == gorm.ErrRecordNotFound {
|
if result.Error == gorm.ErrRecordNotFound {
|
||||||
// 创建新配置
|
|
||||||
config = model.Config{
|
config = model.Config{
|
||||||
Key: key,
|
Key: key,
|
||||||
Value: req.Value,
|
Value: req.Value,
|
||||||
@@ -54,7 +53,6 @@ func (h *ConfigHandler) SetConfig(c *gin.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else if result.Error == nil {
|
} else if result.Error == nil {
|
||||||
// 更新已有配置
|
|
||||||
config.Value = req.Value
|
config.Value = req.Value
|
||||||
if req.Remark != "" {
|
if req.Remark != "" {
|
||||||
config.Remark = req.Remark
|
config.Remark = req.Remark
|
||||||
@@ -80,3 +78,86 @@ func (h *ConfigHandler) ListConfigs(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
Success(c, configs)
|
Success(c, configs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BatchSetConfigs 批量设置配置 PUT /api/v1/admin/config
|
||||||
|
func (h *ConfigHandler) BatchSetConfigs(c *gin.Context) {
|
||||||
|
var req struct {
|
||||||
|
Items []ConfigItem `json:"items"`
|
||||||
|
}
|
||||||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||||||
|
FailBadRequest(c, "参数错误")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, item := range req.Items {
|
||||||
|
var config model.Config
|
||||||
|
result := h.db.Where("`key` = ?", item.Key).First(&config)
|
||||||
|
if result.Error == gorm.ErrRecordNotFound {
|
||||||
|
config = model.Config{
|
||||||
|
Key: item.Key,
|
||||||
|
Value: item.Value,
|
||||||
|
Remark: item.Remark,
|
||||||
|
}
|
||||||
|
h.db.Create(&config)
|
||||||
|
} else if result.Error == nil {
|
||||||
|
config.Value = item.Value
|
||||||
|
if item.Remark != "" {
|
||||||
|
config.Remark = item.Remark
|
||||||
|
}
|
||||||
|
h.db.Save(&config)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SuccessMsg(c, "保存成功")
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetNavSettings 公开接口:获取导航页所有配置 GET /api/v1/nav-settings
|
||||||
|
func (h *ConfigHandler) GetNavSettings(c *gin.Context) {
|
||||||
|
// 导航页所有可配置项的 key 列表
|
||||||
|
keys := []string{
|
||||||
|
"nav_site_title",
|
||||||
|
"nav_hero_title",
|
||||||
|
"nav_hero_highlight",
|
||||||
|
"nav_hero_desc",
|
||||||
|
"nav_pill_templates",
|
||||||
|
"nav_pill_lines",
|
||||||
|
"nav_pill_industries",
|
||||||
|
"nav_pill_per_industry",
|
||||||
|
"nav_pill_responsive",
|
||||||
|
"nav_consult_title",
|
||||||
|
"nav_consult_desc",
|
||||||
|
"nav_consult_success",
|
||||||
|
"nav_footer_text",
|
||||||
|
"nav_company_name",
|
||||||
|
// 6 大行业标题
|
||||||
|
"nav_sec_enterprise_title",
|
||||||
|
"nav_sec_enterprise_sub",
|
||||||
|
"nav_sec_shop_title",
|
||||||
|
"nav_sec_shop_sub",
|
||||||
|
"nav_sec_food_title",
|
||||||
|
"nav_sec_food_sub",
|
||||||
|
"nav_sec_game_title",
|
||||||
|
"nav_sec_game_sub",
|
||||||
|
"nav_sec_app_title",
|
||||||
|
"nav_sec_app_sub",
|
||||||
|
"nav_sec_music_title",
|
||||||
|
"nav_sec_music_sub",
|
||||||
|
}
|
||||||
|
|
||||||
|
settings := map[string]string{}
|
||||||
|
for _, key := range keys {
|
||||||
|
var config model.Config
|
||||||
|
if err := h.db.Where("`key` = ?", key).First(&config).Error; err == nil {
|
||||||
|
settings[key] = config.Value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Success(c, settings)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ConfigItem 配置项
|
||||||
|
type ConfigItem struct {
|
||||||
|
Key string `json:"key"`
|
||||||
|
Value string `json:"value"`
|
||||||
|
Remark string `json:"remark"`
|
||||||
|
}
|
||||||
|
|||||||
@@ -8,19 +8,20 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gotest/internal/config"
|
"gotest/internal/model"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
|
"gorm.io/gorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CustomerHandler 客户信息收集处理器
|
// CustomerHandler 客户信息收集处理器
|
||||||
type CustomerHandler struct {
|
type CustomerHandler struct {
|
||||||
cfg *config.Config
|
db *gorm.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewCustomerHandler 创建客户信息收集处理器
|
// NewCustomerHandler 创建客户信息收集处理器
|
||||||
func NewCustomerHandler(cfg *config.Config) *CustomerHandler {
|
func NewCustomerHandler(db *gorm.DB) *CustomerHandler {
|
||||||
return &CustomerHandler{cfg: cfg}
|
return &CustomerHandler{db: db}
|
||||||
}
|
}
|
||||||
|
|
||||||
// CustomerRequest 客户信息请求
|
// CustomerRequest 客户信息请求
|
||||||
@@ -54,7 +55,6 @@ func (h *CustomerHandler) Submit(c *gin.Context) {
|
|||||||
|
|
||||||
// 发送到企业微信webhook
|
// 发送到企业微信webhook
|
||||||
if err := h.sendToWechatWebhook(content); err != nil {
|
if err := h.sendToWechatWebhook(content); err != nil {
|
||||||
// 即使webhook失败,也记录下来并返回成功(避免暴露内部错误)
|
|
||||||
fmt.Printf("发送企业微信webhook失败: %v\n", err)
|
fmt.Printf("发送企业微信webhook失败: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,13 +63,19 @@ func (h *CustomerHandler) Submit(c *gin.Context) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getWebhookURL 从数据库获取webhook URL
|
||||||
|
func (h *CustomerHandler) getWebhookURL() string {
|
||||||
|
var cfg model.Config
|
||||||
|
if err := h.db.Where("`key` = ?", "wechat_webhook_url").First(&cfg).Error; err == nil && cfg.Value != "" {
|
||||||
|
return cfg.Value
|
||||||
|
}
|
||||||
|
return "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=71110fd5-9f51-4695-88dc-85ca34385d66"
|
||||||
|
}
|
||||||
|
|
||||||
// sendToWechatWebhook 发送消息到企业微信群机器人
|
// sendToWechatWebhook 发送消息到企业微信群机器人
|
||||||
func (h *CustomerHandler) sendToWechatWebhook(content string) error {
|
func (h *CustomerHandler) sendToWechatWebhook(content string) error {
|
||||||
if h.cfg.WechatWebhook.URL == "" {
|
webhookURL := h.getWebhookURL()
|
||||||
return fmt.Errorf("企业微信webhook URL未配置")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 构建消息体
|
|
||||||
message := map[string]interface{}{
|
message := map[string]interface{}{
|
||||||
"msgtype": "text",
|
"msgtype": "text",
|
||||||
"text": map[string]string{
|
"text": map[string]string{
|
||||||
@@ -82,31 +88,26 @@ func (h *CustomerHandler) sendToWechatWebhook(content string) error {
|
|||||||
return fmt.Errorf("序列化消息失败: %w", err)
|
return fmt.Errorf("序列化消息失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送POST请求
|
resp, err := http.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))
|
||||||
resp, err := http.Post(h.cfg.WechatWebhook.URL, "application/json", bytes.NewBuffer(jsonData))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("发送请求失败: %w", err)
|
return fmt.Errorf("发送请求失败: %w", err)
|
||||||
}
|
}
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
// 读取响应
|
|
||||||
body, err := io.ReadAll(resp.Body)
|
body, err := io.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("读取响应失败: %w", err)
|
return fmt.Errorf("读取响应失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查响应状态
|
|
||||||
if resp.StatusCode != http.StatusOK {
|
if resp.StatusCode != http.StatusOK {
|
||||||
return fmt.Errorf("请求失败,状态码: %d,响应: %s", resp.StatusCode, string(body))
|
return fmt.Errorf("请求失败,状态码: %d,响应: %s", resp.StatusCode, string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 解析响应JSON
|
|
||||||
var result map[string]interface{}
|
var result map[string]interface{}
|
||||||
if err := json.Unmarshal(body, &result); err != nil {
|
if err := json.Unmarshal(body, &result); err != nil {
|
||||||
return fmt.Errorf("解析响应失败: %w", err)
|
return fmt.Errorf("解析响应失败: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检查企业微信返回的错误码
|
|
||||||
if errcode, ok := result["errcode"].(float64); ok && errcode != 0 {
|
if errcode, ok := result["errcode"].(float64); ok && errcode != 0 {
|
||||||
errmsg, _ := result["errmsg"].(string)
|
errmsg, _ := result["errmsg"].(string)
|
||||||
return fmt.Errorf("企业微信返回错误: %v - %s", errcode, errmsg)
|
return fmt.Errorf("企业微信返回错误: %v - %s", errcode, errmsg)
|
||||||
@@ -114,3 +115,43 @@ func (h *CustomerHandler) sendToWechatWebhook(content string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TestWebhook 测试webhook POST /api/v1/admin/webhook/test
|
||||||
|
func (h *CustomerHandler) TestWebhook(c *gin.Context) {
|
||||||
|
webhookURL := h.getWebhookURL()
|
||||||
|
|
||||||
|
content := fmt.Sprintf("✅ Webhook 测试成功\n⏰ 时间:%s", time.Now().Format("2006-01-02 15:04:05"))
|
||||||
|
|
||||||
|
message := map[string]interface{}{
|
||||||
|
"msgtype": "text",
|
||||||
|
"text": map[string]string{
|
||||||
|
"content": content,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
jsonData, err := json.Marshal(message)
|
||||||
|
if err != nil {
|
||||||
|
FailInternal(c, "序列化失败: "+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
resp, err := http.Post(webhookURL, "application/json", bytes.NewBuffer(jsonData))
|
||||||
|
if err != nil {
|
||||||
|
FailInternal(c, "发送失败: "+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
body, _ := io.ReadAll(resp.Body)
|
||||||
|
|
||||||
|
var result map[string]interface{}
|
||||||
|
json.Unmarshal(body, &result)
|
||||||
|
|
||||||
|
if errcode, ok := result["errcode"].(float64); ok && errcode != 0 {
|
||||||
|
errmsg, _ := result["errmsg"].(string)
|
||||||
|
FailInternal(c, fmt.Sprintf("企业微信返回错误: %v - %s", errcode, errmsg))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
SuccessMsg(c, "测试消息发送成功!请检查企业微信群")
|
||||||
|
}
|
||||||
|
|||||||
@@ -162,6 +162,9 @@ func Setup(
|
|||||||
customer.POST("/submit", customerH.Submit)
|
customer.POST("/submit", customerH.Submit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 导航页设置(公开,无需认证)
|
||||||
|
api.GET("/nav-settings", configH.GetNavSettings)
|
||||||
|
|
||||||
// 需要登录的路由
|
// 需要登录的路由
|
||||||
authed := api.Group("")
|
authed := api.Group("")
|
||||||
authed.Use(middleware.JWTAuth(cfg.JWT.Secret))
|
authed.Use(middleware.JWTAuth(cfg.JWT.Secret))
|
||||||
@@ -205,6 +208,10 @@ func Setup(
|
|||||||
admin.GET("/config", configH.ListConfigs)
|
admin.GET("/config", configH.ListConfigs)
|
||||||
admin.GET("/config/:key", configH.GetConfig)
|
admin.GET("/config/:key", configH.GetConfig)
|
||||||
admin.PUT("/config/:key", configH.SetConfig)
|
admin.PUT("/config/:key", configH.SetConfig)
|
||||||
|
admin.PUT("/config-batch", configH.BatchSetConfigs)
|
||||||
|
|
||||||
|
// Webhook 测试
|
||||||
|
admin.POST("/webhook/test", customerH.TestWebhook)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
2
main.go
2
main.go
@@ -89,7 +89,7 @@ func main() {
|
|||||||
appHandler := handler.NewAppHandler(appService)
|
appHandler := handler.NewAppHandler(appService)
|
||||||
musicHandler := handler.NewMusicHandler(musicService)
|
musicHandler := handler.NewMusicHandler(musicService)
|
||||||
dashboardHandler := handler.NewDashboardHandler(db.DB)
|
dashboardHandler := handler.NewDashboardHandler(db.DB)
|
||||||
customerHandler := handler.NewCustomerHandler(cfg)
|
customerHandler := handler.NewCustomerHandler(db.DB)
|
||||||
accessLogHandler := handler.NewAccessLogHandler(db.DB)
|
accessLogHandler := handler.NewAccessLogHandler(db.DB)
|
||||||
configHandler := handler.NewConfigHandler(db.DB)
|
configHandler := handler.NewConfigHandler(db.DB)
|
||||||
|
|
||||||
|
|||||||
143
web/dist/admin/index.html
vendored
143
web/dist/admin/index.html
vendored
@@ -273,6 +273,9 @@ tbody tr:last-child td{border-bottom:none}
|
|||||||
<a class="sidebar-link" onclick="navigate('webhook')" data-page="webhook">
|
<a class="sidebar-link" onclick="navigate('webhook')" data-page="webhook">
|
||||||
<span class="icon">🔔</span> Webhook配置
|
<span class="icon">🔔</span> Webhook配置
|
||||||
</a>
|
</a>
|
||||||
|
<a class="sidebar-link" onclick="navigate('navsettings')" data-page="navsettings">
|
||||||
|
<span class="icon">📝</span> 导航页设置
|
||||||
|
</a>
|
||||||
<a class="sidebar-link" onclick="navigate('settings')" data-page="settings">
|
<a class="sidebar-link" onclick="navigate('settings')" data-page="settings">
|
||||||
<span class="icon">⚙️</span> 系统设置
|
<span class="icon">⚙️</span> 系统设置
|
||||||
</a>
|
</a>
|
||||||
@@ -455,7 +458,7 @@ function navigate(page, params = {}) {
|
|||||||
document.querySelectorAll('.sidebar-link').forEach(el => el.classList.remove('active'));
|
document.querySelectorAll('.sidebar-link').forEach(el => el.classList.remove('active'));
|
||||||
const link = document.querySelector(`[data-page="${page}"]`);
|
const link = document.querySelector(`[data-page="${page}"]`);
|
||||||
if (link) link.classList.add('active');
|
if (link) link.classList.add('active');
|
||||||
const titles = { users: '用户管理', content: '内容管理', settings: '系统设置', sites: '站点导航', accesslog: '访问日志', webhook: 'Webhook配置' };
|
const titles = { users: '用户管理', content: '内容管理', settings: '系统设置', sites: '站点导航', accesslog: '访问日志', webhook: 'Webhook配置', navsettings: '导航页设置' };
|
||||||
document.getElementById('pageTitle').textContent = titles[page] || page;
|
document.getElementById('pageTitle').textContent = titles[page] || page;
|
||||||
if (page === 'users') renderUsers();
|
if (page === 'users') renderUsers();
|
||||||
else if (page === 'content') renderContent(params.table);
|
else if (page === 'content') renderContent(params.table);
|
||||||
@@ -463,6 +466,7 @@ function navigate(page, params = {}) {
|
|||||||
else if (page === 'sites') renderSites();
|
else if (page === 'sites') renderSites();
|
||||||
else if (page === 'accesslog') renderAccessLogs();
|
else if (page === 'accesslog') renderAccessLogs();
|
||||||
else if (page === 'webhook') renderWebhook();
|
else if (page === 'webhook') renderWebhook();
|
||||||
|
else if (page === 'navsettings') renderNavSettings();
|
||||||
if (window.innerWidth <= 768) document.getElementById('sidebar').classList.remove('open');
|
if (window.innerWidth <= 768) document.getElementById('sidebar').classList.remove('open');
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1258,33 +1262,126 @@ async function testWebhook() {
|
|||||||
resultEl.style.display = 'block';
|
resultEl.style.display = 'block';
|
||||||
resultEl.innerHTML = '<div style="color:var(--text-muted)">发送中...</div>';
|
resultEl.innerHTML = '<div style="color:var(--text-muted)">发送中...</div>';
|
||||||
try {
|
try {
|
||||||
await api('/admin/config/wechat_webhook_url', {
|
await api('/admin/webhook/test', { method: 'POST' });
|
||||||
method: 'PUT',
|
|
||||||
body: JSON.stringify({ value: document.getElementById('webhookUrl').value.trim(), remark: '企业微信群机器人Webhook地址' })
|
|
||||||
});
|
|
||||||
// 通过客户咨询接口发送测试消息
|
|
||||||
const resp = await fetch(API_BASE + '/customer/submit', {
|
|
||||||
method: 'POST',
|
|
||||||
headers: { 'Content-Type': 'application/json' },
|
|
||||||
body: JSON.stringify({
|
|
||||||
name: '测试用户',
|
|
||||||
phone: '13800000000',
|
|
||||||
company: '测试公司',
|
|
||||||
email: 'test@example.com',
|
|
||||||
needs: '这是一条测试消息,用于验证 Webhook 配置是否正确'
|
|
||||||
})
|
|
||||||
});
|
|
||||||
const data = await resp.json();
|
|
||||||
if (data.code === 0) {
|
|
||||||
resultEl.innerHTML = '<div style="color:var(--success);font-weight:600">✅ 测试消息已发送,请检查企业微信群</div>';
|
resultEl.innerHTML = '<div style="color:var(--success);font-weight:600">✅ 测试消息已发送,请检查企业微信群</div>';
|
||||||
} else {
|
|
||||||
resultEl.innerHTML = `<div style="color:var(--danger)">❌ 发送失败: ${data.message}</div>`;
|
|
||||||
}
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
resultEl.innerHTML = '<div style="color:var(--danger)">❌ 网络错误</div>';
|
resultEl.innerHTML = `<div style="color:var(--danger)">❌ ${e.message || '发送失败'}</div>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ===== 导航页设置 =====
|
||||||
|
async function renderNavSettings() {
|
||||||
|
const el = document.getElementById('content');
|
||||||
|
el.innerHTML = '<div class="loading"><div class="spinner"></div></div>';
|
||||||
|
try {
|
||||||
|
const data = await api('/admin/config');
|
||||||
|
const configs = {};
|
||||||
|
(data.data || []).forEach(c => { configs[c.key] = c.value; });
|
||||||
|
el.innerHTML = `
|
||||||
|
<div class="table-card">
|
||||||
|
<div class="section-header" style="padding:16px"><h4>📝 导航页文案设置</h4></div>
|
||||||
|
<div style="padding:24px;max-width:800px">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>页面标题 (左侧)</label>
|
||||||
|
<input type="text" id="ns_hero_title" value="${configs.nav_hero_title||''}" placeholder="Gotest">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>页面标题 (右侧渐变)</label>
|
||||||
|
<input type="text" id="ns_hero_highlight" value="${configs.nav_hero_highlight||''}" placeholder="模板导航">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>副标题描述</label>
|
||||||
|
<input type="text" id="ns_hero_desc" value="${configs.nav_hero_desc||''}" placeholder="6 大行业,19 套精心设计的网站模板,一键切换,即刻预览">
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>标签 - 模板数</label>
|
||||||
|
<input type="text" id="ns_pill_templates" value="${configs.nav_pill_templates||''}" placeholder="19">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>标签 - 行业数</label>
|
||||||
|
<input type="text" id="ns_pill_lines" value="${configs.nav_pill_lines||''}" placeholder="6">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>标签 - 每行业模板数</label>
|
||||||
|
<input type="text" id="ns_pill_per_industry" value="${configs.nav_pill_per_industry||''}" placeholder="3">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>标签 - 第四项</label>
|
||||||
|
<input type="text" id="ns_pill_responsive" value="${configs.nav_pill_responsive||''}" placeholder="响应式设计">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="table-card" style="margin-top:16px">
|
||||||
|
<div class="section-header" style="padding:16px"><h4>📂 分类标题</h4></div>
|
||||||
|
<div style="padding:24px;max-width:800px">
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group"><label>企业官网 - 标题</label><input type="text" id="ns_sec_enterprise_title" value="${configs.nav_sec_enterprise_title||''}" placeholder="企业官网"></div>
|
||||||
|
<div class="form-group"><label>企业官网 - 副标题</label><input type="text" id="ns_sec_enterprise_sub" value="${configs.nav_sec_enterprise_sub||''}" placeholder="3 套风格"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group"><label>跨境电商 - 标题</label><input type="text" id="ns_sec_shop_title" value="${configs.nav_sec_shop_title||''}" placeholder="跨境电商"></div>
|
||||||
|
<div class="form-group"><label>跨境电商 - 副标题</label><input type="text" id="ns_sec_shop_sub" value="${configs.nav_sec_shop_sub||''}" placeholder="4 套风格"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group"><label>外卖平台 - 标题</label><input type="text" id="ns_sec_food_title" value="${configs.nav_sec_food_title||''}" placeholder="外卖平台"></div>
|
||||||
|
<div class="form-group"><label>外卖平台 - 副标题</label><input type="text" id="ns_sec_food_sub" value="${configs.nav_sec_food_sub||''}" placeholder="3 套风格"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group"><label>游戏平台 - 标题</label><input type="text" id="ns_sec_game_title" value="${configs.nav_sec_game_title||''}" placeholder="游戏平台"></div>
|
||||||
|
<div class="form-group"><label>游戏平台 - 副标题</label><input type="text" id="ns_sec_game_sub" value="${configs.nav_sec_game_sub||''}" placeholder="3 套风格"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group"><label>应用商店 - 标题</label><input type="text" id="ns_sec_app_title" value="${configs.nav_sec_app_title||''}" placeholder="应用商店"></div>
|
||||||
|
<div class="form-group"><label>应用商店 - 副标题</label><input type="text" id="ns_sec_app_sub" value="${configs.nav_sec_app_sub||''}" placeholder="3 套风格"></div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group"><label>音乐平台 - 标题</label><input type="text" id="ns_sec_music_title" value="${configs.nav_sec_music_title||''}" placeholder="音乐平台"></div>
|
||||||
|
<div class="form-group"><label>音乐平台 - 副标题</label><input type="text" id="ns_sec_music_sub" value="${configs.nav_sec_music_sub||''}" placeholder="3 套风格"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="table-card" style="margin-top:16px">
|
||||||
|
<div class="section-header" style="padding:16px"><h4>💬 咨询区 & 页脚</h4></div>
|
||||||
|
<div style="padding:24px;max-width:800px">
|
||||||
|
<div class="form-group"><label>咨询区 - 标题</label><input type="text" id="ns_consult_title" value="${configs.nav_consult_title||''}" placeholder="需要定制网站?"></div>
|
||||||
|
<div class="form-group"><label>咨询区 - 描述</label><input type="text" id="ns_consult_desc" value="${configs.nav_consult_desc||''}" placeholder="只需几百块,即可拥有同款精美站点!留下您的信息,我们尽快联系您"></div>
|
||||||
|
<div class="form-group"><label>提交成功文案</label><input type="text" id="ns_consult_success" value="${configs.nav_consult_success||''}" placeholder="提交成功!"></div>
|
||||||
|
<div class="form-group"><label>页脚文案</label><input type="text" id="ns_footer_text" value="${configs.nav_footer_text||''}" placeholder="Gotest · 多行业网站模板集合 · 点击卡片进入对应模板"></div>
|
||||||
|
<div class="form-group"><label>工作室/公司名称</label><input type="text" id="ns_company_name" value="${configs.nav_company_name||''}" placeholder="焉耆青梧映星软件开发工作室"></div>
|
||||||
|
<div style="margin-top:20px">
|
||||||
|
<button class="btn btn-primary" onclick="saveNavSettings()">保存所有设置</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
} catch (e) { el.innerHTML = '<div class="loading">加载失败</div>'; }
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveNavSettings() {
|
||||||
|
const fields = [
|
||||||
|
'hero_title','hero_highlight','hero_desc','pill_templates','pill_lines','pill_per_industry','pill_responsive',
|
||||||
|
'sec_enterprise_title','sec_enterprise_sub','sec_shop_title','sec_shop_sub',
|
||||||
|
'sec_food_title','sec_food_sub','sec_game_title','sec_game_sub',
|
||||||
|
'sec_app_title','sec_app_sub','sec_music_title','sec_music_sub',
|
||||||
|
'consult_title','consult_desc','consult_success','footer_text','company_name'
|
||||||
|
];
|
||||||
|
const items = fields.map(f => ({
|
||||||
|
key: 'nav_' + f,
|
||||||
|
value: (document.getElementById('ns_' + f)?.value || '').trim(),
|
||||||
|
remark: '导航页配置'
|
||||||
|
}));
|
||||||
|
try {
|
||||||
|
await api('/admin/config-batch', {
|
||||||
|
method: 'PUT',
|
||||||
|
body: JSON.stringify({ items })
|
||||||
|
});
|
||||||
|
toast('保存成功!刷新导航页即可看到效果', 'success');
|
||||||
|
} catch (e) { toast('保存失败', 'error'); }
|
||||||
|
}
|
||||||
|
|
||||||
// ===== 通用工具 =====
|
// ===== 通用工具 =====
|
||||||
function formatDate(d) {
|
function formatDate(d) {
|
||||||
if (!d) return '-';
|
if (!d) return '-';
|
||||||
|
|||||||
76
web/dist/index.html
vendored
76
web/dist/index.html
vendored
@@ -105,19 +105,19 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
|
|||||||
</button>
|
</button>
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="hero">
|
<div class="hero">
|
||||||
<h1>Gotest <span>模板导航</span></h1>
|
<h1><span id="s_hero_title">Gotest</span> <span id="s_hero_highlight">模板导航</span></h1>
|
||||||
<p>6 大行业,19 套精心设计的网站模板,一键切换,即刻预览</p>
|
<p id="s_hero_desc">6 大行业,19 套精心设计的网站模板,一键切换,即刻预览</p>
|
||||||
<div class="hero-pills">
|
<div class="hero-pills">
|
||||||
<span class="pill"><b>19</b> 套模板</span>
|
<span class="pill"><b id="s_pill_templates">19</b> 套模板</span>
|
||||||
<span class="pill"><b>6</b> 大行业</span>
|
<span class="pill"><b id="s_pill_lines">6</b> 大行业</span>
|
||||||
<span class="pill"><b>3</b> 套 / 行业</span>
|
<span class="pill"><b id="s_pill_per_industry">3</b> 套 / 行业</span>
|
||||||
<span class="pill">响应式设计</span>
|
<span class="pill" id="s_pill_responsive">响应式设计</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 企业官网 -->
|
<!-- 企业官网 -->
|
||||||
<div class="sec">
|
<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">
|
<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="/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>
|
<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">
|
||||||
<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">
|
<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="/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>
|
<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">
|
||||||
<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">
|
<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="/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>
|
<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">
|
||||||
<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">
|
<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="/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>
|
<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">
|
||||||
<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">
|
<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="/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>
|
<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">
|
||||||
<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">
|
<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="/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>
|
<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-section">
|
||||||
<div class="consult-header">
|
<div class="consult-header">
|
||||||
<h2>需要定制网站?</h2>
|
<h2 id="s_consult_title">需要定制网站?</h2>
|
||||||
<p>只需几百块,即可拥有同款精美站点!留下您的信息,我们尽快联系您</p>
|
<p id="s_consult_desc">只需几百块,即可拥有同款精美站点!留下您的信息,我们尽快联系您</p>
|
||||||
</div>
|
</div>
|
||||||
<form class="consult-form" id="consultForm">
|
<form class="consult-form" id="consultForm">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -222,12 +222,13 @@ body{font-family:-apple-system,BlinkMacSystemFont,'SF Pro Display','Segoe UI',Ro
|
|||||||
</form>
|
</form>
|
||||||
<div class="consult-success" id="consultSuccess" style="display:none">
|
<div class="consult-success" id="consultSuccess" style="display:none">
|
||||||
<div class="success-icon">✓</div>
|
<div class="success-icon">✓</div>
|
||||||
<h3>提交成功!</h3>
|
<h3 id="s_consult_success">提交成功!</h3>
|
||||||
<p>我们会尽快联系您,请保持电话畅通</p>
|
<p>我们会尽快联系您,请保持电话畅通</p>
|
||||||
</div>
|
</div>
|
||||||
</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>
|
</div>
|
||||||
|
|
||||||
<script>
|
<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) {
|
document.getElementById('consultForm').addEventListener('submit', async function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user