/** * contact.js - u5904u7406u8054u7cfbu6211u4eecu9875u9762u7684u6d88u606fu53d1u9001u529fu80fd * u5c06u7528u6237u63d0u4ea4u7684u6d88u606fu4fddu5b58u5230 Supabase u7684 comments u6570u636eu8868u4e2d */ document.addEventListener('DOMContentLoaded', function() { console.log('Contact form script loaded'); // u83b7u53d6u8054u7cfbu8868u5355u5143u7d20 const contactForm = document.getElementById('contact-form'); // u521du59cbu5316u6210u529fu548cu9519u8befu6d88u606fu5bb9u5668 let successMessage = document.getElementById('contact-success'); let errorMessage = document.getElementById('contact-error'); // u5982u679cu6d88u606fu5bb9u5668u4e0du5b58u5728uff0cu521bu5efau5b83u4eec if (!successMessage) { successMessage = document.createElement('div'); successMessage.id = 'contact-success'; successMessage.className = 'alert alert-success mt-3 d-none'; successMessage.role = 'alert'; successMessage.innerHTML = 'u60a8u7684u6d88u606fu5df2u6210u529fu53d1u9001uff01u6211u4eecu5c06u5c3du5febu56deu590du60a8u3002'; contactForm.parentNode.appendChild(successMessage); } if (!errorMessage) { errorMessage = document.createElement('div'); errorMessage.id = 'contact-error'; errorMessage.className = 'alert alert-danger mt-3 d-none'; errorMessage.role = 'alert'; errorMessage.innerHTML = 'u53d1u9001u6d88u606fu5931u8d25uff0cu8bf7u7a0du540eu518du8bd5u3002'; contactForm.parentNode.appendChild(errorMessage); } // u8868u5355u63d0u4ea4u5904u7406 if (contactForm) { contactForm.addEventListener('submit', async function(e) { e.preventDefault(); // u663eu793au52a0u8f7du72b6u6001 const submitButton = contactForm.querySelector('button[type="submit"]'); const originalButtonText = submitButton.innerHTML; submitButton.disabled = true; submitButton.innerHTML = ' u53d1u9001u4e2d...'; // u9690u85cfu4e4bu524du7684u6d88u606f successMessage.classList.add('d-none'); errorMessage.classList.add('d-none'); try { // 获取用户实际输入的表单数据 const rawFormData = { name: document.getElementById('name').value, email: document.getElementById('email').value, subject: document.getElementById('subject').value, message: document.getElementById('message').value }; console.log('Raw form data collected:', rawFormData); // 对未填写的字段使用默认值 const formData = { name: rawFormData.name || '匿名用户', email: rawFormData.email || 'anonymous@example.com', subject: rawFormData.subject || '联系表单提交', message: rawFormData.message || '用户未提供具体消息内容' }; console.log('Form data collected:', formData); // 严格按照 comments 表的结构创建数据 const contact = { // 必需字段 - 确保这些字段非空 content: formData.message, // 这是必需字段,不能为空 created_at: new Date().toISOString(), author: formData.name, source: 'contact_page', // 其他字段 title: formData.subject, comment: `${formData.subject} ${formData.message}`, status: 'new' }; // 获取当前用户ID(如果已登录) let userId = null; if (window.supabaseClient) { const { data: { user }, error: userError } = await window.supabaseClient.auth.getUser(); if (!userError && user) { userId = user.id; console.log('Contact: User is logged in with ID:', userId); } else { console.log('Contact: User is not logged in, using default user ID'); // 对于未登录用户,使用默认 user_id userId = 'anonymous_user' } } else { console.error('Contact: Supabase client not initialized'); throw new Error('认证系统未初始化'); } contact.user_id = userId; // 设置用户ID // 检查 comments 表是否存在 console.log('Contact: Checking if comments table exists...'); try { // 尝试从 comments 表中获取一条数据,如果表不存在,则会抛出错误 const { data: testData, error: testError } = await window.supabaseClient .from('comments') .select('id') .limit(1); if (testError) { if (testError.code === 'PGRST301') { // u8868u4e0du5b58u5728uff0cu5c1du8bd5u521bu5efau7b80u5316u7248u672cu7684u6d88u606f console.log('Contact: comments table does not exist, using contact_messages table instead'); const simpleContact = { name: formData.name, email: formData.email, subject: formData.subject, message: formData.message, created_at: contact.created_at }; // u5c1du8bd5u5c06u6570u636eu5199u5165 contact_messages u8868 const { data: contactData, error: contactError } = await window.supabaseClient .from('contact_messages') .insert([simpleContact]); if (contactError) { // u5982u679c contact_messages u8868u4e5fu4e0du5b58u5728uff0cu5c1du8bd5 feedback u8868 console.log('Contact: contact_messages table also not found, trying feedback table'); const simpleFeedback = { name: formData.name, email: formData.email, type: 'contact', content: `${formData.subject}\n\n${formData.message}`, created_at: contact.created_at }; const { data: feedbackData, error: feedbackError } = await window.supabaseClient .from('feedback') .insert([simpleFeedback]); if (feedbackError) { console.error('Contact: Error submitting to any table:', feedbackError); throw new Error(`u53d1u9001u6d88u606fu5931u8d25: ${feedbackError.message || 'u670du52a1u5668u9519u8bef'}`); } console.log('Contact: Successfully submitted to feedback table'); // 不要返回,继续执行成功消息显示逻辑 } console.log('Contact: Successfully submitted to contact_messages table'); // 不要返回,继续执行成功消息显示逻辑 } else { // u5176u4ed6u9519u8befuff0cu53efu80fdu662fu6743u9650u95eeu9898 console.error('Contact: Error checking comments table:', testError); throw new Error(`u68c0u67e5u6570u636eu8868u5931u8d25: ${testError.message}`); } } // u8868u5b58u5728uff0cu6b63u5e38u63d0u4ea4 console.log('Contact: comments table exists, submitting message'); // 结构提交数据 - 确保使用用户输入 const submissionData = { // 必需字段 - 绝对使用用户输入(如果有) content: rawFormData.message && rawFormData.message.trim() !== '' ? rawFormData.message : formData.message, created_at: new Date().toISOString(), author: rawFormData.name && rawFormData.name.trim() !== '' ? rawFormData.name : formData.name, title: rawFormData.subject && rawFormData.subject.trim() !== '' ? rawFormData.subject : formData.subject, status: 'new', source: 'contact_page', user_id: userId // 如果用户未登录,已设置默认值 }; // 记录使用的内容来源 if (rawFormData.message && rawFormData.message.trim() !== '') { console.log('使用用户提供的消息内容:', rawFormData.message); } else { console.log('用户未提供消息内容,使用默认值:', formData.message); } // 在控制台打印最终提交的数据,方便调试 console.log('最终提交的表单数据:', { content: submissionData.content, author: submissionData.author, title: submissionData.title, user_id: submissionData.user_id }); console.log('Final submission data:', submissionData); const { data, error } = await window.supabaseClient .from('comments') .insert([submissionData]); if (error) { console.error('Contact: Error submitting message:', error); throw new Error(`u53d1u9001u6d88u606fu5931u8d25: ${error.message}`); } console.log('Contact: Message successfully sent to comments table'); } catch (submitError) { // u5982u679cu6240u6709u5c1du8bd5u90fdu5931u8d25uff0cu5728u63a7u5236u53f0u8bb0u5f55u4e0bu6765 console.error('Contact: All submission attempts failed:', submitError); console.log('Contact message (console only):', contact); // u5c1du8bd5u4f7fu7528 localStorage u5b58u50a8 try { const storedMessages = JSON.parse(localStorage.getItem('pendingMessages') || '[]'); storedMessages.push(contact); localStorage.setItem('pendingMessages', JSON.stringify(storedMessages)); console.log('Contact: Stored in localStorage for later submission'); } catch (storageError) { console.error('Contact: Failed to store in localStorage:', storageError); } throw submitError; } console.log('Contact: Message successfully sent'); // u663eu793au6210u529fu6d88u606f successMessage.classList.remove('d-none'); // u91cdu7f6eu8868u5355 contactForm.reset(); } catch (error) { console.error('Contact submission error:', error); // u663eu793au9519u8befu6d88u606f errorMessage.textContent = error.message || 'u53d1u9001u6d88u606fu5931u8d25uff0cu8bf7u7a0du540eu518du8bd5u3002'; errorMessage.classList.remove('d-none'); } finally { // u6062u590du6309u94aeu72b6u6001 submitButton.disabled = false; submitButton.innerHTML = originalButtonText; } }); } else { console.error('Contact form not found'); } });