实现 AI 回复支持 Markdown 渲染

新增功能:

  • 消息自动滚动到底部
  • AI 回复支持 Markdown 渲染

1)web安装依赖

复制代码
npm install marked dompurify

2) web/src/App.vue

javascript 复制代码
import { computed, ref, watch, onMounted, nextTick } from 'vue'
import { marked } from 'marked'
import DOMPurify from 'dompurify'

新增状态

csharp 复制代码
const chatBoxRef = ref(null)

新增方法

ini 复制代码
const renderMarkdown = content => {
  const rawHtml = marked.parse(content || '')
  return DOMPurify.sanitize(rawHtml)
}

const scrollToBottom = async () => {
  await nextTick()
  if (chatBoxRef.value) {
    chatBoxRef.value.scrollTop = chatBoxRef.value.scrollHeight
  }
}

新增监听

scss 复制代码
watch(
  () => currentMessages.value.length,
  () => {
    scrollToBottom()
  }
)
scss 复制代码
watch(
  () => currentMessages.value[currentMessages.value.length - 1]?.content,
  () => {
    scrollToBottom()
  }
)

onMounted

scss 复制代码
onMounted(() => {
  fetchMemories()
  scrollToBottom()
})

聊天框节点

ini 复制代码
<div ref="chatBoxRef" class="chat-box">
  <div
    v-for="(item, index) in currentMessages"
    :key="index"
    :class="['msg', item.role]"
  >
    <div class="role">
      {{
        item.role === 'user'
          ? '我'
          : item.role === 'assistant'
          ? 'AI'
          : 'system'
      }}
    </div>

    <div v-if="item.role === 'assistant'" class="content markdown-body" v-html="renderMarkdown(item.content)" />
    <div v-else class="content">{{ item.content }}</div>
  </div>

  <div v-if="loading" class="msg assistant">
    <div class="role">AI</div>
    <div class="content">思考中...</div>
  </div>
</div>

补充样式

css 复制代码
.markdown-body :deep(p) {
  margin: 0 0 8px;
}

.markdown-body :deep(pre) {
  background: #111827;
  color: #f9fafb;
  padding: 12px;
  border-radius: 10px;
  overflow-x: auto;
  margin: 8px 0;
}

.markdown-body :deep(code) {
  background: rgba(0, 0, 0, 0.06);
  padding: 2px 6px;
  border-radius: 6px;
  font-size: 13px;
}

.markdown-body :deep(pre code) {
  background: transparent;
  padding: 0;
}

.markdown-body :deep(ul),
.markdown-body :deep(ol) {
  padding-left: 20px;
  margin: 8px 0;
}

.markdown-body :deep(h1),
.markdown-body :deep(h2),
.markdown-body :deep(h3),
.markdown-body :deep(h4) {
  margin: 10px 0 8px;
  font-size: 16px;
}

.markdown-body :deep(blockquote) {
  margin: 8px 0;
  padding-left: 12px;
  border-left: 4px solid #d1d5db;
  color: #4b5563;
}

.markdown-body :deep(table) {
  border-collapse: collapse;
  width: 100%;
  margin: 8px 0;
}

.markdown-body :deep(th),
.markdown-body :deep(td) {
  border: 1px solid #e5e7eb;
  padding: 8px;
  text-align: left;
}

3)验证

比如输入这个内容:

复制代码
请用 markdown 格式给我一份 Vue3 学习计划,包含标题、列表、代码块
  • 回复会带标题、列表、代码块样式
  • 每次新消息或流式更新时,聊天框会自动滚到底部
相关推荐
cxr82818 小时前
高分子复合材料 AI 逆向设计合——学证明、算法实现、验证数据与学术资源全集
人工智能·线性代数·算法
m0_7381207218 小时前
渗透测试基础——黑盒测试下的Web漏洞挖掘与利用解析(二)
服务器·前端·python·网络协议·安全·网络安全
weixin_4296302618 小时前
3.50 WebARNav:边缘辅助视觉定位的移动Web AR室内导航
前端·ar
无心水18 小时前
【Harness:落地实战】19、从67%到92%:Hermes学习循环与GEPA算法如何实现AI自进化?——自进化核心引擎深度解析
人工智能·性能优化·openclaw·harness·hermes·honcho
huan19911018 小时前
从机器翻译到智驾:规则派的黄昏与数据革命的终局 (七)
人工智能·自然语言处理·机器翻译
想你依然心痛18 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“图谱智脑“——PC端AI智能体沉浸式知识图谱构建工作台
人工智能·ar·知识图谱·harmonyos·智能体
仔仔 v1.018 小时前
第四章: AI图像生成与视频制作实战指南
人工智能
ZengLiangYi18 小时前
如何解析 5 种完全不同格式的 AI 对话
javascript·人工智能·算法
写做四月一日的四月一日18 小时前
在安卓手机上安装小龙虾openclaw并配置QQ机器人接入
android·人工智能
yivifu18 小时前
CSS 自动级联编号有序列表完全指南
前端·css·c#·html·有序列表·级联编号