feat: 完整的生成流程 - 登录检查、文件上传、支付凭证验证

主要功能:
1.  添加 canGenerate() - 检查登录、metered 订阅、余额
2.  添加 uploadBlobFiles() - 自动上传所有 blob URL 到服务器
3.  支付凭证强制验证 - identifier 缺失时报错"支付失败"
4.  新增 lib/api/upload.ts - 文件上传 API
5.  更新 useTemplateRun hook 支持 identifier 参数

完整流程(7步骤):
  1. 表单验证
  2. canGenerate 检查(登录 + 订阅 + 余额)
  3. 上传 blob 文件到服务器
  4. recordTokenUsage 扣费并获取 identifier
  5. 验证所有 URL 都是服务器 URL
  6. 转换数据格式
  7. runTemplate(id, data, identifier) 创建任务

安全保障:
-  无 identifier → 抛出错误"支付凭证缺失"
-  blob URL 未上传 → 报错"存在未上传的文件"
-  余额不足 → 引导用户充值

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
imeepos
2025-11-11 18:51:31 +08:00
parent 74ca367081
commit 26cd0139bf
4 changed files with 228 additions and 25 deletions

View File

@@ -102,13 +102,29 @@ export function useTemplateRun(options: UseTemplateRunOptions = {}) {
// 运行模板
const executeTemplate = useCallback(async (
templateId: string,
data: RunTemplateData
data: RunTemplateData,
identifier?: string
) => {
if (state === 'submitting' || state === 'running') {
console.warn('模板正在运行中,请勿重复提交');
return;
}
// 检查是否提供了支付凭证
if (!identifier) {
const error = new Error('缺少支付凭证,请先完成支付流程');
setError(error);
setState('error');
setProgress({
status: 'failed',
progress: 0,
message: '支付凭证缺失',
});
options.onError?.(error);
Alert.alert('错误', '支付凭证缺失,无法创建生成任务');
return;
}
try {
// 重置状态
setState('submitting');
@@ -120,8 +136,8 @@ export function useTemplateRun(options: UseTemplateRunOptions = {}) {
message: '正在提交任务...',
});
// 提交模板运行
const runResponse = await runTemplate(templateId, data);
// 提交模板运行,传递支付凭证
const runResponse = await runTemplate(templateId, data, identifier);
if (!runResponse.success || !runResponse.data) {
throw new Error('提交任务失败');