当前位置: 首页 > article >正文

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面

今天写一下使用nodejs作为服务端,vue作为客户端,mysql的数据库,对接deepseek的全过程,要实现一个很简单的效果就是,可以自由的询问,然后可以将询问的过程存储到mysql的数据库中。

文档对接

deepseek对接文档

效果图

在这里插入图片描述

服务端代码
  • 这里避免你们看的时候费劲,所以这里不做任何封装,正常你们如果用代码,可以将连接数据、输出答案的过程封装起来。下面的代码为不封装的,仅供参考!别说我写代码不封装,最讨厌这种人。以下为nodejs代码
插件安装
npm i cors
npm i mysql2
npm i openai
var createError = require("http-errors");
var express = require("express");
var path = require("path");
var OpenAI = require("openai"); 
var cors = require("cors");const mysql = require("mysql2/promise");// 创建数据库连接池
const pool = mysql.createPool({host: "127.0.0.1", port: 3306, user: "root",password: "实际情况来!",database: "deepseek",waitForConnections: true,connectionLimit: 10,queueLimit: 0,
});
// 测试链接情况
pool.getConnection().then((connection) => {console.log("数据库连接成功");connection.release();}).catch((err) => {console.error("数据库连接失败:", err);});var app = express();
// 启用 CORS 避免本地调用出现的跨域问题
app.use(cors());
// 格式化返回数据为JSON格式
app.use(express.json());// 初始化OpenAI客户端
const openai = new OpenAI({baseURL: "https://api.deepseek.com", // 官方固定的地址apiKey: "自己的key",
});// 添加POST路由处理聊天请求
app.post("/chat", async (req, res) => {// console.log("收到请求:", req.body);// 添加这行来收集完整回答let fullAnswer = ""; try {// 引入官方文档语法const completion = await openai.chat.completions.create({messages: req.body.messages || [{ role: "system", content: "You are a helpful assistant." },],model: "deepseek-chat",stream: true,},{ responseType: "stream" });// 设置响应头res.setHeader("Content-Type", "text/event-stream");res.setHeader("Cache-Control", "no-cache");res.setHeader("Connection", "keep-alive");// 处理流式响应for await (const chunk of completion) {const content = chunk.choices[0]?.delta?.content || "";if (content) {fullAnswer += content; // 累积完整回答res.write(`data: ${JSON.stringify(chunk)}\n\n`);}}const connection = await pool.getConnection();try {console.log("准备存储到数据库:", {question: req.body.messages[0].content,answer: fullAnswer,});const [result] = await connection.execute("INSERT INTO chat_history (question, answer) VALUES (?, ?)",[req.body.messages[0].content, fullAnswer]);console.log("数据库存储结果:", result);} catch (dbError) {console.error("数据库存储错误:", dbError);} finally {connection.release();}// 添加结束标记res.write("data: [DONE]\n\n"); res.end();} catch (error) {console.error("Error:", error);if (!res.headersSent) {// 检查是否已经发送响应头res.status(500).json({ error: error.message });} else {res.write(`data: ${JSON.stringify({ error: error.message })}\n\n`);res.end();}}
});// 添加服务启动监听
const port = process.env.PORT || 3000;
app.listen(port, () => {console.log(`DeepSeek 服务已启动,监听端口: ${port}`);
});module.exports = app;
客户端代码

这里为了简单,就没有对css进行scss处理,喜欢折腾的自己改一下样式也可以

插件安装
npm i axios
<template><div class="chat-container"><div class="input-wrapper"><inputclass="ai-input"type="text"v-model="questionMsg"placeholder="请输入您的问题..."@keyup.enter="main"/><button class="ai-btn" @click="main"><span>询问</span></button></div><textareaclass="ai-area"v-model="answer"placeholder="AI 回答将显示在这里..."readonly></textarea></div>
</template><script setup>
import axios from 'axios';
import { ref } from "vue";const questionMsg = ref("");
const answer = ref("");
const loading = ref(false);async function main() {if (!questionMsg.value.trim()) return;loading.value = true;answer.value = "";try {const response = await axios({method: 'post',url: 'http://localhost:3000/chat',data: {messages: [{role: "system",content: questionMsg.value,},],model: "deepseek-chat",stream: true},headers: {'Authorization': 'Bearer 自己的key','Content-Type': 'application/json',},responseType: 'text', // 改为 text 类型});// 处理返回的文本数据const lines = response.data.split('\n').filter(line => line.trim() !== '');for (const line of lines) {if (line.startsWith('data: ')) {try {const data = JSON.parse(line.slice(6));const content = data.choices[0]?.delta?.content || '';answer.value += content;} catch (e) {console.error('Parse error:', e);}}}} catch (error) {console.error("Error:", error);answer.value = "抱歉,发生了错误,请稍后重试。";} finally {loading.value = false;}
}
</script><style>
.chat-container {max-width: 800px;margin: 40px auto;padding: 20px;border-radius: 12px;box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);background-color: #ffffff;
}.input-wrapper {display: flex;gap: 15px;margin-bottom: 20px;
}.ai-input {flex: 1;height: 45px;padding: 0 15px;border: 2px solid #e8e8e8;border-radius: 8px;font-size: 16px;transition: all 0.3s ease;
}.ai-input:focus {outline: none;border-color: #409eff;box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}.ai-btn {min-width: 100px;height: 45px;border: none;border-radius: 8px;background-color: #409eff;color: #fff;font-size: 16px;font-weight: 500;cursor: pointer;transition: all 0.3s ease;
}.ai-btn:hover {background-color: #66b1ff;transform: translateY(-1px);
}.ai-btn:active {transform: translateY(1px);
}.ai-area {width: 100%;min-height: 200px;padding: 15px;border: 2px solid #e8e8e8;border-radius: 8px;font-size: 15px;line-height: 1.6;resize: vertical;transition: all 0.3s ease;
}.ai-area:focus {outline: none;border-color: #409eff;box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
</style>
数据库设计

因为我主要是搞前端的,所以对数据库设计这块无法整的很好,后端的大佬看到就不要笑我了,这里我只是简单的演示一下整个处理的过程,所以表设计也是非常简单的。我用的数据库客户端也是DBeaver,非常简单的一个客户端。

CREATE DATABASE IF NOT EXISTS deepseek;
USE deepseek;CREATE TABLE IF NOT EXISTS chat_history (id INT AUTO_INCREMENT PRIMARY KEY,question TEXT NOT NULL,answer TEXT NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
存储之后的效果

在这里插入图片描述

服务端拦截到的日志

在这里插入图片描述

总结

整体对接下来,因为我对接的是最基础的,你们可以看到这里我甚至没有做连续对话和长链接的形式对接,虽然用了stream的形式处理的,但是其实并没有达到这种效果,你们对接的时候可以看文档自己多做几步处理,今天的文章就先这样吧,感觉不错的可以关注一下哦!

相关文章:

关于我对接了deepseek之后部署到本地将数据存储到mysql的过程

写在前面 今天写一下使用nodejs作为服务端&#xff0c;vue作为客户端&#xff0c;mysql的数据库&#xff0c;对接deepseek的全过程&#xff0c;要实现一个很简单的效果就是&#xff0c;可以自由的询问&#xff0c;然后可以将询问的过程存储到mysql的数据库中。 文档对接 deeps…...

23种设计模式-策略(Strategy)设计模式

策略设计模式 &#x1f6a9;什么是策略设计模式&#xff1f;&#x1f6a9;策略设计模式的特点&#x1f6a9;策略设计模式的结构&#x1f6a9;策略设计模式的优缺点&#x1f6a9;策略设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是策略设计模式…...

【Exception】MybatisPlusException: can not find lambda cache for this entity

文章目录 环境 | Environment复现步骤 | Reproduction steps报错日志 | Error log源码 | Source CodeUserServiceImpl.javaAddressServiceImpl.javaAbstractSubTableBaseServiceImpl.javaUserEntity.javaAddressEntity.javaSubTableBaseEntity.java 原因分析 | Analysis解决方案…...

vue ts+Windi CSS

1、创建vue项目 trae&#xff08;字节&#xff09;打开一个空文件夹 npm install -g vue/cli vue create my-project cd my-project vue add typescript npm run serve vue项目创建完成 2、安装windicss vue add windicss vue.config.js配置 npm install vue-router …...

ffmpeg系列(三)—— 音频重采样

SwrContext 一、SwrContext 的重要字段 SwrContext 是音频重采样的核心配置对象&#xff0c;其关键字段决定了重采样的行为和性能。以下是常用字段及其作用&#xff1a; 字段名称类型作用典型值示例in_sample_rateint输入音频的采样率&#xff08;Hz&#xff09;。44100out_…...

​Android Gradle 插件(AGP)版本与 ​Gradle 版本需要严格对应

一、AGP 与 Gradle 版本对照表 Android Gradle 插件版本对应 Gradle 版本适用 Android Studio 版本​8.1.x8.2Arctic Fox (2020.3.1+)​8.0.x8.0Arctic Fox (2020.3.1+)​7.4.x7.5.1IntelliJ IDEA 2022+​7.3.x7.4IntelliJ IDEA 2022+​7.2.x7.3.3IntelliJ IDEA 2021.3+​7.1.x…...

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示&#xff08;tooltip&#xff09;是一个常见的 UI 组件&#xff0c;用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本&#xff0c;所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…...

使用 Chromedp 监听网页请求和响应

使用 Chromedp 监听网页请求和响应 在进行网络爬虫的时候&#xff0c;有很多网站都有反爬机制&#xff0c;比如你想抓点数据&#xff0c;结果发现每次请求都带一堆奇奇怪怪的参数 —— 什么 timestamp 签名、AES 加密的字段&#xff0c;还有各种 Token 令牌&#xff0c;跟密码…...

Java中用Stream流取出分组后每组最大值对象的ID

取出分组后每组最大值对象的ID 如果只需要获取这些对象的ID&#xff08;或其他特定字段&#xff09;&#xff0c;而不是整个对象&#xff0c;可以采用以下方法&#xff1a; 方法1&#xff1a;先获取对象再提取ID List<String> customerIds orders.stream().collect(Coll…...

GPT-SoVITS本地部署:低成本实现语音克隆远程生成音频全流程实战

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天要给大家安利一个绝对能让你大呼过瘾的声音黑科技——GPT-SoVITS&#xff01;这款由花儿不哭大佬精心打造的语音克隆神…...

使用HTTP提交git时,每次都要输入用户名和密码的解决方案

通过https提交的git项目&#xff0c;每次提交都需要输入用户名和密码 解决方案如下: 打开项目目录&#xff0c;通过终端输入&#xff1a; git config --global credential.helper store验证方式: 重启 scode修改or添加文件后使用git上传, 本次需要帐号密码再次修改or添加文件…...

Flutter视频播放优化

在Flutter中实现流畅视频播放&#xff0c;选择合适的播放器插件是关键。推荐使用以下两类插件&#xff1a; 跨平台低延迟方案 flutter_vlc_player&#xff1a;基于VLC引擎&#xff0c;支持RTSP/RTMP协议&#xff0c;通过hwAcc: HwAcc.full启用硬件加速&#xff0c;配合setOpti…...

嵌入式学习第二十八天--顺序栈

栈的基本代码 栈是限定仅在表尾进行插入和删除操作的线性表。 先进后出、后进先出 栈顶:允许操作的一端 栈底:不允许操作的一端 入栈&#xff0c;出栈。 顺序栈 链式栈 302\5 1.创建 CreateSeqStack 2.销毁 DestroySeqStack 3.判断是否为空栈 IsEmptySeqStack 4.判断是否为满…...

基于MCP协议的多模态模型优化在医疗3D打印精密人工关节制造中的研究

一、引言 1.1 研究背景与意义 在全球人口老龄化趋势愈发明显的当下,诸如骨关节炎、类风湿性关节炎这类关节疾病的发病率不断攀升,进而使得人工关节置换手术的需求呈现出激增态势。人工关节置换手术作为治疗终末期关节疾病的有效手段,能够显著缓解患者疼痛,提升关节功能与生…...

【Unity】 HTFramework框架(六十三)SerializableDictionary可序列化字典

更新日期&#xff1a;2025年3月26日。 Github 仓库&#xff1a;https://github.com/SaiTingHu/HTFramework Gitee 仓库&#xff1a;https://gitee.com/SaiTingHu/HTFramework 索引 一、SerializableDictionary可序列化字典1.使用SerializableDictionary2.实现思路 二、Serializ…...

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表&#xff0c;该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all&#xff08;尽量不要删&#xff09;&#xff0c;使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer&#xff1b;找不到合适颜色…...

8路CXP相机采集系统介绍

8xCXP相机采集系统介绍 目录 1 系统概述 4 2 硬件架构 5 2.1 FPGA处理单元 5 2.2 CXP接口层 6 2.3 CXP相机说明与使用要求 7 2.4 SSI控制器板 8 3 FPGA方案 9 3.1 FPGA实现 9 3.2 Block Design说明 10 4 软件方案 14 4.1 嵌入式层 14 4.2 上位机软件&#xff08;C…...

Stable Diffusion 基础模型结构超级详解!

1. Transformer 第一个只用 Attention 机制来解决序列到序列问题的模型&#xff0c;最早被 Google 用来解决翻译问题 对于中英翻译而言&#xff0c;需要解决三个具体的问题&#xff1a; 如何用数字表示中文和英文 如何让神经网络理解语义 如何让神经网络生成英文 1.1 Tok…...

【Linux网络(七)】数据链路层

目录 1、认识MAC地址 2、 mac帧格式 3、局域网的通信原理 4、ARP协议 浏览器输入url1后发生的事情&#xff1a;&#xff08;面试题&#xff09; 数据链路层解决的是&#xff1a;直接相连的主机&#xff08;不仅仅包括电脑&#xff0c;还包括路由器&#xff09;之间&#x…...

Nginx RTMP 处理模块 (ngx_rtmp_handler.c) 详细分析

ngx_rtmp_handler 是 Nginx RTMP 模块中的核心处理部分&#xff0c;主要负责处理 RTMP 流会话中的数据接收、发送、ping 操作以及分块大小的设置等。 1. 全局变量 ngx_rtmp_naccepted: 记录接受的 RTMP 连接数。 ngx_rtmp_bw_out 和 ngx_rtmp_bw_in: 分别表示输出带宽和输入带…...

2025年渗透测试面试题总结-某奇安信-Ateam(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 奇安信-Ateam 一、SQL注入攻防技术体系 1.1 SQL注入类型矩阵&#xff08;基于利用方式&#xff09; …...

前端工程化--gulp的使用

gulp 介绍 gulp 是一个基于 Nodejs 的自动化构建工具&#xff0c;中文主页能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的合并、压缩、检查、监听文件变化、浏览器自动刷新、测试等任务 使用步骤&#xff1a; 安装 nodejs 全局安装 gulp npm install…...

谈谈对spring IOC的理解,原理和实现

一、IoC 核心概念 1. 控制反转&#xff08;Inversion of Control&#xff09; 传统编程中对象自行管理依赖&#xff08;主动创建&#xff09;&#xff0c;而IoC将控制权转移给容器&#xff0c;由容器负责对象的创建、装配和管理&#xff0c;实现依赖关系的反向控制。 2. 依赖…...

Windows 10 ARM64平台MFC串口程序开发

Windows 10 IoT ARM64平台除了支持新的UWP框架&#xff0c;也兼容支持老框架MFC。使得用户在Windows 10 IoT下可以对原MFC工程进行功能升级&#xff0c;不用在新框架下重写整个工程。熟悉MFC开发的工程师也可以在Windows 10 IoT平台下继续使用MFC进行开发。 本文展示MFC串口程序…...

31天Python入门——第16天:模块与库详解

你好&#xff0c;我是安然无虞。 文章目录 Python模块模块之间的调用 Python包库的概念Python标准库安装第三方库 \_\_name\_\_ \_\_main\_\_ Python模块 在 Python 中, 模块是一个包含函数、变量和类等代码定义的py文件. 所以也可以说, 普通的py文件就是一个模块. 模块可以…...

设计模式(创建型)- 原型模式

目录 定义 类图 角色 优缺点 优点 缺点 应用场景 案例展示 浅克隆 深克隆 定义 原型模式旨在创建重复的对象&#xff0c;同时确保良好的性能表现。它通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;而非使用传统的构造函数创建方式。这种设计…...

Redis + Caffeine多级缓存电商场景深度解析

Redis Caffeine多级缓存 Redis Caffeine多级缓存电商场景深度解析一、实施目的二、具体实施2.1 架构设计2.2 组件配置2.3 核心代码实现 三、实施效果3.1 性能指标对比3.2 业务指标改善3.3 系统稳定性 四、关键策略4.1 缓存预热4.2 一致性保障4.3 监控配置Prometheus监控指标 …...

spring-ai ollama小试牛刀

序 本文主要展示下spring-ai ollama的使用 示例 pom.xml <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-ollama-spring-boot-starter</artifactId></dependency>这里以ollama示例 配置 spring:ai:olla…...

在 CentOS 系统中开机自动执行 Shell 脚本

在 CentOS 系统中&#xff0c;可以通过以下方法设置开机自动执行 Shell 脚本。推荐使用 systemd 服务&#xff08;现代 Linux 系统的标准方式&#xff09;&#xff0c;也可以使用传统的 /etc/rc.local 方法。 方法 1&#xff1a;使用 Systemd 服务&#xff08;推荐&#xff09;…...

【Linux】应用层协议 HTTP

应用层协议 HTTP 一. HTTP 协议1. URL 地址2. urlencode 和 urldecode3. 请求与响应格式 二. HTTP 请求方法1. GET 和 POST (重点) 三. HTTP 状态码四. HTTP 常见报头五. 手写 HTTP 服务器 HTTP&#xff08;超文本传输协议&#xff09;是一种应用层协议&#xff0c;用于在万维网…...