Commit ced88523 authored by 水玉婷's avatar 水玉婷
Browse files

feat:优化md,tips样式,md图片渲染问题以及历史记录完成思考

parent d7e7c0e3
...@@ -520,39 +520,39 @@ ...@@ -520,39 +520,39 @@
} }
}, },
"node_modules/@vue/compiler-core": { "node_modules/@vue/compiler-core": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz",
"integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", "integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^7.28.5", "@babel/parser": "^7.28.5",
"@vue/shared": "3.5.24", "@vue/shared": "3.5.26",
"entities": "^4.5.0", "entities": "^7.0.0",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"source-map-js": "^1.2.1" "source-map-js": "^1.2.1"
} }
}, },
"node_modules/@vue/compiler-dom": { "node_modules/@vue/compiler-dom": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz",
"integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", "integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-core": "3.5.24", "@vue/compiler-core": "3.5.26",
"@vue/shared": "3.5.24" "@vue/shared": "3.5.26"
} }
}, },
"node_modules/@vue/compiler-sfc": { "node_modules/@vue/compiler-sfc": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz",
"integrity": "sha512-8EG5YPRgmTB+YxYBM3VXy8zHD9SWHUJLIGPhDovo3Z8VOgvP+O7UP5vl0J4BBPWYD9vxtBabzW1EuEZ+Cqs14g==", "integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/parser": "^7.28.5", "@babel/parser": "^7.28.5",
"@vue/compiler-core": "3.5.24", "@vue/compiler-core": "3.5.26",
"@vue/compiler-dom": "3.5.24", "@vue/compiler-dom": "3.5.26",
"@vue/compiler-ssr": "3.5.24", "@vue/compiler-ssr": "3.5.26",
"@vue/shared": "3.5.24", "@vue/shared": "3.5.26",
"estree-walker": "^2.0.2", "estree-walker": "^2.0.2",
"magic-string": "^0.30.21", "magic-string": "^0.30.21",
"postcss": "^8.5.6", "postcss": "^8.5.6",
...@@ -560,13 +560,13 @@ ...@@ -560,13 +560,13 @@
} }
}, },
"node_modules/@vue/compiler-ssr": { "node_modules/@vue/compiler-ssr": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz",
"integrity": "sha512-trOvMWNBMQ/odMRHW7Ae1CdfYx+7MuiQu62Jtu36gMLXcaoqKvAyh+P73sYG9ll+6jLB6QPovqoKGGZROzkFFg==", "integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.5.24", "@vue/compiler-dom": "3.5.26",
"@vue/shared": "3.5.24" "@vue/shared": "3.5.26"
} }
}, },
"node_modules/@vue/devtools-api": { "node_modules/@vue/devtools-api": {
...@@ -576,53 +576,53 @@ ...@@ -576,53 +576,53 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@vue/reactivity": { "node_modules/@vue/reactivity": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz",
"integrity": "sha512-BM8kBhtlkkbnyl4q+HiF5R5BL0ycDPfihowulm02q3WYp2vxgPcJuZO866qa/0u3idbMntKEtVNuAUp5bw4teg==", "integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/shared": "3.5.24" "@vue/shared": "3.5.26"
} }
}, },
"node_modules/@vue/runtime-core": { "node_modules/@vue/runtime-core": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz",
"integrity": "sha512-RYP/byyKDgNIqfX/gNb2PB55dJmM97jc9wyF3jK7QUInYKypK2exmZMNwnjueWwGceEkP6NChd3D2ZVEp9undQ==", "integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/reactivity": "3.5.24", "@vue/reactivity": "3.5.26",
"@vue/shared": "3.5.24" "@vue/shared": "3.5.26"
} }
}, },
"node_modules/@vue/runtime-dom": { "node_modules/@vue/runtime-dom": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz",
"integrity": "sha512-Z8ANhr/i0XIluonHVjbUkjvn+CyrxbXRIxR7wn7+X7xlcb7dJsfITZbkVOeJZdP8VZwfrWRsWdShH6pngMxRjw==", "integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/reactivity": "3.5.24", "@vue/reactivity": "3.5.26",
"@vue/runtime-core": "3.5.24", "@vue/runtime-core": "3.5.26",
"@vue/shared": "3.5.24", "@vue/shared": "3.5.26",
"csstype": "^3.1.3" "csstype": "^3.2.3"
} }
}, },
"node_modules/@vue/server-renderer": { "node_modules/@vue/server-renderer": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz",
"integrity": "sha512-Yh2j2Y4G/0/4z/xJ1Bad4mxaAk++C2v4kaa8oSYTMJBJ00/ndPuxCnWeot0/7/qafQFLh5pr6xeV6SdMcE/G1w==", "integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-ssr": "3.5.24", "@vue/compiler-ssr": "3.5.26",
"@vue/shared": "3.5.24" "@vue/shared": "3.5.26"
}, },
"peerDependencies": { "peerDependencies": {
"vue": "3.5.24" "vue": "3.5.26"
} }
}, },
"node_modules/@vue/shared": { "node_modules/@vue/shared": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz",
"integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", "integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/ant-design-vue": { "node_modules/ant-design-vue": {
...@@ -802,9 +802,9 @@ ...@@ -802,9 +802,9 @@
} }
}, },
"node_modules/entities": { "node_modules/entities": {
"version": "4.5.0", "version": "7.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==",
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"engines": { "engines": {
"node": ">=0.12" "node": ">=0.12"
...@@ -1129,10 +1129,11 @@ ...@@ -1129,10 +1129,11 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/less": { "node_modules/less": {
"version": "4.4.2", "version": "4.5.1",
"resolved": "https://registry.npmjs.org/less/-/less-4.4.2.tgz", "resolved": "https://registry.npmjs.org/less/-/less-4.5.1.tgz",
"integrity": "sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==", "integrity": "sha512-UKgI3/KON4u6ngSsnDADsUERqhZknsVZbnuzlRZXLQCmfC/MDld42fTydUE9B+Mla1AL6SJ/Pp6SlEFi/AVGfw==",
"dev": true, "dev": true,
"hasInstallScript": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"dependencies": { "dependencies": {
"copy-anything": "^2.0.1", "copy-anything": "^2.0.1",
...@@ -1162,9 +1163,9 @@ ...@@ -1162,9 +1163,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/lodash-es": { "node_modules/lodash-es": {
"version": "4.17.21", "version": "4.17.22",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/loose-envify": { "node_modules/loose-envify": {
...@@ -1506,16 +1507,16 @@ ...@@ -1506,16 +1507,16 @@
} }
}, },
"node_modules/vue": { "node_modules/vue": {
"version": "3.5.24", "version": "3.5.26",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.24.tgz", "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
"integrity": "sha512-uTHDOpVQTMjcGgrqFPSb8iO2m1DUvo+WbGqoXQz8Y1CeBYQ0FXf2z1gLRaBtHjlRz7zZUBHxjVB5VTLzYkvftg==", "integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/compiler-dom": "3.5.24", "@vue/compiler-dom": "3.5.26",
"@vue/compiler-sfc": "3.5.24", "@vue/compiler-sfc": "3.5.26",
"@vue/runtime-dom": "3.5.24", "@vue/runtime-dom": "3.5.26",
"@vue/server-renderer": "3.5.24", "@vue/server-renderer": "3.5.26",
"@vue/shared": "3.5.24" "@vue/shared": "3.5.26"
}, },
"peerDependencies": { "peerDependencies": {
"typescript": "*" "typescript": "*"
...@@ -1527,9 +1528,9 @@ ...@@ -1527,9 +1528,9 @@
} }
}, },
"node_modules/vue-router": { "node_modules/vue-router": {
"version": "4.6.3", "version": "4.6.4",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.3.tgz", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz",
"integrity": "sha512-ARBedLm9YlbvQomnmq91Os7ck6efydTSpRP3nuOKCvgJOHNrhRoJDSKtee8kcL1Vf7nz6U+PMBL+hTvR3bTVQg==", "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@vue/devtools-api": "^6.6.4" "@vue/devtools-api": "^6.6.4"
......
...@@ -947,7 +947,10 @@ li { ...@@ -947,7 +947,10 @@ li {
font-weight: 500; font-weight: 500;
line-height: 1.4; line-height: 1.4;
} }
.message-inner-box:has(.message-tips) + .message-inner-box :deep(.message-markdown) {
margin: -1px 0 8px ;
border-radius: 0 0 8px 8px;
}
// ============================================= // =============================================
// Markdown消息样式 // Markdown消息样式
// ============================================= // =============================================
...@@ -955,11 +958,11 @@ li { ...@@ -955,11 +958,11 @@ li {
:deep(.message-markdown) { :deep(.message-markdown) {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
margin: -1px 0 8px; margin:8px 0;
border-radius: 0 0 8px 8px; border-radius:8px;
background-color: @white; background-color: @white;
border: 1px solid @blue-light-3; border: 1px solid @blue-light-3;
border-top: none; border-top: 1px solid @blue-light-3;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
overflow: hidden; overflow: hidden;
......
...@@ -424,9 +424,8 @@ export class ContentTemplateService { ...@@ -424,9 +424,8 @@ export class ContentTemplateService {
// 计算思考用时 // 计算思考用时
const thinkingTime = this.thinkingStartTime ? Math.round((Date.now() - this.thinkingStartTime) / 1000) : 0; const thinkingTime = this.thinkingStartTime ? Math.round((Date.now() - this.thinkingStartTime) / 1000) : 0;
// const thinkingTimeText = thinkingTime > 0 ? `已完成思考 (用时:${thinkingTime}s)` : ''; // 对于历史数据,直接显示"已完成思考",不显示具体用时
const thinkingTimeText = thinkingTime > 0 ? `已完成思考` : ''; const thinkingTimeText = isHistoryData ? '已完成思考' : (thinkingTime > 0 ? '已完成思考' : '');
updatedResponse.contentBlocks[updatedBlockIndex].thinkContent = currentThinkContent; updatedResponse.contentBlocks[updatedBlockIndex].thinkContent = currentThinkContent;
// 添加思考时长信息到内容块中,供前端模板使用 // 添加思考时长信息到内容块中,供前端模板使用
......
...@@ -651,7 +651,14 @@ export const processStreamingMarkdown = (text: string): string => { ...@@ -651,7 +651,14 @@ export const processStreamingMarkdown = (text: string): string => {
// 清理危险的HTML标签,防止XSS攻击,但保留图片和必要的容器标签 // 清理危险的HTML标签,防止XSS攻击,但保留图片和必要的容器标签
text = text.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, ''); text = text.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '');
// 移除其他危险标签,但保留img、div、span等安全标签 // 移除其他危险标签,但保留img、div、span等安全标签
text = text.replace(/<(?!\/?(img|div|span|p|br|ol|ul|li|table|tr|td|th|blockquote|pre|code|strong|em|a|h[1-6])(\s+[^>]*)?>)[^>]*>/gi, ''); text = text.replace(/<(?!\/?)(img|div|span|p|br|ol|ul|li|table|tr|td|th|blockquote|pre|code|strong|em|a|h[1-6])(\s+[^>]*)?>/gi, '');
// 首先检查文本中是否包含图片,如果有图片,优先处理图片
const imageMatch = text.match(/!\[([^\]]*)\]\(([^\)]+)\)/);
if (imageMatch) {
// 如果文本包含图片,直接使用完整的Markdown解析器处理
return parseMarkdown(text);
}
// 使用流式列表处理器处理文本 // 使用流式列表处理器处理文本
const listResult = streamingListProcessor.processText(text); const listResult = streamingListProcessor.processText(text);
...@@ -668,7 +675,10 @@ export const processStreamingMarkdown = (text: string): string => { ...@@ -668,7 +675,10 @@ export const processStreamingMarkdown = (text: string): string => {
if (remainingText && !isListItem(remainingText)) { if (remainingText && !isListItem(remainingText)) {
// 有剩余的非列表内容(如图片),需要继续处理 // 有剩余的非列表内容(如图片),需要继续处理
const remainingResult = parseMarkdown(remainingText); const remainingResult = parseMarkdown(remainingText);
return listResult + remainingResult; // 将列表和剩余内容合并,然后统一处理
const combinedContent = listResult + remainingResult;
// 重新解析合并后的内容,确保所有内容都在正确的容器中
return combinedContent;
} }
return listResult; return listResult;
} }
...@@ -684,7 +694,7 @@ export const processStreamingMarkdown = (text: string): string => { ...@@ -684,7 +694,7 @@ export const processStreamingMarkdown = (text: string): string => {
// 如果表格处理器返回了完整表格,需要确保表格内容中的Markdown格式也被处理 // 如果表格处理器返回了完整表格,需要确保表格内容中的Markdown格式也被处理
if (tableResult.includes('<table')) { if (tableResult.includes('<table')) {
// 对表格内容进行Markdown格式处理 // 对表格内容进行Markdown格式处理
return processMarkdownFormat(tableResult); return tableResult;
} }
// 否则,处理其他Markdown语法 // 否则,处理其他Markdown语法
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment