diff --git a/frontend/src/views/FeedbackOps.vue b/frontend/src/views/FeedbackOps.vue index d2c9477..44e6985 100644 --- a/frontend/src/views/FeedbackOps.vue +++ b/frontend/src/views/FeedbackOps.vue @@ -23,6 +23,10 @@ {{ reasonLabel(row.reasonCategory) }} - + @@ -57,6 +61,9 @@ · {{ reasonLabel(msg.feedback.reasonCategory) }} +
+ 💬 补充说明:{{ msg.feedback.reasonComment }} +
@@ -90,6 +97,7 @@ import { getCategoryTree } from '@/api/category' import { useConfirm } from '@/composables/useConfirm' import { toast } from '@/utils/toast' import { renderMarkdown } from '@/utils/markdown' +import { formatDate } from '@/utils/format' const { confirm } = useConfirm() @@ -127,10 +135,11 @@ const processedOptions = [ const columns = [ { colKey: 'feedbackType', title: '反馈', width: 90, cell: 'feedbackType' }, { colKey: 'reasonCategory', title: '原因', width: 80, cell: 'reasonCategory' }, + { colKey: 'reasonComment', title: '补充说明', width: 160, ellipsis: true, cell: 'reasonComment' }, { colKey: 'userQuestion', title: '用户问题', width: 200, ellipsis: true, cell: 'userQuestion' }, { colKey: 'assistantAnswer', title: 'AI 回复', width: 200, ellipsis: true, cell: 'assistantAnswer' }, { colKey: 'processed', title: '状态', width: 70, cell: 'processed' }, - { colKey: 'feedbackTime', title: '时间', width: 150 }, + { colKey: 'feedbackTime', title: '时间', width: 150, cell: (_: any, { row }: any) => formatDate(row.feedbackTime) }, { colKey: 'op', title: '操作', width: 240, cell: 'op' }, ] @@ -309,6 +318,7 @@ async function submitFaqAction() { .msg-assistant { background: var(--color-bg-subtle); } .msg-system { background: var(--color-warning-bg); } .msg-meta { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; } +.msg-comment { font-size: 12px; color: var(--color-text-secondary, #666); background: var(--color-warning-bg); border-radius: 6px; padding: 6px 10px; margin-bottom: 6px; white-space: pre-wrap; word-break: break-word; } .msg-body { font-size: 13px; line-height: 1.6; white-space: pre-wrap; word-break: break-word; } .dialog-footer { margin-top: 16px; display: flex; justify-content: flex-end; gap: 8px; } diff --git a/frontend/src/views/PromptTracePanel.vue b/frontend/src/views/PromptTracePanel.vue index c9313a2..cf1fe1e 100644 --- a/frontend/src/views/PromptTracePanel.vue +++ b/frontend/src/views/PromptTracePanel.vue @@ -594,20 +594,15 @@ function trendTimeRange(): { startTime?: string; endTime?: string } { const end = new Date() if (trendRange.value === '24h') { const start = new Date(end.getTime() - 24 * 3600 * 1000) - return { startTime: fmtDateTime(start), endTime: fmtDateTime(end) } + return { startTime: formatDate(start), endTime: formatDate(end) } } if (trendRange.value === '7d') { const start = new Date(end.getTime() - 7 * 24 * 3600 * 1000) - return { startTime: fmtDateTime(start), endTime: fmtDateTime(end) } + return { startTime: formatDate(start), endTime: formatDate(end) } } return {} } -function fmtDateTime(d: Date): string { - const p = (n: number) => String(n).padStart(2, '0') - return `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}` -} - async function loadTrend() { trendLoading.value = true try {