实现 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 学习计划,包含标题、列表、代码块
  • 回复会带标题、列表、代码块样式
  • 每次新消息或流式更新时,聊天框会自动滚到底部
相关推荐
冬奇Lab14 小时前
一天一个开源项目(第98篇):UI-TARS-Desktop - 字节跳动开源的多模态 GUI 代理栈
人工智能·开源·资讯
青岛前景互联信息技术有限公司14 小时前
OpenClaw 重构智慧消防:AI时代的平台融合实践
大数据·人工智能
之歆14 小时前
DAY_21JavaScript 深度解析:数组(Array)与函数(Function)(一)
前端·javascript
梦梦代码精14 小时前
BuildingAI 上部署自定义工作流智能体:5 个实用技巧
大数据·人工智能·算法·开源软件
XinZong14 小时前
【AI社交】基于OpenClaw自研轻量化AI社交平台实战
前端
极客老王说Agent15 小时前
2026智造前瞻:实在Agent生产排期智能助理核心功能与使用方法详解
大数据·人工智能·ai·chatgpt
Mr_pyx15 小时前
Spring AI 入门教程:Java开发者的AI应用捷径
java·人工智能·spring
巫山老妖15 小时前
鹅厂十年:三段式技术成长复盘
android·人工智能·程序员
aircrushin15 小时前
英伟达份额从95%跌到0,DeepSeek V4选择国产芯片
人工智能