// 添加事件监听 const viewBtn = card.querySelector('[data-action="view"]'); const chatBtn = card.querySelector('[data-action="chat"]'); viewBtn.addEventListener('click', () => viewProject(project)); chatBtn.addEventListener('click', () => openProjectChat(project)); return card; } // 生成成员头像 function generateMemberAvatars(members) { if (!members || members.length === 0) { return ''; } // 只显示前3个成员 const displayMembers = members.slice(0, 3); let html = ''; displayMembers.forEach(member => { const initial = member.name?.charAt(0) || '?'; html += `
${initial}
`; }); // 如果有更多成员,显示数量 if (members.length > 3) { html += `
+${members.length - 3}
`; } return html; } // 格式化截止日期 function formatDeadline(deadline) { if (!deadline) return '无截止日期'; const deadlineDate = new Date(deadline); const today = new Date(); const diffTime = deadlineDate - today; const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)); if (diffDays < 0) return '已过期'; if (diffDays === 0) return '今天截止'; if (diffDays === 1) return '明天截止'; if (diffDays < 7) return `${diffDays}天后截止`; if (diffDays < 30) return `${Math.floor(diffDays / 7)}周后截止`; return deadlineDate.toLocaleDateString('zh-CN'); } // 加载聊天记录 async function loadChatMessages() { try { // 调用API获取聊天记录 const response = await window.AnimForgeAPI.team.getChatMessages(); if (response.success && response.messages.length > 0) { updateChatMessages(response.messages); } else { useMockChatMessages(); } } catch (error) { console.error('加载聊天记录失败:', error); useMockChatMessages(); } } // 更新聊天消息 function updateChatMessages(messages) { const chatMessages = document.getElementById('chat-messages'); chatMessages.innerHTML = ''; messages.forEach(message => { const messageEl = createMessageElement(message); chatMessages.appendChild(messageEl); }); // 滚动到底部 scrollChatToBottom(); } // 创建消息元素 function createMessageElement(message) { const messageEl = document.createElement('div'); messageEl.className = `message ${message.type || 'received'}`; const time = formatMessageTime(message.timestamp); messageEl.innerHTML = `
${message.content}
${time}
`; return messageEl; } // 格式化消息时间 function formatMessageTime(timestamp) { const date = new Date(timestamp); const now = new Date(); const diffMs = now - date; const diffMins = Math.floor(diffMs / 60000); const diffHours = Math.floor(diffMs / 3600000); if (diffMins < 1) return '刚刚'; if (diffMins < 60) return `${diffMins}分钟前`; if (diffHours < 24) return `${diffHours}小时前`; return date.toLocaleTimeString('zh-CN', { hour: '2-digit', minute: '2-digit' }); } // 初始化事件监听 function initEventListeners() { // 添加成员按钮 const addMemberBtn = document.getElementById('add-member-btn'); if (addMemberBtn) { addMemberBtn.addEventListener('click', handleAddMember); } // 创建项目按钮 const createProjectBtn = document.getElementById('create-project-btn'); if (createProjectBtn) { createProjectBtn.addEventListener('click', handleCreateProject); } // 快速操作项 const actionItems = document.querySelectorAll('.action-item'); actionItems.forEach(item => { item.addEventListener('click', function() { const action = this.getAttribute('data-action'); handleQuickAction(action); }); }); // 聊天发送按钮 const chatSendBtn = document.getElementById('chat-send-btn'); const chatInput = document.getElementById('chat-input'); if (chatSendBtn && chatInput) { chatSendBtn.addEventListener('click', handleSendMessage); chatInput.addEventListener('keypress', function(e) { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSendMessage(); } }); } // 导航链接 const navLinks = document.querySelectorAll('.nav-link'); navLinks.forEach(link => { link.addEventListener('click', function(e) { e.preventDefault(); const page = this.getAttribute('data-page'); navigateToPage(page); }); }); } // 初始化模拟数据 function initMockData() { // 模拟团队成员 const mockMembers = [ { id: '1', name: '张三', role: '项目经理', status: 'online' }, { id: '2', name: '李四', role: '美术设计', status: 'online' }, { id: '3', name: '王五', role: '动画师', status: 'busy' }, { id: '4', name: '赵六', role: '编剧', status: 'offline' }, { id: '5', name: '钱七', role: '音效师', status: 'online' }, { id: '6', name: '孙八', role: '测试员', status: 'away' } ]; updateMembersList(mockMembers); // 模拟项目 useMockProjects(); // 模拟聊天消息 useMockChatMessages(); } // 使用模拟团队数据 function useMockTeamData() { console.log('使用模拟团队数据'); const mockOverview = { members_count: 8, online_count: 5, projects_count: 5, activity_count: 47 }; updateTeamOverview(mockOverview); } // 使用模拟项目数据 function useMockProjects() { const mockProjects = [ { id: '1', name: '星空幻想动画', description: '制作星空主题的短篇动画', members: [ { name: '张三' }, { name: '李四' }, { name: '王五' }, { name: '赵六' } ], member_count: 4, progress: 75, deadline: '2026-04-15' }, { id: '2', name: '角色设计集', description: '创作系列动漫角色设计', members: [ { name: '李四' }, { name: '钱七' } ], member_count: 2, progress: 90, deadline: '2026-03-30' }, { id: '3', name: '场景概念图', description: '绘制奇幻世界场景概念图', members: [ { name: '王五' }, { name: '孙八' } ], member_count: 2, progress: 60, deadline: '2026-04-10' } ]; updateProjectsGrid(mockProjects); } // 使用模拟聊天消息 function useMockChatMessages() { const mockMessages = [ { id: '1', type: 'received', content: '大家好!新的动画项目已经开始了,请大家查看项目详情。', timestamp: '2026-03-23T09:30:00Z' }, { id: '2', type: 'sent', content: '收到!我已经开始角色设计了。', timestamp: '2026-03-23T09:35:00Z' }, { id: '3', type: 'received', content: '场景概念图初稿已经完成,请大家提意见。', timestamp: '2026-03-23T10:15:00Z' }, { id: '4', type: 'received', content: '音效部分预计明天可以完成第一版。', timestamp: '2026-03-23T11:20:00Z' } ]; updateChatMessages(mockMessages); } // 处理添加成员 function handleAddMember() { showMessage('添加成员功能开发中', 'info'); // TODO: 实现添加成员模态框 } // 处理创建项目 function handleCreateProject() { showMessage('创建项目功能开发中', 'info'); // TODO: 实现创建项目模态框 } // 处理快速操作 function handleQuickAction(action) { console.log('快速操作:', action); switch (action) { case 'create-project': handleCreateProject(); break; case 'schedule-meeting': showMessage('安排会议功能开发中', 'info'); break; case 'share-assets': showMessage('共享资产功能开发中', 'info'); break; case 'team-settings': showMessage('团队设置功能开发中', 'info'); break; } } // 发送消息给成员 function sendMessageToMember(member) { const chatInput = document.getElementById('chat-input'); chatInput.value = `@${member.name} `; chatInput.focus(); showMessage(`准备给 ${member.name} 发送消息`, 'info'); } // 查看成员资料 function viewMemberProfile(member) { showMessage(`查看 ${member.name} 的资料`, 'info'); // TODO: 实现查看成员资料功能 } // 查看项目详情 function viewProject(project) { showMessage(`查看项目: ${project.name}`, 'info'); // TODO: 实现查看项目详情功能 } // 打开项目聊天 function openProjectChat(project) { showMessage(`打开项目聊天: ${project.name}`, 'info'); // TODO: 实现项目聊天功能 } // 处理发送消息 function handleSendMessage() { const chatInput = document.getElementById('chat-input'); const message = chatInput.value.trim(); if (!message) { showMessage('请输入消息内容', 'warning'); return; } // 创建消息元素 const messageEl = createMessageElement({ type: 'sent', content: message, timestamp: new Date().toISOString() }); // 添加到聊天区域 const chatMessages = document.getElementById('chat-messages'); chatMessages.appendChild(messageEl); // 清空输入框 chatInput.value = ''; // 滚动到底部 scrollChatToBottom(); // 模拟回复(演示用) setTimeout(() => { const replies = [ '收到!', '好的,明白了。', '这个想法不错!', '我会尽快处理。', '需要我帮忙吗?' ]; const randomReply = replies[Math.floor(Math.random() * replies.length)]; const replyEl = createMessageElement({ type: 'received', content: randomReply, timestamp: new Date().toISOString() }); chatMessages.appendChild(replyEl); scrollChatToBottom(); }, 1000); } // 滚动聊天到底部 function scrollChatToBottom() { const chatMessages = document.getElementById('chat-messages'); chatMessages.scrollTop = chatMessages.scrollHeight; } // 页面导航 function navigateToPage(page) { switch (page) { case 'dashboard': window.location.href = 'dashboard.html'; break; case 'library': window.location.href = 'asset-library.html'; break; case 'generate': window.location.href = 'ai-test.html'; break; case 'team': window.location.href = 'team-collaboration.html'; break; case 'projects': window.location.href = 'projects-complete.html'; break; case 'settings': window.location.href = 'account-settings.html'; break; } } // 显示加载状态 function showLoading(elementId, show = true) { const element = document.getElementById(elementId); if (!element) return; const loadingEl = element.querySelector('.loading'); if (loadingEl) { loadingEl.style.display = show ? 'inline-block' : 'none'; } } // 隐藏所有加载状态 function hideLoading() { document.querySelectorAll('.loading').forEach(el => { el.style.display = 'none'; }); } // 显示消息 function showMessage(message, type = 'info') { // 创建消息元素 const messageEl = document.createElement('div'); messageEl.className = `message-${type}`; messageEl.textContent = message; messageEl.style.cssText = ` position: fixed; top: 20px; right: 20px; padding: 16px 24px; background: ${type === 'success' ? '#4CAF50' : type === 'error' ? '#F44336' : type === 'warning' ? '#FFC107' : '#2196F3'}; color: white; border-radius: 8px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 9999; animation: slideIn 0.3s ease; `; // 添加到页面 document.body.appendChild(messageEl); // 3秒后自动移除 setTimeout(() => { messageEl.style.animation = 'slideOut 0.3s ease'; setTimeout(() => { if (messageEl.parentNode) { messageEl.parentNode.removeChild(messageEl); } }, 300); }, 3000); // 添加CSS动画 if (!document.querySelector('#message-animations')) { const style = document.createElement('style'); style.id = 'message-animations'; style.textContent = ` @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes slideOut { from { transform: translateX(0); opacity: 1; } to { transform: translateX(100%); opacity: 0; } } `; document.head.appendChild(style); } } // 页面可见性变化处理 document.addEventListener('visibilitychange', function() { if (!document.hidden) { // 页面重新可见时刷新数据 loadTeamData(); loadProjects(); loadChatMessages(); } }); // 定期刷新数据(每2分钟) setInterval(() => { if (!document.hidden) { loadTeamData(); } }, 2 * 60 * 1000); // 初始化完成 console.log('团队协作页面初始化完成');