3.7 KiB
3.7 KiB
音频处理功能部署说明
1. 安装Python依赖
cd /Users/jiliu/工作/projects/imeeting/backend
source venv/bin/activate
pip install tinytag
2. 执行数据库迁移
2.1 创建用户日志表
mysql -u root -p imeeting < sql/migrations/create_user_logs_table.sql
2.2 为audio_files表添加duration字段
mysql -u root -p imeeting < sql/migrations/add_duration_to_audio_files.sql
3. 功能说明
3.1 用户日志表 (user_logs)
- 记录用户登录活动
- 字段:log_id, user_id, action_type, ip_address, user_agent, metadata, created_at
- 管理后台可查询用户最后登录时间
3.2 音频处理优化
音频时长计算:
- 使用TinyTag库读取音频文件时长
- 纯Python实现,无需外部依赖
- 支持mp3, m4a, mp4, wav, ogg, flac等常见格式
- 能处理特殊/损坏元数据的文件
- 时长保存到audio_files.duration字段(单位:秒)
- 时长读取功能位于
app/utils/audio_parser.py
3.3 管理后台用户统计
- 排除没有会议的用户
- 显示字段:
- ID
- 用户名
- 姓名
- 注册时间
- 最新登录时间(从user_logs表查询)
- 会议数量
- 会议时长(从audio_files.duration汇总,格式:Xh Ym)
4. 代码变更清单
后端变更:
/backend/app/utils/audio_parser.py- 新增音频时长解析工具(使用TinyTag)/backend/app/api/endpoints/meetings.py- 完整文件上传时调用audio_parser获取时长,修复Safari播放问题/backend/app/api/endpoints/audio.py- Stream上传完成时调用audio_parser获取时长/backend/app/services/audio_service.py- 增加duration参数/backend/app/api/endpoints/auth.py- 登录时记录日志/backend/app/api/endpoints/admin_dashboard.py- 更新用户统计查询/backend/app/models/models.py- 新增UserLog模型
前端变更:
/frontend/src/pages/HomePage.jsx- 密码显示/隐藏切换/frontend/src/pages/HomePage.css- 密码切换按钮样式/frontend/src/pages/AdminDashboard.jsx- 用户列表增加会议时长列/frontend/src/pages/MeetingPreview.jsx- 新增转录标签页,修复Safari音频播放/frontend/src/pages/MeetingDetails.jsx- 修复Safari音频播放问题
数据库变更:
sql/migrations/create_user_logs_table.sql- 创建用户日志表sql/migrations/add_duration_to_audio_files.sql- 添加音频时长字段
5. 测试检查清单
- 安装Python依赖成功
- 数据库迁移执行成功
- 用户登录后,user_logs表有记录
- 上传音频文件,Safari可以正常播放
- 上传音频后,audio_files.duration有正确的时长值
- 管理后台用户列表显示正确(排除无会议用户)
- 用户列表中会议时长统计正确
- 登录页面密码显示/隐藏按钮正常工作
- 会议预览页面音频播放正常(Safari/Chrome)
- 会议详情页面音频播放正常(Safari/Chrome)
6. 注意事项
-
音频时长计算:
- 使用TinyTag纯Python库
- 无需系统依赖,跨平台兼容
- 计算失败时duration为0,不影响其他功能
- 支持所有TinyTag支持的格式
-
Safari音频播放兼容性:
- 使用直接src属性而非source子元素
- preload="metadata"模式
- 后端支持HTTP Range请求
- 正确的MIME类型由后端自动设置
-
用户日志:
- 登录日志记录失败不影响登录流程
- IP地址优先从X-Forwarded-For获取(考虑代理场景)
-
管理后台统计:
- 使用INNER JOIN过滤无会议用户
- 时长汇总从audio_files.duration计算
- 最后登录时间从user_logs子查询获取