新增获取相似角色列表和保存重新生成角色到角色库的接口,同时更新角色库列表获取逻辑以支持用户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>>
*/
export const getAllCharacterList = async (): Promise<ApiResponse<NewCharacterListResponse>> => {
return post<ApiResponse<NewCharacterListResponse>>("/character/list_all");
export const getAllCharacterList = async (request:{
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);
};
/**
*
* @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>;
/** 上传图片到七牛云 */
uploadImageToQiniu: (file: File) => Promise<void>;
/** 保存重新生成的角色到角色库 */
saveRoleToLibrary: () => Promise<void>;
}
/**
@ -249,13 +251,23 @@ export const useRoleServiceHook = (): UseRoleService => {
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);
} catch (error) {
console.error('获取用户角色库失败:', error);
throw error;
}
}, [roleEditUseCase]);
}, [roleEditUseCase, selectedRole]);
/**
*
@ -299,7 +311,7 @@ export const useRoleServiceHook = (): UseRoleService => {
console.error('替换角色失败:', error);
throw error;
}
}, [selectedRole, roleEditUseCase, userRoleLibrary]);
}, [selectedRole, roleEditUseCase, userRoleLibrary, selectRole]);
/**
*
@ -318,6 +330,48 @@ export const useRoleServiceHook = (): UseRoleService => {
}
}, [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 {
// 响应式数据
roleList,
@ -334,6 +388,7 @@ export const useRoleServiceHook = (): UseRoleService => {
regenerateRole,
fetchUserRoleLibrary,
replaceRoleWithLibrary,
uploadImageToQiniu
uploadImageToQiniu,
saveRoleToLibrary
};
};

View File

@ -7,11 +7,12 @@ import {
regenerateRole,
getRoleShots,
replaceRole,
getAllCharacterList,
getCharacterListByProjectWithHighlight,
updateAndRegenerateCharacter,
getUserRoleLibrary,
generateCharacterDescription,
saveRegeneratedCharacter,
getSimilarCharacters,
} from '@/api/video_flow';
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[]>
*/
async getRoleLibraryList(): Promise<RoleEntity[]> {
async getRoleLibraryList(userId: string, userDescription: string): Promise<RoleEntity[]> {
try {
// 使用新的角色列表接口获取角色库
const response = await getAllCharacterList();
// 使用新的相似角色接口获取角色库
const response = await getSimilarCharacters({
userId,
user_description: userDescription,
similar_limit: 15 // 固定为15
});
if (response.successful) {
const roleList = this.parseNewRoleList(response.data);
const roleList = this.parseSimilarCharacterList(response.data);
return roleList;
} else {
throw new Error(response.message || '获取角色库失败');
@ -316,7 +353,7 @@ export class RoleEditUseCase {
return [];
}
/**
/**
* @description
* @param imageUrl
* @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;
}
}
}