diff --git a/video-gen-admin/src/pages/AdminSettings.tsx b/video-gen-admin/src/pages/AdminSettings.tsx index 97eb363e..b63117f6 100644 --- a/video-gen-admin/src/pages/AdminSettings.tsx +++ b/video-gen-admin/src/pages/AdminSettings.tsx @@ -119,6 +119,7 @@ const AdminSettings: React.FC = () => { '协议配置': configs.filter(c => c.key === 'user_agreement_privacy_url'), 'SEO 设置': configs.filter(c => c.key.startsWith('seo_')), '用户积分配置': configs.filter(c => c.key.startsWith('user_') && c.key.includes('credits')), + '其他配置': configs.filter(c => c.key === 'operation_manual'), }; const getFieldDescription = (config: SystemConfig): string => { @@ -133,6 +134,7 @@ const AdminSettings: React.FC = () => { user_register_credits: '用户注册时赠送的初始积分,默认100', user_login_credits: '用户每日登录赠送的积分数量', user_login_credits_enabled: '是否启用每日登录赠送积分功能', + operation_manual: '操作手册链接,前台用户菜单将展示该入口,点击跳转此链接', }; return descMap[config.key] || config.description || ''; }; diff --git a/video-gen-api/app/api/v1/auth.py b/video-gen-api/app/api/v1/auth.py index 7a432608..53a3bc94 100644 --- a/video-gen-api/app/api/v1/auth.py +++ b/video-gen-api/app/api/v1/auth.py @@ -312,12 +312,12 @@ async def get_site_info(db: AsyncSession = Depends(get_db)): """Public endpoint returning site name, logo, agreement and copyright info.""" result = await db.execute( select(SystemConfig).where(SystemConfig.key.in_([ - "site_name", "site_logo", "user_agreement_privacy_url", "site_copyright" + "site_name", "site_logo", "user_agreement_privacy_url", "site_copyright", "operation_manual" ])) ) configs = result.scalars().all() info = {c.key: c.value for c in configs} - + # Helper function to convert relative path to full URL def to_full_url(path: str | None) -> str: if not path: @@ -328,12 +328,13 @@ async def get_site_info(db: AsyncSession = Depends(get_db)): # Convert relative path to full URL base_url = settings.BASE_URL.rstrip("/") return f"{base_url}{path}" - + return { "site_name": info.get("site_name", "VideoGen.AI"), "site_logo": to_full_url(info.get("site_logo")), "user_agreement_privacy_url": to_full_url(info.get("user_agreement_privacy_url")), "site_copyright": info.get("site_copyright", "© 2024 民众智创 版权所有"), + "operation_manual": info.get("operation_manual", ""), } diff --git a/video-gen-app/src/api/index.ts b/video-gen-app/src/api/index.ts index aeb2528f..35c61eef 100644 --- a/video-gen-app/src/api/index.ts +++ b/video-gen-app/src/api/index.ts @@ -174,8 +174,8 @@ export async function verifyCaptcha(captchaId: string, x: number): Promise { - if (USE_MOCK) return { siteName: 'VideoGen.AI', siteLogo: '', userAgreementPrivacyUrl: '', siteCopyright: '© 2024 民众智创 版权所有' }; +export async function getSiteInfo(): Promise<{ siteName: string; siteLogo: string; userAgreementPrivacyUrl: string; siteCopyright: string; operationManual: string }> { + if (USE_MOCK) return { siteName: 'VideoGen.AI', siteLogo: '', userAgreementPrivacyUrl: '', siteCopyright: '© 2024 民众智创 版权所有', operationManual: '' }; return api.get('/auth/site-info', false); } // ── Video Engines ───────────────────────────────────────── diff --git a/video-gen-app/src/api/mock.ts b/video-gen-app/src/api/mock.ts index 5e55cefb..6048f3fa 100644 --- a/video-gen-app/src/api/mock.ts +++ b/video-gen-app/src/api/mock.ts @@ -301,6 +301,7 @@ let MOCK_SYSTEM_CONFIGS: SystemConfig[] = [ { id: 'sc-3', key: 'seo_title', value: 'VideoGen.AI - AI视频生成平台', description: 'SEO标题' }, { id: 'sc-4', key: 'seo_description', value: '专业的AI视频生成服务,一键将文字转化为精美视频', description: 'SEO描述' }, { id: 'sc-5', key: 'seo_keywords', value: 'AI视频,视频生成,人工智能,AIGC,短视频', description: 'SEO关键词' }, + { id: 'sc-6', key: 'operation_manual', value: '', description: '操作手册链接' }, ]; const MOCK_ADMIN_NOTIFICATIONS: AdminNotification[] = [