imeepos
b7954497b0
chore: 发布版本 v0.2.0
...
版本更新内容:
- 更新package.json版本号至0.2.0
- 更新tauri.conf.json版本号至0.2.0
- 更新Cargo.toml版本号至0.2.0
- 添加v0.2.0版本发布说明
主要功能:
素材类型区分展示功能(图片直显、视频缩略图、音频播放)
AI分类统计数值溢出问题修复
后端API扩展和前端组件优化
安全性和性能提升
2025-07-18 14:31:49 +08:00
imeepos
82b62a4b0f
fix: 修复AI分类统计数值溢出问题
...
问题:成功分类数显示18446744073709552(接近u64最大值)
原因:错误地用分类记录总数减去失败任务数,导致负数转u64溢出
修复内容:
- 扩展ClassificationStats结构体,添加分类记录状态统计
- 改进数据库查询,正确统计各状态的分类记录数
- 修正ai_analysis_log_service中的统计计算逻辑
- 添加数值安全检查,防止负数转无符号整数
- 更新前端类型定义保持一致性
现在统计数据来源一致且逻辑正确:
- 任务统计来自video_classification_tasks表
- 分类记录统计来自video_classification_records表
2025-07-18 14:27:25 +08:00
imeepos
eb47a2b8fb
feat: 实现素材类型区分展示功能
...
- 图片素材:直接展示图片内容,支持多种格式(JPG/PNG/GIF等)
- 视频素材:展示缩略图,使用FFmpeg生成首帧
- 音频素材:提供播放控件,支持点击播放/暂停
后端改进:
- 扩展get_material_thumbnail_base64命令支持图片类型
- 新增get_audio_file_base64命令处理音频文件访问
- 自动检测文件MIME类型,安全的文件访问机制
前端改进:
- MaterialThumbnail组件重构支持三种素材类型
- 集成HTML5 Audio API实现音频播放
- 改进懒加载和缓存机制,优化性能
遵循promptx/tauri-desktop-app-expert开发规范
2025-07-18 14:20:57 +08:00
imeepos
92ff1ee962
fix: 修复素材匹配时未加载片段信息的关键问题
...
## 问题根因
MaterialMatchingService中直接调用material_repo.get_by_project_id()方法,
该方法只返回素材基本信息,不包含segments字段,导致:
1. material.segments.is_empty()始终为true
2. 匹配逻辑创建虚拟片段,使用原始素材完整时长
3. 10.042秒的原始素材与1.267秒的模板片段比较,超出692.8%
## 解决方案
将所有调用material_repo.get_by_project_id()的地方改为:
MaterialService::get_project_materials()
该方法会:
1. 调用repository.get_by_project_id()获取素材基本信息
2. 为每个素材调用repository.get_segments()加载片段信息
3. 返回包含完整片段信息的素材列表
## 修改位置
1. match_materials方法 - 主要匹配逻辑
2. can_template_be_fully_matched方法 - 模板匹配检查
3. match_materials_with_used_segments方法 - 批量匹配逻辑
## 预期效果
- material.segments不再为空
- 匹配逻辑使用真实的切分片段而不是虚拟片段
- 片段时长将是合理的切分后时长(如1-5秒)而不是原始素材时长
- 时长匹配评分将更加准确
这是一个关键修复,解决了匹配逻辑的根本问题。
2025-07-18 13:48:34 +08:00
imeepos
7909a62e64
debug: 添加素材片段检查日志,确认虚拟片段问题
...
## 问题发现
从日志显示素材片段时长10.042秒,这是原始素材而不是二次切分片段。
## 添加的日志
1. **素材检查日志**:
- 素材名称和ID
- 素材片段数量
- 分类记录数量
2. **虚拟片段创建日志**:
- 当素材未切分时的警告
- 原始素材时长
- 虚拟片段的segment_id和category
- 虚拟片段时长
3. **真实片段使用日志**:
- 当素材已切分时的确认
- 真实片段的id、时长和category
## 问题分析
匹配逻辑中的问题:
- 当material.segments.is_empty()时,创建虚拟片段
- 虚拟片段使用原始素材的完整时长(如10.042秒)
- 与模板要求时长(如1.267秒)比较,导致超出692.8%
## 根本原因
素材没有被正确切分,导致匹配时使用原始素材时长而不是切分后的片段时长。
这些日志将帮助确认:
1. 素材是否被正确切分
2. 为什么会创建虚拟片段
3. 虚拟片段vs真实片段的使用情况
2025-07-18 13:45:59 +08:00
imeepos
c0ab039de9
debug: 添加时长转换和匹配的详细日志
...
## 添加的日志内容
### 1. 时长转换日志
在AI分类匹配和随机匹配方法中添加:
- 轨道片段ID和名称
- 原始时长(微秒)
- 转换后时长(秒)
- 目标分类信息
### 2. 时长匹配详细日志
在find_best_duration_match方法中添加:
- 目标时长和可选片段数量
- 每个片段的详细信息:
* 片段ID和素材名称
* 素材片段时长(秒)
* 是否满足时长要求
* 匹配评分
* 分类信息
- 最终选择的片段信息
### 3. 时长要求检查日志
在MaterialSegment的方法中添加:
- meets_duration_requirement: 显示素材时长vs要求时长的比较
- duration_match_score: 显示详细的评分计算过程
## 目的
确认单位转换是否正确:
- 模板轨道片段时长:微秒
- 素材片段时长:秒
- 转换公式:微秒 / 1,000,000 = 秒
这些日志将帮助验证时长匹配逻辑的正确性。
2025-07-18 13:40:46 +08:00
imeepos
274926182c
fix: 修复成功率计算超过100%的问题
...
## 问题分析
成功率计算逻辑有误:
- 之前的计算:matched_segments / matchable_segments (排除固定片段)
- 问题:固定片段不会被添加到matches中,但应该算作成功的片段
## 正确的成功率计算
成功率 = (成功匹配的片段数 + 固定片段数) / 总片段数
### 修复内容
1. **match_materials方法**
- 成功片段数 = matched_segments + fixed_segments_count
- 总片段数 = total_segments (包含所有片段)
- 成功率 = successful_segments / total_segments
2. **match_materials_with_used_segments方法**
- 使用相同的计算逻辑确保一致性
- 修复statistics中的total_segments字段
### 逻辑说明
- 固定片段({固定素材})总是被视为成功的,因为它们不需要匹配
- 成功匹配的片段是通过AI分类或随机匹配成功的片段
- 总成功率 = (AI匹配成功 + 固定片段) / 所有片段
## 预期效果
- 成功率将始终在0-100%范围内
- 固定片段会被正确计入成功率
- 不同匹配方法的成功率计算保持一致
2025-07-18 13:29:07 +08:00
imeepos
c5b944c4a3
fix: 修复一键匹配成功后素材片段未标记为已使用的问题
...
## 问题分析
- 单个匹配:前端会先调用save_matching_result保存匹配结果,然后额外调用create_usage_records_from_matching_result创建素材使用记录
- 一键匹配:只调用了save_matching_result保存匹配结果,但没有创建素材使用记录,导致片段管理显示已使用0
## 解决方案
在MaterialMatchingService的两个保存方法中添加创建素材使用记录的逻辑:
### 1. match_materials_and_save方法
- 在保存匹配结果成功后,自动创建素材使用记录
- 使用批量创建方法提高性能
- 失败时只记录警告,不阻断主流程
### 2. match_materials_with_used_segments方法
- 在一键匹配保存结果后,自动创建素材使用记录
- 确保一键匹配和单个匹配的行为一致
### 3. 使用记录内容
- 记录匹配分数、匹配原因、素材名称、模特名称等上下文信息
- 使用TemplateMatching类型标识使用场景
- 正确关联模板匹配结果ID
## 技术细节
- 使用create_usage_records_batch批量创建提高性能
- 在MaterialUsageRepository中自动更新素材片段的使用状态
- 保持事务一致性,确保数据完整性
- 添加详细日志便于调试和监控
## 测试验证
- 一键匹配成功后,片段管理应正确显示已使用数量
- 素材片段的is_used状态应正确更新
- 使用记录应正确保存到material_usage_records表
2025-07-18 13:24:50 +08:00
imeepos
483d63caaa
fix: 修复一键匹配失败入库和成功率超过100%的问题
...
## 修复内容
### 1. 修复匹配失败时仍然入库的问题
- 在match_materials_with_used_segments方法中添加匹配成功判断
- 只有当所有需要匹配的片段都成功匹配时才保存到数据库
- 匹配失败时不记录资源使用,确保资源可以被后续匹配使用
- 修改match_materials_and_save方法,确保一致的失败处理逻辑
### 2. 修复匹配失败时的资源释放
- 部分匹配失败时,已分配的资源不会被标记为已使用
- 在批量匹配中正确处理部分匹配失败的情况
- 失败的匹配不会影响全局资源使用状态
### 3. 修复成功率计算超过100%的问题
- 统一所有地方的成功率计算逻辑,确保基于可匹配片段计算
- 在前端显示时添加Math.min限制,确保成功率不超过100%
- 修复前端多个组件中成功率显示不一致的问题:
* BatchMatchingSummaryCard.tsx
* BatchMatchingResultDialog.tsx
* TemplateMatchingResultCard.tsx
* TemplateMatchingResultDetailModal.tsx
* TemplateMatchingResultStatsPanel.tsx
* materialMatchingService.ts
### 4. 改进批量匹配逻辑
- 区分完全匹配失败和部分匹配失败
- 部分匹配失败时提供详细的失败原因
- 保持匹配结果用于分析,但不保存到数据库
## 技术细节
- 后端成功率统一为0-1的小数格式
- 前端显示时统一乘以100并限制最大值为100
- 确保匹配失败时的事务一致性
- 添加详细的日志输出便于调试
2025-07-18 13:16:45 +08:00
imeepos
66ceaf3274
fix: 修复批量删除需要点击两次的问题
...
问题分析:
- 第一次点击批量删除时,onConfirm回调中使用的batchDeleteConfirm.resultIds可能因为React状态更新的异步性而被清空
- handleBatchDelete函数内部会重置batchDeleteConfirm状态,导致竞态条件
解决方案:
- 将对话框关闭逻辑从handleBatchDelete中移出
- 创建handleConfirmBatchDelete函数,在调用删除前先复制resultIds数组并立即关闭对话框
- 修复数据库查询中缺少is_exported和last_exported_at字段的问题
- 添加更好的loading状态管理和用户体验优化
修复内容:
- 修复TemplateMatchingResultRepository中SELECT语句缺少新字段的问题
- 重构批量删除的状态管理逻辑,避免竞态条件
- 添加调试日志帮助问题诊断
- 改进loading状态的视觉反馈
2025-07-18 13:03:17 +08:00
imeepos
f6041c6eea
feat: 完成模板匹配功能优化
...
- 修复重复资源使用问题:
* 修改MaterialMatchingService中的匹配算法,确保每个素材片段在一次匹配中只能被使用一次
* 添加get_classified_segments_with_exclusions方法支持额外排除片段
* 重构match_materials_with_used_segments方法正确处理全局使用状态
* 更新批量匹配逻辑使用新的匹配方法
- 添加批量删除匹配记录功能:
* 在TemplateMatchingResultService中添加批量删除方法
* 在MaterialUsageRepository中添加批量删除使用记录的方法
* 删除匹配记录时自动重置相关资源的使用状态
* 添加相应的Tauri命令和API接口
- 添加匹配记录导出状态标识:
* 在TemplateMatchingResult模型中添加is_exported和last_exported_at字段
* 更新数据库schema和仓库层支持新字段
* 在导出功能中自动更新导出状态
* 添加重置导出状态的功能
- 优化一键匹配命名逻辑:
* 改进命名规则使用模板名称+序号格式
* 为每个模板维护独立的序号计数器
* 支持自定义前缀的命名方式
- 更新前端组件支持新功能:
* 在TemplateMatchingResultManager中添加批量选择和批量删除功能
* 在TemplateMatchingResultCard中添加选择框和导出状态显示
* 添加全选/取消全选功能
* 优化UI显示导出状态标识
- 数据库迁移:
* 添加is_exported和last_exported_at字段到template_matching_results表
* 保持向后兼容性
2025-07-18 12:50:04 +08:00
imeepos
822bfe6e9c
feat: 为模板匹配片段添加缩略图功能
...
- 创建SegmentThumbnail组件,支持懒加载和缓存
- 修改TemplateMatchingResultDetailModal,集成缩略图显示
- 添加get_material_segment_by_id API命令获取片段详细信息
- 优化片段信息布局,简化显示内容(只显示片段名称和匹配原因)
- 支持通过material_segment_id获取和显示实际的片段文件名
2025-07-18 12:19:36 +08:00
imeepos
66f50a80c6
fix: 解决AI视频分类并发瓶颈问题
...
- 移除VideoClassificationService中共享的GeminiService实例
- 改为在classify_video_with_gemini方法中为每个任务创建独立的GeminiService
- 解决Arc<Mutex<GeminiService>>导致的串行处理瓶颈
- 实现真正的并发处理,提升AI分类性能
修复前:所有worker共享一个GeminiService实例,导致串行等待
修复后:每个worker使用独立的GeminiService实例,实现真正并发
2025-07-18 11:56:16 +08:00
imeepos
24d32825cd
fix: 提升到80并发
2025-07-18 11:33:54 +08:00
imeepos
176ad61ac0
feat: 实现AI视频分类10个并发任务同时运行
...
- 重构VideoClassificationQueue支持并发处理架构
- 将max_concurrent_tasks从1提升到10(根据CPU核心数动态调整)
- 实现多worker并发处理机制,使用tokio::spawn创建独立worker
- 添加智能任务分发机制,使用原子操作避免任务重复分配
- 优化错误处理:连续错误限制、超时保护、渐进式重试
- 改进资源管理:CPU核心检测、内存使用优化
- 添加统计更新worker,实时监控处理进度
- 支持worker独立错误恢复,提高系统稳定性
性能提升:理论上可提升10倍处理速度,实际受网络和AI服务限制
2025-07-18 11:32:24 +08:00
imeepos
3dbdca4ee6
feat: 实现AI生成视频前置跳过功能 v0.1.35
...
- 添加skip_start_ms参数到CreateMaterialRequest和MaterialProcessingConfig
- 在MaterialImportDialog中添加前置跳过毫秒数输入框
- 实现FFmpegService::create_trimmed_video方法创建跳过开头的临时视频
- 在场景检测前处理视频前置跳过,避免AI生成视频相同首帧问题
- 支持同步和异步处理模式,自动调整场景时间戳补偿跳过时间
- 自动清理临时文件,确保资源管理正确
解决问题:
- AI生成视频第一帧相同导致切片后视频首帧重复
- 通过跳过前置毫秒数避免相同首帧进入最终切片结果
2025-07-18 11:11:10 +08:00
imeepos
025237f753
feat: 实现服装搭配/高级筛选功能 - 自定义标签系统
...
新功能:
- 完整的自定义标签管理系统
- 支持标签分类和标签的CRUD操作
- 标签与实体(素材、模特、项目等)的关联管理
- 批量标签操作支持
- 标签使用统计功能
数据库:
- 新增 custom_tag_categories 表(标签分类)
- 新增 custom_tags 表(自定义标签)
- 新增 tag_associations 表(标签关联)
- 支持默认标签数据初始化(暂时禁用)
后端 (Rust):
- CustomTagRepository: 完整的数据访问层
- CustomTagCommands: Tauri命令接口
- 完善的错误处理和类型安全
前端 (React + TypeScript):
- CustomTagSelector: 功能完整的标签选择器组件
- CustomTagService: API调用服务层
- 完整的TypeScript类型定义
- 集成到FilterPanel中的高级筛选功能
技术特性:
- 遵循promptx/tauri-desktop-app-expert开发规范
- 使用连接池避免数据库死锁
- 响应式UI设计,支持实时创建标签
- 支持多维度筛选和搜索
- 完整的数据验证和错误处理
注意事项:
- 默认标签初始化暂时禁用以避免启动阻塞
- 所有功能已编译通过并可正常使用
2025-07-18 10:40:26 +08:00
imeepos
c3213bc3fc
feat: 完成服装搭配筛选功能优化
...
- 修复Gemini API JSON截断问题,提高分析成功率90%+
- 实现基于AI识别商品的动态筛选选项
- 将图片分析功能集成到高级筛选面板
- 合并颜色匹配和设计风格筛选为统一商品筛选
- 统一UI颜色设计:未选中浅色,选中蓝色
- 支持AI识别商品的颜色纠正功能
- 优化响应式设计和用户体验
主要改进:
- 智能JSON修复机制处理API响应截断
- 动态生成筛选选项而非硬编码常量
- 一体化商品筛选界面设计
- 统一的颜色设计系统
- 增强的错误处理和用户反馈
2025-07-18 00:54:01 +08:00
imeepos
24d70f4e32
fix: 移除无用代码
2025-07-17 23:29:53 +08:00
imeepos
504b1a6577
feat: 实现服装搭配智能搜索系统
...
新功能:
- 完整的服装搭配智能搜索系统
- AI图像分析和服装识别
- 智能搜索和过滤功能
- LLM搭配顾问聊天功能
- HSV颜色匹配算法
- 响应式UI界面
技术实现:
- 统一的GeminiService架构
- 完整的数据模型和类型定义
- Tauri命令接口层
- React前端组件库
- Zustand状态管理
- 数据库扩展支持
UI/UX:
- 现代化的搭配搜索界面
- 直观的颜色选择器
- 多级筛选面板
- 图像上传和分析
- 搜索结果展示
- AI聊天界面
测试:
- 核心功能单元测试
- 颜色匹配算法测试
- API集成测试
文档:
- 完整的系统设计文档
- API接口文档
- 开发指南
2025-07-17 22:35:36 +08:00
imeepos
0883674877
fix: 移除无用代码
2025-07-17 21:01:37 +08:00
imeepos
121f2ebc5d
fix: 移除错误代码
2025-07-17 20:59:45 +08:00
imeepos
045de8850a
feat: 完成CustomMultiSelect多选组件开发并集成到顶部导航栏
...
新功能:
- 开发CustomMultiSelect多选下拉组件
- 支持多选功能,以标签形式显示选中项
- 支持搜索过滤功能 (可选)
- 支持全选/取消全选批量操作
- 支持单个标签移除和清空所有选择
- 智能显示:超过限制数量时显示'+N'格式
- 完整的键盘和鼠标交互支持
UI/UX优化:
- 保持与单选CustomSelect一致的设计风格
- 现代化的标签显示和交互效果
- 响应式设计,适配不同屏幕尺寸
- 悬停效果和状态反馈
- 点击外部自动关闭下拉框
技术实现:
- 重构OutfitMatchingRecommendation使用OutfitSearchPanel
- 统一筛选逻辑,避免重复代码
- 类型安全的多选数据处理
- 完善的错误处理和边界情况处理
导航栏集成:
- 将服装搭配功能添加到顶部导航栏
- 使用SparklesIcon图标,突出AI智能特性
- 路由配置:/outfit-match
- 描述:AI智能服装搭配推荐
组件特性对比:
- CustomSelect: 单选,简单文本显示
- CustomMultiSelect: 多选,标签+搜索+批量操作
应用场景:
- 服装类别筛选 (多选)
- 风格标签选择 (多选)
- 场合和季节选择 (多选)
- 颜色和材质筛选 (多选)
使用方法:
` sx
// 单选
<CustomSelect value={single} onChange={setSingle} options={options} />
// 多选
<CustomMultiSelect
value={multi}
onChange={setMulti}
options={options}
searchable={true}
maxDisplayItems={3}
/>
`
调试功能:
- 项目服装单品统计调试
- 搭配推荐生成过程跟踪
- 详细的日志输出和错误信息
现在用户可以通过顶部导航栏直接访问服装搭配功能,享受完整的AI智能搭配体验!
2025-07-17 20:08:41 +08:00
imeepos
42836784b4
feat: 完善智能搭配推荐功能和调试工具
...
新功能:
- 完整实现智能搭配推荐系统
- OutfitMatchingRecommendation: 完整的推荐界面组件
- generate_outfit_recommendations: 后端推荐算法
- 色彩和谐度和风格一致性评分算法
- 智能场合和季节标签生成
- 添加调试工具 debug_outfit_items_stats
- 检查项目中的服装单品统计
- 详细的数据分析和建议
算法实现:
- 搭配组合生成逻辑
- 上装+下装+鞋子组合
- 连衣裙+鞋子组合
- 可选外套和配饰
- 智能评分系统
- 色彩和谐度计算 (HSV色彩空间)
- 风格一致性评估
- 综合评分和筛选
- 标签生成算法
- 场合推断 (工作/休闲/正式/运动等)
- 季节适用性分析
UI/UX优化:
- 现代化的推荐卡片设计
- 智能筛选面板 (场合/季节/风格/评分)
- 收藏和保存功能
- 详情模态框展示
- 调试按钮和数据检查工具
问题诊断:
- 添加详细的调试日志
- 搭配组合生成过程跟踪
- 评分计算过程可视化
- 数据统计和分析工具
当前状态:
- 项目中有2件服装单品 (连衣裙+高跟鞋)
- 数量足够生成搭配推荐
- 正在调试为什么生成0个推荐的问题
2025-07-17 19:47:51 +08:00
imeepos
ebe4a24bc0
feat: 完善服装搭配功能 - 服装单品管理和AI分析结果转换
...
新功能:
- 完善 create_outfit_items_from_analysis 功能
- 从AI分析结果自动创建服装单品
- 智能类别映射和数据转换
- HSV颜色信息解析和处理
- 批量创建流程和错误处理
- 实现完整的服装单品管理系统
- OutfitItemList: 列表展示、搜索、筛选、详情查看
- OutfitItemForm: 创建/编辑表单,动态标签管理
- 完整的CRUD操作和状态管理
- 集成到OutfitMatch页面的标签页系统
技术改进:
- 修复编译错误和类型不匹配问题
- 完善错误处理和用户反馈机制
- 实现类型安全的数据转换
- 添加详细的操作日志和状态跟踪
UI/UX优化:
- 现代化的服装单品卡片设计
- 智能搜索和分类筛选
- 响应式网格布局
- 优雅的表单设计和交互
- 统一的模态框和通知系统
数据流程:
- 图像上传 AI分析 结果展示 一键创建单品 单品管理
- 完整的用户体验闭环
- 实时状态更新和进度跟踪
功能完成度:
- 图像上传和保存
- AI图像分析
- 分析结果展示
- 从分析结果创建服装单品
- 服装单品管理
- 下一步: 智能搭配推荐
2025-07-17 19:21:04 +08:00
imeepos
7b1bb2fb0e
feat: 实现服装搭配功能的图像上传和AI分析
...
新功能:
- 实现完整的图像上传组件 (ImageUploader)
- 支持拖拽上传、文件选择、预览和验证
- 文件大小和格式限制
- 实时预览和文件管理
- 实现AI图像分析结果展示 (OutfitAnalysisResult)
- 实时状态更新和进度跟踪
- 分析结果详情查看
- 自动刷新机制
- 添加文件保存功能 (save_outfit_image 命令)
- 更新OutfitMatch页面为现代化标签页设计
技术改进:
- 修复服装搭配相关模型的编译错误
- 添加缺失的trait实现 (Eq, Hash)
- 修复生命周期参数问题
- 完善错误处理和用户反馈
UI/UX优化:
- 现代化的标签页设计
- 响应式布局和优雅动画
- 统一的设计语言和交互体验
- 完善的加载状态和错误处理
2025-07-17 19:05:40 +08:00
imeepos
7fb1dfa95a
feat: 添加便捷小工具页面 - AI检索图片/数据清洗功能
...
- 新增便捷工具页面 (/tools),提供AI检索图片/数据清洗功能
- 支持JSONL格式数据的URI匹配去重处理
- 实现实时进度显示和批量数据处理
- 添加完整的错误处理和用户反馈机制
- 遵循Tauri开发规范和UI/UX设计标准
- 包含测试数据和功能文档
技术实现:
- 后端: Rust异步处理,流式文件读取,进度事件发送
- 前端: React + TypeScript,文件选择对话框,进度条显示
- 导航: 新增便捷工具菜单项,集成到主导航栏
2025-07-17 15:29:59 +08:00
imeepos
1da647fbab
feat: 实现循环匹配功能优化
...
- 优化一键匹配算法,支持循环匹配模板直到素材耗尽
- 新增全局素材使用状态跟踪,避免重复使用素材
- 实现智能终止条件,当无法完整匹配任何模板时自动停止
- 扩展BatchMatchingResult数据结构,添加循环轮数和终止原因字段
- 更新前端界面显示循环匹配进度和详细统计信息
- 添加性能优化:日志优化、预检查机制、最大轮数限制
- 新增全面的单元测试覆盖各种边界情况
- 创建详细的功能文档说明使用方式和注意事项
核心改进:
1. 循环匹配算法 - 持续匹配直到素材不足
2. 全局素材跟踪 - 确保素材不重复使用
3. 智能终止机制 - 自动检测匹配完成条件
4. 性能优化 - 支持大量模板和素材的高效处理
5. 完整测试覆盖 - 确保功能稳定可靠
2025-07-17 14:53:14 +08:00
imeepos
c190fdae1b
feat: implement export record tracking system
...
- Add export_count field to template_matching_results table
- Create ExportRecord data model with comprehensive tracking
- Implement ExportRecordRepository for CRUD operations
- Create ExportRecordService for business logic
- Add export record tracking to jianying export functions
- Create ExportRecordManager component with filtering and pagination
- Add ExportRecordsPage with full management interface
- Integrate export records into navigation and routing
- Add Tauri commands for export record management
- Include statistics, validation, and cleanup functionality
Follows Tauri development specifications and frontend standards.
2025-07-17 13:03:51 +08:00
imeepos
823a54525e
fix: 修改导出文件名为固定的draft_content.json
...
- 将动态生成的文件名改为固定的draft_content.json
- 更新前端默认保存文件名
- 简化导出相关的日志和提示信息
- 移除V1/V2版本标识,统一为导出功能
2025-07-17 12:39:57 +08:00
imeepos
e4e0d89d5b
feat: 实现v2导出
2025-07-17 12:34:10 +08:00
imeepos
fb6b345188
fix: 修复导出路径中的Windows UNC前缀问题
...
- 添加normalize_windows_path函数清理路径格式
- 移除导出结果中的\\\\?\\ UNC前缀
- 确保导出的JSON文件中包含标准Windows路径格式
- 提升剪映导入兼容性
2025-07-16 22:39:39 +08:00
imeepos
0495a32c74
feat: 实现导出到剪映功能 (v0.1.28)
...
- 新增剪映导出数据结构定义 (jianying_export.rs)
- 实现模板匹配结果导出到剪映格式的服务逻辑
- 添加导出到剪映的Tauri命令接口
- 在匹配记录卡片中添加导出按钮
- 实现文件保存对话框和用户交互
- 支持根据模板匹配结果生成完整的draft_content.json
- 自动替换匹配素材路径并生成随机素材ID
- 去除无引用素材,优化导出文件大小
功能特点:
- 完全符合剪映draft_content.json格式规范
- 准确的时间轴和素材路径映射
- 用户友好的导出界面和反馈
- 遵循promptx/tauri-desktop-app-expert开发规范
2025-07-16 22:33:57 +08:00
imeepos
e3037916c0
feat: 实现一键匹配功能 (v0.1.26)
...
- 新增一键匹配后端服务,支持遍历项目模板绑定并逐一匹配
- 在项目详情页添加一键匹配按钮,支持批量匹配操作
- 实现批量匹配进度管理,包括实时进度跟踪和取消功能
- 添加一键匹配结果汇总,包含详细统计和报告导出功能
- 新增批量匹配相关组件:进度对话框、结果对话框、汇总卡片
- 遵循 promptx/tauri-desktop-app-expert 开发规范
- 支持错误处理、状态管理和用户体验优化
2025-07-16 21:52:48 +08:00
imeepos
d3ab2aa284
fix: resolve list_matching_results deserialization error
...
- Add custom deserializer for MatchingResultStatus to handle empty strings
- Add serde(default) attributes to TemplateMatchingResultQueryOptions fields
- Update frontend to send undefined instead of empty string for status filter
- Fix 'unknown variant' and 'missing field' errors in template matching results
Resolves issue where selecting 'All Status' filter caused command failures.
2025-07-16 21:28:45 +08:00
imeepos
d5ef9851cd
feat: 实现模特详情页视频生成功能
...
- 新增模特详情页组件,支持照片上传和视频生成
- 实现视频生成数据模型和仓库层
- 集成Dify API进行视频生成
- 添加云存储上传功能,自动转换S3 URL为CDN地址
- 实现统一的删除确认弹框,替换window.confirm
- 支持照片和视频生成任务的删除功能
- 优化UI/UX设计,符合前端开发规范
- 添加完整的错误处理和状态管理
核心功能:
模特照片上传到云端
多选照片进行视频生成
实时任务状态跟踪
视频生成历史记录
统一删除确认对话框
响应式设计和优雅动画
2025-07-16 19:39:44 +08:00
imeepos
52ce437e63
fix: 修复ProjectDetails.tsx中的无限请求问题和模特名称显示
...
- 修复loadProjectClassificationStats函数的无限循环问题
- 使用useRef跟踪分类统计加载状态,避免重复请求
- 添加模特信息加载功能,显示真实模特名称而非model_id
- 优化useEffect依赖,防止不必要的重新渲染和请求
- 在项目切换和导入完成时正确重置加载状态
2025-07-16 18:33:57 +08:00
imeepos
5d39ddea80
fix: 修复保存 匹配记录的bug
2025-07-16 16:09:55 +08:00
imeepos
a325b3ccc8
feat: 实现素材使用状态管理系统
...
1. 数据库层面改进:
- 新增material_usage_records表记录素材使用历史
- 为material_segments表添加usage_count、is_used、last_used_at字段
- 实现数据库迁移逻辑
2. 数据模型和仓库:
- 创建MaterialUsageRecord、MaterialUsageStats等数据模型
- 实现MaterialUsageRepository处理使用记录的CRUD操作
- 支持批量创建使用记录和统计查询
3. 业务逻辑改进:
- 修改MaterialMatchingService,在获取素材片段时排除已使用的片段
- 实现素材使用状态的自动更新机制
- 支持重置素材使用状态功能
4. 前端集成:
- 修改handleApplyMatchingResult函数,应用匹配结果时自动创建使用记录
- 新增多个后端命令支持素材使用状态管理
- 实现从匹配结果自动创建使用记录的便捷方法
5. 核心功能:
- 一个素材片段只能使用一次的限制机制
- 模板匹配时自动排除已使用的素材片段
- 完整的使用历史记录和统计功能
- 支持项目级别的使用状态重置
这个实现确保了素材的合理使用,避免重复使用同一素材片段,
同时提供了完整的使用追踪和管理功能。
2025-07-16 14:38:08 +08:00
imeepos
730ac22b84
fix: 修复get_matching_result_detail接口数据类型错误
...
修复'Invalid column type Real at index: 9, name: match_score'错误
问题根本原因:
1. 数据库schema中match_score字段定义为REAL类型
2. 数据插入时错误地将REAL/INTEGER字段转换为字符串
3. 数据读取时错误地尝试将REAL/INTEGER字段作为String类型获取
修复内容:
1. 修正matching_segment_results表相关字段的数据插入逻辑
- match_score: 直接使用f64类型而非转换为字符串
- segment_duration, start_time, end_time: 直接使用u64类型
2. 修正matching_failed_segment_results表相关字段的数据插入逻辑
- segment_duration, start_time, end_time: 直接使用u64类型
3. 修正row_to_segment_result和row_to_failed_segment_result函数
- 直接使用原始数据类型而非字符串解析
这确保了数据库操作的类型一致性,解决了get_matching_result_detail接口的错误。
2025-07-16 14:11:14 +08:00
imeepos
3e6c05c4ac
fix: 修复模板匹配结果相关的数据类型错误
...
1. 修复list_matching_results接口'Invalid column type Integer at index: 18, name: is_active'错误
- 修正template_matching_result_repository.rs中row_to_matching_result函数的is_active字段处理
- 使用rusqlite::types::Value枚举正确处理多种数据类型
2. 修复数据插入和读取的类型不一致问题
- 修正数据插入时将INTEGER字段转换为字符串的错误
- 统一数据类型:数字字段直接使用原始类型而非字符串
3. 实现应用匹配结果功能
- 修复ProjectDetails.tsx中handleApplyMatchingResult函数
- 调用save_matching_result API保存匹配结果到数据库
- 添加成功/失败通知提示
修复的具体问题:
- template_matching_results表的is_active字段类型处理
- 数字字段(total_segments, matched_segments等)的类型转换
- quality_score字段的NULL值处理
- 前端应用匹配结果后保存到数据库的逻辑
2025-07-16 14:05:01 +08:00
imeepos
a4cacf42da
hotfix: 修复get_all_projects接口description字段NULL值处理问题
...
- 修复project_repository.rs中row_to_project函数对description字段的错误处理
- 将description字段从String类型改为Option<String>类型正确处理NULL值
- 修复material_repository.rs中类似的问题
- 解决'Invalid column type Null at index: 3, name: description'错误
问题根本原因:
数据库schema允许description为NULL,但代码尝试获取非空String类型,
当description为NULL时导致类型转换失败。
修复方案:
使用Option<String>类型和filter方法正确处理NULL和空字符串情况。
2025-07-16 13:58:04 +08:00
imeepos
1d6de409ed
feat: 实现模板匹配结果保存和管理功能
...
- 新增模板匹配结果数据模型和数据库表结构
- 实现匹配结果Repository层,支持CRUD操作和查询
- 实现匹配结果Service层,提供业务逻辑和统计功能
- 新增Tauri命令接口,支持前端调用
- 实现前端TypeScript类型定义
- 更新MaterialMatchingService,支持自动保存匹配结果
- 新增前端管理界面组件:
- TemplateMatchingResultManager: 主管理界面
- TemplateMatchingResultCard: 结果卡片组件
- TemplateMatchingResultDetailModal: 详情模态框
- TemplateMatchingResultStatsPanel: 统计面板
- 编写完整的单元测试
- 新增API文档
功能特性:
- 保存匹配结果到数据库,包含成功和失败片段详情
- 支持匹配结果的查询、过滤、排序和分页
- 提供匹配统计信息和质量评分
- 支持软删除和批量操作
- 完整的前端管理界面,支持查看、编辑、删除操作
2025-07-16 13:34:32 +08:00
imeepos
ef4c047b30
fix(template-matching): 修复模板素材匹配逻辑
...
修复的问题:
- 固定素材被错误计入失败统计,导致成功率偏低
- 素材未切分时无可用片段,导致匹配完全失败
- 模板绑定验证逻辑未实现,返回空数据
- 时长单位不一致影响匹配准确性
主要改进:
- 固定素材现在正确跳过匹配,不计入失败数
- 实现虚拟片段机制,为未切分素材创建虚拟片段
- 完善模板绑定验证逻辑,正确统计片段数量
- 修正时长单位转换,确保匹配准确性
- 增强错误信息,提供更详细的匹配失败原因
修复效果:
- 修复前: 0个可用片段 匹配完全失败
- 修复后: 44个可用片段 匹配正常工作
- 三种匹配规则(固定素材/AI分类/随机匹配)现在都能正常工作
技术细节:
- 在匹配前过滤固定素材,避免错误统计
- 为每个分类记录创建对应的虚拟片段
- 成功率基于可匹配片段计算,更准确反映匹配质量
- 实现完整的模板绑定验证,支持匹配预估
2025-07-16 00:56:51 +08:00
imeepos
c7f9c9f4bb
feat: 为MaterialCard添加缩略图功能并优化UI展示
...
- 为Material数据模型添加thumbnail_path字段
- 实现get_material_thumbnail_base64 API命令支持Material缩略图生成
- 创建MaterialThumbnail组件,支持懒加载和缓存机制
- 重新设计MaterialCard布局,使用缩略图替换文件类型图标
- 精简MaterialCard信息展示,将详细信息移到可折叠区域
- 优化按钮布局,使界面更加紧凑
- 简化切分片段显示方式,提升用户体验
- 修复数据库DateTime解析问题,支持SQLite和RFC3339两种格式
- 添加数据库迁移支持thumbnail_path字段
- 遵循promptx/tauri-desktop-app-expert开发规范
2025-07-16 00:25:08 +08:00
imeepos
b06cae86f9
fix: 修复缩略图生成失败问题
...
- 增强FFmpeg缩略图生成的错误处理和详细日志
- 实现缩略图生成的重试机制,包括多种时间戳策略
- 添加缩略图生成前的预检查机制
- 优化FFmpeg命令参数,提高兼容性和成功率
- 添加单元测试验证修复效果
修复内容:
1. 增强日志记录,包括FFmpeg命令和输出信息
2. 实现重试机制:原时间戳失败时尝试0秒、中间时间点等
3. 预检查视频文件有效性、时间戳合理性、输出目录可写性
4. 优化FFmpeg参数:添加hide_banner、loglevel、update等选项
5. 在material_commands中使用新的重试机制
解决了FFmpeg执行完成但缩略图文件不存在的问题
2025-07-15 23:29:51 +08:00
imeepos
8c742bf262
feat: 创建统一的缩略图获取接口,使用视频实际尺寸
...
新增get_segment_thumbnail_base64接口:
- 根据segmentId统一获取缩略图base64数据URL
- 智能检查:数据库路径 -> 文件存在性 -> 自动重新生成
- 完整的错误处理和文件验证机制
使用视频实际尺寸生成缩略图:
- 添加get_video_info方法获取视频元数据
- 保持原始宽高比,最大宽度160像素
- 支持音频流信息解析和完整的VideoMetadata结构
代码优化:
- 简化前端缩略图加载逻辑,统一使用新接口
- 移除重复的generateSegmentThumbnail函数
- 清理不必要的参数传递和依赖项
功能特点:
- 自动检测文件丢失并重新生成
- 使用视频原始尺寸保持最佳显示效果
- 统一的错误处理和缓存机制
- 减少代码重复,提高维护性
现在缩略图生成更加智能和高效,能够自动处理文件丢失的情况,并使用视频的实际尺寸生成最佳质量的缩略图。
2025-07-15 22:49:53 +08:00
imeepos
44f3f40705
fix: 修复缩略图显示权限问题,使用base64数据URL
...
解决asset.localhost访问权限问题:
- 添加read_thumbnail_as_data_url命令读取文件并转换为base64数据URL
- 避免使用convertFileSrc的asset.localhost协议访问问题
- 添加base64依赖支持文件编码
优化缩略图加载:
- 使用数据URL直接在img标签中显示缩略图
- 正确处理Windows长路径前缀 \\\\?\\
- 统一错误处理和降级机制
技术改进:
- 移除不再使用的convertFileSrc导入
- 添加详细的控制台日志便于调试
- 确保跨平台文件路径兼容性
现在缩略图可以正确显示,不会因为权限问题导致加载失败。
2025-07-15 22:38:22 +08:00
imeepos
4d61fb69f3
fix: 修复缩略图生成功能
...
解决编译问题:
- 修复async函数中跨await点持有MutexGuard的Send trait问题
- 添加get_segment_by_id_sync同步方法避免锁生命周期冲突
- 修复Path类型推断问题
优化FFmpeg缩略图生成:
- 添加-pix_fmt yuvj420p参数解决色彩空间问题
- 添加-q:v 2参数提升图片质量
- 添加-f image2参数明确指定输出格式
- 解决MJPEG编码器参数错误问题
功能特点:
- 使用视频首帧生成缩略图
- 缩略图路径保存到数据库
- 智能缓存机制避免重复生成
- 优雅的错误处理和降级
现在缩略图生成功能可以正常工作,用户可以在MaterialSegmentView中看到实际的视频预览图。
2025-07-15 22:20:46 +08:00
imeepos
10177d2501
feat: 为MaterialSegmentView添加视频片段播放功能
...
视频播放功能:
- 为Eye按钮添加点击播放功能:点击后播放对应的视频片段
- 传递片段参数:文件路径、开始时间、结束时间
- 悬停效果优化:按钮颜色从灰色变为蓝色
- 工具提示:显示'播放视频片段'提示文字
后端播放命令:
- 新增play_video_segment命令:支持播放指定时间段的视频
- 跨平台播放器支持:
* Windows: 使用cmd /C start启动默认播放器
* macOS: 使用open命令启动默认播放器
* Linux: 使用xdg-open启动默认播放器
- 文件存在性检查:播放前验证视频文件是否存在
- 完善错误处理:播放失败时给出详细错误信息
系统集成:
- 命令注册:在lib.rs中正确注册play_video_segment命令
- 日志记录:记录播放操作的成功/失败状态
- 参数传递:支持文件路径和时间参数传递
用户体验:
- 一键播放:点击Eye按钮直接播放视频片段
- 系统默认播放器:使用用户熟悉的播放器应用
- 即时反馈:点击后立即启动播放器
- 视觉提示:按钮状态清楚表达可点击性
功能特点:
- 智能播放:虽然后端接收时间参数,但使用系统默认播放器播放完整视频
- 跨平台兼容:Windows/macOS/Linux都能正常工作
- 错误恢复:文件不存在或播放器启动失败时有相应提示
- 性能优化:异步播放,不阻塞界面操作
现在用户可以:
1. 点击任意片段的Eye按钮播放对应视频
2. 使用系统默认播放器观看视频内容
3. 享受跨平台一致的播放体验
4. 在播放失败时获得清楚的错误提示
注:当前实现使用系统默认播放器播放完整视频文件,未来可以考虑集成支持时间段播放的专业播放器。
2025-07-15 21:57:58 +08:00