feat(admin): 添加博主显示开关功能

在评论系统设置中添加管理员显示开关,允许控制博主标识的显示
更新前后端接口以支持新功能,包括数据库存储和界面切换组件
This commit is contained in:
anghunk
2026-01-20 09:31:40 +08:00
parent 456771bae3
commit ebcf814f91
6 changed files with 103 additions and 9 deletions

View File

@@ -37,6 +37,7 @@ export type CommentSettingsResponse = {
adminEmail: string | null;
adminBadge: string | null;
avatarPrefix: string | null;
adminEnabled: boolean;
};
export async function loginAdmin(name: string, password: string): Promise<string> {
@@ -78,6 +79,7 @@ export function saveCommentSettings(data: {
adminEmail?: string;
adminBadge?: string;
avatarPrefix?: string;
adminEnabled?: boolean;
}): Promise<{ message: string }> {
return put<{ message: string }>('/admin/settings/comments', data);
}

View File

@@ -428,7 +428,7 @@ onMounted(() => {
border-radius: 4px;
border: 1px solid #d0d7de;
background-color: #ffffff;
font-size: 11px;
font-size: 12px;
cursor: pointer;
}

View File

@@ -36,6 +36,13 @@
<label class="form-label">博主标签文字</label>
<input v-model="commentAdminBadge" class="form-input" type="text" />
</div>
<div class="form-item">
<label class="form-label">是否开启博主显示</label>
<label class="switch">
<input v-model="commentAdminEnabled" type="checkbox" />
<span class="slider" />
</label>
</div>
<div class="form-item">
<label class="form-label">头像前缀Gravatar/Cravatar</label>
<input v-model="avatarPrefix" class="form-input" type="text" />
@@ -64,6 +71,7 @@ const email = ref("");
const commentAdminEmail = ref("");
const commentAdminBadge = ref("");
const avatarPrefix = ref("");
const commentAdminEnabled = ref(false);
const savingEmail = ref(false);
const savingComment = ref(false);
const loading = ref(false);
@@ -81,6 +89,7 @@ async function load() {
commentAdminEmail.value = commentRes.adminEmail || "";
commentAdminBadge.value = commentRes.adminBadge || "博主";
avatarPrefix.value = commentRes.avatarPrefix || "";
commentAdminEnabled.value = !!commentRes.adminEnabled;
} catch (e: any) {
message.value = e.message || "加载失败";
messageType.value = "error";
@@ -117,6 +126,7 @@ async function saveComment() {
adminEmail: commentAdminEmail.value,
adminBadge: commentAdminBadge.value,
avatarPrefix: avatarPrefix.value,
adminEnabled: commentAdminEnabled.value,
});
message.value = res.message || "保存成功";
messageType.value = "success";
@@ -184,6 +194,53 @@ onMounted(() => {
box-shadow: 0 0 0 1px rgba(9, 105, 218, 0.2);
}
.switch {
position: relative;
display: inline-flex;
width: 40px;
height: 22px;
align-items: center;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #d0d7de;
transition: 0.2s;
border-radius: 999px;
}
.slider::before {
position: absolute;
content: "";
height: 16px;
width: 16px;
left: 3px;
top: 3px;
background-color: #ffffff;
transition: 0.2s;
border-radius: 50%;
box-shadow: 0 1px 2px rgba(27, 31, 36, 0.15);
}
.switch input:checked + .slider {
background-color: #0969da;
}
.switch input:checked + .slider::before {
transform: translateX(16px);
}
.card-actions {
display: flex;
justify-content: flex-end;