# 音频处理功能部署说明 ## 1. 安装Python依赖 ```bash cd /Users/jiliu/工作/projects/imeeting/backend source venv/bin/activate pip install tinytag ``` ## 2. 执行数据库迁移 ### 2.1 创建用户日志表 ```bash mysql -u root -p imeeting < sql/migrations/create_user_logs_table.sql ``` ### 2.2 为audio_files表添加duration字段 ```bash 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. 注意事项 1. **音频时长计算**: - 使用TinyTag纯Python库 - 无需系统依赖,跨平台兼容 - 计算失败时duration为0,不影响其他功能 - 支持所有TinyTag支持的格式 2. **Safari音频播放兼容性**: - 使用直接src属性而非source子元素 - preload="metadata"模式 - 后端支持HTTP Range请求 - 正确的MIME类型由后端自动设置 3. **用户日志**: - 登录日志记录失败不影响登录流程 - IP地址优先从X-Forwarded-For获取(考虑代理场景) 4. **管理后台统计**: - 使用INNER JOIN过滤无会议用户 - 时长汇总从audio_files.duration计算 - 最后登录时间从user_logs子查询获取