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

基于Spring Boot + Vue 项目中引入deepseek方法

准备工作
在开始调用 DeepSeek API 之前,你需要完成以下准备工作:

1.访问 DeepSeek 官网,注册一个账号。

2.获取 API 密钥:登录 DeepSeek 平台,进入 API 管理 页面。创建一个新的 API 密钥(API Key),并妥善保存。

3.阅读 API 文档:

访问 DeepSeek 的 API 文档,了解支持的 API 端点、请求参数和返回格式


 开始调用                 

1.前端只需要简单的渲染页面渲染,将所需问题传递到后端,页面效果:

代码:

<template><div class="total"><div class="chat-container"><div class="chat-header"><h1>快来和我聊天吧~~~</h1></div><div class="chat-messages" ref="messagesContainer"><divv-for="(message, index) in messages":key="index":class="['chat-message', message.sender]"><div v-html="formatContent(message.content)"></div></div></div><div class="chat-input"><inputtype="text"v-model="inputText"placeholder="输入消息..."@keydown.enter="sendMessage":disabled="isLoading"/><button @click="sendMessage" :disabled="!canSend"><svg viewBox="0 0 24 24"><path d="M2.01 21L23 12 2.01 3 2 10l15 2-15 2z" /></svg>发送</button></div></div></div>
</template><script>
import { getToken } from "@/utils/storage.js";
const token = getToken();export default {data() {return {inputText: "",messages: [],isLoading: false,};},computed: {canSend() {return this.inputText.trim() && !this.isLoading;},},methods: {formatContent(text) {// 基础Markdown转换return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\*\*(.*?)\*\*/g, "<strong>$1</strong>").replace(/\*(.*?)\*/g, "<em>$1</em>").replace(/`(.*?)`/g, "<code>$1</code>");},async sendMessage() {if (!this.canSend) return;const question = this.inputText.trim();this.inputText = "";// 添加用户消息this.messages.push({sender: "user",content: question,});// 添加初始bot消息const botMessage = {sender: "bot",content: "",};this.messages.push(botMessage);this.scrollToBottom();try {this.isLoading = true;const response = await fetch("http://localhost:21090/api/online-travel-sys/v1.0/deepSeek/chat",{method: "POST",headers: {"Content-Type": "application/json",token: token,},body: JSON.stringify({ question }),});if (!response.ok || !response.body) {throw new Error("请求失败");}const reader = response.body.getReader();const decoder = new TextDecoder();let buffer = "";while (true) {const { done, value } = await reader.read();if (done) break;buffer += decoder.decode(value, { stream: true });// 处理SSE格式数据let position;while ((position = buffer.indexOf("\n\n")) >= 0) {const chunk = buffer.slice(0, position);buffer = buffer.slice(position + 2);const event = this.parseSSEEvent(chunk);if (event && event.data) {if (event.data === "[DONE]") {break; // 流结束}botMessage.content += event.data;this.scrollToBottom();}}}} catch (error) {botMessage.content = "请求出错,请稍后重试";} finally {this.isLoading = false;this.scrollToBottom();}},parseSSEEvent(chunk) {const lines = chunk.split("\n");const event = {};lines.forEach((line) => {if (line.startsWith("data:")) {event.data = line.replace(/^data:\s*/, "");}});return event;},scrollToBottom() {this.$nextTick(() => {const container = this.$refs.messagesContainer;if (container) {container.scrollTop = container.scrollHeight;}});},},
};
</script><style scoped>
/* 新增的样式 */
/* body 样式 */
html,
body {margin: 0;padding: 0;height: 100%; /* 确保高度占满整个视口 */
}.total {width: 100%;height: 100%; /* 继承父容器的高度 */display: flex;justify-content: center;align-items: center;background-image: url("../../assets/img/seek.jpg");background-size: cover;background-position: center;
}
.chat-container {width: 100%;max-width: 800px;height: 75vh;background: rgba(255, 255, 255, 0.5);border-radius: 20px;box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);backdrop-filter: blur(10px);display: flex;flex-direction: column;overflow: hidden;margin: auto; /* 水平居中 */margin-top: 95px;margin-bottom: 20px;
}
.chat-header {padding: 24px;background: linear-gradient(135deg, #497bf1 0%, #4874ed 100%);color: white;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}.chat-header h1 {margin: 0;font-size: 17px;font-weight: 400;letter-spacing: -0.5px;
}.chat-messages {flex: 1;padding: 20px;overflow-y: auto;display: flex;flex-direction: column;gap: 12px;
}.chat-message {max-width: 75%;padding: 16px 20px;border-radius: 20px;line-height: 1.5;animation: messageAppear 0.3s ease-out;position: relative;word-break: break-word;
}.chat-message.user {background: linear-gradient(135deg, #5b8cff 0%, #3d6ef7 100%);color: white;align-self: flex-end;border-bottom-right-radius: 4px;box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}.chat-message.bot {background: linear-gradient(135deg, #f0f8ff 0%, #e6f3ff 100%);color: #2d3748;align-self: flex-start;border-bottom-left-radius: 4px;box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}.chat-input {padding: 20px;background: rgba(255, 255, 255, 0.9);border-top: 1px solid rgba(0, 0, 0, 0.05);display: flex;gap: 12px;
}.chat-input input {flex: 1;padding: 14px 20px;border: 2px solid rgba(0, 0, 0, 0.1);border-radius: 16px;font-size: 1rem;transition: all 0.2s ease;background: rgba(255, 255, 255, 0.8);
}.chat-input input:focus {outline: none;border-color: #5b8cff;box-shadow: 0 0 0 3px rgba(91, 140, 255, 0.2);
}.chat-input button {padding: 12px 24px;border: none;border-radius: 16px;background: #5b8cff;color: white;font-size: 1rem;font-weight: 500;cursor: pointer;transition: all 0.2s ease;display: flex;align-items: center;gap: 8px;
}.chat-input button:hover:not(:disabled) {background: #406cff;transform: translateY(-1px);
}.chat-input button:disabled {background: #c2d1ff;cursor: not-allowed;transform: none;
}.chat-input button svg {width: 18px;height: 18px;fill: currentColor;
}.typing-indicator {display: inline-flex;gap: 6px;padding: 12px 20px;background: linear-gradient(135deg, #f0f8ff 0%, #e6f3ff 100%);border-radius: 20px;
}.typing-dot {width: 8px;height: 8px;background: rgba(0, 0, 0, 0.3);border-radius: 50%;animation: typing 1.4s infinite ease-in-out;
}.typing-dot:nth-child(2) {animation-delay: 0.2s;
}.typing-dot:nth-child(3) {animation-delay: 0.4s;
}@keyframes messageAppear {from {opacity: 0;transform: translateY(10px);}to {opacity: 1;transform: translateY(0);}
}@keyframes typing {0%,100% {transform: translateY(0);}50% {transform: translateY(-4px);}
}@media (max-width: 640px) {.chat-container {height: 95vh;border-radius: 16px;}.chat-message {max-width: 85%;}
}/* Markdown内容样式 */
.chat-message :deep(pre) {background: rgba(0, 0, 0, 0.05);padding: 12px;border-radius: 8px;overflow-x: auto;margin: 8px 0;
}.chat-message :deep(code) {font-family: monospace;background: rgba(0, 0, 0, 0.08);padding: 2px 4px;border-radius: 4px;
}.chat-message :deep(strong) {font-weight: 600;
}.chat-message :deep(em) {font-style: italic;
}.chat-message :deep(blockquote) {border-left: 3px solid #5b8cff;margin: 8px 0;padding-left: 12px;color: #666;
}.chat-message :deep(a) {color: #5b8cff;text-decoration: none;border-bottom: 1px solid transparent;transition: all 0.2s;
}.chat-message :deep(a:hover) {border-bottom-color: currentColor;
}
</style>

后端,这里并没有将历史记录保存到数据库,如果有需要根据实际情况自行添加:

1.在yml文件中添加相关配置

ds:key: 填写在官方自己申请的key,需要一定费用但很少url: https://api.deepseek.com/chat/completions

2.控制层:

package cn.kmbeast.controller;import cn.kmbeast.service.DsChatService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import javax.annotation.Resource;/*** DsController* @author senfel* @version 1.0* @date 2025/3/13 17:21*/
@RestController
@RequestMapping("/deepSeek")
@Slf4j
public class DsController {@Resourceprivate DsChatService dsChatService;/*** chat page* @param modelAndView* @author senfel* @date 2025/3/13 17:39* @return org.springframework.web.servlet.ModelAndView*/@GetMapping()public ModelAndView chat(ModelAndView modelAndView) {modelAndView.setViewName("chat");return modelAndView;}/*** chat* @param question* @author senfel* @date 2025/3/13 17:39* @return org.springframework.web.servlet.mvc.method.annotation.SseEmitter*/@PostMapping(value = "/chat", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public SseEmitter chat(@RequestBody String question) {//TODO 默认用户ID,实际场景从token获取String userId = "senfel";return dsChatService.chat(userId, question);}
}

3.service层:

package cn.kmbeast.service;import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;/*** DsChatService* @author senfel* @version 1.0* @date 2025/4/13 17:30*/
public interface DsChatService {/*** chat* @param userId* @param question* @author senfel* @date 2025/3/13 17:30* @return org.springframework.web.servlet.mvc.method.annotation.SseEmitter*/SseEmitter chat(String userId, String question);
}

4.service实现:

package cn.kmbeast.service.impl;import cn.kmbeast.service.DsChatService;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** DsChatServiceImpl* @author senfel* @version 1.0* @date 2025/3/13 17:31*/
@Service
@Slf4j
public class DsChatServiceImpl implements DsChatService {@Value("${ds.key}")private String dsKey;@Value("${ds.url}")private String dsUrl;// 用于保存每个用户的对话历史private final Map<Object, ArrayList<Map<String, String>>> sessionHistory = new ConcurrentHashMap<Object, ArrayList<Map<String, String>>>();private final ExecutorService executorService = Executors.newCachedThreadPool();private final ObjectMapper objectMapper = new ObjectMapper();/*** chat* @param userId* @param question* @author senfel* @date 2025/3/13 17:36* @return org.springframework.web.servlet.mvc.method.annotation.SseEmitter*/@Overridepublic SseEmitter chat(String userId,String question) {SseEmitter emitter = new SseEmitter(-1L);executorService.execute(() -> {try {log.info("流式回答开始, 问题: {}", question);// 获取当前用户的对话历史ArrayList<Map<String, String>> messages = sessionHistory.getOrDefault(userId, new ArrayList<Map<String, String>>());// 添加用户的新问题到对话历史Map<String, String> userMessage = new HashMap<>();userMessage.put("role", "user");userMessage.put("content", question);Map<String, String> systemMessage = new HashMap<>();systemMessage.put("role", "system");systemMessage.put("content", "senfel的AI助手");messages.add(userMessage);messages.add(systemMessage);// 调用 DeepSeek APItry (CloseableHttpClient client = HttpClients.createDefault()) {HttpPost request = new HttpPost(dsUrl);request.setHeader("Content-Type", "application/json");request.setHeader("Authorization", "Bearer " + dsKey);Map<String, Object> requestMap = new HashMap<>();requestMap.put("model", "deepseek-chat");requestMap.put("messages", messages);requestMap.put("stream", true);String requestBody = objectMapper.writeValueAsString(requestMap);request.setEntity(new StringEntity(requestBody, StandardCharsets.UTF_8));try (CloseableHttpResponse response = client.execute(request);BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), StandardCharsets.UTF_8))) {StringBuilder aiResponse = new StringBuilder();String line;while ((line = reader.readLine()) != null) {if (line.startsWith("data: ")) {System.err.println(line);String jsonData = line.substring(6);if ("[DONE]".equals(jsonData)) {break;}JsonNode node = objectMapper.readTree(jsonData);String content = node.path("choices").path(0).path("delta").path("content").asText("");if (!content.isEmpty()) {emitter.send(content);aiResponse.append(content); // 收集 AI 的回复}}}// 将 AI 的回复添加到对话历史Map<String, String> aiMessage = new HashMap<>();aiMessage.put("role", "assistant");aiMessage.put("content", aiResponse.toString());messages.add(aiMessage);// 更新会话状态sessionHistory.put(userId, messages);log.info("流式回答结束, 问题: {}", question);emitter.complete();}} catch (Exception e) {log.error("处理 DeepSeek 请求时发生错误", e);emitter.completeWithError(e);}} catch (Exception e) {log.error("处理 DeepSeek 请求时发生错误", e);emitter.completeWithError(e);}});return emitter;}
}

最终效果:

相关文章:

基于Spring Boot + Vue 项目中引入deepseek方法

准备工作 在开始调用 DeepSeek API 之前&#xff0c;你需要完成以下准备工作&#xff1a; 1.访问 DeepSeek 官网&#xff0c;注册一个账号。 2.获取 API 密钥&#xff1a;登录 DeepSeek 平台&#xff0c;进入 API 管理 页面。创建一个新的 API 密钥&#xff08;API Key&#x…...

Spring Boot集成Kafka并使用多个死信队列的完整示例

以下是Spring Boot集成Kafka并使用多个死信队列的完整示例&#xff0c;包含代码和配置说明。 1. 添加依赖 (pom.xml) <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId&…...

全面了解CSS语法 ! ! !

CSS&#xff08;层叠样式表&#xff09;是网页设计的灵魂之一&#xff0c;它赋予了网页活力与美感。无论是为一个简单的个人博客增添色彩&#xff0c;还是为复杂的企业网站设计布局&#xff0c;CSS都是不可或缺的工具。那么&#xff0c;CSS语法到底是什么样的呢&#xff1f;它背…...

Springboot使用ThreadLocal提供线程局部变量,传递登录用户名

文章目录 概述使用创建ThreadLocalUtil工具类在登录拦截器中使用ThreadLocal存储登录用户名在/userInfo接口中获取登录用户名 注意事项参考视频 概述 使用 创建ThreadLocalUtil工具类 utils/ThreadLocalUtil.java package org.example.utils;/*** ThreadLocal 工具类*/ Supp…...

排序算法——选择排序

一、介绍 「排序算法sortingalgorithm」用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更有效地查找、分析和处理。 如图所示&#xff0c;排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求…...

AlphaFold蛋白质结构数据库介绍

AlphaFold Protein Structure Database (AlphaFold DB) 是 DeepMind + EMBL-EBI 合作开发的公开蛋白质结构预测数据库,是利用 AlphaFold2/AlphaFold3 AI模型 预测的全基因组级蛋白质三维结构库。 网址: https://alphafold.ebi.ac.uk 项目内容主办单位DeepMind + EMBL-EBI上线…...

Roboflow标注数据集

使用Roboflow进行标注 关键点标注目标检测标注图像分类标注分割标注 Roboflow是一款易于使用的在线 图像标注。 关键点标注 每个图像的标注包括&#xff1a; 1、边界框坐标&#xff08;每个物品应该有一个边界框&#xff0c;用*[x1,y1,x2,y2]*格式即左上角和右下角点描述&…...

大厂经验:第三方包Paramunittest参数化 VS Unittest内置参数化文本管理器subtest

大厂经验&#xff1a;第三方包Paramunittest参数化 VS Unittest内置参数化文本管理器subtest 代码解析 Paramunittest 核心逻辑 paramunittest.parametrized((Testerr, test, Invalid Login or Password., test_login_admin is passed),(Sam, test, Invalid Login or Passwo…...

[特殊字符]适合五四青年节的SVG模版[特殊字符]

宝藏模版 往期推荐&#xff08;点击阅读&#xff09;&#xff1a; 趣味效果&#xff5c;高大上&#xff5c;可爱风&#xff5c;年终总结I&#xff5c;年终总结II&#xff5c;循环特效&#xff5c;情人节I&#xff5c;情人节II&#xff5c;情人节IIII&#xff5c;妇女节I&…...

当插入排序遇上“凌波微步“——希尔排序的奇幻漂流

文章目录 一、排序江湖的隐藏高手二、分而治之的魔法1. 核心思想拆解2. 动态演示&#xff08;脑补版&#xff09; 三、C语言实现大揭秘代码要点解析&#xff1a; 四、性能分析与实战技巧1. 时间复杂度迷思2. 实测性能对比 五、为什么说它永不过时&#xff1f;六、进阶思考题 一…...

【Hot 100】 148. 排序链表

目录 引言十大排序算法1. 冒泡排序 (Bubble Sort)2. 选择排序 (Selection Sort)3. 插入排序 (Insertion Sort)4. 希尔排序 (Shell Sort)简单代码说明关键特点 5. 归并排序 (Merge Sort)6. 快速排序 (Quick Sort)7. 堆排序 (Heap Sort)8. 计数排序 (Counting Sort)9. 桶排序 (Bu…...

大连理工大学选修课——机器学习笔记(9):线性判别式与逻辑回归

线性判别式与逻辑回归 概述 判别式方法 产生式模型需要计算输入、输出的联合概率 需要知道样本的概率分布&#xff0c;定义似然密度的隐式参数也称为基于似然的分类 判别式模型直接构造判别式 g i ( x ∣ θ i ) g_i(x|\theta_i) gi​(x∣θi​)&#xff0c;显式定义判别式…...

[特殊字符] 开发工作高内存占用场景下,Windows 内存压缩机制是否应该启用?实测分析与优化建议

在日常开发中&#xff0c;我们往往需要同时运行多个高占用内存的工具&#xff0c;例如&#xff1a; IntelliJ IDEA VMware 虚拟机 多个 Java 后端程序 这些应用程序非常“吃内存”&#xff0c;轻松就能把 16GB、甚至 24GB 的物理内存用满。那么&#xff0c;Windows 的“内存…...

相机的基础架构

&#x1f4f7; 相机相关基础架构学习路径 一、了解手机相机系统架构 Android Camera HAL&#xff08;如果你是做 Android 平台&#xff09; 学习 Camera HAL3 架构&#xff08;基于 camera_device_t, camera3_device_ops 接口&#xff09; 熟悉 CameraService → CameraProvid…...

C# 类成员的访问:内部与外部

在 C# 编程中&#xff0c;了解如何从类的内部和外部访问成员是非常重要的。本文将详细介绍这两种访问方式&#xff0c;并通过示例代码展示其具体应用。 从类的内部访问成员 类的成员可以在类的内部自由地互相访问&#xff0c;即使这些成员被声明为private。在类的方法中&…...

DAPO:对GRPO的几点改进

DAPO&#xff1a;对GRPO的几点改进 TL; DR&#xff1a;对 GRPO 的几处细节进行了优化&#xff0c;包括去除 KL 约束、解耦 ppo-clip 的上下界&#xff0c;上界设置更高以鼓励探索、超长回答过滤、token level 损失计算等。相比于原始 GRPO&#xff0c;在 AIME24 上提升非常显著…...

从零构建 MCP Server 与 Client:打造你的第一个 AI 工具集成应用

目录 &#x1f680; 从零构建 MCP Server 与 Client&#xff1a;打造你的第一个 AI 工具集成应用 &#x1f9f1; 1. 准备工作 &#x1f6e0;️ 2. 构建 MCP Server&#xff08;服务端&#xff09; 2.1 初始化服务器 &#x1f9e9; 3. 添加自定义工具&#xff08;Tools&…...

2025.4.27 Vue.js 基础学习笔记

一、Vue.js 简介 Vue.js&#xff08;简称 Vue&#xff09;是一个用于构建用户界面的渐进式 JavaScript 框架。它具有以下特点&#xff1a; 轻量级 &#xff1a;核心库体积小&#xff0c;性能优秀&#xff0c;不占用过多资源&#xff0c;加载速度快&#xff0c;适合各种规模的应…...

基于用户场景的汽车行驶工况构建:数据驱动下的能耗优化革命

行业现状&#xff1a;标准工况与用户场景的割裂 全球汽车行业普遍采用WLTC工况进行能耗测试&#xff0c;但其与真实道路场景差异显著。据研究&#xff0c;WLTC工况下车辆能耗数据比实际道路低10%-30%&#xff0c;导致用户对续航虚标投诉激增&#xff08;数据来源&#xff1a;东…...

IoTDB集群部署中的网络、存储与负载配置优化

一、引言 在现代计算机系统和应用程序中&#xff0c;网络I/O性能是决定整体系统表现的关键因素之一。特别是在IoTDB集群环境中&#xff0c;网络I/O的重要性尤为突出&#xff0c;特别是在处理大量测点数据、客户端请求以及集群内部通信时。本文将介绍IoTDB数据库集群部署过程中…...

Unity URPShader:实现和PS一样的色相/饱和度调整参数效果(修复)

目录 前言&#xff1a; 一、问题原因 二、算法修复 三、全代码 前言&#xff1a; 在之前的文章我已经实现了标题所述的内容功能&#xff1a;Unity URPShader&#xff1a;实现和PS一样的色相/饱和度调整参数效果-CSDN博客 但在偶然测试的时候&#xff0c;发现当采样的图片为…...

告别手动时代!物联网软件开发让万物自动互联

清晨&#xff0c;智能窗帘随着阳光自动拉开&#xff1b;运动时&#xff0c;手表精准记录着健康数据&#xff1b;回到家&#xff0c;室温早已调节至最舒适状态...这些场景的实现&#xff0c;都离不开物联网软件开发的技术支撑。在智能家居软件开发、智能穿戴软件开发、医疗器械软…...

Vue ui初始化项目并使用iview写一个菜单导航

winR 输入命令 vue ui浏览器会自动打开http://localhost:8000/ 找到创建 image.png 选择一个目录创建vue项目 image.png 点击再此创建新项目 image.png 我一般都是再已经有git仓库的目录进行项目创建&#xff0c;所以这个勾去掉 点击下一步 image.png 这里可以选择默认&#x…...

函数调用及Chain——SQL+GLM

Langchainchain数据库操作_langchain 操作数据库-CSDN博客 本文和基于上述链接 进一步。 初始化数据库&模型 # temperature0&#xff0c;此处仅需要SQL语句&#xff0c;不需要多样化返回。 from langchain.chains.sql_database.query import create_sql_query_chain from …...

数据科学与计算

Seaborn的介绍 Seaborn 是一个建立在 Matplotlib 基础之上的 Python 数据可视化库&#xff0c;专注于绘制各种统计图形&#xff0c;以便更轻松地呈现和理解数据。 Seaborn 的设计目标是简化统计数据可视化的过程&#xff0c;提供高级接口和美观的默认主题&#xff0c;使得用户…...

【AI提示词】二八法则专家

提示说明 精通二八法则&#xff08;帕累托法则&#xff09;的广泛应用&#xff0c;擅长将其应用于商业、管理、个人发展等领域&#xff0c;深入理解其在不同场景中的具体表现和实际意义。 提示词 # Role: 二八法则专家## Profile - language: 中文 - description: 精通二八法…...

PostgreSQL Patroni集群组件作用介绍:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 简介 1.1 核心作用 • 主节点故障检测 Watchdog 会定时检测数据库主节点&#xff08;或 Pgpool 主节点&#xff09;的运行状态。 一旦主节点宕机&#xff0c;它会发起故障切换请求。 • 协调主备切换 多个 Pgpool 节点时&#xff0c;Watchdog 保证只有一个 Pg…...

【计算机视觉】图像分割:Segment Anything (SAM):通用图像分割的范式革命

Segment Anything&#xff1a;通用图像分割的范式革命 技术突破与架构创新核心设计理念关键技术组件 环境配置与快速开始硬件要求安装步骤基础使用示例 深度功能解析1. 多模态提示融合2. 全图分割生成3. 高分辨率处理 模型微调与定制1. 自定义数据集准备2. 微调训练配置 常见问…...

改进系列(10):基于SwinTransformer+CBAM+多尺度特征融合+FocalLoss改进:自动驾驶地面路况识别

目录 1.代码介绍 1. 主训练脚本train.py 2. 工具函数与模型定义utils.py 3. GUI界面应用infer_QT.py 2.自动驾驶地面路况识别 3.训练过程 4.推理 5.下载 代码已经封装好&#xff0c;对小白友好。 想要更换数据集&#xff0c;参考readme文件摆放好数据集即可&#xff0c…...

大型连锁酒店集团数据湖应用示例

目录 一、应用前面临的严峻背景 二、数据湖的精细化构建过程 &#xff08;一&#xff09;全域数据整合规划 &#xff08;二&#xff09;高效的数据摄取与存储架构搭建 &#xff08;三&#xff09;完善的元数据管理体系建设 &#xff08;四&#xff09;强大的数据分析平台…...

element.scrollIntoView(options)

handleNextClick 函数详解 功能描述 该函数实现在一个表格中“跳转到下一行”的功能&#xff0c;并将目标行滚动至视图顶部。通常用于导航或高亮显示当前选中的数据行。 const handleNextClick () > {// 如果当前已经是最后一行&#xff0c;则不执行后续操作if (current…...

python查看指定的进程是否存在

import os class Paly_Install(object):"""项目根目录"""def get_path(self):self.basedir os.path.dirname(os.path.abspath(__file__))"""安装失败的txt文件"""def test_app(self):self.app["com.faceboo…...

HAproxy+keepalived+tomcat部署高可用负载均衡实践

目录 一、前言 二、服务器规划 三、部署 1、jdk18安装 2、tomcat安装 3、haproxy安装 4、keepalived安装 三、测试 1、服务器停机测试 2、停止haproxy服务测试 总结 一、前言 HAProxy是一个使用C语言编写的自由及开放源代码软件&#xff0c;其提供高可用性、…...

C++负载均衡远程调用学习之自定义内存池管理

目录 1.内存管理_io_buf的结构分析 2.Lars_内存管理_io_buf内存块的实现 3.buf总结 4.buf_pool连接池的单例模式设计和基本属性 5.buf_pool的初始化构造内存池 6.buf_pool的申请内存和重置内存实现 7.课前回顾 1.内存管理_io_buf的结构分析 ## 3) Lars系统总体架构 ​ …...

mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz的下载安装和使用

资源获取链接&#xff1a; mysql-5.7.24-linux-glibc2.12-x86-64.tar.gz和使用说明资源-CSDN文库 详细作用 数据库服务器的核心文件&#xff1a; 这是一个压缩包&#xff0c;解压后包含 MySQL 数据库服务器的可执行文件、库文件、配置文件模板等。 它用于在 Linux 系统上安装…...

Kafka Producer的acks参数对消息可靠性有何影响?

1. acks0 可靠性最低生产者发送消息后不等待任何Broker确认可能丢失消息&#xff08;Broker处理失败/网络丢失时无法感知&#xff09;吞吐量最高&#xff0c;适用于允许数据丢失的场景&#xff08;如日志收集&#xff09; 2. acks1 (默认值) Leader副本确认模式生产者等待Le…...

Linux-04-用户管理命令

一、useradd添加新用户: 基本语法: useradd 用户名:添加新用户 useradd -g 组名 用户:添加新用户到某个组二、passwd设置用户密码: 基本语法: passwd 用户名:设置用户名密码 三、id查看用户是否存在: 基本语法: id 用户名 四、su切换用户: 基本语法: su 用户名称:切换用…...

node爬虫包 pup-crawler,超简单易用

PUP Crawler 这是一个基于puppeteer的简单的爬虫&#xff0c;可以爬取动态、静态加载的网站。 常用于【列表-详情-内容】系列的网站&#xff0c;比如电影视频等网站。 github地址 Usage npm install pup-crawler简单用法&#xff1a; import { PupCrawler } from pup-craw…...

艺术与科技的双向奔赴——高一鑫荣获加州联合表彰

2025年4月20日,在由M.A.D公司协办的“智艺相融,共赴价值巅峰”(Academic and Artistic Fusion Tribute to the Summit of Value)主题发布会上,音乐教育与科技融合领域的代表人物高一鑫,因其在数字音乐教育与中美文化交流方面的杰出贡献,荣获了圣盖博市议员Jorge Herrera和尔湾市…...

React-Native Android 多行被截断

1. 问题描述&#xff1a; 如图所示&#xff1a; 2. 问题解决灵感&#xff1a; 使用相同的react-native代码&#xff0c;运行在两个APP&#xff08;demo 和 project&#xff09;上。demo 展示正常&#xff0c;project 展示不正常。 对两个页面截图&#xff0c;对比如下。 得出…...

Canvas基础篇:图形绘制

Canvas基础篇&#xff1a;图形绘制 图形绘制moveTo()lineTo()lineTo绘制一条直线代码示例效果预览 lineTo绘制平行线代码示例效果预览 lineTo绘制矩形代码示例效果预览 arc()arc绘制一个圆代码实现效果预览 arc绘制一段弧代码实现效果预览 arcTo()rect()曲线 结语 图形绘制 在…...

自定义实现elementui的锚点

背景 前不久有个需求&#xff0c;上半部分是el-step步骤条&#xff0c;下半部分是一些文字说明&#xff0c;需要实现点击步骤条中某个步骤自定义定位到对应部分的文字说明&#xff0c;同时滚动内容区域的时候还要自动选中对应区域的步骤。element-ui-plus的有锚点这个组件&…...

基于UNet算法的农业遥感图像语义分割——补充版

前言 本案例希望建立一个UNET网络模型&#xff0c;来实现对农业遥感图像语义分割的任务。本篇博客主要包括对上一篇博客中的相关遗留问题进行解决&#xff0c;并对网络结构进行优化调整以适应个人的硬件设施——NVIDIA GeForce RTX 3050。 本案例的前两篇博客直达链接基于UNe…...

分布式数字身份:迈向Web3.0世界的通行证 | 北京行活动预告

数字经济浪潮奔涌向前&#xff0c;Web3.0发展方兴未艾&#xff0c;分布式数字身份&#xff08;Decentralized Identity&#xff0c;简称DID&#xff09;通过将分布式账本技术与身份治理相融合&#xff0c;在Web3.0时代多方协作的分布式应用场景中发挥核心作用&#xff0c;是构建…...

CentOS网络之network和NetworkManager深度解析

文章目录 CentOS网络之network和NetworkManager深度解析1. CentOS网络服务发展历史1.1 传统network阶段&#xff08;CentOS 5-6&#xff09;1.2 过渡期&#xff08;CentOS 7&#xff09;1.3 新时代&#xff08;CentOS 8&#xff09; 2. network和NetworkManager的核心区别3. ne…...

【XR】MR芯片 和 VR芯片之争

【XR】MR芯片 和 VR芯片之争 1. MR芯片 和 VR芯片 之间的最大差异是什么2. MR芯片 和 VR芯片 之间的最大差异是什么,国内外市场上有哪些芯片,价格如何,市场怎么样,芯片价格怎么样1. MR芯片 和 VR芯片 之间的最大差异是什么 MR芯片(混合现实芯片)与VR芯片(虚拟现实芯片)…...

关于安卓自动化打包docker+jenkins实现

背景 安卓开发过程中&#xff0c;尤其是提测后&#xff0c;会有一个发包的流程。这个流程简单来说&#xff0c;一般都是开发打包&#xff0c;然后发群里&#xff0c;测试再下载&#xff0c;发送到分发平台&#xff0c;然后把分发平台的应用主页发出来&#xff0c;最后群里面的…...

如何使用CAN分析仪验证MCU CAN错误机制

本文通过实验验证CAN控制器的错误处理机制是否符合相关标准。具体而言&#xff0c;我们使用ZPS-CANFD设备&#xff08;ZPS-CANFD介绍&#xff09;作为测量工具&#xff0c;USBCANFD-200U作为被测设备&#xff08;DUT&#xff09;&#xff0c;通过注入特定类型的错误&#xff0c…...

Centos 7安装 NVIDIA CUDA Toolkit

下载 # 查看操作系统信息 uname -m && cat /etc/redhat-release # 查看显卡信息 lspci | grep -i nvidia从NVIDIA CUDA Toolkit官网下载符合你需求的版本&#xff0c;我这里选择的是runfile(local)的方式。 安装 现在完成后进行安装 chmod x cuda_12.4.0_550.54.1…...

软件测试52讲学习分享:深入理解单元测试

课程背景 最近我在学习极客时间的《软件测试52讲》课程&#xff0c;这是由腾讯TEG基础架构部T4级专家茹炳晟老师主讲的认证课程。作为数字化转型与人工智能(DTAI)产业人才基地建设中心的认证课程&#xff0c;内容非常专业实用。今天想和大家分享第3讲"什么是单元测试&…...