1
0
forked from boos/BoosAPI

2 Commits

Author SHA1 Message Date
Aibo117 6839d22851 feat: rebrand BoosAPI to 天宥数据云 with new logo
- Replace logo images (favicon, logo) with custom branding
- Update all frontend visible text from "BoosAPI" to "天宥数据云"
- Update HTML title, meta description, and i18n strings
- Cover login/register/user-dashboard/about/settings/OAuth pages
2026-05-18 11:09:37 +08:00
Aibo117 2ce11aa13a docs: restructure Rust backend rewrite plan with optimized architecture
- Add Node.js single-threaded bottleneck analysis as core motivation
- Add circuit breaker, rate limiting, and Prometheus observability
- Split 32-table migration into 4 incremental migrations with rollbacks
- Add API compatibility verification framework (record/replay)
- Fix parallel workstream dependency graph (7 streams → staged)
- Add 4-step canary release strategy
- Unify API key hashing to argon2id
- Add 14-week execution timeline
2026-05-16 12:27:55 +08:00
21 changed files with 742 additions and 1861 deletions
+699 -1818
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -182,11 +182,11 @@ export function Login({ onLogin, t }: { onLogin: (token: string) => void; t: (te
<div className="login-brand-header"> <div className="login-brand-header">
<div className="brand-mark-frame brand-mark-frame-hero"> <div className="brand-mark-frame brand-mark-frame-hero">
<div className="brand-mark-canvas"> <div className="brand-mark-canvas">
<img src="/logo.png" alt="BoosAPI" className="login-brand-logo" /> <img src="/logo.png" alt="天宥数据云" className="login-brand-logo" />
</div> </div>
</div> </div>
<div className="login-brand-summary"> <div className="login-brand-summary">
<div className="login-brand-name">BoosAPI</div> <div className="login-brand-name">天宥数据云</div>
<div className="login-brand-kicker">{t('中转站的中转站')}</div> <div className="login-brand-kicker">{t('中转站的中转站')}</div>
</div> </div>
</div> </div>
@@ -631,8 +631,8 @@ function AppShell() {
</button> </button>
)} )}
<div className="topbar-logo"> <div className="topbar-logo">
<img src="/logo.png" alt="BoosAPI" style={{ width: 28, height: 28, borderRadius: 6 }} /> <img src="/logo.png" alt="天宥数据云" style={{ width: 28, height: 28, borderRadius: 6 }} />
<span className="topbar-logo-text">BoosAPI</span> <span className="topbar-logo-text">天宥数据云</span>
</div> </div>
<nav className="topbar-nav"> <nav className="topbar-nav">
{topNavItems.map((item) => ( {topNavItems.map((item) => (
@@ -762,8 +762,8 @@ function AppShell() {
closeLabel={t('关闭导航')} closeLabel={t('关闭导航')}
> >
<div className="mobile-drawer-header"> <div className="mobile-drawer-header">
<img src="/logo.png" alt="BoosAPI" /> <img src="/logo.png" alt="天宥数据云" />
<span>BoosAPI</span> <span>天宥数据云</span>
</div> </div>
<nav className="mobile-nav"> <nav className="mobile-nav">
{sidebarGroups.map((group) => ( {sidebarGroups.map((group) => (
+3 -3
View File
@@ -191,7 +191,7 @@ export const zhToEnSupplemental: Record<string, string> = {
'共 ${models.length} 个模型': 'Total ${models.length} models', '共 ${models.length} 个模型': 'Total ${models.length} models',
'关闭': 'closure', '关闭': 'closure',
'关于': 'about', '关于': 'about',
'关于 BoosAPI': 'About BoosAPI', '关于 天宥数据云': 'About 天宥数据云',
'管理端 IP 白名单': 'Management IP whitelist', '管理端 IP 白名单': 'Management IP whitelist',
'管理员': 'administrator', '管理员': 'administrator',
'管理员登录 Token 已被修改,请使用新 Token 登录。': 'The administrator login token has been modified, please use the new token to log in.', '管理员登录 Token 已被修改,请使用新 Token 登录。': 'The administrator login token has been modified, please use the new token to log in.',
@@ -259,7 +259,7 @@ export const zhToEnSupplemental: Record<string, string> = {
'拉取分组失败': 'Failed to pull group', '拉取分组失败': 'Failed to pull group',
'拉取分组失败,已回退 default': 'Failed to pull the group and has fallen back to default', '拉取分组失败,已回退 default': 'Failed to pull the group and has fallen back to default',
'冷却中': 'Cooling down', '冷却中': 'Cooling down',
'例如 BoosAPI': 'For example BoosAPI', '例如 天宥数据云': 'For example 天宥数据云',
'例如: admin@example.com': 'For example: admin@example.com', '例如: admin@example.com': 'For example: admin@example.com',
'例如: smtp.qq.com': 'For example: smtp.qq.com', '例如: smtp.qq.com': 'For example: smtp.qq.com',
'例如: target@example.com': 'For example: target@example.com', '例如: target@example.com': 'For example: target@example.com',
@@ -770,7 +770,7 @@ export const zhToEnSupplemental: Record<string, string> = {
'LDOH Cookie 已更新': 'LDOH Cookie updated', 'LDOH Cookie 已更新': 'LDOH Cookie updated',
'LDOH Cookie 已清空': 'LDOH Cookie Cleared', 'LDOH Cookie 已清空': 'LDOH Cookie Cleared',
'LinuxDo 可用性监控': 'LinuxDo availability monitoring', 'LinuxDo 可用性监控': 'LinuxDo availability monitoring',
'BoosAPI 完全自托管,所有数据(账号、令牌、路由、日志)均存储在本地 SQLite 数据库中,不会向任何第三方发送数据。代理请求仅在你的服务器与上游站点之间直连传输。': 'boosapi is completely self-hosted, all data (accounts, tokens, routes, logs) is stored in a local SQLite database and no data is sent to any third party. Proxy requests only travel directly between your server and the upstream site.', '天宥数据云 完全自托管,所有数据(账号、令牌、路由、日志)均存储在本地 SQLite 数据库中,不会向任何第三方发送数据。代理请求仅在你的服务器与上游站点之间直连传输。': 'boosapi is completely self-hosted, all data (accounts, tokens, routes, logs) is stored in a local SQLite database and no data is sent to any third party. Proxy requests only travel directly between your server and the upstream site.',
'model 不能为空': 'model cannot be empty', 'model 不能为空': 'model cannot be empty',
'modelLimitsEnabled 参数无效': 'modelLimitsEnabled parameter is invalid', 'modelLimitsEnabled 参数无效': 'modelLimitsEnabled parameter is invalid',
'models 必须是非空数组': 'models must be a non-empty array', 'models 必须是非空数组': 'models must be a non-empty array',
+3 -3
View File
@@ -71,7 +71,7 @@ const zhToEn: Record<string, string> = {
'模型操练场': 'Model Playground', '模型操练场': 'Model Playground',
'模型测试': 'Model Testing', '模型测试': 'Model Testing',
'关于': 'About', '关于': 'About',
'关于 BoosAPI': 'About BoosAPI', '关于 天宥数据云': 'About 天宥数据云',
'站点文档': 'Site Docs', '站点文档': 'Site Docs',
'任务状态已更新': 'Task status updated', '任务状态已更新': 'Task status updated',
'会话已过期,请重新登录': 'Session expired, please sign in again', '会话已过期,请重新登录': 'Session expired, please sign in again',
@@ -208,7 +208,7 @@ const zhToEn: Record<string, string> = {
'代理端点': 'Proxy Endpoints', '代理端点': 'Proxy Endpoints',
'路由行为': 'Routing Behavior', '路由行为': 'Routing Behavior',
'指标口径': 'Metric Notes', '指标口径': 'Metric Notes',
'BoosAPI 将多个上游兼容供应商聚合为统一的 OpenAI / Claude 下游兼容入口。': 'BoosAPI aggregates multiple upstream compatible providers into a unified OpenAI / Claude compatible downstream endpoint.', '天宥数据云 将多个上游兼容供应商聚合为统一的 OpenAI / Claude 下游兼容入口。': '天宥数据云 aggregates multiple upstream compatible providers into a unified OpenAI / Claude compatible downstream endpoint.',
'核心目标:自动签到、自动模型发现、自动路由重建、统一代理可观测性。': 'Core goals: auto check-in, auto model discovery, auto route rebuild, and unified proxy observability.', '核心目标:自动签到、自动模型发现、自动路由重建、统一代理可观测性。': 'Core goals: auto check-in, auto model discovery, auto route rebuild, and unified proxy observability.',
'1. 路由根据模型可用性自动生成。': '1. Routes are auto-generated based on model availability.', '1. 路由根据模型可用性自动生成。': '1. Routes are auto-generated based on model availability.',
'2. 当模型或账号发生变更时,路由通道会自动重建。': '2. Route channels are auto-rebuilt when models or accounts change.', '2. 当模型或账号发生变更时,路由通道会自动重建。': '2. Route channels are auto-rebuilt when models or accounts change.',
@@ -309,7 +309,7 @@ const zhToEn: Record<string, string> = {
'零配置嵌入式数据库': 'Zero-config embedded database', '零配置嵌入式数据库': 'Zero-config embedded database',
'项目链接': 'Project Links', '项目链接': 'Project Links',
'数据与隐私': 'Data & Privacy', '数据与隐私': 'Data & Privacy',
'BoosAPI 完全自托管,所有数据(账号、令牌、路由、日志)均存储在本地 SQLite 数据库中,不会向任何第三方发送数据。代理请求仅在你的服务器与上游站点之间直连传输。': 'BoosAPI is fully self-hosted. All data (accounts, tokens, routes, logs) is stored in a local SQLite database and never sent to any third party. Proxy requests travel directly between your server and upstream sites.', '天宥数据云 完全自托管,所有数据(账号、令牌、路由、日志)均存储在本地 SQLite 数据库中,不会向任何第三方发送数据。代理请求仅在你的服务器与上游站点之间直连传输。': '天宥数据云 is fully self-hosted. All data (accounts, tokens, routes, logs) is stored in a local SQLite database and never sent to any third party. Proxy requests travel directly between your server and upstream sites.',
// User SaaS translations // User SaaS translations
'用户登录': 'User Login', '用户登录': 'User Login',
+2 -2
View File
@@ -3,8 +3,8 @@
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="BoosAPI - 中转站的中转站,聚合多个 AI API 中转站为统一网关" /> <meta name="description" content="天宥数据云 - AI API 聚合网关,统一管理多个中转站" />
<title>BoosAPI</title> <title>天宥数据云</title>
<link rel="icon" type="image/png" href="/favicon.png" /> <link rel="icon" type="image/png" href="/favicon.png" />
<link rel="preconnect" href="https://fonts.googleapis.com" /> <link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
+4 -4
View File
@@ -82,7 +82,7 @@ export default function About() {
<div className="animate-fade-in" style={{ maxWidth: 860 }}> <div className="animate-fade-in" style={{ maxWidth: 860 }}>
{/* Header */} {/* Header */}
<div className="page-header" style={{ marginBottom: 14 }}> <div className="page-header" style={{ marginBottom: 14 }}>
<h2 className="page-title">{tr('关于 BoosAPI')}</h2> <h2 className="page-title">{tr('关于 天宥数据云')}</h2>
</div> </div>
{/* Hero card */} {/* Hero card */}
@@ -90,11 +90,11 @@ export default function About() {
<div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 14 }}> <div style={{ display: 'flex', alignItems: 'center', gap: 14, marginBottom: 14 }}>
<img <img
src="/logo.png" src="/logo.png"
alt="BoosAPI" alt="天宥数据云"
style={{ width: 48, height: 48, borderRadius: 12, flexShrink: 0 }} style={{ width: 48, height: 48, borderRadius: 12, flexShrink: 0 }}
/> />
<div> <div>
<div style={{ fontSize: 18, fontWeight: 700 }}>BoosAPI</div> <div style={{ fontSize: 18, fontWeight: 700 }}>天宥数据云</div>
<div style={{ fontSize: 12, color: 'var(--color-text-tertiary)', marginTop: 2 }}>{currentVersion}</div> <div style={{ fontSize: 12, color: 'var(--color-text-tertiary)', marginTop: 2 }}>{currentVersion}</div>
</div> </div>
</div> </div>
@@ -206,7 +206,7 @@ export default function About() {
<div className="card animate-slide-up stagger-5" style={{ padding: 22 }}> <div className="card animate-slide-up stagger-5" style={{ padding: 22 }}>
<h3 style={{ fontSize: 15, fontWeight: 600, marginBottom: 10 }}>{tr('数据与隐私')}</h3> <h3 style={{ fontSize: 15, fontWeight: 600, marginBottom: 10 }}>{tr('数据与隐私')}</h3>
<div style={{ fontSize: 13, color: 'var(--color-text-secondary)', lineHeight: 1.8 }}> <div style={{ fontSize: 13, color: 'var(--color-text-secondary)', lineHeight: 1.8 }}>
{tr('BoosAPI 完全自托管,所有数据(账号、令牌、路由、日志)均存储在本地 SQLite 数据库中,不会向任何第三方发送数据。代理请求仅在你的服务器与上游站点之间直连传输。')} {tr('天宥数据云 完全自托管,所有数据(账号、令牌、路由、日志)均存储在本地 SQLite 数据库中,不会向任何第三方发送数据。代理请求仅在你的服务器与上游站点之间直连传输。')}
</div> </div>
</div> </div>
</div> </div>
+1 -1
View File
@@ -1821,7 +1821,7 @@ export default function Accounts() {
color: "var(--color-text-muted)", color: "var(--color-text-muted)",
}} }}
> >
配置 refresh_token 后,BoosAPI 会在 JWT 临近过期或 配置 refresh_token 后,天宥数据云 会在 JWT 临近过期或
401 时自动续期并回写新 token。 401 时自动续期并回写新 token。
</div> </div>
</div> </div>
+1 -1
View File
@@ -108,7 +108,7 @@ export default function Monitors() {
<div> <div>
<h2 className="page-title">{tr('监控内嵌')}</h2> <h2 className="page-title">{tr('监控内嵌')}</h2>
<div style={{ marginTop: 6, fontSize: 13, color: 'var(--color-text-muted)' }}> <div style={{ marginTop: 6, fontSize: 13, color: 'var(--color-text-muted)' }}>
在 BoosAPI 内查看外部站点监控页面。 在 天宥数据云 内查看外部站点监控页面。
</div> </div>
</div> </div>
<div style={{ display: 'flex', gap: 8 }}> <div style={{ display: 'flex', gap: 8 }}>
+3 -3
View File
@@ -2313,16 +2313,16 @@ export default function OAuthManagement() {
{renderGuideCard( {renderGuideCard(
'本地部署', '本地部署',
'BoosAPI 和浏览器在同一台机器时,不需要 SSH 隧道。直接点击“连接”,在弹窗里完成授权即可。', '天宥数据云 和浏览器在同一台机器时,不需要 SSH 隧道。直接点击“连接”,在弹窗里完成授权即可。',
<div className="oauth-guide-copy"> <div className="oauth-guide-copy">
如果浏览器能直接访问上面的 localhost 回调地址,授权完成后会自动回到 BoosAPI。 如果浏览器能直接访问上面的 localhost 回调地址,授权完成后会自动回到 天宥数据云。
</div>, </div>,
)} )}
{activeSession.instructions.sshTunnelCommand {activeSession.instructions.sshTunnelCommand
? renderGuideCard( ? renderGuideCard(
'云端部署', '云端部署',
'BoosAPI 部署在 VPS、容器或远程主机时,浏览器访问到的是你自己电脑的 localhost。先在本地开 SSH 隧道,再继续登录。', '天宥数据云 部署在 VPS、容器或远程主机时,浏览器访问到的是你自己电脑的 localhost。先在本地开 SSH 隧道,再继续登录。',
<div className="oauth-guide-block-list"> <div className="oauth-guide-block-list">
<div className="oauth-guide-block-label">常规 SSH 隧道</div> <div className="oauth-guide-block-label">常规 SSH 隧道</div>
{renderCodeBlock(activeSession.instructions.sshTunnelCommand)} {renderCodeBlock(activeSession.instructions.sshTunnelCommand)}
+5 -5
View File
@@ -1781,7 +1781,7 @@ export default function Settings() {
<div style={settingsModernTitleBlockStyle}> <div style={settingsModernTitleBlockStyle}>
<div style={settingsModernTitleStyle}>Codex 上游传输与会话并发</div> <div style={settingsModernTitleStyle}>Codex 上游传输与会话并发</div>
<div style={settingsModernDescriptionStyle}> <div style={settingsModernDescriptionStyle}>
默认采用 HTTP 优先。只有这里开启后,BoosAPI 才会在 Codex 请求上尝试把上游升级为 WebSocket。下游 Codex 客户端也必须同时启用 `/v1/responses` websocket,单开这里不会生效。 默认采用 HTTP 优先。只有这里开启后,天宥数据云 才会在 Codex 请求上尝试把上游升级为 WebSocket。下游 Codex 客户端也必须同时启用 `/v1/responses` websocket,单开这里不会生效。
</div> </div>
</div> </div>
<div style={settingsModernPillRowStyle}> <div style={settingsModernPillRowStyle}>
@@ -1795,7 +1795,7 @@ export default function Settings() {
</div> </div>
<label style={settingsModernToggleStyle}> <label style={settingsModernToggleStyle}>
<div style={settingsModernToggleCopyStyle}> <div style={settingsModernToggleCopyStyle}>
<span style={{ fontSize: 13, fontWeight: 600, color: 'var(--color-text-secondary)' }}>允许 BoosAPI 到 Codex 上游使用 WebSocket</span> <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--color-text-secondary)' }}>允许 天宥数据云 到 Codex 上游使用 WebSocket</span>
<span style={{ fontSize: 12, lineHeight: 1.7, color: 'var(--color-text-muted)' }}> <span style={{ fontSize: 12, lineHeight: 1.7, color: 'var(--color-text-muted)' }}>
仅在下游 Codex 客户端已同步开启 `/v1/responses` websocket 时启用;否则仍按 HTTP 优先执行。 仅在下游 Codex 客户端已同步开启 `/v1/responses` websocket 时启用;否则仍按 HTTP 优先执行。
</span> </span>
@@ -1878,7 +1878,7 @@ export default function Settings() {
<div style={settingsModernTitleBlockStyle}> <div style={settingsModernTitleBlockStyle}>
<div style={{ ...settingsModernTitleStyle, color: 'var(--color-danger)' }}>批量测活</div> <div style={{ ...settingsModernTitleStyle, color: 'var(--color-danger)' }}>批量测活</div>
<div style={settingsModernDescriptionStyle}> <div style={settingsModernDescriptionStyle}>
默认关闭。开启后,BoosAPI 会在后台定时对活跃账号模型发送最小化探测请求,用来校正“/models 能看到但实际不可用”的假阳性。 默认关闭。开启后,天宥数据云 会在后台定时对活跃账号模型发送最小化探测请求,用来校正“/models 能看到但实际不可用”的假阳性。
</div> </div>
</div> </div>
<div style={settingsModernPillRowStyle}> <div style={settingsModernPillRowStyle}>
@@ -1904,7 +1904,7 @@ export default function Settings() {
</div> </div>
<label style={settingsModernToggleStyle}> <label style={settingsModernToggleStyle}>
<div style={settingsModernToggleCopyStyle}> <div style={settingsModernToggleCopyStyle}>
<span style={{ fontSize: 13, fontWeight: 600, color: 'var(--color-text-secondary)' }}>允许 BoosAPI 后台主动批量测活</span> <span style={{ fontSize: 13, fontWeight: 600, color: 'var(--color-text-secondary)' }}>允许 天宥数据云 后台主动批量测活</span>
<span style={{ fontSize: 12, lineHeight: 1.7, color: 'var(--color-text-muted)' }}> <span style={{ fontSize: 12, lineHeight: 1.7, color: 'var(--color-text-muted)' }}>
首次从关闭切换到开启时,需要手动输入确认语句;关闭时可直接保存。 首次从关闭切换到开启时,需要手动输入确认语句;关闭时可直接保存。
</span> </span>
@@ -2581,7 +2581,7 @@ export default function Settings() {
<div className="card animate-slide-up stagger-7" style={{ padding: 20, border: '1px solid color-mix(in srgb, var(--color-danger) 30%, var(--color-border))' }}> <div className="card animate-slide-up stagger-7" style={{ padding: 20, border: '1px solid color-mix(in srgb, var(--color-danger) 30%, var(--color-border))' }}>
<div style={{ fontWeight: 600, fontSize: 14, marginBottom: 10, color: 'var(--color-danger)' }}>危险操作</div> <div style={{ fontWeight: 600, fontSize: 14, marginBottom: 10, color: 'var(--color-danger)' }}>危险操作</div>
<div style={{ fontSize: 12, color: 'var(--color-text-muted)', lineHeight: 1.8, marginBottom: 12 }}> <div style={{ fontSize: 12, color: 'var(--color-text-muted)', lineHeight: 1.8, marginBottom: 12 }}>
重新初始化系统会清空当前 BoosAPI 使用中的全部数据库内容;若当前运行在外部 MySQL/Postgres,也会先清空该外部库中的 BoosAPI 数据,然后切回默认 SQLite。 重新初始化系统会清空当前 天宥数据云 使用中的全部数据库内容;若当前运行在外部 MySQL/Postgres,也会先清空该外部库中的 天宥数据云 数据,然后切回默认 SQLite。
</div> </div>
<div style={{ fontSize: 12, color: 'var(--color-text-muted)', lineHeight: 1.8, marginBottom: 14 }}> <div style={{ fontSize: 12, color: 'var(--color-text-muted)', lineHeight: 1.8, marginBottom: 14 }}>
完成后管理员 Token 会重置为 <code style={{ fontFamily: 'var(--font-mono)' }}>{FACTORY_RESET_ADMIN_TOKEN}</code>,当前会话会立即退出并刷新页面。 完成后管理员 Token 会重置为 <code style={{ fontFamily: 'var(--font-mono)' }}>{FACTORY_RESET_ADMIN_TOKEN}</code>,当前会话会立即退出并刷新页面。
+1 -1
View File
@@ -1,6 +1,6 @@
/** /**
* @Author: 橘子 * @Author: 橘子
* @Project_description: BoosAPI 站点管理页 * @Project_description: 天宥数据云 站点管理页
* @Description: 代码是我抄的,不会也是真的 * @Description: 代码是我抄的,不会也是真的
*/ */
import { useEffect, useMemo, useRef, useState } from 'react'; import { useEffect, useMemo, useRef, useState } from 'react';
+1 -1
View File
@@ -1099,7 +1099,7 @@ export function TokensPanel({ embedded = false, onEmbeddedActionsChange }: Token
<input <input
value={form.name} value={form.name}
onChange={(e) => setForm((prev) => ({ ...prev, name: e.target.value }))} onChange={(e) => setForm((prev) => ({ ...prev, name: e.target.value }))}
placeholder="例如 BoosAPI" placeholder="例如 天宥数据云"
style={inputStyle} style={inputStyle}
/> />
</div> </div>
+2 -2
View File
@@ -182,8 +182,8 @@ export default function UserDashboard() {
background: 'var(--color-surface, #1a1a2e)', background: 'var(--color-surface, #1a1a2e)',
}}> }}>
<div style={{ display: 'flex', alignItems: 'center', gap: 10 }}> <div style={{ display: 'flex', alignItems: 'center', gap: 10 }}>
<img src="/logo.png" alt="BoosAPI" style={{ width: 28, height: 28, borderRadius: 6 }} /> <img src="/logo.png" alt="天宥数据云" style={{ width: 28, height: 28, borderRadius: 6 }} />
<span style={{ fontSize: 16, fontWeight: 600 }}>BoosAPI</span> <span style={{ fontSize: 16, fontWeight: 600 }}>天宥数据云</span>
<span style={{ fontSize: 12, color: 'var(--color-text-muted)' }}>用户中心</span> <span style={{ fontSize: 12, color: 'var(--color-text-muted)' }}>用户中心</span>
</div> </div>
<div style={{ display: 'flex', alignItems: 'center', gap: 12 }}> <div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
+2 -2
View File
@@ -41,11 +41,11 @@ export default function UserLogin() {
<div className="login-brand-header" style={{ justifyContent: 'center' }}> <div className="login-brand-header" style={{ justifyContent: 'center' }}>
<div className="brand-mark-frame brand-mark-frame-hero"> <div className="brand-mark-frame brand-mark-frame-hero">
<div className="brand-mark-canvas"> <div className="brand-mark-canvas">
<img src="/logo.png" alt="BoosAPI" className="login-brand-logo" /> <img src="/logo.png" alt="天宥数据云" className="login-brand-logo" />
</div> </div>
</div> </div>
<div className="login-brand-summary" style={{ textAlign: 'center' }}> <div className="login-brand-summary" style={{ textAlign: 'center' }}>
<div className="login-brand-name">BoosAPI</div> <div className="login-brand-name">天宥数据云</div>
<div className="login-brand-kicker">用户登录</div> <div className="login-brand-kicker">用户登录</div>
</div> </div>
</div> </div>
+2 -2
View File
@@ -51,11 +51,11 @@ export default function UserRegister() {
<div className="login-brand-header" style={{ justifyContent: 'center' }}> <div className="login-brand-header" style={{ justifyContent: 'center' }}>
<div className="brand-mark-frame brand-mark-frame-hero"> <div className="brand-mark-frame brand-mark-frame-hero">
<div className="brand-mark-canvas"> <div className="brand-mark-canvas">
<img src="/logo.png" alt="BoosAPI" className="login-brand-logo" /> <img src="/logo.png" alt="天宥数据云" className="login-brand-logo" />
</div> </div>
</div> </div>
<div className="login-brand-summary" style={{ textAlign: 'center' }}> <div className="login-brand-summary" style={{ textAlign: 'center' }}>
<div className="login-brand-name">BoosAPI</div> <div className="login-brand-name">天宥数据云</div>
<div className="login-brand-kicker">用户注册</div> <div className="login-brand-kicker">用户注册</div>
</div> </div>
</div> </div>
@@ -29,7 +29,7 @@ export function normalizeVerifyFailureMessage(message: unknown): string {
if (!text) return '验证失败'; if (!text) return '验证失败';
const lowered = text.toLowerCase(); const lowered = text.toLowerCase();
if (isNetworkFailureMessage(text)) { if (isNetworkFailureMessage(text)) {
return '无法连接到 BoosAPI 服务端,请检查服务状态或网络连接'; return '无法连接到 天宥数据云 服务端,请检查服务状态或网络连接';
} }
if (lowered.includes('user id mismatch') || lowered.includes('does not match this token')) { if (lowered.includes('user id mismatch') || lowered.includes('does not match this token')) {
return '填写的用户 ID 与当前 Token / Cookie 不匹配'; return '填写的用户 ID 与当前 Token / Cookie 不匹配';
@@ -43,7 +43,7 @@ export function buildVerifyFailureHint(result: VerifyResultLike): string | null
return '这不是 Token 错误判断。请检查填写的用户 ID 是否与当前 Token / Cookie 属于同一账号。'; return '这不是 Token 错误判断。请检查填写的用户 ID 是否与当前 Token / Cookie 属于同一账号。';
} }
if (isNetworkFailureMessage(result.message)) { if (isNetworkFailureMessage(result.message)) {
return '这不是 Token 错误判断。请检查 BoosAPI 服务是否在线,以及目标站点或代理是否可达。'; return '这不是 Token 错误判断。请检查 天宥数据云 服务是否在线,以及目标站点或代理是否可达。';
} }
if (isTimeoutFailureMessage(result.message)) { if (isTimeoutFailureMessage(result.message)) {
return '这不是 Token 错误判断。目标站点响应超时,请稍后重试或检查代理/网络。'; return '这不是 Token 错误判断。目标站点响应超时,请稍后重试或检查代理/网络。';
@@ -63,7 +63,7 @@ export function buildAddAccountPrereqHint(result: VerifyResultLike): string {
return '请先修正用户 ID 并重新验证,验证成功后才能添加账号。'; return '请先修正用户 ID 并重新验证,验证成功后才能添加账号。';
} }
if (isNetworkFailureMessage(result.message)) { if (isNetworkFailureMessage(result.message)) {
return '验证请求未成功完成,请先检查 BoosAPI 服务、站点网络或代理配置。'; return '验证请求未成功完成,请先检查 天宥数据云 服务、站点网络或代理配置。';
} }
if (isTimeoutFailureMessage(result.message)) { if (isTimeoutFailureMessage(result.message)) {
return '验证请求超时,请先检查站点或代理连通性后再添加账号。'; return '验证请求超时,请先检查站点或代理连通性后再添加账号。';
+2 -2
View File
@@ -43,10 +43,10 @@ export default function FactoryResetModal({
<div className="modal-header" style={{ color: 'var(--color-danger)' }}>确认重新初始化系统</div> <div className="modal-header" style={{ color: 'var(--color-danger)' }}>确认重新初始化系统</div>
<div className="modal-body" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}> <div className="modal-body" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
<div style={{ padding: 12, borderRadius: 'var(--radius-sm)', background: 'var(--color-danger-bg)', color: 'var(--color-danger)', fontSize: 12, lineHeight: 1.8 }}> <div style={{ padding: 12, borderRadius: 'var(--radius-sm)', background: 'var(--color-danger-bg)', color: 'var(--color-danger)', fontSize: 12, lineHeight: 1.8 }}>
这是不可逆操作。系统会清空当前 BoosAPI 使用中的全部数据库内容,并在成功后立即退出当前登录状态。 这是不可逆操作。系统会清空当前 天宥数据云 使用中的全部数据库内容,并在成功后立即退出当前登录状态。
</div> </div>
<div style={{ fontSize: 13, color: 'var(--color-text-secondary)', lineHeight: 1.9 }}> <div style={{ fontSize: 13, color: 'var(--color-text-secondary)', lineHeight: 1.9 }}>
<div>• 当前若使用外部 MySQL/Postgres,也会先清空该外部库中的 BoosAPI 数据。</div> <div>• 当前若使用外部 MySQL/Postgres,也会先清空该外部库中的 天宥数据云 数据。</div>
<div>• 系统随后会强制切回默认 SQLite。</div> <div>• 系统随后会强制切回默认 SQLite。</div>
<div>• 管理员 Token 将重置为 <code style={{ fontFamily: 'var(--font-mono)' }}>{adminToken}</code>。</div> <div>• 管理员 Token 将重置为 <code style={{ fontFamily: 'var(--font-mono)' }}>{adminToken}</code>。</div>
<div>• 完成后会立即退出登录并刷新页面,回到当前首装初始状态。</div> <div>• 完成后会立即退出登录并刷新页面,回到当前首装初始状态。</div>
@@ -52,7 +52,7 @@ export default function ModelAvailabilityProbeConfirmModal({
<div id={titleId} className="modal-header" style={{ color: 'var(--color-danger)' }}>确认开启批量测活</div> <div id={titleId} className="modal-header" style={{ color: 'var(--color-danger)' }}>确认开启批量测活</div>
<div id={descriptionId} className="modal-body" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}> <div id={descriptionId} className="modal-body" style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
<div style={{ padding: 12, borderRadius: 'var(--radius-sm)', background: 'var(--color-danger-bg)', color: 'var(--color-danger)', fontSize: 12, lineHeight: 1.8 }}> <div style={{ padding: 12, borderRadius: 'var(--radius-sm)', background: 'var(--color-danger-bg)', color: 'var(--color-danger)', fontSize: 12, lineHeight: 1.8 }}>
开启后,BoosAPI 会在后台对活跃账号模型做最小化探测请求。这可能被部分中转站视为批量测活或异常行为,请务必先确认你的中转站明确允许此类探测。 开启后,天宥数据云 会在后台对活跃账号模型做最小化探测请求。这可能被部分中转站视为批量测活或异常行为,请务必先确认你的中转站明确允许此类探测。
</div> </div>
<div style={{ fontSize: 13, color: 'var(--color-text-secondary)', lineHeight: 1.9 }}> <div style={{ fontSize: 13, color: 'var(--color-text-secondary)', lineHeight: 1.9 }}>
请手动输入以下整句后再开启: 请手动输入以下整句后再开启:
Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

After

Width:  |  Height:  |  Size: 87 KiB