From f0e911b7ba8cdc9c120fbf6ae56e34f0207bac62 Mon Sep 17 00:00:00 2001 From: yiqiu Date: Wed, 18 Mar 2026 22:34:46 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BE=A7=E8=BE=B9=E6=B5=AE=E7=AA=97?= =?UTF-8?q?=E7=A7=BB=E5=88=B0=E5=AF=BC=E8=88=AA=E9=85=8D=E7=BD=AE=20tab?= =?UTF-8?q?=EF=BC=88index.html=20=E7=94=9F=E6=95=88=E7=89=88=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从其他配置移到导航配置 tab - 重写 renderSides/collectSides 为类型选择式 UI - 支持 QQ(多客服)/在线客服/群聊/公众号 4 种类型 - 新增 onSideTypeChange/addSideQQ/removeSideQQ 方法 --- .../template/admin/index.html | 145 ++++++++++++++---- 1 file changed, 116 insertions(+), 29 deletions(-) diff --git a/plugins/addon/theme_configurator/template/admin/index.html b/plugins/addon/theme_configurator/template/admin/index.html index fe4cfcf..5ce4ea0 100644 --- a/plugins/addon/theme_configurator/template/admin/index.html +++ b/plugins/addon/theme_configurator/template/admin/index.html @@ -233,6 +233,16 @@ +
+
+

侧边浮窗

+

配置前台右下角悬浮工具条(QQ客服/在线客服/群聊/公众号)

+
+
+
+ +
+
@@ -246,15 +256,7 @@ -
-
-

侧边浮窗

-
-
-
- -
-
+

反馈类型

@@ -578,7 +580,14 @@ renderFriendlyLinks(links); }; - // ========== 侧边浮窗 ========== + // ========== 侧边浮窗(类型选择式) ========== + const SIDE_TYPES = { + qq: 'QQ客服', + service: '在线客服', + group: '群聊', + wechat: '公众号' + }; + function renderSides(sides) { const container = document.getElementById('sideList'); if (!container) return; @@ -586,28 +595,71 @@ sides.forEach((side, index) => { const item = document.createElement('div'); item.className = 'config-item'; + const typeName = SIDE_TYPES[side.type] || '浮窗'; + + // 类型选择下拉框 + let typeOptions = Object.entries(SIDE_TYPES).map(([val, label]) => + `` + ).join(''); + + // 根据类型渲染不同表单 + let extraFields = ''; + if (side.type === 'qq') { + const items = Array.isArray(side.items) ? side.items : [{ qq: '', time: '' }]; + let qqFields = items.map((qq, qi) => ` +
+
+ 客服 ${qi + 1} + +
+
+
+ + +
+
+ + +
+
+
+ `).join(''); + extraFields = qqFields + ``; + } else if (side.type === 'service') { + extraFields = ` +
+ + +
`; + } else if (side.type === 'group' || side.type === 'wechat') { + extraFields = ` +
+ +
+ + +
+
`; + } + item.innerHTML = `
-

浮窗 ${index + 1}

+

${typeName} ${index + 1}

- - + +
- -
- - -
-
-
- - + +
+ ${extraFields}
`; @@ -616,19 +668,32 @@ } function collectSides() { + const container = document.getElementById('sideList'); + if (!container) return []; const sides = []; - document.querySelectorAll('[data-side]').forEach(input => { - const index = parseInt(input.dataset.side); - const field = input.dataset.field; - if (!sides[index]) sides[index] = {}; - sides[index][field] = input.value; + container.querySelectorAll(':scope > .config-item').forEach((itemEl, index) => { + const side = {}; + itemEl.querySelectorAll('[data-side][data-field]').forEach(input => { + side[input.dataset.field] = input.tagName === 'SELECT' ? input.value : input.value; + }); + // 收集 QQ 列表 + if (side.type === 'qq') { + const items = []; + itemEl.querySelectorAll('[data-qqfield]').forEach(input => { + const qi = parseInt(input.dataset.qq); + if (!items[qi]) items[qi] = {}; + items[qi][input.dataset.qqfield] = input.value; + }); + side.items = items.filter(i => i); + } + sides.push(side); }); - return sides.filter(s => s); + return sides; } window.addSide = function () { const sides = collectSides(); - sides.push({ name: '', icon: '', content: '' }); + sides.push({ type: 'qq', label: '', items: [{ qq: '', time: '' }], url: '', qrcode: '' }); renderSides(sides); }; @@ -638,6 +703,28 @@ renderSides(sides); }; + window.onSideTypeChange = function (index, newType) { + const sides = collectSides(); + sides[index].type = newType; + if (newType === 'qq' && !Array.isArray(sides[index].items)) { + sides[index].items = [{ qq: '', time: '' }]; + } + renderSides(sides); + }; + + window.addSideQQ = function (sideIndex) { + const sides = collectSides(); + if (!Array.isArray(sides[sideIndex].items)) sides[sideIndex].items = []; + sides[sideIndex].items.push({ qq: '', time: '' }); + renderSides(sides); + }; + + window.removeSideQQ = function (sideIndex, qqIndex) { + const sides = collectSides(); + sides[sideIndex].items.splice(qqIndex, 1); + renderSides(sides); + }; + // ========== 反馈类型 ========== function renderFeedbackTypes(types) { const container = document.getElementById('feedbackTypeList');