实现 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 学习计划,包含标题、列表、代码块
  • 回复会带标题、列表、代码块样式
  • 每次新消息或流式更新时,聊天框会自动滚到底部
相关推荐
计算机魔术师2 分钟前
AMD砸82亿买下李飞飞,这次不卖芯片卖什么?
前端
火山引擎开发者社区5 分钟前
AgentKit 模型网关上手指南|告别多模型管理混乱
人工智能
智联视频超融合平台9 分钟前
WebRTC + AI:实时音视频中嵌入神经网络推理的架构设计
人工智能·webrtc·实时音视频
AIGC小尼10 分钟前
MiniMax-H3 8G 显存 AI 漫剧进阶实战|ComfyUI 命令行调参、角色锁定与 FFmpeg 批量脚本全解析
人工智能·ffmpeg·comfyui·ai漫剧
悟天特斯13 分钟前
边缘计算赋能楼宇智能化:云边协同的实时闭环与自治架构
人工智能·架构·边缘计算
码农幻想梦19 分钟前
深度学习与神经网络(二)
人工智能·深度学习·神经网络
霸道流氓气质29 分钟前
ComfyUI 图像生成工作流完全指南:从节点编排到Java生产级图像生产实战
java·开发语言·人工智能
幂律智能33 分钟前
海外业务不同,合同系统该怎么建?
大数据·人工智能
hzxpaipai43 分钟前
杭州企业官网怎么建设?从策划到上线的5步建站方法
运维·服务器·前端·网络
怕浪猫1 小时前
2026年金九银十,我面了22个前端
前端·javascript·面试