feat(AI): 优化聊天组件并添加新功能

- 移除 request 和 response 拦截器中的 console.log 语句- 优化消息组件样式和逻辑,支持渐进式消息显示- 更新 TabBox 组件,支持动态列表数据
- 重构 treasureBox 组件,展示产品详情和知识库
- 优化 AI聊天流程,支持流式响应和消息动画
- 添加 markdown 渲染支持,包括数学公式和流程图
This commit is contained in:
陈昱达
2025-06-05 16:39:45 +08:00
parent 979fde4c85
commit 15ddd03c7a
8 changed files with 3296 additions and 2110 deletions

View File

@@ -1,12 +1,12 @@
<template>
<section>
<div v-for="(message, index) in messagesList" :key="index" class="message-item">
<div v-for="(message, index) in messagesList" :key="index" class="message-item ">
<!--用户消息-->
<div v-if="message.type === 'user'" class="user-message">
<div v-if="message.type === 'user'" class="user-message mb10">
<p>{{ message.text }}</p>
</div>
<!--机器人消息-->
<div v-else-if="message.type === 'bot'" class="bot-message">
<div v-else-if="message.type === 'bot'" class="bot-message mb10">
<span v-if="message.isThink">
<!-- loading-->
<span class="speakLoadingToast pv10">
@@ -18,18 +18,18 @@
<p v-html="md.render(message.think)" v-if="message.think && message.showThink" class="thinkText" />
</span>
<div>
<p v-html="md.render(message.text)" v-if="message.text"></p>
<span class="speakLoadingToast pv10" v-else>
<p v-html="md.render(message.text)" v-if="message.text "></p>
<span class="speakLoadingToast pv10" v-else-if='!message.text && !thinkOk'>
<van-loading type="spinner" color="#2e5ca9" size="20px" v-if="!message.text" />
</span>
</div>
</div>
<!--百宝箱-->
<div v-else>
<div v-else class='mb10'>
<treasure-box :item="message"></treasure-box>
</div>
<!-- 新增点赞和踩按钮 -->
<div class="reaction-buttons" v-if="message.type !== 'user'">
<div class="reaction-buttons mb10" v-if="message.type !== 'user'">
<button @click="handleReaction(message, 'like')" class="like">
<svg-icon :icon-class="message.isLike ? 'fillLike' : 'like'" class-name="chat-icon"></svg-icon> 有用
</button>
@@ -47,16 +47,12 @@ import { Icon } from 'vant'
import TreasureBox from '@/views/AI/components/treasureBox.vue'
import MarkdownIt from 'markdown-it'
import markdownItKatex from 'markdown-it-katex'
// import mermaidItMarkdown from 'mermaid-it-markdown'
console.log(mermaidItMarkdown)
const md = new MarkdownIt({
html: true,
linkify: true,
typographer: true,
})
.use(markdownItKatex)
// .use(mermaidItMarkdown)
export default {
name: 'message',
components: { TreasureBox, [Icon.name]: Icon },
@@ -65,6 +61,10 @@ export default {
type: Array,
default: () => [],
},
thinkOk: {
type: Boolean,
default: false,
},
isDeep: {
type: Boolean,
default: false,
@@ -133,6 +133,8 @@ $primary-trans-color: rgba(135, 162, 208, 0.5); // 使用rgba定义颜色
.user-message {
justify-content: end;
max-width: 80%;
margin-left: 20%;
}
.bot-message {
justify-content: start;