|
|
@@ -18,7 +18,11 @@ const md = new MarkdownIt({
|
|
|
})
|
|
|
|
|
|
const renderedMessage = (content) => {
|
|
|
- return md.render(content)
|
|
|
+ const normalized = content
|
|
|
+ .replace(/\\n/g, '\n') // 粘贴带来的 \\n 处理
|
|
|
+ .replace(/\r\n/g, '\n') // Windows 换行标准化
|
|
|
+ .trim()
|
|
|
+ return md.render(normalized)
|
|
|
}
|
|
|
|
|
|
const themeStore = useThemeStore()
|
|
|
@@ -57,7 +61,8 @@ const messages = ref<MessageItem[]>([
|
|
|
},
|
|
|
{
|
|
|
type: 'user',
|
|
|
- content: 'Hi! I am your Freight Assistant. How can I help you?'
|
|
|
+ content:
|
|
|
+ 'Hi! I am your Freight Assistant. How can I help you?Of course! Please provide me with the details of your shipment.Of course! Please provide me with the details of your shipment.'
|
|
|
},
|
|
|
{
|
|
|
type: 'robot',
|
|
|
@@ -68,7 +73,8 @@ const messages = ref<MessageItem[]>([
|
|
|
},
|
|
|
{
|
|
|
type: 'user',
|
|
|
- content: 'Of course! Please provide me with the details of your shipment.'
|
|
|
+ content:
|
|
|
+ 'Of course! Please provide me with the details of your shipment.Of course! Please provide me with the details of your shipment.'
|
|
|
}
|
|
|
])
|
|
|
messages.value = JSON.parse(sessionStorage.getItem('AIChat')) || messages.value
|
|
|
@@ -177,15 +183,7 @@ function scrollToBottom() {
|
|
|
|
|
|
const simulateStreamingMarkdown = () => {
|
|
|
loadingAnswer.value = true
|
|
|
- const chunks = [
|
|
|
- '# 欢迎使用这是一个用于测试的 Markdown 文本 Markdown\n\n',
|
|
|
- '这是一个用于测试的这是一个用于测试的 Markdown 文本 **Markdown** 文本。\n\n',
|
|
|
- '你可以使用这是一个用于测试的 Markdown 文本 *斜体* 来强调重点。\n\n',
|
|
|
- '也可以使用这是一个用于测试的 Markdown 文本 [链接](https://example.com) 引导用户跳转。\n\n',
|
|
|
- '- 支持无这是一个用于测试的 Markdown 文本这是一个用于测试的 Markdown 文本序列表\n',
|
|
|
- '- 非常适合这是一个用于测试的 Markdown 文本这是一个用于测试的 Markdown 文本这是一个用于测试的 Markdown 文本逐行流式显示\n\n',
|
|
|
- '这是一段这是一个用于测试的 Markdown 文本这是一个用于测试的 Markdown 文本这是一个用于测试的 Markdown 文本测试!\n'
|
|
|
- ]
|
|
|
+ const chunks: any = [userQuestion.value]
|
|
|
|
|
|
messages.value.push({
|
|
|
type: 'robot',
|
|
|
@@ -211,6 +209,7 @@ const simulateStreamingMarkdown = () => {
|
|
|
}
|
|
|
} else {
|
|
|
clearInterval(interval)
|
|
|
+ userQuestion.value = ''
|
|
|
}
|
|
|
}, 200) // 每500ms追加一段
|
|
|
}
|
|
|
@@ -271,6 +270,9 @@ defineExpose({
|
|
|
? 'query-style'
|
|
|
: ''
|
|
|
]"
|
|
|
+ :style="{
|
|
|
+ maxWidth: modalSize === 'large' ? 'calc(100% - 20px)' : 'calc(100% - 16px)'
|
|
|
+ }"
|
|
|
v-for="(msg, index) in messages"
|
|
|
:key="index"
|
|
|
@mouseenter="msg.isShowFeedback = true"
|
|
|
@@ -287,8 +289,8 @@ defineExpose({
|
|
|
src="./image/icon_loading.png"
|
|
|
alt=""
|
|
|
/>
|
|
|
- <span v-if="!msg.isAnswer">{{ msg.content }}</span>
|
|
|
- <div v-else>
|
|
|
+ <!-- <span v-if="!msg.isAnswer">{{ msg.content }}</span> -->
|
|
|
+ <div>
|
|
|
<div v-html="renderedMessage(msg.content)" class="markdown-body"></div>
|
|
|
<LoadingDots
|
|
|
v-if="index === messages.length - 1 && msg.isAnswer && loadingAnswer"
|
|
|
@@ -520,9 +522,7 @@ defineExpose({
|
|
|
margin-right: 4px;
|
|
|
animation: loading-rotate 2s linear infinite;
|
|
|
}
|
|
|
- .markdown-body {
|
|
|
- background: transparent;
|
|
|
- }
|
|
|
+
|
|
|
.pause-btn {
|
|
|
position: absolute;
|
|
|
right: -22px;
|