main
mula.liu 2025-11-21 15:47:08 +08:00
parent 52e5ea553a
commit 4df2f40e9c
6 changed files with 40 additions and 11 deletions

BIN
.DS_Store vendored

Binary file not shown.

BIN
dist.zip

Binary file not shown.

View File

@ -12,6 +12,7 @@ services:
volumes: volumes:
# 挂载日志目录到宿主机 # 挂载日志目录到宿主机
- ./logs:/app/logs - ./logs:/app/logs
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped restart: unless-stopped
container_name: imeeting-frontend container_name: imeeting-frontend
extra_hosts: extra_hosts:

View File

@ -63,6 +63,12 @@ const Dashboard = ({ user, onLogout }) => {
}; };
console.log('💡 Cache debug commands available: window.meetingCache.stats(), window.meetingCache.clear(), window.meetingCache.info()'); 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]); }, [user.user_id]);
// //
@ -97,8 +103,8 @@ const Dashboard = ({ user, onLogout }) => {
const fetchMeetings = async (page = 1, isLoadMore = false) => { const fetchMeetings = async (page = 1, isLoadMore = false) => {
try { try {
// // (user_id)
const filterKey = meetingCacheService.generateFilterKey(filterType, searchQuery, selectedTags); const filterKey = meetingCacheService.generateFilterKey(user.user_id, filterType, searchQuery, selectedTags);
// , // ,
if (!isLoadMore) { if (!isLoadMore) {

View File

@ -404,17 +404,18 @@ const MeetingDetails = ({ user }) => {
}, },
}); });
//
await fetchMeetingDetails();
//
setAudioFile(null); setAudioFile(null);
setShowUploadConfirm(false); setShowUploadConfirm(false);
setShowAudioDropdown(false);
showToast('音频上传成功,正在进行智能转录...', 'success');
// Reset file input // Reset file input
const fileInput = document.getElementById('audio-file-upload'); const fileInput = document.getElementById('audio-file-upload');
if (fileInput) fileInput.value = ''; if (fileInput) fileInput.value = '';
// Refresh meeting details to get new audio and transcription status showToast('音频上传成功,正在进行智能转录...', 'success');
await fetchMeetingDetails();
} catch (err) { } catch (err) {
console.error('Upload error:', err); console.error('Upload error:', err);
@ -440,16 +441,36 @@ const MeetingDetails = ({ user }) => {
// API // API
const response = await apiClient.post(buildApiUrl(`/api/meetings/${meeting_id}/transcription/start`)); 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'); showToast('智能转录已启动', 'success');
setShowAudioDropdown(false);
// //
startStatusPolling(response.data.task_id); startStatusPolling(response.data.task_id);
} else {
showToast('启动转录成功但未获取到任务ID', 'warning');
} }
} catch (err) { } catch (err) {
console.error('Start transcription error:', err); console.error('Start transcription error:', err);
showToast(err.response?.data?.message || '启动转录失败,请重试', 'error'); showToast(err.response?.data?.message || err.message || '启动转录失败,请重试', 'error');
} }
}; };

View File

@ -13,14 +13,15 @@ class MeetingCacheService {
/** /**
* 生成过滤器键(不包含页码) * 生成过滤器键(不包含页码)
* @param {number} userId - 用户ID
* @param {string} filterType - 过滤类型: 'all', 'created', 'attended' * @param {string} filterType - 过滤类型: 'all', 'created', 'attended'
* @param {string} searchQuery - 搜索关键词 * @param {string} searchQuery - 搜索关键词
* @param {Array<string>} selectedTags - 选中的标签列表 * @param {Array<string>} selectedTags - 选中的标签列表
* @returns {string} 过滤器键 * @returns {string} 过滤器键
*/ */
generateFilterKey(filterType, searchQuery = '', selectedTags = []) { generateFilterKey(userId, filterType, searchQuery = '', selectedTags = []) {
const tagsStr = selectedTags.length > 0 ? selectedTags.sort().join(',') : ''; const tagsStr = selectedTags.length > 0 ? selectedTags.sort().join(',') : '';
return `${filterType}|${searchQuery}|${tagsStr}`; return `${userId}|${filterType}|${searchQuery}|${tagsStr}`;
} }
/** /**