文章目录

前言
博主介绍:✌目前全网粉丝4W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。
涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。
博主所有博客文件目录索引:博客目录索引(持续更新)
CSDN搜索:长路
视频平台:b站-Coder长路
问题背景
ai对话框页面的实现在进行ai回复消息的时候,你会发现没有换行情况,问题的描述是让其生成符合要求的的json文件,但是ai返回的内容页面上展示为没有换行:

我点击复制,得到的内容如下:
{
"title": "",
"tags": "Milvus,Docker Compose,向量数据库,Attu可视化,镜像加速",
"categories": "数据库,容器化,AI工具",
"articleSummary": "保姆级教程教你用 Docker Compose 一键部署 Milvus 2.5.9 向量数据库,含镜像加速、密码配置、Attu 可视化工具安装与 Web UI 访问,全程命令复制即用,轻松搭建高性能 RAG 存储后端。"
}
实际又是有换行的,这个到底是什么问题?
问题分析
我们的chat接口是事件机制响应内容的,本次chat的事件返回内容如下:
data:{"content":"{\n","event":"resp","isFinish":false,"type":"text"}
data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"title","event":"resp","isFinish":false,"type":"text"}
data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"\",\n","event":"resp","isFinish":false,"type":"text"}
data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"tags","event":"resp","isFinish":false,"type":"text"}
data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Mil","event":"resp","isFinish":false,"type":"text"}
data:{"content":"vus","event":"resp","isFinish":false,"type":"text"}
data:{"content":"向量","event":"resp","isFinish":false,"type":"text"}
data:{"content":"数据库","event":"resp","isFinish":false,"type":"text"}
data:{"content":",D","event":"resp","isFinish":false,"type":"text"}
data:{"content":"ocker","event":"resp","isFinish":false,"type":"text"}
data:{"content":"安装","event":"resp","isFinish":false,"type":"text"}
data:{"content":",","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Att","event":"resp","isFinish":false,"type":"text"}
data:{"content":"u","event":"resp","isFinish":false,"type":"text"}
data:{"content":"可视化","event":"resp","isFinish":false,"type":"text"}
data:{"content":"工具","event":"resp","isFinish":false,"type":"text"}
data:{"content":",","event":"resp","isFinish":false,"type":"text"}
data:{"content":"镜像","event":"resp","isFinish":false,"type":"text"}
data:{"content":"加速","event":"resp","isFinish":false,"type":"text"}
data:{"content":",D","event":"resp","isFinish":false,"type":"text"}
data:{"content":"ocker","event":"resp","isFinish":false,"type":"text"}
data:{"content":" Compose","event":"resp","isFinish":false,"type":"text"}
data:{"content":"\",\n","event":"resp","isFinish":false,"type":"text"}
data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"categories","event":"resp","isFinish":false,"type":"text"}
data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"向量","event":"resp","isFinish":false,"type":"text"}
data:{"content":"数据库","event":"resp","isFinish":false,"type":"text"}
data:{"content":",D","event":"resp","isFinish":false,"type":"text"}
data:{"content":"ocker","event":"resp","isFinish":false,"type":"text"}
data:{"content":"容器","event":"resp","isFinish":false,"type":"text"}
data:{"content":",","event":"resp","isFinish":false,"type":"text"}
data:{"content":"AI","event":"resp","isFinish":false,"type":"text"}
data:{"content":"工具","event":"resp","isFinish":false,"type":"text"}
data:{"content":"\",\n","event":"resp","isFinish":false,"type":"text"}
data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"article","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Summary","event":"resp","isFinish":false,"type":"text"}
data:{"content":"\":","event":"resp","isFinish":false,"type":"text"}
data:{"content":" \"","event":"resp","isFinish":false,"type":"text"}
data:{"content":"本文","event":"resp","isFinish":false,"type":"text"}
data:{"content":"手把手","event":"resp","isFinish":false,"type":"text"}
data:{"content":"教你","event":"resp","isFinish":false,"type":"text"}
data:{"content":"用","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Docker","event":"resp","isFinish":false,"type":"text"}
data:{"content":" Compose","event":"resp","isFinish":false,"type":"text"}
data:{"content":"在","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Linux","event":"resp","isFinish":false,"type":"text"}
data:{"content":"/Mac","event":"resp","isFinish":false,"type":"text"}
data:{"content":"上","event":"resp","isFinish":false,"type":"text"}
data:{"content":"极速","event":"resp","isFinish":false,"type":"text"}
data:{"content":"部署","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Mil","event":"resp","isFinish":false,"type":"text"}
data:{"content":"vus","event":"resp","isFinish":false,"type":"text"}
data:{"content":" ","event":"resp","isFinish":false,"type":"text"}
data:{"content":"2","event":"resp","isFinish":false,"type":"text"}
data:{"content":".","event":"resp","isFinish":false,"type":"text"}
data:{"content":"5","event":"resp","isFinish":false,"type":"text"}
data:{"content":".","event":"resp","isFinish":false,"type":"text"}
data:{"content":"9","event":"resp","isFinish":false,"type":"text"}
data:{"content":"向量","event":"resp","isFinish":false,"type":"text"}
data:{"content":"数据库","event":"resp","isFinish":false,"type":"text"}
data:{"content":",","event":"resp","isFinish":false,"type":"text"}
data:{"content":"含","event":"resp","isFinish":false,"type":"text"}
data:{"content":"镜像","event":"resp","isFinish":false,"type":"text"}
data:{"content":"加速","event":"resp","isFinish":false,"type":"text"}
data:{"content":"、","event":"resp","isFinish":false,"type":"text"}
data:{"content":"密码","event":"resp","isFinish":false,"type":"text"}
data:{"content":"配置","event":"resp","isFinish":false,"type":"text"}
data:{"content":"、","event":"resp","isFinish":false,"type":"text"}
data:{"content":"Att","event":"resp","isFinish":false,"type":"text"}
data:{"content":"u","event":"resp","isFinish":false,"type":"text"}
data:{"content":"可视化","event":"resp","isFinish":false,"type":"text"}
data:{"content":"连接","event":"resp","isFinish":false,"type":"text"}
data:{"content":"及","event":"resp","isFinish":false,"type":"text"}
data:{"content":"常见","event":"resp","isFinish":false,"type":"text"}
data:{"content":"坑","event":"resp","isFinish":false,"type":"text"}
data:{"content":"解决","event":"resp","isFinish":false,"type":"text"}
data:{"content":",","event":"resp","isFinish":false,"type":"text"}
data:{"content":"一站式","event":"resp","isFinish":false,"type":"text"}
data:{"content":"搞定","event":"resp","isFinish":false,"type":"text"}
data:{"content":"生产","event":"resp","isFinish":false,"type":"text"}
data:{"content":"级","event":"resp","isFinish":false,"type":"text"}
data:{"content":"R","event":"resp","isFinish":false,"type":"text"}
data:{"content":"AG","event":"resp","isFinish":false,"type":"text"}
data:{"content":"底座","event":"resp","isFinish":false,"type":"text"}
data:{"content":"。\"\n","event":"resp","isFinish":false,"type":"text"}
data:{"content":"}","event":"resp","isFinish":false,"type":"text"}
data:{"event":"resp","isFinish":true,"type":"text"}
你会发现其实其中是有\n的,那为什么页面上的展示没有展示换行效果呢?
对于页面上内容为一个message框,这个实际上是使用的markdown渲染器来实现的可视化:

本质问题原因为markdown渲染情况下,如果是一个\n 是不会显示出换行来的,对于本地的typora、语雀之类的,实际应该是做了兼容,理论需要两个\n\n即可实现换行。
解决思路实现
1)页面渲染展示部分
每次将ai返回的片段部分内容进行替换\n为\n\n即可实现:

2)页面复制功能优化
需要将\n\n去替换为一个\n即可!

实际就是复制给用户只需要一个\n即可。
测试效果

资料获取
大家点赞、收藏、关注、评论啦~
精彩专栏推荐订阅:在下方专栏👇🏻
- 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
- 开源项目Studio-Vue---校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
- 学习与生活-专栏:可以了解博主的学习历程
- 算法专栏:算法收录
更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅