From a2a8a48fad7e57689643597e3a2b98fbb51086c1 Mon Sep 17 00:00:00 2001 From: "mula.liu" Date: Fri, 26 Dec 2025 16:58:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3safari=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 10244 -> 10244 bytes DEPLOYMENT_AUDIO_FEATURES.md | 101 ++++++++++++++++++ app.zip | Bin 93418 -> 0 bytes app/api/endpoints/admin_dashboard.py | 60 +++++++++++ app/api/endpoints/auth.py | 48 ++++++--- app/api/endpoints/meetings.py | 33 ++++-- app/models/models.py | 9 ++ app/services/audio_service.py | 14 +-- app/utils/audio_parser.py | 34 ++++++ requirements-prod.txt | 3 + sql/.DS_Store | Bin 0 -> 6148 bytes .../add_duration_to_audio_files.sql | 20 ++++ sql/migrations/create_user_logs_table.sql | 35 ++++++ 13 files changed, 330 insertions(+), 27 deletions(-) create mode 100644 DEPLOYMENT_AUDIO_FEATURES.md delete mode 100644 app.zip create mode 100644 app/utils/audio_parser.py create mode 100644 sql/.DS_Store create mode 100644 sql/migrations/add_duration_to_audio_files.sql create mode 100644 sql/migrations/create_user_logs_table.sql diff --git a/.DS_Store b/.DS_Store index 39928e3ee706734636150476bb24e18206504456..ec39ca3835b6a7c9c9fb1b04f18716c0345f5e4a 100644 GIT binary patch delta 18 ZcmZn(XbIThEyya*z`(F#bAaF$F#t891z!LF delta 18 ZcmZn(XbIThEy$|Nz`(F{bAaF$F#t9k1!@2Q diff --git a/DEPLOYMENT_AUDIO_FEATURES.md b/DEPLOYMENT_AUDIO_FEATURES.md new file mode 100644 index 0000000..037da92 --- /dev/null +++ b/DEPLOYMENT_AUDIO_FEATURES.md @@ -0,0 +1,101 @@ +# 音频处理功能部署说明 + +## 1. 安装Python依赖 + +```bash +cd /Users/jiliu/工作/projects/imeeting/backend +pip install mutagen +``` + +## 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 音频处理优化 +**音频时长计算:** +- 使用mutagen库自动识别音频格式并提取时长 +- 支持mp3, m4a, mp4, wav等常见格式 +- 时长保存到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` - 新增音频时长解析工具 +- `/backend/app/api/endpoints/meetings.py` - 音频上传时调用audio_parser获取时长,修复Safari播放问题 +- `/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. **音频时长计算**: + - 使用mutagen自动识别格式 + - 计算失败时duration为0,不影响其他功能 + - 支持所有mutagen支持的格式 + +2. **Safari音频播放兼容性**: + - 使用直接src属性而非source子元素 + - preload="metadata"模式 + - 后端支持HTTP Range请求 + - 正确的MIME类型由后端自动设置 + +3. **用户日志**: + - 登录日志记录失败不影响登录流程 + - IP地址优先从X-Forwarded-For获取(考虑代理场景) + +4. **管理后台统计**: + - 使用INNER JOIN过滤无会议用户 + - 时长汇总从audio_files.duration计算 + - 最后登录时间从user_logs子查询获取 diff --git a/app.zip b/app.zip deleted file mode 100644 index 92ba9aa8665acc7d55040436cfeabdc7c636d71b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93418 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

IW0!^MV?RPtiwK(5!SBw6%F$8+jyU3QwVl@P^Of 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 Q0`xOP0sx$YGys7A2Sp?(RsaA1 diff --git a/app/api/endpoints/admin_dashboard.py b/app/api/endpoints/admin_dashboard.py index 79dc4ed..a0129f4 100644 --- a/app/api/endpoints/admin_dashboard.py +++ b/app/api/endpoints/admin_dashboard.py @@ -396,3 +396,63 @@ async def get_system_resources(current_user=Depends(get_current_admin_user)): except Exception as e: print(f"获取系统资源失败: {e}") return create_api_response(code="500", message=f"获取系统资源失败: {str(e)}") + + +@router.get("/admin/user-stats") +async def get_user_stats(current_user=Depends(get_current_admin_user)): + """获取用户统计列表""" + try: + with get_db_connection() as connection: + cursor = connection.cursor(dictionary=True) + + # 查询所有用户及其会议统计和最后登录时间(排除没有会议的用户) + query = """ + SELECT + u.user_id, + u.username, + u.caption, + u.created_at, + (SELECT MAX(created_at) FROM user_logs + WHERE user_id = u.user_id AND action_type = 'login') as last_login_time, + COUNT(DISTINCT m.meeting_id) as meeting_count, + COALESCE(SUM(af.duration), 0) as total_duration_seconds + FROM users u + INNER JOIN meetings m ON u.user_id = m.user_id + LEFT JOIN audio_files af ON m.meeting_id = af.meeting_id + GROUP BY u.user_id, u.username, u.caption, u.created_at + HAVING meeting_count > 0 + ORDER BY u.user_id ASC + """ + + cursor.execute(query) + users = cursor.fetchall() + + # 格式化返回数据 + users_list = [] + for user in users: + total_seconds = int(user['total_duration_seconds']) if user['total_duration_seconds'] else 0 + hours = total_seconds // 3600 + minutes = (total_seconds % 3600) // 60 + + users_list.append({ + 'user_id': user['user_id'], + 'username': user['username'], + 'caption': user['caption'], + 'created_at': user['created_at'].isoformat() if user['created_at'] else None, + 'last_login_time': user['last_login_time'].isoformat() if user['last_login_time'] else None, + 'meeting_count': user['meeting_count'], + 'total_duration_seconds': total_seconds, + 'total_duration_formatted': f"{hours}h {minutes}m" if total_seconds > 0 else '-' + }) + + return create_api_response( + code="200", + message="获取用户统计成功", + data={"users": users_list, "total": len(users_list)} + ) + + except Exception as e: + print(f"获取用户统计失败: {e}") + import traceback + traceback.print_exc() + return create_api_response(code="500", message=f"获取用户统计失败: {str(e)}") diff --git a/app/api/endpoints/auth.py b/app/api/endpoints/auth.py index 710d433..82355db 100644 --- a/app/api/endpoints/auth.py +++ b/app/api/endpoints/auth.py @@ -1,8 +1,7 @@ - import hashlib from typing import Union -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.responses import JSONResponse from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials @@ -20,21 +19,21 @@ def hash_password(password: str) -> str: return hashlib.sha256(password.encode()).hexdigest() @router.post("/auth/login") -def login(request: LoginRequest): +def login(request_body: LoginRequest, request: Request): with get_db_connection() as connection: cursor = connection.cursor(dictionary=True) - + query = "SELECT user_id, username, caption, email, password_hash, role_id FROM users WHERE username = %s" - cursor.execute(query, (request.username,)) + cursor.execute(query, (request_body.username,)) user = cursor.fetchone() - + if not user: return create_api_response(code="401", message="用户名或密码错误") - - hashed_input = hash_password(request.password) + + hashed_input = hash_password(request_body.password) if user['password_hash'] != hashed_input: return create_api_response(code="401", message="用户名或密码错误") - + # 创建JWT token token_data = { "user_id": user['user_id'], @@ -43,7 +42,30 @@ def login(request: LoginRequest): "role_id": user['role_id'] } token = jwt_service.create_access_token(token_data) - + + # 记录登录日志 + try: + # 获取客户端IP地址(考虑代理) + client_ip = request.client.host if request.client else None + if "x-forwarded-for" in request.headers: + client_ip = request.headers["x-forwarded-for"].split(",")[0].strip() + elif "x-real-ip" in request.headers: + client_ip = request.headers["x-real-ip"] + + # 获取User-Agent + user_agent = request.headers.get("user-agent", None) + + # 插入登录日志 + log_query = """ + INSERT INTO user_logs (user_id, action_type, ip_address, user_agent) + VALUES (%s, %s, %s, %s) + """ + cursor.execute(log_query, (user['user_id'], 'login', client_ip, user_agent)) + connection.commit() + except Exception as e: + # 日志记录失败不影响登录流程 + print(f"Failed to log user login: {e}") + login_response_data = LoginResponse( user_id=user['user_id'], username=user['username'], @@ -52,10 +74,10 @@ def login(request: LoginRequest): token=token, role_id=user['role_id'] ) - + return create_api_response( - code="200", - message="登录成功", + code="200", + message="登录成功", data=login_response_data.dict() ) diff --git a/app/api/endpoints/meetings.py b/app/api/endpoints/meetings.py index 0ddff02..9df41bf 100644 --- a/app/api/endpoints/meetings.py +++ b/app/api/endpoints/meetings.py @@ -8,7 +8,8 @@ from app.services.llm_service import LLMService from app.services.async_transcription_service import AsyncTranscriptionService from app.services.async_meeting_service import async_meeting_service from app.services.audio_service import handle_audio_upload -from app.core.auth import get_current_user +from app.utils.audio_parser import get_audio_duration +from app.core.auth import get_current_user, get_optional_current_user from app.core.response import create_api_response from typing import List, Optional from datetime import datetime @@ -346,7 +347,8 @@ def get_meeting_details(meeting_id: int, current_user: dict = Depends(get_curren return create_api_response(code="200", message="获取会议详情成功", data=meeting_data) @router.get("/meetings/{meeting_id}/transcript") -def get_meeting_transcript(meeting_id: int, current_user: dict = Depends(get_current_user)): +def get_meeting_transcript(meeting_id: int, current_user: Optional[dict] = Depends(get_optional_current_user)): + """获取会议转录内容(支持公开访问用于预览)""" with get_db_connection() as connection: cursor = connection.cursor(dictionary=True) cursor.execute("SELECT meeting_id FROM meetings WHERE meeting_id = %s", (meeting_id,)) @@ -516,6 +518,14 @@ async def upload_audio( except Exception as e: return create_api_response(code="500", message=f"保存文件失败: {str(e)}") + # 3.5 获取音频时长 + audio_duration = 0 + try: + audio_duration = get_audio_duration(str(absolute_path)) + print(f"音频时长: {audio_duration}秒") + except Exception as e: + print(f"警告: 获取音频时长失败,但不影响后续流程: {e}") + file_path = '/' + str(relative_path) file_name = audio_file.filename file_size = audio_file.size @@ -529,7 +539,8 @@ async def upload_audio( current_user=current_user, auto_summarize=auto_summarize_bool, background_tasks=background_tasks, - prompt_id=prompt_id # 传递 prompt_id 参数 + prompt_id=prompt_id, + duration=audio_duration # 传递时长参数 ) # 如果不成功,删除已保存的文件并返回错误 @@ -568,7 +579,8 @@ async def upload_audio( ) @router.get("/meetings/{meeting_id}/audio") -def get_audio_file(meeting_id: int, current_user: dict = Depends(get_current_user)): +def get_audio_file(meeting_id: int, current_user: Optional[dict] = Depends(get_optional_current_user)): + """获取音频文件信息(支持公开访问用于预览)""" with get_db_connection() as connection: cursor = connection.cursor(dictionary=True) cursor.execute("SELECT file_name, file_path, file_size, upload_time FROM audio_files WHERE meeting_id = %s", (meeting_id,)) @@ -607,10 +619,11 @@ async def stream_audio_file( extension = os.path.splitext(file_name)[1].lower() mime_types = { '.mp3': 'audio/mpeg', - '.m4a': 'audio/mp4', + '.m4a': 'audio/mp4', # 标准 MIME type,Safari 兼容 '.wav': 'audio/wav', '.mpeg': 'audio/mpeg', - '.mp4': 'audio/mp4' + '.mp4': 'audio/mp4', + '.webm': 'audio/webm' } content_type = mime_types.get(extension, 'audio/mpeg') @@ -671,7 +684,9 @@ async def stream_audio_file( "Content-Range": f"bytes {start}-{end}/{file_size}", "Accept-Ranges": "bytes", "Content-Length": str(content_length), - "Content-Disposition": filename_header + "Content-Disposition": filename_header, + "Cache-Control": "public, max-age=31536000", # 1年缓存 + "X-Content-Type-Options": "nosniff" } ) else: @@ -682,7 +697,9 @@ async def stream_audio_file( headers={ "Accept-Ranges": "bytes", "Content-Length": str(file_size), - "Content-Disposition": filename_header + "Content-Disposition": filename_header, + "Cache-Control": "public, max-age=31536000", # 1年缓存 + "X-Content-Type-Options": "nosniff" } ) diff --git a/app/models/models.py b/app/models/models.py index 1a6ae9a..b0a61e2 100644 --- a/app/models/models.py +++ b/app/models/models.py @@ -46,6 +46,15 @@ class UpdateUserRequest(BaseModel): email: Optional[str] = None role_id: Optional[int] = None +class UserLog(BaseModel): + log_id: int + user_id: int + action_type: str + ip_address: Optional[str] = None + user_agent: Optional[str] = None + metadata: Optional[dict] = None + created_at: datetime.datetime + class AttendeeInfo(BaseModel): user_id: int caption: str diff --git a/app/services/audio_service.py b/app/services/audio_service.py index 5142699..778c338 100644 --- a/app/services/audio_service.py +++ b/app/services/audio_service.py @@ -24,12 +24,13 @@ def handle_audio_upload( current_user: dict, auto_summarize: bool = True, background_tasks: BackgroundTasks = None, - prompt_id: int = None + prompt_id: int = None, + duration: int = 0 ) -> dict: """ 处理已保存的完整音频文件 - 职责: + 职责: 1. 权限检查 2. 检查已有文件和转录记录 3. 更新数据库(audio_files 表) @@ -45,6 +46,7 @@ def handle_audio_upload( auto_summarize: 是否自动生成总结(默认True) background_tasks: FastAPI 后台任务对象 prompt_id: 提示词模版ID(可选,如果不指定则使用默认模版) + duration: 音频时长(秒) Returns: dict: { @@ -120,13 +122,13 @@ def handle_audio_upload( if replaced_existing: cursor.execute( - 'UPDATE audio_files SET file_name = %s, file_path = %s, file_size = %s, upload_time = NOW(), task_id = NULL WHERE meeting_id = %s', - (file_name, file_path, file_size, meeting_id) + 'UPDATE audio_files SET file_name = %s, file_path = %s, file_size = %s, duration = %s, upload_time = NOW(), task_id = NULL WHERE meeting_id = %s', + (file_name, file_path, file_size, duration, meeting_id) ) else: cursor.execute( - 'INSERT INTO audio_files (meeting_id, file_name, file_path, file_size, upload_time) VALUES (%s, %s, %s, %s, NOW())', - (meeting_id, file_name, file_path, file_size) + 'INSERT INTO audio_files (meeting_id, file_name, file_path, file_size, duration, upload_time) VALUES (%s, %s, %s, %s, %s, NOW())', + (meeting_id, file_name, file_path, file_size, duration) ) connection.commit() diff --git a/app/utils/audio_parser.py b/app/utils/audio_parser.py new file mode 100644 index 0000000..442d21f --- /dev/null +++ b/app/utils/audio_parser.py @@ -0,0 +1,34 @@ +""" +音频文件解析工具 + +用于解析音频文件的元数据信息,如时长、采样率、编码格式等 +""" + +from mutagen import File as MutagenFile + + +def get_audio_duration(file_path: str) -> int: + """ + 获取音频文件时长(秒) + + Args: + file_path: 音频文件的完整路径 + + Returns: + 音频时长(秒),如果解析失败返回0 + + 支持格式: + - MP3 (.mp3) + - M4A (.m4a) + - MP4 (.mp4) + - WAV (.wav) + - 以及mutagen支持的其他格式 + """ + try: + audio = MutagenFile(file_path) + if audio is not None and hasattr(audio.info, 'length'): + return int(audio.info.length) + return 0 + except Exception as e: + print(f"获取音频时长失败 ({file_path}): {e}") + return 0 diff --git a/requirements-prod.txt b/requirements-prod.txt index 475ac80..3d94fd4 100644 --- a/requirements-prod.txt +++ b/requirements-prod.txt @@ -21,3 +21,6 @@ psutil # APK Parsing pyaxmlparser + +# Audio Processing +mutagen==1.47.0 diff --git a/sql/.DS_Store b/sql/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..2e46cacab7a5a13436fcb2f51b359c70b88ac912 GIT binary patch literal 6148 zcmeHKJ5EC}5S)b+5i}`N`U>2@ioyxF0G}ub33w8L{#BfdqcQs_h+fi#CYqJjW3P8? zd5X7h0odwma|0{@%;}E!_F-zi?>@1MiWrg3Gam4X7YumEZjyaC;M^;`k@bv^zx?fH z_w+anubv>20#ZN