Files
wordpress-theme-aksrt/assets/admin/src/utils/home-module-schema.js
T

515 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* AKSRT CMS Home Module Schema
*
* 定义每类模块的:
* - 元数据(label / icon / desc)
* - 默认 config
* - 表单字段(用于配置抽屉自动生成 UI)
*
* 字段类型 type:
* - text n-input
* - number n-input-number
* - select n-select (options)
* - radio n-radio-group (options)
* - switch n-switch
* - cats n-select (multiple, 动态加载分类)
* - cat n-select (single, 动态加载分类)
* - textarea n-input type=textarea
*/
export const MODULE_TYPES = [
'hero',
'banner',
'category',
'tabs',
'ranking',
'recent',
'tag_cloud',
'friend_links',
'html',
'hotspot',
'category_recommend_cards',
'text_title',
'button_group',
'spacing',
'faq',
'data_grid',
'highlight_cards',
'partner_marquee',
'product_showcase',
'user',
'more',
]
export const MODULE_LIBRARY = [
{
type: 'hero',
label: 'Hero 首屏',
icon: 'image',
desc: '固定首页骨架:大图轮播首屏。幻灯片内容在「页面&显示 → Hero 轮播」维护;搜索/卡片参数见「顶部多功能组件」。',
defaultConfig: { with_search: true, show_cards: false, card_columns: 4, icon_cards: [] },
fields: [
{ key: 'with_search', type: 'switch', label: '显示搜索覆盖框' },
{ key: 'show_cards', type: 'switch', label: '显示图标卡片覆盖' },
{ key: 'card_columns', type: 'number', label: '卡片列数', min: 2, max: 6 },
],
},
{
type: 'banner',
label: 'Banner 轮播',
icon: 'rectangle',
desc: '固定首页骨架:正文区轮播条。幻灯片内容在「页面&显示 → Banner 轮播」维护。',
defaultConfig: {},
fields: [],
},
{
type: 'category',
label: '分类块',
icon: 'folder',
desc: '指定分类的最新内容网格',
defaultConfig: { cat_id: 0, count: 8, layout: 'card', columns: 4, title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题(留空用分类名)' },
{ key: 'cat_id', type: 'cat', label: '分类' },
{ key: 'count', type: 'number', label: '数量', min: 1, max: 20 },
{ key: 'columns', type: 'number', label: '列数', min: 1, max: 6 },
{
key: 'layout', type: 'select', label: '布局',
options: [
{ label: '卡片', value: 'card' },
{ label: '列表', value: 'list' },
{ label: '瀑布流', value: 'masonry' },
{ label: '资源网格', value: 'grid-cms' },
],
},
],
},
{
type: 'tabs',
label: '分类 Tabs',
icon: 'switcher',
desc: '多分类 Tab 切换',
defaultConfig: { cat_ids: [], count: 8, layout: 'grid-cms', title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'cat_ids', type: 'cats', label: '分类列表' },
{ key: 'count', type: 'number', label: '每个 Tab 数量', min: 1, max: 20 },
{
key: 'layout', type: 'select', label: '布局',
options: [
{ label: '卡片', value: 'card' },
{ label: '列表', value: 'list' },
{ label: '瀑布流', value: 'masonry' },
{ label: '资源网格', value: 'grid-cms' },
],
},
],
},
{
type: 'ranking',
label: '排行榜',
icon: 'trophy',
desc: '按下载量 / 阅读量 / 评论数排序(普通文章)',
defaultConfig: { metric: 'downloads', count: 6, title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题' },
{
key: 'metric', type: 'radio', label: '排序依据',
options: [
{ label: '下载量', value: 'downloads' },
{ label: '阅读量', value: 'views' },
{ label: '评论数', value: 'comments' },
],
},
{ key: 'count', type: 'number', label: '数量', min: 1, max: 20 },
],
},
{
type: 'recent',
label: '最新文章',
icon: 'clock',
desc: '按时间倒序的最新文章',
defaultConfig: { count: 6, layout: 'card', title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'count', type: 'number', label: '数量', min: 1, max: 20 },
{
key: 'layout', type: 'select', label: '布局',
options: [
{ label: '卡片', value: 'card' },
{ label: '列表', value: 'list' },
{ label: '瀑布流', value: 'masonry' },
{ label: '资源网格', value: 'grid-cms' },
],
},
],
},
{
type: 'tag_cloud',
label: '标签云',
icon: 'tag',
desc: '按使用频率展示热门标签',
defaultConfig: { limit: 30, title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'limit', type: 'number', label: '数量', min: 5, max: 100 },
],
},
{
type: 'friend_links',
label: '友情链接',
icon: 'link',
desc: '展示已配置的友链',
defaultConfig: { category: '', title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'category', type: 'text', label: '分类筛选(可空)' },
],
},
{
type: 'html',
label: '自定义 HTML',
icon: 'code',
desc: '自由插入 HTML 片段(受 wp_kses_post 清洗)',
defaultConfig: { html: '', title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题(可空)' },
{ key: 'html', type: 'textarea', label: 'HTML 内容', rows: 6 },
],
},
{
type: 'hotspot',
label: '热点推荐',
icon: 'fire',
desc: '文章推荐列表(纯文本,仅桌面端显示)',
defaultConfig: { count: 6, source: 'auto', title: '' },
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'count', type: 'number', label: '数量', min: 3, max: 20 },
{
key: 'source', type: 'select', label: '数据来源',
options: [
{ label: '自动推荐(推荐文章优先)', value: 'auto' },
{ label: '最新文章', value: 'recent' },
{ label: '最热文章(按阅读量)', value: 'views' },
],
},
],
},
{
type: 'category_recommend_cards',
label: '分类推荐卡片',
icon: 'grid',
desc: '4 张分类卡片 2×2 布局,含封面图、浏览量胶囊和文章列表',
defaultConfig: {
title: '分类推荐',
cat_ids: [],
show_views: true,
show_dates: true,
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'cat_ids', type: 'cats', label: '分类(按选择顺序对应卡片 1-4)' },
{ key: 'show_views', type: 'switch', label: '显示浏览量胶囊' },
{ key: 'show_dates', type: 'switch', label: '显示发布时间' },
],
},
{
type: 'text_title',
label: '标题文案',
icon: 'font-colors',
desc: '带标题、副标题和可选按钮的文案区块',
defaultConfig: {
title: '',
desc: '',
align: 'left',
style: 'default',
button_text: '',
button_url: '',
button_style: 'primary',
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'desc', type: 'textarea', label: '副标题/描述', rows: 2 },
{ key: 'align', type: 'radio', label: '对齐', options: [
{ label: '左对齐', value: 'left' },
{ label: '居中', value: 'center' },
{ label: '右对齐', value: 'right' },
]},
{ key: 'style', type: 'select', label: '样式', options: [
{ label: '默认', value: 'default' },
{ label: '带左边框', value: 'bordered' },
{ label: '带背景', value: 'bg' },
]},
{ key: 'button_text', type: 'text', label: '按钮文字(可空)' },
{ key: 'button_url', type: 'text', label: '按钮链接' },
{ key: 'button_style', type: 'select', label: '按钮样式', options: [
{ label: '主色', value: 'primary' },
{ label: '轮廓', value: 'outline' },
{ label: '文字', value: 'text' },
]},
],
},
{
type: 'button_group',
label: '按钮组',
icon: 'th-large',
desc: '多按钮横向排列,适合快捷入口',
defaultConfig: {
title: '',
buttons: [],
columns: 4,
style: 'card',
},
fields: [
{ key: 'title', type: 'text', label: '标题(可空)' },
{ key: 'columns', type: 'number', label: '每行列数', min: 2, max: 6 },
{ key: 'style', type: 'select', label: '按钮样式', options: [
{ label: '卡片', value: 'card' },
{ label: '图标', value: 'icon' },
{ label: '文字', value: 'text' },
]},
],
},
{
type: 'spacing',
label: '间距分隔',
icon: 'swap',
desc: '模块间间距或分隔线',
defaultConfig: {
height: 40,
divider: false,
divider_style: 'solid',
},
fields: [
{ key: 'height', type: 'number', label: '高度 (px)', min: 0, max: 200 },
{ key: 'divider', type: 'switch', label: '显示分隔线' },
{ key: 'divider_style', type: 'select', label: '分隔线样式', options: [
{ label: '实线', value: 'solid' },
{ label: '虚线', value: 'dashed' },
{ label: '点线', value: 'dotted' },
]},
],
},
{
type: 'faq',
label: '常见问题',
icon: 'question-circle',
desc: '折叠式 FAQ 列表',
defaultConfig: {
title: '常见问题',
items: [],
style: 'accordion',
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'style', type: 'radio', label: '样式', options: [
{ label: '手风琴', value: 'accordion' },
{ label: '卡片', value: 'card' },
]},
],
},
{
type: 'data_grid',
label: '数据网格',
icon: 'table',
desc: '多列数据卡片展示(统计、特征等)',
defaultConfig: {
title: '',
columns: 4,
items: [],
style: 'number',
},
fields: [
{ key: 'title', type: 'text', label: '标题(可空)' },
{ key: 'columns', type: 'number', label: '列数', min: 2, max: 6 },
{ key: 'style', type: 'select', label: '样式', options: [
{ label: '数字突出', value: 'number' },
{ label: '图标突出', value: 'icon' },
{ label: '简洁', value: 'minimal' },
]},
],
},
{
type: 'highlight_cards',
label: '高亮卡片',
icon: 'star',
desc: '带配色的特色卡片网格',
defaultConfig: {
title: '',
columns: 3,
cards: [],
},
fields: [
{ key: 'title', type: 'text', label: '标题(可空)' },
{ key: 'columns', type: 'number', label: '列数', min: 2, max: 4 },
],
},
{
type: 'partner_marquee',
label: '合作伙伴',
icon: 'handshake',
desc: 'Logo 滚动展示(合作伙伴/品牌墙)',
defaultConfig: {
title: '合作伙伴',
logos: [],
speed: 30,
pause_on_hover: true,
columns: 5,
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'speed', type: 'number', label: '滚动速度', min: 10, max: 100 },
{ key: 'pause_on_hover', type: 'switch', label: '鼠标悬停暂停' },
{ key: 'columns', type: 'number', label: '可见列数', min: 3, max: 8 },
],
},
{
type: 'product_showcase',
label: '产品展示',
icon: 'shopping-bag',
desc: '产品/商品卡片网格(为商城 Phase 预留)',
defaultConfig: {
title: '产品展示',
columns: 3,
count: 6,
source: 'manual',
show_price: true,
show_button: true,
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'columns', type: 'number', label: '列数', min: 2, max: 4 },
{ key: 'count', type: 'number', label: '数量', min: 1, max: 12 },
{ key: 'source', type: 'select', label: '数据来源', options: [
{ label: '手动配置', value: 'manual' },
{ label: '最新商品', value: 'latest' },
{ label: '热门商品', value: 'popular' },
]},
{ key: 'show_price', type: 'switch', label: '显示价格' },
{ key: 'show_button', type: 'switch', label: '显示购买按钮' },
],
},
{
type: 'user',
label: '用户卡片',
icon: 'user',
desc: '推荐用户卡片(头像、简介、关注按钮)',
defaultConfig: {
title: '推荐用户',
user_ids: [],
count: 4,
columns: 4,
order: 'recent',
show_stats: true,
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'count', type: 'number', label: '用户数量', min: 1, max: 12 },
{ key: 'columns', type: 'number', label: '列数', min: 2, max: 6 },
{ key: 'order', type: 'select', label: '排序', options: [
{ label: '最近注册', value: 'recent' },
{ label: '文章最多', value: 'posts' },
{ label: '手动指定', value: 'manual' },
]},
{ key: 'show_stats', type: 'switch', label: '显示统计数据' },
],
},
{
type: 'more',
label: '发现更多',
icon: 'th',
desc: '分类卡片网格(封面、文章数、最近文章)',
defaultConfig: {
title: '发现更多',
cat_ids: [],
count: 6,
columns: 3,
show_post_count: true,
show_latest_posts: true,
latest_count: 5,
},
fields: [
{ key: 'title', type: 'text', label: '标题' },
{ key: 'count', type: 'number', label: '分类数量', min: 1, max: 12 },
{ key: 'columns', type: 'number', label: '列数', min: 2, max: 4 },
{ key: 'show_post_count', type: 'switch', label: '显示文章数' },
{ key: 'show_latest_posts', type: 'switch', label: '显示最近文章' },
{ key: 'latest_count', type: 'number', label: '最近文章数', min: 1, max: 10 },
],
},
]
export function getModuleMeta(type) {
return MODULE_LIBRARY.find(m => m.type === type) || null
}
export function makeDefaultModule(type) {
const meta = getModuleMeta(type)
if (!meta) return null
return {
type,
config: JSON.parse(JSON.stringify(meta.defaultConfig || {})),
}
}
export const PRESET_TEMPLATES = [
{
key: 'resource_standard',
label: '资源站标准',
desc: 'Hero(固定骨架)+ Tabs + 最新文章 + 下载排行',
modules: [
{ type: 'hero', config: {} },
{ type: 'tabs', config: { count: 8, layout: 'grid-cms' } },
{ type: 'recent', config: { count: 8, layout: 'grid-cms' } },
{ type: 'ranking', config: { metric: 'downloads', count: 6 } },
],
},
{
key: 'news',
label: '资讯站',
desc: 'Banner(固定骨架)+ 多个分类块 + 标签云',
modules: [
{ type: 'banner', config: {} },
{ type: 'category', config: { count: 8, columns: 4, layout: 'card' } },
{ type: 'category', config: { count: 8, columns: 4, layout: 'card' } },
{ type: 'tag_cloud', config: { limit: 30 } },
],
},
{
key: 'mixed',
label: '混合站',
desc: 'Hero(固定骨架)+ 最新文章 + 多个分类块',
modules: [
{ type: 'hero', config: {} },
{ type: 'recent', config: { count: 6, layout: 'card' } },
{ type: 'category', config: { count: 6, columns: 3, layout: 'card' } },
{ type: 'category', config: { count: 6, columns: 3, layout: 'card' } },
],
},
{
key: 'landing',
label: '落地页',
desc: 'Hero + 标题 + 高亮卡片 + FAQ + 按钮组',
modules: [
{ type: 'hero', config: {} },
{ type: 'text_title', config: { title: '为什么选择我们', align: 'center', style: 'default' } },
{ type: 'highlight_cards', config: { columns: 3 } },
{ type: 'spacing', config: { height: 40 } },
{ type: 'faq', config: { title: '常见问题' } },
{ type: 'button_group', config: { columns: 3, style: 'card' } },
],
},
{
key: 'corporate',
label: '企业站',
desc: 'Hero + 数据网格 + 产品展示 + 合作伙伴',
modules: [
{ type: 'hero', config: {} },
{ type: 'data_grid', config: { title: '核心数据', columns: 4, style: 'number' } },
{ type: 'product_showcase', config: { title: '产品展示', columns: 3 } },
{ type: 'partner_marquee', config: { title: '合作伙伴', speed: 30 } },
],
},
]