nbmade-boot调用deepseek的api过程与显示
希望大家一起能参与我的新开源项目nbmade-boot: 宁波智能制造低代码实训平台
下面简单介绍调用最近大红的AI :deepseek的api过程与显示,包括前后端代码与效果图
一、后端代码
1、几个基础的java类
DeepSeekRequest .java
package com.nbcio.demo.domain;import java.util.List;import lombok.Data;@Data
public class DeepSeekRequest {private String model;private List<Message> messages;@Datapublic static class Message {private String role;private String content;}
}
DeepSeekResponse.java
package com.nbcio.demo.domain;import java.util.List;import com.nbcio.demo.domain.DeepSeekRequest.Message;import lombok.Data;@Data
public class DeepSeekResponse {private List<Choice> choices;@Datapublic static class Choice {private Message message;}
}
HttpClientSingleton.java
package com.nbcio.demo.utils;
import java.util.concurrent.TimeUnit;import okhttp3.OkHttpClient;public class HttpClientSingleton {private static OkHttpClient client;public static OkHttpClient getClient() {if (client == null) {client = new OkHttpClient.Builder().connectTimeout(300, TimeUnit.SECONDS).writeTimeout(300, TimeUnit.SECONDS).readTimeout(300, TimeUnit.SECONDS).build();}return client;}
}
2、DeepSeekController.java接口类
package com.nbcio.demo.controller;import lombok.RequiredArgsConstructor;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import com.nbcio.common.core.domain.R;
import com.nbcio.demo.domain.DeepSeekRequest;
import com.nbcio.demo.service.IDeepSeekService;/*** deepseek api 演示案例** @author nbacheng*/@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/deepseek")
public class DeepSeekController {private final IDeepSeekService deepSeekService;@PostMapping("/chat")public R<?> chat(@RequestBody DeepSeekRequest request) {try {String response = deepSeekService.callDeepSeekAPI(request);return R.ok(response);} catch (Exception e) {return R.fail("API调用失败: " + e.getMessage());}}
}
3、DeepSeekServiceImpl.java实现类
package com.nbcio.demo.service.impl;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import com.google.gson.Gson;
import com.nbcio.demo.domain.DeepSeekRequest;
import com.nbcio.demo.service.IDeepSeekService;
import com.nbcio.demo.utils.HttpClientSingleton;import lombok.RequiredArgsConstructor;
import okhttp3.*;
import java.io.IOException;@Service
@RequiredArgsConstructor
public class DeepSeekServiceImpl implements IDeepSeekService {@Value("${deepseek.api.key}")private String apiKey;@Value("${deepseek.api.url}")private String apiUrl;public String callDeepSeekAPI(DeepSeekRequest request) throws IOException {OkHttpClient client = HttpClientSingleton.getClient();MediaType mediaType = MediaType.parse("application/json;charset=utf-8");RequestBody body = RequestBody.create(mediaType, new Gson().toJson(request));Request httpRequest = new Request.Builder().url(apiUrl).method("POST", body).addHeader("Content-Type", "application/json").addHeader("Accept", "application/json").addHeader("Authorization", "Bearer " + apiKey).build();try (Response response = client.newCall(httpRequest).execute()) {if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);return response.body().string();}}
}
二、前端代码如下:
<!-- views/ai/DeepSeekChat.vue -->
<template><div class="chat-container"><div class="chat-history"><div v-for="(msg, index) in messages" :key="index" :class="['message', msg.role]"><div class="message-content" v-html="msg.htmlContent"></div></div></div><div class="input-area"><el-inputv-model="inputMessage"type="textarea":rows="4"placeholder="输入您的问题..."@keydown.enter.exact.prevent="sendMessage"/><el-buttontype="primary":loading="loading"@click="sendMessage"class="send-button">发送</el-button></div></div>
</template><script setup>
import { ref } from 'vue'
import { deepSeekChat } from '@/api/demo/deepseek'
import MarkdownIt from 'markdown-it'
import hljs from 'highlight.js'
import 'highlight.js/styles/github-dark.css'const md = new MarkdownIt({html: true,linkify: true,highlight: (str, lang) => {if (lang && hljs.getLanguage(lang)) {try {return `<pre class="hljs"><code>${hljs.highlight(str, {language: lang,ignoreIllegals: true}).value}</code></pre>`} catch (__) {}}return `<pre class="hljs"><code>${md.utils.escapeHtml(str)}</code></pre>`}
})const messages = ref([])
const inputMessage = ref('')
const loading = ref(false)const formatContent = (content) => {return md.render(content)
}const sendMessage = async () => {if (!inputMessage.value.trim()) returnconst userMessage = {role: 'user',content: inputMessage.value,htmlContent: formatContent(inputMessage.value)}messages.value.push(userMessage)loading.value = truetry {const response = await deepSeekChat({model: 'deepseek-chat',messages: [...messages.value.map(m => ({ role: m.role, content: m.content }))]})const content = JSON.parse(response.msg)const aiMessage = {role: 'assistant',content: content.choices[0].message.content,htmlContent: formatContent(content.choices[0].message.content)}messages.value.push(aiMessage)} catch (error) {ElMessage.error('请求失败:' + error.message)} finally {inputMessage.value = ''loading.value = false}
}
</script><style scoped>
.chat-container {max-width: 800px;margin: 20px auto;height: 70vh;display: flex;flex-direction: column;
}.chat-history {flex: 1;overflow-y: auto;padding: 20px;border: 1px solid #ebeef5;border-radius: 4px;margin-bottom: 20px;background: #f9fafb;
}.message {margin: 10px 0;padding: 15px 20px;border-radius: 8px;line-height: 1.6;
}.message.user {background-color: #fff;margin-left: 20%;box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}.message.assistant {background-color: #ffffff;margin-right: 20%;box-shadow: 0 1px 3px rgba(0,0,0,0.1);border: 1px solid #e5e7eb;
}.input-area {position: relative;
}.send-button {margin-top: 10px;float: right;
}/* Markdown内容样式 */
.message-content ::v-deep() {h1, h2, h3 {margin: 1em 0 0.5em;font-weight: 600;}p {margin: 0.8em 0;}pre {background: #1f2937;color: #fff;padding: 1em;border-radius: 6px;overflow-x: auto;margin: 1em 0;}code {font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;background: #f3f4f6;padding: 0.2em 0.4em;border-radius: 4px;font-size: 0.9em;}blockquote {border-left: 4px solid #e5e7eb;padding: 0 1em;color: #6b7280;margin: 1em 0;}ul, ol {padding-left: 2em;margin: 1em 0;}li {margin: 0.3em 0;}
}
</style>
三、效果图
在发送提问里输入:测试deepseek的api返回显示样式调整
显示返回效果如下:

相关文章:
nbmade-boot调用deepseek的api过程与显示
希望大家一起能参与我的新开源项目nbmade-boot: 宁波智能制造低代码实训平台 下面简单介绍调用最近大红的AI :deepseek的api过程与显示,包括前后端代码与效果图 一、后端代码 1、几个基础的java类 DeepSeekRequest .java package com.nbcio.demo.do…...
Linux:安装 node 及 nvm node 版本管理工具(ubuntu )
目录 方法一:手动下载安装文件安装方法二:curl安装 方法一:手动下载安装文件安装 git clone 远程镜像 git clone https://gitee.com/mirrors/nvm安装 nvm bash install.sh刷新配置,使配置在终端生效 // 方法 1 source /root/.…...
微服务日志查询难解决方案-EFK
前言 在微服务项目中,日志查询难是一个常见问题,主要原因包括:日志分散:微服务实例分布在多个节点或容器中,日志存储位置分散。格式不统一:不同服务可能使用不同的日志格式,难以统一查询。调用…...
【多线程-第三天-NSOperation和GCD的区别 Objective-C语言】
一、我们来看NSOperation和GCD的区别 1.我们来对比一下,NSOperation和GCD, 那这个代码,我们都写过了, 我们来看一下它们的特点啊,首先来看GCD, 1)GCD是C语言的框架,是iOS4.0之后推出的,并且它的特点是,针对多核做了优化,可以充分利用CPU的多核,OK,这是GCD, 2…...
【医院运营统计专题】2.运营统计:医院管理的“智慧大脑”
医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 引言 在当今医疗行业快速发展的背景下,医院运营管理的科学性和有效性成为了决定医院竞争力和可持续发展能力的关键因素。运营统计作为医院管理的重要工具,通过对医院各类数据的收集、整理、分析和解读,为医…...
Ollama 部署 DeepSeek-R1 及Open-WebUI
Ollama 部署 DeepSeek-R1 及Open-WebUI 文章目录 Ollama 部署 DeepSeek-R1 及Open-WebUI〇、说明为什么使用本方案 一、 安装Ollama1、主要特点:2、安装3、验证 二、Ollama 部署 DeepSeek1、部署2、模型选用3、Ollama 常用命令4、Ollama模型默认存储路径 安装open-w…...
Docker 容器 Elasticsearch 启动失败完整排查记录
背景 在服务器上运行 Docker 容器 es3,但 Elasticsearch 无法正常启动,运行 docker ps -a 发现 es3 处于 Exited (1) 状态,即进程异常退出。 本次排查从错误日志、容器挂载、权限问题、SELinux 影响、内核参数等多个方面入手,最…...
离线安装Appium Server
1、问题概述? 安装Appium通常有两种方式: 第一种:下载exe安装包,这种是Appium Server GUI安装方式,缺点是通过命令启动不方便。 第二种:通过cmd安装appium server,可以通过命令方式启动,比较方便。 问题:在没有外网的情况下,无法通过命令在cmd中安装appium server…...
Vite 打包原理
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
目前推荐的优秀编程学习网站与资源平台,涵盖不同学习方式和受众需求
一、综合教程与互动学习平台 菜鸟教程 特点:适合零基础新手,提供免费编程语言教程(Python、Java、C/C++、前端等),页面简洁且包含大量代码示例,支持快速上手。适用人群:编程入门者、需要快速查阅语法基础的学习者。W3Schools 特点:专注于Web开发技术(HTML、CSS、JavaS…...
【大模型】Ubuntu下安装ollama,DeepSseek-R1:32b的本地部署和运行
1 ollama 的安装与设置 ollama官网链接:https://ollama.com/ 在左上角的【Models】中展示了ollama支持的模型在正中间的【Download】中课可以下载支持平台中的安装包。 其安装和模型路径配置操作流程如下: ollama的安装 这里选择命令安装curl -fsSL …...
蓝桥杯---力扣题库第38题目解析
文章目录 1.题目重述2.外观数列举例说明3.思路分析(双指针模拟)4.代码说明 1.题目重述 外观数列实际上就是给你一串数字,我们需要对于这个数据进行一个简单的描述罢了; 2.外观数列举例说明 外观数列都是从1开始的,也…...
oCam:免费且强大的录屏软件
今天给大家推荐一个非常好的录屏软件。几乎可以满足你日常工作的需求。而且软件完全免费,没有任何的广告。 oCam:免费且强大的录屏软件 oCam是一款功能强大的免费录屏软件,支持屏幕录制、游戏录制和音频录制等多种模式,能够满足不…...
Day81:数据的保存
在编程中,数据保存是非常重要的,它使得程序能够持久化存储数据,并在程序重启后继续使用。这一节,我们将介绍如何使用 Python 来保存数据,涉及常见的几种方式,包括将数据保存到文件中、使用数据库等方法。 1. 保存数据到文本文件 文本文件是最常用的数据存储方式之一。你…...
苍穹外卖 项目记录 day11 Spring Task订单定时处理-来单提醒-客户催单
文章目录 Spring Taskcron表达式Spring Task使用步骤订单状态定时处理WebSocketWebSockt入门示例来单提醒客户催单 Spring Task Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 应用场景: 1). 信用卡每月还款…...
【GitLab CI/CD 实践】从 0 到 1 搭建高效自动化部署流程
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Django开发入门 – 1.搭建基于Python Web框架Django的IDE开发环境
Django开发入门 – 1.搭建基于Python Web框架Django的IDE开发环境 Build A Integrated Development Environment(IDE) for Python Web Framework - django By JacksonML 1. 获取及安装最新版Python 打开Chrome浏览器,访问Python官网链接:https://www…...
【Java基础】序列化、反序列化和不可变类
Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java基础面经 📚本系列文章为个…...
R语言 文本分析 天龙八部
起因, 目的: 前面有人对 “倚天屠龙记” 进行分析,我这里只是进行模仿而已。 完整的文件, 已经绑定了,反正读者可以找一下。 案例背景 小说《天龙八部》是金庸先生所著的武侠小说,也是“射雕三部曲”的前传。全书共50章,字数超过一百万字。故事发生在北宋末年,以大理…...
Gradle 发布Jar到 Maven Central
1. 前置步骤 自 2024 年 3 月 12 日起,所有注册和发布都将通过 Central Portal 进行。 Central Portal 帐户注册命名空间可用于对工件进行签名的 GPG 密钥 1. 创建 GPG 密钥对 2. 分发公钥 更多教程参考本文: 如何发布jar包到maven中央仓库(2024年3月最…...
小米6的ubantu touch 怎么安装docker
deekseek 真的太牛逼了。 小米6的ubantu touch 怎么安装docker? Thought for 19 seconds 嗯,用户问的是在小米6上安装Ubuntu Touch后如何安装Docker。首先,我需要确认Ubuntu Touch的版本是否支持Docker。Ubuntu Touch是基于Ubuntu的移动操作…...
USB子系统学习(四)使用libusb读取鼠标数据
文章目录 1、声明2、HID协议2.1、描述符2.2、鼠标数据格式 3、应用程序4、编译应用程序5、测试 1、声明 本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。 韦老师的《驱动大全》:商品详情 …...
深度剖析 Redisson 分布式锁:原理、实现与应用实践
文章目录 写在文章开头详解Redisson 分布式锁使用和实现前置准备工作分布式锁的基本使用公平锁的使用联锁的使用读写锁基本使用常见问题Redisson和Jedis有什么区别redisson如何实现分布式锁redisson如何实现分布式锁的可重入redisson如何实现公平锁Redisson的watchdog机制是什么…...
Android Studio 配置 Gerrit Code Review
很多大厂(华为、荣耀)的大型项目都有gerrit代码审查流程,那么我们如何实现不手动敲命令行,就在Android Studio中像平常开发一样,只需要用鼠标点点点,就能将代码推送到gerrit审查仓呢,现在就来跟…...
基于微信小程序的医院预约挂号系统的设计与实现
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
仅128个token达到ImageNet生成SOTA性能!MAETok:有效的扩散模型的关键是什么?(卡内基梅隆港大等)
论文链接:https://arxiv.org/pdf/2502.03444 项目链接:https://github.com/Hhhhhhao/continuous_tokenizer 亮点直击 理论与实验分析:通过实验和理论分析建立了潜空间结构与扩散模型性能之间的联系。揭示了具有更少高斯混合模型(G…...
AWS成本优化实战:查询未关联弹性IP地址的完整指南
一、背景介绍 1.1 为什么要管理未关联的弹性IP 弹性IP (Elastic IP) 是AWS中的重要资源,但未关联的弹性IP会产生不必要的成本支出。主要问题包括: 闲置资源浪费持续产生费用增加运维成本影响资源管理效率1.2 解决方案价值 通过自动化脚本定期检查未关联的弹性IP: 及时发现…...
I2C协议—读写EEPROM(24Cxx为例)
STM32 I2C协议详解与应用实践-CSDN博客 实际项目中移植IIC协议及读写EEprom代码: /* AT24C08,写次数达100万次SOC ,2500次充放电次数,需要500万次记录,需存储均衡 每页*/#include "FreeRTOS.h" #include "task.h" #incl…...
示例:JAVA调用deepseek
近日,国产AI DeepSeek在中国、美国的科技圈受到广泛关注,甚至被认为是大模型行业的最大“黑马”。在外网,DeepSeek被不少人称为“神秘的东方力量”。1月27日,DeepSeek应用登顶苹果美国地区应用商店免费APP下载排行榜,在…...
Linux系统命令无法使用(glib库相关问题)
1.背景描述 Yum强制安装了一些软件,安装软件成功无报错,完成后不久突然发现系统出问题了,所有的命令无法使用了,如ls、mv、cat等基本命令报错。 relocation error: /lib64/libpthread.so.0: symbol_libc_dl_error_tsd …...
