原创新作vue3.5+deepseek+vant4+vant4仿DeepSeek-R1流式输出ai聊天对话。

deepseek-vue3-chat : 实战2025智能大模型ai会话,基于Vue3+Vite6+OpenAI集成接入DeepSeek聊天小助手模板,支持流式打字输出效果、浅色/暗黑主题模式、代码高亮显示、针对移动端+PC端适配处理。

使用技术

  • 开发工具:VScode
  • 技术框架:Vite^6.2.0+Vue^3.5.13+vue-router^4.5.0
  • 大模型框架:DeepSeek-R1 + OpenAI
  • UI组件库:Vant^4.9.17 (有赞vue3移动端组件库)
  • 状态管理:pinia^3.0.1
  • 高亮插件:highlight.js^11.11.1
  • markdown解析:markdown-it
  • 本地缓存:pinia-plugin-persistedstate^4.2.0

项目特性

  1. Vue3+DeepSeek实现流式打字输出效果
  2. 基于Vue3构建,集成DeepSeek,性能更优,对话丝滑流畅
  3. 支持各种代码高亮,方便展示和分享代码片段
  4. 使用vant4组件库,风格统一,时尚大气
  5. 支持移动端+PC端750px像素适配,大屏也有良好体验

️项目结构目录

vue3-deepseek使用 vite6.x 构建项目模板,采用 vue3 setup 语法编码开发。

vue3-deepseek聊天ai对话项目已经同步到我的作品集,感谢大家的鼓励与支持!

vue3+vite6+deepseek+vant4流式聊天AI对话模板

环境变量配置.env

# title
VITE_APP_TITLE = 'Vue3-DeepSeek-Chat' # port 默认http://localhost:5173/
VITE_PORT = 3001 # 运行时自动打开浏览器
VITE_OPEN = true # 开启https
VITE_HTTPS = false # 是否删除生产环境 console
VITE_DROP_CONSOLE = true # DeepSeek API配置
# VITE_DEEPSEEK_API_KEY = 替换为你的 API Key
VITE_DEEPSEEK_BASE_URL = https://api.deepseek.com

入口文件配置main.js

import { createApp } from 'vue'
import './style.scss'
import App from './App.vue' // 引入路由/状态管理
import Router from './router'
import Pinia from './pinia' import Plugins from './plugins' const app = createApp(App) app
.use(Router)
.use(Pinia)
.use(Plugins)
.mount('#app')

布局模板

如上图:页面整体分为顶部导航条+聊天对话区+底部编辑器三个部分。

<template>
<div class="flexbox flex-col" style="height:100%;">
<Toolbar :title="chatSession?.title" /> <div class="v3ai__scrollview flex1">
<!-- Chat对话 -->
<div v-if="chatSession && !isEmpty(chatSession.data)" class="v3ai__chatbot" ref="scrollRef" @scroll="onScroll">
<div class="v3ai__chatbot-sessions">
...
</div>
<!-- 滚动底部 -->
<div class="v3ai__scrollbottom flex-c" :class="{'is-bottom': reachBottom}" @click="scrollToBottom"><i class="iconfont ai-arrD"></i></div>
</div>
<!-- 导语 -->
<div v-else class="v3ai__chatbot-intro">
<i class="logo iconfont ai-deepseek"></i>
<h3 class="name"><span class="txt text-gradient">嗨~ Vue3-DeepSeek</span></h3>
<p class="desc">你身边的智能小帮手,我可以帮你搜索、答疑、写作,请把你的任务交给我吧~</p>
<div class="prompt">
<p class="tip flex-c"><span class="flex1">你可以这样问</span><span class="flex-c" @click="refreshPrompt">换一换<i class="iconfont ai-shuaxin"></i></span></p>
<ul class="list">
<li v-for="(item,index) in promptList" :key="index">
<div class="txt" @click="changePrompt(item.prompt)">{{item.emoji}} {{item.prompt}}</div>
</li>
</ul>
</div>
</div>
</div> <!-- 编辑器 -->
<ChatEditor ref="editorRef" :value="promptValue" :reachBottom="reachBottom" :scrollBottom="scrollToBottom" />
</div>
</template>

路由配置

/**
* 路由配置
* @author andy
*/ import { createRouter, createWebHashHistory } from 'vue-router'
import { appStore } from '@/pinia/modules/app' // 批量导入modules路由
const modules = import.meta.glob('./modules/*.js', { eager: true })
const patchRoutes = Object.keys(modules).map(key => modules[key].default).flat() const routes = [
// 错误模块
{
path: '/:pathMatch(.*)*',
component: () => import('@views/error/404.vue'),
meta: {
title: '404 error'
}
},
...patchRoutes
] const router = createRouter({
history: createWebHashHistory(),
routes
}) // 全局钩子拦截
router.beforeEach((to, from, next) => {
const store = appStore()
if(to?.meta?.isAuth && !store.isLogged) {
next('/login')
}else {
next()
}
}) router.afterEach(() => {
// ...
}) router.onError(error => {
console.warn('Router Error>>', error.message);
}) export default router

vue3+pinia状态管理

/**
* 状态管理 Pinia
* @author andy
*/ import { createPinia } from 'pinia'
// 引入pinia本地持久化存储
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' const pinia = createPinia()
pinia.use(piniaPluginPersistedstate) export default pinia

vue3和deepseek聊天会话都保存在本地存储中。

export const chatStore = defineStore('chat', {
state: () => ({
// 聊天会话记录
sessionId: '',
session: []
}),
getters: {},
actions: {
// 创建新对话
createSession(ssid) {
this.sessionId = ssid
this.session.unshift({
sessionId: ssid,
title: '',
data: []
})
}, // 新增会话
addSession(message) {
// 判断当前会话uuid是否存在,不存在创建新对话
if(!this.sessionId) {
const ssid = guid()
this.createSession(ssid)
}
this.session.map(item => {
if(item.sessionId == this.sessionId) {
if(!item.title) {
item.title = message.content
}
item.data.push(message)
}
})
}, // 更新某一条会话
updateSession(key, content) {
this.session.map(item => {
if(item.sessionId == this.sessionId) {
if(item.data && !isEmpty(item.data)) {
item.data.map((it, index) => {
if(it.key == key) {
it.content = content
}
})
}
}
})
}, // 获取会话
getSession() {
return this.session.find(item => item.sessionId == this.sessionId)
}, // 移除会话
removeSession(ssid) {
const index = this.session.findIndex(item => item?.sessionId === ssid)
if(index > -1) {
this.session.splice(index, 1)
}
this.sessionId = ''
},
// 删除某一条会话
deleteSession(key) {
this.session.map(item => {
if(item.sessionId == this.sessionId) {
if(item.data && !isEmpty(item.data)) {
item.data.map((it, index) => {
if(it.key == key) {
item.data.splice(index, 1)
}
})
}
}
})
}, // 清空会话
clearSession() {
this.session = []
this.sessionId = ''
}
},
// 本地持久化存储(默认存储localStorage)
persist: true
/* persist: {
// key: 'chatStore', // 不设置则是默认app
storage: localStorage,
paths: ['ssid', 'sessions'] // 设置缓存键
} */
})

vue3调用deepseek接口

  • 非流式输出
const completion = await openai.chat.completions.create({
messages: [
{role: 'user', content: editorValue}
],
model: 'deepseek-chat', // deepseek-chat对话模型 deepseek-reasoner推理模型
stream: false, // 流式输出
max_tokens: 8192, // 限制一次请求中模型生成 completion 的最大 token 数(默认使用 4096)
temperature: 0.4, // 严谨采样 越低越严谨(默认1)
})

// 处理返回数据
console.log(completion.choices[0].message.content)
  • 流式输出

通过for循环处理流式输出数据。

// 处理流式输出
let content = ''
for await (const chunk of completion) {
content += chunk.choices[0].delta.content;
chatState.updateSession(uniKey, content)
if(chunk.choices[0].finish_reason == 'stop') {
loading.value = false
}
if(props.reachBottom) {
props.scrollBottom()
}
}

综上就是vue3+deepseek实战ai对话小助手的一些知识分享,希望对大家有所帮助!最后感谢大家的阅读与支持~

附上几个最新实战项目案例

flutter3-trip仿携程酒店预订|Flutter3.27+Getx预约旅游酒店App程序

flutter3-dymall仿抖音直播商城|Flutter3.27短视频+直播+聊天App实例

Vite5+Electron聊天室|electron31跨平台仿微信EXE客户端|vue3聊天程序

uniapp+vue3聊天室|uni-app+vite4+uv-ui跨端仿微信app聊天语音/朋友圈

Tauri2.0-Vue3OS桌面端os平台|tauri2+vite6+arco电脑版OS管理系统

tauri2.0-admin桌面端后台系统|Tauri2+Vite5+ElementPlus管理后台EXE程序

flutter3-winchat桌面端聊天实例|Flutter3+Dart3+Getx仿微信Exe程序

uniapp+vue3酒店预订|vite5+uniapp预约订房系统模板(h5+小程序+App端)

Vue3-DeepSeek-Chat流式AI对话|vite6+vant4+deepseek智能ai聊天助手的更多相关文章

  1. 流式数据处理在百度数据工厂的应用与实践 原创: 李俊卿 AI前线 今天

    流式数据处理在百度数据工厂的应用与实践 原创: 李俊卿 AI前线 今天

  2. DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍

    DeepSpeed Chat: 一键式RLHF训练,让你的类ChatGPT千亿大模型提速省钱15倍 1. 概述 近日来,ChatGPT及类似模型引发了人工智能(AI)领域的一场风潮. 这场风潮对数字世 ...

  3. [JavaScript,Java,C#,C++,Ruby,Perl,PHP,Python][转]流式接口(Fluent interface)

    原文:https://en.m.wikipedia.org/wiki/Fluent_interface(英文,完整) 转载:https://zh.wikipedia.org/wiki/流式接口(中文, ...

  4. ASP.NET Core Web API 流式返回,逐字显示

    Websocket.SSE(Server-Sent Events)和长轮询(Long Polling)都是用于网页和服务端通信的技术. Websocket是一种全双工通信协议,能够实现客户端和服务端之 ...

  5. FunDA(2)- Streaming Data Operation:流式数据操作

    在上一集的讨论里我们介绍并实现了强类型返回结果行.使用强类型主要的目的是当我们把后端数据库SQL批次操作搬到内存里转变成数据流式按行操作时能更方便.准确.高效地选定数据字段.在上集讨论示范里我们用集合 ...

  6. CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)

    一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...

  7. PHP流式上传和表单上传(美图秀秀)

    最近需要开发一个头像上传的功能,找了很多都需要授权的,后来找到了美图秀秀,功能非常好用. <?php /** * Note:for octet-stream upload * 这个是流式上传PH ...

  8. Vue2.0流式渲染中文乱码问题

    在参照vue2.0中文官方文档学习服务端渲染之流式渲染时,因为响应头默认编码类型为GBK,而文件为UFT-8类型,所以出现了中文乱码问题. 解决办法:设置响应头编码类型即可 response.setH ...

  9. Storm:最火的流式处理框架

    伴随着信息科技日新月异的发展,信息呈现出爆发式的膨胀,人们获取信息的途径也更加多样.更加便捷,同时对于信息的时效性要求也越来越高.举个搜索场景中的例子,当一个卖家发布了一条宝贝信息时,他希望的当然是这 ...

  10. 翻译-In-Stream Big Data Processing 流式大数据处理

    相当长一段时间以来,大数据社区已经普遍认识到了批量数据处理的不足.很多应用都对实时查询和流式处理产生了迫切需求.最近几年,在这个理念的推动下,催生出了一系列解决方案,Twitter Storm,Yah ...

随机推荐

  1. Spring Boot中通过RabbitTemplate主动pull(get)消息的例子

    import java.util.Properties; import java.util.function.Consumer; import org.slf4j.Logger; import org ...

  2. Qt编写安防视频监控系统44-视频上传

    一.前言 视频上传用来将本地存储的视频文件上传到云端服务器,间接的实现了本地视频存储到云端的功能,其实本质上是先存储在本地,文件生成后再去上传到云端的,最终的效果一样就是,为了拓展兼容性,直接做了单独 ...

  3. vmstorage如何将原始指标转换为有组织的历史

    vmstorage如何将原始指标转换为有组织的历史 参考自:vmstorage-how-it-handles-data-ingestion vmstorage是VictoriaMetrics中负责处理 ...

  4. IM跨平台技术学习(七):得物基于Electron开发客服IM桌面端的技术实践

    本文由得物技术团队Uni分享,即时通讯网收录时有内容修订和排版优化. 一.引言 本文要分享的是得物技术团队基于Electron开发客服IM桌面端的技术实践过程,内容包括桌面技术选型.Electron的 ...

  5. IM开发者的零基础通信技术入门(十):零基础,史上最强5G技术扫盲

    本文引用了"鲜枣课堂"的<史上最强5G科普>文章内容.为了更好的内容呈现,在引用和收录时内容有改动,转载时请注明原文来源. 1.内容概述 ➊ 5G技术的关注度越来越高: ...

  6. 整理ML&AI学习路径图

    干货分享: 下面给出一个笔者自己整理的GitHub仓库:https://github.com/isLinXu/awesome-road-map 里面包含了一些可供参考的学习路径和思维导图,并整理微软. ...

  7. Python学习(六)——配套《PyTorch深度学习实战》

    1. NumPy介绍 这张图片介绍了Python中两个非常重要的科学计算库:NumPy和SciPy,以及它们的核心功能和特性. NumPy NumPy(Numerical Python)是一个开源的P ...

  8. Python在多个Excel文件中找出缺失数据行数多的文件

      本文介绍基于Python语言,针对一个文件夹下大量的Excel表格文件,基于其中每一个文件内.某一列数据的特征,对其加以筛选,并将符合要求与不符合要求的文件分别复制到另外两个新的文件夹中的方法. ...

  9. HashMap中哈希表的长度为什么需要是2的幂次方以及怎么实现

    看过HashMap源码的人可能都用印象,就是hashMap的哈希表长度可以由自己指定也可以不指定使用默认长度,但是如果在了解或者发现tableSizeFor方法的话,你就会知道此方法会改变我们的输入长 ...

  10. 056_带标签的break和continue 057_方法的定义_形参_实参_返回值_语句块 058_方法的重载overload 059_递归算法详解_递归和迭代效率测试

    056_带标签的break和continue(替代被取消的goto语句) 加个计数器: /** * 带标签的Break和Continue * * @author * */public class Te ...