feat(brand): 站点品牌名统一为「宝一外校园点歌系统」

站长要求全站一致(小程序端已单独提交)。本次只改**用户可见文案与默认值**:

- 服务端默认值/兜底:system-settings-defaults、admin/system-settings(GET/POST)、
  site-config.get、utils/siteUtils —— 原来是 'VoiceHub' / '校园广播站点歌系统'
- 用户可见通知文案:MeoW 绑定验证码与标题、MeoW 测试通知、微信订阅测试通知
- 2FA 应用名(authenticator.keyuri)、WebAuthn rpName(出现在系统密钥弹窗里)
- 网页版界面:首页副标题、后台侧栏品牌名、登录/注册/找回/改密标题与文案、
  年度回顾(IntroSlide / ShareCard / 页面标题)、用户教程、通知发送预览、
  API 密钥与数据库导入说明、酷狗 sidecar 说明、打印页脚与歌单卡片页脚、Logo alt

**刻意不动**:localStorage/sessionStorage 的 `voicehub_*` 键、`voicehub:` 前缀的
STORAGE_KEY 与缓存/Redis 前缀、`window.voiceHubPlayer` 之类代码标识、MeoW 的
User-Agent、以及上游项目链接 `github.com/laoshuikaixue/VoiceHub`(那是对原项目的署名)。

注意:站点名**数据**(systemSettings.siteTitle)仍是你后台里设置的「宝一外校园点歌」,
代码只保证默认值与文案一致;要让全站显示完整名称,请在后台「站点配置 → 站点标题」
改成「宝一外校园点歌系统」。
This commit is contained in:
2026-09-30 20:24:55 +08:00
parent 9d3edc2c5e
commit cccaf36990
19 changed files with 29 additions and 29 deletions
+3 -3
View File
@@ -6,7 +6,7 @@
<div class="info-content">
<div class="logo-section">
<img
alt="VoiceHub Logo"
alt="宝一外校园点歌系统 Logo"
class="brand-logo"
:src="logo"
width="160"
@@ -14,11 +14,11 @@
decoding="async"
fetchpriority="high"
>
<h1 v-if="siteTitle" class="brand-title">{{ siteTitle || 'VoiceHub' }}</h1>
<h1 v-if="siteTitle" class="brand-title">宝一外校园点歌系统</h1>
</div>
<div v-if="isFirstLogin" class="welcome-message">
<h2>欢迎使用VoiceHub</h2>
<h2>欢迎使用宝一外校园点歌系统</h2>
<p>为了保障您的账号安全,请设置一个新的密码</p>
</div>
<div v-else class="security-message">
+1 -1
View File
@@ -343,7 +343,7 @@ const dynamicTitle = computed(() => {
if (siteTitle && siteTitle.value) {
return `${currentPageTitle} | ${siteTitle.value}`
}
return `${currentPageTitle} | 校园广播站点歌系统`
return `${currentPageTitle} | 宝一外校园点歌系统`
})
// 监听activeTab变化,更新页面标题
+1 -1
View File
@@ -25,7 +25,7 @@
fetchpriority="high"
>
</div>
<h1 class="form-title">{{ siteTitle ? siteTitle + ' | VoiceHub' : 'VoiceHub' }}</h1>
<h1 class="form-title">宝一外校园点歌系统</h1>
<div class="header-divider" />
</div>
<div class="forgot-password-form">
+2 -2
View File
@@ -6,7 +6,7 @@
<div class="logo-section">
<NuxtLink class="logo-link" to="/">
<img
alt="VoiceHub Logo"
alt="宝一外校园点歌系统 Logo"
class="logo-image"
:src="logo"
width="90"
@@ -89,7 +89,7 @@
<div class="title-container">
<h2 class="main-title">{{ siteTitle }}</h2>
<div class="title-divider" />
<span class="sub-title">VoiceHub 校园广播系统</span>
<span class="sub-title">宝一外校园点歌系统</span>
</div>
</div>
+1 -1
View File
@@ -25,7 +25,7 @@
fetchpriority="high"
>
</div>
<h1 class="form-title">{{ siteTitle ? siteTitle + ' | VoiceHub' : 'VoiceHub' }}</h1>
<h1 class="form-title">宝一外校园点歌系统</h1>
<div class="header-divider" />
</div>
<ClientOnly>
+1 -1
View File
@@ -25,7 +25,7 @@
fetchpriority="high"
>
</div>
<h1 class="form-title">{{ siteTitle ? siteTitle + ' | VoiceHub' : 'VoiceHub' }}</h1>
<h1 class="form-title">宝一外校园点歌系统</h1>
<div class="header-divider" />
</div>
<ClientOnly>
+1 -1
View File
@@ -1,7 +1,7 @@
<template>
<div class="review-page">
<Head>
<Title>我的年度回顾 - VoiceHub</Title>
<Title>我的年度回顾 - 宝一外校园点歌系统</Title>
<Meta name="theme-color" content="#000000" />
<Meta
name="viewport"
@@ -850,11 +850,11 @@ export default defineEventHandler(async (event) => {
.values({
hideStudentInfo: updateData.hideStudentInfo ?? false,
enablePlayTimeSelection: updateData.enablePlayTimeSelection ?? false,
siteTitle: updateData.siteTitle ?? 'VoiceHub',
siteTitle: updateData.siteTitle ?? '宝一外校园点歌系统',
siteLogoUrl: updateData.siteLogoUrl ?? '/favicon.ico',
schoolLogoHomeUrl: updateData.schoolLogoHomeUrl ?? null,
schoolLogoPrintUrl: updateData.schoolLogoPrintUrl ?? null,
siteDescription: updateData.siteDescription ?? '校园广播站点歌系统 - 让你的声音被听见',
siteDescription: updateData.siteDescription ?? '宝一外校园点歌系统 - 让你的声音被听见',
siteVersion: updateData.siteVersion ?? null,
submissionGuidelines:
updateData.submissionGuidelines ??
+2 -2
View File
@@ -39,12 +39,12 @@ export default defineEventHandler(async (event) => {
.insert(systemSettings)
.values({
enablePlayTimeSelection: false,
siteTitle: process.env.NUXT_PUBLIC_SITE_TITLE || 'VoiceHub',
siteTitle: process.env.NUXT_PUBLIC_SITE_TITLE || '宝一外校园点歌系统',
siteLogoUrl: process.env.NUXT_PUBLIC_SITE_LOGO || '/images/site-logo.png',
schoolLogoHomeUrl: '/images/school-logo-white.png',
schoolLogoPrintUrl: '/images/school-logo-transparent.png',
siteDescription:
process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '校园广播站点歌系统 - 让你的声音被听见',
process.env.NUXT_PUBLIC_SITE_DESCRIPTION || '宝一外校园点歌系统 - 让你的声音被听见',
siteVersion: process.env.NUXT_PUBLIC_SITE_VERSION || null,
submissionGuidelines: '请遵守校园规定,提交健康向上的歌曲。',
icpNumber: null,
@@ -65,7 +65,7 @@ export default defineEventHandler(async (event) => {
? body.data
: buildTemplateData(conf || { id: templateId }, {
songTitle: '测试歌曲',
message: '这是一条来自 VoiceHub 的测试通知'
message: '这是一条来自宝一外校园点歌系统的测试通知'
})
const result = await sendRawSubscribe(openid, templateId, data)
@@ -38,7 +38,7 @@ export default defineEventHandler(async (event) => {
})
const { rpID } = getWebAuthnConfig(event)
const rpName = 'VoiceHub'
const rpName = '宝一外校园点歌系统'
const options = await generateRegistrationOptions({
rpName,
+2 -2
View File
@@ -133,8 +133,8 @@ export default defineEventHandler(async (event) => {
})
// 发送验证码到 MeoW
const message = `VoiceHub 账号绑定验证码:${code}(5分钟内有效)`
const title = 'VoiceHub 账号绑定'
const message = `宝一外校园点歌系统账号绑定验证码:${code}(5分钟内有效)`
const title = '宝一外校园点歌系统账号绑定'
try {
// 使用 GET 请求发送验证码
@@ -21,8 +21,8 @@ export default defineEventHandler(async (event) => {
}
// 发送验证码到 MeoW
const message = `VoiceHub 账号绑定验证码:${verificationCode}`
const title = 'VoiceHub 账号绑定'
const message = `宝一外校园点歌系统账号绑定验证码:${verificationCode}`
const title = '宝一外校园点歌系统账号绑定'
// 使用 GET 请求发送验证码
const meowUrl = `https://api.chuckfang.com/${encodeURIComponent(nickname)}/${encodeURIComponent(title)}/${encodeURIComponent(message)}`
+2 -2
View File
@@ -43,8 +43,8 @@ export default defineEventHandler(async (event) => {
}
// 发送测试通知
const message = `这是来自 VoiceHub 的测试通知!您的账号 ${userData.username} 已成功绑定 MeoW。`
const title = 'VoiceHub 测试通知'
const message = `这是来自宝一外校园点歌系统的测试通知!您的账号 ${userData.username} 已成功绑定 MeoW。`
const title = '宝一外校园点歌系统测试通知'
const meowUrl = `https://api.chuckfang.com/${encodeURIComponent(userData.meowNickname)}/${encodeURIComponent(title)}/${encodeURIComponent(message)}`
+2 -2
View File
@@ -70,11 +70,11 @@ export default defineEventHandler(async (event) => {
.insert(systemSettings)
.values({
enablePlayTimeSelection: false,
siteTitle: 'VoiceHub',
siteTitle: '宝一外校园点歌系统',
siteLogoUrl: '/images/site-logo.png',
schoolLogoHomeUrl: '/images/school-logo-white.png',
schoolLogoPrintUrl: '/images/school-logo-transparent.png',
siteDescription: '校园广播站点歌系统 - 让你的声音被听见',
siteDescription: '宝一外校园点歌系统 - 让你的声音被听见',
siteVersion: process.env.NUXT_PUBLIC_SITE_VERSION || null,
submissionGuidelines: '请遵守校园规定,提交健康向上的歌曲。',
icpNumber: '粤ICP备2025450093号',
+1 -1
View File
@@ -19,7 +19,7 @@ export default defineEventHandler(async (event) => {
}
const secret = authenticator.generateSecret()
const otpauth = authenticator.keyuri(user.username, 'VoiceHub', secret)
const otpauth = authenticator.keyuri(user.username, '宝一外校园点歌系统', secret)
// 生成QR Code Data URL
const qrCode = await QRCode.toDataURL(otpauth)
+1 -1
View File
@@ -236,7 +236,7 @@ export async function sendWechatSubscribeToUser(
const token = await getMiniAccessToken()
if (!token) return { ok: false, skipped: 'no-access-token' }
const data = buildTemplateData(conf, Object.assign({ songTitle: 'VoiceHub' }, vars))
const data = buildTemplateData(conf, Object.assign({ songTitle: '宝一外校园点歌系统' }, vars))
return await postSubscribe(token, openid, conf.id, data, userId, kind)
} catch (err: any) {
console.error('[WeChatSubscribe] 发送异常:', err?.message)
+2 -2
View File
@@ -8,10 +8,10 @@ export async function getSiteTitle(): Promise<string> {
try {
const settingsResult = await db.select().from(systemSettings).limit(1)
const settings = settingsResult[0]
return settings?.siteTitle || process.env.NUXT_PUBLIC_SITE_TITLE || 'VoiceHub'
return settings?.siteTitle || process.env.NUXT_PUBLIC_SITE_TITLE || '宝一外校园点歌系统'
} catch (error) {
console.error('获取站点标题失败:', error)
return 'VoiceHub'
return '宝一外校园点歌系统'
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
export const SYSTEM_SETTINGS_DEFAULTS = {
siteTitle: '校园广播站点歌系统',
siteTitle: '宝一外校园点歌系统',
siteVersion: '1.7.1.0',
icpNumber: '粤ICP备2025450093号',
gonganNumber: '',