From 41feb480ee2b0a76f34ba24fe9c2b66d1372a57e Mon Sep 17 00:00:00 2001 From: wwwwwwwww <526125649@qq.com> Date: Thu, 16 Jul 2026 09:28:43 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=E7=99=BB=E9=99=86=E6=A0=B7=E5=BC=8F=E8=83=8C=E6=99=AF=E5=8F=AF?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=A7=86=E9=A2=91=202=E3=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=90=8E=E5=8F=B0=E9=85=8D=E7=BD=AE=E5=89=8D=E5=8F=B0?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- video-gen-admin/src/api/index.ts | 16 + video-gen-admin/src/pages/AdminSettings.tsx | 78 +++- video-gen-api/app/api/v1/admin.py | 56 +++ video-gen-api/app/api/v1/auth.py | 3 +- video-gen-app/src/api/index.ts | 4 +- video-gen-app/src/pages/LoginPage.css | 372 ++++++-------------- video-gen-app/src/pages/LoginPage.tsx | 176 ++++----- 7 files changed, 342 insertions(+), 363 deletions(-) diff --git a/video-gen-admin/src/api/index.ts b/video-gen-admin/src/api/index.ts index d9a02ed8..b61e5dc2 100644 --- a/video-gen-admin/src/api/index.ts +++ b/video-gen-admin/src/api/index.ts @@ -276,6 +276,22 @@ export async function uploadLogo(file: File): Promise<{ url: string }> { return { url: res.url }; } +export async function uploadLoginVideo(file: File): Promise<{ url: string }> { + const form = new FormData(); + form.append('file', file); + const token = localStorage.getItem('auth_token'); + const res = await fetch(`${import.meta.env.VITE_API_BASE || 'http://localhost:8000'}/api/admin/upload-login-video`, { + method: 'POST', + headers: token ? { Authorization: `Bearer ${token}` } : {}, + body: form, + }); + if (!res.ok) { + const err = await res.json().catch(() => ({})); + throw new Error(err?.detail || '上传失败'); + } + return res.json(); +} + function setMaybe(params: URLSearchParams, key: string, value: unknown): void { if (value !== undefined && value !== null && String(value) !== '') params.set(key, String(value)); } diff --git a/video-gen-admin/src/pages/AdminSettings.tsx b/video-gen-admin/src/pages/AdminSettings.tsx index 3afe6226..9eece146 100644 --- a/video-gen-admin/src/pages/AdminSettings.tsx +++ b/video-gen-admin/src/pages/AdminSettings.tsx @@ -3,7 +3,7 @@ import { Button, Card, Form, Input, InputNumber, message, Select, Space, Switch, Typography, Upload, } from 'antd'; import { - SettingOutlined, SaveOutlined, UploadOutlined, FilePdfOutlined, EyeOutlined, DatabaseOutlined, + SettingOutlined, SaveOutlined, UploadOutlined, FilePdfOutlined, EyeOutlined, DatabaseOutlined, VideoCameraOutlined, } from '@ant-design/icons'; import { getGlobalResourceCapacity, @@ -12,6 +12,7 @@ import { updateSystemConfig, uploadLogo, uploadPdf, + uploadLoginVideo, } from '../api'; import type { ResourceCapacityUnit, SystemConfig } from '../types'; @@ -118,6 +119,35 @@ const AdminSettings: React.FC = () => { return false; }; + const handleLoginVideoUpload = async (file: File) => { + setUploading('login_bg_video'); + try { + const res = await uploadLoginVideo(file); + setConfigs(prev => prev.map(c => c.key === 'login_bg_video' ? { ...c, value: res.url } : c)); + form.setFieldsValue({ login_bg_video: res.url }); + const config = configs.find(c => c.key === 'login_bg_video'); + if (config) { + await updateSystemConfig(config.id, res.url); + } + message.success('登录背景视频上传成功并已保存'); + } catch (e: any) { + message.error(e?.message || '上传失败'); + } finally { + setUploading(''); + } + return false; + }; + + const handleRemoveLoginVideo = async () => { + setConfigs(prev => prev.map(c => c.key === 'login_bg_video' ? { ...c, value: '' } : c)); + form.setFieldsValue({ login_bg_video: '' }); + const config = configs.find(c => c.key === 'login_bg_video'); + if (config) { + await updateSystemConfig(config.id, ''); + } + message.success('已移除登录背景视频'); + }; + const groupedConfigs: Record = { '站点信息': configs.filter(c => c.key.startsWith('site_')), '协议配置': configs.filter(c => c.key === 'user_agreement_privacy_url'), @@ -297,6 +327,52 @@ const AdminSettings: React.FC = () => {
+ {/* 登录背景视频 */} +
+ + 登录背景视频 + +
+
+ + + 背景视频 + + + {form.getFieldValue('login_bg_video') && ( + + )} + + + + +
+ {form.getFieldValue('login_bg_video') ? ( +
+
+ {Object.entries(groupedConfigs).map(([group, items]) => (
diff --git a/video-gen-api/app/api/v1/admin.py b/video-gen-api/app/api/v1/admin.py index 3e18a985..e908e72f 100644 --- a/video-gen-api/app/api/v1/admin.py +++ b/video-gen-api/app/api/v1/admin.py @@ -2281,6 +2281,62 @@ async def upload_logo( return {"url": url} +@router.post("/upload-login-video") +async def upload_login_video( + file: UploadFile = File(...), + admin: User = Depends(get_admin_user), + db: AsyncSession = Depends(get_db), +): + """上传登录页背景视频,保存 URL 到 system config login_bg_video。""" + from app.config import settings + + if not file.filename: + raise HTTPException(status_code=400, detail="请选择文件") + + allowed_extensions = ('.mp4', '.webm', '.mov') + if not file.filename.lower().endswith(allowed_extensions): + raise HTTPException(status_code=400, detail="仅支持 MP4、WebM、MOV 视频格式") + + content = await file.read() + if len(content) > 50 * 1024 * 1024: + raise HTTPException(status_code=400, detail="文件大小不能超过50MB") + + ext = os.path.splitext(file.filename)[1].lower() + safe_name = f"login_bg_{generate_id()}{ext}" + file_path = os.path.join(settings.UPLOAD_LOCAL_PATH, safe_name) + with open(file_path, "wb") as f: + f.write(content) + + url = f"/uploads/{safe_name}" + + result = await db.execute( + select(SystemConfig).where(SystemConfig.key == "login_bg_video").limit(1) + ) + config = result.scalar_one_or_none() + if config: + config.value = url + else: + db.add(SystemConfig( + id=generate_id(), + key="login_bg_video", + value=url, + description="登录页背景视频", + )) + await db.flush() + await log_operation( + db, + admin.id, + admin.username, + f"上传登录背景视频: {file.filename}", + "POST", + "/admin/upload-login-video", + detail=json.dumps({"filename": file.filename, "url": url}, ensure_ascii=False), + ) + await db.commit() + + return {"url": url} + + # ── Payment Stats ──────────────────────────────────────── diff --git a/video-gen-api/app/api/v1/auth.py b/video-gen-api/app/api/v1/auth.py index d1b5ba16..362c9b00 100644 --- a/video-gen-api/app/api/v1/auth.py +++ b/video-gen-api/app/api/v1/auth.py @@ -342,7 +342,7 @@ 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", "operation_manual" + "site_name", "site_logo", "user_agreement_privacy_url", "site_copyright", "operation_manual", "login_bg_video" ])) ) configs = result.scalars().all() @@ -365,6 +365,7 @@ async def get_site_info(db: AsyncSession = Depends(get_db)): "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", ""), + "login_bg_video": to_full_url(info.get("login_bg_video")) if info.get("login_bg_video") else "", } diff --git a/video-gen-app/src/api/index.ts b/video-gen-app/src/api/index.ts index 67d2220c..cc75dad2 100644 --- a/video-gen-app/src/api/index.ts +++ b/video-gen-app/src/api/index.ts @@ -295,8 +295,8 @@ export async function verifyCaptcha(captchaId: string, x: number): Promise { - if (USE_MOCK) return { siteName: 'VideoGen.AI', siteLogo: '', userAgreementPrivacyUrl: '', siteCopyright: '© 2024 民众智创 版权所有', operationManual: '' }; +export async function getSiteInfo(): Promise<{ siteName: string; siteLogo: string; userAgreementPrivacyUrl: string; siteCopyright: string; operationManual: string; loginBgVideo: string }> { + if (USE_MOCK) return { siteName: 'VideoGen.AI', siteLogo: '', userAgreementPrivacyUrl: '', siteCopyright: '© 2024 民众智创 版权所有', operationManual: '', loginBgVideo: '' }; return api.get('/auth/site-info', false); } // ── Video Engines ───────────────────────────────────────── diff --git a/video-gen-app/src/pages/LoginPage.css b/video-gen-app/src/pages/LoginPage.css index 218620d4..9a7cbd3d 100644 --- a/video-gen-app/src/pages/LoginPage.css +++ b/video-gen-app/src/pages/LoginPage.css @@ -1,260 +1,139 @@ +/* ======================================== + 登录页 — 视频全屏背景 + 居中卡片 + ======================================== */ + .login-page { height: 100vh; max-height: 100vh; display: flex; flex-direction: column; + background: #1a1a2e; background-image: url(/backimage.png); background-size: cover; background-position: center; - background-repeat: no-repeat; - background-attachment: fixed; position: relative; overflow: hidden; } -@media (min-width: 900px) { - .login-page { - flex-direction: row; - } +/* ---- 视频全屏背景 ---- */ +.login-bg-video { + position: absolute; + inset: 0; + width: 100%; + height: 100%; + object-fit: cover; + z-index: 0; + pointer-events: none; } .login-bg-overlay { position: absolute; inset: 0; - background: linear-gradient(135deg, rgba(240,244,255,0.9) 0%, rgba(232,236,248,0.85) 40%, rgba(240,240,255,0.9) 70%, rgba(248,249,255,0.95) 100%); + background: linear-gradient(135deg, rgba(15,15,30,0.75) 0%, rgba(20,20,50,0.65) 100%); z-index: 0; } -.login-decoration { +/* ---- 左上角 slogan ---- */ +.login-slogan { position: absolute; - border-radius: 50%; - filter: blur(40px); - z-index: 0; + top: 40px; + left: 48px; + z-index: 2; } -.login-decoration-1 { - width: 500px; - height: 500px; - background: radial-gradient(circle, rgba(99,102,241,0.08) 0%, transparent 70%); - top: -150px; - right: -100px; +.login-slogan-text { + font-size: 24px; + font-weight: 800; + letter-spacing: 1px; + background: linear-gradient(90deg, #fff 0%, #c7d2fe 25%, #fff 50%, #c7d2fe 75%, #fff 100%); + background-size: 200% auto; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + animation: shinySlide 3s linear infinite; + text-shadow: none; } -.login-decoration-2 { - width: 400px; - height: 400px; - background: radial-gradient(circle, rgba(139,92,246,0.06) 0%, transparent 70%); - bottom: -100px; - left: -80px; - filter: blur(50px); +@keyframes shinySlide { + 0% { background-position: 0% center; } + 100% { background-position: 200% center; } } -.login-left-section { +/* ---- 登录卡片靠右 ---- */ +.login-center { flex: 1; display: flex; - flex-direction: column; - justify-content: center; - padding: 32px 16px; + align-items: center; + justify-content: flex-end; z-index: 1; + padding: 24px 60px 24px 24px; } -@media (min-width: 900px) { - .login-left-section { - padding: 0 80px; - } -} - -.login-left-content { +/* ======================================== + 登录卡片 + ======================================== */ +.login-card { width: 100%; + max-width: 400px; + border-radius: 20px !important; + box-shadow: 0 24px 80px rgba(0,0,0,0.25), 0 8px 32px rgba(99,102,241,0.1) !important; + border: 1px solid rgba(255,255,255,0.15) !important; + background: rgba(255,255,255,0.95) !important; + backdrop-filter: blur(24px); + -webkit-backdrop-filter: blur(24px); +} + +/* 卡片头部: logo + 站点名 */ +.login-card-header { + text-align: center; + margin-bottom: 24px; } .login-logo-row { display: flex; align-items: center; - gap: 14px; - margin-bottom: 20px; -} - -@media (max-width: 480px) { - .login-logo-row { - justify-content: center; - margin-bottom: 16px; - } + justify-content: center; + gap: 12px; } .login-logo-img { - width: 52px; - height: 52px; - border-radius: 14px; - objectFit: contain; + width: 40px; + height: 40px; + border-radius: 12px; + object-fit: contain; } .login-logo-placeholder { - width: 52px; - height: 52px; - border-radius: 14px; + width: 40px; + height: 40px; + border-radius: 12px; background: linear-gradient(135deg, #6366f1, #8b5cf6); display: flex; align-items: center; justify-content: center; - box-shadow: 0 8px 24px rgba(99,102,241,0.25); + box-shadow: 0 6px 20px rgba(99,102,241,0.3); } .login-site-name { - color: #1e293b; - font-size: 28px; + font-size: 22px; font-weight: 800; - letter-spacing: -0.5px; -} - -@media (max-width: 480px) { - .login-site-name { - font-size: 24px; - } -} - -.login-desc { - color: #64748b !important; - font-size: 17px !important; - max-width: 480px; - line-height: 1.8 !important; - margin: 0 !important; -} - -@media (max-width: 899px) { - .login-desc { - display: none !important; - } -} - -.login-features-list { - display: none; - flex-direction: column; - gap: 20px; -} - -@media (min-width: 900px) { - .login-features-list { - display: flex; - } -} - -.login-feature-card { - position: relative; - display: flex; - gap: 16px; - align-items: flex-start; - padding: 18px 22px; - border-radius: 14px; - background: rgba(255,255,255,0.85); - backdrop-filter: blur(12px); - overflow: hidden; -} - -.login-feature-icon { - width: 44px; - height: 44px; - border-radius: 12px; - flex-shrink: 0; - background: linear-gradient(135deg, rgba(99,102,241,0.15), rgba(139,92,246,0.15)); - display: flex; - align-items: center; - justify-content: center; - color: #6366f1; - font-size: 20px; -} - -.login-feature-title { - color: #1e293b !important; - font-size: 15px !important; - font-weight: 600 !important; - display: block !important; - margin-bottom: 4px !important; -} - -.login-feature-desc { - color: #64748b !important; - font-size: 13px !important; - line-height: 1.6 !important; -} - -.login-right-section { - flex: 1; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - z-index: 1; - padding: 16px 16px 60px; - position: relative; -} - -.login-right-section-inner { - display: flex; - flex-direction: column; - align-items: center; - width: 100%; - max-width: 440px; -} - -.login-copyright-wrapper { - position: absolute; - bottom: 24px; - left: 0; - right: 0; - text-align: center; -} - -.login-copyright { - color: #666; - font-size: 14px; - font-weight: 600; - letter-spacing: 0.5px; -} - -@media (min-width: 900px) { - .login-right-section { - padding: 40px 24px; - } -} - -.login-card { - width: 100%; - max-width: 440px; - border-radius: 20px !important; - box-shadow: 0 20px 60px rgba(0,0,0,0.08) !important; - border: 1px solid #e2e8f0 !important; - background: #fff !important; -} - -@media (max-width: 480px) { - .login-card { - border-radius: 16px !important; - } - .login-card .ant-card-body { - padding: 24px 20px !important; - } -} - -.login-card-title { - text-align: center !important; - margin-bottom: 6px !important; - color: #1e293b !important; - font-weight: 700 !important; + color: #1e293b; + letter-spacing: -0.3px; } .login-card-subtitle { display: block; text-align: center; - margin-bottom: 28px; + margin-bottom: 24px; color: #94a3b8; - font-size: 14px; + font-size: 13px; } +/* ---- Tabs ---- */ .login-tabs { display: flex; gap: 0; - margin-bottom: 24px; + margin-bottom: 20px; background: #f1f5f9; border-radius: 10px; padding: 4px; @@ -264,10 +143,10 @@ .login-tab { flex: 1; text-align: center; - padding: 10px 0; + padding: 9px 0; border-radius: 8px; cursor: pointer; - font-size: 14px; + font-size: 13px; font-weight: 400; color: #64748b; background: transparent; @@ -284,9 +163,9 @@ } .login-submit-btn { - height: 48px !important; + height: 46px !important; border-radius: 10px !important; - font-size: 16px !important; + font-size: 15px !important; font-weight: 600 !important; background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%) !important; border: none !important; @@ -294,19 +173,19 @@ } .login-code-btn { - height: 48px !important; - border-radius: 10 !important; + height: 46px !important; + border-radius: 10px !important; border: 1.5px solid #e2e8f0 !important; font-weight: 600 !important; min-width: 100px !important; } .login-agreement { - margin-bottom: 16px; + margin-bottom: 14px; } .login-agreement-text { - font-size: 13px; + font-size: 12px; color: #64748b; } @@ -320,21 +199,33 @@ justify-content: center; } -@media (min-width: 480px) { - .login-footer { - justify-content: flex-start; - } -} - .login-switch-btn { font-size: 13px !important; color: #6366f1 !important; cursor: pointer; } +/* ---- Copyright ---- */ +.login-copyright-wrapper { + position: absolute; + bottom: 20px; + left: 0; + right: 0; + text-align: center; + z-index: 2; + pointer-events: none; +} + +.login-copyright { + color: rgba(255,255,255,0.5); + font-size: 12px; + text-shadow: 0 1px 3px rgba(0,0,0,0.3); +} + +/* ---- Ant Design overrides ---- */ .login-page .ant-input-affix-wrapper { padding: 0 11px !important; - height: 48px !important; + height: 46px !important; } .login-page .ant-input-affix-wrapper .ant-input-prefix { @@ -344,61 +235,28 @@ .login-page .ant-input { padding-left: 11px !important; - height: 48px !important; + height: 46px !important; } -.login-code-btn { - height: 48px !important; -} +/* ======================================== + 响应式 + ======================================== */ -@media (max-width: 767px) { - .login-left-section { - padding: 28px 16px 12px; - } - - .login-right-section { - padding: 12px 16px 32px; - } - - .login-card { - max-width: 100%; - } +@media (max-width: 899px) { + .login-slogan { top: 24px; left: 24px; } + .login-slogan-text { font-size: 18px; } + .login-center { padding: 80px 20px 24px; justify-content: center; } } @media (max-width: 480px) { - .login-left-section { - padding: 24px 12px 8px; - text-align: center; - } - - .login-right-section { - padding: 8px 12px 24px; - } - - .shiny-text-container { - text-align: center; - } - + .login-slogan { top: 20px; left: 20px; } + .login-slogan-text { font-size: 15px; } + .login-card .ant-card-body { padding: 24px 20px !important; } + .login-card { border-radius: 16px !important; } .login-page .ant-input, - .login-page .ant-input-affix-wrapper { - height: 44px !important; - font-size: 14px !important; - } - - .login-page .ant-input-affix-wrapper .ant-input { - height: 100% !important; - } - - .login-code-btn { - height: 44px !important; - min-width: 90px !important; - font-size: 13px !important; - } - - .login-submit-btn { - height: 44px !important; - font-size: 15px !important; - } + .login-page .ant-input-affix-wrapper { height: 44px !important; } + .login-code-btn { height: 44px !important; min-width: 90px !important; } + .login-submit-btn { height: 44px !important; } } @keyframes sliderShake { diff --git a/video-gen-app/src/pages/LoginPage.tsx b/video-gen-app/src/pages/LoginPage.tsx index 47da657a..500b0205 100644 --- a/video-gen-app/src/pages/LoginPage.tsx +++ b/video-gen-app/src/pages/LoginPage.tsx @@ -2,7 +2,6 @@ import React, { useEffect, useState } from 'react'; import { Button, Form, Input, Card, Typography, message, Space, Checkbox } from 'antd'; import { LockOutlined, ThunderboltOutlined, - PlayCircleOutlined, BulbOutlined, HistoryOutlined, MobileOutlined, SafetyOutlined, } from '@ant-design/icons'; import { useNavigate, useSearchParams } from 'react-router-dom'; @@ -48,9 +47,10 @@ const LoginPage: React.FC = () => { const initialInfo = getInitialSiteInfo(); const [siteName, setSiteName] = useState(initialInfo.siteName); const [siteLogo, setSiteLogo] = useState(initialInfo.siteLogo); + const [loginBgVideo, setLoginBgVideo] = useState(''); const [agreementPrivacyUrl, setAgreementPrivacyUrl] = useState(''); const [siteCopyright, setSiteCopyright] = useState(''); - + const navigate = useNavigate(); const { login } = useAuthStore(); const [pwdForm] = Form.useForm(); @@ -61,6 +61,7 @@ const LoginPage: React.FC = () => { getSiteInfo().then(info => { setSiteName(info.siteName); setSiteLogo(info.siteLogo); + setLoginBgVideo(info.loginBgVideo || ''); setAgreementPrivacyUrl(info.userAgreementPrivacyUrl); setSiteCopyright(info.siteCopyright); }).catch(() => {}); @@ -265,12 +266,6 @@ const LoginPage: React.FC = () => { } }; - const features = [ - { icon: , title: 'AI 智能优化', desc: '输入原始提示词,AI 自动为您生成专业级视频、图片描述' }, - { icon: , title: '一键生成视频、图片', desc: '支持多种规格生成视频、图片' }, - { icon: , title: '项目维度管理', desc: '按项目行业分类视频、图片,支持多种行业' }, - ]; - const inputStyle: React.CSSProperties = { background: '#fff', border: '1.5px solid #e2e8f0', @@ -293,71 +288,48 @@ const LoginPage: React.FC = () => { return (
+ {/* 视频背景全屏铺满 */} + {loginBgVideo && ( + + )}
-
-
-
- -
+ {/* 左上角 slogan */} +
+ AI赋能创意,素材触手可及 +
+ + {/* 居中登录卡片 */} +
+ +
{siteLogo ? ( logo ) : (
- +
)} {siteName}
-
- AI赋能创意,素材触手可及 +
+ + {mode === 'register' ? '注册新账号,开始创作视频' : '登录您的账号,开始创作'} + + + {mode !== 'register' && ( +
+ {(['password', 'phone'] as const).map((t) => ( +
switchTab(t)} + className={`login-tab ${tab === t ? 'login-tab-active' : ''}`}> + {t === 'password' ? '密码登录' : '验证码登录'} +
+ ))}
- - 专业的 AI 素材生成平台,通过智能提示词优化,
让您的创意快速转化为精美视频、图片 -
-
-
- {features.map((f, i) => ( -
-
-
-
-
{f.icon}
-
-
- {f.title} - {f.desc} -
-
- ))} -
- -
- -
-
- - - {mode === 'register' ? '创建账号' : '欢迎回来'} - - - {mode === 'register' ? '注册新账号,开始创作视频' : '登录您的账号,开始创作视频'} - - - {mode !== 'register' && ( -
- {(['password', 'phone'] as const).map((t) => ( -
switchTab(t)} - className={`login-tab ${tab === t ? 'login-tab-active' : ''}`}> - {t === 'password' ? '密码登录' : '验证码登录'} -
- ))} -
- )} + )} {mode === 'password' && ( @@ -485,49 +457,49 @@ const LoginPage: React.FC = () => {
-
- {mode === 'register' ? ( - { - setMode('password'); - setTab('password'); - setShowResend(false); - setLoginShowResend(false); - setSliderVerified(false); - setShowSliderVerify(false); - setSliderKey(prev => prev + 1); - regForm.resetFields(); - }} - > - 已有账号?去登录 - - ) : ( - { - setMode('register'); - setShowResend(false); - setLoginShowResend(false); - setSliderVerified(false); - setShowSliderVerify(false); - setSliderKey(prev => prev + 1); - }} - > - 没有账号?立即注册 - - )} -
- -
- {siteCopyright && ( -
-
- {siteCopyright} -
+
+ {mode === 'register' ? ( + { + setMode('password'); + setTab('password'); + setShowResend(false); + setLoginShowResend(false); + setSliderVerified(false); + setShowSliderVerify(false); + setSliderKey(prev => prev + 1); + regForm.resetFields(); + }} + > + 已有账号?去登录 + + ) : ( + { + setMode('register'); + setShowResend(false); + setLoginShowResend(false); + setSliderVerified(false); + setShowSliderVerify(false); + setSliderKey(prev => prev + 1); + }} + > + 没有账号?立即注册 + + )}
- )} +
+ + {siteCopyright && ( +
+
+ {siteCopyright} +
+
+ )}
); };