实现 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 学习计划,包含标题、列表、代码块
  • 回复会带标题、列表、代码块样式
  • 每次新消息或流式更新时,聊天框会自动滚到底部
相关推荐
Navicat中国14 分钟前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI36 分钟前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区1 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
知了学历孙老师2 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
XCDoris3 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy3 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V3 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI3 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技3 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据3 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化