From c48b706e9a37259dc16703e4a7bea13cad2d0b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E9=BE=99?= Date: Sun, 10 Aug 2025 14:52:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=8A=E4=BC=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=88=B0=E4=B8=83=E7=89=9B=E4=BA=91=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E8=A7=92=E8=89=B2=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BB=A5=E4=BD=BF=E7=94=A8=20tags=20?= =?UTF-8?q?=E6=9B=BF=E4=BB=A3=20tagIds=EF=BC=8C=E9=87=8D=E6=9E=84=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=A7=92=E8=89=B2=E5=88=97=E8=A1=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E4=BB=A5=E6=94=AF=E6=8C=81=E6=96=B0=E6=8E=A5=E5=8F=A3=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=A0=B9=E6=8D=AE=E5=9B=BE=E7=89=87=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=A7=92=E8=89=B2=E5=AE=9E=E4=BD=93=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E6=B3=95=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/Interaction/RoleService.ts | 21 +++++++++ app/service/domain/Entities.ts | 2 +- app/service/usecase/RoleEditUseCase.ts | 65 ++++++++++++++++++++++++-- 3 files changed, 82 insertions(+), 6 deletions(-) diff --git a/app/service/Interaction/RoleService.ts b/app/service/Interaction/RoleService.ts index f5f99a9..c7dc783 100644 --- a/app/service/Interaction/RoleService.ts +++ b/app/service/Interaction/RoleService.ts @@ -2,6 +2,7 @@ import { useState, useCallback, useMemo } from 'react'; import { RoleEntity, AITextEntity } from '../domain/Entities'; import { RoleEditUseCase } from '../usecase/RoleEditUseCase'; import { getRoleData, getRoleList, getUserRoleLibrary, replaceRole } from '@/api/video_flow'; +import { getUploadToken, uploadToQiniu } from '@/api/common'; /** * 角色服务Hook返回值接口 @@ -33,6 +34,8 @@ interface UseRoleService { fetchUserRoleLibrary: () => Promise; /** 替换角色 */ replaceRoleWithLibrary: (replaceRoleId: string) => Promise; + /** 上传图片到七牛云 */ + uploadImageToQiniu: (file: File) => Promise; } /** @@ -292,6 +295,23 @@ export const useRoleServiceHook = (): UseRoleService => { } }, [selectedRole, roleEditUseCase, userRoleLibrary, initializeRoleData]); + /** + * 上传图片到七牛云 + * @description 上传图片文件到七牛云存储 + * @param file 要上传的文件 + * @returns {Promise} 上传成功后的图片URL + */ + const uploadImageToQiniu = useCallback(async (file: File) => { + try { + const { token } = await getUploadToken(); + const url = await uploadToQiniu(file, token); + const roleEntity = await roleEditUseCase?.getRoleByImage(url); + } catch (error) { + console.error('上传图片到七牛云失败:', error); + throw error; + } + }, [roleEditUseCase]); + return { // 响应式数据 roleList, @@ -308,5 +328,6 @@ export const useRoleServiceHook = (): UseRoleService => { regenerateRole, fetchUserRoleLibrary, replaceRoleWithLibrary, + uploadImageToQiniu }; }; diff --git a/app/service/domain/Entities.ts b/app/service/domain/Entities.ts index ee17ac7..ea6fbd7 100644 --- a/app/service/domain/Entities.ts +++ b/app/service/domain/Entities.ts @@ -37,7 +37,7 @@ export interface RoleEntity extends BaseEntity { /** 角色提示词 */ generateText: string; /**角色标签 */ - tagIds: TagValueObject[]; + tags: TagValueObject[]; /** 角色图片URL */ imageUrl: string; } diff --git a/app/service/usecase/RoleEditUseCase.ts b/app/service/usecase/RoleEditUseCase.ts index 3a74d03..4822393 100644 --- a/app/service/usecase/RoleEditUseCase.ts +++ b/app/service/usecase/RoleEditUseCase.ts @@ -1,3 +1,4 @@ +import { VideoFlowProjectResponse } from '@/api/allMovieType'; import { RoleEntity } from '../domain/Entities'; import { applyRoleToShots, @@ -7,7 +8,8 @@ import { regenerateRole, getRoleShots, replaceRole, - optimizeRoleDescription + optimizeRoleDescription, + detailScriptEpisodeNew } from '@/api/video_flow'; /** @@ -30,11 +32,13 @@ export class RoleEditUseCase { */ async getRoleList(projectId: string): Promise { try { - const response = await getRoleList({ projectId }); - if (response.successful) { - return response.data; + // const response = await getRoleList({ projectId }); + const detail = await detailScriptEpisodeNew({ project_id: projectId }); + const roleList = this.parseRoleList(detail.data); + if (detail.successful) { + return roleList; } else { - throw new Error(response.message || '获取角色列表失败'); + throw new Error(detail.message || '获取角色列表失败'); } } catch (error) { console.error('获取角色列表失败:', error); @@ -42,6 +46,25 @@ export class RoleEditUseCase { } } + parseRoleList(detail: VideoFlowProjectResponse): RoleEntity[] { + const characters = detail.data?.character || []; + + return characters.map((char, index) => { + const roleEntity: RoleEntity = { + id: `role_${index + 1}`, + name: char.name || '', + generateText: char.description || '', + tags: [], // 默认为空标签数组 + imageUrl: '', // 默认为空图片URL + loadingProgress: 100, // 默认加载完成 + disableEdit: false, // 默认允许编辑 + updatedAt: Date.now() + }; + + return roleEntity; + }); + } + /** * 获取角色库的角色列表 * @returns Promise 角色库列表 @@ -224,4 +247,36 @@ export class RoleEditUseCase { // 例如:解析文本中的关键词、特征描述等作为标签 return []; } + + /** + * @description 根据图片地址获取角色实体数据 + * @param imageUrl 图片地址 + * @returns Promise 角色实体数据 + */ + async getRoleByImage(imageUrl: string): Promise { + try { + // TODO: 调用后端API,根据图片地址获取角色数据 + // 这里需要根据实际的后端API接口来实现 + // const response = await getRoleByImage({ imageUrl }); + + // 临时实现:返回一个模拟的角色实体 + // 实际使用时需要替换为真实的API调用 + const mockRole: RoleEntity = { + id: `role_${Date.now()}`, + name: '从图片识别的角色', + generateText: '通过图片识别生成的角色描述', + tagIds: [], // 空标签数组 + imageUrl: imageUrl, // 使用传入的图片地址 + loadingProgress: 100, // 加载完成 + disableEdit: false, // 允许编辑 + updatedAt: Date.now() + }; + + return mockRole; + } catch (error) { + console.error('根据图片获取角色失败:', error); + throw new Error('根据图片获取角色失败'); + } + } + }