diff --git a/common/common.js b/common/common.js index 8a5fdce..11d3a30 100644 --- a/common/common.js +++ b/common/common.js @@ -105,21 +105,33 @@ $(function () { $(".login-in").attr("style", "display:none"); $(".no-login").attr("style", "display:block"); } - }; - // 获取通用配置信息 - const getCommentInfo = () => { - $.ajax({ - url: "/console/v1/common", - method: "get", - headers: { - Authorization: "Bearer" + " " + localStorage.jwt, - }, - success: function (res) { - sessionStorage.commentData = JSON.stringify(res.data); - setCommData(); - }, - }); - }; + }; + // 获取通用配置信息 + const getCommentInfo = () => { + const handleSuccess = function (res) { + sessionStorage.commentData = JSON.stringify(res.data); + setCommData(); + }; + $.ajax({ + url: "/console/v1/theme/config", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + error: function () { + // 若插件接口不存在或报错,回落到原有 /console/v1/common + $.ajax({ + url: "/console/v1/common", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + }); + }, + }); + }; // 设置通用信息函数 const setCommData = () => { const commentObj = JSON.parse(sessionStorage.commentData); diff --git a/js/about.js b/js/about.js index d39d417..61a2a02 100644 --- a/js/about.js +++ b/js/about.js @@ -22,15 +22,26 @@ $(function () { // 获取通用配置信息 function getCommentInfo() { + const handleSuccess = function (res) { + sessionStorage.commentData = JSON.stringify(res.data); + setIndexData(); + }; $.ajax({ - url: "/console/v1/common", + url: "/console/v1/theme/config", method: "get", headers: { Authorization: "Bearer" + " " + localStorage.jwt, }, - success: function (res) { - sessionStorage.commentData = JSON.stringify(res.data); - setIndexData(); + success: handleSuccess, + error: function () { + $.ajax({ + url: "/console/v1/common", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + }); }, }); } diff --git a/js/feedback.js b/js/feedback.js index fa7be54..1d49553 100644 --- a/js/feedback.js +++ b/js/feedback.js @@ -56,28 +56,39 @@ $(function () { } // 表单元素必填验证函数 - function validateRequired(input) { - if (input.val().trim() === "") { - input.attr("style", "border: 1px solid #FF6739;"); - input.focus(); - return false; + function validateRequired(input) { + if (input.val().trim() === "") { + input.attr("style", "border: 1px solid #FF6739;"); + input.focus(); + return false; } - input.attr("style", "border: 1px solid #E6EAED;"); - return true; - } - // 获取通用配置信息 - function getCommentInfo() { - $.ajax({ - url: "/console/v1/common", - method: "get", - headers: { - Authorization: "Bearer" + " " + localStorage.jwt, - }, - success: function (res) { - sessionStorage.commentData = JSON.stringify(res.data); - setIndexData(); - }, - }); - } - getCommentInfo(); -}); + input.attr("style", "border: 1px solid #E6EAED;"); + return true; + } + // 获取通用配置信息 + function getCommentInfo() { + const handleSuccess = function (res) { + sessionStorage.commentData = JSON.stringify(res.data); + setIndexData(); + }; + $.ajax({ + url: "/console/v1/theme/config", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + error: function () { + $.ajax({ + url: "/console/v1/common", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + }); + }, + }); + } + getCommentInfo(); +}); diff --git a/js/index.js b/js/index.js index 983ba79..a099d04 100644 --- a/js/index.js +++ b/js/index.js @@ -127,21 +127,33 @@ $(function () { `); }); } - } - // 获取通用配置信息 - function getCommentInfo() { - $.ajax({ - url: "/console/v1/common", - method: "get", - headers: { - Authorization: "Bearer" + " " + localStorage.jwt, - }, - success: function (res) { - sessionStorage.commentData = JSON.stringify(res.data); - setIndexData(); - }, - }); - } + } + // 获取通用配置信息 + function getCommentInfo() { + const handleSuccess = function (res) { + sessionStorage.commentData = JSON.stringify(res.data); + setIndexData(); + }; + $.ajax({ + url: "/console/v1/theme/config", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + error: function () { + // 插件未启用时回落到原有 /console/v1/common + $.ajax({ + url: "/console/v1/common", + method: "get", + headers: { + Authorization: "Bearer" + " " + localStorage.jwt, + }, + success: handleSuccess, + }); + }, + }); + } // 获取首页数据 getCommentInfo(); var viewer = new Viewer(document.getElementById("viewer"), { diff --git a/plugins/addon/theme_configurator/README.md b/plugins/addon/theme_configurator/README.md index 7634860..4b52f0a 100644 --- a/plugins/addon/theme_configurator/README.md +++ b/plugins/addon/theme_configurator/README.md @@ -1,11 +1,18 @@ # Theme Configurator 插件 -此插件演示如何通过后台插件的方式为 BlackFruit-UI 主题提供可配置能力,支持设置导航、页脚、站点信息、SEO、首页轮播以及右侧浮窗,并提供 `/console/v1/theme/config` 接口与前端联动。 +此插件演示如何通过后台插件的方式为 BlackFruit-UI 主题提供可配置能力,支持设置导航、页脚、站点信息、SEO、首页轮播、友情链接、荣誉/合作伙伴、反馈类型以及右侧浮窗,并提供 `/console/v1/theme/config` 接口与前端联动。 ## 功能 -- 后台界面(`template/admin/index.html`)以 JSON 的形式集中维护所有主题参数; +- 后台界面(`template/admin/index.html`)通过表单 + JSON 的方式维护主题参数: + - SEO、站点基础信息(企业名称、电话、备案、协议链接、产品链接等); + - 首页轮播 Banner; + - 友情链接(friendly_link); + - 企业荣誉(honor)、合作伙伴/成功案例(partner); + - 反馈类型(feedback_type); + - 右侧浮窗(side / side_floating_window); + - 复杂导航结构(header_nav/footer_nav)可在“高级配置 (JSON)”中维护。 - 接口 `GET/POST /{DIR_ADMIN}/v1/theme/config` 提供配置读取与保存; -- 前台接口 `GET /console/v1/theme/config` 输出与 `/console/v1/common` 相同结构的数据,BlackFruit-UI 可以直接接入; +- 前台接口 `GET /console/v1/theme/config` 输出与 `/console/v1/common` 同结构的数据,BlackFruit-UI 可以直接接入; - 插件安装时创建 `addon_theme_configurator` 表并写入默认配置。 ## 目录 diff --git a/plugins/addon/theme_configurator/controller/ThemeController.php b/plugins/addon/theme_configurator/controller/ThemeController.php index 8c9f4c1..155e3b2 100644 --- a/plugins/addon/theme_configurator/controller/ThemeController.php +++ b/plugins/addon/theme_configurator/controller/ThemeController.php @@ -45,6 +45,10 @@ class ThemeController extends PluginAdminBaseController 'friendly_link' => $param['friendly_link'] ?? [], 'banner' => $param['banner'] ?? [], 'side' => $param['side'] ?? [], + // 额外配置:荣誉、合作伙伴、反馈类型 + 'feedback_type' => $param['feedback_type'] ?? [], + 'honor' => $param['honor'] ?? [], + 'partner' => $param['partner'] ?? [], ]; $config = $this->model->saveConfig($payload); diff --git a/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php b/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php index fe97856..4571b49 100644 --- a/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php +++ b/plugins/addon/theme_configurator/controller/clientarea/ThemeController.php @@ -42,14 +42,15 @@ class ThemeController extends PluginBaseController 'terms_privacy_url' => $config['site_config']['terms_privacy_url'] ?? '', 'cloud_product_link' => $config['site_config']['cloud_product_link'] ?? '', 'dcim_product_link' => $config['site_config']['dcim_product_link'] ?? '', - 'honor' => $config['site_config']['honor'] ?? [], - 'partner' => $config['site_config']['partner'] ?? [], + // 以下字段需与 /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'] ?? [], 'footer_nav' => $config['footer_nav'] ?? [], 'side_floating_window' => $config['side'] ?? [], - 'feedback_type' => $config['site_config']['feedback_type'] ?? [], + 'feedback_type' => $config['feedback_type'] ?? ($config['site_config']['feedback_type'] ?? []), ]; return json([ diff --git a/plugins/addon/theme_configurator/model/ThemeConfigModel.php b/plugins/addon/theme_configurator/model/ThemeConfigModel.php index a384b1a..0ee53b8 100644 --- a/plugins/addon/theme_configurator/model/ThemeConfigModel.php +++ b/plugins/addon/theme_configurator/model/ThemeConfigModel.php @@ -75,14 +75,16 @@ class ThemeConfigModel protected function defaultConfig(): array { return [ - 'seo' => [ + 'seo' => [ 'title' => 'BlackFruit-UI', 'keywords' => '云服务器,主题云,BlackFruit', 'description' => 'BlackFruit-UI 默认站点说明', ], - 'header_nav' => [], - 'footer_nav' => [], - 'site_config' => [ + // 顶部/底部导航 + 'header_nav' => [], + 'footer_nav' => [], + // 站点基础信息 + 'site_config' => [ 'enterprise_name' => '主题云', 'enterprise_telephone' => '400-000-0000', 'enterprise_mailbox' => 'support@example.com', @@ -99,9 +101,14 @@ class ThemeConfigModel 'cloud_product_link' => '/cart/goods.htm?id=1', 'dcim_product_link' => '/cart/goods.htm?id=2', ], + // 友情链接、轮播、侧边浮窗等 'friendly_link' => [], 'banner' => [], 'side' => [], + // 用于 /console/v1/common 的扩展字段 + 'feedback_type' => [], + 'honor' => [], + 'partner' => [], ]; } } diff --git a/plugins/addon/theme_configurator/template/admin/index.html b/plugins/addon/theme_configurator/template/admin/index.html index 1872161..da1ee91 100644 --- a/plugins/addon/theme_configurator/template/admin/index.html +++ b/plugins/addon/theme_configurator/template/admin/index.html @@ -61,6 +61,26 @@ v-model="fullConfig.site_config.public_security_network_preparation_link" placeholder="https://beian.mps.gov.cn"> +
+ 对应 /console/v1/feedback 的类型选项,ID 需与后端保持一致,仅建议修改名称与描述。
+
+ 对应前台右侧悬浮工具条(电话咨询/在线客服/提交工单等),结构与模板中的 side_floating_window 一致。
+
- 用于暂未在 UI 中开放的配置项(如导航结构、友情链接等)。可先点击“同步当前配置”再做修改。 + 用于暂未在 UI 中开放的配置项(如复杂导航结构 header_nav/footer_nav 等)。如非必要,建议优先使用上方表单编辑。