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

【React+TypeScript+DeepSeek】穿越时空对话机

引言

在这个数字化的时代,历史学习常常给人一种距离感。教科书中的历史人物似乎永远停留在文字里,我们无法真正理解他们的思想和智慧。如何让这些伟大的历史人物"活"起来?如何让历史学习变得生动有趣?带着这些思考,我们开发了一个简单的"穿越时空对话机"。

源码已经放在最后啦!


人物选择界面:
人物选择界面
聊天界面:
在这里插入图片描述


1. 项目背景

1.1 创意起源

在传统的历史学习中,学生们往往需要通过记忆大量的史实和年代来了解历史。这种学习方式不仅枯燥,而且难以激发学习兴趣。我们注意到:

  • 学生对历史人物的故事最感兴趣
  • 互动式学习效果最好
  • AI技术为教育带来新可能

基于这些观察,我萌生了开发一个能让用户直接与历史人物"对话"的应用的想法。

1.2 项目目标

  1. 教育价值

    • 让历史学习变得生动有趣
    • 深入理解历史人物的思想
    • 培养历史思维能力
  2. 技术创新

    • 运用先进的AI对话技术
    • 打造流畅的用户体验
    • 实现智能的角色扮演
  3. 文化传承

    • 弘扬优秀传统文化
    • 促进文化交流
    • 连接古今智慧

2. 核心功能概述

2.1 人物库设计

我们精心挑选了来自不同时期、不同领域的历史名人:

  1. 中国古代名人

    • 孔子:儒家思想的代表,强调仁义礼智信
    • 诸葛亮:军事谋略家,智慧与忠诚的化身
    • 李白:浪漫主义诗人,豪放不羁的文学天才
    • 苏轼:文学艺术全才,豁达乐观的人生导师
    • 李时珍:医学大师,严谨求实的科学精神
  2. 世界名人

    • 达芬奇:文艺复兴全才,艺术与科学的完美结合
    • 爱因斯坦:现代物理学家,创新思维的代表
    • 莎士比亚:戏剧大师,人性洞察的大师
    • 莫扎特:音乐天才,艺术激情的化身

每个人物都经过精心设计,包括:

  • 详细的背景故事
  • 独特的性格特征
  • 专业领域知识
  • 语言表达风格
  • 典型的思维方式

2.2 对话系统

基于DeepSeek API构建的智能对话系统具有以下特点:

  1. 角色准确性

    • 准确还原历史人物性格
    • 保持语言风格一致性
    • 符合历史背景
  2. 对话智能性

    • 上下文理解能力
    • 灵活的问题处理
    • 深度的知识储备
  3. 交互自然性

    • 流畅的对话节奏
    • 自然的语言表达
    • 适当的情感表现

3. 技术架构

3.1 技术栈选择

我们采用了现代化的技术栈:

  1. 前端技术

    - React 18
    - TypeScript 4.x
    - Vite
    - CSS Modules
    
  2. AI对话引擎

    - DeepSeek API
    - WebSocket
    - Axios
    
  3. 数据存储

    - LocalStorage
    

3.2 系统架构

采用清晰的分层架构:

  1. 表现层

    • 角色选择界面
    • 对话交互界面
    • 用户反馈组件
  2. 业务层

    • 对话管理
    • 角色控制
    • 会话处理
  3. 数据层

    • API通信
    • 本地存储
    • 状态管理

3.3 数据流设计

实现了清晰的单向数据流:

用户输入
状态更新
API请求
响应处理
界面更新

4. DeepSeek API集成

4.1 API配置

const api = axios.create({baseURL: 'https://api.deepseek.com/v1',headers: {'Authorization': `Bearer ${API_KEY}`,'Content-Type': 'application/json',},
});

4.2 对话生成

export const generateResponse = async (messages: ChatMessage[]) => {const response = await api.post('/chat/completions', {model: 'deepseek-chat',messages,temperature: 0.7,max_tokens: 1000,});return response.data.choices[0].message.content;
};

4.3 提示词系统

为每个历史人物设计了专门的提示词模板:

interface HistoricalFigurePrompt {id: string;name: string;period: string;description: string;avatar: string;systemPrompt: string;sampleQuestions: string[];personality: string;background: string;
}

5. 开发规范

5.1 代码规范

  • 使用ESLint进行代码检查
  • 使用Prettier进行代码格式化
  • 遵循TypeScript严格模式
  • 采用函数式编程范式

5.2 命名规范

  • 组件采用大驼峰命名
  • 函数采用小驼峰命名
  • 常量使用大写下划线
  • CSS类名采用kebab-case

5.3 文件组织

src/
├── components/     # 通用组件
├── pages/         # 页面组件
├── services/      # 服务层
├── styles/        # 样式文件

6. 用户界面设计理念

6.1 设计原则

在设计用户界面时,我们遵循以下核心原则:

  1. 简约而不简单

    • 清晰的视觉层次
    • 重点内容突出
    • 减少视觉干扰
  2. 沉浸式体验

    • 符合历史氛围
    • 富有时代特色
    • 细节打造意境
  3. 交互友好

    • 操作直观
    • 反馈及时
    • 引导清晰

6.2 视觉风格

我们采用了现代简约与古典元素相结合的设计风格:

  1. 配色方案

    :root {--primary-color: #4A90E2;--secondary-color: #F5A623;--text-color: #2C3E50;--background-color: #F8F9FA;--border-color: #E2E8F0;
    }
    
  2. 字体选择

    • 中文:思源宋体
    • 英文:Roboto
    • 代码:JetBrains Mono
  3. 布局网格

    • 基础单位:8px
    • 内容区域最大宽度:1200px
    • 响应式断点:576px、768px、992px、1200px

7. 角色选择页面

7.1 布局设计

角色选择页面采用卡片式布局:

const CharacterSelect: React.FC = () => {return (<div className="character-select"><header className="header"><h1>穿越时空</h1><p>与历史对话</p></header><div className="character-grid">{historicalFigures.map(figure => (<CharacterCardkey={figure.id}figure={figure}onClick={() => handleSelect(figure)}/>))}</div></div>);
};

7.2 角色卡片设计

每个角色卡片包含:

  1. 视觉元素

    • 头像/形象
    • 姓名/时代
    • 特色标签
    • 简介文字
  2. 交互效果

    .character-card {transition: transform 0.3s ease;&:hover {transform: translateY(-5px);box-shadow: 0 10px 20px rgba(0,0,0,0.1);}
    }
    
  3. 信息展示

    const CharacterCard: React.FC<Props> = ({ figure }) => (<div className="character-card"><div className="avatar">{figure.avatar}</div><h3>{figure.name}</h3><p className="period">{figure.period}</p><p className="description">{figure.description}</p><div className="personality-tags">{figure.personality.split(',').map(tag => (<span className="tag">{tag}</span>))}</div></div>
    );
    

8. 对话界面实现

8.1 整体布局

对话界面分为三个主要部分:

  1. 顶部导航

    • 返回按钮
    • 当前角色信息
    • 功能按钮
  2. 对话区域

    • 消息气泡
    • 打字机效果
    • 滚动加载
  3. 输入区域

    • 消息输入框
    • 发送按钮
    • 快捷操作

8.2 消息展示

实现了富有特色的消息气泡:

const MessageBubble: React.FC<Props> = ({ message, isUser }) => (<div className={`message ${isUser ? 'user' : 'assistant'}`}><div className="avatar">{isUser ? '👤' : selectedFigure.avatar}</div><div className="content"><div className="bubble">{message.content}</div><div className="time">{formatTime(message.timestamp)}</div></div></div>
);

8.3 打字机效果

实现了自然的打字机效果:

const simulateTyping = async (content: string) => {await new Promise(resolve => setTimeout(resolve, 500 + Math.random() * 1000));return content;
};

8.4 历史记录功能

实现了完整的对话历史管理:

interface ChatHistory {characterId: string;messages: ChatMessage[];lastUpdated: string;
}export const saveChatHistory = (characterId: string, messages: ChatMessage[]) => {try {const existingHistory = localStorage.getItem(CHAT_HISTORY_KEY);const history = existingHistory ? JSON.parse(existingHistory) : {};history[characterId] = {characterId,messages,lastUpdated: new Date().toISOString()};localStorage.setItem(CHAT_HISTORY_KEY, JSON.stringify(history));} catch (error) {console.error('Failed to save chat history:', error);}
};

9. 动画效果

9.1 过渡动画

使用CSS transitions实现平滑过渡:

.fade-enter {opacity: 0;transform: translateY(20px);
}.fade-enter-active {opacity: 1;transform: translateY(0);transition: opacity 300ms, transform 300ms;
}.fade-exit {opacity: 1;
}.fade-exit-active {opacity: 0;transition: opacity 300ms;
}

9.2 加载动画

实现了优雅的加载效果:

.typing-indicator {display: flex;gap: 4px;padding: 8px 12px;.dot {width: 8px;height: 8px;background: var(--primary-color);border-radius: 50%;animation: bounce 1.4s infinite ease-in-out;&:nth-child(1) { animation-delay: -0.32s; }&:nth-child(2) { animation-delay: -0.16s; }}
}@keyframes bounce {0%, 80%, 100% { transform: scale(0); }40% { transform: scale(1); }
}

10. 响应式设计

10.1 媒体查询

实现了完整的响应式布局:

/* 移动端 */
@media (max-width: 576px) {.character-grid {grid-template-columns: 1fr;}
}/* 平板 */
@media (min-width: 577px) and (max-width: 992px) {.character-grid {grid-template-columns: repeat(2, 1fr);}
}/* 桌面端 */
@media (min-width: 993px) {.character-grid {grid-template-columns: repeat(3, 1fr);}
}

10.2 弹性布局

使用Flexbox实现灵活的布局:

.chat-container {display: flex;flex-direction: column;height: 100vh;.chat-messages {flex: 1;overflow-y: auto;}.chat-input {padding: 1rem;border-top: 1px solid var(--border-color);}
}

11. 性能优化

11.1 虚拟滚动

实现了消息列表的虚拟滚动:

import { FixedSizeList } from 'react-window';const MessageList: React.FC<Props> = ({ messages }) => (<FixedSizeListheight={600}itemCount={messages.length}itemSize={80}width="100%">{({ index, style }) => (<MessageItemmessage={messages[index]}style={style}/>)}</FixedSizeList>
);

11.2 防抖处理

对输入和滚动事件进行防抖处理:

const debouncedScroll = debounce(() => {const { scrollTop, scrollHeight, clientHeight } = messagesRef.current;if (scrollHeight - scrollTop === clientHeight) {loadMoreMessages();}
}, 200);

11.3 懒加载

实现了图片和组件的懒加载:

const LazyCharacterCard = React.lazy(() => import('./CharacterCard'));const CharacterGrid = () => (<Suspense fallback={<Skeleton />}>{figures.map(figure => (<LazyCharacterCardkey={figure.id}figure={figure}/>))}</Suspense>
);

12. 性能优化策略

12.1 代码层面优化

12.1.1 React优化
  1. 组件优化
// 使用React.memo避免不必要的重渲染
const MessageBubble = React.memo<Props>(({ message, isUser }) => {return (<div className={`message ${isUser ? 'user' : 'assistant'}`}>{/* 消息内容 */}</div>);
});// 使用useCallback优化事件处理函数
const handleSendMessage = useCallback(() => {// 处理发送消息
}, [dependencies]);
  1. 状态管理优化
// 使用useReducer处理复杂状态
const [state, dispatch] = useReducer(chatReducer, initialState);// 分离状态逻辑
const chatReducer = (state, action) => {switch (action.type) {case 'ADD_MESSAGE':return {...state,messages: [...state.messages, action.payload]};case 'CLEAR_HISTORY':return {...state,messages: []};default:return state;}
};
12.1.2 资源加载优化
  1. 代码分割
// 路由级别的代码分割
const ChatInterface = lazy(() => import('./pages/ChatInterface'));
const CharacterSelect = lazy(() => import('./pages/CharacterSelect'));// 组件级别的代码分割
const MarkdownRenderer = lazy(() => import('./components/MarkdownRenderer'));
  1. 资源预加载
// 预加载关键资源
const prefetchResources = () => {const links = [{ rel: 'prefetch', href: '/assets/fonts/main.woff2' },{ rel: 'preload', href: '/assets/images/sprites.png', as: 'image' }];links.forEach(link => {const linkElement = document.createElement('link');Object.assign(linkElement, link);document.head.appendChild(linkElement);});
};

12.2 网络优化

12.2.1 API请求优化
  1. 请求缓存
const cache = new Map();const cachedFetch = async (url: string) => {if (cache.has(url)) {return cache.get(url);}const response = await fetch(url);const data = await response.json();cache.set(url, data);return data;
};
  1. 请求合并
const batchRequest = async (requests: Request[]) => {const batchId = generateBatchId();return await api.post('/batch', {batchId,requests});
};
12.2.2 WebSocket优化
class WebSocketManager {private ws: WebSocket;private reconnectAttempts = 0;private maxReconnectAttempts = 5;constructor(url: string) {this.ws = new WebSocket(url);this.setupEventHandlers();}private setupEventHandlers() {this.ws.onclose = () => {if (this.reconnectAttempts < this.maxReconnectAttempts) {setTimeout(() => this.reconnect(), 1000 * Math.pow(2, this.reconnectAttempts));}};}private reconnect() {this.reconnectAttempts++;// 重新连接逻辑}
}

12.3 存储优化

12.3.1 本地存储优化
  1. 数据压缩
import { compress, decompress } from 'lz-string';const saveCompressedData = (key: string, data: any) => {const compressed = compress(JSON.stringify(data));localStorage.setItem(key, compressed);
};const loadCompressedData = (key: string) => {const compressed = localStorage.getItem(key);if (!compressed) return null;return JSON.parse(decompress(compressed));
};
  1. 存储管理
class StorageManager {private maxSize = 5 * 1024 * 1024; // 5MBasync cleanup() {const items = { ...localStorage };const totalSize = Object.values(items).reduce((size, item) => size + item.length, 0);if (totalSize > this.maxSize) {// 清理最旧的数据const oldestKey = this.findOldestKey();localStorage.removeItem(oldestKey);}}
}

13. 用户体验优化

13.1 交互优化

13.1.1 输入优化
  1. 智能提示
const AutoComplete: React.FC<Props> = ({ suggestions, onSelect }) => {return (<div className="autocomplete">{suggestions.map(suggestion => (<divkey={suggestion.id}className="suggestion"onClick={() => onSelect(suggestion)}>{suggestion.text}</div>))}</div>);
};
  1. 输入防抖
const useDebounce = (value: string, delay: number) => {const [debouncedValue, setDebouncedValue] = useState(value);useEffect(() => {const handler = setTimeout(() => {setDebouncedValue(value);}, delay);return () => {clearTimeout(handler);};}, [value, delay]);return debouncedValue;
};

13.2 动画优化

13.2.1 性能优化的动画
.optimized-animation {will-change: transform;transform: translateZ(0);backface-visibility: hidden;
}@keyframes smooth-entrance {from {opacity: 0;transform: translateY(20px);}to {opacity: 1;transform: translateY(0);}
}
13.2.2 动画管理
class AnimationManager {private animations: Map<string, Animation> = new Map();register(id: string, animation: Animation) {this.animations.set(id, animation);}play(id: string) {const animation = this.animations.get(id);if (animation) {animation.play();}}pause(id: string) {const animation = this.animations.get(id);if (animation) {animation.pause();}}
}

结语

"穿越时空对话机"探索了如何将先进的AI技术与教育需求相结合的可能性。通过这个项目,我们不仅实现了有趣的历史对话功能,也积累了宝贵的技术经验。

未来,我们将继续优化和扩展这个项目,让更多人能够通过这种创新的方式学习历史、感受文化。我们相信,技术的进步将为教育带来更多可能性。


Gitee源码

相关文章:

【React+TypeScript+DeepSeek】穿越时空对话机

引言 在这个数字化的时代&#xff0c;历史学习常常给人一种距离感。教科书中的历史人物似乎永远停留在文字里&#xff0c;我们无法真正理解他们的思想和智慧。如何让这些伟大的历史人物"活"起来&#xff1f;如何让历史学习变得生动有趣&#xff1f;带着这些思考&…...

公共数据授权运营系统建设手册(附下载)

在全球范围内&#xff0c;许多国家和地区已经开始探索公共数据授权运营的路径和模式。通过建立公共数据平台&#xff0c;推动数据的开放共享&#xff0c;促进数据的创新应用&#xff0c;不仅能够提高政府决策的科学性和公共服务的效率&#xff0c;还能够激发市场活力&#xff0…...

基于HTML和CSS的旅游小程序

一、技术基础 HTML&#xff08;HyperText Markup Language&#xff09;&#xff1a;超文本标记语言&#xff0c;用于定义网页的内容和结构。在旅游小程序中&#xff0c;HTML用于搭建页面的基本框架&#xff0c;包括标题、段落、图片、链接等元素&#xff0c;以及用于交互的表单…...

maven之插件调试

当使用maven进行项目管理的时候&#xff0c;可能会碰到一些疑难问题。网上资料很少&#xff0c;可能会想着直接调试定位问题。这里以maven-compiler-plugin为例&#xff1a; &#xff08;1&#xff09;准备maven-compiler-plugin源码 进入maven 官网-》Maven Plugins-》找到对…...

SQL Sever 数据库损坏,只有.mdf文件,如何恢复?

SQL Sever 数据库损坏&#xff0c;只有.mdf文件&#xff0c;如何恢复 在SQL Server 2008中&#xff0c;如果只有MDF文件而没有LDF文件&#xff0c;附加数据库的过程会稍微复杂一些。以下是几种可能的方法 一、使用紧急模式重建日志文件 1、新建一个同名的数据库。 2、停止SQ…...

【AWS SDK PHP】This operation requests `sigv4a` auth schemes 问题处理

使用AWS SDK碰到的错误&#xff0c;其实很简单&#xff0c;要装个扩展库 保持如下 Fatal error: Uncaught Aws\Auth\Exception\UnresolvedAuthSchemeException: This operation requests sigv4a auth schemes, but the client currently supports sigv4, none, bearer, sigv4-…...

primevue的<Menu>组件

1.使用场景 2.代码 1.给你的menu组件起个引用名 2.<Menu>组件需要一个MenuItem[] 3.你要知道MenuItem[ ]的特殊的数据格式&#xff0c;就像TreeNode[ ]一样&#xff0c;数据格式不对是不渲染的。。。。 常用的属性就这几种&#xff0c;js语言和java不一样&#xff0c;J…...

利用Deeplearning4j进行 图像识别

目录 图像识别简介 神经网络 感知器 前馈神经网络 自动编码器 受限玻尔兹曼机 深度卷积网络 理解图像内容以及图像含义方面&#xff0c;计算机遇到了很大困难。本章先介绍计算机理解图像教育方面 遇到的难题&#xff0c;接着重点讲解一个基于深度学习的解决方法。我们会…...

练习题:37

目录 Python题目 题目 题目分析 套接字概念剖析 通信原理分析 服务器 - 客户端连接建立过程&#xff1a; 基于套接字通信的底层机制&#xff1a; 代码实现 基于 TCP 的简单服务器 - 客户端通信示例 服务器端代码&#xff08;tcp_server.py&#xff09; 客户端代码&a…...

Unity热更文件比较工具类

打包出来的热更文件&#xff0c;如果每次都要全部上传到CDN文件服务器&#xff0c;不进耗费时间长&#xff0c;还浪费流量。 所以让AI写了个简单的文件比较工具类&#xff0c;然后修改了一下可用。记录一下。 路径可自行更改。校验算法这里使用的是MD5&#xff0c;如果使用SH…...

【hustoj注意事项】函数返回值问题

原文 https://lg.h-fmc.cn/index.php/BC/27.html 问题回顾 此题目选自HFMC_OJ&#xff1a;4312: 简单递归操作 hustoj测试 此问题错误的代码是 #include<bits/stdc.h> using namespace std; int a[10000];int n; int b[10000]{0}; int pailie(int deep) {int i; for(…...

实现一个通用的树形结构构建工具

文章目录 1. 前言2. 树结构3. 具体实现逻辑3.1 TreeNode3.2 TreeUtils3.3 例子 4. 小结 1. 前言 树结构的生成在项目中应该都比较常见&#xff0c;比如部门结构树的生成&#xff0c;目录结构树的生成&#xff0c;但是大家有没有想过&#xff0c;如果在一个项目中有多个树结构&…...

数势科技:解锁数据分析 Agent 的智能密码(14/30)

一、数势科技引领数据分析变革 在当今数字化浪潮中&#xff0c;数据已然成为企业的核心资产&#xff0c;而数据分析则是挖掘这一资产价值的关键钥匙。数势科技&#xff0c;作为数据智能领域的领军者&#xff0c;以其前沿的技术与创新的产品&#xff0c;为企业开启了高效数据分析…...

机器学习之过采样和下采样调整不均衡样本的逻辑回归模型

过采样和下采样调整不均衡样本的逻辑回归模型 目录 过采样和下采样调整不均衡样本的逻辑回归模型1 过采样1.1 样本不均衡1.2 概念1.3 图片理解1.4 SMOTE算法1.5 算法导入1.6 函数及格式1.7 样本类别可视化理解 2 下采样2.1 概念2.2 图片理解2.3 数据处理理解2.4 样本类别可视化…...

解决 ssh connect to host github.com port 22 Connection timed out

一、问题描述 本地 pull/push 推送代码到 github 项目报 22 端口连接超时&#xff0c;测试连接也是 22 端口连接超时 ssh 密钥没问题、也开了 Watt Toolkit 网络是通的&#xff0c;因此可以强制将端口切换为 443 二、解决方案 1、测试连接 ssh -T gitgithub.com意味着无法通…...

mybatis/mybatis-plus中mysql报错

文章目录 一、sql执行正常,mybatis报错二、sql执行正常,mybatis-plus报错直接改变字段利用mybatis-plus特性处理 总结 一、sql执行正常,mybatis报错 Caused by: net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "ur" <K_ISOLATION>a…...

在ros2 jazzy和gazebo harmonic下的建图导航(cartographer和navigation)实现(基本)

我的github分支&#xff01;&#xff01;&#xff01; 你可以在这里找到相对应的源码。 DWDROME的MOGI分支 来源于&#xff01;&#xff01; MOGI-ROS/Week-3-4-Gazebo-basics 学习分支整理日志 分支概述 这是一个用于个人学习的新分支&#xff0c;目的是扩展基本模型并添加…...

《Rust权威指南》学习笔记(五)

高级特性 1.在Rust中&#xff0c;unsafe是一种允许绕过Rust的安全性保证的机制&#xff0c;用于执行一些Rust默认情况下不允许的操作。unsafe存在的原因是&#xff1a;unsafe 允许执行某些可能被 Rust 的安全性检查阻止的操作&#xff0c;从而可以进行性能优化&#xff0c;如手…...

GitHub的简单操作

引言 今天开始就要开始做项目了&#xff0c;上午是要把git搭好。搭的过程中遇到好多好多的问题。下面就说一下git的简单操作流程。我们是使用的GitHub,下面也就以这个为例了 一、GitHub账号的登录注册 https://github.com/ 通过这个网址可以来到GitHub首页 点击中间绿色的S…...

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...