fix: 修复素材绑定页面显示暂无素材的问题
- 添加get_all_materials后端命令获取所有项目的素材 - 在MaterialRepository中实现get_all方法 - 在MaterialService中添加get_all_materials方法 - 修改MaterialModelBindingService的getMaterialsByFilter方法,在没有指定项目时获取所有素材而不是返回空数组 - 确保素材绑定页面能正确显示所有素材数据,与统计信息保持一致 - 支持在全局素材列表上应用绑定状态和搜索过滤
This commit is contained in:
parent
de446b6410
commit
7c40da1b83
|
|
@ -192,6 +192,20 @@ impl MaterialService {
|
|||
Ok(materials)
|
||||
}
|
||||
|
||||
/// 获取所有素材
|
||||
pub fn get_all_materials(
|
||||
repository: &MaterialRepository,
|
||||
) -> Result<Vec<Material>> {
|
||||
let mut materials = repository.get_all()?;
|
||||
|
||||
// 为每个素材加载片段信息
|
||||
for material in &mut materials {
|
||||
material.segments = repository.get_segments(&material.id)?;
|
||||
}
|
||||
|
||||
Ok(materials)
|
||||
}
|
||||
|
||||
/// 获取素材详情
|
||||
pub fn get_material_by_id(
|
||||
repository: &MaterialRepository,
|
||||
|
|
|
|||
|
|
@ -108,6 +108,29 @@ impl MaterialRepository {
|
|||
Ok(materials)
|
||||
}
|
||||
|
||||
/// 获取所有素材
|
||||
pub fn get_all(&self) -> Result<Vec<Material>> {
|
||||
let conn = self.connection.lock().unwrap();
|
||||
|
||||
let mut stmt = conn.prepare(
|
||||
"SELECT id, project_id, model_id, name, original_path, file_size, md5_hash,
|
||||
material_type, processing_status, metadata, scene_detection,
|
||||
created_at, updated_at, processed_at, error_message
|
||||
FROM materials ORDER BY created_at DESC"
|
||||
)?;
|
||||
|
||||
let material_iter = stmt.query_map([], |row| {
|
||||
self.row_to_material(row)
|
||||
})?;
|
||||
|
||||
let mut materials = Vec::new();
|
||||
for material in material_iter {
|
||||
materials.push(material?);
|
||||
}
|
||||
|
||||
Ok(materials)
|
||||
}
|
||||
|
||||
/// 根据MD5哈希检查素材是否存在
|
||||
pub fn exists_by_md5(&self, project_id: &str, md5_hash: &str) -> Result<bool> {
|
||||
let conn = self.connection.lock().unwrap();
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ pub fn run() {
|
|||
commands::material_commands::select_material_folders,
|
||||
commands::material_commands::scan_folder_materials,
|
||||
commands::material_commands::get_project_materials,
|
||||
commands::material_commands::get_all_materials,
|
||||
commands::material_commands::get_material_by_id,
|
||||
commands::material_commands::delete_material,
|
||||
commands::material_commands::get_project_material_stats,
|
||||
|
|
|
|||
|
|
@ -522,6 +522,21 @@ pub async fn get_project_materials(
|
|||
.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
/// 获取所有素材列表命令
|
||||
#[command]
|
||||
pub async fn get_all_materials(
|
||||
state: State<'_, AppState>,
|
||||
) -> Result<Vec<Material>, String> {
|
||||
let repository_guard = state.get_material_repository()
|
||||
.map_err(|e| format!("获取素材仓库失败: {}", e))?;
|
||||
|
||||
let repository = repository_guard.as_ref()
|
||||
.ok_or("素材仓库未初始化")?;
|
||||
|
||||
MaterialService::get_all_materials(repository)
|
||||
.map_err(|e| e.to_string())
|
||||
}
|
||||
|
||||
/// 获取素材详情命令
|
||||
#[command]
|
||||
pub async fn get_material_by_id(
|
||||
|
|
|
|||
|
|
@ -154,6 +154,13 @@ export class MaterialModelBindingService {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取所有素材
|
||||
*/
|
||||
static async getAllMaterials(): Promise<Material[]> {
|
||||
return await invoke<Material[]>('get_all_materials');
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据过滤条件获取素材
|
||||
*/
|
||||
|
|
@ -178,8 +185,15 @@ export class MaterialModelBindingService {
|
|||
materials = materials.filter(m => m.model_id);
|
||||
}
|
||||
} else {
|
||||
// 如果没有指定项目,返回空数组
|
||||
return [];
|
||||
// 如果没有指定项目,获取所有素材
|
||||
materials = await this.getAllMaterials();
|
||||
|
||||
// 如果指定了绑定状态过滤
|
||||
if (filter.bound === true) {
|
||||
materials = materials.filter(m => m.model_id);
|
||||
} else if (filter.bound === false) {
|
||||
materials = materials.filter(m => !m.model_id);
|
||||
}
|
||||
}
|
||||
|
||||
// 应用搜索过滤
|
||||
|
|
|
|||
Loading…
Reference in New Issue