From 58081d0a68351066c665234f0f11d80de24a68bf Mon Sep 17 00:00:00 2001 From: huangzhenpc Date: Sat, 7 Feb 2026 14:11:43 +0800 Subject: [PATCH] feat(frontend): rebrand Sub2API to FireflyAPI - Replace all user-visible Sub2API brand names with FireflyAPI - Remove GitHub navigation link from AppHeader dropdown - Remove GitHub link from HomeView footer - Simplify VersionBadge to static version display (remove update check) - Update i18n zh/en locale strings - Update default site name fallbacks across all views Co-Authored-By: Claude Opus 4.6 --- frontend/index.html | 2 +- .../src/components/common/VersionBadge.vue | 552 +----------------- frontend/src/components/layout/AppHeader.vue | 16 - frontend/src/components/layout/AuthLayout.vue | 4 +- frontend/src/i18n/locales/en.ts | 20 +- frontend/src/i18n/locales/zh.ts | 20 +- frontend/src/main.ts | 2 +- frontend/src/router/index.ts | 2 +- frontend/src/stores/app.ts | 4 +- frontend/src/views/HomeView.vue | 13 +- frontend/src/views/admin/SettingsView.vue | 2 +- frontend/src/views/auth/EmailVerifyView.vue | 4 +- frontend/src/views/auth/RegisterView.vue | 4 +- frontend/src/views/setup/SetupWizardView.vue | 4 +- 14 files changed, 39 insertions(+), 610 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 3180a5fb..18c64a0e 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - Sub2API - AI API Gateway + FireflyAPI - AI API Gateway
diff --git a/frontend/src/components/common/VersionBadge.vue b/frontend/src/components/common/VersionBadge.vue index d4937156..5a56ff46 100644 --- a/frontend/src/components/common/VersionBadge.vue +++ b/frontend/src/components/common/VersionBadge.vue @@ -1,555 +1,11 @@ - - diff --git a/frontend/src/components/layout/AppHeader.vue b/frontend/src/components/layout/AppHeader.vue index a6b4030f..47ff4e37 100644 --- a/frontend/src/components/layout/AppHeader.vue +++ b/frontend/src/components/layout/AppHeader.vue @@ -122,22 +122,6 @@ {{ t('nav.apiKeys') }} - - - - - {{ t('nav.github') }} - diff --git a/frontend/src/components/layout/AuthLayout.vue b/frontend/src/components/layout/AuthLayout.vue index 3cfc1d4d..e043295d 100644 --- a/frontend/src/components/layout/AuthLayout.vue +++ b/frontend/src/components/layout/AuthLayout.vue @@ -65,7 +65,7 @@ import { ref, computed, onMounted } from 'vue' import { getPublicSettings } from '@/api/auth' import { sanitizeUrl } from '@/utils/url' -const siteName = ref('Sub2API') +const siteName = ref('FireflyAPI') const siteLogo = ref('') const siteSubtitle = ref('Subscription to API Conversion Platform') @@ -74,7 +74,7 @@ const currentYear = computed(() => new Date().getFullYear()) onMounted(async () => { try { const settings = await getPublicSettings() - siteName.value = settings.site_name || 'Sub2API' + siteName.value = settings.site_name || 'FireflyAPI' siteLogo.value = sanitizeUrl(settings.site_logo || '', { allowRelative: true }) siteSubtitle.value = settings.site_subtitle || 'Subscription to API Conversion Platform' } catch (error) { diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts index 34b58458..d6f02de2 100644 --- a/frontend/src/i18n/locales/en.ts +++ b/frontend/src/i18n/locales/en.ts @@ -43,8 +43,8 @@ export default { // Setup Wizard setup: { - title: 'Sub2API Setup', - description: 'Configure your Sub2API instance', + title: 'FireflyAPI Setup', + description: 'Configure your FireflyAPI instance', database: { title: 'Database Configuration', description: 'Connect to your PostgreSQL database', @@ -3066,7 +3066,7 @@ export default { secretKeyConfiguredHint: 'Secret key configured. Leave empty to keep the current value.' }, linuxdo: { title: 'LinuxDo Connect Login', - description: 'Configure LinuxDo Connect OAuth for Sub2API end-user login', + description: 'Configure LinuxDo Connect OAuth for FireflyAPI end-user login', enable: 'Enable LinuxDo Login', enableHint: 'Show LinuxDo login on the login/register pages', clientId: 'Client ID', @@ -3096,7 +3096,7 @@ export default { title: 'Site Settings', description: 'Customize site branding', siteName: 'Site Name', - siteNamePlaceholder: 'Sub2API', + siteNamePlaceholder: 'FireflyAPI', siteNameHint: 'Displayed in emails and page titles', siteSubtitle: 'Site Subtitle', siteSubtitlePlaceholder: 'Subscription to API Conversion Platform', @@ -3155,7 +3155,7 @@ export default { fromEmail: 'From Email', fromEmailPlaceholder: "noreply{'@'}example.com", fromName: 'From Name', - fromNamePlaceholder: 'Sub2API', + fromNamePlaceholder: 'FireflyAPI', useTls: 'Use TLS', useTlsHint: 'Enable TLS encryption for SMTP connection' }, @@ -3434,14 +3434,14 @@ export default { // Admin tour steps admin: { welcome: { - title: '👋 Welcome to Sub2API', - description: '

Sub2API is a powerful AI service gateway platform that helps you easily manage and distribute AI services.

🎯 Core Features:

  • 📦 Group Management - Create service tiers (VIP, Free Trial, etc.)
  • 🔗 Account Pool - Connect multiple upstream AI service accounts
  • 🔑 Key Distribution - Generate independent API Keys for users
  • 💰 Billing Control - Flexible rate and quota management

Let\'s complete the initial setup in 3 minutes →

', + title: '👋 Welcome to FireflyAPI', + description: '

FireflyAPI is a powerful AI service gateway platform that helps you easily manage and distribute AI services.

🎯 Core Features:

  • 📦 Group Management - Create service tiers (VIP, Free Trial, etc.)
  • 🔗 Account Pool - Connect multiple upstream AI service accounts
  • 🔑 Key Distribution - Generate independent API Keys for users
  • 💰 Billing Control - Flexible rate and quota management

Let\'s complete the initial setup in 3 minutes →

', nextBtn: 'Start Setup 🚀', prevBtn: 'Skip' }, groupManage: { title: '📦 Step 1: Group Management', - description: '

What is a Group?

Groups are the core concept of Sub2API, like a "service package":

  • 🎯 Each group can contain multiple upstream accounts
  • 💰 Each group has independent billing multiplier
  • 👥 Can be set as public or exclusive

💡 Example: You can create "VIP Premium" (high rate) and "Free Trial" (low rate) groups

👉 Click "Group Management" on the left sidebar

' + description: '

What is a Group?

Groups are the core concept of FireflyAPI, like a "service package":

  • 🎯 Each group can contain multiple upstream accounts
  • 💰 Each group has independent billing multiplier
  • 👥 Can be set as public or exclusive

💡 Example: You can create "VIP Premium" (high rate) and "Free Trial" (low rate) groups

👉 Click "Group Management" on the left sidebar

' }, createGroup: { title: '➕ Create New Group', @@ -3534,8 +3534,8 @@ export default { // User tour steps user: { welcome: { - title: '👋 Welcome to Sub2API', - description: '

Hello! Welcome to the Sub2API AI service platform.

🎯 Quick Start:

  • 🔑 Create API Key
  • 📋 Copy key to your application
  • 🚀 Start using AI services

Just 1 minute, let\'s get started →

', + title: '👋 Welcome to FireflyAPI', + description: '

Hello! Welcome to the FireflyAPI AI service platform.

🎯 Quick Start:

  • 🔑 Create API Key
  • 📋 Copy key to your application
  • 🚀 Start using AI services

Just 1 minute, let\'s get started →

', nextBtn: 'Start 🚀', prevBtn: 'Skip' }, diff --git a/frontend/src/i18n/locales/zh.ts b/frontend/src/i18n/locales/zh.ts index 85f76b3b..f28d73d2 100644 --- a/frontend/src/i18n/locales/zh.ts +++ b/frontend/src/i18n/locales/zh.ts @@ -40,8 +40,8 @@ export default { // Setup Wizard setup: { - title: 'Sub2API 安装向导', - description: '配置您的 Sub2API 实例', + title: 'FireflyAPI 安装向导', + description: '配置您的 FireflyAPI 实例', database: { title: '数据库配置', description: '连接到您的 PostgreSQL 数据库', @@ -3237,7 +3237,7 @@ export default { }, linuxdo: { title: 'LinuxDo Connect 登录', - description: '配置 LinuxDo Connect OAuth,用于 Sub2API 用户登录', + description: '配置 LinuxDo Connect OAuth,用于 FireflyAPI 用户登录', enable: '启用 LinuxDo 登录', enableHint: '在登录/注册页面显示 LinuxDo 登录入口', clientId: 'Client ID', @@ -3267,7 +3267,7 @@ export default { description: '自定义站点品牌', siteName: '站点名称', siteNameHint: '显示在邮件和页面标题中', - siteNamePlaceholder: 'Sub2API', + siteNamePlaceholder: 'FireflyAPI', siteSubtitle: '站点副标题', siteSubtitleHint: '显示在登录和注册页面', siteSubtitlePlaceholder: '订阅转 API 转换平台', @@ -3327,7 +3327,7 @@ export default { fromEmail: '发件人邮箱', fromEmailPlaceholder: "noreply{'@'}example.com", fromName: '发件人名称', - fromNamePlaceholder: 'Sub2API', + fromNamePlaceholder: 'FireflyAPI', useTls: '使用 TLS', useTlsHint: '为 SMTP 连接启用 TLS 加密' }, @@ -3603,16 +3603,16 @@ export default { // Admin tour steps admin: { welcome: { - title: '👋 欢迎使用 Sub2API', + title: '👋 欢迎使用 FireflyAPI', description: - '

Sub2API 是一个强大的 AI 服务中转平台,让您轻松管理和分发 AI 服务。

🎯 核心功能:

  • 📦 分组管理 - 创建不同的服务套餐(VIP、免费试用等)
  • 🔗 账号池 - 连接多个上游 AI 服务商账号
  • 🔑 密钥分发 - 为用户生成独立的 API Key
  • 💰 计费管理 - 灵活的费率和配额控制

接下来,我们将用 3 分钟带您完成首次配置 →

', + '

FireflyAPI 是一个强大的 AI 服务中转平台,让您轻松管理和分发 AI 服务。

🎯 核心功能:

  • 📦 分组管理 - 创建不同的服务套餐(VIP、免费试用等)
  • 🔗 账号池 - 连接多个上游 AI 服务商账号
  • 🔑 密钥分发 - 为用户生成独立的 API Key
  • 💰 计费管理 - 灵活的费率和配额控制

接下来,我们将用 3 分钟带您完成首次配置 →

', nextBtn: '开始配置 🚀', prevBtn: '跳过' }, groupManage: { title: '📦 第一步:分组管理', description: - '

什么是分组?

分组是 Sub2API 的核心概念,它就像一个"服务套餐":

  • 🎯 每个分组可以包含多个上游账号
  • 💰 每个分组有独立的计费倍率
  • 👥 可以设置为公开或专属分组

💡 示例:您可以创建"VIP专线"(高倍率)和"免费试用"(低倍率)两个分组

👉 点击左侧的"分组管理"开始

' + '

什么是分组?

分组是 FireflyAPI 的核心概念,它就像一个"服务套餐":

  • 🎯 每个分组可以包含多个上游账号
  • 💰 每个分组有独立的计费倍率
  • 👥 可以设置为公开或专属分组

💡 示例:您可以创建"VIP专线"(高倍率)和"免费试用"(低倍率)两个分组

👉 点击左侧的"分组管理"开始

' }, createGroup: { title: '➕ 创建新分组', @@ -3724,9 +3724,9 @@ export default { // User tour steps user: { welcome: { - title: '👋 欢迎使用 Sub2API', + title: '👋 欢迎使用 FireflyAPI', description: - '

您好!欢迎来到 Sub2API AI 服务平台。

🎯 快速开始:

  • 🔑 创建 API 密钥
  • 📋 复制密钥到您的应用
  • 🚀 开始使用 AI 服务

只需 1 分钟,让我们开始吧 →

', + '

您好!欢迎来到 FireflyAPI AI 服务平台。

🎯 快速开始:

  • 🔑 创建 API 密钥
  • 📋 复制密钥到您的应用
  • 🚀 开始使用 AI 服务

只需 1 分钟,让我们开始吧 →

', nextBtn: '开始 🚀', prevBtn: '跳过' }, diff --git a/frontend/src/main.ts b/frontend/src/main.ts index 11c0b1e8..83ca6007 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -16,7 +16,7 @@ const appStore = useAppStore() appStore.initFromInjectedConfig() // Set document title immediately after config is loaded -if (appStore.siteName && appStore.siteName !== 'Sub2API') { +if (appStore.siteName && appStore.siteName !== 'FireflyAPI') { document.title = `${appStore.siteName} - AI API Gateway` } diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 4bb46cee..b326fe5a 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -389,7 +389,7 @@ router.beforeEach((to, _from, next) => { // Set page title const appStore = useAppStore() - const siteName = appStore.siteName || 'Sub2API' + const siteName = appStore.siteName || 'FireflyAPI' if (to.meta.title) { document.title = `${to.meta.title} - ${siteName}` } else { diff --git a/frontend/src/stores/app.ts b/frontend/src/stores/app.ts index 0abf5a53..52de6aeb 100644 --- a/frontend/src/stores/app.ts +++ b/frontend/src/stores/app.ts @@ -24,7 +24,7 @@ export const useAppStore = defineStore('app', () => { // Public settings cache state const publicSettingsLoaded = ref(false) const publicSettingsLoading = ref(false) - const siteName = ref('Sub2API') + const siteName = ref('FireflyAPI') const siteLogo = ref('') const siteVersion = ref('') const contactInfo = ref('') @@ -284,7 +284,7 @@ export const useAppStore = defineStore('app', () => { */ function applySettings(config: PublicSettings): void { cachedPublicSettings.value = config - siteName.value = config.site_name || 'Sub2API' + siteName.value = config.site_name || 'FireflyAPI' siteLogo.value = config.site_logo || '' siteVersion.value = config.version || '' contactInfo.value = config.contact_info || '' diff --git a/frontend/src/views/HomeView.vue b/frontend/src/views/HomeView.vue index 6a3753f1..d5dd1b9e 100644 --- a/frontend/src/views/HomeView.vue +++ b/frontend/src/views/HomeView.vue @@ -390,14 +390,6 @@ > {{ t('home.docs') }} - - GitHub - @@ -417,7 +409,7 @@ const authStore = useAuthStore() const appStore = useAppStore() // Site settings - directly from appStore (already initialized from injected config) -const siteName = computed(() => appStore.cachedPublicSettings?.site_name || appStore.siteName || 'Sub2API') +const siteName = computed(() => appStore.cachedPublicSettings?.site_name || appStore.siteName || 'FireflyAPI') const siteLogo = computed(() => appStore.cachedPublicSettings?.site_logo || appStore.siteLogo || '') const siteSubtitle = computed(() => appStore.cachedPublicSettings?.site_subtitle || 'AI API Gateway Platform') const docUrl = computed(() => appStore.cachedPublicSettings?.doc_url || appStore.docUrl || '') @@ -432,9 +424,6 @@ const isHomeContentUrl = computed(() => { // Theme const isDark = ref(document.documentElement.classList.contains('dark')) -// GitHub URL -const githubUrl = 'https://github.com/Wei-Shaw/sub2api' - // Auth state const isAuthenticated = computed(() => authStore.isAuthenticated) const isAdmin = computed(() => authStore.isAdmin) diff --git a/frontend/src/views/admin/SettingsView.vue b/frontend/src/views/admin/SettingsView.vue index 373025b9..98a1f679 100644 --- a/frontend/src/views/admin/SettingsView.vue +++ b/frontend/src/views/admin/SettingsView.vue @@ -1135,7 +1135,7 @@ const form = reactive({ totp_encryption_key_configured: false, default_balance: 0, default_concurrency: 1, - site_name: 'Sub2API', + site_name: 'FireflyAPI', site_logo: '', site_subtitle: 'Subscription to API Conversion Platform', api_base_url: '', diff --git a/frontend/src/views/auth/EmailVerifyView.vue b/frontend/src/views/auth/EmailVerifyView.vue index 7f797eb4..00b66a37 100644 --- a/frontend/src/views/auth/EmailVerifyView.vue +++ b/frontend/src/views/auth/EmailVerifyView.vue @@ -207,7 +207,7 @@ const hasRegisterData = ref(false) // Public settings const turnstileEnabled = ref(false) const turnstileSiteKey = ref('') -const siteName = ref('Sub2API') +const siteName = ref('FireflyAPI') // Turnstile for resend const turnstileRef = ref | null>(null) @@ -243,7 +243,7 @@ onMounted(async () => { const settings = await getPublicSettings() turnstileEnabled.value = settings.turnstile_enabled turnstileSiteKey.value = settings.turnstile_site_key || '' - siteName.value = settings.site_name || 'Sub2API' + siteName.value = settings.site_name || 'FireflyAPI' } catch (error) { console.error('Failed to load public settings:', error) } diff --git a/frontend/src/views/auth/RegisterView.vue b/frontend/src/views/auth/RegisterView.vue index 53cfe0d1..69765175 100644 --- a/frontend/src/views/auth/RegisterView.vue +++ b/frontend/src/views/auth/RegisterView.vue @@ -317,7 +317,7 @@ const promoCodeEnabled = ref(true) const invitationCodeEnabled = ref(false) const turnstileEnabled = ref(false) const turnstileSiteKey = ref('') -const siteName = ref('Sub2API') +const siteName = ref('FireflyAPI') const linuxdoOAuthEnabled = ref(false) // Turnstile @@ -368,7 +368,7 @@ onMounted(async () => { invitationCodeEnabled.value = settings.invitation_code_enabled turnstileEnabled.value = settings.turnstile_enabled turnstileSiteKey.value = settings.turnstile_site_key || '' - siteName.value = settings.site_name || 'Sub2API' + siteName.value = settings.site_name || 'FireflyAPI' linuxdoOAuthEnabled.value = settings.linuxdo_oauth_enabled // Read promo code from URL parameter only if promo code is enabled diff --git a/frontend/src/views/setup/SetupWizardView.vue b/frontend/src/views/setup/SetupWizardView.vue index fcf5aa72..db701aa7 100644 --- a/frontend/src/views/setup/SetupWizardView.vue +++ b/frontend/src/views/setup/SetupWizardView.vue @@ -131,7 +131,7 @@ v-model="formData.database.dbname" type="text" class="input" - placeholder="sub2api" + placeholder="fireflyapi" />
@@ -535,7 +535,7 @@ const formData = reactive({ port: 5432, user: 'postgres', password: '', - dbname: 'sub2api', + dbname: 'fireflyapi', sslmode: 'disable' }, redis: {