feat(admin): 添加后台域名可见性管理功能

在后台设置页面新增域名管理选项卡,允许管理员配置后台下拉框中显示的域名列表。通过拖拽或点击按钮可以移动域名,实现灵活的可视域名控制。当配置了可见域名时,LayoutView 将只显示指定的域名,否则显示全部域名。
This commit is contained in:
anghunk
2026-02-05 17:25:09 +08:00
parent f2e9160638
commit c580aec52d
6 changed files with 409 additions and 9 deletions

View File

@@ -30,10 +30,15 @@ export const updateFeatureSettings = async (c: Context<{ Bindings: Bindings }>)
const commentPlaceholder =
rawCommentPlaceholder !== undefined ? rawCommentPlaceholder.trim() : undefined;
const visibleDomains = Array.isArray(body.visibleDomains)
? (body.visibleDomains as string[])
: undefined;
await saveFeatureSettings(c.env, {
enableCommentLike,
enableArticleLike,
commentPlaceholder
commentPlaceholder,
visibleDomains
});
return c.json({ message: '保存成功!' });

View File

@@ -3,11 +3,13 @@ import { Bindings } from '../bindings';
export const FEATURE_COMMENT_LIKE_KEY = 'comment_feature_comment_like';
export const FEATURE_ARTICLE_LIKE_KEY = 'comment_feature_article_like';
export const FEATURE_COMMENT_PLACEHOLDER_KEY = 'comment_feature_placeholder';
export const FEATURE_VISIBLE_DOMAINS_KEY = 'admin_visible_domains';
export type FeatureSettings = {
enableCommentLike: boolean;
enableArticleLike: boolean;
commentPlaceholder?: string;
visibleDomains?: string[];
};
export async function loadFeatureSettings(env: Bindings): Promise<FeatureSettings> {
@@ -15,9 +17,14 @@ export async function loadFeatureSettings(env: Bindings): Promise<FeatureSetting
'CREATE TABLE IF NOT EXISTS Settings (key TEXT PRIMARY KEY, value TEXT NOT NULL)'
).run();
const keys = [FEATURE_COMMENT_LIKE_KEY, FEATURE_ARTICLE_LIKE_KEY, FEATURE_COMMENT_PLACEHOLDER_KEY];
const keys = [
FEATURE_COMMENT_LIKE_KEY,
FEATURE_ARTICLE_LIKE_KEY,
FEATURE_COMMENT_PLACEHOLDER_KEY,
FEATURE_VISIBLE_DOMAINS_KEY
];
const { results } = await env.CWD_DB.prepare(
'SELECT key, value FROM Settings WHERE key IN (?, ?, ?)'
'SELECT key, value FROM Settings WHERE key IN (?, ?, ?, ?)'
)
.bind(...keys)
.all<{ key: string; value: string }>();
@@ -51,10 +58,21 @@ export async function loadFeatureSettings(env: Bindings): Promise<FeatureSetting
const commentPlaceholder = map.get(FEATURE_COMMENT_PLACEHOLDER_KEY);
let visibleDomains: string[] | undefined;
const visibleDomainsRaw = map.get(FEATURE_VISIBLE_DOMAINS_KEY);
if (visibleDomainsRaw) {
try {
visibleDomains = JSON.parse(visibleDomainsRaw);
} catch (e) {
// ignore error
}
}
return {
enableCommentLike,
enableArticleLike,
commentPlaceholder
commentPlaceholder,
visibleDomains
};
}
@@ -88,6 +106,10 @@ export async function saveFeatureSettings(
{
key: FEATURE_COMMENT_PLACEHOLDER_KEY,
value: settings.commentPlaceholder
},
{
key: FEATURE_VISIBLE_DOMAINS_KEY,
value: settings.visibleDomains ? JSON.stringify(settings.visibleDomains) : undefined
}
];