前端部分: - 删除 index.html 中的"聚焦核心场景,助力数智升级"模块 - 删除 js/index.js 中处理 partner 数据的相关代码 主题配置插件部分: - 从 ThemeConfigModel.php 的默认配置中移除 partner 字段 - 从后台配置界面移除"合作伙伴/成功案例"配置区块 - 删除 JavaScript 中的 addPartner 和 removePartner 方法 - 更新 README.md 移除合作伙伴相关说明 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,16 +1,16 @@
|
||||
# Theme Configurator 插件
|
||||
|
||||
此插件演示如何通过后台插件的方式为 BlackFruit-UI 主题提供可配置能力,支持设置导航、页脚、站点信息、SEO、首页轮播、友情链接、荣誉/合作伙伴、反馈类型以及右侧浮窗,并提供 `/console/v1/theme/config` 接口与前端联动。
|
||||
此插件演示如何通过后台插件的方式为 BlackFruit-UI 主题提供可配置能力,支持设置导航、页脚、站点信息、SEO、首页轮播、友情链接、荣誉资质、反馈类型以及右侧浮窗,并提供 `/console/v1/theme/config` 接口与前端联动。
|
||||
|
||||
## 功能
|
||||
- 后台界面(`template/admin/index.html`)通过表单 + JSON 的方式维护主题参数:
|
||||
- SEO、站点基础信息(企业名称、电话、备案、协议链接、产品链接等);
|
||||
- 首页轮播 Banner;
|
||||
- 友情链接(friendly_link);
|
||||
- 企业荣誉(honor)、合作伙伴/成功案例(partner);
|
||||
- 企业荣誉(honor);
|
||||
- 反馈类型(feedback_type);
|
||||
- 右侧浮窗(side / side_floating_window);
|
||||
- 复杂导航结构(header_nav/footer_nav)可在“高级配置 (JSON)”中维护。
|
||||
- 复杂导航结构(header_nav/footer_nav)可在"高级配置 (JSON)"中维护。
|
||||
- 接口 `GET/POST /{DIR_ADMIN}/v1/theme/config` 提供配置读取与保存;
|
||||
- 前台接口 `GET /console/v1/theme/config` 输出与 `/console/v1/common` 同结构的数据,BlackFruit-UI 可以直接接入;
|
||||
- 插件安装时创建 `addon_theme_configurator` 表并写入默认配置。
|
||||
|
||||
@@ -110,7 +110,6 @@ class ThemeConfigModel
|
||||
// 用于 /console/v1/common 的扩展字段
|
||||
'feedback_type' => [],
|
||||
'honor' => [],
|
||||
'partner' => [],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -331,10 +331,9 @@
|
||||
<t-button theme="primary" variant="outline" @click="addBanner">新增轮播</t-button>
|
||||
</t-card>
|
||||
|
||||
<t-card class="theme-card" title="荣誉与合作伙伴" bordered>
|
||||
<h4 class="sub-title">企业荣誉</h4>
|
||||
<t-card class="theme-card" title="企业荣誉" bordered>
|
||||
<div v-if="!fullConfig.honor.length" class="empty-tip">
|
||||
用于首页“荣誉资质”模块(honor)。
|
||||
用于首页"荣誉资质"模块(honor)。
|
||||
</div>
|
||||
<div class="config-item" v-for="(item, index) in fullConfig.honor" :key="'honor-' + index">
|
||||
<div class="config-item__header">
|
||||
@@ -370,57 +369,6 @@
|
||||
</div>
|
||||
</div>
|
||||
<t-button theme="primary" variant="outline" @click="addHonor">新增荣誉</t-button>
|
||||
|
||||
<h4 class="sub-title mt-10">合作伙伴/成功案例</h4>
|
||||
<div v-if="!fullConfig.partner.length" class="empty-tip">
|
||||
用于首页“典型案例/合作伙伴”模块(partner)。
|
||||
</div>
|
||||
<div
|
||||
class="config-item"
|
||||
v-for="(item, index) in fullConfig.partner"
|
||||
:key="'partner-' + index"
|
||||
>
|
||||
<div class="config-item__header">
|
||||
<h4>伙伴 {{ index + 1 }}</h4>
|
||||
<t-button size="small" theme="danger" variant="outline" @click="removePartner(index)">
|
||||
删除
|
||||
</t-button>
|
||||
</div>
|
||||
<div class="form-grid">
|
||||
<div class="form-item">
|
||||
<label>名称</label>
|
||||
<t-input v-model="item.name" placeholder="合作伙伴/客户名称"></t-input>
|
||||
</div>
|
||||
<div class="form-item form-item--full">
|
||||
<label>图片地址</label>
|
||||
<div class="upload-row">
|
||||
<t-input v-model="item.img" placeholder="/upload/partner.png"></t-input>
|
||||
<t-upload
|
||||
theme="custom"
|
||||
:action="uploadUrl"
|
||||
:headers="uploadHeaders"
|
||||
:format-response="uploadFormatResponse"
|
||||
:show-upload-progress="false"
|
||||
:max="1"
|
||||
@success="(ctx) => handleUpload(['partner', index, 'img'], ctx)"
|
||||
>
|
||||
<t-button size="small" class="ml-10">
|
||||
<t-icon name="upload" size="small" /> 上传
|
||||
</t-button>
|
||||
</t-upload>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item form-item--full">
|
||||
<label>描述</label>
|
||||
<t-textarea
|
||||
v-model="item.description"
|
||||
:autosize="{ minRows: 2, maxRows: 3 }"
|
||||
placeholder="一句话介绍该案例"
|
||||
></t-textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<t-button theme="primary" variant="outline" @click="addPartner">新增合作伙伴</t-button>
|
||||
</t-card>
|
||||
</t-tab-panel>
|
||||
|
||||
@@ -730,7 +678,6 @@
|
||||
side: [],
|
||||
feedback_type: [],
|
||||
honor: [],
|
||||
partner: [],
|
||||
});
|
||||
|
||||
new Vue({
|
||||
@@ -816,11 +763,6 @@
|
||||
: Array.isArray(data.site_config && data.site_config.honor)
|
||||
? data.site_config.honor
|
||||
: [],
|
||||
partner: Array.isArray(data.partner)
|
||||
? data.partner
|
||||
: Array.isArray(data.site_config && data.site_config.partner)
|
||||
? data.site_config.partner
|
||||
: [],
|
||||
};
|
||||
|
||||
if (!Array.isArray(merged.header_nav) || merged.header_nav.length === 0) {
|
||||
@@ -961,19 +903,6 @@
|
||||
removeHonor(index) {
|
||||
this.fullConfig.honor.splice(index, 1);
|
||||
},
|
||||
addPartner() {
|
||||
if (!Array.isArray(this.fullConfig.partner)) {
|
||||
this.fullConfig.partner = [];
|
||||
}
|
||||
this.fullConfig.partner.push({
|
||||
name: "",
|
||||
img: "",
|
||||
description: "",
|
||||
});
|
||||
},
|
||||
removePartner(index) {
|
||||
this.fullConfig.partner.splice(index, 1);
|
||||
},
|
||||
addFeedbackType() {
|
||||
if (!Array.isArray(this.fullConfig.feedback_type)) {
|
||||
this.fullConfig.feedback_type = [];
|
||||
|
||||
Reference in New Issue
Block a user