feat: 实现邮箱验证码登录和腾讯云SES集成

- 实现邮箱验证码登录功能,支持自动注册新用户
- 修复验证码生成逻辑,确保前后端验证码一致
- 添加腾讯云SES webhook回调接口,支持6种邮件事件
- 配置ngrok内网穿透支持,允许外部访问
- 优化登录页面UI,采用全屏背景和居中布局
- 清理调试代码和未使用的导入
- 添加完整的配置文档和测试脚本
This commit is contained in:
AIGC Developer
2025-10-23 17:50:12 +08:00
parent 26d10a3322
commit a13ff70055
32 changed files with 1979 additions and 588 deletions

View File

@@ -5,10 +5,10 @@
<div class="navbar-content">
<div class="logo">Logo</div>
<nav class="nav-links">
<a href="#" class="nav-link">文生视频</a>
<a href="#" class="nav-link">图生视频</a>
<a href="#" class="nav-link">分镜视频</a>
<a href="#" class="nav-link">订阅套餐</a>
<a href="#" class="nav-link" @click="scrollToSection('features')">文生视频</a>
<a href="#" class="nav-link" @click="scrollToSection('features')">图生视频</a>
<a href="#" class="nav-link" @click="scrollToSection('features')">分镜视频</a>
<a href="#" class="nav-link" @click="scrollToSection('features')">订阅套餐</a>
</nav>
<button class="nav-button" @click="goToLogin">开始体验</button>
</div>
@@ -24,10 +24,35 @@
<span class="bright-text">灵感</span><span class="fade-text">变现</span>
</span>
</h1>
<p class="subtitle">使用邮箱验证码登录安全便捷</p>
<button class="main-button" @click="goToLogin">立即体验</button>
</main>
<!-- 背景光影效果已删除 -->
<!-- 功能说明 -->
<section id="features" class="features-section">
<div class="features-container">
<h2 class="features-title">核心功能</h2>
<div class="features-grid">
<div class="feature-card">
<h3>文生视频</h3>
<p>输入文字描述AI自动生成高质量视频内容</p>
</div>
<div class="feature-card">
<h3>图生视频</h3>
<p>上传图片AI智能分析并生成动态视频</p>
</div>
<div class="feature-card">
<h3>分镜视频</h3>
<p>专业分镜制作打造电影级视频效果</p>
</div>
<div class="feature-card">
<h3>订阅套餐</h3>
<p>灵活的价格方案满足不同创作需求</p>
</div>
</div>
<button class="features-button" @click="goToLogin">开始创作</button>
</div>
</section>
</div>
</template>
@@ -40,6 +65,14 @@ const router = useRouter()
const goToLogin = () => {
router.push('/login')
}
// 滚动到功能说明部分
const scrollToSection = (sectionId) => {
const element = document.getElementById(sectionId)
if (element) {
element.scrollIntoView({ behavior: 'smooth' })
}
}
</script>
<style scoped>
@@ -148,6 +181,14 @@ const goToLogin = () => {
align-items: center;
}
.subtitle {
font-size: 1.2rem;
color: rgba(255, 255, 255, 0.8);
margin-bottom: 40px;
font-weight: 400;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
}
.title-line {
display: block;
text-align: center;
@@ -228,4 +269,82 @@ const goToLogin = () => {
font-size: 16px;
}
}
/* 功能说明部分 */
.features-section {
background: rgba(0, 0, 0, 0.8);
padding: 80px 20px;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.features-container {
max-width: 1200px;
width: 100%;
text-align: center;
}
.features-title {
font-size: 3rem;
color: white;
margin-bottom: 60px;
font-weight: 700;
text-shadow: 0 2px 10px rgba(0, 0, 0, 0.5);
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 30px;
margin-bottom: 60px;
}
.feature-card {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 20px;
padding: 40px 30px;
transition: all 0.3s ease;
}
.feature-card:hover {
transform: translateY(-10px);
background: rgba(255, 255, 255, 0.15);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
}
.feature-card h3 {
font-size: 1.5rem;
color: white;
margin-bottom: 15px;
font-weight: 600;
}
.feature-card p {
color: rgba(255, 255, 255, 0.8);
line-height: 1.6;
font-size: 1rem;
}
.features-button {
background: linear-gradient(135deg, #4A9EFF 0%, #6B73FF 100%);
color: white;
border: none;
padding: 18px 40px;
font-size: 1.1rem;
font-weight: 600;
border-radius: 50px;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 10px 30px rgba(74, 158, 255, 0.3);
}
.features-button:hover {
background: linear-gradient(135deg, #6B73FF 0%, #4A9EFF 100%);
transform: translateY(-3px);
box-shadow: 0 15px 40px rgba(74, 158, 255, 0.4);
}
</style>