导入 AKSRT 主题开发源码

This commit is contained in:
Claude Code committed 2026-07-03 22:50:34 +08:00
1 parent 9681dd3d48
commit 1268a55dd0
595 files changed
+127705

No files matched your search

@@ -0,0 +1,68 @@
export const auditSchema = {
key: 'extensions.audit',
title: 'API内容审核',
icon: 'fas fa-shield-virus',
description: '配置第三方内容审核 API 接入、审核范围和失败回退策略。',
defaults: {
content_audit_enabled: false,
content_audit_provider: 'baidu',
content_audit_api_key: '',
content_audit_api_secret: '',
content_audit_text_enabled: true,
content_audit_image_enabled: false,
content_audit_on_failure: 'allow',
content_audit_log_enabled: true,
},
groups: [
{
key: 'provider',
title: '审核接口',
icon: 'fas fa-plug',
fields: [
{ key: 'content_audit_enabled', label: '启用内容审核', type: 'switch', default: false, help: '开启后将对接第三方内容审核 API' },
{
key: 'content_audit_provider',
label: '审核服务商',
type: 'radio',
default: 'baidu',
options: [
{ label: '百度内容审核', value: 'baidu' },
{ label: '关闭审核接口', value: 'null' },
],
dependsOn: { key: 'content_audit_enabled', value: true },
},
{ key: 'content_audit_api_key', label: 'API Key', type: 'input', default: '', dependsOn: { key: 'content_audit_enabled', value: true }, help: '百度智能云 API Key' },
{ key: 'content_audit_api_secret', label: 'Secret Key', type: 'input', default: '', dependsOn: { key: 'content_audit_enabled', value: true }, help: '百度智能云 Secret Key' },
],
},
{
key: 'scope',
title: '审核范围',
icon: 'fas fa-check-double',
fields: [
{ key: 'content_audit_text_enabled', label: '文本审核', type: 'switch', default: true, dependsOn: { key: 'content_audit_enabled', value: true } },
{ key: 'content_audit_image_enabled', label: '图片审核', type: 'switch', default: false, dependsOn: { key: 'content_audit_enabled', value: true } },
{ key: 'audit_bbs_term', label: '审核论坛分类', type: 'switch', default: false, dependsOn: { key: 'content_audit_enabled', value: true } },
],
},
{
key: 'fallback',
title: '失败策略',
icon: 'fas fa-exclamation-triangle',
fields: [
{
key: 'content_audit_on_failure',
label: '审核失败时',
type: 'radio',
default: 'allow',
options: [
{ label: '放行', value: 'allow' },
{ label: '拦截', value: 'block' },
],
dependsOn: { key: 'content_audit_enabled', value: true },
},
{ key: 'content_audit_log_enabled', label: '记录审核日志', type: 'switch', default: true, dependsOn: { key: 'content_audit_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,125 @@
export const docsModeSchema = {
key: 'extensions.docs-mode',
title: '文档模式',
icon: 'fas fa-book-open',
description: '启用文档专题内容模式,配置文档导航页面和文档站式体验。',
defaults: {
docs_mode_enabled: false,
docs_mode_default_template: 'documentnav',
docs_mode_toc_enabled: true,
docs_mode_chapter_nav_enabled: true,
docs_mode_default_order: 'menu_order',
docs_mode_cats: [],
docs_mode_exclude: true,
docs_mode_toc_depth: 3,
docs_mode_chapter_title: '',
docs_mode_style: 'default',
docs_mode_icon: true,
docs_mode_count: true,
},
groups: [
{
key: 'basic',
title: '基础配置',
icon: 'fas fa-cog',
fields: [
{ key: 'docs_mode_enabled', label: '启用文档模式', type: 'switch', default: false, help: '开启后将激活文档导航页面模板和文档站式侧边栏' },
{
key: 'docs_mode_default_template',
label: '文档首页模板',
type: 'select',
default: 'documentnav',
options: [
{ label: '文档导航页', value: 'documentnav' },
{ label: '专题聚合页', value: 'special' },
],
dependsOn: { key: 'docs_mode_enabled', value: true },
},
],
},
{
key: 'navigation',
title: '导航设置',
icon: 'fas fa-compass',
fields: [
{ key: 'docs_mode_toc_enabled', label: '显示目录树', type: 'switch', default: true, dependsOn: { key: 'docs_mode_enabled', value: true }, help: '在文档页面侧边栏显示章节目录树' },
{ key: 'docs_mode_chapter_nav_enabled', label: '显示章节导航', type: 'switch', default: true, dependsOn: { key: 'docs_mode_enabled', value: true }, help: '在文档底部显示上一章/下一章导航' },
{
key: 'docs_mode_default_order',
label: '默认排序',
type: 'radio',
default: 'menu_order',
options: [
{ label: '按菜单顺序', value: 'menu_order' },
{ label: '按发布时间', value: 'date' },
{ label: '按标题排序', value: 'title' },
],
dependsOn: { key: 'docs_mode_enabled', value: true },
},
{
key: 'docs_mode_toc_depth',
label: '目录深度',
type: 'number',
default: 3,
min: 1,
max: 6,
dependsOn: { key: 'docs_mode_enabled', value: true },
},
{
key: 'docs_mode_chapter_title',
label: '章节标题',
type: 'input',
default: '',
dependsOn: { key: 'docs_mode_enabled', value: true },
},
],
},
{
key: 'filter',
title: '筛选设置',
icon: 'fas fa-filter',
fields: [
{
key: 'docs_mode_cats',
label: '文档分类',
type: 'taxonomy_select',
taxonomy: 'category',
multiple: true,
clearable: true,
default: [],
placeholder: '选择用于文档模式的分类',
dependsOn: { key: 'docs_mode_enabled', value: true },
},
{
key: 'docs_mode_exclude',
label: '在首页排除此类内容',
type: 'switch',
default: true,
dependsOn: { key: 'docs_mode_enabled', value: true },
help: '开启后,所选文档分类的内容不会出现在首页常规文章流中。',
},
],
},
{
key: 'style',
title: '样式设置',
icon: 'fas fa-palette',
fields: [
{
key: 'docs_mode_style',
label: '文档样式',
type: 'select',
default: 'default',
options: [
{ label: '默认', value: 'default' },
{ label: '简洁', value: 'simple' },
{ label: '卡片', value: 'card' },
],
dependsOn: { key: 'docs_mode_enabled', value: true },
},
{ key: 'docs_mode_icon', label: '显示图标', type: 'switch', default: true, dependsOn: { key: 'docs_mode_enabled', value: true } },
{ key: 'docs_mode_count', label: '显示文章数', type: 'switch', default: true, dependsOn: { key: 'docs_mode_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,16 @@
/**
* Extensions & Enhancements domain schemas.
* Each key corresponds to a sub-page under the "扩展&增强" section.
*/
import { ipSchema } from './ip.js'
import { auditSchema } from './audit.js'
import { pushSchema } from './push.js'
import { docsModeSchema } from './docs-mode.js'
export const extensionsSchemas = {
ip: ipSchema,
audit: auditSchema,
push: pushSchema,
'docs-mode': docsModeSchema,
}
@@ -0,0 +1,86 @@
export const ipSchema = {
key: 'extensions.ip',
title: 'IP归属地',
icon: 'fas fa-map-marker-alt',
description: '配置 IP 数据源、缓存策略和前台归属地展示。',
defaults: {
ip_geo_enabled: false,
ip_addr_sdk: 'null',
ip_geo_cache_ttl: 86400,
ip_geo_display: ['comment'],
ip_geo_format: 'province_city',
ip_geo_fallback_text: '',
ip_addr_sdk_qq_appkey: '',
ip_addr_sdk_qq_secretkey: '',
ip_addr_sdk_amap_appkey: '',
ip_addr_sdk_amap_secretkey: '',
},
groups: [
{
key: 'basic',
title: '基础配置',
icon: 'fas fa-globe',
fields: [
{ key: 'ip_geo_enabled', label: '启用 IP 归属地', type: 'switch', default: false, help: '开启后将在评论、用户主页等位置显示 IP 归属地信息' },
{
key: 'ip_addr_sdk',
label: 'IP 接口服务商',
type: 'radio',
default: 'null',
options: [
{ label: '轮流查询', value: 'polling' },
{ label: '腾讯位置服务', value: 'qq' },
{ label: '高德位置服务', value: 'amap' },
{ label: '太平洋公共接口', value: 'null' },
],
dependsOn: { key: 'ip_geo_enabled', value: true },
help: '优先使用国内接口,轮流查询会按腾讯→高德→公共接口顺序回退。',
},
{ key: 'ip_geo_cache_ttl', label: '缓存时间 (秒)', type: 'number', default: 86400, min: 3600, max: 604800, dependsOn: { key: 'ip_geo_enabled', value: true }, help: 'IP 查询结果缓存时长,避免频繁请求外部接口' },
],
},
{
key: 'providers',
title: '接口凭据',
icon: 'fas fa-key',
fields: [
{ key: 'ip_addr_sdk_qq_appkey', label: '腾讯 AppKey', type: 'input', default: '', dependsOn: { key: 'ip_addr_sdk', value: 'qq' } },
{ key: 'ip_addr_sdk_qq_secretkey', label: '腾讯 SecretKey', type: 'input', default: '', dependsOn: { key: 'ip_addr_sdk', value: 'qq' } },
{ key: 'ip_addr_sdk_amap_appkey', label: '高德 AppKey', type: 'input', default: '', dependsOn: { key: 'ip_addr_sdk', value: 'amap' } },
{ key: 'ip_addr_sdk_amap_secretkey', label: '高德 SecretKey', type: 'input', default: '', dependsOn: { key: 'ip_addr_sdk', value: 'amap' } },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{
key: 'ip_geo_display',
label: '展示位置',
type: 'checkbox',
default: ['comment'],
options: [
{ label: '评论区', value: 'comment' },
{ label: '用户主页', value: 'user_home' },
{ label: '文章页', value: 'post' },
],
dependsOn: { key: 'ip_geo_enabled', value: true },
},
{
key: 'ip_geo_format',
label: '显示格式',
type: 'radio',
default: 'province_city',
options: [
{ label: '省份+城市', value: 'province_city' },
{ label: '仅省份', value: 'province' },
{ label: '国家+省份', value: 'country_province' },
],
dependsOn: { key: 'ip_geo_enabled', value: true },
},
{ key: 'ip_geo_fallback_text', label: '查询失败时文案', type: 'input', default: '', placeholder: '留空则不显示', dependsOn: { key: 'ip_geo_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,64 @@
export const pushSchema = {
key: 'extensions.push',
title: '百度推送',
icon: 'fas fa-paper-plane',
description: '配置搜索引擎主动推送、批量提交和状态追踪。',
defaults: {
baidu_push_enabled: false,
baidu_push_token: '',
baidu_push_auto: true,
baidu_push_on_publish: true,
baidu_push_on_update: false,
baidu_push_batch_size: 50,
baidu_push_log_enabled: true,
xzh_on: false,
xzh_appid: '',
xzh_render_tail: true,
xzh_jsonld_single: true,
xzh_jsonld_page: false,
xzh_jsonld_img: false,
},
groups: [
{
key: 'basic',
title: '推送配置',
icon: 'fas fa-rocket',
fields: [
{ key: 'baidu_push_enabled', label: '启用百度推送', type: 'switch', default: false, help: '开启后将自动向百度搜索推送页面链接' },
{ key: 'baidu_push_token', label: '推送 Token', type: 'input', default: '', dependsOn: { key: 'baidu_push_enabled', value: true }, help: '在百度搜索资源平台获取的推送准入 Token' },
],
},
{
key: 'trigger',
title: '触发规则',
icon: 'fas fa-bolt',
fields: [
{ key: 'baidu_push_auto', label: '自动推送 (页面加载时)', type: 'switch', default: true, dependsOn: { key: 'baidu_push_enabled', value: true }, help: '在前台页面中嵌入百度自动推送 JS 代码' },
{ key: 'baidu_push_on_publish', label: '发布时主动推送', type: 'switch', default: true, dependsOn: { key: 'baidu_push_enabled', value: true } },
{ key: 'baidu_push_on_update', label: '更新时推送', type: 'switch', default: false, dependsOn: { key: 'baidu_push_enabled', value: true } },
],
},
{
key: 'xzh',
title: '熊掌号 / JSON-LD',
icon: 'fas fa-paw',
fields: [
{ key: 'xzh_on', label: '启用熊掌号', type: 'switch', default: false },
{ key: 'xzh_appid', label: '百度 AppID', type: 'input', default: '', dependsOn: { key: 'xzh_on', value: true } },
{ key: 'xzh_render_tail', label: '文章底部显示熊掌号尾部', type: 'switch', default: true, dependsOn: { key: 'xzh_on', value: true } },
{ key: 'xzh_jsonld_single', label: '文章页 JSON-LD', type: 'switch', default: true, dependsOn: { key: 'xzh_on', value: true } },
{ key: 'xzh_jsonld_page', label: '页面 JSON-LD', type: 'switch', default: false, dependsOn: { key: 'xzh_on', value: true } },
{ key: 'xzh_jsonld_img', label: '不添加图片', type: 'switch', default: false, dependsOn: { key: 'xzh_on', value: true } },
],
},
{
key: 'advanced',
title: '高级设置',
icon: 'fas fa-cog',
fields: [
{ key: 'baidu_push_batch_size', label: '批量推送条数', type: 'number', default: 50, min: 1, max: 500, dependsOn: { key: 'baidu_push_enabled', value: true } },
{ key: 'baidu_push_log_enabled', label: '记录推送日志', type: 'switch', default: true, dependsOn: { key: 'baidu_push_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,28 @@
export const basicSchema = {
key: 'forum.basic',
title: '基础设置',
icon: 'fas fa-power-off',
description: '论坛总开关与管理员配置。',
defaults: {
bbs_s: true,
bbs_admin_users: [],
},
groups: [
{
key: 'switch',
title: '功能开关',
icon: 'fas fa-toggle-on',
fields: [
{ key: 'bbs_s', label: '启用论坛', type: 'switch', default: true, help: '关闭后论坛页面将返回 404' },
],
},
{
key: 'admin',
title: '论坛管理',
icon: 'fas fa-user-shield',
fields: [
{ key: 'bbs_admin_users', label: '论坛管理员', type: 'user_select', multiple: true, default: [], help: '拥有跨版块全部治理权限,绕过 ban' },
],
},
],
}
@@ -0,0 +1,31 @@
export const boardPageSchema = {
key: 'forum.board_page',
title: '版块页面',
icon: 'fas fa-th-large',
description: '版块页布局、Tab 栏目和移动端交互配置。',
defaults: {
bbs_plate_top_info_s: true,
bbs_plate_tab: [
{ label: '全部', sort: 'date' },
{ label: '推荐', sort: 'featured' },
{ label: '最新回复', sort: 'last_reply' },
{ label: '热门', sort: 'hot' },
{ label: '精华', sort: 'essence' },
],
bbs_plate_tab_active_index: 0,
bbs_plate_tab_swiper: true,
},
groups: [
{
key: 'layout',
title: '版块页布局',
icon: 'fas fa-layer-group',
fields: [
{ key: 'bbs_plate_top_info_s', label: '版块信息卡', type: 'switch', default: true, help: '版块页顶部显示版块详情卡片' },
{ key: 'bbs_plate_tab', label: '版块栏目', type: 'group', default: [{ label: '全部', sort: 'date' }, { label: '推荐', sort: 'featured' }, { label: '最新回复', sort: 'last_reply' }, { label: '热门', sort: 'hot' }, { label: '精华', sort: 'essence' }] },
{ key: 'bbs_plate_tab_active_index', label: '默认选中 Tab', type: 'number', default: 0, min: 0 },
{ key: 'bbs_plate_tab_swiper', label: '移动端滑动切换', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,35 @@
export const creditsSchema = {
key: 'forum.credits',
title: '积分设置',
icon: 'fas fa-coins',
description: '论坛行为积分奖励矩阵和每日积分上限。',
defaults: {
bbs_credits_post_new: 5,
bbs_credits_plate_new: 10,
bbs_credits_comment_new: 2,
bbs_credits_comment_like: 1,
bbs_credits_score_extra: 3,
bbs_credits_essence: 10,
bbs_credits_posts_hot: 5,
bbs_credits_adopted: 20,
bbs_credits_daily_max: 50,
},
groups: [
{
key: 'earn',
title: '积分奖励',
icon: 'fas fa-gift',
fields: [
{ key: 'bbs_credits_post_new', label: '发帖奖励', type: 'number', default: 5, min: 0 },
{ key: 'bbs_credits_plate_new', label: '建版奖励', type: 'number', default: 10, min: 0 },
{ key: 'bbs_credits_comment_new', label: '回复奖励', type: 'number', default: 2, min: 0 },
{ key: 'bbs_credits_comment_like', label: '评论被赞', type: 'number', default: 1, min: 0 },
{ key: 'bbs_credits_score_extra', label: '被加分', type: 'number', default: 3, min: 0 },
{ key: 'bbs_credits_essence', label: '被设精华', type: 'number', default: 10, min: 0 },
{ key: 'bbs_credits_posts_hot', label: '成为热帖', type: 'number', default: 5, min: 0 },
{ key: 'bbs_credits_adopted', label: '被采纳', type: 'number', default: 20, min: 0 },
{ key: 'bbs_credits_daily_max', label: '每日积分上限', type: 'number', default: 50, min: 0, help: '0 = 不限' },
],
},
],
}
@@ -0,0 +1,29 @@
export const homepageSchema = {
key: 'forum.homepage',
title: '首页设置',
icon: 'fas fa-home',
description: '论坛首页 Tab 引擎、快速发帖入口和移动端交互配置。',
defaults: {
bbs_home_tab: [
{ type: 'follow', label: '关注' },
{ type: 'synthesis', label: '综合' },
{ type: 'plate', label: '版块' },
],
bbs_home_tab_active_index: 1,
bbs_home_tab_quick_posts_s: true,
bbs_home_tab_swiper: true,
},
groups: [
{
key: 'tabs',
title: '首页 Tab',
icon: 'fas fa-columns',
fields: [
{ key: 'bbs_home_tab', label: '首页栏目', type: 'group', default: [{ type: 'follow', label: '关注' }, { type: 'synthesis', label: '综合' }, { type: 'plate', label: '版块' }], help: '可拖拽排序,支持 follow / synthesis / plate / tabs 类型' },
{ key: 'bbs_home_tab_active_index', label: '默认选中 Tab', type: 'number', default: 1, min: 0 },
{ key: 'bbs_home_tab_quick_posts_s', label: '快速发帖', type: 'switch', default: true, help: '首页顶部显示快速发帖入口' },
{ key: 'bbs_home_tab_swiper', label: '移动端滑动切换', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,31 @@
/**
* Forum domain schemas.
*
* 12 sections matching PHP schema_forum():
* basic / names / homepage / board_page / post_page / reply /
* permissions / other / upload / credits
*/
import { basicSchema } from './basic.js'
import { namesSchema } from './names.js'
import { homepageSchema } from './homepage.js'
import { boardPageSchema } from './board-page.js'
import { postPageSchema } from './post-page.js'
import { replySchema } from './reply.js'
import { permissionsSchema } from './permissions.js'
import { otherSchema } from './other.js'
import { uploadSchema } from './upload.js'
import { creditsSchema } from './credits.js'
export const forumSchemas = {
basic: basicSchema,
names: namesSchema,
homepage: homepageSchema,
board_page: boardPageSchema,
post_page: postPageSchema,
reply: replySchema,
permissions: permissionsSchema,
other: otherSchema,
upload: uploadSchema,
credits: creditsSchema,
}
@@ -0,0 +1,41 @@
export const namesSchema = {
key: 'forum.names',
title: '名称定义',
icon: 'fas fa-language',
description: '自定义论坛各实体的显示名称(12 词条)。',
defaults: {
bbs_forum_display_name: '论坛',
bbs_plate_display_name: '版块',
bbs_posts_display_name: '帖子',
bbs_topic_display_name: '话题',
bbs_tag_display_name: '标签',
bbs_comment_display_name: '回复',
bbs_question_badge_name: '提问',
bbs_question_ok_badge_name: '已解决',
bbs_cat_moderator_name: '分区版主',
bbs_plate_author_name: '超级版主',
bbs_plate_moderator_name: '版主',
bbs_plate_follow_name: '关注',
},
groups: [
{
key: 'display_names',
title: '名词自定义',
icon: 'fas fa-tags',
fields: [
{ key: 'bbs_forum_display_name', label: '论坛', type: 'input', default: '论坛' },
{ key: 'bbs_plate_display_name', label: '版块', type: 'input', default: '版块' },
{ key: 'bbs_posts_display_name', label: '帖子', type: 'input', default: '帖子' },
{ key: 'bbs_topic_display_name', label: '话题', type: 'input', default: '话题' },
{ key: 'bbs_tag_display_name', label: '标签', type: 'input', default: '标签' },
{ key: 'bbs_comment_display_name', label: '回复', type: 'input', default: '回复' },
{ key: 'bbs_question_badge_name', label: '提问徽章', type: 'input', default: '提问' },
{ key: 'bbs_question_ok_badge_name', label: '已解决徽章', type: 'input', default: '已解决' },
{ key: 'bbs_cat_moderator_name', label: '分区版主', type: 'input', default: '分区版主' },
{ key: 'bbs_plate_author_name', label: '超级版主', type: 'input', default: '超级版主' },
{ key: 'bbs_plate_moderator_name', label: '版主', type: 'input', default: '版主' },
{ key: 'bbs_plate_follow_name', label: '关注', type: 'input', default: '关注' },
],
},
],
}
@@ -0,0 +1,64 @@
export const otherSchema = {
key: 'forum.other',
title: '其它设置',
icon: 'fas fa-cog',
description: '投票、版主申请说明、标题字数限制和 URL 别名配置。',
defaults: {
bbs_vote_number_type: 'percent',
bbs_vote_max: 8,
bbs_apply_moderator_desc: '欢迎有热情的用户申请成为版主,协助管理社区秩序。',
bbs_term_thumb: '',
bbs_post_lists_hide_pay_s: false,
bbs_post_title_strlen_limit: 30,
bbs_t_placeholder: '请输入标题',
bbs_c_placeholder: '请输入内容',
bbs_rewrite_suffix_html_s: false,
bbs_plate_rewrite_slug: 'board',
bbs_posts_rewrite_slug: 'topic',
bbs_posts_edit_rewrite_slug: 'topic-edit',
bbs_posts_show_in_rest_s: false,
},
groups: [
{
key: 'vote',
title: '投票',
icon: 'fas fa-poll',
fields: [
{ key: 'bbs_vote_number_type', label: '投票显示', type: 'select', default: 'percent', options: [{ label: '百分比', value: 'percent' }, { label: '票数', value: 'number' }] },
{ key: 'bbs_vote_max', label: '选项上限', type: 'number', default: 8, min: 2, max: 20 },
],
},
{
key: 'moderator_apply',
title: '版主申请',
icon: 'fas fa-user-plus',
fields: [
{ key: 'bbs_apply_moderator_desc', label: '申请说明', type: 'textarea', default: '欢迎有热情的用户申请成为版主,协助管理社区秩序。' },
],
},
{
key: 'misc',
title: '杂项',
icon: 'fas fa-sliders-h',
fields: [
{ key: 'bbs_term_thumb', label: '标签默认缩略图', type: 'media', default: '' },
{ key: 'bbs_post_lists_hide_pay_s', label: '列表隐藏付费标记', type: 'switch', default: false },
{ key: 'bbs_post_title_strlen_limit', label: '标题字数限制', type: 'number', default: 30, min: 5, max: 100, help: '最小 5,最大 100' },
{ key: 'bbs_t_placeholder', label: '标题占位符', type: 'input', default: '请输入标题' },
{ key: 'bbs_c_placeholder', label: '内容占位符', type: 'input', default: '请输入内容' },
],
},
{
key: 'url',
title: 'URL / 别名',
icon: 'fas fa-link',
fields: [
{ key: 'bbs_rewrite_suffix_html_s', label: '.html 后缀', type: 'switch', default: false },
{ key: 'bbs_plate_rewrite_slug', label: '版块别名', type: 'input', default: 'board' },
{ key: 'bbs_posts_rewrite_slug', label: '帖子别名', type: 'input', default: 'topic' },
{ key: 'bbs_posts_edit_rewrite_slug', label: '编辑别名', type: 'input', default: 'topic-edit' },
{ key: 'bbs_posts_show_in_rest_s', label: '古腾堡编辑器', type: 'switch', default: false, help: '开启后帖子可使用 Gutenberg' },
],
},
],
}
@@ -0,0 +1,64 @@
export const permissionsSchema = {
key: 'forum.permissions',
title: '权限配置',
icon: 'fas fa-lock',
description: '发帖限制、按钮显示、帖子付费和版块付费关注配置。',
defaults: {
bbs_posts_add_limit_opt_max: 10,
bbs_plate_add_limit_opt_max: 3,
bbs_show_new_plate: false,
bbs_show_new_topic: true,
bbs_show_apply_moderator: true,
bbs_post_pay_hide_type_s: false,
bbs_post_pay_vip_price_s: false,
bbs_post_pay_vip_1_discount: 80,
bbs_post_pay_vip_2_discount: 50,
bbs_post_pay_price_limit: 1000,
bbs_plate_follow_pay_s: false,
bbs_plate_follow_pay_price: 10,
bbs_plate_follow_pay_type: 'money',
},
groups: [
{
key: 'posting',
title: '发帖限制',
icon: 'fas fa-ban',
fields: [
{ key: 'bbs_posts_add_limit_opt_max', label: '每日发帖上限', type: 'number', default: 10, min: 0, help: '0 = 不限' },
{ key: 'bbs_plate_add_limit_opt_max', label: '建版数量上限', type: 'number', default: 3, min: 0 },
],
},
{
key: 'display_btns',
title: '按钮显示',
icon: 'fas fa-eye',
fields: [
{ key: 'bbs_show_new_plate', label: '始终显示建版按钮', type: 'switch', default: false },
{ key: 'bbs_show_new_topic', label: '始终显示发帖按钮', type: 'switch', default: true },
{ key: 'bbs_show_apply_moderator', label: '始终显示申请版主', type: 'switch', default: true },
],
},
{
key: 'paid_content',
title: '帖子付费',
icon: 'fas fa-money-bill-wave',
fields: [
{ key: 'bbs_post_pay_hide_type_s', label: '启用付费内容', type: 'switch', default: false },
{ key: 'bbs_post_pay_vip_price_s', label: 'VIP 特价', type: 'switch', default: false, dependsOn: { key: 'bbs_post_pay_hide_type_s', value: true } },
{ key: 'bbs_post_pay_vip_1_discount', label: '一级 VIP 折扣 (%)', type: 'number', default: 80, min: 0, max: 100, dependsOn: { key: 'bbs_post_pay_vip_price_s', value: true } },
{ key: 'bbs_post_pay_vip_2_discount', label: '二级 VIP 折扣 (%)', type: 'number', default: 50, min: 0, max: 100, dependsOn: { key: 'bbs_post_pay_vip_price_s', value: true } },
{ key: 'bbs_post_pay_price_limit', label: '最高定价', type: 'number', default: 1000, min: 1, dependsOn: { key: 'bbs_post_pay_hide_type_s', value: true } },
],
},
{
key: 'plate_follow',
title: '版块付费关注',
icon: 'fas fa-heart',
fields: [
{ key: 'bbs_plate_follow_pay_s', label: '启用付费关注', type: 'switch', default: false },
{ key: 'bbs_plate_follow_pay_price', label: '关注价格', type: 'number', default: 10, min: 0, dependsOn: { key: 'bbs_plate_follow_pay_s', value: true } },
{ key: 'bbs_plate_follow_pay_type', label: '支付方式', type: 'select', default: 'money', options: [{ label: '现金', value: 'money' }, { label: '积分', value: 'points' }], dependsOn: { key: 'bbs_plate_follow_pay_s', value: true } },
],
},
],
}
@@ -0,0 +1,60 @@
export const postPageSchema = {
key: 'forum.post_page',
title: '帖子页面',
icon: 'fas fa-file-alt',
description: '帖子页面包屑、评分、高度限制、封面比例和视频静音配置。',
defaults: {
bbs_breadcrumbs_s: true,
bbs_breadcrumbs_home: true,
bbs_breadcrumbs_bbs_home: true,
bbs_breadcrumbs_bbs_home_name: '论坛',
bbs_breadcrumbs_plate_cat: true,
bbs_score_extra_max: 5,
bbs_score_deduct_max: 3,
bbs_posts_maxheight_s: false,
bbs_posts_maxheight: 800,
bbs_posts_cover_ratio: '16:9',
bbs_posts_cover_video_mute: true,
},
groups: [
{
key: 'breadcrumbs',
title: '面包屑',
icon: 'fas fa-angle-double-right',
fields: [
{ key: 'bbs_breadcrumbs_s', label: '显示面包屑', type: 'switch', default: true },
{ key: 'bbs_breadcrumbs_home', label: '显示首页', type: 'switch', default: true, dependsOn: { key: 'bbs_breadcrumbs_s', value: true } },
{ key: 'bbs_breadcrumbs_bbs_home', label: '显示论坛首页', type: 'switch', default: true, dependsOn: { key: 'bbs_breadcrumbs_s', value: true } },
{ key: 'bbs_breadcrumbs_bbs_home_name', label: '论坛首页名称', type: 'input', default: '论坛', dependsOn: { key: 'bbs_breadcrumbs_bbs_home', value: true } },
{ key: 'bbs_breadcrumbs_plate_cat', label: '显示分区', type: 'switch', default: true, dependsOn: { key: 'bbs_breadcrumbs_s', value: true } },
],
},
{
key: 'score',
title: '评分设置',
icon: 'fas fa-star',
fields: [
{ key: 'bbs_score_extra_max', label: '加分上限', type: 'number', default: 5, min: 1, max: 50 },
{ key: 'bbs_score_deduct_max', label: '扣分上限', type: 'number', default: 3, min: 1, max: 50 },
],
},
{
key: 'display',
title: '内容显示',
icon: 'fas fa-expand-arrows-alt',
fields: [
{ key: 'bbs_posts_maxheight_s', label: '内容高度限制', type: 'switch', default: false },
{ key: 'bbs_posts_maxheight', label: '最大高度 (px)', type: 'number', default: 800, min: 300, max: 3000, dependsOn: { key: 'bbs_posts_maxheight_s', value: true } },
],
},
{
key: 'cover',
title: '封面设置',
icon: 'fas fa-image',
fields: [
{ key: 'bbs_posts_cover_ratio', label: '封面比例', type: 'select', default: '16:9', options: [{ label: '16:9', value: '16:9' }, { label: '4:3', value: '4:3' }, { label: '1:1', value: '1:1' }, { label: '3:4', value: '3:4' }] },
{ key: 'bbs_posts_cover_video_mute', label: '视频封面静音', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,44 @@
export const replySchema = {
key: 'forum.reply',
title: '回复评论',
icon: 'fas fa-reply-all',
description: '回复翻页、工具栏功能、表情、代码和快捷回复配置。',
defaults: {
bbs_reply_paginate_type: 'ajax',
bbs_reply_paginate_ias_s: false,
bbs_reply_paginate_ias_max: 3,
bbs_comment_smilie: true,
bbs_comment_code: true,
bbs_comment_img: true,
bbs_comment_upload_img: false,
bbs_comment_quick_s: true,
bbs_comment_quick_often: '不错,学习了\n感谢分享\n期待更新',
bbs_comment_placeholder: '写下你的回复…',
},
groups: [
{
key: 'paginate',
title: '翻页',
icon: 'fas fa-chevron-circle-right',
fields: [
{ key: 'bbs_reply_paginate_type', label: '翻页方式', type: 'select', default: 'ajax', options: [{ label: 'AJAX 加载', value: 'ajax' }, { label: '传统翻页', value: 'page' }] },
{ key: 'bbs_reply_paginate_ias_s', label: '无限滚动', type: 'switch', default: false },
{ key: 'bbs_reply_paginate_ias_max', label: '自动加载页数', type: 'number', default: 3, min: 0, max: 10, dependsOn: { key: 'bbs_reply_paginate_ias_s', value: true } },
],
},
{
key: 'toolbar',
title: '回复工具栏',
icon: 'fas fa-toolbox',
fields: [
{ key: 'bbs_comment_smilie', label: '表情', type: 'switch', default: true },
{ key: 'bbs_comment_code', label: '代码', type: 'switch', default: true },
{ key: 'bbs_comment_img', label: '插图', type: 'switch', default: true },
{ key: 'bbs_comment_upload_img', label: '上传图片', type: 'switch', default: false },
{ key: 'bbs_comment_quick_s', label: '快捷回复', type: 'switch', default: true },
{ key: 'bbs_comment_quick_often', label: '预设短语', type: 'textarea', default: '不错,学习了\n感谢分享\n期待更新', help: '每行一条', dependsOn: { key: 'bbs_comment_quick_s', value: true } },
{ key: 'bbs_comment_placeholder', label: '回复占位符', type: 'input', default: '写下你的回复…' },
],
},
],
}
@@ -0,0 +1,27 @@
export const uploadSchema = {
key: 'forum.upload',
title: '上传权限',
icon: 'fas fa-cloud-upload-alt',
description: '论坛帖子图片、视频和文件的上传大小与格式限制。',
defaults: {
bbs_upload_img_size: 2048,
bbs_image_upload_multiple: 9,
bbs_upload_video_size: 20480,
bbs_upload_file_size: 10240,
bbs_upload_file_mimes: 'jpg,jpeg,png,gif,mp4,zip,rar,pdf',
},
groups: [
{
key: 'limits',
title: '上传限制',
icon: 'fas fa-weight-hanging',
fields: [
{ key: 'bbs_upload_img_size', label: '图片大小 (KB)', type: 'number', default: 2048, min: 100 },
{ key: 'bbs_image_upload_multiple', label: '批量上传数', type: 'number', default: 9, min: 1, max: 20 },
{ key: 'bbs_upload_video_size', label: '视频大小 (KB)', type: 'number', default: 20480, min: 1024 },
{ key: 'bbs_upload_file_size', label: '文件大小 (KB)', type: 'number', default: 10240, min: 100 },
{ key: 'bbs_upload_file_mimes', label: '允许格式', type: 'input', default: 'jpg,jpeg,png,gif,mp4,zip,rar,pdf', help: '逗号分隔' },
],
},
],
}
@@ -0,0 +1,68 @@
export const codeHighlightSchema = {
key: 'global.code-highlight',
title: '代码高亮',
icon: 'fas fa-code',
description: '代码块语法高亮主题、行号、最大高度等配置。',
defaults: {
highlight_kg: true,
highlight_hh: false,
highlight_btn: true,
highlight_maxheight: 400,
highlight_zt: 'enlighter',
highlight_dark_zt: 'monokai',
},
groups: [
{
key: 'basic',
title: '代码高亮设置',
icon: 'fas fa-highlighter',
fields: [
{ key: 'highlight_kg', label: '代码高亮开关', type: 'switch', default: true },
{ key: 'highlight_hh', label: '显示行号', type: 'switch', default: false },
{ key: 'highlight_btn', label: '显示扩展按钮', type: 'switch', default: true, help: '控制原始代码 / 信息 / 新窗口按钮的显示' },
{ key: 'highlight_maxheight', label: '最大高度(px,0=不限)', type: 'number', default: 400, min: 0, max: 2000, help: '代码块最大高度,超出滚动显示。0 表示不限制' },
],
},
{
key: 'theme',
title: '主题设置',
icon: 'fas fa-palette',
fields: [
{
key: 'highlight_zt',
label: '日间默认主题',
type: 'select',
default: 'enlighter',
options: [
{ label: 'Enlighter', value: 'enlighter' },
{ label: 'Bootstrap 4', value: 'bootstrap4' },
{ label: 'Classic', value: 'classic' },
{ label: 'Beyond', value: 'beyond' },
{ label: 'Mowtwo', value: 'mowtwo' },
{ label: 'Eclipse', value: 'eclipse' },
{ label: 'Droide', value: 'droide' },
{ label: 'Minimal', value: 'minimal' },
{ label: 'Rowhammer', value: 'rowhammer' },
{ label: 'Godzilla', value: 'godzilla' },
{ label: 'Dracula', value: 'dracula' },
{ label: 'Atomic', value: 'atomic' },
{ label: 'Monokai', value: 'monokai' },
],
},
{
key: 'highlight_dark_zt',
label: '暗色默认主题',
type: 'select',
default: 'monokai',
options: [
{ label: 'Dracula', value: 'dracula' },
{ label: 'Atomic', value: 'atomic' },
{ label: 'Monokai', value: 'monokai' },
{ label: 'Enlighter', value: 'enlighter' },
{ label: 'Bootstrap 4', value: 'bootstrap4' },
],
},
],
},
],
}
@@ -0,0 +1,99 @@
export const commonSchema = {
key: 'global.common',
title: '常用功能',
icon: 'fas fa-cog',
description: '管理站点常用开关、懒加载、头像源与备案信息等基础配置。',
defaults: {
comment_enabled: true,
lazyload_enabled: true,
lazyload_animation: 'blur',
lazyload_placeholder: '',
lazyload_blur: true,
lazyload_avatar: true,
lazyload_content: false,
lazyload_comment: true,
lazyload_private: true,
lazyload_slider: true,
lazyload_cover: true,
lazyload_other: true,
lazyload_widget: true,
avatar_source: 'cn.cravatar.com',
icp_filing: '',
footer_text: '',
},
groups: [
{
key: 'comment',
title: '评论功能',
icon: 'fas fa-comment',
fields: [
{ key: 'comment_enabled', label: '开启评论', type: 'switch', default: true, help: '全局评论开关,关闭后所有文章不再显示评论区' },
],
},
{
key: 'performance',
title: '性能优化',
icon: 'fas fa-tachometer-alt',
fields: [
{ key: 'lazyload_enabled', label: '图片懒加载', type: 'switch', default: true, help: '开启后页面中的图片将在滚动到可见区域时才加载' },
{
key: 'lazyload_animation',
label: '懒加载动画',
type: 'select',
default: 'blur',
options: [
{ label: '模糊渐显', value: 'blur' },
{ label: '淡入', value: 'fade' },
{ label: '缩放', value: 'scale' },
],
dependsOn: { key: 'lazyload_enabled', value: true },
},
{ key: 'lazyload_placeholder', label: '预载图', type: 'media', default: '', dependsOn: { key: 'lazyload_enabled', value: true }, help: '自定义占位图,留空使用内置默认' },
{ key: 'lazyload_blur', label: '模糊预览', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true }, help: '加载前显示低分辨率模糊预览' },
],
},
{
key: 'lazyload-scope',
title: '懒加载范围',
icon: 'fas fa-layer-group',
fields: [
{ key: 'lazyload_avatar', label: '头像懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_content', label: '文章内容图片懒加载', type: 'switch', default: false, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_comment', label: '评论内容图片懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_private', label: '私信聊天图片懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_slider', label: '幻灯片图片懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_cover', label: '封面图片懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_other', label: '其它图片懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
{ key: 'lazyload_widget', label: '小工具图片懒加载', type: 'switch', default: true, dependsOn: { key: 'lazyload_enabled', value: true } },
],
},
{
key: 'avatar',
title: '头像服务',
icon: 'fas fa-user-circle',
fields: [
{
key: 'avatar_source',
label: '头像源',
type: 'select',
default: 'cn.cravatar.com',
options: [
{ label: 'Cravatar (推荐)', value: 'cn.cravatar.com' },
{ label: 'Gravatar 中国', value: 'cn.gravatar.com' },
{ label: 'Gravatar 国际', value: 'gravatar.com' },
],
help: 'Cravatar 是国内最快的头像服务,推荐使用',
},
],
},
{
key: 'filing',
title: '备案信息',
icon: 'fas fa-shield-alt',
fields: [
{ key: 'icp_filing', label: 'ICP 备案号', type: 'input', placeholder: '例如:京ICP备12345678号', help: '显示在页脚的备案信息' },
{ key: 'footer_text', label: '页脚附加文字', type: 'input', placeholder: '自定义页脚文字', help: '显示在版权信息下方' },
],
},
],
}
@@ -0,0 +1,39 @@
export const customCodeSchema = {
key: 'global.custom-code',
title: '自定义代码',
icon: 'fas fa-code',
description: '自定义 CSS、JS 代码注入。',
defaults: {
custom_css: '',
head_code: '',
foot_code: '',
trackcode: '',
},
groups: [
{
key: 'css',
title: '自定义 CSS',
icon: 'fab fa-css3-alt',
fields: [
{ key: 'custom_css', label: '自定义 CSS', type: 'code', language: 'css', placeholder: '/* 在此输入自定义 CSS */', rows: 10, help: '将在页面 <head> 中加载' },
],
},
{
key: 'code',
title: '头部 & 底部代码',
icon: 'fas fa-code',
fields: [
{ key: 'head_code', label: '头部 HTML 代码', type: 'code', placeholder: '<!-- 支持 meta/link/style/script 等任意 HTML -->', rows: 6, help: '在 <head> 中输出,支持 meta/link/style/script 等任意 HTML' },
{ key: 'foot_code', label: '底部 HTML 代码', type: 'code', placeholder: '<!-- 在 </body> 前输出 -->', rows: 6, help: '在页面底部 </body> 前输出,支持任意 HTML' },
],
},
{
key: 'stats',
title: '统计代码',
icon: 'fas fa-chart-bar',
fields: [
{ key: 'trackcode', label: '统计代码', type: 'code', placeholder: '<!-- 百度统计 / GA / CNZZ / 51la -->', rows: 6, help: '百度统计、Google Analytics、CNZZ、51la 等统计代码,自动在 head 中输出' },
],
},
],
}
@@ -0,0 +1,123 @@
export const emailSchema = {
key: 'global.email',
title: '邮件配置',
icon: 'fas fa-envelope',
description: 'SMTP 发信配置、邮件事件开关与模板自定义。',
defaults: {
email_footer_text: '',
email_site_branding: true,
email_template_mode: 'plain',
email_private_receive_limit: 'all',
email_reg_verify_link_enabled: true,
email_reg_verify_code_enabled: true,
email_reg_success_enabled: true,
email_password_reset_enabled: true,
email_change_code_enabled: true,
email_change_notice_enabled: true,
},
groups: [
{
key: 'global',
title: '全局设置',
icon: 'fas fa-cog',
fields: [
{ key: 'email_footer_text', label: '邮件页脚文字', type: 'textarea', rows: 2, placeholder: '留空则使用站点名称', help: '附加在每封邮件底部的文字' },
{ key: 'email_site_branding', label: '显示站点品牌', type: 'switch', default: true, help: '在邮件开头显示「[站点名]」前缀' },
{ key: 'email_template_mode', label: '邮件格式', type: 'radio', default: 'plain', options: [
{ label: '纯文本', value: 'plain' },
{ label: 'HTML', value: 'html' },
]},
{
key: 'email_private_receive_limit',
label: '私信邮件接收组',
type: 'select',
default: 'all',
options: [
{ label: '所有用户', value: 'all' },
{ label: 'VIP 及以上', value: 'vip' },
{ label: 'VIP2 及以上', value: 'vip2' },
{ label: '仅管理员', value: 'admin' },
],
help: '限制哪些用户组可以收到私信邮件通知',
},
],
},
{
key: 'branding',
title: '邮件品牌',
icon: 'fas fa-signature',
fields: [
{ key: 'mail_showname', label: '发件人名称', type: 'input', default: '', help: '覆盖系统默认发件人名称' },
{ key: 'mail_title_prefix', label: '主题前缀', type: 'input', default: '', help: '自动添加在所有邮件主题前面,如【站点名】' },
{ key: 'mail_description', label: '邮件底部说明', type: 'textarea', rows: 3, default: '', help: '附加在邮件页脚文字之后,留空不显示' },
{ key: 'mail_more_content', label: '邮件附加内容', type: 'textarea', rows: 4, default: '', help: '附加在邮件内容末尾的补充说明' },
],
},
{
key: 'reg_verify_link',
title: '注册验证链接',
icon: 'fas fa-link',
fields: [
{ key: 'email_reg_verify_link_enabled', label: '启用', type: 'switch', default: true, help: '注册后发送验证链接邮件' },
{ key: 'email_reg_verify_link_subject', label: '主题(留空使用默认)', type: 'input', placeholder: '验证你的邮箱地址' },
{ key: 'email_reg_verify_link_content', label: '内容模板(留空使用默认)', type: 'textarea', rows: 4, placeholder: '支持 {username} {site_name} {url}', help: '可用占位符:{username} 用户名、{site_name} 站点名、{url} 验证链接' },
{ key: 'email_reg_verify_link_html', label: 'HTML 格式', type: 'switch', default: false },
],
},
{
key: 'reg_verify_code',
title: '注册验证码',
icon: 'fas fa-keyboard',
fields: [
{ key: 'email_reg_verify_code_enabled', label: '启用', type: 'switch', default: true, help: '注册后发送 6 位验证码邮件' },
{ key: 'email_reg_verify_code_subject', label: '主题(留空使用默认)', type: 'input', placeholder: '邮箱验证码' },
{ key: 'email_reg_verify_code_content', label: '内容模板(留空使用默认)', type: 'textarea', rows: 4, placeholder: '支持 {username} {site_name} {code}', help: '可用占位符:{username} 用户名、{site_name} 站点名、{code} 验证码' },
{ key: 'email_reg_verify_code_html', label: 'HTML 格式', type: 'switch', default: false },
],
},
{
key: 'reg_success',
title: '注册成功通知',
icon: 'fas fa-check-circle',
fields: [
{ key: 'email_reg_success_enabled', label: '启用', type: 'switch', default: true, help: '邮箱验证成功后发送通知邮件' },
{ key: 'email_reg_success_subject', label: '主题(留空使用默认)', type: 'input', placeholder: '邮箱验证成功' },
{ key: 'email_reg_success_content', label: '内容模板(留空使用默认)', type: 'textarea', rows: 4, placeholder: '支持 {username} {site_name}', help: '可用占位符:{username} 用户名、{site_name} 站点名' },
{ key: 'email_reg_success_html', label: 'HTML 格式', type: 'switch', default: false },
],
},
{
key: 'password_reset',
title: '密码重置',
icon: 'fas fa-unlock-alt',
fields: [
{ key: 'email_password_reset_enabled', label: '启用', type: 'switch', default: true, help: '发送密码重置链接邮件' },
{ key: 'email_password_reset_subject', label: '主题(留空使用默认)', type: 'input', placeholder: '重置密码' },
{ key: 'email_password_reset_content', label: '内容模板(留空使用默认)', type: 'textarea', rows: 4, placeholder: '支持 {username} {site_name} {url}', help: '可用占位符:{username} 用户名、{site_name} 站点名、{url} 重置链接' },
{ key: 'email_password_reset_html', label: 'HTML 格式', type: 'switch', default: false },
],
},
{
key: 'change_code',
title: '邮箱变更验证码',
icon: 'fas fa-shield-alt',
fields: [
{ key: 'email_change_code_enabled', label: '启用', type: 'switch', default: true, help: '变更邮箱时发送验证码邮件' },
{ key: 'email_change_code_subject', label: '主题(留空使用默认)', type: 'input', placeholder: '邮箱验证码' },
{ key: 'email_change_code_content', label: '内容模板(留空使用默认)', type: 'textarea', rows: 4, placeholder: '支持 {username} {site_name} {code}', help: '可用占位符:{username} 用户名、{site_name} 站点名、{code} 验证码' },
{ key: 'email_change_code_html', label: 'HTML 格式', type: 'switch', default: false },
],
},
{
key: 'change_notice',
title: '邮箱变更通知',
icon: 'fas fa-bell',
fields: [
{ key: 'email_change_notice_enabled', label: '启用', type: 'switch', default: true, help: '邮箱变更成功后向旧邮箱发送通知' },
{ key: 'email_change_notice_subject', label: '主题(留空使用默认)', type: 'input', placeholder: '账号邮箱已变更' },
{ key: 'email_change_notice_content', label: '内容模板(留空使用默认)', type: 'textarea', rows: 4, placeholder: '支持 {username} {site_name} {new_email}', help: '可用占位符:{username} 用户名、{site_name} 站点名、{new_email} 新邮箱' },
{ key: 'email_change_notice_html', label: 'HTML 格式', type: 'switch', default: false },
],
},
],
}
@@ -0,0 +1,8 @@
export const floatingSchema = {
key: 'global.floating',
title: '右侧悬浮按钮',
icon: 'fas fa-ellipsis-v',
description: '页面右侧浮动按钮的显示与配置。',
defaults: {},
groups: [],
}
@@ -0,0 +1,85 @@
export const i18nSchema = {
key: 'global.i18n',
title: '多语言翻译',
icon: 'fas fa-language',
description: '配置站点语言、语言切换器和翻译管理。',
defaults: {
i18n_enabled: false,
i18n_default_lang: 'zh-CN',
i18n_switcher_position: 'footer',
i18n_auto_detect: true,
i18n_available_langs: 'zh-CN|简体中文\nen|English\nzh-TW|繁體中文\nja|日本語\nko|한국어\nfr|Français\nde|Deutsch\nes|Español\nru|Русский',
i18n_nomenclature: '',
i18n_url_strategy: 'query',
},
groups: [
{
key: 'basic',
title: '基础配置',
icon: 'fas fa-globe',
fields: [
{ key: 'i18n_enabled', label: '启用多语言', type: 'switch', default: false, help: '开启后站点将支持多语言切换' },
{
key: 'i18n_default_lang',
label: '默认语言',
type: 'select',
default: 'zh-CN',
options: [
{ label: '简体中文', value: 'zh-CN' },
{ label: 'English', value: 'en' },
{ label: '繁體中文', value: 'zh-TW' },
{ label: '日本語', value: 'ja' },
{ label: '한국어', value: 'ko' },
{ label: 'Français', value: 'fr' },
{ label: 'Deutsch', value: 'de' },
{ label: 'Español', value: 'es' },
{ label: 'Русский', value: 'ru' },
],
dependsOn: { key: 'i18n_enabled', value: true },
},
{ key: 'i18n_auto_detect', label: '自动检测浏览器语言', type: 'switch', default: true, dependsOn: { key: 'i18n_enabled', value: true }, help: '基于浏览器 Accept-Language 自动切换(AKSRT 方案,区别于 zibll IP 定位方案)' },
],
},
{
key: 'languages',
title: '语言管理',
icon: 'fas fa-language',
fields: [
{ key: 'i18n_available_langs', label: '可用语言列表', type: 'textarea', default: 'zh-CN|简体中文\nen|English\nzh-TW|繁體中文\nja|日本語\nko|한국어\nfr|Français\nde|Deutsch\nes|Español\nru|Русский', dependsOn: { key: 'i18n_enabled', value: true }, help: '每行一个语言:语言代码|显示名称(9 种内置语言)' },
{ key: 'i18n_nomenclature', label: '自定义术语', type: 'code', default: '', dependsOn: { key: 'i18n_enabled', value: true }, help: 'JSON 格式自定义翻译术语(key => 翻译),对齐 zibll nomenclature' },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{
key: 'i18n_switcher_position',
label: '语言切换器位置',
type: 'radio',
default: 'footer',
options: [
{ label: '导航栏', value: 'header' },
{ label: '页脚', value: 'footer' },
{ label: '导航栏+页脚', value: 'both' },
{ label: '隐藏', value: 'none' },
],
dependsOn: { key: 'i18n_enabled', value: true },
},
{
key: 'i18n_url_strategy',
label: 'URL 策略',
type: 'radio',
default: 'query',
options: [
{ label: '查询参数 (?lang=en)', value: 'query' },
{ label: '路径前缀 (/en/page)', value: 'path' },
{ label: '子域名 (en.site.com)', value: 'subdomain' },
],
dependsOn: { key: 'i18n_enabled', value: true },
},
],
},
],
}
@@ -0,0 +1,32 @@
/**
* Global & Functions domain schemas.
* Each key corresponds to a sub-page under the "全局&功能" section.
*/
import { logoSchema } from './logo.js'
import { commonSchema } from './common.js'
import { layoutSchema } from './layout.js'
import { searchSchema } from './search.js'
import { emailSchema } from './email.js'
import { tabbarSchema } from './tabbar.js'
import { floatingSchema } from './floating.js'
import { i18nSchema } from './i18n.js'
import { customCodeSchema } from './custom-code.js'
import { seoSchema } from './seo.js'
import { codeHighlightSchema } from './code-highlight.js'
import { systemNoticeSchema } from './system-notice.js'
export const globalSchemas = {
logo: logoSchema,
common: commonSchema,
layout: layoutSchema,
search: searchSchema,
email: emailSchema,
tabbar: tabbarSchema,
floating: floatingSchema,
i18n: i18nSchema,
'custom-code': customCodeSchema,
seo: seoSchema,
'code-highlight': codeHighlightSchema,
'system-notice': systemNoticeSchema,
}
@@ -0,0 +1,160 @@
export const layoutSchema = {
key: 'global.layout',
title: '显示 & 布局',
icon: 'fas fa-desktop',
description: '全局布局风格、颜色方案、字体设置。',
defaults: {
theme_mode: 'time-auto',
theme_mode_button: ['pc_nav', 'm_menu'],
primary_color: '#1890ff',
theme_skin: 'f04494',
dark_primary_color: '',
border_radius: 8,
theme_main_radius: 12,
container_max_width: 1200,
sidebar_enabled: true,
sidebar_position: 'right',
sidebar_width: 300,
sidebar_home_enabled: true,
sidebar_category_enabled: true,
sidebar_tag_enabled: true,
sidebar_single_enabled: true,
sidebar_page_enabled: true,
sidebar_search_enabled: true,
font_family: 'system',
qj_loading: false,
qj_dh_xs: 'no1',
},
groups: [
{
key: 'loading-animation',
title: '加载动画',
icon: 'fas fa-spinner',
fields: [
{ key: 'qj_loading', label: '全站加载动画', type: 'switch', default: false, help: '开启后页面加载时显示全屏加载动画覆盖层' },
{
key: 'qj_dh_xs',
label: '加载动画样式',
type: 'select',
default: 'no1',
dependsOn: { key: 'qj_loading', value: true },
options: [
{ label: '样式 1', value: 'no1' },
{ label: '样式 2', value: 'no2' },
{ label: '样式 3', value: 'no3' },
{ label: '样式 4', value: 'no4' },
{ label: '样式 5', value: 'no5' },
{ label: '样式 6', value: 'no6' },
{ label: '样式 7', value: 'no7' },
{ label: '样式 8', value: 'no8' },
{ label: '样式 9', value: 'no9' },
{ label: '样式 10', value: 'no10' },
],
help: '10 种加载动画样式可选',
},
],
},
{
key: 'color',
title: '色彩方案',
icon: 'fas fa-palette',
fields: [
{
key: 'theme_mode',
label: '默认主题模式',
type: 'radio',
default: 'time-auto',
options: [
{ label: '浅色', value: 'white-theme' },
{ label: '深色', value: 'dark-theme' },
{ label: '跟随系统', value: 'time-auto' },
],
},
{
key: 'theme_mode_button',
label: '主题切换按钮位置',
type: 'checkbox',
default: ['pc_nav', 'm_menu'],
options: [
{ label: 'PC 顶部导航', value: 'pc_nav' },
{ label: '移动端菜单', value: 'm_menu' },
],
help: '控制主题切换按钮在哪些位置显示',
},
{ key: 'primary_color', label: '主题色', type: 'color', default: '#f04494', help: '按钮、链接和强调元素的主色调' },
{
key: 'theme_skin',
label: '预设主题色',
type: 'palette',
default: 'f04494',
options: [
{ label: '玫红', value: 'ff1856' },
{ label: '粉色', value: 'f04494' },
{ label: '紫色', value: 'ae53f3' },
{ label: '靛蓝', value: '627bf5' },
{ label: '天蓝', value: '00a2e3' },
{ label: '青绿', value: '16b597' },
{ label: '翠绿', value: '36af18' },
{ label: '黄绿', value: '8fb107' },
{ label: '棕金', value: 'b18c07' },
{ label: '橘橙', value: 'e06711' },
{ label: '朱红', value: 'f74735' },
],
help: '选择预设主题色,将覆盖上方自定义主题色',
},
{ key: 'dark_primary_color', label: '暗色模式主题色', type: 'color', default: '', help: '暗色模式下独立的主题色,留空则跟随浅色模式' },
{ key: 'border_radius', label: '全局圆角 (px)', type: 'slider', min: 0, max: 20, step: 1, default: 8 },
{ key: 'theme_main_radius', label: '卡片圆角 (px)', type: 'number', min: 0, max: 30, default: 12, help: '独立卡片圆角,留空则使用全局圆角 +4' },
],
},
{
key: 'layout',
title: '布局设置',
icon: 'fas fa-columns',
fields: [
{ key: 'container_max_width', label: '内容最大宽度 (px)', type: 'select', default: 1200, options: [
{ label: '1200px', value: 1200 },
{ label: '1320px', value: 1320 },
{ label: '1440px', value: 1440 },
{ label: '1600px', value: 1600 },
{ label: '1800px', value: 1800 },
{ label: '2000px', value: 2000 },
{ label: '2200px', value: 2200 },
{ label: '全宽', value: 0 },
]},
{ key: 'sidebar_enabled', label: '开启侧边栏', type: 'switch', default: true },
{ key: 'sidebar_position', label: '侧边栏位置', type: 'radio', default: 'right', dependsOn: { key: 'sidebar_enabled', value: true }, options: [
{ label: '左侧', value: 'left' },
{ label: '右侧', value: 'right' },
]},
{ key: 'sidebar_width', label: '侧边栏宽度 (px)', type: 'number', default: 300, min: 200, max: 400, step: 10, dependsOn: { key: 'sidebar_enabled', value: true } },
],
},
{
key: 'sidebar-scope',
title: '侧边栏显示范围',
icon: 'fas fa-th-list',
fields: [
{ key: 'sidebar_home_enabled', label: '首页侧边栏', type: 'switch', default: true, dependsOn: { key: 'sidebar_enabled', value: true } },
{ key: 'sidebar_category_enabled', label: '分类页侧边栏', type: 'switch', default: true, dependsOn: { key: 'sidebar_enabled', value: true } },
{ key: 'sidebar_tag_enabled', label: '标签页侧边栏', type: 'switch', default: true, dependsOn: { key: 'sidebar_enabled', value: true } },
{ key: 'sidebar_single_enabled', label: '文章页侧边栏', type: 'switch', default: true, dependsOn: { key: 'sidebar_enabled', value: true } },
{ key: 'sidebar_page_enabled', label: '页面侧边栏', type: 'switch', default: true, dependsOn: { key: 'sidebar_enabled', value: true } },
{ key: 'sidebar_search_enabled', label: '搜索页侧边栏', type: 'switch', default: true, dependsOn: { key: 'sidebar_enabled', value: true } },
],
},
{
key: 'typography',
title: '字体设置',
icon: 'fas fa-font',
fields: [
{ key: 'font_family', label: '正文字体', type: 'select', default: 'system', options: [
{ label: '系统默认', value: 'system' },
{ label: '思源黑体', value: 'noto-sans-sc' },
{ label: '思源宋体', value: 'noto-serif-sc' },
{ label: '自定义', value: 'custom' },
]},
],
},
],
}
@@ -0,0 +1,36 @@
export const logoSchema = {
key: 'global.logo',
title: 'LOGO & 品牌',
icon: 'fas fa-image',
description: '管理站点 Logo、站点图标和品牌标识。',
defaults: {
site_logo: '',
site_logo_dark: '',
site_favicon: '',
site_icon: '',
logo_width: 150,
logo_text: '',
},
groups: [
{
key: 'logo',
title: 'Logo 设置',
icon: 'fas fa-image',
fields: [
{ key: 'site_logo', label: '站点 Logo', type: 'media', help: '建议尺寸 300x80,支持 PNG/SVG 透明背景' },
{ key: 'site_logo_dark', label: '暗色模式 Logo', type: 'media', help: '暗色模式下显示的 Logo,留空则使用默认 Logo' },
{ key: 'logo_width', label: 'Logo 宽度 (px)', type: 'number', min: 50, max: 400, step: 10, help: '导航栏中 Logo 显示宽度' },
{ key: 'logo_text', label: 'Logo 文字', type: 'input', placeholder: '当无 Logo 图片时显示的文字', help: '同时作为首页标题和 alt 文本使用' },
],
},
{
key: 'favicon',
title: '站点图标',
icon: 'fas fa-fingerprint',
fields: [
{ key: 'site_favicon', label: '浏览器图标 (Favicon)', type: 'media', help: '建议 32x32 或 16x16 的 ICO/PNG 文件' },
{ key: 'site_icon', label: '移动端图标', type: 'media', help: '建议 192x192 的 PNG,用于移动端添加到桌面' },
],
},
],
}
@@ -0,0 +1,135 @@
export const searchSchema = {
key: 'global.search',
title: '搜索功能',
icon: 'fas fa-search',
description: '搜索模式、内容类型切换、搜索建议、热门搜索配置。',
defaults: {
search_mode: 'default',
search_type: 'default',
search_history_enabled: true,
hot_search_enabled: true,
hot_search_keywords: '',
search_placeholder: '开启精彩搜索',
search_suggestions_enabled: false,
search_posts: false,
search_no_page: false,
search_exclude_cats: '',
search_cat: false,
search_cat_in: '',
search_more_cat_obj: true,
search_custom_key_s: false,
search_custom_key: 'title,content',
search_facets: false,
search_facets_order: 'category\ntag',
search_type_post: true,
search_type_user: false,
search_type_category: true,
search_type_tag: true,
search_type_product: false,
search_type_topic: false,
search_default_type: 'post',
search_ms_enabled: false,
search_ms_api_url: '',
search_ms_api_key: '',
search_ms_index_prefix: 'aksrt',
search_ms_synonyms: '',
},
groups: [
{
key: 'basic',
title: '搜索基础',
icon: 'fas fa-search',
fields: [
{
key: 'search_mode',
label: '搜索模式',
type: 'radio',
default: 'default',
options: [
{ label: '默认搜索', value: 'default' },
{ label: 'AJAX 实时搜索', value: 'ajax' },
{ label: '跳转搜索', value: 'redirect' },
],
},
{ key: 'search_placeholder', label: '搜索框提示文字', type: 'input', placeholder: '开启精彩搜索' },
],
},
{
key: 'content-types',
title: '搜索内容类型',
icon: 'fas fa-layer-group',
fields: [
{ key: 'search_type_post', label: '文章', type: 'switch', default: true },
{ key: 'search_type_user', label: '用户', type: 'switch', default: false },
{ key: 'search_type_category', label: '分类', type: 'switch', default: true },
{ key: 'search_type_tag', label: '标签', type: 'switch', default: true },
{ key: 'search_type_product', label: '商品', type: 'switch', default: false },
{ key: 'search_type_topic', label: '帖子', type: 'switch', default: false },
{
key: 'search_default_type',
label: '默认类型',
type: 'select',
default: 'post',
options: [
{ label: '文章', value: 'post' },
{ label: '用户', value: 'user' },
{ label: '分类', value: 'category' },
{ label: '标签', value: 'tag' },
{ label: '商品', value: 'product' },
{ label: '帖子', value: 'topic' },
],
},
],
},
{
key: 'features',
title: '搜索功能',
icon: 'fas fa-magic',
fields: [
{ key: 'search_history_enabled', label: '搜索历史', type: 'switch', default: true, help: '记录用户最近的搜索关键词' },
{ key: 'hot_search_enabled', label: '热门搜索', type: 'switch', default: true, help: '在搜索框下方展示热门搜索词' },
{ key: 'hot_search_keywords', label: '热门搜索关键词', type: 'textarea', placeholder: '每行一个关键词', dependsOn: { key: 'hot_search_enabled', value: true }, rows: 3, help: '手动设置热门搜索关键词,留空则自动统计' },
{ key: 'search_suggestions_enabled', label: '搜索建议', type: 'switch', default: false, help: '输入时显示搜索建议(需要 AJAX 搜索模式)' },
{ key: 'search_posts', label: '搜索框热门文章', type: 'switch', default: false, help: '在搜索面板中显示热门文章列表' },
{ key: 'search_no_page', label: '排除页面', type: 'switch', default: false, help: '搜索结果中排除页面(仅显示文章)' },
{ key: 'search_exclude_cats', label: '排除分类', type: 'textarea', placeholder: '分类 ID,逗号分隔', rows: 2, default: '', help: '搜索结果中排除的分类 ID(逗号分隔)' },
{ key: 'search_custom_key_s', label: '自定义匹配范围', type: 'switch', default: false, help: '启用后可配置搜索匹配字段范围' },
{ key: 'search_custom_key', label: '匹配字段', type: 'textarea', placeholder: 'title,content,excerpt,category,tag,author', rows: 2, default: 'title,content', dependsOn: { key: 'search_custom_key_s', value: true }, help: '搜索匹配字段(逗号分隔:title/content/excerpt/category/tag/author)' },
{ key: 'search_facets', label: '搜索结果筛选', type: 'switch', default: false, help: '启用搜索结果 taxonomy 筛选面板' },
{ key: 'search_facets_order', label: '筛选排序', type: 'textarea', rows: 3, default: 'category\ntag', dependsOn: { key: 'search_facets', value: true }, help: '筛选 fieldset 显示顺序(每行一个 taxonomy slug)' },
],
},
{
key: 'category-search',
title: '分类搜索',
icon: 'fas fa-folder-open',
fields: [
{ key: 'search_cat', label: '启用分类搜索', type: 'switch', default: false, help: '在搜索框旁显示分类选择器' },
{ key: 'search_cat_in', label: '默认分类', type: 'input', default: '', help: '默认搜索的分类 ID(留空为全部分类)' },
{ key: 'search_more_cat_obj', label: '显示更多分类', type: 'switch', default: true, help: '展开显示全部分类列表' },
],
},
{
key: 'popular',
title: '热门搜索',
icon: 'fas fa-fire',
fields: [
{ key: 'search_popular_title', label: '标题', type: 'input', default: '热门搜索', help: '热门搜索区域标题,留空使用默认' },
{ key: 'search_popular_key_num', label: '显示数量', type: 'number', default: 20, min: 1, max: 50, help: '热门搜索显示条数' },
{ key: 'search_popular_sticky', label: '置顶词(每行一个)', type: 'textarea', rows: 3, default: '', help: '置顶搜索词始终显示在最前面' },
],
},
{
key: 'meilisearch',
title: 'Meilisearch 集成',
icon: 'fas fa-bolt',
fields: [
{ key: 'search_ms_enabled', label: '启用 Meilisearch', type: 'switch', default: false, help: '启用后搜索请求将发送至 Meilisearch 服务器' },
{ key: 'search_ms_api_url', label: 'API 地址', type: 'input', default: '', help: 'Meilisearch 服务器 URL(如 http://localhost:7700)' },
{ key: 'search_ms_api_key', label: 'API Key', type: 'input', default: '', help: 'Meilisearch Search API Key(只读密钥)' },
{ key: 'search_ms_index_prefix', label: '索引前缀', type: 'input', default: 'aksrt', help: '索引名称前缀(实际索引名为 {prefix}_posts)' },
{ key: 'search_ms_synonyms', label: '同义词(JSON)', type: 'textarea', rows: 3, default: '', help: 'Meilisearch 同义词配置,JSON 格式(如 {"手机": ["phone","mobile"]})' },
],
},
],
}
@@ -0,0 +1,102 @@
export const seoSchema = {
key: 'global.seo',
title: 'SEO 优化',
icon: 'fas fa-search',
description: '站点标题、描述、关键词、Sitemap 等搜索引擎优化设置。',
defaults: {
seo_enabled: true,
seo_ai_enabled: false,
seo_connector: '-',
seo_title: '',
seo_keywords: '',
seo_description: '',
ai_seo_title_prompt: '',
ai_seo_keywords_prompt: '',
ai_seo_description_prompt: '',
seo_baidu_push: false,
seo_baidu_normal: false,
seo_baidu_fast: false,
seo_baidu_token: '',
seo_image_optimize: true,
seo_image_default: '',
seo_image_always_default: false,
seo_auto_alt: true,
seo_go_link: true,
seo_go_link_nonce: true,
seo_go_link_post: true,
seo_go_link_exclude: '',
seo_no_category: false,
seo_jsonld: true,
seo_jsonld_single: true,
seo_jsonld_page: true,
},
groups: [
{
key: 'basic',
title: 'SEO 基础',
icon: 'fas fa-globe',
fields: [
{ key: 'seo_enabled', label: '启用核心 SEO 优化', type: 'switch', default: true },
{ key: 'seo_ai_enabled', label: '启用 AI SEO 生成', type: 'switch', default: false },
{ key: 'seo_connector', label: '标题连接符', type: 'input', default: '-', placeholder: '例如:- 或 |' },
{ key: 'seo_title', label: '站点 SEO 标题', type: 'textarea', rows: 2, default: '' },
{ key: 'seo_keywords', label: '站点 SEO 关键词', type: 'textarea', rows: 3, default: '' },
{ key: 'seo_description', label: '站点 SEO 描述', type: 'textarea', rows: 4, default: '' },
],
},
{
key: 'ai-seo',
title: 'AI SEO',
icon: 'fas fa-robot',
fields: [
{ key: 'ai_seo_title_prompt', label: '标题提示词', type: 'textarea', rows: 3, default: '' },
{ key: 'ai_seo_keywords_prompt', label: '关键词提示词', type: 'textarea', rows: 3, default: '' },
{ key: 'ai_seo_description_prompt', label: '描述提示词', type: 'textarea', rows: 3, default: '' },
],
},
{
key: 'baidu',
title: '百度推送',
icon: 'fas fa-paper-plane',
fields: [
{ key: 'seo_baidu_push', label: '启用百度自动推送', type: 'switch', default: false },
{ key: 'seo_baidu_normal', label: '普通收录推送', type: 'switch', default: false },
{ key: 'seo_baidu_fast', label: '快速收录推送', type: 'switch', default: false },
{ key: 'seo_baidu_token', label: '百度推送 Token', type: 'input', default: '', placeholder: '百度资源平台 Token' },
],
},
{
key: 'image',
title: '图片 SEO',
icon: 'fas fa-image',
fields: [
{ key: 'seo_image_optimize', label: '优化搜索引擎图片展示', type: 'switch', default: true },
{ key: 'seo_image_default', label: '默认分享图 / SEO 图', type: 'media', default: '' },
{ key: 'seo_image_always_default', label: '固定使用默认图', type: 'switch', default: false },
{ key: 'seo_auto_alt', label: '自动补全图片 alt', type: 'switch', default: true },
],
},
{
key: 'redirect',
title: '外链重定向',
icon: 'fas fa-external-link-alt',
fields: [
{ key: 'seo_go_link', label: '启用外链重定向', type: 'switch', default: true },
{ key: 'seo_go_link_nonce', label: '启用外链鉴权', type: 'switch', default: true },
{ key: 'seo_go_link_post', label: '文章内容链接走重定向', type: 'switch', default: true },
{ key: 'seo_go_link_exclude', label: '重定向排除域名', type: 'textarea', rows: 4, default: '', placeholder: '每行一个域名' },
],
},
{
key: 'advanced',
title: '高级 SEO',
icon: 'fas fa-sliders-h',
fields: [
{ key: 'seo_no_category', label: '分类 URL 去掉 category', type: 'switch', default: false },
{ key: 'seo_jsonld', label: '启用 JSON-LD', type: 'switch', default: true },
{ key: 'seo_jsonld_single', label: '文章页输出 JSON-LD', type: 'switch', default: true },
{ key: 'seo_jsonld_page', label: '页面输出 JSON-LD', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,149 @@
export const systemNoticeSchema = {
key: 'global.system-notice',
title: '弹窗通知',
icon: 'fas fa-bullhorn',
description: '全站弹窗公告配置,支持按用户身份定向、多按钮组、弹窗尺寸与过期周期。',
defaults: {
system_notice_enabled: true,
system_notice_policy: '',
system_notice_title: '',
system_notice_content: '',
system_notice_btn1_text: '',
system_notice_btn1_link: '',
system_notice_btn1_color: 'primary',
system_notice_btn2_text: '',
system_notice_btn2_link: '',
system_notice_btn2_color: 'primary',
system_notice_btn3_text: '',
system_notice_btn3_link: '',
system_notice_btn3_color: 'primary',
system_notice_btn4_text: '',
system_notice_btn4_link: '',
system_notice_btn4_color: 'primary',
system_notice_size: '',
system_notice_radius: false,
system_notice_class: '',
system_notice_title_icon: '',
system_notice_title_class: '',
system_notice_title_style: '',
system_notice_expires: 24,
},
groups: [
{
key: 'basic',
title: '公告设置',
icon: 'fas fa-bullhorn',
fields: [
{ key: 'system_notice_enabled', label: '启用系统公告', type: 'switch', default: true },
{
key: 'system_notice_policy',
label: '显示对象',
type: 'select',
default: '',
options: [
{ label: '所有访客', value: '' },
{ label: '仅登录用户', value: 'signin' },
{ label: '仅 VIP 会员', value: 'vip' },
{ label: '仅非 VIP', value: 'free' },
{ label: '仅认证用户', value: 'auth' },
],
dependsOn: { key: 'system_notice_enabled', value: true },
},
{ key: 'system_notice_title', label: '公告标题', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_content', label: '公告内容', type: 'textarea', default: '', rows: 5, dependsOn: { key: 'system_notice_enabled', value: true }, help: '支持 HTML 标签' },
],
},
{
key: 'buttons',
title: '按钮组(留空则不显示)',
icon: 'fas fa-th-large',
fields: [
{ key: 'system_notice_btn1_text', label: '按钮 1 文案', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn1_link', label: '按钮 1 链接', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true }, help: '可选,填写后按钮变为链接' },
{ key: 'system_notice_btn1_color', label: '按钮 1 颜色', type: 'select', default: 'primary', options: [
{ label: '主题色', value: 'primary' },
{ label: '成功绿', value: 'success' },
{ label: '警告橙', value: 'warning' },
{ label: '危险红', value: 'danger' },
{ label: '信息蓝', value: 'info' },
{ label: '深紫', value: 'purple' },
{ label: '深灰', value: 'dark' },
], dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn2_text', label: '按钮 2 文案', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn2_link', label: '按钮 2 链接', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn2_color', label: '按钮 2 颜色', type: 'select', default: 'primary', options: [
{ label: '主题色', value: 'primary' },
{ label: '成功绿', value: 'success' },
{ label: '警告橙', value: 'warning' },
{ label: '危险红', value: 'danger' },
{ label: '信息蓝', value: 'info' },
{ label: '深紫', value: 'purple' },
{ label: '深灰', value: 'dark' },
], dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn3_text', label: '按钮 3 文案', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn3_link', label: '按钮 3 链接', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn3_color', label: '按钮 3 颜色', type: 'select', default: 'primary', options: [
{ label: '主题色', value: 'primary' },
{ label: '成功绿', value: 'success' },
{ label: '警告橙', value: 'warning' },
{ label: '危险红', value: 'danger' },
{ label: '信息蓝', value: 'info' },
{ label: '深紫', value: 'purple' },
{ label: '深灰', value: 'dark' },
], dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn4_text', label: '按钮 4 文案', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn4_link', label: '按钮 4 链接', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_btn4_color', label: '按钮 4 颜色', type: 'select', default: 'primary', options: [
{ label: '主题色', value: 'primary' },
{ label: '成功绿', value: 'success' },
{ label: '警告橙', value: 'warning' },
{ label: '危险红', value: 'danger' },
{ label: '信息蓝', value: 'info' },
{ label: '深紫', value: 'purple' },
{ label: '深灰', value: 'dark' },
], dependsOn: { key: 'system_notice_enabled', value: true } },
],
},
{
key: 'style',
title: '样式设置',
icon: 'fas fa-paint-brush',
fields: [
{
key: 'system_notice_size',
label: '弹窗尺寸',
type: 'select',
default: '',
options: [
{ label: '默认', value: '' },
{ label: '迷你', value: 'modal-mini' },
{ label: '小号', value: 'modal-sm' },
{ label: '大号', value: 'modal-lg' },
],
dependsOn: { key: 'system_notice_enabled', value: true },
},
{ key: 'system_notice_radius', label: '按钮圆角', type: 'switch', default: false, dependsOn: { key: 'system_notice_enabled', value: true }, help: '开启后弹窗按钮使用圆角样式' },
{ key: 'system_notice_class', label: '公告样式类', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
{ key: 'system_notice_title_icon', label: '标题图标', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true }, help: '如 fas fa-bullhorn' },
{ key: 'system_notice_title_class', label: '标题背景配色', type: 'select', default: '', dependsOn: { key: 'system_notice_enabled', value: true }, options: [
{ label: '无', value: '' },
{ label: '炫彩黄', value: 'jb-yellow' },
{ label: '炫彩蓝', value: 'jb-blue' },
{ label: '炫彩绿', value: 'jb-green' },
{ label: '炫彩紫', value: 'jb-purple' },
{ label: '炫彩红', value: 'jb-red' },
{ label: '炫彩橙', value: 'jb-orange' },
], help: '弹窗标题区域的背景配色方案' },
{ key: 'system_notice_title_style', label: '标题样式', type: 'input', default: '', dependsOn: { key: 'system_notice_enabled', value: true } },
],
},
{
key: 'expire',
title: '过期设置',
icon: 'fas fa-clock',
fields: [
{ key: 'system_notice_expires', label: '弹窗周期(小时)', type: 'number', default: 24, min: 0, max: 720, dependsOn: { key: 'system_notice_enabled', value: true }, help: '0 表示永不过期' },
],
},
],
}
@@ -0,0 +1,8 @@
export const tabbarSchema = {
key: 'global.tabbar',
title: '手机底部Tab',
icon: 'fas fa-mobile-alt',
description: '移动端底部导航栏配置。',
defaults: {},
groups: [],
}
@@ -0,0 +1,991 @@
/**
* Page Display domain schemas.
* Each key corresponds to a sub-page under the "页面&显示" section.
*/
export const pageDisplaySchemas = {
/**
* Header navigation settings
*/
'header-nav': {
key: 'page_display.header-nav',
title: '顶部导航栏',
icon: 'fas fa-bars',
description: '配置导航栏布局、菜单结构、搜索入口和用户入口。',
defaults: {
header_fixed: true,
header_search_enabled: true,
header_user_menu: true,
header_publish_btn: true,
header_mobile_drawer: true,
header_nav_style: 'default',
header_max_width: 1200,
header_scroll_down_hide: false,
header_layout: '2',
mobile_header_layout: 'center',
mobile_navbar_align: 'left',
header_newposts_enabled: true,
header_newposts_text: '<i class="fa fa-pencil"></i> 发布',
header_newposts_radius: 20,
header_newposts_class: '',
header_theme_custom: false,
header_theme_bg_custom: '',
header_theme_bg: '',
header_theme_color_custom: '',
},
groups: [
{
key: 'layout',
title: '导航栏布局',
icon: 'fas fa-th-large',
fields: [
{ key: 'header_fixed', label: '固定导航栏', type: 'switch', default: true, help: '页面滚动时导航栏保持在顶部' },
{ key: 'header_nav_style', label: '导航栏风格', type: 'radio', default: 'default', options: [
{ label: '默认', value: 'default' },
{ label: '透明', value: 'transparent' },
{ label: '毛玻璃', value: 'blur' },
]},
{ key: 'header_max_width', label: '导航栏最大宽度', type: 'select', default: 1200, options: [
{ label: '跟随内容', value: 0 },
{ label: '1080px', value: 1080 },
{ label: '1200px', value: 1200 },
{ label: '1320px', value: 1320 },
]},
{ key: 'header_scroll_down_hide', label: '下滑隐藏导航', type: 'switch', default: false, help: '页面向下滑动时自动隐藏导航栏' },
],
},
{
key: 'layout-type',
title: '布局类型',
icon: 'fas fa-columns',
fields: [
{
key: 'header_layout',
label: '电脑端布局',
type: 'radio',
default: '2',
options: [
{ label: '布局 1(经典)', value: '1' },
{ label: '布局 2(内联搜索)', value: '2' },
{ label: '布局 3(紧凑)', value: '3' },
],
help: '不同布局切换导航 DOM 结构',
},
{
key: 'mobile_header_layout',
label: '移动端布局',
type: 'radio',
default: 'center',
options: [
{ label: '居中(含搜索按钮)', value: 'center' },
{ label: '靠左', value: 'left' },
],
},
{
key: 'mobile_navbar_align',
label: '移动端菜单方向',
type: 'radio',
default: 'left',
options: [
{ label: '顶部(关闭手势)', value: 'top' },
{ label: '左侧滑出', value: 'left' },
{ label: '右侧滑出', value: 'right' },
],
},
],
},
{
key: 'newposts',
title: '发布按钮',
icon: 'fas fa-pen',
fields: [
{ key: 'header_newposts_enabled', label: '启用发布按钮', type: 'switch', default: true, help: '导航栏显示前台发布入口' },
{ key: 'header_newposts_text', label: '按钮文案', type: 'input', default: '<i class="fa fa-pencil"></i> 发布', dependsOn: { key: 'header_newposts_enabled', value: true } },
{ key: 'header_newposts_radius', label: '圆角 (px)', type: 'number', default: 20, min: 0, max: 30, dependsOn: { key: 'header_newposts_enabled', value: true } },
{ key: 'header_newposts_class', label: '自定义 CSS 类', type: 'input', default: '', dependsOn: { key: 'header_newposts_enabled', value: true } },
],
},
{
key: 'color',
title: '导航配色',
icon: 'fas fa-palette',
fields: [
{ key: 'header_theme_custom', label: '自定义导航配色', type: 'switch', default: false, help: '启用后覆盖导航栏默认配色' },
{ key: 'header_theme_bg_custom', label: '导航背景色', type: 'color', default: '', dependsOn: { key: 'header_theme_custom', value: true } },
{ key: 'header_theme_bg', label: '导航背景色(备选)', type: 'color', default: '', dependsOn: { key: 'header_theme_custom', value: true } },
{ key: 'header_theme_color_custom', label: '导航文字色', type: 'color', default: '', dependsOn: { key: 'header_theme_custom', value: true } },
],
},
{
key: 'components',
title: '导航组件',
icon: 'fas fa-puzzle-piece',
fields: [
{ key: 'header_search_enabled', label: '搜索入口', type: 'switch', default: true },
{ key: 'header_user_menu', label: '用户菜单', type: 'switch', default: true },
{ key: 'header_publish_btn', label: '发布按钮', type: 'switch', default: true, help: '管理员可见的前台发布入口' },
{ key: 'header_mobile_drawer', label: '移动端抽屉导航', type: 'switch', default: true },
],
},
],
},
/**
* Category page settings
*/
category: {
key: 'page_display.category',
title: '分类页面',
icon: 'fas fa-folder-open',
description: '为分类归档页配置头图、简介、列表模式、筛选条和侧边栏。',
defaults: {
category_cover_enabled: true,
category_desc_enabled: true,
category_header_style: 'cover',
category_list_mode: 'grid',
category_filter_bar: true,
category_sidebar: true,
category_per_page: 12,
category_default_cover: '',
category_post_count: true,
category_orderby: 'modified',
},
groups: [
{
key: 'header',
title: '分类头图',
icon: 'fas fa-image',
fields: [
{ key: 'category_header_style', label: '头部风格', type: 'radio', default: 'cover', options: [
{ label: '封面图', value: 'cover' },
{ label: '简洁标题', value: 'simple' },
{ label: '隐藏', value: 'none' },
]},
{ key: 'category_cover_enabled', label: '显示封面图', type: 'switch', default: true, dependsOn: { key: 'category_header_style', value: 'cover' } },
{ key: 'category_desc_enabled', label: '显示分类简介', type: 'switch', default: true },
{ key: 'category_default_cover', label: '默认封面图', type: 'upload', default: '', help: '未设置分类封面时使用的默认图片' },
],
},
{
key: 'list',
title: '列表设置',
icon: 'fas fa-list',
fields: [
{ key: 'category_list_mode', label: '列表模式', type: 'radio', default: 'grid', options: [
{ label: '网格', value: 'grid' },
{ label: '列表', value: 'list' },
{ label: '紧凑', value: 'compact' },
]},
{ key: 'category_per_page', label: '每页文章数', type: 'number', default: 12, min: 4, max: 48 },
{ key: 'category_filter_bar', label: '筛选条', type: 'switch', default: true, help: '子分类筛选和排序' },
{ key: 'category_sidebar', label: '侧边栏', type: 'switch', default: true },
{ key: 'category_post_count', label: '显示文章数', type: 'switch', default: true, help: '在分类列表中显示每篇文章的浏览次数' },
],
},
{
key: 'orderby',
title: '排序设置',
icon: 'fas fa-sort',
fields: [
{ key: 'category_orderby', label: '默认排序', type: 'select', default: 'modified', options: [
{ label: '最近更新', value: 'modified' },
{ label: '发布时间', value: 'date' },
{ label: '浏览数', value: 'views' },
{ label: '评论数', value: 'comments' },
{ label: '点赞数', value: 'likes' },
]},
],
},
],
},
/**
* Tag page settings
*/
tag: {
key: 'page_display.tag',
title: '标签页面',
icon: 'fas fa-tags',
description: '为标签归档页配置展示样式和布局。',
defaults: {
tag_header_style: 'simple',
tag_default_cover: '',
tag_list_mode: 'grid',
tag_sidebar: true,
tag_per_page: 12,
tag_post_count: true,
tag_orderby: 'count',
},
groups: [
{
key: 'header',
title: '标签头图',
icon: 'fas fa-tag',
fields: [
{ key: 'tag_header_style', label: '头部风格', type: 'radio', default: 'simple', options: [
{ label: '简洁标题', value: 'simple' },
{ label: '封面图', value: 'cover' },
{ label: '隐藏', value: 'none' },
]},
{ key: 'tag_default_cover', label: '默认封面图', type: 'upload', default: '' },
],
},
{
key: 'list',
title: '列表设置',
icon: 'fas fa-list',
fields: [
{ key: 'tag_list_mode', label: '列表模式', type: 'radio', default: 'grid', options: [
{ label: '网格', value: 'grid' },
{ label: '列表', value: 'list' },
]},
{ key: 'tag_per_page', label: '每页文章数', type: 'number', default: 12, min: 4, max: 48 },
{ key: 'tag_sidebar', label: '侧边栏', type: 'switch', default: true },
{ key: 'tag_post_count', label: '显示文章数', type: 'switch', default: true },
],
},
{
key: 'orderby',
title: '排序设置',
icon: 'fas fa-sort',
fields: [
{ key: 'tag_orderby', label: '默认排序', type: 'select', default: 'count', options: [
{ label: '文章数', value: 'count' },
{ label: '名称', value: 'name' },
{ label: '最近更新', value: 'modified' },
]},
],
},
],
},
/**
* User homepage settings
*/
'user-home': {
key: 'page_display.user-home',
title: '用户主页',
icon: 'fas fa-user-circle',
description: '配置用户公开主页的布局、Tab 展示和互动功能。',
defaults: {
user_home_tabs: 'posts,comments,favorites,credits,product,plate,forum,follow',
user_home_tabs_order: 'posts,comments,favorites,credits,product,plate,forum,follow',
user_home_tabs_pc_hide: '',
user_home_tabs_mobile_hide: '',
user_home_sidebar: true,
user_home_cover: true,
user_home_follow: true,
user_home_posts_per_page: 10,
user_home_avatar: true,
user_home_name: true,
user_home_desc: true,
user_home_stats: true,
user_home_social: true,
author_main_tab_swiper: false,
user_home_message: true,
user_home_private: true,
user_home_paging_ajax: true,
},
groups: [
{
key: 'layout',
title: '主页布局',
icon: 'fas fa-th-large',
fields: [
{ key: 'user_home_cover', label: '封面区域', type: 'switch', default: true, help: '用户主页顶部封面图' },
{ key: 'user_home_sidebar', label: '侧边栏', type: 'switch', default: true },
{ key: 'user_home_follow', label: '关注按钮', type: 'switch', default: true },
{ key: 'user_home_posts_per_page', label: '每页文章数', type: 'number', default: 10, min: 5, max: 50 },
{ key: 'user_home_paging_ajax', label: 'AJAX 翻页', type: 'switch', default: true, help: '使用 AJAX 加载替代传统翻页' },
],
},
{
key: 'tabs',
title: 'Tab 配置',
icon: 'fas fa-columns',
fields: [
{ key: 'user_home_tabs', label: '显示的 Tab', type: 'input', default: 'posts,comments,favorites,credits,product,plate,forum,follow', help: '逗号分隔: posts, comments, favorites, credits, product, plate, forum, follow' },
{ key: 'user_home_tabs_order', label: 'Tab 显示顺序', type: 'input', default: 'posts,comments,favorites,credits,product,plate,forum,follow', help: '逗号分隔,拖拽排列栏目顺序' },
{ key: 'user_home_tabs_pc_hide', label: 'PC 端隐藏', type: 'input', default: '', help: '逗号分隔要在 PC 端隐藏的栏目' },
{ key: 'user_home_tabs_mobile_hide', label: '移动端隐藏', type: 'input', default: '', help: '逗号分隔要在移动端隐藏的栏目' },
{ key: 'author_main_tab_swiper', label: '移动端滑动切换', type: 'switch', default: false, help: '移动端左右滑动切换栏目' },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{ key: 'user_home_avatar', label: '显示头像', type: 'switch', default: true },
{ key: 'user_home_name', label: '显示用户名', type: 'switch', default: true },
{ key: 'user_home_desc', label: '显示个人简介', type: 'switch', default: true },
{ key: 'user_home_stats', label: '显示统计数据', type: 'switch', default: true },
{ key: 'user_home_social', label: '显示社交链接', type: 'switch', default: true },
{ key: 'user_home_message', label: '私信按钮', type: 'switch', default: true, help: '在用户主页显示发送私信按钮' },
{ key: 'user_home_private', label: '留言按钮', type: 'switch', default: true, help: '在用户主页显示留言入口' },
],
},
],
},
/**
* Other pages settings (404, search results, etc.)
*/
other: {
key: 'page_display.other',
title: '其它页面',
icon: 'fas fa-file',
description: '配置 404 页面、搜索结果页等特殊页面的展示。',
defaults: {
page_header_style: '1',
page_header_cover_img: '',
page_404_search: true,
page_404_popular: true,
page_404_message: '页面未找到',
page_404_back: true,
page_search_sidebar: true,
page_search_per_page: 12,
page_author_cover: true,
page_author_sidebar: true,
page_author_posts_per_page: 12,
},
groups: [
{
key: 'page-header',
title: '统一页头',
icon: 'fas fa-heading',
fields: [
{ key: 'page_header_style', label: '页面标题样式', type: 'select', default: '1', options: [
{ label: '不显示', value: '' },
{ label: '简单', value: '1' },
{ label: '卡片', value: '2' },
{ label: '封面', value: '3' },
], help: '控制归档/搜索/页面的页头样式,单页可通过 post meta 覆盖' },
{ key: 'page_header_cover_img', label: '默认封面图', type: 'upload', default: '', help: '封面样式(样式3)的默认背景图,单页可覆盖' },
],
},
{
key: 'page_404',
title: '404 页面',
icon: 'fas fa-exclamation-triangle',
fields: [
{ key: 'page_404_message', label: '404 提示文字', type: 'input', default: '页面未找到' },
{ key: 'page_404_search', label: '显示搜索框', type: 'switch', default: true },
{ key: 'page_404_popular', label: '显示热门文章', type: 'switch', default: true },
{ key: 'page_404_back', label: '显示返回首页', type: 'switch', default: true },
],
},
{
key: 'search_results',
title: '搜索结果页',
icon: 'fas fa-search',
fields: [
{ key: 'page_search_sidebar', label: '搜索结果侧边栏', type: 'switch', default: true },
{ key: 'page_search_per_page', label: '每页结果数', type: 'number', default: 12, min: 4, max: 48 },
],
},
{
key: 'author',
title: '作者页面',
icon: 'fas fa-user-edit',
fields: [
{ key: 'page_author_cover', label: '显示封面', type: 'switch', default: true },
{ key: 'page_author_sidebar', label: '显示侧边栏', type: 'switch', default: true },
{ key: 'page_author_posts_per_page', label: '每页文章数', type: 'number', default: 12, min: 4, max: 48 },
],
},
],
},
/**
* Global background settings
*/
background: {
key: 'page_display.background',
title: '全局背景',
icon: 'fas fa-image',
description: '配置站点全局背景图、背景色、暗色模式背景和遮罩。',
defaults: {
bg_color: '',
bg_image: '',
bg_size: '100%',
bg_position: 'center center',
bg_repeat: 'no-repeat',
bg_attachment: 'fixed',
bg_dark_color: '',
bg_dark_image: '',
bg_overlay: false,
bg_overlay_color: 'rgba(0, 0, 0, 0.3)',
page_bg_color: '',
page_bg_image: '',
},
groups: [
{
key: 'light',
title: '亮色背景',
icon: 'fas fa-sun',
fields: [
{ key: 'bg_color', label: '背景颜色', type: 'color', default: '', help: '留空则使用主题默认背景色' },
{ key: 'bg_image', label: '背景图片', type: 'media', help: '推荐使用高分辨率图片' },
{ key: 'bg_size', label: '图片尺寸', type: 'select', default: 'cover', options: [
{ label: '覆盖 (Cover)', value: 'cover' },
{ label: '包含 (Contain)', value: 'contain' },
{ label: '原始大小', value: 'auto' },
{ label: '拉伸填充', value: '100% 100%' },
{ label: '100% 宽度(旧版兼容)', value: '100%' },
]},
{ key: 'bg_position', label: '图片位置', type: 'select', default: 'center center', options: [
{ label: '居中', value: 'center center' },
{ label: '顶部居中', value: 'top center' },
{ label: '底部居中', value: 'bottom center' },
]},
{ key: 'bg_repeat', label: '图片重复', type: 'select', default: 'no-repeat', options: [
{ label: '不重复', value: 'no-repeat' },
{ label: '平铺', value: 'repeat' },
{ label: '水平平铺', value: 'repeat-x' },
{ label: '垂直平铺', value: 'repeat-y' },
]},
{ key: 'bg_attachment', label: '固定方式', type: 'select', default: 'fixed', options: [
{ label: '固定 (视差)', value: 'fixed' },
{ label: '随内容滚动', value: 'scroll' },
]},
],
},
{
key: 'dark',
title: '暗色背景',
icon: 'fas fa-moon',
fields: [
{ key: 'bg_dark_color', label: '暗色背景颜色', type: 'color', default: '', help: '留空则使用主题默认暗色背景' },
{ key: 'bg_dark_image', label: '暗色背景图片', type: 'media', help: '暗色模式下显示的背景图' },
],
},
{
key: 'overlay',
title: '遮罩设置',
icon: 'fas fa-layer-group',
fields: [
{ key: 'bg_overlay', label: '启用背景遮罩', type: 'switch', default: false, help: '在背景图上方叠加半透明遮罩,提升文字可读性' },
{ key: 'bg_overlay_color', label: '遮罩颜色', type: 'input', default: 'rgba(0, 0, 0, 0.3)', dependsOn: { key: 'bg_overlay', value: true }, help: '支持 rgba/hex 色值' },
],
},
{
key: 'page',
title: '页面背景',
icon: 'fas fa-file',
fields: [
{ key: 'page_bg_color', label: '内容区背景色', type: 'color', default: '', help: '主内容区域的背景色' },
{ key: 'page_bg_image', label: '内容区背景图', type: 'media' },
],
},
],
},
/**
* Menu decoration settings
*/
'menu-decoration': {
key: 'page_display.menu-decoration',
title: '菜单装饰',
icon: 'fas fa-bars',
description: '配置导航菜单的图标、徽章、下拉样式和图文卡片子菜单。',
defaults: {
menu_icon_enabled: true,
menu_badge_enabled: true,
menu_submenu_style: 'dropdown',
menu_submenu_columns: 1,
menu_submenu_width: 220,
menu_mobile_style: 'drawer',
menu_item_padding: 12,
menu_hover_effect: 'underline',
},
groups: [
{
key: 'icon',
title: '菜单图标',
icon: 'fas fa-icons',
fields: [
{ key: 'menu_icon_enabled', label: '显示菜单图标', type: 'switch', default: true, help: '在菜单项文字前显示图标(需在菜单管理中设置 CSS 类)' },
{ key: 'menu_badge_enabled', label: '显示菜单徽章', type: 'switch', default: true, help: '在菜单项上显示 "新"、"热" 等徽章标记' },
],
},
{
key: 'submenu',
title: '下拉子菜单',
icon: 'fas fa-caret-square-down',
fields: [
{
key: 'menu_submenu_style',
label: '子菜单样式',
type: 'radio',
default: 'dropdown',
options: [
{ label: '普通下拉', value: 'dropdown' },
{ label: '多列下拉', value: 'mega' },
{ label: '图文卡片', value: 'cards' },
],
},
{ key: 'menu_submenu_columns', label: '多列列数', type: 'number', default: 1, min: 1, max: 5, dependsOn: { key: 'menu_submenu_style', value: 'mega' } },
{ key: 'menu_submenu_width', label: '子菜单宽度 (px)', type: 'number', default: 220, min: 160, max: 800, dependsOn: { key: 'menu_submenu_style', value: 'mega' } },
],
},
{
key: 'effect',
title: '交互效果',
icon: 'fas fa-magic',
fields: [
{
key: 'menu_hover_effect',
label: 'Hover 效果',
type: 'radio',
default: 'underline',
options: [
{ label: '下划线', value: 'underline' },
{ label: '背景色', value: 'background' },
{ label: '文字变色', value: 'color' },
{ label: '无效果', value: 'none' },
],
},
{ key: 'menu_item_padding', label: '菜单项内边距 (px)', type: 'number', default: 12, min: 4, max: 32 },
],
},
{
key: 'mobile',
title: '移动端菜单',
icon: 'fas fa-mobile-alt',
fields: [
{
key: 'menu_mobile_style',
label: '移动端菜单样式',
type: 'radio',
default: 'drawer',
options: [
{ label: '抽屉', value: 'drawer' },
{ label: '全屏', value: 'fullscreen' },
{ label: '下拉', value: 'dropdown' },
],
},
],
},
],
},
/**
* Header components
*/
'header-components': {
key: 'page_display.header-components',
title: '顶部多功能组件',
icon: 'fas fa-th',
description: '顶部轮播、图标卡片、搜索条、公告条等组件配置。',
defaults: {
header_components_search_enabled: true,
header_components_cards_enabled: false,
header_components_nav_color: '#ffffff',
header_components_show_on: ['home'],
header_components_device_visibility: '',
header_components_filter_blur_devices: [],
header_components_card_show_devices: ['pc', 'mobile'],
header_components_card_shared_bg: false,
header_components_card_blur: true,
header_components_card_icon_shape: 'circle',
header_components_icon_cards: [],
header_components_search_pc: true,
header_components_search_mobile: true,
header_components_search_show_keywords: false,
header_components_search_popular_limit: 5,
header_components_search_show_input_cat: false,
header_components_search_show_type: false,
slider_config_direction: 'horizontal',
slider_config_speed: 300,
slider_config_button: true,
slider_config_scale_height: false,
slider_config_scale: false,
slider_config_max_height: '',
slider_config_min_height: '',
},
groups: [
{
key: 'visibility',
title: '显示规则',
icon: 'fas fa-eye',
fields: [
{ key: 'header_components_search_enabled', label: '启用搜索覆盖层', type: 'switch', default: true, help: '在顶部组件区域显示搜索条覆盖层' },
{ key: 'header_components_cards_enabled', label: '启用图标卡片', type: 'switch', default: false, help: '在顶部组件区域显示图标卡片入口' },
{ key: 'header_components_show_on', label: '按页面类型启用', type: 'checkbox', default: ['home'], options: [
{ label: '首页', value: 'home' },
{ label: '文章', value: 'single' },
{ label: '页面', value: 'page' },
{ label: '分类', value: 'category' },
{ label: '标签', value: 'tag' },
{ label: '搜索', value: 'search' },
{ label: '归档', value: 'archive' },
{ label: '专题', value: 'special' },
], help: '选择哪些页面类型显示顶部组件,不选则关闭' },
{ key: 'header_components_device_visibility', label: '设备显示规则', type: 'radio', default: '', options: [
{ label: '全部', value: '' },
{ label: '仅电脑', value: 'only_pc' },
{ label: '仅移动', value: 'only_sm' },
] },
],
},
{
key: 'nav-color',
title: '导航栏配色',
icon: 'fas fa-palette',
fields: [
{ key: 'header_components_nav_color', label: '导航栏文字颜色', type: 'color', default: '#ffffff', help: '顶部组件叠加时固定导航的文字颜色' },
],
},
{
key: 'slider-config',
title: '幻灯片配置',
icon: 'fas fa-sliders-h',
fields: [
{ key: 'slider_config_direction', label: '滑动方向', type: 'radio', default: 'horizontal', options: [
{ label: '水平', value: 'horizontal' },
{ label: '垂直', value: 'vertical' },
]},
{ key: 'slider_config_speed', label: '切换速度 (ms)', type: 'number', default: 300, min: 100, max: 3000 },
{ key: 'slider_config_button', label: '显示前进后退按钮', type: 'switch', default: true },
{ key: 'slider_config_scale_height', label: '缩放高度', type: 'switch', default: false },
{ key: 'slider_config_scale', label: '缩放效果', type: 'switch', default: false },
{ key: 'slider_config_max_height', label: '最大高度', type: 'input', default: '' },
{ key: 'slider_config_min_height', label: '最小高度', type: 'input', default: '' },
],
},
{
key: 'search',
title: '搜索组件',
icon: 'fas fa-search',
fields: [
{ key: 'header_components_search_pc', label: 'PC 端显示搜索', type: 'switch', default: true, dependsOn: { key: 'header_components_search_enabled', value: true } },
{ key: 'header_components_search_mobile', label: '移动端显示搜索', type: 'switch', default: true, dependsOn: { key: 'header_components_search_enabled', value: true } },
{ key: 'header_components_search_show_keywords', label: '显示热门搜索词', type: 'switch', default: false, dependsOn: { key: 'header_components_search_enabled', value: true } },
{ key: 'header_components_search_popular_limit', label: '热词数量', type: 'number', default: 5, min: 1, max: 20, dependsOn: { key: 'header_components_search_show_keywords', value: true } },
{ key: 'header_components_search_show_input_cat', label: '显示分类搜索', type: 'switch', default: false, dependsOn: { key: 'header_components_search_enabled', value: true }, help: '搜索框内显示分类选择下拉' },
{ key: 'header_components_search_show_type', label: '显示类型切换', type: 'switch', default: false, dependsOn: { key: 'header_components_search_enabled', value: true }, help: '搜索框内显示内容类型切换' },
],
},
{
key: 'cards',
title: '图标卡片样式',
icon: 'fas fa-th-large',
fields: [
{ key: 'header_components_filter_blur_devices', label: '容器模糊设备', type: 'checkbox', default: [], dependsOn: { key: 'header_components_cards_enabled', value: true }, options: [
{ label: 'PC', value: 'pc' },
{ label: '移动端', value: 'mobile' },
]},
{ key: 'header_components_card_show_devices', label: '卡片显示设备', type: 'checkbox', default: ['pc', 'mobile'], dependsOn: { key: 'header_components_cards_enabled', value: true }, options: [
{ label: 'PC', value: 'pc' },
{ label: '移动端', value: 'mobile' },
]},
{ key: 'header_components_card_shared_bg', label: '共享卡片背景', type: 'switch', default: false, dependsOn: { key: 'header_components_cards_enabled', value: true }, help: '开启后所有图标卡片共用背景模式' },
{ key: 'header_components_card_blur', label: '启用卡片模糊效果', type: 'switch', default: true, dependsOn: { key: 'header_components_cards_enabled', value: true } },
{ key: 'header_components_card_icon_shape', label: '图标形状', type: 'radio', default: 'circle', dependsOn: { key: 'header_components_cards_enabled', value: true }, options: [
{ label: '圆形', value: 'circle' },
{ label: '方形', value: 'square' },
]},
],
},
{
key: 'icon-cards',
title: '图标卡片列表',
icon: 'fas fa-list',
fields: [
{
key: 'header_components_icon_cards',
label: '图标卡片',
type: 'repeater',
sanitize_type: 'array',
default: [],
dependsOn: { key: 'header_components_cards_enabled', value: true },
addText: '添加卡片',
fields: [
{ key: 'icon', label: '图标类名', type: 'input', default: 'fas fa-star', placeholder: 'fas fa-star' },
{ key: 'custom_icon', label: '自定义图标 HTML', type: 'textarea', default: '', rows: 2, placeholder: '<svg>...</svg>' },
{ key: 'icon_class', label: '图标配色', type: 'select', default: 'c-blue', options: [
{ label: 'Blue', value: 'c-blue' },
{ label: 'Yellow', value: 'c-yellow' },
{ label: 'Green', value: 'c-green' },
{ label: 'Red', value: 'c-red' },
{ label: 'Orange', value: 'c-orange' },
{ label: 'Cyan', value: 'c-cyan' },
{ label: 'Pink', value: 'c-pink' },
{ label: 'Gradient Cyan', value: 'jb-cyan' },
{ label: 'Gradient Green', value: 'jb-green' },
{ label: 'Gradient Orange', value: 'jb-orange' },
]},
{ key: 'title', label: '标题', type: 'input', default: '' },
{ key: 'desc', label: '描述', type: 'input', default: '' },
{ key: 'url', label: '链接 URL', type: 'input', default: '', placeholder: 'https://example.com' },
{ key: 'target', label: '打开方式', type: 'radio', default: '_self', options: [
{ label: '当前标签页', value: '_self' },
{ label: '新标签页', value: '_blank' },
]},
],
},
],
},
],
},
/**
* Footer settings (already has a real Vue page)
*/
footer: {
key: 'page_display.footer',
title: '底部页脚',
icon: 'fas fa-shoe-prints',
description: '页脚布局、友链、版权信息配置。实际编辑界面在 FooterSettings.vue(customPage),此处为 REST 聚合描述。',
defaults: {
footer_columns: 3,
footer_copyright: true,
footer_icp: true,
icp_number: '',
footer_police: true,
police_number: '',
footer_theme_custom: false,
footer_theme_bg_custom: '',
footer_theme_bg: '',
footer_theme_color_custom: '',
footer_contact_wechat_img: '',
footer_contact_qq: '',
footer_contact_weibo: '',
footer_contact_email: '',
footer_t1_m_s: ['pc', 'mobile'],
footer_t1_img: '',
footer_t1_img_dark: '',
footer_t1_t: '',
fcode_t1_code: '',
footer_contact_m_s: ['pc', 'mobile'],
footer_contact_more: '',
fcode_t2_code_1: '',
fcode_t2_code_2: '',
footer_mini_img_m_s: ['pc', 'mobile'],
footer_mini_img: '',
fcode_customize_code: '',
},
groups: [
{
key: 'layout',
title: '页脚布局',
icon: 'fas fa-columns',
fields: [
{ key: 'footer_columns', label: '页脚列数', type: 'number', default: 3, min: 1, max: 4 },
{ key: 'footer_copyright', label: '显示版权信息', type: 'switch', default: true },
{ key: 'footer_icp', label: '显示ICP备案', type: 'switch', default: true },
{ key: 'icp_number', label: 'ICP备案号', type: 'input', default: '' },
{ key: 'footer_police', label: '显示公安备案', type: 'switch', default: true },
{ key: 'police_number', label: '公安备案号', type: 'input', default: '' },
],
},
{
key: 'color',
title: '页脚颜色',
icon: 'fas fa-palette',
fields: [
{ key: 'footer_theme_custom', label: '自定义页脚颜色', type: 'switch', default: false },
{ key: 'footer_theme_bg_custom', label: '自定义背景色', type: 'color', default: '' },
{ key: 'footer_theme_bg', label: '背景图片', type: 'media', default: '' },
{ key: 'footer_theme_color_custom', label: '自定义文字颜色', type: 'color', default: '' },
],
},
{
key: 'contact',
title: '联系方式',
icon: 'fas fa-address-book',
fields: [
{ key: 'footer_contact_wechat_img', label: '微信二维码', type: 'media', default: '' },
{ key: 'footer_contact_qq', label: 'QQ', type: 'input', default: '' },
{ key: 'footer_contact_weibo', label: '微博', type: 'input', default: '' },
{ key: 'footer_contact_email', label: '邮箱', type: 'input', default: '' },
],
},
{
key: 'brand',
title: '品牌列(第一列)',
icon: 'fas fa-building',
fields: [
{ key: 'footer_t1_m_s', label: '显示设备', type: 'checkbox', default: ['pc', 'mobile'] },
{ key: 'footer_t1_img', label: '页脚 Logo(日间)', type: 'media', default: '' },
{ key: 'footer_t1_img_dark', label: '页脚 Logo(夜间)', type: 'media', default: '' },
{ key: 'footer_t1_t', label: '品牌标题', type: 'input', default: '' },
{ key: 'fcode_t1_code', label: '品牌列自定义代码', type: 'textarea', default: '' },
],
},
{
key: 'contact_ext',
title: '联系方式扩展',
icon: 'fas fa-phone-alt',
fields: [
{ key: 'footer_contact_m_s', label: '显示设备', type: 'checkbox', default: ['pc', 'mobile'] },
{ key: 'footer_contact_more', label: '更多联系项', type: 'textarea', default: '' },
{ key: 'fcode_t2_code_1', label: '联系区上方自定义代码', type: 'textarea', default: '' },
{ key: 'fcode_t2_code_2', label: '联系区下方自定义代码', type: 'textarea', default: '' },
],
},
{
key: 'mini_qr',
title: '二维码图片组(第三列)',
icon: 'fas fa-qrcode',
fields: [
{ key: 'footer_mini_img_m_s', label: '显示设备', type: 'checkbox', default: ['pc', 'mobile'] },
{ key: 'footer_mini_img', label: '二维码组', type: 'textarea', default: '' },
],
},
{
key: 'custom',
title: '底部自定义',
icon: 'fas fa-code',
fields: [
{ key: 'fcode_customize_code', label: '底部自定义代码', type: 'textarea', default: '' },
],
},
],
},
/**
* Homepage settings (already has a real Vue page)
*/
homepage: {
key: 'page_display.homepage',
title: '首页配置',
icon: 'fas fa-home',
description: '首页模块、布局、推荐位配置。',
defaults: {},
groups: [],
},
/**
* Special/topic page settings
*/
special: {
key: 'page_display.special',
title: '专题页面',
icon: 'fas fa-layer-group',
description: '配置专题聚合页的封面、摘要、布局、聚合规则和子页面展示策略。',
defaults: {
special_cover_enabled: true,
special_summary_enabled: true,
special_summary_length: 200,
special_default_cover: '',
special_layout: 'grid',
special_columns: 2,
special_source_type: 'category',
special_source_ids: '',
special_subpage_display: 'cards',
special_subpage_count: 6,
special_sidebar: true,
special_pagination: 'numeric',
special_per_page: 12,
special_post_count: false,
special_orderby: 'date',
},
groups: [
{
key: 'header',
title: '专题头部',
icon: 'fas fa-image',
fields: [
{ key: 'special_cover_enabled', label: '显示专题封面', type: 'switch', default: true, help: '在专题页顶部展示封面图' },
{ key: 'special_summary_enabled', label: '显示专题摘要', type: 'switch', default: true },
{ key: 'special_summary_length', label: '摘要最大长度', type: 'number', default: 200, min: 50, max: 500, dependsOn: { key: 'special_summary_enabled', value: true } },
{ key: 'special_default_cover', label: '默认封面图', type: 'upload', default: '', help: '未设置专题封面时使用的默认图片' },
],
},
{
key: 'layout',
title: '布局设置',
icon: 'fas fa-th-large',
fields: [
{
key: 'special_layout',
label: '内容布局',
type: 'radio',
default: 'grid',
options: [
{ label: '网格', value: 'grid' },
{ label: '列表', value: 'list' },
{ label: '瀑布流', value: 'masonry' },
],
},
{ key: 'special_columns', label: '网格列数', type: 'number', default: 2, min: 1, max: 4, dependsOn: { key: 'special_layout', value: 'grid' } },
{ key: 'special_sidebar', label: '侧边栏', type: 'switch', default: true },
{ key: 'special_post_count', label: '显示文章数', type: 'switch', default: false, help: '在专题列表中显示每篇文章的浏览次数' },
],
},
{
key: 'aggregation',
title: '聚合规则',
icon: 'fas fa-database',
fields: [
{
key: 'special_source_type',
label: '内容来源',
type: 'radio',
default: 'category',
options: [
{ label: '分类', value: 'category' },
{ label: '标签', value: 'tag' },
{ label: '手动选择', value: 'manual' },
{ label: '最新文章', value: 'latest' },
],
},
{ key: 'special_source_ids', label: '来源 ID 列表', type: 'input', default: '', placeholder: '逗号分隔分类/标签 ID', help: '填写分类或标签的 ID,逗号分隔' },
],
},
{
key: 'subpage',
title: '子页面展示',
icon: 'fas fa-clone',
fields: [
{
key: 'special_subpage_display',
label: '子页面样式',
type: 'radio',
default: 'cards',
options: [
{ label: '卡片', value: 'cards' },
{ label: '列表', value: 'list' },
{ label: '时间线', value: 'timeline' },
],
},
{ key: 'special_subpage_count', label: '每页子页面数', type: 'number', default: 6, min: 1, max: 24 },
],
},
{
key: 'pagination',
title: '分页设置',
icon: 'fas fa-ellipsis-h',
fields: [
{
key: 'special_pagination',
label: '分页模式',
type: 'radio',
default: 'numeric',
options: [
{ label: '数字分页', value: 'numeric' },
{ label: '加载更多', value: 'load_more' },
{ label: '无限滚动', value: 'infinite' },
],
},
{ key: 'special_per_page', label: '每页文章数', type: 'number', default: 12, min: 4, max: 48 },
],
},
{
key: 'orderby',
title: '排序设置',
icon: 'fas fa-sort',
fields: [
{ key: 'special_orderby', label: '默认排序', type: 'select', default: 'date', options: [
{ label: '发布时间', value: 'date' },
{ label: '最近更新', value: 'modified' },
{ label: '浏览数', value: 'views' },
{ label: '评论数', value: 'comments' },
]},
],
},
],
},
}
@@ -0,0 +1,73 @@
export const affiliateSchema = {
key: 'payment.affiliate',
title: '推广返佣',
icon: 'fas fa-share-alt',
description: '配置返佣比例、归因窗口和结算说明。',
defaults: {
payment_affiliate_enabled: false,
payment_affiliate_ratio: 10,
payment_affiliate_window_days: 30,
payment_affiliate_require_paid_order: true,
payment_affiliate_self_s: true,
payment_affiliate_show_users: true,
payment_affiliate_user_ratio: 10,
payment_affiliate_vip1_ratio: 0,
payment_affiliate_vip2_ratio: 0,
payment_affiliate_poster_s: true,
payment_affiliate_poster_img: '',
payment_affiliate_poster_title: '',
payment_affiliate_poster_desc: '',
payment_affiliate_text_desc: '',
payment_affiliate_text_details_title: '',
payment_affiliate_text_details: '',
payment_affiliate_text_discount: '',
payment_affiliate_note: '返佣链路复用邀请体系,订单归因和结算自动衔接当前策略字段。',
},
groups: [
{
key: 'policy',
title: '返佣策略',
icon: 'fas fa-project-diagram',
fields: [
{ key: 'payment_affiliate_enabled', label: '启用推广返佣结构', type: 'switch', default: false },
{ key: 'payment_affiliate_ratio', label: '返佣比例(%)', type: 'number', default: 10, min: 0, max: 100, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_window_days', label: '归因窗口(天)', type: 'number', default: 30, min: 1, max: 365, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_require_paid_order', label: '仅对已支付订单返佣', type: 'switch', default: true, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_self_s', label: '自购返佣', type: 'switch', default: true, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_show_users', label: '显示推广用户', type: 'switch', default: true, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
],
},
{
key: 'user-ratio',
title: '用户返佣比例',
icon: 'fas fa-users-cog',
fields: [
{ key: 'payment_affiliate_user_ratio', label: '普通用户比例(%)', type: 'number', default: 10, min: 0, max: 100, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_vip1_ratio', label: 'VIP1比例(%)', type: 'number', default: 0, min: 0, max: 100, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_vip2_ratio', label: 'VIP2比例(%)', type: 'number', default: 0, min: 0, max: 100, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
],
},
{
key: 'poster',
title: '推广海报',
icon: 'fas fa-image',
fields: [
{ key: 'payment_affiliate_poster_s', label: '启用推广海报', type: 'switch', default: true, dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_poster_img', label: '海报背景图', type: 'media', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_poster_title', label: '海报标题', type: 'input', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_poster_desc', label: '海报描述', type: 'input', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
],
},
{
key: 'text',
title: '文案设置',
icon: 'fas fa-pen-fancy',
fields: [
{ key: 'payment_affiliate_text_desc', label: '返佣说明', type: 'textarea', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_text_details_title', label: '明细标题', type: 'input', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_text_details', label: '明细说明', type: 'textarea', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
{ key: 'payment_affiliate_text_discount', label: '折扣文案', type: 'input', default: '', dependsOn: { key: 'payment_affiliate_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,59 @@
export const cardPassSchema = {
key: 'payment.card-pass',
title: '充值卡',
icon: 'fas fa-ticket-alt',
description: '配置充值卡类型、卡号规则、批量生成和兑换逻辑。',
defaults: {
card_pass_enabled: false,
card_pass_desc: '',
card_pass_type: 'balance',
card_pass_prefix: 'AK',
card_pass_length: 16,
card_pass_batch_size: 50,
card_pass_max_redeem: 1,
card_pass_expiry: 0,
card_pass_amount: 10,
card_pass_vip_days: 30,
card_pass_credits: 0,
card_pass_redeem_page: '',
card_pass_success_msg: '兑换成功!',
card_pass_fail_msg: '卡号无效或已过期',
},
groups: [
{
key: 'basic',
title: '充值卡设置',
icon: 'fas fa-id-card',
fields: [
{ key: 'card_pass_enabled', label: '启用充值卡', type: 'switch', default: false },
{ key: 'card_pass_desc', label: '充值卡说明', type: 'textarea', default: '', dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_type', label: '充值卡类型', type: 'select', default: 'balance', options: [{ label: '余额卡', value: 'balance' }, { label: 'VIP卡', value: 'vip' }, { label: '积分卡', value: 'credits' }], dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_prefix', label: '卡号前缀', type: 'input', default: 'AK', dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_length', label: '卡号长度', type: 'number', default: 16, min: 8, max: 32, dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_batch_size', label: '批量生成数量', type: 'number', default: 50, min: 1, max: 500, dependsOn: { key: 'card_pass_enabled', value: true } },
],
},
{
key: 'redeem',
title: '兑换设置',
icon: 'fas fa-exchange-alt',
fields: [
{ key: 'card_pass_max_redeem', label: '单卡最大兑换次数', type: 'number', default: 1, min: 1, max: 100, dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_expiry', label: '有效期(天)', type: 'number', default: 0, min: 0, help: '0为永久有效', dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_amount', label: '面额(元)', type: 'number', default: 10, min: 1, max: 9999, dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_vip_days', label: 'VIP天数', type: 'number', default: 30, min: 1, max: 3650, dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_credits', label: '赠送积分', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'card_pass_enabled', value: true } },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-desktop',
fields: [
{ key: 'card_pass_redeem_page', label: '兑换页面', type: 'input', default: '', dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_success_msg', label: '兑换成功提示', type: 'input', default: '兑换成功!', dependsOn: { key: 'card_pass_enabled', value: true } },
{ key: 'card_pass_fail_msg', label: '兑换失败提示', type: 'input', default: '卡号无效或已过期', dependsOn: { key: 'card_pass_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,172 @@
export const gatewaySchema = {
key: 'payment.gateway',
title: '收款接口',
icon: 'fas fa-credit-card',
description: '配置支付网关凭据、回调校验口令与运行模式。填写凭据后对应网关即变为”可用”。',
defaults: {
payment_gateway_mode: 'manual_review',
payment_gateway_test_enabled: true,
payment_gateway_manual_review: true,
payment_gateway_callback_secret: '',
payment_gateway_help: '未接真实支付网关时,建议使用测试网关或人工确认模式完成联调。',
payment_wechat_enabled: false,
payment_alipay_enabled: false,
payment_paypal_enabled: false,
payment_balance_enabled: false,
payment_card_pass_enabled: false,
payment_xunhupay_enabled: false,
payment_xhpay_enabled: false,
payment_payjs_enabled: false,
payment_epay_enabled: false,
payment_vmq_enabled: false,
payment_codepay_enabled: false,
payment_stripe_enabled: false,
wechat_merchantid: '',
wechat_jsapi: '',
wechat_appsecret: '',
wechat_cert_path: '',
wechat_key_path: '',
alipay_appid: '',
alipay_privatekey: '',
alipay_publickey: '',
alipay_return_url: '',
alipay_notify_url: '',
paypal_client_id: '',
paypal_client_secret: '',
paypal_currency: 'USD',
paypal_sandbox: true,
xunhupay_appid: '',
xunhupay_appsecret: '',
xhpay_mchid: '',
xhpay_alipay_v2: '',
xhpay_wx_h5: '',
payjs_mchid: '',
payjs_key: '',
epay_apiurl: '',
epay_pid: '',
epay_key: '',
stripe_secret_key: '',
stripe_publishable_key: '',
stripe_webhook_secret: '',
stripe_currency: 'usd',
stripe_test_mode: true,
},
groups: [
{
key: 'adapter',
title: '网关适配器',
icon: 'fas fa-plug',
fields: [
{ key: 'payment_gateway_mode', label: '运行模式', type: 'radio', default: 'manual_review', options: [{ label: '人工确认', value: 'manual_review' }, { label: '测试网关', value: 'test_gateway' }, { label: '适配器就绪', value: 'adapter_ready' }] },
{ key: 'payment_gateway_test_enabled', label: '启用测试网关', type: 'switch', default: true },
{ key: 'payment_gateway_manual_review', label: '保留人工复核', type: 'switch', default: true },
{ key: 'payment_gateway_callback_secret', label: '回调校验口令', type: 'input', default: '', help: '真实网关接入时可直接复用该口令字段。' },
{ key: 'payment_gateway_help', label: '运维说明', type: 'textarea', default: '未接真实支付网关时,建议使用测试网关或人工确认模式完成联调。' },
],
},
{
key: 'gateways',
title: '支付网关',
icon: 'fas fa-toggle-on',
fields: [
{ key: 'payment_wechat_enabled', label: '微信支付', type: 'switch', default: false },
{ key: 'payment_alipay_enabled', label: '支付宝', type: 'switch', default: false },
{ key: 'payment_paypal_enabled', label: 'PayPal', type: 'switch', default: false },
{ key: 'payment_stripe_enabled', label: 'Stripe', type: 'switch', default: false },
{ key: 'payment_balance_enabled', label: '余额支付', type: 'switch', default: false },
{ key: 'payment_card_pass_enabled', label: '卡密充值', type: 'switch', default: false },
{ key: 'payment_xunhupay_enabled', label: '虎皮椒', type: 'switch', default: false },
{ key: 'payment_xhpay_enabled', label: '小火付', type: 'switch', default: false },
{ key: 'payment_payjs_enabled', label: 'PayJS', type: 'switch', default: false },
{ key: 'payment_epay_enabled', label: '易支付', type: 'switch', default: false },
{ key: 'payment_vmq_enabled', label: 'V免签', type: 'switch', default: false },
{ key: 'payment_codepay_enabled', label: 'Codepay', type: 'switch', default: false },
],
},
{
key: 'wechat',
title: '微信支付配置',
icon: 'fab fa-weixin',
fields: [
{ key: 'wechat_merchantid', label: '商户号', type: 'input', default: '' },
{ key: 'wechat_jsapi', label: 'JSAPI密钥', type: 'input', default: '' },
{ key: 'wechat_appsecret', label: 'AppSecret', type: 'input', default: '' },
{ key: 'wechat_cert_path', label: '证书路径', type: 'input', default: '', help: '退款等接口需要,绝对路径。' },
{ key: 'wechat_key_path', label: '密钥路径', type: 'input', default: '' },
],
},
{
key: 'alipay',
title: '支付宝配置',
icon: 'fab fa-alipay',
fields: [
{ key: 'alipay_appid', label: 'AppID', type: 'input', default: '' },
{ key: 'alipay_privatekey', label: '应用私钥', type: 'textarea', rows: 3, default: '' },
{ key: 'alipay_publickey', label: '支付宝公钥', type: 'textarea', rows: 3, default: '' },
{ key: 'alipay_return_url', label: '同步回调地址', type: 'input', default: '' },
{ key: 'alipay_notify_url', label: '异步回调地址', type: 'input', default: '' },
],
},
{
key: 'paypal',
title: 'PayPal 配置',
icon: 'fab fa-paypal',
fields: [
{ key: 'paypal_client_id', label: 'Client ID', type: 'input', default: '' },
{ key: 'paypal_client_secret', label: 'Client Secret', type: 'input', default: '' },
{ key: 'paypal_currency', label: '货币', type: 'input', default: 'USD' },
{ key: 'paypal_sandbox', label: '沙箱模式', type: 'switch', default: true },
],
},
{
key: 'xunhupay',
title: '虎皮椒配置',
icon: 'fas fa-pepper-hot',
fields: [
{ key: 'xunhupay_appid', label: 'AppID', type: 'input', default: '' },
{ key: 'xunhupay_appsecret', label: 'AppSecret', type: 'input', default: '' },
],
},
{
key: 'xhpay',
title: '小火付配置',
icon: 'fas fa-fire',
fields: [
{ key: 'xhpay_mchid', label: '商户号', type: 'input', default: '' },
{ key: 'xhpay_alipay_v2', label: '支付宝V2', type: 'input', default: '' },
{ key: 'xhpay_wx_h5', label: '微信H5', type: 'input', default: '' },
],
},
{
key: 'payjs',
title: 'PayJS 配置',
icon: 'fab fa-js',
fields: [
{ key: 'payjs_mchid', label: '商户号', type: 'input', default: '' },
{ key: 'payjs_key', label: '通信密钥', type: 'input', default: '' },
],
},
{
key: 'epay',
title: '易支付配置',
icon: 'fas fa-university',
fields: [
{ key: 'epay_apiurl', label: '接口地址', type: 'input', default: '' },
{ key: 'epay_pid', label: '商户ID', type: 'input', default: '' },
{ key: 'epay_key', label: '商户密钥', type: 'input', default: '' },
],
},
{
key: 'stripe',
title: 'Stripe 配置',
icon: 'fab fa-stripe',
fields: [
{ key: 'stripe_secret_key', label: 'Secret Key', type: 'input', default: '' },
{ key: 'stripe_publishable_key', label: 'Publishable Key', type: 'input', default: '' },
{ key: 'stripe_webhook_secret', label: 'Webhook Secret', type: 'input', default: '', help: 'Stripe Dashboard 配置 Webhook 后获得,用于验签。' },
{ key: 'stripe_currency', label: '货币', type: 'input', default: 'usd' },
{ key: 'stripe_test_mode', label: '测试模式', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,25 @@
/**
* Payment & Paid domain schemas.
*/
import { paidSchema } from './paid.js'
import { rechargeSchema } from './recharge.js'
import { vipSchema } from './vip.js'
import { revenueSchema } from './revenue.js'
import { affiliateSchema } from './affiliate.js'
import { gatewaySchema } from './gateway.js'
import { orderSchema } from './order.js'
import { cardPassSchema } from './cardPass.js'
import { withdrawalSchema } from './withdrawal.js'
export const paymentSchemas = {
paid: paidSchema,
recharge: rechargeSchema,
vip: vipSchema,
revenue: revenueSchema,
affiliate: affiliateSchema,
gateway: gatewaySchema,
order: orderSchema,
cardPass: cardPassSchema,
withdrawal: withdrawalSchema,
}
@@ -0,0 +1,96 @@
export const orderSchema = {
key: 'payment.order',
title: '订单设置',
icon: 'fas fa-file-invoice',
description: '配置订单前缀、有效期、展示字段和状态文案。',
defaults: {
payment_order_prefix: 'AKSRT',
payment_order_expiry: 30,
payment_show_user: true,
payment_show_paycount: true,
payment_no_logged_in: true,
payment_cookie_day: 15,
payment_no_logged_remind: '',
payment_wait_float_s: true,
payment_order_max_minutes: 30,
payment_mark: '付费',
payment_box_position: 'content',
payment_free_logged_show: false,
payment_show_ip: false,
payment_show_device: false,
payment_show_order_no: true,
payment_show_create_time: true,
payment_show_pay_time: true,
payment_order_status_pending: '待支付',
payment_order_status_paid: '已支付',
payment_order_status_completed: '已完成',
payment_order_status_cancelled: '已取消',
payment_order_status_refunded: '已退款',
payment_order_status_refunding: '退款中',
payment_order_status_processing: '处理中',
payment_service: '',
payment_service_icon: '',
payment_service_value: '',
payment_service_qq: '',
payment_service_wechat: '',
},
groups: [
{
key: 'basic',
title: '订单基础',
icon: 'fas fa-cog',
fields: [
{ key: 'payment_order_prefix', label: '订单前缀', type: 'input', default: 'AKSRT' },
{ key: 'payment_order_expiry', label: '订单有效期(分钟)', type: 'number', default: 30, min: 5, max: 1440 },
{ key: 'payment_show_user', label: '显示用户信息', type: 'switch', default: true },
{ key: 'payment_show_paycount', label: '显示购买次数', type: 'switch', default: true },
{ key: 'payment_no_logged_in', label: '未登录提示', type: 'switch', default: true },
{ key: 'payment_cookie_day', label: 'Cookie有效期(天)', type: 'number', default: 15, min: 1, max: 31, help: '未登录购买 Cookie 有效时间,1-31 天' },
{ key: 'payment_no_logged_remind', label: '未登录提醒文案', type: 'textarea', default: '', help: '未登录用户查看付费内容时的提醒文案' },
{ key: 'payment_wait_float_s', label: '订单等待浮动', type: 'switch', default: true },
{ key: 'payment_order_max_minutes', label: '订单最大支付时间(分钟)', type: 'number', default: 30, min: 5, max: 1440 },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{ key: 'payment_mark', label: '付费标记', type: 'input', default: '付费' },
{ key: 'payment_box_position', label: '付费框位置', type: 'radio', default: 'top', options: [{ label: '文章模块上', value: 'box_top' }, { label: '内容顶', value: 'top' }, { label: '内容底', value: 'bottom' }, { label: '模块下', value: 'box_bottom' }] },
{ key: 'payment_free_logged_show', label: '登录用户显示免费', type: 'switch', default: false },
{ key: 'payment_show_ip', label: '显示用户IP', type: 'switch', default: false },
{ key: 'payment_show_device', label: '显示设备信息', type: 'switch', default: false },
{ key: 'payment_show_order_no', label: '显示订单号', type: 'switch', default: true },
{ key: 'payment_show_create_time', label: '显示创建时间', type: 'switch', default: true },
{ key: 'payment_show_pay_time', label: '显示支付时间', type: 'switch', default: true },
],
},
{
key: 'status',
title: '状态设置',
icon: 'fas fa-tags',
fields: [
{ key: 'payment_order_status_pending', label: '待支付状态文案', type: 'input', default: '待支付' },
{ key: 'payment_order_status_paid', label: '已支付状态文案', type: 'input', default: '已支付' },
{ key: 'payment_order_status_completed', label: '已完成状态文案', type: 'input', default: '已完成' },
{ key: 'payment_order_status_cancelled', label: '已取消状态文案', type: 'input', default: '已取消' },
{ key: 'payment_order_status_refunded', label: '已退款状态文案', type: 'input', default: '已退款' },
{ key: 'payment_order_status_refunding', label: '退款中状态文案', type: 'input', default: '退款中' },
{ key: 'payment_order_status_processing', label: '处理中状态文案', type: 'input', default: '处理中' },
],
},
{
key: 'service',
title: '服务设置',
icon: 'fas fa-headset',
fields: [
{ key: 'payment_service', label: '客服设置', type: 'textarea', default: '' },
{ key: 'payment_service_icon', label: '客服图标', type: 'icon', default: '' },
{ key: 'payment_service_value', label: '客服内容', type: 'input', default: '' },
{ key: 'payment_service_qq', label: 'QQ客服', type: 'input', default: '' },
{ key: 'payment_service_wechat', label: '微信客服', type: 'media', default: '' },
],
},
],
}
@@ -0,0 +1,72 @@
export const paidSchema = {
key: 'payment.paid',
title: '下载/付费内容中心',
icon: 'fas fa-download',
description: '统一管理资源下载、付费内容、角色免扣和人工交付说明。',
defaults: {
payment_paid_post_types: 'post',
payment_vip_free_download: false,
payment_vip_exempt_roles: '',
payment_paid_catalog_note: '',
payment_manual_delivery_note: '付费或人工确认内容请在订单备注中记录交付方式。',
payment_paid_mark: '付费',
payment_currency_symbol: '¥',
payment_paid_show_user: true,
payment_paid_show_paycount: true,
payment_paid_box_position: 'top',
payment_download_enable: false,
payment_download_remote_s: true,
payment_download_verify_nonce: true,
payment_download_user_log: 50,
payment_download_post_log: 50,
payment_download_remote_size: 2048,
payment_download_remote_ext: 'zip,rar,7z',
},
groups: [
{
key: 'strategy',
title: '付费内容策略',
icon: 'fas fa-layer-group',
fields: [
{ key: 'payment_paid_post_types', label: '受管内容类型', type: 'input', default: 'post', help: '逗号分隔,例如 post,course,doc' },
{ key: 'payment_vip_free_download', label: '角色白名单免扣下载', type: 'switch', default: false },
{ key: 'payment_vip_exempt_roles', label: '免扣角色列表', type: 'input', default: '', help: '逗号分隔的 WordPress role slug,例如 administrator,editor,vip' },
],
},
{
key: 'delivery',
title: '交付说明',
icon: 'fas fa-receipt',
fields: [
{ key: 'payment_paid_catalog_note', label: '前台付费提示', type: 'textarea', default: '', help: '显示在资源/付费内容页的运营说明。' },
{ key: 'payment_manual_delivery_note', label: '人工交付备注', type: 'textarea', default: '付费或人工确认内容请在订单备注中记录交付方式。', help: '人工确认或离线交付流程的标准说明。' },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{ key: 'payment_paid_mark', label: '付费标记', type: 'input', default: '付费' },
{ key: 'payment_currency_symbol', label: '货币符号', type: 'input', default: '¥', help: '商品价格前缀,如 ¥、$、¥' },
{ key: 'payment_paid_show_user', label: '显示购买用户', type: 'switch', default: true },
{ key: 'payment_paid_show_paycount', label: '显示购买次数', type: 'switch', default: true },
{ key: 'payment_paid_box_position', label: '付费框位置', type: 'radio', default: 'top', options: [{ label: '文章模块上', value: 'box_top' }, { label: '内容顶', value: 'top' }, { label: '内容底', value: 'bottom' }, { label: '模块下', value: 'box_bottom' }] },
],
},
{
key: 'download',
title: '下载设置',
icon: 'fas fa-cloud-download-alt',
fields: [
{ key: 'payment_download_enable', label: '启用下载功能', type: 'switch', default: false },
{ key: 'payment_download_remote_s', label: '远程文件下载', type: 'switch', default: true, dependsOn: { key: 'payment_download_enable', value: true } },
{ key: 'payment_download_verify_nonce', label: '下载鉴权', type: 'switch', default: true, dependsOn: { key: 'payment_download_enable', value: true } },
{ key: 'payment_download_user_log', label: '用户下载记录条数', type: 'number', default: 50, min: 0, max: 9999, help: '0 为不保存', dependsOn: { key: 'payment_download_enable', value: true } },
{ key: 'payment_download_post_log', label: '文章下载记录条数', type: 'number', default: 50, min: 0, max: 9999, help: '0 为不保存', dependsOn: { key: 'payment_download_enable', value: true } },
{ key: 'payment_download_remote_size', label: '远程文件大小限制(KB)', type: 'number', default: 2048, min: 1, max: 999999, dependsOn: { key: 'payment_download_remote_s', value: true } },
{ key: 'payment_download_remote_ext', label: '远程文件格式限制', type: 'input', default: 'zip,rar,7z', help: '逗号分隔扩展名', dependsOn: { key: 'payment_download_remote_s', value: true } },
],
},
],
}
@@ -0,0 +1,94 @@
export const rechargeSchema = {
key: 'payment.recharge',
title: '余额充值',
icon: 'fas fa-charging-station',
description: '配置测试充值、手动确认和充值套餐结构。',
defaults: {
payment_recharge_enabled: false,
payment_recharge_mode: 'manual_review',
payment_recharge_desc: '',
payment_recharge_auto_to_balance: true,
payment_recharge_packages: '30|30|入门包\n98|108|推荐包',
payment_recharge_help: '当前支持人工确认与测试联调;接入真实网关时复用同一组字段。',
payment_recharge_product: '',
payment_recharge_price: 0,
payment_recharge_tag: '元',
payment_recharge_tag_class: '',
payment_recharge_custom_s: true,
payment_recharge_custom_limit: 9999,
payment_balance_transfer_s: false,
payment_balance_transfer_service_charge: 0,
payment_balance_transfer_desc: '',
payment_recharge_pass_charge_s: false,
payment_recharge_pass_charge_desc: '',
payment_recharge_pass_charge_only_password: false,
payment_recharge_exchange_s: false,
payment_recharge_exchange_rate: 100,
payment_recharge_exchange_desc: '',
},
groups: [
{
key: 'basic',
title: '充值开关',
icon: 'fas fa-wallet',
fields: [
{ key: 'payment_recharge_enabled', label: '启用余额充值结构', type: 'switch', default: false },
{ key: 'payment_recharge_mode', label: '充值模式', type: 'radio', default: 'manual_review', options: [{ label: '人工确认', value: 'manual_review' }, { label: '测试网关', value: 'test_gateway' }], dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_desc', label: '充值说明', type: 'textarea', default: '', dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_auto_to_balance', label: '自动到账到余额', type: 'switch', default: true, dependsOn: { key: 'payment_recharge_enabled', value: true } },
],
},
{
key: 'packages',
title: '充值套餐',
icon: 'fas fa-box-open',
fields: [
{ key: 'payment_recharge_packages', label: '套餐列表', type: 'textarea', default: '30|30|入门包\n98|108|推荐包', help: '每行一个套餐:支付金额|到账金额|标题', dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_help', label: '帮助文案', type: 'textarea', default: '当前支持人工确认与测试联调;接入真实网关时复用同一组字段。', dependsOn: { key: 'payment_recharge_enabled', value: true } },
],
},
{
key: 'product',
title: '充值产品',
icon: 'fas fa-box',
fields: [
{ key: 'payment_recharge_product', label: '充值产品', type: 'input', default: '', dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_price', label: '充值价格', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_tag', label: '价格标签', type: 'input', default: '元', dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_tag_class', label: '标签样式', type: 'input', default: '', dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_custom_s', label: '自定义金额', type: 'switch', default: true, dependsOn: { key: 'payment_recharge_enabled', value: true } },
{ key: 'payment_recharge_custom_limit', label: '自定义金额限制', type: 'number', default: 9999, min: 1, max: 99999, dependsOn: { key: 'payment_recharge_enabled', value: true } },
],
},
{
key: 'transfer',
title: '余额转账',
icon: 'fas fa-exchange-alt',
fields: [
{ key: 'payment_balance_transfer_s', label: '启用余额转账', type: 'switch', default: false },
{ key: 'payment_balance_transfer_service_charge', label: '转账手续费(%)', type: 'number', default: 0, min: 0, max: 50, dependsOn: { key: 'payment_balance_transfer_s', value: true } },
{ key: 'payment_balance_transfer_desc', label: '转账说明', type: 'textarea', default: '', dependsOn: { key: 'payment_balance_transfer_s', value: true } },
],
},
{
key: 'pass-charge',
title: '充值卡免扣',
icon: 'fas fa-ticket-alt',
fields: [
{ key: 'payment_recharge_pass_charge_s', label: '启用充值卡免扣', type: 'switch', default: false },
{ key: 'payment_recharge_pass_charge_desc', label: '免扣说明', type: 'textarea', default: '', dependsOn: { key: 'payment_recharge_pass_charge_s', value: true } },
{ key: 'payment_recharge_pass_charge_only_password', label: '仅密码免扣', type: 'switch', default: false, dependsOn: { key: 'payment_recharge_pass_charge_s', value: true } },
],
},
{
key: 'exchange',
title: '积分兑换',
icon: 'fas fa-coins',
fields: [
{ key: 'payment_recharge_exchange_s', label: '启用积分兑换', type: 'switch', default: false },
{ key: 'payment_recharge_exchange_rate', label: '兑换比例', type: 'number', default: 100, min: 1, max: 10000, help: 'N 积分 = 1 元', dependsOn: { key: 'payment_recharge_exchange_s', value: true } },
{ key: 'payment_recharge_exchange_desc', label: '兑换说明', type: 'textarea', default: '', dependsOn: { key: 'payment_recharge_exchange_s', value: true } },
],
},
],
}
@@ -0,0 +1,44 @@
export const revenueSchema = {
key: 'payment.revenue',
title: '创作分成',
icon: 'fas fa-chart-line',
description: '配置作者分成比例、结算门槛和结算周期。',
defaults: {
payment_revenue_enabled: false,
payment_revenue_share_ratio: 70,
payment_revenue_ratio_vip1: 0,
payment_revenue_ratio_vip2: 0,
payment_revenue_settlement_threshold: 100,
payment_revenue_cycle_days: 30,
payment_revenue_points_rule: '',
payment_revenue_note: '分成策略和台账结构已就绪,订单入账后自动按比例结算。',
payment_revenue_desc_details: '',
payment_revenue_desc_page: '',
},
groups: [
{
key: 'policy',
title: '分成策略',
icon: 'fas fa-percentage',
fields: [
{ key: 'payment_revenue_enabled', label: '启用创作分成结构', type: 'switch', default: false },
{ key: 'payment_revenue_share_ratio', label: '作者分成比例(%)', type: 'number', default: 70, min: 0, max: 100, dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_ratio_vip1', label: 'VIP1分成比例(%)', type: 'number', default: 0, min: 0, max: 100, dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_ratio_vip2', label: 'VIP2分成比例(%)', type: 'number', default: 0, min: 0, max: 100, dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_settlement_threshold', label: '最小结算金额', type: 'number', default: 100, min: 0, max: 100000, dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_cycle_days', label: '结算周期(天)', type: 'number', default: 30, min: 1, max: 365, dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_points_rule', label: '积分规则', type: 'textarea', default: '', dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_note', label: '结算备注', type: 'textarea', default: '分成策略和台账结构已就绪,订单入账后自动按比例结算。', dependsOn: { key: 'payment_revenue_enabled', value: true } },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-file-alt',
fields: [
{ key: 'payment_revenue_desc_details', label: '收益明细文案', type: 'textarea', default: '', dependsOn: { key: 'payment_revenue_enabled', value: true } },
{ key: 'payment_revenue_desc_page', label: '收益说明页', type: 'input', default: '', dependsOn: { key: 'payment_revenue_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,102 @@
export const vipSchema = {
key: 'payment.vip',
title: 'VIP会员',
icon: 'fas fa-crown',
description: '配置会员名称、套餐和付费权益说明。',
defaults: {
payment_vip_enabled: false,
payment_vip_name: 'VIP会员',
payment_vip_badge_text: 'VIP',
payment_vip_desc: '',
payment_vip_packages: '30|30|月卡\n365|365|年卡',
payment_vip_help: '会员权益以免扣下载和身份展示为主,开通后立即生效。',
payment_vip_download_limit: 0,
payment_vip_download_speed: 0,
payment_vip_discount: 100,
payment_vip_pass_charge: false,
payment_vip_pass_charge_desc: '',
payment_vip_renew: true,
payment_vip_renew_desc: '',
payment_vip_renew_price_type: 'same',
payment_vip_renew_discount: 100,
payment_vip_renew_reduce: 0,
payment_vip_upgrade: true,
payment_vip_upgrade_desc: '',
payment_vip_upgrade_product: '',
payment_vip_month_price: 0,
payment_vip_year_price: 0,
payment_vip_permanent_price: 0,
payment_vip_unit_price: 0,
payment_vip_unit_tag: '元',
payment_vip_jump_price: 0,
},
groups: [
{
key: 'basic',
title: '会员基础',
icon: 'fas fa-user-shield',
fields: [
{ key: 'payment_vip_enabled', label: '启用会员结构', type: 'switch', default: false },
{ key: 'payment_vip_name', label: '会员名称', type: 'input', default: 'VIP会员', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_badge_text', label: '会员徽标文案', type: 'input', default: 'VIP', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_desc', label: '会员说明', type: 'textarea', default: '', dependsOn: { key: 'payment_vip_enabled', value: true } },
],
},
{
key: 'packages',
title: '会员套餐',
icon: 'fas fa-gem',
fields: [
{ key: 'payment_vip_packages', label: '套餐列表', type: 'textarea', default: '30|30|月卡\n365|365|年卡', help: '每行一个套餐:价格|时长(天)|标题', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_help', label: '权益说明', type: 'textarea', default: '会员权益以免扣下载和身份展示为主,开通后立即生效。', dependsOn: { key: 'payment_vip_enabled', value: true } },
],
},
{
key: 'benefit',
title: '会员权益',
icon: 'fas fa-gift',
fields: [
{ key: 'payment_vip_download_limit', label: '下载限制', type: 'number', default: 0, min: 0, max: 9999, help: '0为不限制', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_download_speed', label: '下载速度(KB/s)', type: 'number', default: 0, min: 0, max: 99999, help: '0为不限制', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_discount', label: '折扣(%)', type: 'number', default: 100, min: 1, max: 100, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_pass_charge', label: '积分充值免扣', type: 'switch', default: false, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_pass_charge_desc', label: '积分充值说明', type: 'textarea', default: '', dependsOn: { key: 'payment_vip_enabled', value: true } },
],
},
{
key: 'renew',
title: '续费设置',
icon: 'fas fa-sync-alt',
fields: [
{ key: 'payment_vip_renew', label: '允许续费', type: 'switch', default: true, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_renew_desc', label: '续费说明', type: 'textarea', default: '', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_renew_price_type', label: '续费价格类型', type: 'radio', default: 'same', options: [{ label: '相同价格', value: 'same' }, { label: '折扣价格', value: 'discount' }], dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_renew_discount', label: '续费折扣(%)', type: 'number', default: 100, min: 1, max: 100, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_renew_reduce', label: '续费减免金额', type: 'number', default: 0, min: 0, max: 9999, dependsOn: { key: 'payment_vip_enabled', value: true } },
],
},
{
key: 'upgrade',
title: '升级设置',
icon: 'fas fa-arrow-up',
fields: [
{ key: 'payment_vip_upgrade', label: '允许升级', type: 'switch', default: true, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_upgrade_desc', label: '升级说明', type: 'textarea', default: '', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_upgrade_product', label: '升级产品', type: 'input', default: '', dependsOn: { key: 'payment_vip_enabled', value: true } },
],
},
{
key: 'price',
title: '价格设置',
icon: 'fas fa-yen-sign',
fields: [
{ key: 'payment_vip_month_price', label: '月卡价格', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_year_price', label: '年卡价格', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_permanent_price', label: '永久价格', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_unit_price', label: '单位价格', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_unit_tag', label: '单位标签', type: 'input', default: '元', dependsOn: { key: 'payment_vip_enabled', value: true } },
{ key: 'payment_vip_jump_price', label: '跳转价格', type: 'number', default: 0, min: 0, max: 99999, dependsOn: { key: 'payment_vip_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,23 @@
export const withdrawalSchema = {
key: 'payment.withdrawal',
title: '提现管理',
icon: 'fas fa-hand-holding-usd',
description: '配置提现门槛、手续费比例和提现说明。',
defaults: {
pay_rebate_withdraw_lowest_money: 50,
withdraw_service_charge: 0,
pay_rebate_withdraw_text_details: '',
},
groups: [
{
key: 'basic',
title: '提现设置',
icon: 'fas fa-sliders-h',
fields: [
{ key: 'pay_rebate_withdraw_lowest_money', label: '最低提现金额', type: 'number', default: 50, min: 1, max: 99999 },
{ key: 'withdraw_service_charge', label: '提现手续费(%)', type: 'number', default: 0, min: 0, max: 50 },
{ key: 'pay_rebate_withdraw_text_details', label: '提现说明', type: 'textarea', default: '' },
],
},
],
}
@@ -0,0 +1,316 @@
/**
* Permissions & Security domain schemas.
* Section keys must stay aligned with the router and PHP schema provider.
*/
export const permissionsSchemas = {
/**
* Login / captcha / access guard settings
*/
login: {
key: 'permissions.login',
title: '登录权限',
icon: 'fas fa-shield-alt',
description: '管理登录、注册、评论等场景的人机验证与访问限制。',
defaults: {
enabled: false,
active_provider: '',
mode: 'always',
disabled_scenarios: [],
tencent: {},
aliyun: {},
cloudflare: {},
geetest: {},
},
groups: [
{
key: 'basic',
title: '基础设置',
icon: 'fas fa-cog',
fields: [
{ key: 'enabled', label: '启用人机验证', type: 'switch', help: '开启后将在指定场景要求用户完成人机验证' },
{
key: 'active_provider',
label: '当前服务商',
type: 'radio',
buttonStyle: false,
options: [
{ label: '腾讯云 Captcha', value: 'tencent' },
{ label: '阿里云 CAPTCHA 2.0', value: 'aliyun' },
{ label: 'Cloudflare Turnstile', value: 'cloudflare' },
{ label: '极验 GeeTest', value: 'geetest' },
],
dependsOn: 'enabled',
},
{
key: 'mode',
label: '触发模式',
type: 'radio',
buttonStyle: false,
options: [
{ label: '始终显示', value: 'always' },
],
dependsOn: 'enabled',
},
{
key: 'disabled_scenarios',
label: '停用场景',
type: 'checkbox',
help: '勾选后表示该场景不启用人机验证;未勾选的场景会启用。',
dependsOn: 'enabled',
options: [
{ label: '发表评论', value: 'comment' },
{ label: '用户登录', value: 'login' },
{ label: '用户注册', value: 'register' },
{ label: '绑定第三方', value: 'bind' },
{ label: '找回密码', value: 'lostpassword' },
{ label: '修改密码', value: 'change_password' },
{ label: '更改邮箱', value: 'change_email' },
{ label: '邮箱验证', value: 'verify_email' },
{ label: '资源下载', value: 'download' },
{ label: '每日签到', value: 'signin' },
],
},
],
},
{
key: 'providers',
title: '服务商配置',
icon: 'fas fa-server',
description: '按当前选择的服务商填写对应密钥。',
fields: [
{
key: 'provider_hint',
label: '配置说明',
type: 'notice',
alertType: 'info',
alertContent: '下方会渲染当前验证码服务商的专属配置面板。保存仍通过统一 schema contract 进行。',
dependsOn: 'enabled',
},
{ key: 'tencent', label: '腾讯云配置', type: 'custom', dependsOn: { key: 'active_provider', value: 'tencent' } },
{ key: 'aliyun', label: '阿里云配置', type: 'custom', dependsOn: { key: 'active_provider', value: 'aliyun' } },
{ key: 'cloudflare', label: 'Cloudflare 配置', type: 'custom', dependsOn: { key: 'active_provider', value: 'cloudflare' } },
{ key: 'geetest', label: '极验配置', type: 'custom', dependsOn: { key: 'active_provider', value: 'geetest' } },
],
},
],
},
/**
* Capability matrix metadata contract.
* The live page is still orchestration-heavy custom UI for now.
*/
capabilities: {
key: 'permissions.capabilities',
title: '基本权限 / 能力矩阵',
icon: 'fas fa-user-shield',
description: '统一管理用户治理、投稿和评论的角色能力矩阵。',
defaults: {},
groups: [],
},
/**
* Moderation settings
*/
moderation: {
key: 'permissions.moderation',
title: '审核和风控',
icon: 'fas fa-gavel',
description: '管理评论审核、反垃圾、限流与风控配置。',
defaults: {
enabled: false,
akismet_enabled: false,
akismet_site_url: '',
akismet_blog_lang: 'zh-CN',
akismet_api_key: '',
ai_enabled: false,
ai_moderate_comments: true,
ai_moderate_background: true,
auto_approve_low_risk: false,
auto_reject_high_risk: false,
low_risk_max_score: 35,
high_risk_min_score: 80,
blocked_keywords: '',
rate_limit_enabled: false,
rate_limit_min_interval: 8,
rate_limit_max_per_hour: 15,
geoip_enabled: false,
geoip_block_countries: [],
},
groups: [
{
key: 'basic',
title: '审核总开关',
icon: 'fas fa-power-off',
fields: [
{ key: 'enabled', label: '启用审核系统', type: 'switch', help: '关闭后评论将不经过主题审核链路。' },
],
},
{
key: 'akismet',
title: 'Akismet',
icon: 'fas fa-filter',
fields: [
{ key: 'akismet_enabled', label: '启用 Akismet', type: 'switch', dependsOn: 'enabled' },
{ key: 'akismet_site_url', label: 'Site URL', type: 'input', placeholder: 'https://your-site.com', dependsOn: { key: 'akismet_enabled', value: true } },
{ key: 'akismet_blog_lang', label: '博客语言', type: 'input', placeholder: 'zh-CN', dependsOn: { key: 'akismet_enabled', value: true } },
{ key: 'akismet_api_key', label: 'API Key', type: 'input', inputType: 'password', placeholder: 'Akismet API Key', dependsOn: { key: 'akismet_enabled', value: true } },
],
},
{
key: 'ai',
title: 'AI 审核',
icon: 'fas fa-robot',
fields: [
{ key: 'ai_enabled', label: '启用 AI 审核', type: 'switch', dependsOn: 'enabled' },
{ key: 'ai_api_hint', label: '审核 API 配置', type: 'notice', alertType: 'info', alertContent: 'API 接入(百度/阿里云等)在「扩展 → API内容审核」中统一配置,此处仅控制审核范围和策略。', dependsOn: { key: 'ai_enabled', value: true } },
{ key: 'ai_moderate_comments', label: '用户评论', type: 'switch', dependsOn: { key: 'ai_enabled', value: true } },
{ key: 'ai_moderate_background', label: '用户资料背景', type: 'switch', dependsOn: { key: 'ai_enabled', value: true } },
{ key: 'auto_approve_low_risk', label: '低风险自动通过', type: 'switch', dependsOn: { key: 'ai_enabled', value: true } },
{ key: 'auto_reject_high_risk', label: '高风险自动拒绝', type: 'switch', dependsOn: { key: 'ai_enabled', value: true } },
{ key: 'low_risk_max_score', label: '低风险上限', type: 'number', min: 0, max: 100, dependsOn: { key: 'ai_enabled', value: true } },
{ key: 'high_risk_min_score', label: '高风险下限', type: 'number', min: 0, max: 100, dependsOn: { key: 'ai_enabled', value: true } },
],
},
{
key: 'keywords',
title: '关键词拦截',
icon: 'fas fa-ban',
fields: [
{ key: 'blocked_keywords', label: '屏蔽关键词列表', type: 'textarea', rows: 4, placeholder: '每行一个关键词,也支持 /regex/i 格式。命中后会进入待审核并记录原因。', dependsOn: 'enabled' },
],
},
{
key: 'rate-limit',
title: '频率限制',
icon: 'fas fa-stopwatch',
fields: [
{ key: 'rate_limit_enabled', label: '启用频率限制', type: 'switch', dependsOn: 'enabled' },
{ key: 'rate_limit_min_interval', label: '最小间隔(秒)', type: 'number', min: 1, max: 300, dependsOn: { key: 'rate_limit_enabled', value: true } },
{ key: 'rate_limit_max_per_hour', label: '每小时上限', type: 'number', min: 1, max: 200, dependsOn: { key: 'rate_limit_enabled', value: true } },
],
},
{
key: 'geoip',
title: 'GeoIP 拦截',
icon: 'fas fa-globe-asia',
fields: [
{ key: 'geoip_enabled', label: '启用 GeoIP 拦截', type: 'switch', dependsOn: 'enabled' },
{ key: 'geoip_hint', label: 'IP 数据源', type: 'notice', alertType: 'info', alertContent: '复用「扩展 → IP归属地」中配置的数据源和 API Key。', dependsOn: { key: 'geoip_enabled', value: true } },
{ key: 'geoip_block_countries', label: '屏蔽国家/地区', type: 'custom', dependsOn: { key: 'geoip_enabled', value: true } },
],
},
],
},
/**
* Comment permissions
*/
comment: {
key: 'permissions.comment',
title: '评论权限',
icon: 'fas fa-comment-dots',
description: '控制评论功能的开关和权限要求。',
defaults: {
comment_allow: true,
comment_require_login: false,
comment_nested_depth: 3,
comment_allow_reply: true,
},
groups: [
{
key: 'basic',
title: '评论基础',
icon: 'fas fa-cog',
fields: [
{ key: 'comment_allow', label: '允许评论', type: 'switch', help: '全局开启评论功能' },
{ key: 'comment_require_login', label: '需登录评论', type: 'switch', help: '只有登录用户才能评论' },
{ key: 'comment_nested_depth', label: '嵌套层级', type: 'slider', min: 1, max: 5, default: 3 },
{ key: 'comment_allow_reply', label: '允许回复', type: 'switch' },
],
},
],
},
/**
* Attachment permissions
*/
attachment: {
key: 'permissions.attachment',
title: '附件权限',
icon: 'fas fa-paperclip',
description: '控制文件上传和附件下载权限。',
defaults: {
allow_avatar_upload: true,
allow_cover_upload: true,
allow_background_upload: false,
avatar_max_size: 2,
allow_submit_images: true,
submit_image_max_size: 5,
allow_comment_images: false,
comment_image_max_size: 2,
allow_resource_upload: true,
resource_max_size: 50,
},
groups: [
{
key: 'profile',
title: '头像与封面',
icon: 'fas fa-user-circle',
fields: [
{ key: 'allow_avatar_upload', label: '允许用户上传头像', type: 'switch' },
{ key: 'allow_cover_upload', label: '允许用户上传封面图', type: 'switch' },
{ key: 'allow_background_upload', label: '允许用户上传背景图', type: 'switch' },
{ key: 'avatar_max_size', label: '头像/封面大小上限 (MB)', type: 'number', min: 1, max: 10 },
],
},
{
key: 'content',
title: '内容上传',
icon: 'fas fa-images',
fields: [
{ key: 'allow_submit_images', label: '允许投稿插入图片', type: 'switch' },
{ key: 'submit_image_max_size', label: '投稿图片大小上限 (MB)', type: 'number', min: 1, max: 20 },
{ key: 'allow_comment_images', label: '允许评论插入图片', type: 'switch' },
{ key: 'comment_image_max_size', label: '评论图片大小上限 (MB)', type: 'number', min: 1, max: 10 },
],
},
{
key: 'resource',
title: '资源附件',
icon: 'fas fa-file-archive',
fields: [
{ key: 'allow_resource_upload', label: '允许资源附件上传', type: 'switch' },
{ key: 'resource_max_size', label: '资源附件大小上限 (MB)', type: 'number', min: 1, max: 200 },
],
},
],
},
/**
* Download permissions
*/
download: {
key: 'permissions.download',
title: '下载权限',
icon: 'fas fa-download',
description: '控制资源下载的权限和限制。',
defaults: {
download_require_login: false,
download_daily_limit: 0,
download_captcha: false,
},
groups: [
{
key: 'basic',
title: '下载设置',
icon: 'fas fa-cog',
fields: [
{ key: 'download_require_login', label: '需登录下载', type: 'switch' },
{ key: 'download_daily_limit', label: '每日下载限制', type: 'number', min: 0, help: '0 表示不限制' },
{ key: 'download_captcha', label: '下载验证码', type: 'switch', help: '下载前需要验证码' },
],
},
],
},
};
@@ -0,0 +1,100 @@
export const commentSchema = {
key: 'post_list.comment',
title: '评论设置',
icon: 'fas fa-comment-dots',
description: '配置评论区的排序、分页、权限、工具栏与互动方式。',
defaults: {
comment_order: 'asc',
comment_per_page: 20,
comment_pagination_type: 'numbered',
comment_paging_ajax_ias_s: true,
comment_paging_ajax_ias_max: 3,
comment_nested_depth: 3,
comment_avatar_size: 48,
comment_require_login: false,
comment_allow_reply: true,
comment_close_comments: false,
comment_edit_window: 10,
comment_smilie: true,
comment_code: true,
comment_img: true,
comment_upload_img: false,
comment_like_s: true,
comment_quick_s: true,
comment_city_s: true,
comment_author_tag: true,
comment_corderby: true,
comment_empty_text: '暂无评论,来做第一个评论的人吧~',
comment_title: '评论',
comment_submit_text: '提交评论',
comment_text: '说点什么吧...',
},
groups: [
{
key: 'display',
title: '评论展示',
icon: 'fas fa-comment',
fields: [
{ key: 'comment_order', label: '评论排序', type: 'radio', default: 'asc', options: [
{ label: '正序 (旧→新)', value: 'asc' },
{ label: '倒序 (新→旧)', value: 'desc' },
]},
{ key: 'comment_per_page', label: '每页评论数', type: 'number', default: 20, min: 5, max: 100 },
{ key: 'comment_pagination_type', label: '分页方式', type: 'radio', default: 'numbered', options: [
{ label: '翻页', value: 'numbered' },
{ label: '加载更多', value: 'load_more' },
{ label: '无限滚动', value: 'infinite' },
]},
{ key: 'comment_paging_ajax_ias_s', label: '评论自动加载', type: 'switch', default: true, help: '评论无限滚动时自动触发加载' },
{ key: 'comment_paging_ajax_ias_max', label: '评论最大加载页数', type: 'number', default: 3, min: 0, max: 10, help: '0 = 不限' },
{ key: 'comment_nested_depth', label: '回复嵌套深度', type: 'number', default: 3, min: 1, max: 10 },
{ key: 'comment_avatar_size', label: '头像大小 (px)', type: 'number', default: 48, min: 24, max: 96 },
],
},
{
key: 'permissions',
title: '评论权限',
icon: 'fas fa-lock',
fields: [
{ key: 'comment_require_login', label: '评论需要登录', type: 'switch', default: false },
{ key: 'comment_allow_reply', label: '允许回复', type: 'switch', default: true },
{ key: 'comment_close_comments', label: '关闭评论', type: 'switch', default: false },
{ key: 'comment_edit_window', label: '作者自助编辑时限 (分钟)', type: 'number', default: 10, min: 0, max: 1440 },
],
},
{
key: 'toolbar',
title: '评论工具栏',
icon: 'fas fa-toolbox',
fields: [
{ key: 'comment_smilie', label: 'Emoji 表情', type: 'switch', default: true },
{ key: 'comment_code', label: '代码插入', type: 'switch', default: true },
{ key: 'comment_img', label: '图片按钮', type: 'switch', default: true },
{ key: 'comment_upload_img', label: '评论图片上传', type: 'switch', default: false },
],
},
{
key: 'interaction',
title: '互动功能',
icon: 'fas fa-heart',
fields: [
{ key: 'comment_like_s', label: '评论点赞', type: 'switch', default: true },
{ key: 'comment_quick_s', label: '快捷回复', type: 'switch', default: true },
{ key: 'comment_city_s', label: '评论城市', type: 'switch', default: true },
{ key: 'comment_author_tag', label: '作者标签', type: 'switch', default: true },
{ key: 'comment_corderby', label: '评论排序切换', type: 'switch', default: true, help: '前台显示最新/最早/最热切换按钮' },
],
},
{
key: 'text',
title: '文案配置',
icon: 'fas fa-font',
fields: [
{ key: 'comment_empty_text', label: '空评论提示', type: 'input', default: '暂无评论,来做第一个评论的人吧~' },
{ key: 'comment_title', label: '评论区标题', type: 'input', default: '评论' },
{ key: 'comment_submit_text', label: '提交按钮文案', type: 'input', default: '提交评论' },
{ key: 'comment_text', label: '评论框提示', type: 'input', default: '说点什么吧...' },
],
},
],
}
@@ -0,0 +1,25 @@
export const featureSchema = {
key: 'post_list.feature',
title: '文章功能',
icon: 'fas fa-magic',
description: '配置文章页的互动功能开关。',
defaults: {
feature_pdf_export: false,
feature_print: true,
feature_word_count: true,
feature_reading_time: true,
},
groups: [
{
key: 'tools',
title: '工具功能',
icon: 'fas fa-tools',
fields: [
{ key: 'feature_print', label: '打印文章', type: 'switch', default: true },
{ key: 'feature_word_count', label: '字数统计', type: 'switch', default: true },
{ key: 'feature_reading_time', label: '预计阅读时间', type: 'switch', default: true },
{ key: 'feature_pdf_export', label: 'PDF 导出', type: 'switch', default: false, help: '实验性功能' },
],
},
],
}
@@ -0,0 +1,110 @@
export const filterSchema = {
key: 'post_list.filter',
title: '高级筛选',
icon: 'fas fa-filter',
description: '为文章列表配置筛选栏、排序方式和分类筛选功能。',
defaults: {
filter_enabled: false,
filter_categories: true,
filter_tags: false,
filter_sort: true,
filter_ajax_enabled: true,
filter_cat_show_cat: true,
filter_cat_show_tag: false,
filter_tag_show_cat: true,
filter_tag_show_tag: false,
filter_topics_show_cat: true,
filter_topics_show_tag: false,
custom_filter_show: ['cat', 'tag'],
custom_filter: [],
cat_custom_filter: [],
},
groups: [
{
key: 'basic',
title: '筛选基础',
icon: 'fas fa-filter',
fields: [
{ key: 'filter_enabled', label: '启用筛选栏', type: 'switch', default: false },
{ key: 'custom_filter_show', label: '筛选显示页面', type: 'checkbox', default: ['cat', 'tag'], options: [{ label: '分类页', value: 'cat' }, { label: '标签页', value: 'tag' }, { label: '专题页', value: 'topics' }], help: '选择在哪些页面显示筛选栏', dependsOn: { key: 'filter_enabled', value: true } },
{ key: 'filter_categories', label: '分类筛选', type: 'switch', default: true, dependsOn: { key: 'filter_enabled', value: true } },
{ key: 'filter_tags', label: '标签筛选', type: 'switch', default: false, dependsOn: { key: 'filter_enabled', value: true } },
{ key: 'filter_sort', label: '排序选项', type: 'switch', default: true, dependsOn: { key: 'filter_enabled', value: true } },
{ key: 'filter_ajax_enabled', label: 'AJAX 无刷新筛选', type: 'switch', default: true, help: '启用后分类/标签/排序切换将通过 AJAX 加载,无需刷新页面', dependsOn: { key: 'filter_enabled', value: true } },
],
},
{
key: 'ajax',
title: 'AJAX 筛选维度',
icon: 'fas fa-layer-group',
fields: [
{ key: 'filter_cat_show_cat', label: '分类页:显示分类筛选', type: 'switch', default: true },
{ key: 'filter_cat_show_tag', label: '分类页:显示标签筛选', type: 'switch', default: false },
{ key: 'filter_tag_show_cat', label: '标签页:显示分类筛选', type: 'switch', default: true },
{ key: 'filter_tag_show_tag', label: '标签页:显示标签筛选', type: 'switch', default: false },
{ key: 'filter_topics_show_cat', label: '专题页:显示分类筛选', type: 'switch', default: true },
{ key: 'filter_topics_show_tag', label: '专题页:显示标签筛选', type: 'switch', default: false },
],
},
{
key: 'custom_filter',
title: '自定义筛选维度',
icon: 'fas fa-sliders-h',
fields: [
{
key: 'custom_filter',
label: '筛选维度定义',
type: 'repeater',
default: [],
addText: '添加筛选维度',
help: '每项定义一个筛选维度(如"类型""地区""年份"),及其可选值列表',
fields: [
{ key: 'name', label: '维度名称', type: 'input', default: '', placeholder: '如:类型' },
{ key: 'key', label: '维度标识', type: 'input', default: '', placeholder: '如:type(英文下划线)' },
{
key: 'vals',
label: '可选值',
type: 'repeater',
default: [],
addText: '添加可选值',
fields: [
{ key: 'key', label: '标识', type: 'input', default: '', placeholder: '如:action' },
{ key: 'name', label: '显示名', type: 'input', default: '', placeholder: '如:动作' },
],
},
],
},
],
},
{
key: 'cat_custom_filter',
title: '按分类绑定筛选',
icon: 'fas fa-object-group',
fields: [
{
key: 'cat_custom_filter',
label: '分类筛选绑定',
type: 'repeater',
default: [],
addText: '添加绑定规则',
help: '为指定分类绑定不同的筛选维度组合,实现分类级别的差异化筛选',
fields: [
{ key: 'cats', label: '绑定分类', type: 'taxonomy_select', taxonomy: 'category', multiple: true, default: [] },
{ key: 'cat_s', label: '显示分类筛选', type: 'switch', default: true },
{ key: 'tag_s', label: '显示标签筛选', type: 'switch', default: false },
{ key: 'topics_s', label: '显示专题筛选', type: 'switch', default: false },
{ key: 'orderby_s', label: '显示排序按钮', type: 'switch', default: true },
{
key: 'custom_filters',
label: '启用的自定义维度',
type: 'input',
default: '',
placeholder: '逗号分隔维度标识,如:type,region,year',
help: '留空表示使用全部已定义的筛选维度',
},
],
},
],
},
],
}
@@ -0,0 +1,25 @@
/**
* Post & List domain schemas.
*/
import { listSchema } from './list.js'
import { thumbSchema } from './thumb.js'
import { pageSchema } from './page.js'
import { filterSchema } from './filter.js'
import { featureSchema } from './feature.js'
import { paySchema } from './pay.js'
import { shareSchema } from './share.js'
import { commentSchema } from './comment.js'
import { submitSchema } from './submit.js'
export const postListSchemas = {
list: listSchema,
thumb: thumbSchema,
page: pageSchema,
filter: filterSchema,
feature: featureSchema,
pay: paySchema,
share: shareSchema,
comment: commentSchema,
submit: submitSchema,
}
@@ -0,0 +1,158 @@
export const listSchema = {
key: 'post_list.list',
title: '文章列表',
icon: 'fas fa-list',
description: '配置文章列表的卡片样式、元信息显示、分页方式和排序规则。',
defaults: {
post_card_style: 'standard',
post_show_author: true,
post_show_date: true,
post_show_views: true,
post_show_category: true,
post_excerpt_length: 120,
post_pagination_mode: 'numeric',
ias_max: 3,
ajax_trigger_text: '',
ajax_nomore_text: '',
sticky_s: ['home', 'cat'],
list_badge_show: ['pay', 'tag', 'topics', 'cat'],
post_target_blank: false,
item_heading_bold: false,
list_orderby: 'modified',
list_meta_show: 'like',
list_show_type: 'separate',
thumb_postfirstimg_size: 'medium',
post_t_placeholder: '',
post_c_placeholder: '',
list_list_style: '',
list_list_img_position: 'left',
list_list_scale: 70,
list_card_style: '',
list_card_scale: 70,
list_card_home: false,
list_card_cat: [],
list_card_tag: false,
list_card_topics: false,
list_card_author: false,
},
groups: [
{
key: 'card',
title: '卡片样式',
icon: 'fas fa-th-large',
fields: [
{ key: 'post_card_style', label: '卡片样式', type: 'select', default: 'standard', options: [
{ label: '标准卡', value: 'standard' },
{ label: '紧凑卡', value: 'compact' },
{ label: '大图卡', value: 'large_thumb' },
{ label: '多图卡', value: 'multi_thumb' },
{ label: '纯文字', value: 'text' },
{ label: '有图则图文', value: 'thumb_if_has' },
]},
{ key: 'post_excerpt_length', label: '摘要长度 (字)', type: 'number', default: 120, min: 20, max: 500 },
],
},
{
key: 'meta',
title: '元信息显示',
icon: 'fas fa-info-circle',
fields: [
{ key: 'post_show_author', label: '显示作者', type: 'switch', default: true },
{ key: 'post_show_date', label: '显示日期', type: 'switch', default: true },
{ key: 'post_show_views', label: '显示浏览数', type: 'switch', default: true },
{ key: 'post_show_category', label: '显示分类', type: 'switch', default: true },
{ key: 'list_badge_show', label: '显示徽章类型', type: 'checkbox', default: ['pay', 'tag', 'topics', 'cat'], options: [
{ label: '付费', value: 'pay' },
{ label: '分类', value: 'cat' },
{ label: '专题', value: 'topics' },
{ label: '标签', value: 'tag' },
], help: '选择列表中显示哪些徽章类型' },
{ key: 'list_meta_show', label: '移动端优先部件', type: 'radio', default: 'like', options: [
{ label: '浏览数', value: 'view' },
{ label: '点赞数', value: 'like' },
{ label: '评论数', value: 'comm' },
], help: '移动端空间不足时保留显示的单一部件' },
],
},
{
key: 'pagination',
title: '分页方式',
icon: 'fas fa-ellipsis-h',
fields: [
{ key: 'post_pagination_mode', label: '分页模式', type: 'radio', default: 'numeric', options: [
{ label: '数字分页', value: 'numeric' },
{ label: '加载更多', value: 'load_more' },
{ label: '无限滚动', value: 'infinite' },
]},
{ key: 'ias_max', label: '最大加载页数', type: 'number', default: 3, min: 0, max: 10, help: '0 = 不限' },
{ key: 'ajax_trigger_text', label: '加载更多文案', type: 'input', default: '', help: '留空使用默认"加载更多"' },
{ key: 'ajax_nomore_text', label: '没有更多文案', type: 'input', default: '', help: '留空使用默认"没有更多了"' },
],
},
{
key: 'layout',
title: '布局设置',
icon: 'fas fa-columns',
fields: [
{ key: 'sticky_s', label: '置顶范围', type: 'checkbox', default: ['home', 'cat'], options: [
{ label: '首页', value: 'home' },
{ label: '分类页', value: 'cat' },
{ label: '标签页', value: 'tag' },
{ label: '专题页', value: 'topics' },
], help: '选择哪些页面类型显示置顶文章' },
{ key: 'post_target_blank', label: '新窗口打开', type: 'switch', default: false, help: '文章链接在新窗口打开' },
{ key: 'item_heading_bold', label: '标题加粗', type: 'switch', default: false, help: '列表文章标题使用粗体' },
{ key: 'list_show_type', label: '列表样式', type: 'radio', default: 'separate', options: [
{ label: '分隔卡片', value: 'separate' },
{ label: '无间距', value: 'no_margin' },
], help: '列表模式时的卡片间距样式' },
{ key: 'list_card_home', label: '首页卡片模式', type: 'switch', default: false, help: '首页列表切换为卡片模式' },
{ key: 'list_card_cat', label: '分类卡片模式', type: 'taxonomy_select', taxonomy: 'category', multiple: true, default: [], help: '选择分类,访问这些分类时使用卡片模式显示(为空则不使用)' },
{ key: 'list_card_tag', label: '标签页卡片模式', type: 'switch', default: false, help: '标签页列表切换为卡片模式' },
{ key: 'list_card_topics', label: '专题页卡片模式', type: 'switch', default: false, help: '专题页列表切换为卡片模式' },
{ key: 'list_card_author', label: '用户页卡片模式', type: 'switch', default: false, help: '用户页列表切换为卡片模式' },
],
},
{
key: 'sort',
title: '默认排序',
icon: 'fas fa-sort',
fields: [
{ key: 'list_orderby', label: '列表默认排序', type: 'radio', default: 'modified', options: [
{ label: '更新时间', value: 'modified' },
{ label: '发布时间', value: 'date' },
{ label: '评论数', value: 'comments' },
{ label: 'WordPress 默认', value: 'default' },
], help: '分类/标签/归档页面的默认排序方式' },
],
},
{
key: 'list_option',
title: '列表模式配置',
icon: 'fas fa-list-ul',
fields: [
{ key: 'list_list_style', label: '列表样式变体', type: 'radio', default: '', options: [
{ label: '默认', value: '' },
{ label: '样式2', value: 'style2' },
], help: '列表模式的样式变体' },
{ key: 'list_list_img_position', label: '缩略图位置', type: 'radio', default: 'left', options: [
{ label: '左侧', value: 'left' },
{ label: '右侧', value: 'right' },
], help: '列表模式缩略图靠左或靠右' },
{ key: 'list_list_scale', label: '缩略图比例 (%)', type: 'number', default: 70, min: 50, max: 200, help: '列表模式缩略图宽度百分比' },
],
},
{
key: 'card_option',
title: '卡片模式配置',
icon: 'fas fa-th',
fields: [
{ key: 'list_card_style', label: '卡片样式变体', type: 'radio', default: '', options: [
{ label: '默认', value: '' },
{ label: '样式3', value: 'style3' },
], help: '卡片模式的样式变体' },
{ key: 'list_card_scale', label: '缩略图比例 (%)', type: 'number', default: 70, min: 20, max: 200, help: '卡片模式缩略图高度百分比' },
],
},
],
}
@@ -0,0 +1,155 @@
export const pageSchema = {
key: 'post_list.page',
title: '文章页面',
icon: 'fas fa-file-alt',
description: '配置单篇文章页面的布局、目录树、图片灯箱、版权区和互动功能。',
defaults: {
post_toc_enabled: true,
post_toc_depth: 3,
article_nav_mobile_nav_s: true,
post_reading_progress: true,
breadcrumbs_single_s: true,
breadcrumbs_home_text: '首页',
post_prevnext_s: true,
post_authordesc_s: true,
post_single_hide_time_s: false,
post_lightbox: true,
post_lightbox_thumbs: true,
post_lightbox_zoom: true,
post_lightbox_full: true,
post_lightbox_down: false,
post_lightbox_play: false,
post_related_enabled: true,
post_related_count: 6,
post_related_type: 'category',
post_related_orderby: 'rand',
post_related_title: '相关推荐',
post_copyright_enabled: true,
post_copyright_text: '',
share_s: true,
post_like_enabled: true,
post_favorite_enabled: true,
post_front_content: '',
post_after_content: '',
post_yiyan_header: false,
post_yiyan_footer: false,
post_yiyan_box: false,
post_default_views_min: 20,
post_default_views_max: 50,
post_default_likes_min: 5,
post_default_likes_max: 15,
post_article_image_cover: true,
post_article_image_cover_scale: 35,
post_article_slide_cover: true,
post_article_video_cover: true,
post_article_video_cover_scale: 56,
item_heading_bold: false,
post_button_toptext: '喜欢就支持一下吧',
},
groups: [
{
key: 'navigation',
title: '文章导航',
icon: 'fas fa-compass',
fields: [
{ key: 'post_toc_enabled', label: '目录树导航', type: 'switch', default: true, help: '自动生成文章目录树' },
{ key: 'post_toc_depth', label: '目录深度', type: 'number', default: 3, min: 1, max: 6, dependsOn: { key: 'post_toc_enabled', value: true } },
{ key: 'article_nav_mobile_nav_s', label: '移动端弹出菜单', type: 'switch', default: true, dependsOn: { key: 'post_toc_enabled', value: true }, help: '在移动端弹出菜单中显示目录导航' },
{ key: 'post_reading_progress', label: '阅读进度条', type: 'switch', default: true },
{ key: 'breadcrumbs_single_s', label: '面包屑导航', type: 'switch', default: true },
{ key: 'breadcrumbs_home_text', label: '面包屑首页文字', type: 'input', default: '首页', dependsOn: { key: 'breadcrumbs_single_s', value: true } },
{ key: 'post_prevnext_s', label: '上一篇/下一篇', type: 'switch', default: true },
{ key: 'post_authordesc_s', label: '作者简介', type: 'switch', default: true },
{ key: 'post_single_hide_time_s', label: '隐藏文章时间', type: 'switch', default: false },
],
},
{
key: 'cover',
title: '封面展示',
icon: 'fas fa-image',
fields: [
{ key: 'post_article_image_cover', label: '图片封面', type: 'switch', default: true, help: '文章有特色图时自动展示封面' },
{ key: 'post_article_image_cover_scale', label: '封面高度比例(%)', type: 'number', default: 35, min: 10, max: 100, dependsOn: { key: 'post_article_image_cover', value: true } },
{ key: 'post_article_slide_cover', label: '幻灯片封面', type: 'switch', default: true, help: '文章有图集时以轮播形式展示封面' },
{ key: 'post_article_video_cover', label: '视频封面', type: 'switch', default: true, help: '文章有视频时以视频播放器作为封面' },
{ key: 'post_article_video_cover_scale', label: '视频封面高度比例(%)', type: 'number', default: 56, min: 20, max: 100, dependsOn: { key: 'post_article_video_cover', value: true } },
],
},
{
key: 'media',
title: '媒体功能',
icon: 'fas fa-photo-video',
fields: [
{ key: 'post_lightbox', label: '图片灯箱', type: 'switch', default: true, help: '点击图片放大查看' },
{ key: 'post_lightbox_thumbs', label: '灯箱缩略图', type: 'switch', default: true, dependsOn: { key: 'post_lightbox', value: true }, help: '灯箱底部显示缩略图导航' },
{ key: 'post_lightbox_zoom', label: '灯箱缩放', type: 'switch', default: true, dependsOn: { key: 'post_lightbox', value: true }, help: '灯箱显示缩放按钮' },
{ key: 'post_lightbox_full', label: '灯箱全屏', type: 'switch', default: true, dependsOn: { key: 'post_lightbox', value: true }, help: '灯箱显示全屏按钮' },
{ key: 'post_lightbox_down', label: '灯箱下载', type: 'switch', default: false, dependsOn: { key: 'post_lightbox', value: true }, help: '灯箱显示下载按钮' },
{ key: 'post_lightbox_play', label: '灯箱播放', type: 'switch', default: false, dependsOn: { key: 'post_lightbox', value: true }, help: '灯箱显示播放按钮(自动轮播)' },
],
},
{
key: 'related',
title: '相关推荐',
icon: 'fas fa-random',
fields: [
{ key: 'post_related_enabled', label: '显示相关推荐', type: 'switch', default: true },
{ key: 'post_related_count', label: '推荐数量', type: 'number', default: 6, min: 1, max: 20, dependsOn: { key: 'post_related_enabled', value: true } },
{ key: 'post_related_type', label: '推荐方式', type: 'radio', default: 'category', options: [
{ label: '同分类', value: 'category' },
{ label: '同标签', value: 'tag' },
{ label: '随机', value: 'random' },
], dependsOn: { key: 'post_related_enabled', value: true } },
{ key: 'post_related_orderby', label: '推荐排序', type: 'select', default: 'rand', options: [
{ label: '随机', value: 'rand' },
{ label: '相关度', value: 'relevance' },
{ label: '时间', value: 'date' },
], dependsOn: { key: 'post_related_enabled', value: true } },
{ key: 'post_related_title', label: '推荐标题', type: 'input', default: '相关推荐', dependsOn: { key: 'post_related_enabled', value: true } },
],
},
{
key: 'interactions',
title: '互动功能',
icon: 'fas fa-heart',
fields: [
{ key: 'post_like_enabled', label: '点赞', type: 'switch', default: true },
{ key: 'post_favorite_enabled', label: '收藏', type: 'switch', default: true },
{ key: 'share_s', label: '分享按钮', type: 'switch', default: true },
{ key: 'post_copyright_enabled', label: '版权信息', type: 'switch', default: true },
{ key: 'post_copyright_text', label: '版权默认文案', type: 'textarea', default: '', help: '留空则自动生成"本文由 XX 原创发布"' },
{ key: 'post_button_toptext', label: '按钮上方文案', type: 'input', default: '喜欢就支持一下吧', help: '显示在点赞/打赏/分享按钮上方' },
],
},
{
key: 'content',
title: '内容插入',
icon: 'fas fa-pen-square',
fields: [
{ key: 'post_front_content', label: '文章头部内容', type: 'textarea', default: '', help: '显示在所有文章正文前方(支持 HTML)' },
{ key: 'post_after_content', label: '文章底部内容', type: 'textarea', default: '', help: '显示在所有文章正文后方(支持 HTML)' },
],
},
{
key: 'yiyan',
title: '一言',
icon: 'fas fa-quote-left',
fields: [
{ key: 'post_yiyan_header', label: '文章头部一言', type: 'switch', default: false, help: '在文章标题下方显示一言' },
{ key: 'post_yiyan_footer', label: '文章底部一言', type: 'switch', default: false, help: '在文章内容底部显示一言' },
{ key: 'post_yiyan_box', label: '一言盒子', type: 'switch', default: false, help: '在相关文章前显示一言盒子' },
],
},
{
key: 'meta',
title: '默认数值',
icon: 'fas fa-chart-bar',
fields: [
{ key: 'post_default_views_min', label: '默认浏览最小值', type: 'number', default: 20, min: 0, max: 9999 },
{ key: 'post_default_views_max', label: '默认浏览最大值', type: 'number', default: 50, min: 1, max: 9999 },
{ key: 'post_default_likes_min', label: '默认点赞最小值', type: 'number', default: 5, min: 0, max: 9999 },
{ key: 'post_default_likes_max', label: '默认点赞最大值', type: 'number', default: 15, min: 1, max: 9999 },
],
},
],
}
@@ -0,0 +1,46 @@
export const paySchema = {
key: 'post_list.pay',
title: '付费内容',
icon: 'fas fa-yen-sign',
description: '配置文章付费阅读、下载功能和购买用户显示。',
defaults: {
post_pay_enable: false,
post_pay_price_default: 0,
post_pay_free_logged_show: false,
post_pay_box_position: 'content',
post_pay_mark: '付费',
post_pay_show_user: false,
post_download_enable: false,
post_download_remote_s: false,
post_download_verify_nonce: true,
post_download_user_log: true,
post_download_post_log: true,
},
groups: [
{
key: 'basic',
title: '付费设置',
icon: 'fas fa-coins',
fields: [
{ key: 'post_pay_enable', label: '启用付费内容', type: 'switch', default: false },
{ key: 'post_pay_price_default', label: '默认价格', type: 'number', default: 0, min: 0, max: 9999, dependsOn: { key: 'post_pay_enable', value: true } },
{ key: 'post_pay_free_logged_show', label: '登录用户显示免费', type: 'switch', default: false, dependsOn: { key: 'post_pay_enable', value: true } },
{ key: 'post_pay_box_position', label: '付费框位置', type: 'radio', default: 'content', options: [{ label: '内容前', value: 'content' }, { label: '全文遮罩', value: 'mask' }], dependsOn: { key: 'post_pay_enable', value: true } },
{ key: 'post_pay_mark', label: '付费标记', type: 'input', default: '付费', dependsOn: { key: 'post_pay_enable', value: true } },
{ key: 'post_pay_show_user', label: '显示购买用户', type: 'switch', default: false, dependsOn: { key: 'post_pay_enable', value: true } },
],
},
{
key: 'download',
title: '下载设置',
icon: 'fas fa-download',
fields: [
{ key: 'post_download_enable', label: '启用下载功能', type: 'switch', default: false },
{ key: 'post_download_remote_s', label: '远程文件下载', type: 'switch', default: false, dependsOn: { key: 'post_download_enable', value: true } },
{ key: 'post_download_verify_nonce', label: '下载鉴权', type: 'switch', default: true, dependsOn: { key: 'post_download_enable', value: true } },
{ key: 'post_download_user_log', label: '用户下载日志', type: 'switch', default: true, dependsOn: { key: 'post_download_enable', value: true } },
{ key: 'post_download_post_log', label: '文章下载日志', type: 'switch', default: true, dependsOn: { key: 'post_download_enable', value: true } },
],
},
],
}
@@ -0,0 +1,42 @@
export const shareSchema = {
key: 'post_list.share',
title: '分享设置',
icon: 'fas fa-share-alt',
description: '配置微信分享凭据、海报分享和社交分享选项。',
defaults: {
share_wechat_s: false,
share_wechat_appid: '',
share_wechat_app_secret: '',
share_only_logo: false,
share_img_compatible_s: false,
share_img_byimg: '',
share_logo: '',
share_img: '',
share_desc: '扫一扫 立即查看',
},
groups: [
{
key: 'wechat',
title: '微信分享',
icon: 'fab fa-weixin',
fields: [
{ key: 'share_wechat_s', label: '启用微信分享', type: 'switch', default: false, help: '启用后文章页将支持微信 JSAPI 分享' },
{ key: 'share_wechat_appid', label: 'AppID', type: 'input', default: '', dependsOn: { key: 'share_wechat_s', value: true }, help: '微信公众号 AppID' },
{ key: 'share_wechat_app_secret', label: 'AppSecret', type: 'input', default: '', dependsOn: { key: 'share_wechat_s', value: true }, help: '微信公众号 AppSecret(请确保 JS 安全域名已配置)' },
{ key: 'share_only_logo', label: '仅显示 Logo', type: 'switch', default: false, help: '分享时仅显示站点 Logo' },
],
},
{
key: 'poster',
title: '海报分享',
icon: 'fas fa-image',
fields: [
{ key: 'share_img_compatible_s', label: '兼容模式', type: 'switch', default: false, help: '启用后使用兼容模式生成分享海报' },
{ key: 'share_img_byimg', label: '海报默认图', type: 'media', default: '', help: '海报分享使用的默认背景图' },
{ key: 'share_logo', label: '海报 LOGO', type: 'media', default: '', help: '海报上叠加的站点 LOGO' },
{ key: 'share_img', label: '分享图片', type: 'media', default: '', help: '社交平台分享预览图' },
{ key: 'share_desc', label: '分享描述', type: 'textarea', default: '扫一扫 立即查看', help: '海报或分享卡片的描述文案' },
],
},
],
}
@@ -0,0 +1,125 @@
export const submitSchema = {
key: 'post_list.submit',
title: '前台投稿',
icon: 'fas fa-paper-plane',
description: '配置前台投稿表单字段、审核流程、附件权限和封面策略。',
defaults: {
front_submit_enabled: true,
front_submit_roles: 'author,editor,administrator',
front_submit_title: true,
front_submit_content: true,
front_submit_excerpt: true,
front_submit_cover: true,
front_submit_category: true,
post_article_cat: [],
front_submit_tags: true,
post_article_topics_s: false,
post_article_custom_filter_s: true,
front_submit_custom_fields: '',
front_submit_review_mode: 'pending',
front_submit_cover_required: false,
front_submit_max_images: 5,
front_submit_editor_mode: 'rich',
front_submit_draft_save: true,
front_submit_leave_warning: true,
post_article_btn_txte: '发布文章',
post_article_title_strlen_limit_min: 5,
post_article_title_strlen_limit_max: 30,
post_article_user: 0,
post_article_pay_free_s: true,
post_article_pay_price_min: 0,
post_article_pay_price_max: 100,
post_article_pay_vip_price_s: true,
post_article_pay_vip_1_discount: 80,
post_article_pay_vip_2_discount: 50,
},
groups: [
{
key: 'basic',
title: '基础配置',
icon: 'fas fa-cog',
fields: [
{ key: 'front_submit_enabled', label: '开启前台投稿', type: 'switch', default: true, help: '允许用户在前台提交文章' },
{ key: 'front_submit_roles', label: '允许投稿的角色', type: 'input', default: 'author,editor,administrator', dependsOn: { key: 'front_submit_enabled', value: true }, help: '逗号分隔角色标识' },
{ key: 'post_article_btn_txte', label: '投稿按钮文案', type: 'input', default: '发布文章', dependsOn: { key: 'front_submit_enabled', value: true }, help: '前台投稿按钮显示的文字' },
{ key: 'post_article_title_strlen_limit_min', label: '标题最少字数', type: 'number', default: 5, min: 1, max: 100, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_title_strlen_limit_max', label: '标题最多字数', type: 'number', default: 30, min: 5, max: 200, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_t_placeholder', label: '标题占位符', type: 'input', default: '', placeholder: '请输入标题', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_c_placeholder', label: '内容占位符', type: 'textarea', default: '', placeholder: '请输入内容', dependsOn: { key: 'front_submit_enabled', value: true } },
],
},
{
key: 'fields',
title: '表单字段',
icon: 'fas fa-list-alt',
fields: [
{ key: 'front_submit_title', label: '标题', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_content', label: '正文', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_excerpt', label: '摘要', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_cover', label: '封面图', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_category', label: '分类选择', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_cat', label: '允许投稿分类', type: 'taxonomy_select', taxonomy: 'category', multiple: true, default: [], help: '为空则允许全部分类', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_user', label: '免登录归属用户', type: 'user_select', default: 0, help: '免登录投稿时文章归属的用户,搜索选择', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_tags', label: '标签输入', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_topics_s', label: '专题选择', type: 'switch', default: false, help: '投稿时可选择专题分类', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_custom_filter_s', label: '高级筛选选择', type: 'switch', default: true, help: '投稿时可选择自定义筛选维度值', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_custom_fields', label: '自定义字段', type: 'textarea', default: '', placeholder: '每行一个:field_key|字段名称|类型(input/textarea/select)', dependsOn: { key: 'front_submit_enabled', value: true } },
],
},
{
key: 'review',
title: '审核策略',
icon: 'fas fa-tasks',
fields: [
{
key: 'front_submit_review_mode',
label: '审核模式',
type: 'radio',
default: 'pending',
options: [
{ label: '待审核', value: 'pending' },
{ label: '直接发布', value: 'publish' },
{ label: '自动草稿', value: 'draft' },
],
dependsOn: { key: 'front_submit_enabled', value: true },
},
{ key: 'front_submit_cover_required', label: '封面图必填', type: 'switch', default: false, dependsOn: { key: 'front_submit_cover', value: true } },
{ key: 'front_submit_max_images', label: '正文最大图片数', type: 'number', default: 5, min: 0, max: 50, dependsOn: { key: 'front_submit_enabled', value: true } },
],
},
{
key: 'editor',
title: '编辑器设置',
icon: 'fas fa-edit',
fields: [
{
key: 'front_submit_editor_mode',
label: '编辑器模式',
type: 'radio',
default: 'rich',
options: [
{ label: '富文本', value: 'rich' },
{ label: 'Markdown', value: 'markdown' },
{ label: '纯文本', value: 'plain' },
],
dependsOn: { key: 'front_submit_content', value: true },
},
{ key: 'front_submit_draft_save', label: '自动保存草稿', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'front_submit_leave_warning', label: '离开页面提醒', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
],
},
{
key: 'paid',
title: '付费投稿权限',
icon: 'fas fa-coins',
fields: [
{ key: 'post_article_pay_free_s', label: '允许设置免费', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_pay_price_min', label: '最低价格', type: 'number', default: 0, min: 0, max: 9999, help: '投稿可设置的最低付费金额', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_pay_price_max', label: '最高价格', type: 'number', default: 100, min: 0, max: 9999, help: '投稿可设置的最高付费金额', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_pay_vip_price_s', label: '允许设置会员价', type: 'switch', default: true, dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_pay_vip_1_discount', label: 'VIP1 折扣(%)', type: 'number', default: 80, min: 0, max: 100, help: 'VIP1 会员折扣百分比,80 即 8 折', dependsOn: { key: 'front_submit_enabled', value: true } },
{ key: 'post_article_pay_vip_2_discount', label: 'VIP2 折扣(%)', type: 'number', default: 50, min: 0, max: 100, help: 'VIP2 会员折扣百分比,50 即 5 折', dependsOn: { key: 'front_submit_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,70 @@
export const thumbSchema = {
key: 'post_list.thumb',
title: '列表缩略图',
icon: 'fas fa-images',
description: '配置缩略图来源优先级、尺寸、占位图和多图模式。',
defaults: {
thumb_priority: 'featured,attachment,resource,custom',
thumb_fallback: 'placeholder',
thumb_spare_images: [],
thumb_lazy: true,
thumb_aspect_ratio: '16:9',
list_thumb_fit: 'cover',
thumb_multi_enabled: false,
thumb_multi_count: 3,
list_thumb_slides_s: true,
list_thumb_video_s: true,
list_thumb_video_mute_s: true,
thumb_postfirstimg_s: true,
thumb_catimg_s: true,
mult_thumb_cat: [],
},
groups: [
{
key: 'source',
title: '图片来源',
icon: 'fas fa-image',
fields: [
{ key: 'thumb_priority', label: '图片优先级', type: 'input', default: 'featured,attachment,resource,custom', help: '逗号分隔: featured(特色图), attachment(附件), resource(资源封面), custom(自定义), post_first_img(文章首图), category_cover(分类封面)' },
{ key: 'thumb_fallback', label: '无图时处理', type: 'radio', default: 'placeholder', options: [
{ label: '显示占位图', value: 'placeholder' },
{ label: '隐藏缩略图', value: 'hide' },
{ label: '随机封面', value: 'random' },
]},
{ key: 'thumb_spare_images', label: '备用缩略图', type: 'gallery', default: [], help: '当无图处理选择"随机封面"时从此图库随机选取', dependsOn: { key: 'thumb_fallback', value: 'random' } },
{ key: 'thumb_aspect_ratio', label: '图片比例', type: 'select', default: '16:9', options: [
{ label: '16:9 宽屏', value: '16:9' },
{ label: '4:3 标准', value: '4:3' },
{ label: '1:1 正方形', value: '1:1' },
{ label: '自适应', value: 'auto' },
]},
{ key: 'list_thumb_fit', label: '缩略图填充方式', type: 'radio', default: 'cover', options: [
{ label: '填充裁剪', value: 'cover' },
{ label: '完整显示', value: 'contain' },
]},
{ key: 'list_thumb_slides_s', label: '幻灯片缩略图', type: 'switch', default: true, help: '允许幻灯片作为列表缩略图' },
{ key: 'list_thumb_video_s', label: '视频缩略图', type: 'switch', default: true, help: '鼠标悬停时自动播放视频缩略图' },
{ key: 'list_thumb_video_mute_s', label: '视频缩略图静音', type: 'switch', default: true, dependsOn: { key: 'list_thumb_video_s', value: true }, help: '视频缩略图播放时静音' },
{ key: 'thumb_postfirstimg_s', label: '自动获取文章首图', type: 'switch', default: true, help: '自动从文章内容中提取第一张图片作为缩略图' },
{ key: 'thumb_postfirstimg_size', label: '首图尺寸', type: 'select', default: 'medium', options: [
{ label: '缩略图', value: 'thumbnail' },
{ label: '中等', value: 'medium' },
{ label: '大', value: 'large' },
{ label: '原始', value: 'full' },
], dependsOn: { key: 'thumb_postfirstimg_s', value: true }, help: '自动获取文章首图时使用的 WP 图片尺寸' },
{ key: 'thumb_catimg_s', label: '自动获取分类封面', type: 'switch', default: true, help: '无特色图时使用分类封面图作为缩略图' },
],
},
{
key: 'multi',
title: '多图模式',
icon: 'fas fa-images',
fields: [
{ key: 'thumb_multi_enabled', label: '多图卡片', type: 'switch', default: false, help: '当文章有多张图片时,在列表中展示多图预览' },
{ key: 'thumb_multi_count', label: '最多显示几张', type: 'number', default: 3, min: 2, max: 6, dependsOn: { key: 'thumb_multi_enabled', value: true } },
{ key: 'mult_thumb_cat', label: '按分类多图显示', type: 'taxonomy_select', taxonomy: 'category', multiple: true, default: [], help: '选择的分类下所有文章自动显示多张缩略图' },
{ key: 'thumb_lazy', label: '懒加载', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,49 @@
export const basicSchema = {
key: 'shop.basic',
title: '商城基础',
icon: 'fas fa-store',
description: '商城总开关、首页链接、面包屑和 URL 别名设置。',
defaults: {
shop_s: false,
shop_home_url: '',
shop_breadcrumbs_s: true,
shop_breadcrumbs_home: true,
shop_breadcrumbs_shop_home: true,
shop_breadcrumbs_shop_home_name: '商城首页',
shop_product_rewrite_slug: 'product',
shop_cart_rewrite_slug: 'cart',
shop_rewrite_suffix_html_s: false,
},
groups: [
{
key: 'general',
title: '商城开关',
icon: 'fas fa-power-off',
fields: [
{ key: 'shop_s', label: '启用商城', type: 'switch', default: false },
{ key: 'shop_home_url', label: '商城首页链接', type: 'input', default: '', help: '留空使用默认商城页面', dependsOn: { key: 'shop_s', value: true } },
],
},
{
key: 'breadcrumbs',
title: '面包屑',
icon: 'fas fa-angle-double-right',
fields: [
{ key: 'shop_breadcrumbs_s', label: '显示面包屑', type: 'switch', default: true, dependsOn: { key: 'shop_s', value: true } },
{ key: 'shop_breadcrumbs_home', label: '显示首页链接', type: 'switch', default: true, dependsOn: { key: 'shop_breadcrumbs_s', value: true } },
{ key: 'shop_breadcrumbs_shop_home', label: '显示商城首页', type: 'switch', default: true, dependsOn: { key: 'shop_breadcrumbs_s', value: true } },
{ key: 'shop_breadcrumbs_shop_home_name', label: '商城首页名称', type: 'input', default: '商城首页', dependsOn: { key: 'shop_breadcrumbs_s', value: true } },
],
},
{
key: 'rewrite',
title: 'URL 别名',
icon: 'fas fa-link',
fields: [
{ key: 'shop_product_rewrite_slug', label: '商品 URL 别名', type: 'input', default: 'product', dependsOn: { key: 'shop_s', value: true } },
{ key: 'shop_cart_rewrite_slug', label: '购物车 URL 别名', type: 'input', default: 'cart', dependsOn: { key: 'shop_s', value: true } },
{ key: 'shop_rewrite_suffix_html_s', label: '.html 伪静态后缀', type: 'switch', default: false, dependsOn: { key: 'shop_s', value: true } },
],
},
],
}
@@ -0,0 +1,32 @@
export const contactSchema = {
key: 'shop.contact',
title: '客服配置',
icon: 'fas fa-headset',
description: '商品详情页客服按钮和联系方式配置。',
defaults: {
shop_contact_msg_s: true,
shop_contact_name: '联系客服',
shop_contact_note: '',
shop_contact_more: '',
},
groups: [
{
key: 'button',
title: '客服按钮',
icon: 'fas fa-comment-dots',
fields: [
{ key: 'shop_contact_msg_s', label: '显示客服按钮', type: 'switch', default: true },
{ key: 'shop_contact_name', label: '按钮文案', type: 'input', default: '联系客服', dependsOn: { key: 'shop_contact_msg_s', value: true } },
{ key: 'shop_contact_note', label: '客服备注', type: 'textarea', default: '', dependsOn: { key: 'shop_contact_msg_s', value: true } },
],
},
{
key: 'channels',
title: '联系方式',
icon: 'fas fa-address-book',
fields: [
{ key: 'shop_contact_more', label: '多客服联系方式', type: 'textarea', default: '', help: '每行一个:名称|图标|链接|二维码图片 URL' },
],
},
],
}
@@ -0,0 +1,21 @@
/**
* Shop & Product domain schemas.
*/
import { basicSchema } from './basic.js'
import { listSchema } from './list.js'
import { contactSchema } from './contact.js'
import { singleSchema } from './single.js'
import { productDefaultsSchema } from './product-defaults.js'
import { shippingConfigSchema } from './shipping-config.js'
import { timingSchema } from './timing.js'
export const shopSchemas = {
basic: basicSchema,
list: listSchema,
contact: contactSchema,
single: singleSchema,
productDefaults: productDefaultsSchema,
shippingConfig: shippingConfigSchema,
timing: timingSchema,
}
@@ -0,0 +1,40 @@
export const listSchema = {
key: 'shop.list',
title: '商品列表',
icon: 'fas fa-th-list',
description: '商品列表排序、分页、卡片样式和销量显示配置。',
defaults: {
shop_list_orderby: 'date',
shop_list_count: 12,
shop_list_paging: 'number',
shop_list_ias_s: false,
shop_list_ias_max: 5,
shop_list_style: 'default',
shop_sales_show: 'show',
shop_sales_show_min: 10,
},
groups: [
{
key: 'pagination',
title: '列表分页',
icon: 'fas fa-layer-group',
fields: [
{ key: 'shop_list_orderby', label: '默认排序', type: 'select', default: 'date', options: [{ label: '最新发布', value: 'date' }, { label: '销量最高', value: 'sales' }, { label: '价格最低', value: 'price_asc' }, { label: '价格最高', value: 'price_desc' }, { label: '评价最多', value: 'comments' }] },
{ key: 'shop_list_count', label: '每页数量', type: 'number', default: 12, min: 4, max: 100 },
{ key: 'shop_list_paging', label: '翻页模式', type: 'radio', default: 'number', options: [{ label: '数字翻页', value: 'number' }, { label: 'AJAX 加载', value: 'ajax' }] },
{ key: 'shop_list_ias_s', label: '滚动自动加载', type: 'switch', default: false, dependsOn: { key: 'shop_list_paging', value: 'ajax' } },
{ key: 'shop_list_ias_max', label: '自动加载页数', type: 'number', default: 5, min: 1, max: 50, dependsOn: { key: 'shop_list_ias_s', value: true } },
],
},
{
key: 'style',
title: '列表样式',
icon: 'fas fa-palette',
fields: [
{ key: 'shop_list_style', label: '卡片样式', type: 'select', default: 'default', options: [{ label: '默认', value: 'default' }, { label: '竖向大卡片', value: 'card-lg' }, { label: '横向小卡片', value: 'card-sm' }] },
{ key: 'shop_sales_show', label: '销量显示', type: 'select', default: 'show', options: [{ label: '显示', value: 'show' }, { label: '不显示', value: 'hide' }, { label: '超量显示', value: 'threshold' }] },
{ key: 'shop_sales_show_min', label: '起显阈值', type: 'number', default: 10, min: 0, max: 99999, help: '销量超过此数字才显示', dependsOn: { key: 'shop_sales_show', value: 'threshold' } },
],
},
],
}
@@ -0,0 +1,54 @@
export const productDefaultsSchema = {
key: 'shop.product-defaults',
title: '商品默认参数',
icon: 'fas fa-sliders-h',
description: '主题级商品参数默认值,作为「商品→分类→主题设置」参数继承链的根。',
defaults: {
shop_limit_buy: -1,
shop_shipping_fee: 'free',
shop_guest_buy: false,
shop_email_fill: false,
shop_rebate: true,
shop_after_sale: 'refund_return',
shop_service: '',
shop_product_params_default: '',
},
groups: [
{
key: 'policy',
title: '购买策略',
icon: 'fas fa-shopping-bag',
fields: [
{ key: 'shop_limit_buy', label: '默认限购', type: 'number', default: -1, min: -1, max: 9999, help: '-1 不限,0 禁购,正数为限购数量' },
{ key: 'shop_guest_buy', label: '免登录购买', type: 'switch', default: false },
{ key: 'shop_email_fill', label: '邮箱必留', type: 'switch', default: false },
{ key: 'shop_rebate', label: '允许返佣', type: 'switch', default: true },
],
},
{
key: 'shipping',
title: '运费默认',
icon: 'fas fa-truck',
fields: [
{ key: 'shop_shipping_fee', label: '默认运费类型', type: 'select', default: 'free', options: [{ label: '包邮', value: 'free' }, { label: '固定运费', value: 'fixed' }, { label: '按金额计算', value: 'amount' }] },
],
},
{
key: 'afterSale',
title: '售后与服务',
icon: 'fas fa-undo',
fields: [
{ key: 'shop_after_sale', label: '默认售后政策', type: 'select', default: 'refund_return', options: [{ label: '仅退款', value: 'refund' }, { label: '退货退款', value: 'refund_return' }, { label: '不支持售后', value: 'none' }] },
{ key: 'shop_service', label: '服务保障', type: 'textarea', default: '', help: '每行一项:名称|说明|图标图片 URL' },
],
},
{
key: 'params',
title: '默认参数模板',
icon: 'fas fa-list-alt',
fields: [
{ key: 'shop_product_params_default', label: '商品参数模板', type: 'textarea', default: '', help: '每行一个参数:参数名|参数值,新建商品自动带入' },
],
},
],
}
@@ -0,0 +1,52 @@
export const shippingConfigSchema = {
key: 'shop.shipping-config',
title: '物流配置',
icon: 'fas fa-shipping-fast',
description: '快递查询接口、物流公司列表和收货地址设置。',
defaults: {
shop_manual_address: false,
shop_express_api_sdk: 'kuaidi100',
shop_express_query_interval: 60,
shop_express_kdniao_opt: '',
shop_express_kuaidi100_opt: '',
shop_express_aliyun_opt: '',
shop_shipping_company: '',
},
groups: [
{
key: 'address',
title: '收货地址',
icon: 'fas fa-map-marker-alt',
fields: [
{ key: 'shop_manual_address', label: '手动填写收货地址', type: 'switch', default: false, help: '开启后用户可手动输入地址而非选择地址簿' },
],
},
{
key: 'express',
title: '快递查询',
icon: 'fas fa-search',
fields: [
{ key: 'shop_express_api_sdk', label: '快递查询接口', type: 'select', default: 'kuaidi100', options: [{ label: '快递100', value: 'kuaidi100' }, { label: '阿里云', value: 'aliyun' }, { label: '快递鸟', value: 'kdniao' }] },
{ key: 'shop_express_query_interval', label: '查询刷新间隔(分钟)', type: 'number', default: 60, min: 30, max: 240 },
],
},
{
key: 'credentials',
title: '接口凭据',
icon: 'fas fa-key',
fields: [
{ key: 'shop_express_kdniao_opt', label: '快递鸟凭据', type: 'textarea', default: '', help: 'AppID|APIKey', dependsOn: { key: 'shop_express_api_sdk', value: 'kdniao' } },
{ key: 'shop_express_kuaidi100_opt', label: '快递100凭据', type: 'textarea', default: '', help: 'Key|Customer', dependsOn: { key: 'shop_express_api_sdk', value: 'kuaidi100' } },
{ key: 'shop_express_aliyun_opt', label: '阿里云凭据', type: 'textarea', default: '', help: 'AppCode', dependsOn: { key: 'shop_express_api_sdk', value: 'aliyun' } },
],
},
{
key: 'companies',
title: '物流公司',
icon: 'fas fa-building',
fields: [
{ key: 'shop_shipping_company', label: '物流公司列表', type: 'textarea', default: '', help: '每行一个:编码|名称,如 SF|顺丰速运' },
],
},
],
}
@@ -0,0 +1,45 @@
export const singleSchema = {
key: 'shop.single',
title: '商品详情',
icon: 'fas fa-box-open',
description: '商品详情页布局、相关推荐和底部内容设置。',
defaults: {
shop_content_layout: 'adapt',
shop_content_show_bg: false,
shop_single_tab: '',
shop_content_after: '',
shop_single_related_s: true,
shop_single_related_opt: '',
shop_main_image_default: '',
},
groups: [
{
key: 'layout',
title: '详情页布局',
icon: 'fas fa-columns',
fields: [
{ key: 'shop_content_layout', label: '内容布局', type: 'select', default: 'adapt', options: [{ label: '适应宽度', value: 'adapt' }, { label: '全屏', value: 'full' }, { label: '适应宽度+侧栏', value: 'sidebar' }] },
{ key: 'shop_content_show_bg', label: '详情背景盒子', type: 'switch', default: false },
{ key: 'shop_single_tab', label: '自定义 TAB 栏目', type: 'textarea', default: '', help: '每行一个 TAB:标题|内容 HTML' },
{ key: 'shop_content_after', label: '详情页底部内容', type: 'textarea', default: '', help: '追加在每个商品详情页底部的 HTML 内容' },
],
},
{
key: 'related',
title: '相关推荐',
icon: 'fas fa-th',
fields: [
{ key: 'shop_single_related_s', label: '显示相关推荐', type: 'switch', default: true },
{ key: 'shop_single_related_opt', label: '推荐配置', type: 'textarea', default: '', help: '标题|关联类型(cat/discount/tag)|排序|数量|翻页|样式', dependsOn: { key: 'shop_single_related_s', value: true } },
],
},
{
key: 'image',
title: '商品图片',
icon: 'fas fa-image',
fields: [
{ key: 'shop_main_image_default', label: '默认商品主图', type: 'media', default: '' },
],
},
],
}
@@ -0,0 +1,54 @@
export const timingSchema = {
key: 'shop.timing',
title: '时效与售后原因',
icon: 'fas fa-clock',
description: '确认收货、评价、退货时效和售后原因配置。',
defaults: {
shop_order_receipt_max_day: 15,
shop_comment_max_day: 7,
shop_comment_placeholder: '',
shop_comment_img_num: 3,
shop_after_sale_return_express_max_day: 7,
shop_after_sale_reason_refund: '',
shop_after_sale_reason_return: '',
shop_author_show: true,
},
groups: [
{
key: 'receipt',
title: '确认收货',
icon: 'fas fa-check-circle',
fields: [
{ key: 'shop_order_receipt_max_day', label: '自动确认收货(天)', type: 'number', default: 15, min: 1, max: 60, help: '发货后超过此天数自动确认收货' },
],
},
{
key: 'comment',
title: '评价时效',
icon: 'fas fa-star',
fields: [
{ key: 'shop_comment_max_day', label: '评价时效(天)', type: 'number', default: 7, min: 1, max: 60, help: '确认收货后超过此天数自动好评' },
{ key: 'shop_comment_placeholder', label: '评价占位文案', type: 'input', default: '' },
{ key: 'shop_comment_img_num', label: '评价图片数', type: 'number', default: 3, min: 0, max: 9 },
],
},
{
key: 'afterSale',
title: '售后退货',
icon: 'fas fa-undo-alt',
fields: [
{ key: 'shop_after_sale_return_express_max_day', label: '退货快递时效(天)', type: 'number', default: 7, min: 1, max: 30 },
{ key: 'shop_after_sale_reason_refund', label: '仅退款原因', type: 'textarea', default: '', help: '每行一个可选原因' },
{ key: 'shop_after_sale_reason_return', label: '退货退款原因', type: 'textarea', default: '', help: '每行一个可选原因' },
],
},
{
key: 'author',
title: '商家信息',
icon: 'fas fa-user-tie',
fields: [
{ key: 'shop_author_show', label: '显示商家信息', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,29 @@
export const backupSchema = {
key: 'tools.backup',
title: '数据备份',
icon: 'fas fa-cloud-download-alt',
description: '站点数据备份与恢复。',
defaults: {},
groups: [
{
key: 'backup',
title: '备份设置',
icon: 'fas fa-save',
fields: [
{ key: 'backup_auto', label: '自动备份', type: 'switch', help: '启用自动定时备份' },
{
key: 'backup_frequency',
label: '备份频率',
type: 'select',
options: [
{ label: '每天', value: 'daily' },
{ label: '每周', value: 'weekly' },
{ label: '每月', value: 'monthly' },
],
},
{ key: 'backup_retain', label: '保留份数', type: 'number', min: 3, max: 20, default: 7 },
{ key: 'backup_now', label: '立即备份', type: 'button', help: '手动触发一次完整备份' },
],
},
],
}
@@ -0,0 +1,29 @@
export const emailRollbackSchema = {
key: 'tools.email-rollback',
title: '邮件回滚',
icon: 'fas fa-undo',
description: '批量回滚已发送的通知邮件。',
defaults: {},
groups: [
{
key: 'rollback',
title: '邮件回滚',
icon: 'fas fa-envelope-open',
fields: [
{
key: 'rollback_type',
label: '回滚类型',
type: 'select',
options: [
{ label: '按时间范围', value: 'date_range' },
{ label: '按邮件类型', value: 'email_type' },
{ label: '全部回滚', value: 'all' },
],
},
{ key: 'rollback_date_from', label: '开始日期', type: 'date' },
{ key: 'rollback_date_to', label: '结束日期', type: 'date' },
{ key: 'rollback_execute', label: '执行回滚', type: 'button', danger: true, help: '此操作不可逆' },
],
},
],
}
@@ -0,0 +1,21 @@
export const healthSchema = {
key: 'tools.health',
title: '健康检查',
icon: 'fas fa-heartbeat',
description: '检查主题运行环境和依赖状态。',
defaults: {},
groups: [
{
key: 'check',
title: '环境检查',
icon: 'fas fa-stethoscope',
fields: [
{ key: 'php_version', label: 'PHP 版本', type: 'display', help: '建议 7.4+' },
{ key: 'wp_version', label: 'WordPress 版本', type: 'display', help: '建议 5.8+' },
{ key: 'memory_limit', label: '内存限制', type: 'display', help: '建议 256M+' },
{ key: 'upload_max_size', label: '上传限制', type: 'display' },
{ key: 'extensions', label: '必要扩展', type: 'display', help: 'curl, mbstring, json, gd' },
],
},
],
}
@@ -0,0 +1,26 @@
export const importExportSchema = {
key: 'tools.import-export',
title: '导入导出',
icon: 'fas fa-exchange-alt',
description: '主题配置的导入和导出。',
defaults: {},
groups: [
{
key: 'export',
title: '导出配置',
icon: 'fas fa-file-export',
fields: [
{ key: 'export_settings', label: '导出主题设置', type: 'button', help: '导出当前所有主题配置为 JSON 文件' },
{ key: 'export_options', label: '导出 WordPress 选项', type: 'button', help: '导出 aksrt_settings 等选项' },
],
},
{
key: 'import',
title: '导入配置',
icon: 'fas fa-file-import',
fields: [
{ key: 'import_settings', label: '导入主题设置', type: 'file', accept: '.json', help: '导入主题配置文件(将覆盖当前设置)' },
],
},
],
}
@@ -0,0 +1,18 @@
/**
* Tools & Backup domain schemas.
* Each key corresponds to a sub-page under the "备份&导入" section.
*/
import { importExportSchema } from './import-export.js'
import { healthSchema } from './health.js'
import { migrationSchema } from './migration.js'
import { emailRollbackSchema } from './email-rollback.js'
import { backupSchema } from './backup.js'
export const toolsSchemas = {
'import-export': importExportSchema,
health: healthSchema,
migration: migrationSchema,
'email-rollback': emailRollbackSchema,
backup: backupSchema,
}
@@ -0,0 +1,19 @@
export const migrationSchema = {
key: 'tools.migration',
title: '数据迁移',
icon: 'fas fa-database',
description: '数据库结构迁移和版本升级。',
defaults: {},
groups: [
{
key: 'status',
title: '迁移状态',
icon: 'fas fa-info-circle',
fields: [
{ key: 'current_version', label: '当前版本', type: 'display' },
{ key: 'pending_migrations', label: '待执行迁移', type: 'display' },
{ key: 'run_migration', label: '执行迁移', type: 'button', help: '手动触发数据库迁移' },
],
},
],
}
@@ -0,0 +1,160 @@
export const authSchema = {
key: 'users.auth',
title: '注册登录',
icon: 'fas fa-sign-in-alt',
description: '注册方式、登录限制、密码策略配置。',
defaults: {
close_sign: false,
user_close_signup: false,
close_signin: false,
user_agreement_s: true,
user_agreement_page: '',
user_privacy_s: true,
user_privacy_page: '',
user_agreement_check: true,
no_repetition_name: false,
user_nickname_out: '赌博,博彩,代发,代理,刷单,六合彩,admin,test,管理员,客服',
user_email_limit_type: 'black',
user_email_out: '@tempmail.com\n@throwaway.email\n@guerrillamail.com',
user_close_login: false,
user_sign_type: 'page',
sign_modal_auto_s: false,
sign_modal_auto_waiting_time: 5,
sign_modal_auto_expires: 1,
replace_wp_login: true,
admin_sign_key: '',
user_signin_phone_s: false,
user_signin_nopas_s: false,
user_signin_nopas_type: 'email',
user_signin_nopas_active: 'nopas_first',
user_signup_captch: true,
captch_type: 'email',
user_signup_no_repas: false,
user_repas_captch_type: 'email',
bind_phone: false,
bind_reminder: 'close',
bind_reminder_text: '请绑定手机号以正常使用',
bind_reminder_expires: 24,
mandatory_bind: 'close',
email_set_captch: true,
invit_code_s: false,
invit_code_mode: 'open',
invit_code_open_desc: '邀请码为选填,没有邀请码也可以注册',
invit_code_must_desc: '请输入邀请码',
sign_page_background: [],
sign_theme_mode: 'default',
sign_show_header: true,
sign_card_position: 'center',
sign_show_logo: true,
sign_page_footer: '',
sign_modal_background: [],
sign_modal_show_logo: true,
user_logo: [],
user_logo_dark: [],
},
groups: [
{
key: 'register',
title: '注册设置',
icon: 'fas fa-user-plus',
fields: [
{ key: 'close_sign', label: '一键禁用登录注册', type: 'switch', default: false, help: '开启后前台禁用全部注册/登录入口(含社交登录),不影响后台登录' },
{ key: 'user_close_signup', label: '关闭注册', type: 'switch', default: false },
{ key: 'close_signin', label: '禁用账密登录', type: 'switch', default: false, help: '仅允许社交账号登录' },
{ key: 'user_agreement_s', label: '用户协议', type: 'switch', default: true },
{ key: 'user_agreement_page', label: '协议页面', type: 'input', default: '' },
{ key: 'user_privacy_s', label: '隐私政策', type: 'switch', default: true },
{ key: 'user_privacy_page', label: '隐私页面', type: 'input', default: '' },
{ key: 'user_agreement_check', label: '强制勾选协议', type: 'switch', default: true },
{ key: 'no_repetition_name', label: '禁止重复昵称', type: 'switch', default: false },
{ key: 'user_nickname_out', label: '昵称黑名单关键词', type: 'textarea', default: '赌博,博彩,代发,代理,刷单,六合彩,admin,test,管理员,客服', help: '一行一个关键词,注册昵称包含关键词将被拒绝' },
{ key: 'user_email_limit_type', label: '邮箱限制类型', type: 'radio', default: 'black', options: [{ label: '黑名单(拒绝以下后缀)', value: 'black' }, { label: '白名单(仅允许以下后缀)', value: 'white' }] },
{ key: 'user_email_out', label: '邮箱限制后缀', type: 'textarea', default: '@tempmail.com\n@throwaway.email\n@guerrillamail.com', help: '一行一个邮箱后缀,如 @tempmail.com' },
],
},
{
key: 'login',
title: '登录设置',
icon: 'fas fa-sign-in-alt',
fields: [
{ key: 'user_close_login', label: '关闭登录', type: 'switch', default: false },
{ key: 'user_sign_type', label: '登录注册样式', type: 'radio', default: 'page', options: [{ label: '弹窗', value: 'modal' }, { label: '跳转页面', value: 'page' }] },
{ key: 'sign_modal_auto_s', label: '自动弹出登录窗', type: 'switch', default: false, help: '仅在 user_sign_type=modal 时生效' },
{ key: 'sign_modal_auto_waiting_time', label: '弹窗等待秒数', type: 'number', default: 5, min: 0, max: 60, dependsOn: { key: 'sign_modal_auto_s', value: true } },
{ key: 'sign_modal_auto_expires', label: '弹窗周期(小时)', type: 'number', default: 1, min: 0, max: 720, dependsOn: { key: 'sign_modal_auto_s', value: true } },
{ key: 'replace_wp_login', label: '替换WP登录页', type: 'switch', default: true },
{ key: 'admin_sign_key', label: '应急登录 Key', type: 'input', default: '', help: '留空为禁用。管理员可通过 /wp-login.php?aksrt_bypass=<key> 绕过前台替换' },
{ key: 'user_signin_phone_s', label: '手机号登录', type: 'switch', default: false, help: '允许用手机号作为用户名登录' },
{ key: 'user_signin_nopas_s', label: '免密登录', type: 'switch', default: false },
{ key: 'user_signin_nopas_type', label: '免密登录方式', type: 'radio', default: 'email', options: [{ label: '邮箱验证码', value: 'email' }, { label: '手机验证码', value: 'phone' }, { label: '邮箱或手机', value: 'email_phone' }], dependsOn: { key: 'user_signin_nopas_s', value: true } },
{ key: 'user_signin_nopas_active', label: '免密显示模式', type: 'radio', default: 'nopas_first', options: [{ label: '优先免密', value: 'nopas_first' }, { label: '优先密码', value: 'password_first' }, { label: '仅免密', value: 'nopas_only' }], dependsOn: { key: 'user_signin_nopas_s', value: true } },
],
},
{
key: 'signup_captcha',
title: '注册验证',
icon: 'fas fa-user-shield',
fields: [
{ key: 'user_signup_captch', label: '注册需验证', type: 'switch', default: true, help: '注册时需完成邮箱或手机验证' },
{ key: 'captch_type', label: '验证方式', type: 'radio', default: 'email', options: [{ label: '邮箱', value: 'email' }, { label: '手机', value: 'phone' }, { label: '邮箱或手机', value: 'email_phone' }], dependsOn: { key: 'user_signup_captch', value: true } },
{ key: 'user_signup_no_repas', label: '无需重复密码', type: 'switch', default: false, help: '注册时不要求二次确认密码' },
{ key: 'user_repas_captch_type', label: '找回密码验证方式', type: 'radio', default: 'email', options: [{ label: '邮箱', value: 'email' }, { label: '手机', value: 'phone' }, { label: '邮箱或手机', value: 'email_phone' }] },
],
},
{
key: 'bind',
title: '绑定设置',
icon: 'fas fa-link',
fields: [
{ key: 'bind_phone', label: '绑定手机', type: 'switch', default: false },
{ key: 'bind_reminder', label: '绑定提醒', type: 'radio', default: 'close', options: [{ label: '提醒绑定邮箱', value: 'email' }, { label: '提醒绑定手机', value: 'phone' }, { label: '提醒绑定邮箱和手机', value: 'email_phone' }, { label: '关闭', value: 'close' }] },
{ key: 'bind_reminder_text', label: '提醒文案', type: 'input', default: '请绑定手机号以正常使用' },
{ key: 'bind_reminder_expires', label: '提醒周期(小时)', type: 'number', default: 24, min: 1, max: 720, help: '用户关闭提醒后多少小时内不再提醒' },
{ key: 'mandatory_bind', label: '强制绑定', type: 'radio', default: 'close', options: [{ label: '强制绑定邮箱', value: 'email' }, { label: '强制绑定手机', value: 'phone' }, { label: '强制绑定邮箱和手机', value: 'email_phone' }, { label: '关闭', value: 'close' }] },
{ key: 'email_set_captch', label: '绑定邮箱需验证', type: 'switch', default: true, help: '绑定邮箱时需发送验证码确认' },
],
},
{
key: 'invite_inline',
title: '邀请码注册',
icon: 'fas fa-ticket-alt',
fields: [
{ key: 'invit_code_s', label: '启用邀请码', type: 'switch', default: false, help: '与「邀请码」子页联动,此处开关控制注册表单是否显示邀请码字段' },
{ key: 'invit_code_mode', label: '邀请模式', type: 'select', default: 'open', options: [{ label: '开放注册(邀请码选填)', value: 'open' }, { label: '必须邀请码', value: 'must' }], dependsOn: { key: 'invit_code_s', value: true } },
{ key: 'invit_code_open_desc', label: '开放注册提示', type: 'input', default: '邀请码为选填,没有邀请码也可以注册', dependsOn: { key: 'invit_code_s', value: true } },
{ key: 'invit_code_must_desc', label: '必填提示', type: 'input', default: '请输入邀请码', dependsOn: { key: 'invit_code_s', value: true } },
],
},
{
key: 'sign_page_ui',
title: '页面 UI 配置',
icon: 'fas fa-palette',
fields: [
{ key: 'sign_page_background', label: '页面背景图', type: 'gallery', default: [], help: '登录注册页背景图,多图随机' },
{ key: 'sign_theme_mode', label: '主题模式', type: 'radio', default: 'default', options: [{ label: '默认', value: 'default' }, { label: '亮色', value: 'light' }, { label: '暗色', value: 'dark' }] },
{ key: 'sign_show_header', label: '显示顶部导航', type: 'switch', default: true },
{ key: 'sign_card_position', label: '卡片位置', type: 'radio', default: 'center', options: [{ label: '靠左', value: 'left' }, { label: '居中', value: 'center' }, { label: '靠右', value: 'right' }] },
{ key: 'sign_show_logo', label: '显示 LOGO', type: 'switch', default: true },
{ key: 'sign_page_footer', label: '页脚 HTML', type: 'textarea', default: '', help: '登录注册页自定义页脚内容,支持 HTML' },
],
},
{
key: 'modal_ui',
title: '弹窗 UI 配置',
icon: 'fas fa-window-restore',
fields: [
{ key: 'sign_modal_background', label: '弹窗背景图', type: 'gallery', default: [], help: '弹窗左侧背景图,多图随机' },
{ key: 'sign_modal_show_logo', label: '弹窗显示 LOGO', type: 'switch', default: true },
],
},
{
key: 'sign_logo',
title: '登录框 LOGO',
icon: 'fas fa-image',
fields: [
{ key: 'user_logo', label: '日间 LOGO', type: 'gallery', default: [], help: '登录框专用日间 LOGO,留空使用站点全局 LOGO' },
{ key: 'user_logo_dark', label: '夜间 LOGO', type: 'gallery', default: [], help: '登录框专用夜间 LOGO,留空使用站点全局夜间 LOGO' },
],
},
],
}
@@ -0,0 +1,32 @@
export const badgeSchema = {
key: 'users.badge',
title: '用户徽章',
icon: 'fas fa-award',
description: '配置徽章字典、公开展示数量和前台挂点,具体授予逻辑后续扩展。',
defaults: {
user_badge_enabled: false,
user_badge_public_display: true,
user_badge_limit: 3,
user_badge_dictionary: 'founder|创始成员|warning\nstaff|站务团队|info',
},
groups: [
{
key: 'display',
title: '徽章展示',
icon: 'fas fa-medal',
fields: [
{ key: 'user_badge_enabled', label: '启用徽章系统', type: 'switch', default: false },
{ key: 'user_badge_public_display', label: '公开页显示徽章', type: 'switch', default: true, dependsOn: { key: 'user_badge_enabled', value: true } },
{ key: 'user_badge_limit', label: '最多显示数量', type: 'number', default: 3, min: 1, max: 8, dependsOn: { key: 'user_badge_enabled', value: true } },
],
},
{
key: 'dictionary',
title: '徽章字典',
icon: 'fas fa-bookmark',
fields: [
{ key: 'user_badge_dictionary', label: '徽章列表', type: 'textarea', default: 'founder|创始成员|warning\nstaff|站务团队|info', help: '每行一个徽章:slug|显示文案|色调(neutral/info/success/warning/brand)', dependsOn: { key: 'user_badge_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,98 @@
export const creditsSchema = {
key: 'users.credits',
title: '用户积分',
icon: 'fas fa-coins',
description: '积分规则、积分日志、用户积分管理。',
defaults: {
points_s: true,
points_pay_s: false,
points_rate: 100,
points_name: '积分',
points_decimal: 2,
points_earn_comment: 1,
points_earn_post: 5,
points_earn_login: 1,
points_earn_like_received: 1,
points_earn_invite: 10,
points_earn_daily_limit: 50,
points_spend_comment: 0,
points_spend_download: 0,
points_spend_view_hidden: 0,
points_transfer_s: false,
points_service_charge: 0,
points_transfer_min: 1,
points_deduction_s: false,
points_deduction_rate: 100,
points_deduction_max: 50,
points_show_balance: true,
points_show_log: true,
points_expire_days: 0,
},
groups: [
{
key: 'basic',
title: '积分基础',
icon: 'fas fa-coins',
fields: [
{ key: 'points_s', label: '启用积分系统', type: 'switch', default: true },
{ key: 'points_pay_s', label: '积分支付', type: 'switch', default: false },
{ key: 'points_rate', label: '积分兑换比例', type: 'number', default: 100, min: 1, max: 10000 },
{ key: 'points_name', label: '积分名称', type: 'input', default: '积分' },
{ key: 'points_decimal', label: '积分小数位数', type: 'number', default: 2, min: 0, max: 4 },
],
},
{
key: 'earn',
title: '积分获取',
icon: 'fas fa-arrow-up',
fields: [
{ key: 'points_earn_comment', label: '评论奖励', type: 'number', default: 1, min: 0, max: 100 },
{ key: 'points_earn_post', label: '发布文章奖励', type: 'number', default: 5, min: 0, max: 100 },
{ key: 'points_earn_login', label: '每日登录奖励', type: 'number', default: 1, min: 0, max: 100 },
{ key: 'points_earn_like_received', label: '收到点赞奖励', type: 'number', default: 1, min: 0, max: 100 },
{ key: 'points_earn_invite', label: '邀请注册奖励', type: 'number', default: 10, min: 0, max: 1000 },
{ key: 'points_earn_daily_limit', label: '每日获取上限', type: 'number', default: 50, min: 0, max: 9999, help: '0为不限制' },
],
},
{
key: 'spend',
title: '积分消费',
icon: 'fas fa-arrow-down',
fields: [
{ key: 'points_spend_comment', label: '评论消耗', type: 'number', default: 0, min: 0, max: 100 },
{ key: 'points_spend_download', label: '下载消耗', type: 'number', default: 0, min: 0, max: 100 },
{ key: 'points_spend_view_hidden', label: '查看隐藏内容消耗', type: 'number', default: 0, min: 0, max: 100 },
],
},
{
key: 'transfer',
title: '积分转账',
icon: 'fas fa-exchange-alt',
fields: [
{ key: 'points_transfer_s', label: '启用积分转账', type: 'switch', default: false },
{ key: 'points_service_charge', label: '转账手续费(%)', type: 'number', default: 0, min: 0, max: 50, dependsOn: { key: 'points_transfer_s', value: true } },
{ key: 'points_transfer_min', label: '最低转账金额', type: 'number', default: 1, min: 1, max: 9999, dependsOn: { key: 'points_transfer_s', value: true } },
],
},
{
key: 'deduction',
title: '积分抵扣',
icon: 'fas fa-percent',
fields: [
{ key: 'points_deduction_s', label: '启用积分抵扣', type: 'switch', default: false },
{ key: 'points_deduction_rate', label: '抵扣比例(%)', type: 'number', default: 100, min: 1, max: 100, dependsOn: { key: 'points_deduction_s', value: true } },
{ key: 'points_deduction_max', label: '最大抵扣比例(%)', type: 'number', default: 50, min: 1, max: 100, dependsOn: { key: 'points_deduction_s', value: true } },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{ key: 'points_show_balance', label: '导航栏显示余额', type: 'switch', default: true },
{ key: 'points_show_log', label: '显示积分记录', type: 'switch', default: true },
{ key: 'points_expire_days', label: '积分有效期(天)', type: 'number', default: 0, min: 0, help: '0为永久有效' },
],
},
],
}
@@ -0,0 +1,45 @@
export const featuresSchema = {
key: 'users.features',
title: '用户功能',
icon: 'fas fa-user-cog',
description: '配置用户中心和个人主页的功能模块。',
defaults: {
user_center_tabs: 'profile,posts,comments,credits,favorites',
user_avatar_upload: true,
user_cover_upload: true,
user_social_links: true,
user_desc_std: '这家伙很懒…',
user_city_s: false,
user_join_day_my_name: '本站',
user_avatar_default: '',
user_cover_img: '',
user_rewrite_slug: 'user',
user_follow_s: true,
user_message_s: true,
user_online_s: true,
user_last_active_s: true,
},
groups: [
{
key: 'center',
title: '用户中心',
icon: 'fas fa-user-shield',
fields: [
{ key: 'user_center_tabs', label: '用户中心 Tab', type: 'input', default: 'profile,posts,comments,credits,favorites', help: '逗号分隔' },
{ key: 'user_avatar_upload', label: '头像上传', type: 'switch', default: true },
{ key: 'user_cover_upload', label: '封面上传', type: 'switch', default: true },
{ key: 'user_social_links', label: '社交链接', type: 'switch', default: true },
{ key: 'user_desc_std', label: '默认签名', type: 'input', default: '这家伙很懒…', help: '用户未设置个人简介时显示的默认文案' },
{ key: 'user_city_s', label: '显示城市', type: 'switch', default: false },
{ key: 'user_join_day_my_name', label: '站名', type: 'input', default: '本站', help: '用于「已加入 X 天」显示中的站点名称' },
{ key: 'user_avatar_default', label: '默认头像', type: 'media', default: '' },
{ key: 'user_cover_img', label: '默认封面', type: 'media', default: '' },
{ key: 'user_rewrite_slug', label: '用户页 slug', type: 'input', default: 'user' },
{ key: 'user_follow_s', label: '启用关注功能', type: 'switch', default: true },
{ key: 'user_message_s', label: '启用私信功能', type: 'switch', default: true },
{ key: 'user_online_s', label: '显示在线状态', type: 'switch', default: true },
{ key: 'user_last_active_s', label: '显示最后活跃', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,33 @@
/**
* Users & Interaction domain schemas.
*/
import { authSchema } from './auth.js'
import { oauthSchema } from './oauth.js'
import { notificationsSchema } from './notifications.js'
import { creditsSchema } from './credits.js'
import { inviteSchema } from './invite.js'
import { featuresSchema } from './features.js'
import { signinSchema } from './signin.js'
import { verifySchema } from './verify.js'
import { levelSchema } from './level.js'
import { badgeSchema } from './badge.js'
import { wechatSchema } from './wechat.js'
import { reportSchema } from './report.js'
import { smsSchema } from './sms.js'
export const usersSchemas = {
auth: authSchema,
oauth: oauthSchema,
notifications: notificationsSchema,
credits: creditsSchema,
invite: inviteSchema,
features: featuresSchema,
signin: signinSchema,
verify: verifySchema,
level: levelSchema,
badge: badgeSchema,
wechat: wechatSchema,
report: reportSchema,
sms: smsSchema,
}
@@ -0,0 +1,68 @@
export const inviteSchema = {
key: 'users.invite',
title: '邀请码',
icon: 'fas fa-ticket-alt',
description: '邀请码生成、管理、奖励配置。',
defaults: {
invit_code_s: false,
invit_code_open_desc: '邀请码为选填,没有邀请码也可以注册',
invit_code_must_desc: '请输入邀请码',
invit_code_mode: 'open',
invit_code_length: 8,
invit_code_prefix: '',
invit_code_max_use: 1,
invit_code_expiry: 0,
invit_code_batch: 20,
invit_reward_points: 0,
invit_reward_level: 0,
invit_reward_vip_days: 0,
invit_invitee_reward: false,
invit_code_show_count: true,
invit_code_show_remain: true,
},
groups: [
{
key: 'basic',
title: '邀请设置',
icon: 'fas fa-cog',
fields: [
{ key: 'invit_code_s', label: '启用邀请码', type: 'switch', default: false },
{ key: 'invit_code_open_desc', label: '开放注册提示', type: 'input', default: '邀请码为选填,没有邀请码也可以注册' },
{ key: 'invit_code_must_desc', label: '必填提示', type: 'input', default: '请输入邀请码' },
{ key: 'invit_code_mode', label: '邀请模式', type: 'select', default: 'open', options: [{ label: '开放注册(邀请码选填)', value: 'open' }, { label: '必须邀请码', value: 'must' }] },
],
},
{
key: 'format',
title: '码面设置',
icon: 'fas fa-barcode',
fields: [
{ key: 'invit_code_length', label: '邀请码长度', type: 'number', default: 8, min: 4, max: 32 },
{ key: 'invit_code_prefix', label: '邀请码前缀', type: 'input', default: '' },
{ key: 'invit_code_max_use', label: '单码最大使用次数', type: 'number', default: 1, min: 1, max: 9999 },
{ key: 'invit_code_expiry', label: '有效期(天)', type: 'number', default: 0, min: 0, help: '0为永久有效' },
{ key: 'invit_code_batch', label: '批量生成数量', type: 'number', default: 20, min: 1, max: 500 },
],
},
{
key: 'reward',
title: '邀请奖励',
icon: 'fas fa-gift',
fields: [
{ key: 'invit_reward_points', label: '邀请奖励积分', type: 'number', default: 0, min: 0, max: 1000 },
{ key: 'invit_reward_level', label: '邀请奖励等级', type: 'number', default: 0, min: 0, max: 10 },
{ key: 'invit_reward_vip_days', label: '奖励VIP天数', type: 'number', default: 0, min: 0, max: 3650 },
{ key: 'invit_invitee_reward', label: '被邀请人奖励', type: 'switch', default: false },
],
},
{
key: 'display',
title: '展示设置',
icon: 'fas fa-eye',
fields: [
{ key: 'invit_code_show_count', label: '显示已使用次数', type: 'switch', default: true },
{ key: 'invit_code_show_remain', label: '显示剩余次数', type: 'switch', default: true },
],
},
],
}
@@ -0,0 +1,34 @@
export const levelSchema = {
key: 'users.level',
title: '用户等级',
icon: 'fas fa-level-up-alt',
description: '配置等级展示前缀和等级阈值,当前可基于积分余额自动计算。',
defaults: {
user_level_enabled: false,
user_level_public_display: true,
user_level_source: 'credits_balance',
user_level_prefix: 'Lv.',
user_level_thresholds: '1|0\n2|30\n3|100\n4|300',
},
groups: [
{
key: 'display',
title: '等级显示',
icon: 'fas fa-signal',
fields: [
{ key: 'user_level_enabled', label: '启用等级系统', type: 'switch', default: false },
{ key: 'user_level_public_display', label: '公开页显示等级', type: 'switch', default: true, dependsOn: { key: 'user_level_enabled', value: true } },
{ key: 'user_level_prefix', label: '等级前缀', type: 'input', default: 'Lv.', dependsOn: { key: 'user_level_enabled', value: true } },
],
},
{
key: 'rules',
title: '等级规则',
icon: 'fas fa-list-ol',
fields: [
{ key: 'user_level_source', label: '等级来源', type: 'radio', default: 'credits_balance', options: [{ label: '积分余额', value: 'credits_balance' }, { label: '手动 Meta', value: 'manual_meta' }], dependsOn: { key: 'user_level_enabled', value: true } },
{ key: 'user_level_thresholds', label: '等级阈值', type: 'textarea', default: '1|0\n2|30\n3|100\n4|300', help: '每行一个等级,格式:等级|所需积分,例如 3|100', dependsOn: { key: 'user_level_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,74 @@
export const notificationsSchema = {
key: 'users.notifications',
title: '消息通知',
icon: 'fas fa-bell',
description: '站内通知、私信、通知策略配置。',
defaults: {
message_s: true,
msg_center_rewrite_slug: 'message',
message_icon_show: ['nav_menu'],
message_paginate_type: 'ajax_lists',
message_user_set: true,
message_close_msg_type: [],
message_auto_clear_s: false,
message_auto_clear_time: 365,
message_auto_clear_types: ['posts', 'comment', 'favorite', 'like', 'hot', 'followed', 'system'],
private_s: true,
private_smilie_s: true,
private_code_s: false,
private_image_s: true,
private_upload_img: false,
private_quick_s: true,
private_quick_often: '你好,请问有什么可以帮你的?\n感谢你的反馈\n已处理,请查收',
private_submit_text: '发送',
private_placeholder: '请输入消息...',
},
groups: [
{
key: 'basic',
title: '基础设置',
icon: 'fas fa-cog',
fields: [
{ key: 'message_s', label: '站内通知总开关', type: 'switch', default: true },
{ key: 'msg_center_rewrite_slug', label: '消息中心 URL 别名', type: 'input', default: 'message' },
{ key: 'message_icon_show', label: '通知图标位置', type: 'checkbox', default: ['nav_menu'], options: [{ label: '导航菜单', value: 'nav_menu' }, { label: '用户头像', value: 'avatar' }, { label: '移动端底部', value: 'mobile_bar' }] },
{ key: 'message_paginate_type', label: '列表翻页模式', type: 'radio', default: 'ajax_lists', options: [{ label: 'AJAX 翻页', value: 'ajax_lists' }, { label: '传统翻页', value: 'default' }] },
{ key: 'message_user_set', label: '允许用户设置推送', type: 'switch', default: true, help: '允许用户在前台自行设置通知推送偏好' },
],
},
{
key: 'types',
title: '通知类型',
icon: 'fas fa-list-check',
fields: [
{ key: 'message_close_msg_type', label: '关闭部分推送', type: 'checkbox', default: [], options: [{ label: '文章通知', value: 'posts' }, { label: '评论回复', value: 'comment' }, { label: '收藏通知', value: 'favorite' }, { label: '点赞通知', value: 'like' }, { label: '热门通知', value: 'hot' }, { label: '关注通知', value: 'followed' }, { label: '系统通知', value: 'system' }, { label: '支付通知', value: 'pay' }, { label: '提现回复', value: 'withdraw_reply' }, { label: '勋章通知', value: 'medal' }, { label: '认证回复', value: 'auth_apply_reply' }], help: '勾选的类型将不向用户推送通知' },
],
},
{
key: 'auto_clear',
title: '自动清理',
icon: 'fas fa-broom',
fields: [
{ key: 'message_auto_clear_s', label: '自动清理已读消息', type: 'switch', default: false },
{ key: 'message_auto_clear_time', label: '过期天数', type: 'number', default: 365, min: 1, max: 3650, help: '已读消息超过此天数将被自动清理', dependsOn: { key: 'message_auto_clear_s', value: true } },
{ key: 'message_auto_clear_types', label: '清理类型', type: 'checkbox', default: ['posts', 'comment', 'favorite', 'like', 'hot', 'followed', 'system'], options: [{ label: '文章通知', value: 'posts' }, { label: '评论回复', value: 'comment' }, { label: '收藏通知', value: 'favorite' }, { label: '点赞通知', value: 'like' }, { label: '热门通知', value: 'hot' }, { label: '关注通知', value: 'followed' }, { label: '系统通知', value: 'system' }, { label: '支付通知', value: 'pay' }, { label: '提现回复', value: 'withdraw_reply' }, { label: '勋章通知', value: 'medal' }, { label: '认证回复', value: 'auth_apply_reply' }, { label: '下载通知', value: 'download' }, { label: '积分变动', value: 'credits' }, { label: '私信', value: 'private' }, { label: '举报反馈', value: 'report' }], dependsOn: { key: 'message_auto_clear_s', value: true } },
],
},
{
key: 'private',
title: '私信设置',
icon: 'fas fa-envelope',
fields: [
{ key: 'private_s', label: '启用私信功能', type: 'switch', default: true },
{ key: 'private_smilie_s', label: '支持表情', type: 'switch', default: true, dependsOn: { key: 'private_s', value: true } },
{ key: 'private_code_s', label: '支持代码', type: 'switch', default: false, dependsOn: { key: 'private_s', value: true } },
{ key: 'private_image_s', label: '支持图片', type: 'switch', default: true, dependsOn: { key: 'private_s', value: true } },
{ key: 'private_upload_img', label: '支持上传图片', type: 'switch', default: false, dependsOn: { key: 'private_s', value: true } },
{ key: 'private_quick_s', label: '快捷回复', type: 'switch', default: true, dependsOn: { key: 'private_s', value: true } },
{ key: 'private_quick_often', label: '常用快捷回复', type: 'textarea', default: '你好,请问有什么可以帮你的?\n感谢你的反馈\n已处理,请查收', help: '一行一条快捷回复文案', dependsOn: { key: 'private_s', value: true } },
{ key: 'private_submit_text', label: '发送按钮文案', type: 'input', default: '发送', dependsOn: { key: 'private_s', value: true } },
{ key: 'private_placeholder', label: '输入占位符', type: 'input', default: '请输入消息...', dependsOn: { key: 'private_s', value: true } },
],
},
],
}
@@ -0,0 +1,188 @@
export const oauthSchema = {
key: 'users.oauth',
title: '第三方登录',
icon: 'fas fa-share-alt',
description: 'GitHub、Gitee、QQ、Google 等第三方登录配置。',
defaults: {
oauth_s: false,
oauth_proxy_mode: 'close',
oauth_proxy_secret: '',
oauth_proxy_server_url: '',
oauth_proxy_server_providers: ['github', 'gitee', 'qq', 'google'],
oauth_proxy_client_providers: ['github', 'gitee', 'qq', 'google'],
oauth_proxy_gzh_type: 'service',
oauth_bind_type: 'auto',
oauth_button_lg: false,
weixingzh_priority: false,
weixingzh_auto: false,
weixingzh_auto_expires: 3600,
oauth_github_s: false,
oauth_gitee_s: false,
oauth_qq_s: false,
oauth_weixingzh_s: false,
oauth_weixin_s: false,
oauth_weibo_s: false,
oauth_baidu_s: false,
oauth_alipay_s: false,
github_appid: '',
github_appkey: '',
gitee_appid: '',
gitee_appkey: '',
qq_appid: '',
qq_appkey: '',
weixin_appid: '',
weixin_appsecret: '',
weixingzh_gzh_type: 'service',
weixingzh_token: '',
weixingzh_token_nocheck: false,
weixingzh_encoding_aes_key: '',
weixingzh_appid: '',
weixingzh_appsecret: '',
weixingzh_code_qrcode: '',
weixingzh_code_keyword: '登录',
weixingzh_code_reply: '您的验证码是:%s,有效期 %d 分钟。',
weixingzh_code_subscribe_reply: '欢迎关注!回复「%s」获取登录验证码。',
weixingzh_subscribe_msg: '',
weixingzh_new_subscribe_msg: '',
weixingzh_scan_msg: '',
weixingzh_auto_reply_text: '',
weixingzh_auto_reply_search: '',
weixingzh_auto_reply_image: '',
weixingzh_auto_reply_voice: '',
weixingzh_auto_reply_default: '暂不支持此类型的消息',
weixingzh_gzh_menu: '',
weibo_appid: '',
weibo_appkey: '',
baidu_appid: '',
baidu_appkey: '',
alipay_appid: '',
alipay_privatekey: '',
alipay_publickey: '',
},
groups: [
{
key: 'basic',
title: '基础设置',
icon: 'fas fa-cog',
fields: [
{ key: 'oauth_s', label: '启用第三方登录', type: 'switch', default: false },
{ key: 'oauth_proxy_mode', label: '代理登录模式', type: 'radio', default: 'close', options: [{ label: '关闭', value: 'close' }, { label: '服务端', value: 'server' }, { label: '客户端', value: 'client' }] },
{ key: 'oauth_proxy_secret', label: '代理 HMAC 密钥', type: 'input', default: '', dependsOn: { key: 'oauth_proxy_mode', not: 'close' } },
{ key: 'oauth_proxy_server_url', label: '服务端地址', type: 'input', default: '', dependsOn: { key: 'oauth_proxy_mode', value: 'client' } },
{ key: 'oauth_proxy_server_providers', label: '服务端允许平台', type: 'checkbox', default: ['github', 'gitee', 'qq', 'google'], options: [{ label: 'GitHub', value: 'github' }, { label: 'Gitee', value: 'gitee' }, { label: 'QQ', value: 'qq' }, { label: 'Google', value: 'google' }, { label: '微博', value: 'weibo' }, { label: '微信', value: 'weixin' }, { label: '百度', value: 'baidu' }, { label: '支付宝', value: 'alipay' }], dependsOn: { key: 'oauth_proxy_mode', value: 'server' } },
{ key: 'oauth_proxy_client_providers', label: '客户端启用平台', type: 'checkbox', default: ['github', 'gitee', 'qq', 'google'], options: [{ label: 'GitHub', value: 'github' }, { label: 'Gitee', value: 'gitee' }, { label: 'QQ', value: 'qq' }, { label: 'Google', value: 'google' }, { label: '微博', value: 'weibo' }, { label: '微信', value: 'weixin' }, { label: '百度', value: 'baidu' }, { label: '支付宝', value: 'alipay' }], dependsOn: { key: 'oauth_proxy_mode', value: 'client' } },
{ key: 'oauth_proxy_gzh_type', label: '代理公众号类型', type: 'radio', default: 'service', options: [{ label: '服务号', value: 'service' }, { label: '订阅号', value: 'subscribe' }], dependsOn: { key: 'oauth_proxy_mode', not: 'close' } },
{ key: 'oauth_bind_type', label: '绑定方式', type: 'radio', default: 'auto', options: [{ label: '自动绑定', value: 'auto' }, { label: '手动绑定', value: 'manual' }] },
{ key: 'oauth_button_lg', label: '大按钮样式', type: 'switch', default: false },
{ key: 'weixingzh_priority', label: 'PC端优先微信扫码', type: 'switch', default: false, help: '开启后 PC 端登录框优先显示微信公众号扫码' },
{ key: 'weixingzh_auto', label: '微信APP内自动登录', type: 'switch', default: false, help: '在微信内置浏览器中自动使用公众号授权登录' },
{ key: 'weixingzh_auto_expires', label: '自动登录频率限制 (秒)', type: 'number', default: 3600, min: 0, max: 86400, dependsOn: { key: 'weixingzh_auto', value: true } },
],
},
{
key: 'providers',
title: '登录提供商',
icon: 'fas fa-th',
fields: [
{ key: 'oauth_github_s', label: 'GitHub登录', type: 'switch', default: false },
{ key: 'oauth_gitee_s', label: 'Gitee登录', type: 'switch', default: false },
{ key: 'oauth_qq_s', label: 'QQ登录', type: 'switch', default: false },
{ key: 'oauth_weixingzh_s', label: '微信公众号登录', type: 'switch', default: false },
{ key: 'oauth_weixin_s', label: '微信开放平台登录', type: 'switch', default: false },
{ key: 'oauth_weibo_s', label: '微博登录', type: 'switch', default: false },
{ key: 'oauth_baidu_s', label: '百度登录', type: 'switch', default: false },
{ key: 'oauth_alipay_s', label: '支付宝登录', type: 'switch', default: false },
],
},
{
key: 'github',
title: 'GitHub配置',
icon: 'fab fa-github',
fields: [
{ key: 'github_appid', label: 'Client ID', type: 'input', default: '' },
{ key: 'github_appkey', label: 'Client Secret', type: 'input', default: '' },
],
},
{
key: 'gitee',
title: 'Gitee配置',
icon: 'fas fa-code-branch',
fields: [
{ key: 'gitee_appid', label: 'Client ID', type: 'input', default: '' },
{ key: 'gitee_appkey', label: 'Client Secret', type: 'input', default: '' },
],
},
{
key: 'qq',
title: 'QQ配置',
icon: 'fab fa-qq',
fields: [
{ key: 'qq_appid', label: 'App ID', type: 'input', default: '' },
{ key: 'qq_appkey', label: 'App Key', type: 'input', default: '' },
],
},
{
key: 'weixin',
title: '微信开放平台配置',
icon: 'fab fa-weixin',
fields: [
{ key: 'weixin_appid', label: 'AppID', type: 'input', default: '' },
{ key: 'weixin_appsecret', label: 'AppSecret', type: 'input', default: '' },
],
},
{
key: 'weixingzh',
title: '微信公众号配置',
icon: 'fab fa-weixin',
fields: [
{ key: 'weixingzh_gzh_type', label: '公众号类型', type: 'radio', default: 'service', options: [{ label: '服务号', value: 'service' }, { label: '订阅号', value: 'subscribe' }] },
{ key: 'weixingzh_token', label: 'Token', type: 'input', default: '' },
{ key: 'weixingzh_token_nocheck', label: '不验证Token', type: 'switch', default: false, help: '开发调试时可跳过 Token 验证' },
{ key: 'weixingzh_encoding_aes_key', label: 'EncodingAESKey', type: 'input', default: '' },
{ key: 'weixingzh_appid', label: 'AppID', type: 'input', default: '' },
{ key: 'weixingzh_appsecret', label: 'AppSecret', type: 'input', default: '' },
{ key: 'weixingzh_code_qrcode', label: '公众号二维码', type: 'media', default: '', help: '引导用户扫码关注登录的二维码图片' },
{ key: 'weixingzh_code_keyword', label: '登录回复关键词', type: 'input', default: '登录', help: '用户在公众号内回复此关键词触发登录验证码' },
{ key: 'weixingzh_code_reply', label: '验证码回复模板', type: 'textarea', default: '您的验证码是:%s,有效期 %d 分钟。', help: '%s=验证码,%d=有效分钟数' },
{ key: 'weixingzh_code_subscribe_reply', label: '新关注回复模板', type: 'textarea', default: '欢迎关注!回复「%s」获取登录验证码。', help: '%s=登录关键词' },
{ key: 'weixingzh_subscribe_msg', label: '关注后回复', type: 'textarea', default: '', help: '用户关注公众号后的自动回复文案' },
{ key: 'weixingzh_new_subscribe_msg', label: '新用户关注回复', type: 'textarea', default: '', help: '首次关注用户的专属回复文案,留空使用通用回复' },
{ key: 'weixingzh_scan_msg', label: '扫码回复', type: 'textarea', default: '', help: '用户扫码关注公众号后的回复文案' },
{ key: 'weixingzh_auto_reply_text', label: '文本自动回复', type: 'textarea', default: '', help: '收到文本消息的自动回复' },
{ key: 'weixingzh_auto_reply_search', label: '搜索回复', type: 'textarea', default: '', help: '未匹配关键词时的搜索提示回复' },
{ key: 'weixingzh_auto_reply_image', label: '图片回复', type: 'textarea', default: '', help: '收到图片消息的自动回复' },
{ key: 'weixingzh_auto_reply_voice', label: '语音回复', type: 'textarea', default: '', help: '收到语音消息的自动回复' },
{ key: 'weixingzh_auto_reply_default', label: '默认回复', type: 'textarea', default: '暂不支持此类型的消息', help: '其他未匹配消息类型的兜底回复' },
{ key: 'weixingzh_gzh_menu', label: '自定义菜单 JSON', type: 'textarea', default: '', help: '微信公众号自定义菜单 JSON 配置,留空不创建菜单' },
],
},
{
key: 'weibo',
title: '微博配置',
icon: 'fab fa-weibo',
fields: [
{ key: 'weibo_appid', label: 'App Key', type: 'input', default: '' },
{ key: 'weibo_appkey', label: 'App Secret', type: 'input', default: '' },
],
},
{
key: 'baidu',
title: '百度配置',
icon: 'fas fa-paw',
fields: [
{ key: 'baidu_appid', label: 'API Key', type: 'input', default: '' },
{ key: 'baidu_appkey', label: 'Secret Key', type: 'input', default: '' },
],
},
{
key: 'alipay',
title: '支付宝配置',
icon: 'fab fa-alipay',
fields: [
{ key: 'alipay_appid', label: 'AppID', type: 'input', default: '' },
{ key: 'alipay_privatekey', label: '应用私钥', type: 'input', default: '' },
{ key: 'alipay_publickey', label: '支付宝公钥', type: 'input', default: '' },
],
},
],
}
@@ -0,0 +1,58 @@
export const reportSchema = {
key: 'users.report',
title: '禁封/举报',
icon: 'fas fa-flag',
description: '配置举报入口、公开限制提示和后续治理分类,为封禁/举报流程预留稳定结构。',
defaults: {
user_report_enabled: false,
user_report_public_entry: true,
user_report_public_notice: true,
user_report_ban_notice_text: '当前账号处于限制状态,部分互动能力已关闭。',
user_report_categories: 'spam|垃圾信息\nabuse|人身攻击\ncopyright|版权投诉',
ban_preset_reason: 'spam|垃圾信息\nabuse|人身攻击\nviolation|违规操作',
ban_appeal_desc: '',
ban_appeal_keys: '',
user_report_img_s: false,
user_report_desc: '',
},
groups: [
{
key: 'entry',
title: '前台入口',
icon: 'fas fa-door-open',
fields: [
{ key: 'user_report_enabled', label: '启用举报/禁封结构', type: 'switch', default: false },
{ key: 'user_report_public_entry', label: '公开主页展示举报入口', type: 'switch', default: true, dependsOn: { key: 'user_report_enabled', value: true } },
{ key: 'user_report_public_notice', label: '公开显示限制提示', type: 'switch', default: true, dependsOn: { key: 'user_report_enabled', value: true } },
{ key: 'user_report_ban_notice_text', label: '限制提示文案', type: 'input', default: '当前账号处于限制状态,部分互动能力已关闭。', dependsOn: { key: 'user_report_public_notice', value: true } },
],
},
{
key: 'taxonomy',
title: '举报分类',
icon: 'fas fa-list',
fields: [
{ key: 'user_report_categories', label: '举报分类', type: 'textarea', default: 'spam|垃圾信息\nabuse|人身攻击\ncopyright|版权投诉', help: '每行一个分类:slug|显示名称', dependsOn: { key: 'user_report_enabled', value: true } },
],
},
{
key: 'ban',
title: '禁封设置',
icon: 'fas fa-ban',
fields: [
{ key: 'ban_preset_reason', label: '预设封禁原因', type: 'textarea', default: 'spam|垃圾信息\nabuse|人身攻击\nviolation|违规操作', help: '每行一条:slug|显示名称', dependsOn: { key: 'user_report_enabled', value: true } },
{ key: 'ban_appeal_desc', label: '申诉说明', type: 'textarea', default: '', dependsOn: { key: 'user_report_enabled', value: true } },
{ key: 'ban_appeal_keys', label: '申诉关键词', type: 'input', default: '', help: '逗号分隔', dependsOn: { key: 'user_report_enabled', value: true } },
],
},
{
key: 'image',
title: '图片举报',
icon: 'fas fa-image',
fields: [
{ key: 'user_report_img_s', label: '启用图片举报', type: 'switch', default: false, dependsOn: { key: 'user_report_enabled', value: true } },
{ key: 'user_report_desc', label: '举报说明', type: 'textarea', default: '', dependsOn: { key: 'user_report_img_s', value: true } },
],
},
],
}
@@ -0,0 +1,27 @@
export const signinSchema = {
key: 'users.signin',
title: '签到奖励',
icon: 'fas fa-calendar-check',
description: '配置签到规则、连续签到奖励和签到页面。',
defaults: {
signin_enabled: true,
signin_reward: 1,
signin_consecutive_bonus: true,
signin_consecutive_days: 7,
signin_bonus_reward: 5,
},
groups: [
{
key: 'rules',
title: '签到规则',
icon: 'fas fa-calendar-alt',
fields: [
{ key: 'signin_enabled', label: '启用签到', type: 'switch', default: true },
{ key: 'signin_reward', label: '每日签到奖励', type: 'number', default: 1, min: 0, max: 100, dependsOn: { key: 'signin_enabled', value: true } },
{ key: 'signin_consecutive_bonus', label: '连续签到加成', type: 'switch', default: true, dependsOn: { key: 'signin_enabled', value: true } },
{ key: 'signin_consecutive_days', label: '加成周期 (天)', type: 'number', default: 7, min: 2, max: 30, dependsOn: { key: 'signin_consecutive_bonus', value: true } },
{ key: 'signin_bonus_reward', label: '周期奖励', type: 'number', default: 5, min: 1, max: 100, dependsOn: { key: 'signin_consecutive_bonus', value: true } },
],
},
],
}
@@ -0,0 +1,144 @@
export const smsSchema = {
key: 'users.sms',
title: '短信接口',
icon: 'fas fa-sms',
description: '配置短信验证码和短信通知服务的供应商、模板和限流策略。',
defaults: {
sms_enabled: false,
sms_provider: 'aliyun',
sms_number_limit_ch: true,
sms_access_key: '',
sms_access_secret: '',
sms_sign_name: '',
sms_template_code: '',
sms_code_length: 6,
sms_code_expire: 300,
sms_rate_limit: 60,
sms_daily_limit: 10,
sms_notify_bind: true,
sms_notify_login: false,
sms_notify_register: true,
sms_notify_reset_password: true,
sms_ali_api_type: 'sms',
sms_region_id: 'cn-hangzhou',
sms_tencent_app_id: '',
sms_tencent_app_key: '',
sms_tencent_secret_id: '',
sms_tencent_secret_key: '',
sms_tencent_region: 'ap-guangzhou',
sms_huawei_sender: '',
sms_huawei_signature: '',
sms_huawei_endpoint: '',
sms_custom_url: '',
sms_custom_method: 'POST',
sms_custom_auth_type: 'header',
sms_custom_auth_key: '',
sms_custom_auth_value: '',
sms_custom_headers: '',
sms_custom_body: '',
sms_custom_success_rule: '',
},
groups: [
{
key: 'provider',
title: '供应商配置',
icon: 'fas fa-plug',
fields: [
{ key: 'sms_enabled', label: '启用短信服务', type: 'switch', default: false, help: '开启后支持短信验证码和短信通知' },
{
key: 'sms_provider',
label: '短信供应商',
type: 'select',
default: 'aliyun',
options: [
{ label: '阿里云短信', value: 'aliyun' },
{ label: '腾讯云短信', value: 'tencent' },
{ label: '华为云短信', value: 'huawei' },
{ label: '自定义接口', value: 'custom' },
],
dependsOn: { key: 'sms_enabled', value: true },
},
{ key: 'sms_number_limit_ch', label: '仅发国内', type: 'switch', default: true, dependsOn: { key: 'sms_enabled', value: true }, help: '开启后仅支持发送国内短信,关闭后可发送港澳台及国际短信' },
{ key: 'sms_access_key', label: 'AccessKey / SecretId / AppKey', type: 'input', default: '', dependsOn: { key: 'sms_enabled', value: true }, help: '阿里云填 AccessKey,腾讯云填 SecretId,华为云填 AppKey' },
{ key: 'sms_access_secret', label: 'AccessSecret / SecretKey / AppSecret', type: 'input', inputType: 'password', default: '', dependsOn: { key: 'sms_enabled', value: true } },
],
},
{
key: 'aliyun',
title: '阿里云配置',
icon: 'fas fa-cloud',
fields: [
{ key: 'sms_ali_api_type', label: '接口类型', type: 'radio', default: 'sms', options: [{ label: '短信服务', value: 'sms' }, { label: '号码认证', value: 'verify' }], dependsOn: { key: 'sms_provider', value: 'aliyun' } },
{ key: 'sms_region_id', label: 'RegionId', type: 'input', default: 'cn-hangzhou', dependsOn: { key: 'sms_provider', value: 'aliyun' } },
],
},
{
key: 'tencent',
title: '腾讯云配置',
icon: 'fas fa-cloud',
fields: [
{ key: 'sms_tencent_app_id', label: 'SdkAppId', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'tencent' }, help: '腾讯云短信应用 ID' },
{ key: 'sms_tencent_app_key', label: 'AppKey', type: 'input', inputType: 'password', default: '', dependsOn: { key: 'sms_provider', value: 'tencent' } },
{ key: 'sms_tencent_secret_id', label: 'SecretId', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'tencent' } },
{ key: 'sms_tencent_secret_key', label: 'SecretKey', type: 'input', inputType: 'password', default: '', dependsOn: { key: 'sms_provider', value: 'tencent' } },
{ key: 'sms_tencent_region', label: '地域', type: 'input', default: 'ap-guangzhou', dependsOn: { key: 'sms_provider', value: 'tencent' } },
],
},
{
key: 'huawei',
title: '华为云配置',
icon: 'fas fa-cloud',
fields: [
{ key: 'sms_huawei_sender', label: '通道号 (sender)', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'huawei' } },
{ key: 'sms_huawei_signature', label: '短信签名', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'huawei' }, help: '华为云短信签名内容' },
{ key: 'sms_huawei_endpoint', label: 'API Endpoint', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'huawei' }, help: '留空使用默认 endpoint' },
],
},
{
key: 'custom',
title: '自定义接口配置',
icon: 'fas fa-plug',
fields: [
{ key: 'sms_custom_url', label: '请求 URL', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'custom' }, help: '支持 {phone} {code} {time} 变量' },
{ key: 'sms_custom_method', label: '请求方法', type: 'select', default: 'POST', options: [{ label: 'POST', value: 'POST' }, { label: 'GET', value: 'GET' }, { label: 'PUT', value: 'PUT' }], dependsOn: { key: 'sms_provider', value: 'custom' } },
{ key: 'sms_custom_auth_type', label: '鉴权方式', type: 'select', default: 'header', options: [{ label: 'Header', value: 'header' }], dependsOn: { key: 'sms_provider', value: 'custom' } },
{ key: 'sms_custom_auth_key', label: '鉴权 Header 名', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'custom' } },
{ key: 'sms_custom_auth_value', label: '鉴权 Header 值', type: 'input', inputType: 'password', default: '', dependsOn: { key: 'sms_provider', value: 'custom' }, help: '支持 {phone} {code} {time} 变量' },
{ key: 'sms_custom_headers', label: '自定义 Headers', type: 'textarea', default: '', dependsOn: { key: 'sms_provider', value: 'custom' }, help: '每行一个,格式:Key: Value' },
{ key: 'sms_custom_body', label: '请求 Body', type: 'textarea', default: '', dependsOn: { key: 'sms_provider', value: 'custom' }, help: 'JSON 格式,支持 {phone} {code} {time} 变量' },
{ key: 'sms_custom_success_rule', label: '成功判定规则', type: 'input', default: '', dependsOn: { key: 'sms_provider', value: 'custom' }, help: '格式:status:200 或 json:code=0 或 contains:success' },
],
},
{
key: 'template',
title: '短信模板',
icon: 'fas fa-sms',
fields: [
{ key: 'sms_sign_name', label: '短信签名', type: 'input', default: '', dependsOn: { key: 'sms_enabled', value: true }, help: '在短信服务商申请的短信签名(所有供应商共用此字段)' },
{ key: 'sms_template_code', label: '验证码模板 ID', type: 'input', default: '', dependsOn: { key: 'sms_enabled', value: true }, help: '所有供应商共用此模板 ID' },
{ key: 'sms_code_length', label: '验证码长度', type: 'number', default: 6, min: 4, max: 8, dependsOn: { key: 'sms_enabled', value: true } },
{ key: 'sms_code_expire', label: '验证码有效期 (秒)', type: 'number', default: 300, min: 60, max: 600, dependsOn: { key: 'sms_enabled', value: true } },
],
},
{
key: 'rate_limit',
title: '限流策略',
icon: 'fas fa-shield-alt',
fields: [
{ key: 'sms_rate_limit', label: '发送间隔 (秒)', type: 'number', default: 60, min: 10, max: 300, dependsOn: { key: 'sms_enabled', value: true }, help: '同一手机号两次发送的最小间隔' },
{ key: 'sms_daily_limit', label: '每日发送上限', type: 'number', default: 10, min: 1, max: 100, dependsOn: { key: 'sms_enabled', value: true }, help: '同一手机号每天最多发送条数' },
],
},
{
key: 'triggers',
title: '通知场景',
icon: 'fas fa-bell',
fields: [
{ key: 'sms_notify_bind', label: '绑定手机时验证', type: 'switch', default: true, dependsOn: { key: 'sms_enabled', value: true } },
{ key: 'sms_notify_login', label: '短信登录', type: 'switch', default: false, dependsOn: { key: 'sms_enabled', value: true } },
{ key: 'sms_notify_register', label: '注册验证', type: 'switch', default: true, dependsOn: { key: 'sms_enabled', value: true } },
{ key: 'sms_notify_reset_password', label: '找回密码', type: 'switch', default: true, dependsOn: { key: 'sms_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,34 @@
export const verifySchema = {
key: 'users.verify',
title: '身份认证',
icon: 'fas fa-id-card',
description: '配置公开认证徽标、审核策略,以及是否复用现有邮箱验证状态。',
defaults: {
user_verify_enabled: true,
user_verify_public_display: true,
user_verify_badge_text: '已认证',
user_verify_accept_email_verified: true,
user_verify_require_manual_review: false,
},
groups: [
{
key: 'display',
title: '公开展示',
icon: 'fas fa-eye',
fields: [
{ key: 'user_verify_enabled', label: '启用身份认证结构', type: 'switch', default: true },
{ key: 'user_verify_public_display', label: '公开页显示认证徽标', type: 'switch', default: true, dependsOn: { key: 'user_verify_enabled', value: true } },
{ key: 'user_verify_badge_text', label: '认证徽标文案', type: 'input', default: '已认证', dependsOn: { key: 'user_verify_public_display', value: true } },
],
},
{
key: 'workflow',
title: '审核流程',
icon: 'fas fa-tasks',
fields: [
{ key: 'user_verify_accept_email_verified', label: '邮箱验证通过视为已认证', type: 'switch', default: true, dependsOn: { key: 'user_verify_enabled', value: true } },
{ key: 'user_verify_require_manual_review', label: '保留人工审核位', type: 'switch', default: false, dependsOn: { key: 'user_verify_enabled', value: true } },
],
},
],
}
@@ -0,0 +1,51 @@
export const wechatSchema = {
key: 'users.wechat',
title: '微信通知',
icon: 'fab fa-weixin',
description: '配置微信模板消息、订阅/解绑和站外通知策略。',
defaults: {
wechat_notify_enabled: false,
wechat_app_id: '',
wechat_app_secret: '',
wechat_template_id: '',
wechat_token: '',
wechat_encoding_aes_key: '',
wechat_notify_comment: true,
wechat_notify_reply: true,
wechat_notify_system: true,
wechat_bind_entry: true,
},
groups: [
{
key: 'account',
title: '公众号配置',
icon: 'fab fa-weixin',
fields: [
{ key: 'wechat_notify_enabled', label: '启用微信通知', type: 'switch', default: false, help: '开启后用户可绑定微信接收通知' },
{ key: 'wechat_app_id', label: 'AppID', type: 'input', default: '', dependsOn: { key: 'wechat_notify_enabled', value: true } },
{ key: 'wechat_app_secret', label: 'AppSecret', type: 'input', default: '', dependsOn: { key: 'wechat_notify_enabled', value: true } },
{ key: 'wechat_template_id', label: '模板消息 ID', type: 'input', default: '', dependsOn: { key: 'wechat_notify_enabled', value: true }, help: '在微信公众平台申请的模板消息 ID' },
],
},
{
key: 'verify',
title: '服务器验证',
icon: 'fas fa-check-circle',
fields: [
{ key: 'wechat_token', label: 'Token', type: 'input', default: '', dependsOn: { key: 'wechat_notify_enabled', value: true }, help: '微信公众平台服务器配置中的 Token' },
{ key: 'wechat_encoding_aes_key', label: 'EncodingAESKey', type: 'input', default: '', dependsOn: { key: 'wechat_notify_enabled', value: true } },
],
},
{
key: 'triggers',
title: '通知触发器',
icon: 'fas fa-bell',
fields: [
{ key: 'wechat_notify_comment', label: '新评论通知', type: 'switch', default: true, dependsOn: { key: 'wechat_notify_enabled', value: true } },
{ key: 'wechat_notify_reply', label: '评论回复通知', type: 'switch', default: true, dependsOn: { key: 'wechat_notify_enabled', value: true } },
{ key: 'wechat_notify_system', label: '系统通知', type: 'switch', default: true, dependsOn: { key: 'wechat_notify_enabled', value: true } },
{ key: 'wechat_bind_entry', label: '显示绑定入口', type: 'switch', default: true, dependsOn: { key: 'wechat_notify_enabled', value: true }, help: '在用户中心显示微信绑定/解绑按钮' },
],
},
],
}