forked from 77media/video-flow
新增获取相似角色列表和保存重新生成角色到角色库的接口,同时更新角色库列表获取逻辑以支持用户ID和描述。优化角色编辑用例,确保角色保存功能的完整性和可用性。
This commit is contained in:
parent
55a61424e8
commit
68000596d8
@ -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);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user