新增获取相似角色列表和保存重新生成角色到角色库的接口,同时更新角色库列表获取逻辑以支持用户ID和描述。优化角色编辑用例,确保角色保存功能的完整性和可用性。

This commit is contained in:
海龙 2025-08-12 18:44:55 +08:00
parent 55a61424e8
commit 68000596d8
3 changed files with 208 additions and 12 deletions

View File

@ -867,8 +867,42 @@ export const faceRecognition = async (request: {
* *
* @returns Promise<ApiResponse<NewCharacterListResponse>> * @returns Promise<ApiResponse<NewCharacterListResponse>>
*/ */
export const getAllCharacterList = async (): Promise<ApiResponse<NewCharacterListResponse>> => { export const getAllCharacterList = async (request:{
return post<ApiResponse<NewCharacterListResponse>>("/character/list_all"); user_id:string;
}): Promise<ApiResponse<NewCharacterListResponse>> => {
return post<ApiResponse<NewCharacterListResponse>>("/character/list_all", request);
};
/**
*
* @param request -
* @returns Promise<ApiResponse<相似角色列表>>
*/
export const getSimilarCharacters = async (request: {
/** 用户ID */
userId: string;
/** 用户描述(角色描述) */
user_description: string;
/** 相似度限制 */
similar_limit: number;
}): Promise<ApiResponse<{
/** 相似角色列表 */
characters: Array<{
/** 角色ID */
id: string;
/** 角色名称 */
name: string;
/** 角色描述 */
description: string;
/** 角色图片 */
image_url: string;
/** 相似度分数 */
similarity_score: number;
}>;
/** 总数量 */
total_count: number;
}>> => {
return post("/character/get_similar_characters", request);
}; };
/** /**
@ -976,4 +1010,31 @@ export const getCharacterShots = async (request: {
return post("/character/get_character_scenes", request); return post("/character/get_character_scenes", request);
}; };
/**
*
* @param request -
* @returns Promise<ApiResponse<保存结果>>
*/
export const saveRegeneratedCharacter = async (request: {
/** 用户ID */
user_id: string;
/** 项目ID用于从项目脚本中提取角色信息 */
project_id: string;
/** 修改前的用户名称,用于在脚本中查找对应角色 */
original_character_name: string;
/** 角色描述文本 */
character_description: string;
/** 角色图片URL */
character_image: string;
/** 多个视频地址(支持任意数量) */
video_urls: string[];
}): Promise<ApiResponse<{
/** 保存成功的角色ID */
character_id: string;
/** 保存结果消息 */
message: string;
}>> => {
return post("/character/save_regenerated_character", request);
};

View File

@ -35,6 +35,8 @@ interface UseRoleService {
replaceRoleWithLibrary: (replaceRoleId: string) => Promise<void>; replaceRoleWithLibrary: (replaceRoleId: string) => Promise<void>;
/** 上传图片到七牛云 */ /** 上传图片到七牛云 */
uploadImageToQiniu: (file: File) => Promise<void>; uploadImageToQiniu: (file: File) => Promise<void>;
/** 保存重新生成的角色到角色库 */
saveRoleToLibrary: () => Promise<void>;
} }
/** /**
@ -249,13 +251,23 @@ export const useRoleServiceHook = (): UseRoleService => {
setRoleEditUseCase(useCase); setRoleEditUseCase(useCase);
} }
const roleLibraryList = await useCase!.getRoleLibraryList(); // 从localStorage获取当前用户信息
const User = JSON.parse(localStorage.getItem("currentUser") || "{}");
if (!User.id) {
throw new Error('无法获取用户ID请重新登录');
}
// 获取当前选中角色的描述
const userDescription = selectedRole?.generateText || '';
const roleLibraryList = await useCase!.getRoleLibraryList(User.id, userDescription);
setUserRoleLibrary(roleLibraryList); setUserRoleLibrary(roleLibraryList);
} catch (error) { } catch (error) {
console.error('获取用户角色库失败:', error); console.error('获取用户角色库失败:', error);
throw error; throw error;
} }
}, [roleEditUseCase]); }, [roleEditUseCase, selectedRole]);
/** /**
* *
@ -299,7 +311,7 @@ export const useRoleServiceHook = (): UseRoleService => {
console.error('替换角色失败:', error); console.error('替换角色失败:', error);
throw error; throw error;
} }
}, [selectedRole, roleEditUseCase, userRoleLibrary]); }, [selectedRole, roleEditUseCase, userRoleLibrary, selectRole]);
/** /**
* *
@ -318,6 +330,48 @@ export const useRoleServiceHook = (): UseRoleService => {
} }
}, [roleEditUseCase]); }, [roleEditUseCase]);
/**
*
* @description
* @throws {Error} UseCase未初始化或缺少项目ID时抛出错误
* @returns {Promise<void>} Promise
*/
const saveRoleToLibrary = useCallback(async () => {
if (!selectedRole) {
throw new Error('请先选择要保存的角色');
}
if (!roleEditUseCase) {
throw new Error('角色编辑UseCase未初始化');
}
if (!projectId) {
throw new Error('缺少项目ID无法保存角色到角色库');
}
try {
// 从localStorage获取当前用户信息
const User = JSON.parse(localStorage.getItem("currentUser") || "{}");
if (!User.id) {
throw new Error('无法获取用户ID请重新登录');
}
// 调用保存重新生成角色到角色库的方法
const result = await roleEditUseCase.saveRegeneratedCharacterToLibrary(
selectedRole,
projectId,
User.id
);
console.log('角色保存到角色库成功:', result);
} catch (error) {
console.error('保存角色到角色库失败:', error);
throw error;
}
}, [selectedRole, roleEditUseCase, projectId]);
return { return {
// 响应式数据 // 响应式数据
roleList, roleList,
@ -334,6 +388,7 @@ export const useRoleServiceHook = (): UseRoleService => {
regenerateRole, regenerateRole,
fetchUserRoleLibrary, fetchUserRoleLibrary,
replaceRoleWithLibrary, replaceRoleWithLibrary,
uploadImageToQiniu uploadImageToQiniu,
saveRoleToLibrary
}; };
}; };

View File

@ -7,11 +7,12 @@ import {
regenerateRole, regenerateRole,
getRoleShots, getRoleShots,
replaceRole, replaceRole,
getAllCharacterList,
getCharacterListByProjectWithHighlight, getCharacterListByProjectWithHighlight,
updateAndRegenerateCharacter, updateAndRegenerateCharacter,
getUserRoleLibrary, getUserRoleLibrary,
generateCharacterDescription, generateCharacterDescription,
saveRegeneratedCharacter,
getSimilarCharacters,
} from '@/api/video_flow'; } from '@/api/video_flow';
export interface RoleResponse { export interface RoleResponse {
@ -134,16 +135,52 @@ export class RoleEditUseCase {
}); });
} }
/**
*
* @description RoleEntity数组
* @param {any} similarCharacterData -
* @returns {RoleEntity[]}
* @throws {Error}
*/
parseSimilarCharacterList(similarCharacterData: any): RoleEntity[] {
if (!similarCharacterData || !Array.isArray(similarCharacterData.characters)) {
throw new Error('相似角色数据格式错误');
}
return similarCharacterData.characters.map((char: any, index: number) => {
/** 角色实体对象 */
const roleEntity: RoleEntity = {
id: char.id || `role_${Date.now()}_${index}`,
name: char.name || '',
generateText: char.description || '',
tags: [], // 相似角色接口可能不返回标签,暂时为空
imageUrl: char.image_url || '',
loadingProgress: 100,
disableEdit: false,
updatedAt: Date.now()
};
return roleEntity;
});
}
/** /**
* *
* @param userId ID
* @param userDescription
* @returns Promise<RoleEntity[]> * @returns Promise<RoleEntity[]>
*/ */
async getRoleLibraryList(): Promise<RoleEntity[]> { async getRoleLibraryList(userId: string, userDescription: string): Promise<RoleEntity[]> {
try { try {
// 使用新的角色列表接口获取角色库 // 使用新的相似角色接口获取角色库
const response = await getAllCharacterList(); const response = await getSimilarCharacters({
userId,
user_description: userDescription,
similar_limit: 15 // 固定为15
});
if (response.successful) { if (response.successful) {
const roleList = this.parseNewRoleList(response.data); const roleList = this.parseSimilarCharacterList(response.data);
return roleList; return roleList;
} else { } else {
throw new Error(response.message || '获取角色库失败'); throw new Error(response.message || '获取角色库失败');
@ -316,7 +353,7 @@ export class RoleEditUseCase {
return []; return [];
} }
/** /**
* @description * @description
* @param imageUrl * @param imageUrl
* @returns Promise<RoleEntity> * @returns Promise<RoleEntity>
@ -347,4 +384,47 @@ export class RoleEditUseCase {
} }
} }
/**
* @description
* @param roleData
* @param projectId ID
* @param userId ID
* @param originalCharacterName
* @param videoUrls URL列表
* @returns Promise<{character_id: string, message: string}>
*/
async saveRegeneratedCharacterToLibrary(
roleData: RoleEntity,
projectId: string,
userId: string,
): Promise<{character_id: string, message: string}> {
try {
// 调用保存重新生成角色的API
const response = await saveRegeneratedCharacter({
user_id: userId,
project_id: projectId,
original_character_name: roleData.name,
character_description: roleData.generateText,
character_image: roleData.imageUrl,
video_urls: []
});
if (response.successful) {
console.log('角色保存到角色库成功:', response.data);
return {
character_id: response.data.character_id,
message: response.data.message
};
} else {
throw new Error(response.message || '保存角色到角色库失败');
}
} catch (error) {
console.error('保存角色到角色库失败:', error);
throw error;
}
}
} }