教程目录
教程目录
AI 图片生成站
从零搭建一个完整的AI图片生成网站
课程概览
本教程将带领你从零开始构建一个完整的AI图片生成网站。我们将学习NextJS全栈开发,整合第三方AI图像生成API,实现用户认证与支付订阅,最终部署一个功能完备的AI图片生成网站。
需求与技术选型
在这个教程中,我们将从零开始搭建一个完整的AI图片生成网站。首先,我们需要分析项目需求,了解网站的核心功能和界面结构,并选择合适的技术栈。
需求分析与技术选型要点
1网站结构分析
- 分析竞对网站,了解网页基本结构
- 首页设计为产品落地页
- 工具页放在内页,方便用户直接使用
- 确定网站整体布局和导航结构
2工具页面结构
- 侧边栏导航,便于用户快速切换功能
- 输入区域,用户填写prompt和参数
- 图片输出区域,展示生成结果
- 参数设置区,包含图片数量和尺寸选项
3技术栈选择
- Next.js全栈开发 - 前后端代码统一管理
- React - 构建交互式用户界面
- TailwindCSS - 实现响应式设计
- API Routes - 处理后端请求
- 第三方AI服务 - 图片生成核心功能
- Vercel - 部署和托管网站
页面搭建
页面结构开发
创建项目结构
使用Next.js创建基础项目结构,设计页面布局
组件设计
构建页面核心组件,实现响应式布局和用户界面
表单设计
创建用户输入表单,设计参数选择界面和交互逻辑
API选择
- RapidAPI Hub - 集成多种AI服务API
- Fal.ai - 专注于AI图像生成服务
- Replicate - 开源模型API服务
- Segmind - 提供多种AI模型API
- PublicAPIs - 免费API资源库
- 输入参数与需求匹配度
- 输出质量与响应速度
- API调用成本与限额
- 文档完整性和易用性
- 使用示例和社区支持
API调用实现
接下来,我们将学习如何调用AI图像生成API,并将生成的图片展示在网站中。这一步是实现核心功能的关键环节。
API调用流程
- 创建Next.js API路由处理函数
- 配置第三方API所需的认证与参数
- 处理用户输入的prompt和参数
- 发送请求到AI图像生成服务
- 接收生成的图片URL或Base64数据
- 返回结果到前端页面
编码技巧
- 提前规划API调用流程,明确每一步的逻辑
- 在复杂逻辑处添加日志,便于调试和定位问题
- 处理各种错误情况,确保应用稳定性
- 使用适当的状态管理,跟踪请求状态
前端展示实现
请求状态处理
实现加载状态、成功状态和错误状态的UI展示,提升用户体验
图片展示组件
创建响应式图片网格布局,支持不同数量和尺寸的图片展示
交互功能设计
添加下载、放大查看等功能,提升用户使用体验
图片保存
为了保存用户生成的图片,我们将使用Cloudflare R2存储服务,这是一个高性能、低成本的云存储解决方案。
Cloudflare R2存储配置
1. 创建R2存储桶
- 登录Cloudflare管理面板
- 选择R2服务,创建新的存储桶
- 配置存储桶访问权限和生命周期规则
- 获取访问密钥和密钥ID
2. 绑定自定义域名
- 确保域名已添加到Cloudflare管理中
- 在R2设置中创建公共访问入口
- 配置自定义域名作为存储桶访问地址
- 设置DNS记录指向R2存储服务
注意:必须先将域名添加到Cloudflare并完成DNS配置,才能为R2存储桶绑定子域名
3. 实现图片上传功能
- 安装@aws-sdk/client-s3包与R2通信
- 创建S3客户端连接R2服务
- 实现图片上传API接口
- 将R2返回的链接转换为自定义域名链接
将R2链接替换为自定义域名链接
R2默认返回的链接格式为:https://<bucket>.<account-id>.r2.cloudflarestorage.com/<object-key>
需要在代码中将其替换为:https://<your-subdomain>.<your-domain>.com/<object-key>
用户认证登录
为了跟踪用户生成的图片并提供个性化体验,我们需要实现用户登录功能。在本节中,我们将使用Supabase实现谷歌账号登录,并将用户信息存储到数据库中。
Supabase认证系统整合
1Supabase设置
- 创建Supabase项目
- 配置谷歌OAuth提供商
- 设置允许的回调URL
- 获取客户端密钥和API密钥
数据库用户表设计
字段名 | 类型 | 说明 |
---|---|---|
id | UUID | 主键,用户唯一标识符 |
VARCHAR | 用户邮箱地址 | |
avatar_url | VARCHAR | 用户头像URL |
credits | INTEGER | 用户可用积分数量 |
2前端集成
安装依赖
安装并配置Supabase客户端库,准备认证相关组件
登录按钮
在Header组件右侧添加谷歌登录按钮,处理登录流程
用户状态管理
创建全局认证上下文,跟踪用户登录状态和信息
登录回调处理
处理OAuth回调,获取用户信息并更新数据库
SQL代码示例
CREATE TABLE users (
id UUID PRIMARY KEY,
email VARCHAR NOT NULL,
avatar_url VARCHAR,
credits INTEGER DEFAULT 10
);
图片数据库记录
当用户生成图片并上传到Cloudflare R2后,我们需要将图片URL和生成记录保存到数据库中,便于用户查看历史记录和管理生成内容。
图片生成记录数据库设计
数据库表设计
字段名 | 类型 | 说明 |
---|---|---|
id | UUID | 记录唯一标识符 |
user_id | UUID | 关联用户ID |
prompt | TEXT | 生成图片使用的提示词 |
image_url | VARCHAR | 图片URL地址 |
created_at | TIMESTAMP | 创建时间 |
parameters | JSONB | 生成参数(尺寸、数量等) |
SQL代码示例:
CREATE TABLE generated_images (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users(id),
prompt TEXT NOT NULL,
image_url VARCHAR NOT NULL,
created_at TIMESTAMP DEFAULT NOW(),
parameters JSONB
);
实现功能
1. 记录创建API
创建API接口,将图片生成记录存入数据库,包含用户信息、提示词和图片URL
2. 历史记录获取
实现获取用户生成历史的API,支持分页和筛选
3. 前端展示组件
创建历史记录展示页面,显示用户生成的图片及相关信息
4. 用户积分管理
实现生成图片消耗积分的功能,更新用户积分余额
集成流程
- 用户生成图片 → 图片上传到R2
- 获取图片URL → 创建数据库记录
- 扣除用户积分 → 返回生成结果
- 用户查看历史 → 从数据库加载记录
Stripe支付集成
为了实现会员订阅和积分充值功能,我们需要集成在线支付系统。本节将使用Stripe作为支付处理平台,实现订阅模式的支付流程和Webhook事件处理。
支付系统实现步骤
Stripe账户设置
开通Stripe账户要求
- 护照 + 香港银行卡(个人即可开通)
- 初期可使用沙盒(Sandbox)模式测试集成
- 获取API密钥(公钥和私钥)
- 配置Webhook端点和事件监听
测试卡信息
卡号:4242 4242 4242 4242
CVC:任意三位数
日期:任意未来日期
新建订阅表
CREATE TABLE subscriptions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id UUID REFERENCES users(id),
stripe_customer_id VARCHAR NOT NULL,
stripe_subscription_id VARCHAR NOT NULL,
plan_type VARCHAR NOT NULL,
status VARCHAR NOT NULL,
current_period_end TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
实现支付流程
1. 前端支付组件
使用Stripe Elements或Checkout创建支付界面,处理用户订阅选择
2. 创建支付会话
后端API创建Stripe支付会话,返回会话ID给前端
3. Webhook处理
配置Webhook监听invoice.paid
事件,更新数据库
Webhook调试技巧
处理Webhook时,添加适当的日志能帮助定位问题:
console.log('Received webhook event:', event.type);
console.log('Event data:', JSON.stringify(event.data));
console.log('Customer:', event.data.object.customer);
try {
// 处理逻辑
console.log('Processing successful');
} catch (error) {
console.error('Error processing webhook:', error);
// 错误处理
}
遇到报错解决思路
- 在关键位置添加详细日志,记录完整的请求和响应
- 使用Stripe CLI工具本地测试Webhook
- 检查Stripe Dashboard中的事件日志
- 确认API密钥和Webhook密钥正确配置
支付完成后的数据更新流程
- 监听
invoice.paid
事件确认支付成功 - 根据订阅计划更新users表中的credits字段
- 将订阅信息记录到subscriptions表
- 更新用户界面显示最新的积分和订阅状态