diff --git a/.DS_Store b/.DS_Store index 26c14c2..d38f521 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/dist.zip b/dist.zip index 5414239..a81236d 100644 Binary files a/dist.zip and b/dist.zip differ diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 32bce59..b063b5b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -12,6 +12,7 @@ services: volumes: # 挂载日志目录到宿主机 - ./logs:/app/logs + - /etc/localtime:/etc/localtime:ro restart: unless-stopped container_name: imeeting-frontend extra_hosts: diff --git a/src/pages/Dashboard.jsx b/src/pages/Dashboard.jsx index c89233a..37443d4 100644 --- a/src/pages/Dashboard.jsx +++ b/src/pages/Dashboard.jsx @@ -63,6 +63,12 @@ const Dashboard = ({ user, onLogout }) => { }; console.log('💡 Cache debug commands available: window.meetingCache.stats(), window.meetingCache.clear(), window.meetingCache.info()'); } + + // 清理函数: 当组件卸载或用户切换时清空缓存 + return () => { + console.log('Dashboard unmounting, clearing meeting cache'); + meetingCacheService.clearAll(); + }; }, [user.user_id]); // 当筛选条件变化时,重新加载第一页 @@ -97,8 +103,8 @@ const Dashboard = ({ user, onLogout }) => { const fetchMeetings = async (page = 1, isLoadMore = false) => { try { - // 生成当前过滤器的键 - const filterKey = meetingCacheService.generateFilterKey(filterType, searchQuery, selectedTags); + // 生成当前过滤器的键(包含user_id) + const filterKey = meetingCacheService.generateFilterKey(user.user_id, filterType, searchQuery, selectedTags); // 如果不是加载更多,先检查是否有该过滤器的缓存 if (!isLoadMore) { diff --git a/src/pages/MeetingDetails.jsx b/src/pages/MeetingDetails.jsx index 1244fc4..572159f 100644 --- a/src/pages/MeetingDetails.jsx +++ b/src/pages/MeetingDetails.jsx @@ -404,17 +404,18 @@ const MeetingDetails = ({ user }) => { }, }); + // 上传成功后,刷新整个会议详情数据 + await fetchMeetingDetails(); + + // 清理上传状态 setAudioFile(null); setShowUploadConfirm(false); - setShowAudioDropdown(false); - showToast('音频上传成功,正在进行智能转录...', 'success'); // Reset file input const fileInput = document.getElementById('audio-file-upload'); if (fileInput) fileInput.value = ''; - // Refresh meeting details to get new audio and transcription status - await fetchMeetingDetails(); + showToast('音频上传成功,正在进行智能转录...', 'success'); } catch (err) { console.error('Upload error:', err); @@ -440,16 +441,36 @@ const MeetingDetails = ({ user }) => { // 调用后端API启动转录 const response = await apiClient.post(buildApiUrl(`/api/meetings/${meeting_id}/transcription/start`)); - if (response.data.task_id) { + // response 是 {code, message, data},task_id 在 data 中 + if (response.data && response.data.task_id) { + // 立即更新本地状态为新任务的pending状态 + const newStatus = { + task_id: response.data.task_id, + status: 'pending', + progress: 0, + meeting_id: parseInt(meeting_id) + }; + setTranscriptionStatus(newStatus); + setTranscriptionProgress(0); + + // 清空现有的转录数据和会议摘要(因为后端已经删除了) + setTranscript([]); + setSpeakerList([]); + setMeeting(prevMeeting => ({ + ...prevMeeting, + summary: null + })); + showToast('智能转录已启动', 'success'); - setShowAudioDropdown(false); // 开始轮询转录状态 startStatusPolling(response.data.task_id); + } else { + showToast('启动转录成功,但未获取到任务ID', 'warning'); } } catch (err) { console.error('Start transcription error:', err); - showToast(err.response?.data?.message || '启动转录失败,请重试', 'error'); + showToast(err.response?.data?.message || err.message || '启动转录失败,请重试', 'error'); } }; diff --git a/src/services/meetingCacheService.js b/src/services/meetingCacheService.js index a27a459..f571c45 100644 --- a/src/services/meetingCacheService.js +++ b/src/services/meetingCacheService.js @@ -13,14 +13,15 @@ class MeetingCacheService { /** * 生成过滤器键(不包含页码) + * @param {number} userId - 用户ID * @param {string} filterType - 过滤类型: 'all', 'created', 'attended' * @param {string} searchQuery - 搜索关键词 * @param {Array} selectedTags - 选中的标签列表 * @returns {string} 过滤器键 */ - generateFilterKey(filterType, searchQuery = '', selectedTags = []) { + generateFilterKey(userId, filterType, searchQuery = '', selectedTags = []) { const tagsStr = selectedTags.length > 0 ? selectedTags.sort().join(',') : ''; - return `${filterType}|${searchQuery}|${tagsStr}`; + return `${userId}|${filterType}|${searchQuery}|${tagsStr}`; } /**