This commit is contained in:
aaron 2025-05-20 08:26:38 +08:00
parent fb9e663f31
commit baec7a0422
2 changed files with 200 additions and 9 deletions

View File

@ -5,7 +5,7 @@ services:
build:
context: .
dockerfile: Dockerfile
image: tradus-web:1.3.3
image: tradus-web:1.3.4
container_name: tradus-web
ports:
- '6000:80'

View File

@ -2,6 +2,7 @@
import { ref, computed, nextTick, watch } from 'vue'
import { useRoute } from 'vue-router'
import { http } from '../services/api'
import { marked } from 'marked'
//
const route = useRoute()
@ -251,11 +252,8 @@ const copyAnalysis = async () => {
if (!analysisContent.value) return
try {
const tempDiv = document.createElement('div')
tempDiv.innerHTML = analysisContent.value
const textContent = tempDiv.textContent || tempDiv.innerText || ''
await navigator.clipboard.writeText(textContent)
// HTML
await navigator.clipboard.writeText(analysisContent.value)
copySuccess.value = true
setTimeout(() => {
copySuccess.value = false
@ -278,6 +276,14 @@ watch(
resetView()
},
)
// markdown
const parsedContent = computed(() => {
if (!analysisContent.value || analysisContent.value.startsWith('错误:')) {
return ''
}
return marked(analysisContent.value)
})
</script>
<template>
@ -408,9 +414,7 @@ watch(
<div v-if="analysisContent.startsWith('错误:')" class="error-message">
{{ analysisContent.substring(4) }}
</div>
<div v-else class="analysis-content">
{{ analysisContent }}
</div>
<div v-else class="analysis-content markdown-content" v-html="parsedContent"></div>
</div>
</div>
</div>
@ -996,3 +1000,190 @@ watch(
}
}
</style>
<style>
/* Markdown 样式 */
.markdown-content {
white-space: normal !important;
}
.markdown-content h1,
.markdown-content h2,
.markdown-content h3,
.markdown-content h4,
.markdown-content h5,
.markdown-content h6 {
margin-top: 1.5rem;
margin-bottom: 1rem;
font-weight: 600;
line-height: 1.25;
color: var(--color-text-primary);
font-size: 1.2rem; /* 统一所有标题的字体大小 */
}
.markdown-content h1 {
border-bottom: 1px solid var(--color-border);
padding-bottom: 0.3em;
}
.markdown-content h2 {
border-bottom: 1px solid var(--color-border);
padding-bottom: 0.3em;
}
.markdown-content h3 {
}
.markdown-content h4 {
}
.markdown-content h5 {
}
.markdown-content h6 {
color: var(--color-text-secondary);
}
.markdown-content p {
margin-top: 0;
margin-bottom: 1.5rem;
line-height: 1.8;
}
.markdown-content ul,
.markdown-content ol {
margin-top: 0;
margin-bottom: 1.5rem;
padding-left: 2rem;
}
.markdown-content li {
margin-bottom: 0.5rem;
line-height: 1.7;
}
.markdown-content li p {
margin-bottom: 0.7rem;
}
.markdown-content li:last-child {
margin-bottom: 0;
}
.markdown-content blockquote {
padding: 0.5rem 1.5rem;
color: var(--color-text-secondary);
border-left: 0.3rem solid var(--color-border);
margin: 0 0 1.5rem;
}
.markdown-content blockquote p:last-child {
margin-bottom: 0;
}
.markdown-content pre {
margin-top: 0;
margin-bottom: 1rem;
padding: 1rem;
overflow: auto;
font-size: 85%;
line-height: 1.45;
background-color: var(--color-bg-secondary);
border-radius: var(--border-radius);
}
.markdown-content code {
font-family:
SFMono-Regular,
Consolas,
Liberation Mono,
Menlo,
monospace;
font-size: 85%;
padding: 0.2em 0.4em;
margin: 0;
background-color: var(--color-bg-secondary);
border-radius: 3px;
}
.markdown-content pre code {
padding: 0;
background-color: transparent;
}
.markdown-content table {
width: 100%;
margin-top: 0;
margin-bottom: 1rem;
border-spacing: 0;
border-collapse: collapse;
overflow: auto;
}
.markdown-content table th,
.markdown-content table td {
padding: 0.5rem 1rem;
border: 1px solid var(--color-border);
}
.markdown-content table th {
font-weight: 600;
background-color: var(--color-bg-secondary);
}
.markdown-content table tr:nth-child(2n) {
background-color: var(--color-bg-secondary);
}
.markdown-content a {
color: var(--color-accent);
text-decoration: none;
}
.markdown-content a:hover {
text-decoration: underline;
}
.markdown-content img {
max-width: 100%;
height: auto;
display: block;
margin: 1rem auto;
}
.markdown-content hr {
height: 0.25em;
padding: 0;
margin: 1.5rem 0;
background-color: var(--color-border);
border: 0;
}
/* 响应式样式 */
@media (max-width: 768px) {
.markdown-content h1,
.markdown-content h2,
.markdown-content h3,
.markdown-content h4,
.markdown-content h5,
.markdown-content h6 {
font-size: 1.1rem;
}
}
@media (max-width: 480px) {
.markdown-content h1,
.markdown-content h2,
.markdown-content h3,
.markdown-content h4,
.markdown-content h5,
.markdown-content h6 {
font-size: 1rem;
}
.markdown-content h1,
.markdown-content h2 {
padding-bottom: 0.2em;
}
}
</style>