From 96e55d87159087e40f4b159b386ac59f9ba15349 Mon Sep 17 00:00:00 2001 From: canglan Date: Fri, 17 Jul 2026 14:16:21 +0800 Subject: [PATCH] feat: anonymous ticket reply via tracking cookie --- backend/routes/tickets.js | 11 +++++++++++ public/js/pages/home.js | 10 +++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/backend/routes/tickets.js b/backend/routes/tickets.js index 93b37d2..c686931 100644 --- a/backend/routes/tickets.js +++ b/backend/routes/tickets.js @@ -277,6 +277,17 @@ router.post('/:id/response', authenticate, async (req, res) => { res.status(201).json({ message: '回复成功' }); }); +router.post('/:id/anon-response', async (req, res) => { + const { content } = req.body; + if (!content) return res.status(400).json({ error: '内容不能为空' }); + const cookieToken = req.headers.cookie?.split('; ').find(c => c.startsWith('tracking_token='))?.split('=')[1]; + if (!cookieToken) return res.status(403).json({ error: '无权操作,请先提交工单获取追踪标识' }); + const t = await getRow('SELECT * FROM tickets WHERE id = ? AND tracking_token = ?', [req.params.id, cookieToken]); + if (!t) return res.status(404).json({ error: '工单不存在或无权操作' }); + await query("INSERT INTO responses(ticket_id, content, is_staff) VALUES (?,?,0)", [req.params.id, content]); + res.status(201).json({ message: '补充成功' }); +}); + async function notifyStatusChange(ticket, newStatus) { if (ticket.user_id) { await sendEmailForTicket(ticket, 'ticket_updated', { ticket_status: SL[newStatus]||newStatus, ticket_status_color: SC[newStatus]||'#6b7280' }); diff --git a/public/js/pages/home.js b/public/js/pages/home.js index 07f2854..f0e6c43 100644 --- a/public/js/pages/home.js +++ b/public/js/pages/home.js @@ -46,7 +46,15 @@ const HomePage = { API.get(`/tickets/tracking?token=${token}`).then(tickets => { const t = tickets.find(x=>x.id===id); if(!t) return; - document.getElementById('tkd').innerHTML = `

基本信息

标题${U.esc(t.title)}
类型${U.badge(t.type,'type')}
状态${U.badge(t.status,'status')}
提交者${U.esc(t.reporter_game_name)} (UID: ${U.esc(t.reporter_game_uid)})

如需回复请注册账号

`; + document.getElementById('tkd').innerHTML = `

基本信息

标题${U.esc(t.title)}
类型${U.badge(t.type,'type')}
状态${U.badge(t.status,'status')}
提交者${U.esc(t.reporter_game_name)} (UID: ${U.esc(t.reporter_game_uid)})
${t.description?`
详情${U.esc(t.description)}
`:''}
+
`; + document.getElementById('anon-reply-form').onsubmit = async e => { + e.preventDefault(); + const c = document.getElementById('anon-reply-content').value.trim(); + if (!c) return; + try { await API.post(`/tickets/${id}/anon-response`, { content: c }); alert('补充成功'); App.closeModal(); } + catch(ex) { alert(ex.message); } + }; }).catch(()=>{}); } };