Vue+Ant Design搭建AI聊天对话
今天在这里介绍一下 Ant Design X,这是蚂蚁设计团队推出的一款专注于人工智能(AI)领域的组件库,主要面向 React 生态系统(目前支持Openai,通义千问)。官方也推出了ant-design-x-vue 面向 Vue。当然我们今天的主题也是使用 Vue 搭建。
搭建 Vue 3 项目
1. 创建项目
首先,我们先创建一个 Vue 3 项目,这里使用 Vite 创建:
npm create vite@latest
随后跟着提示选择 Vue 即可。使用编辑器打开项目后,在终端进行安装依赖并运行:
npm i
npm run dev
这样我们的 Vue 3 demo 就搭建好了。
2. 安装依赖
接下来开始安装 ant-design-x-vue
需要的依赖:
npm i ant-design-vue
npm i ant-design-x-vue
npm i @vitejs/plugin-vue-jsx
3. 创建项目模板(可选)
npm create vite@latest my-vue-macros -- --template vue-ts
配置文件
1. 配置 vite.config.ts
import { defineConfig } from 'vite';
import VueMacros from 'unplugin-vue-macros/vite';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';// https://vite.dev/config/
export default defineConfig({plugins: [VueMacros({plugins: {vue: vue(),vueJsx: vueJsx(),},}),],
});
2. 配置 tsconfig.json
{"compilerOptions": {"target": "esnext","module": "esnext","esModuleInterop": true,"moduleResolution": "bundler","jsx": "preserve","jsxImportSource": "vue"}
}
App.vue
模板
<script setup lang="tsx">// 引入 Ant Design X Vue 相关组件和类型import {Attachments,type AttachmentsProps,Bubble,type BubbleListProps,Conversations,type ConversationsProps,Prompts,type PromptsProps,Sender,Welcome,useXAgent,useXChat,} from 'ant-design-x-vue';// 引入 Ant Design 图标组件import {CloudUploadOutlined,CommentOutlined,EllipsisOutlined,FireOutlined,HeartOutlined,PaperClipOutlined,PlusOutlined,ReadOutlined,ShareAltOutlined,SmileOutlined,} from '@ant-design/icons-vue';// 引入 Ant Design Vue 通用组件和主题import { Badge, Button, Space, theme } from 'ant-design-vue';// 引入 Vue 相关 APIimport { computed, ref, watch, type VNode } from 'vue';// 定义组件名称defineOptions({ name: 'PlaygroundIndependent' });// 辅助函数:模拟延迟const sleep = () => new Promise((resolve) => setTimeout(resolve, 500));// 辅助函数:渲染标题const renderTitle = (icon: VNode, title: string) => (<Space align="start">{icon}<span>{title}</span></Space>);// 会话列表默认数据const defaultConversationsItems = [{key: '0',label: 'What is Ant Design X?',},];// 占位提示词列表数据const placeholderPromptsItems: PromptsProps['items'] = [{key: '1',label: renderTitle(<FireOutlined style={{ color: '#FF4D4F' }} />, 'Hot Topics'),description: 'What are you interested in?',children: [{key: '1-1',description: `What's new in X?`,},{key: '1-2',description: `What's AGI?`,},{key: '1-3',description: `Where is the doc?`,},],},{key: '2',label: renderTitle(<ReadOutlined style={{ color: '#1890FF' }} />, 'Design Guide'),description: 'How to design a good product?',children: [{key: '2-1',icon: <HeartOutlined />,description: `Know the well`,},{key: '2-2',icon: <SmileOutlined />,description: `Set the AI role`,},{key: '2-3',icon: <CommentOutlined />,description: `Express the feeling`,},],},];// 发送者提示词列表数据const senderPromptsItems: PromptsProps['items'] = [{key: '1',description: 'Hot Topics',icon: <FireOutlined style={{ color: '#FF4D4F' }} />,},{key: '2',description: 'Design Guide',icon: <ReadOutlined style={{ color: '#1890FF' }} />,},];// 消息气泡角色配置const roles: BubbleListProps['roles'] = {ai: {placement: 'start',typing: { step: 5, interval: 20 },styles: {content: {borderRadius: '16px',},},},local: {placement: 'end',variant: 'shadow',},};// ==================== Style ====================// 获取主题 tokenconst { token } = theme.useToken();// 计算样式对象const styles = computed(() => {return {layout: {width: '100%','min-width': '1000px',height: '722px','border-radius': `${token.value.borderRadius}px`,display: 'flex',background: `${token.value.colorBgContainer}`,'font-family': `AlibabaPuHuiTi, ${token.value.fontFamily}, sans-serif`,},menu: {background: `${token.value.colorBgLayout}80`,width: '280px',height: '100%',display: 'flex','flex-direction': 'column',},conversations: {padding: '0 12px',flex: 1,'overflow-y': 'auto',},chat: {height: '100%',width: '100%','max-width': '700px',margin: '0 auto','box-sizing': 'border-box',display: 'flex','flex-direction': 'column',padding: `${token.value.paddingLG}px`,gap: '16px',},messages: {flex: 1,},placeholder: {'padding-top': '32px',},sender: {'box-shadow': token.value.boxShadow,},logo: {display: 'flex',height: '72px','align-items': 'center','justify-content': 'start',padding: '0 24px','box-sizing': 'border-box',},'logo-img': {width: '24px',height: '24px',display: 'inline-block',},'logo-span': {display: 'inline-block',margin: '0 8px','font-weight': 'bold',color: token.value.colorText,'font-size': '16px',},addBtn: {background: '#1677ff0f',border: '1px solid #1677ff34',width: 'calc(100% - 24px)',margin: '0 12px 24px 12px',},} as const;});// ==================== State ====================// 头部展开状态const headerOpen = ref(false);// 输入框内容const content = ref('');// 会话列表数据const conversationsItems = ref(defaultConversationsItems);// 当前激活的会话 keyconst activeKey = ref(defaultConversationsItems[0].key);// 附件列表const attachedFiles = ref<AttachmentsProps['items']>([]);// 代理请求加载状态const agentRequestLoading = ref(false);// ==================== Runtime ====================// 使用 useXAgent 初始化代理const [agent] = useXAgent({request: async ({ message }, { onSuccess }) => {agentRequestLoading.value = true;await sleep();agentRequestLoading.value = false;onSuccess(`Mock success return. You said: ${message}`);},});// 使用 useXChat 管理聊天逻辑const { onRequest, messages, setMessages } = useXChat({agent: agent.value,});// 监听激活会话变化,清空消息列表watch(activeKey, () => {if (activeKey.value!== undefined) {setMessages([]);}}, { immediate: true });// ==================== Event ====================// 提交消息处理函数const onSubmit = (nextContent: string) => {if (!nextContent) return;onRequest(nextContent);content.value = '';};// 提示词项点击处理函数const onPromptsItemClick: PromptsProps['onItemClick'] = (info) => {onRequest(info.data.description as string);};// 添加会话处理函数const onAddConversation = () => {conversationsItems.value = [...conversationsItems.value,{key: `${conversationsItems.value.length}`,label: `New Conversation ${conversationsItems.value.length}`,},];activeKey.value = `${conversationsItems.value.length}`;};// 会话点击处理函数const onConversationClick: ConversationsProps['onActiveChange'] = (key) => {activeKey.value = key;};// 附件变化处理函数const handleFileChange: AttachmentsProps['onChange'] = (info) =>attachedFiles.value = info.fileList;// ==================== Nodes ====================// 占位节点计算属性const placeholderNode = computed(() => (<Space direction="vertical" size={16} style={styles.value.placeholder}><Welcomevariant="borderless"icon="https://mdn.alipayobjects.com/huamei_iwk9zp/afts/img/A*s5sNRo5LjfQAAAAAAAAAAAAADgCCAQ/fmt.webp"title="Hello, I'm Ant Design X"description="Base on Ant Design, AGI product interface solution, create a better intelligent vision~"extra={<Space><Button icon={<ShareAltOutlined />} /><Button icon={<EllipsisOutlined />} /></Space>}/><Promptstitle="Do you want?"items={placeholderPromptsItems}styles={{list: {width: '100%',},item: {flex: 1,},}}onItemClick={onPromptsItemClick}/></Space>));// 消息列表项计算属性const items = computed<BubbleListProps['items']>(() => messages.value.map(({ id, message, status }) => ({key: id,loading: status === 'loading',role: status === 'local'? 'local' : 'ai',content: message,})));// 附件节点计算属性const attachmentsNode = computed(() => (<Badge dot={attachedFiles.value.length > 0 &&!headerOpen.value}><Button type="text" icon={<PaperClipOutlined />} onClick={() => headerOpen.value =!headerOpen.value} /></Badge>));// 发送者头部节点计算属性const senderHeader = computed(() => (<Sender.Headertitle="Attachments"open={headerOpen.value}onOpenChange={(open) => headerOpen.value = open}styles={{content: {padding: 0,},}}><AttachmentsbeforeUpload={() => false}items={attachedFiles.value}onChange={handleFileChange}placeholder={(type) =>type === 'drop'? { title: 'Drop file here' }: {icon: <CloudUploadOutlined />,title: 'Upload files',description: 'Click or drag files to this area to upload',}}/></Sender.Header>));// 徽标节点计算属性const logoNode = computed(() => (<div style={styles.value.logo}><imgsrc="https://mdn.alipayobjects.com/huamei_iwk9zp/afts/img/A*eco6RrQhxbMAAAAAAAAAAAAADgCCAQ/original"draggable={false}alt="logo"style={styles.value['logo-img']}/><span style={styles.value['logo-span']}>Ant Design X Vue</span></div>));// 定义渲染函数defineRender(() => {return (<div style={styles.value.layout}><div style={styles.value.menu}>{/* 🌟 Logo */}{logoNode.value}{/* 🌟 添加会话 */}<ButtononClick={onAddConversation}type="link"style={styles.value.addBtn}icon={<PlusOutlined />}>New Conversation</Button>{/* 🌟 会话管理 */}<Conversationsitems={conversationsItems.value}style={styles.value.conversations}activeKey={activeKey.value}onActiveChange={onConversationClick}/></div><div style={styles.value.chat}>{/* 🌟 消息列表 */}<Bubble.Listitems={items.value.length > 0? items.value : [{ content: placeholderNode.value, variant: 'borderless' }]}roles={roles}style={styles.value.messages}/>{/* 🌟 提示词 */}<Prompts style={{ color: token.value.colorText }} items={senderPromptsItems} onItemClick={onPromptsItemClick} />{/* 🌟 输入框 */}<Sendervalue={content.value}header={senderHeader.value}onSubmit={onSubmit}onChange={(value) => content.value = value}prefix={attachmentsNode.value}loading={agentRequestLoading.value}style={styles.value.sender}/></div></div>);});
</script>
vue文档:
https://antd-design-x-vue.netlify.app/component/prompts.html
Ant Design X文档(React):
https://ant-design-x.antgroup.com/index-cn?theme=compact
运行结果
相关文章:
Vue+Ant Design搭建AI聊天对话
今天在这里介绍一下 Ant Design X,这是蚂蚁设计团队推出的一款专注于人工智能(AI)领域的组件库,主要面向 React 生态系统(目前支持Openai,通义千问)。官方也推出了ant-design-x-vue 面向 Vue。当然我们今天的主题也是使…...
应用案例 | 精准控制,高效运行—宏集智能控制系统助力SCARA机器人极致性能
概述 随着工业4.0的深入推进,制造业对自动化和智能化的需求日益增长。传统生产线面临空间不足、效率低下、灵活性差等问题,尤其在现有工厂改造项目中,如何在有限空间内实现高效自动化成为一大挑战。 此次项目的客户需要在现有工厂基础上进行…...
JavaScript基础-运算符的分类
在JavaScript编程中,运算符是构建表达式和执行操作的基础工具。了解不同类型的运算符以及它们的工作原理对于编写高效且无误的代码至关重要。本文将介绍JavaScript中的主要运算符类型,并通过实例展示它们的用法。 一、算术运算符 算术运算符用于执行基…...
URIError: URI malformed
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
达梦适配记录-检查服务器
service DmServicedmdb status 查看是否开启,没有配置systemctl,查看《DM8_Linux 服务脚本使用手册》2.1.2.2 1 .拷贝服务模板文件( DmService )到目录( /opt/dmdbms/bin ),并将新文…...
【leetcode hot 100 160】相交链表
解法一:(哈希集合)利用HashSet保存一个链表的值,循环另一个列表,在HashSet中寻找该值。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x…...
选择排序算法的SIMD优化
一、优化原理 将查找数组最小值索引的SIMD优化的函数嵌入选择排序主循环,优化最耗时的最小值查找环节,同时保留选择排序的交换逻辑。 二、关键改造步骤 1)最小值查找模块化 复用SIMD优化的 find_min_index_simd函数。 2)动态子数组处理 每次循环处理 arr[i..n-1] 子数…...
Visual Studio Code打开远程服务器项目,打开服务器Android上百G源码,SSH免密连接方式
Visual Studio Code打开远程服务器项目 1,Visual Studio Code拓展中,安装远程插件 Remote Development 2,SSH免密连接,A电脑免密连接B,配置B电脑.ssh/authorized_keys A电脑的.ssh/id_rsa.pub中的公钥内容,…...
vscode mac版本 配置git
首先使用 type -a git查看git的安装目录 然后在vscode中找到settings配置文件,修改git.path...
BUUCTF——[GYCTF2020]FlaskApp1 SSTI模板注入/PIN学习
目录 一、网页功能探索 二、SSTI注入 三、方法一 四、方法二 使用PIN码 (1)服务器运行flask登录所需的用户名 (2)modename (3)flask库下app.py的绝对路径 (4)当前网络的mac地…...
【QT常用技术讲解】window系统以CMD命令行方式执行第三方程序及注册表文件命令
前言 在window下(本篇为window10),调用第三方应用,可以调用后台CMD执行的命令行。如果是浏览器调用第三方应用,可以通过自定义域名调用指定的处理脚本,处理脚本再调用第三方软件。本篇只讲解QT程序调用后台…...
manus是什么?能干啥?
Manus哪儿来的? Manus是一款由中国团队Monica.im于2025年3月5日发布的通用型AI代理(AI Agent)产品,旨在通过自主思考、系统规划和灵活工具调用,帮助用户完成各种复杂任务,从而解放用户的时间与创…...
物联网系统搭建
实验项目名称 构建物联网系统 实验目的 掌握物联网系统的一般构建方法。 实验要求: 1.构建物联网系统,实现前后端的交互。 实验内容: CS模式MQTT(不带数据分析处理功能) 实现智能设备与应用客户端的交…...
恭喜!《哪吒2》明天将荣登世界影坛第六!目前仅差1.81亿元
全球总票房为为20.27亿美元!3月8日将荣登世界影坛第六宝座! 中国票房 内地票房 中国电影票房、灯塔、猫眼三大数据源加权平均得出《哪吒2》中国内地总票房为144.26亿元人民币。 港澳票房 目前港澳地区没有新的数据显示,按3月6日1905电影网…...
2025 ubuntu24.04系统安装docker
1.查看ubuntu版本(Ubuntu 24.04 LTS) rootmaster:~# cat /etc/os-release PRETTY_NAME"Ubuntu 24.04 LTS" NAME"Ubuntu" VERSION_ID"24.04" VERSION"24.04 LTS (Noble Numbat)" VERSION_CODENAMEnoble IDubun…...
浅说图论基础
引入 在学最短路算法之前,我们要先搞清楚另外一个事情,什么是图,我们又可以基于图做那些事情。 图不同于树,它是一种更加复杂的数据结构,相比较于树或者数组(线性表)而言,图的关联…...
DeepSeek【部署 03】客户端应用ChatBox、AnythingLLM及OpenWebUI部署使用详细步骤
DeepSeek客户端应用 1.ChatBox2.AnythingLLM3.OpenWebUI4.总结 客户端软件提供可视化的模型及参数配置,人性化的对话窗口及文件上传功能,大大降低了大模型的使用门槛。 1.ChatBox Chatbox AI 是一款 AI 客户端应用和智能助手,支持众多先进的…...
工作学习笔记:HarmonyOS 核心术语速查表(v14 实战版)
作为在 HarmonyOS 开发一线摸爬滚打的工程师,笔者在 v14 版本迭代中整理了这份带血的实战术语表。 一、架构基础术语速查 A 系列术语 术语官方定义笔者解读(v14 实战版)开发陷阱 & 解决方案abc 文件ArkCompiler 生成的字节码文件打包时…...
mapbox进阶,模仿百度,简单实现室内楼层切换
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️fill-extrusion三维填充图层样式1.4 ☘…...
发行基础:热销商品榜单
转载自官方文件 ------------------ 热销商品榜单 Steam 在整个商店范围内有各种热销商品榜单,最醒目的莫过于 Steam 主页上的榜单了。 您也可以在浏览单个标签、主题、类型时找到针对某个游戏类别的热销商品榜单。 主页热销商品榜单 该榜单出现在 Steam 主页上…...
Android Studio 一直 Loading devices
https://stackoverflow.com/questions/71013971/android-studio-stuck-on-loading-devices...
【时间序列】因果推断:从时序数据中探寻“因”与“果”
在日常生活中,我们经常听到这样的问题:“为什么股票价格会突然下跌?”、“天气变化是否会影响销售额?”这些问题背后,其实都在试图寻找一种因果关系。然而,在时间序列数据中,探寻因果关系并不像…...
联核科技AGV无人叉车的应用场景有哪些?
联核科技AGV无人自动叉车在多个应用场景中均展现出卓越的性能和广泛的应用价值。下面是针对每个应用场景的简要概括、适用车型及其功能的详细介绍联核科技官网-AGV叉车十大品牌-无人叉车厂家-自动化叉车-智能搬运码垛机器人-智能叉车系统解决方案专家 上存下拣 上层四向车立体…...
多模态知识图谱融合
1.Knowledge Graphs Meet Multi-Modal Learning: A Comprehensive Survey 1.1多模态实体对齐 1.2多模态实体链接 研究进展&#...
c++实现最大公因数和最小公倍数
最大公因数和最小公倍数的介绍 读这篇文章,请你先对最大公因数以及最小公倍数进行了解: 最大公因数(英文名:gcd) 定义:最大公因数,也称最大公约数,指两个或多个整数共有约数&…...
利用optisystem软件仿真半导体激光器的P-I特性曲线
利用optisystem软件仿真半导体激光器的P-I特性曲线。得到的图形遵循在超过阈值电流之后,输出光功率与电流成线性关系规律。 资源文件列表 FiberP-I.m , 1881 PCMcode.m , 830 PRseries.m , 140 photo_detect.m , 638...
华为:Wireshark的OSPF抓包分析过程
一、OSPF 的5包7状态 5个数据包 1.Hello:发现、建立邻居(邻接)关系、维持、周期保活;存在全网唯一的RID,使用IP地址表示 2.DBD:本地的数据库的目录(摘要),LSDB的目录&…...
RangeError: Invalid array length
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
django各种mixin用法
在 Django 中,Mixin 是一种用于扩展类功能的设计模式。通过 Mixin,可以在不修改原有类的情况下,为其添加新的方法或属性。Django 中的 Mixin 广泛应用于视图(View)、表单(Form)、模型(Model)等组件中。以下是 Django 中常见 Mixin 的用法和示例: 一、视图(View)中的…...
【leetcode hot 100 206】反转链表
解法一:(头插法)在遍历链表时,将当前节点的 next 指针改为指向前一个节点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val)…...
OpenCV视频解码实战指南
硬核解析OpenCV视频处理底层原理,从零实现高效视频解码流水线!附赠FFmpeg调优参数和异常帧处理方案,建议收藏备用。 📺 视频解码核心原理 视频容器 vs 编码格式 类型常见格式特点容器格式MP4/MKV/AVI/MOV存储封装格式࿰…...
USB流量分析总结(实战[NISACTF 2022] 破损的flag)
一、USB流量分析 USB协议的数据部分在 Leftover Capture Data 域之中,可以用tshark命令将leftover capture data 数据单独提取出来,利用命令如下: tshark -r 1.pcapng -T fields -e usb.capdata > usbdata.txt tshark -r 1.pcapng -T fields -e usb…...
CentOS7离线部署安装docker和docker-compose
CentOS7离线部署安装docker和docker-compose 安装包准备 docker下载地址、docker-compose下载地址 docker和docker-compose版本对应关系 注:本次安装部署选择的版本是 docker:docker-28.0.1.tgzdocker-compose:docker-compose-linux-x86_6…...
【第21节】C++设计模式(行为模式)-Chain of Responsibility(责任链)模式
一、问题背景 在 VC/MFC 开发中,消息处理机制是核心部分之一。VC 是基于消息和事件驱动的框架,消息的处理流程通常是通过链式传递的方式进行的。例如,一个 WM_COMMAND 消息的处理流程可能如下: (1)MDI 主窗…...
vue3页面html导出word文档
一、第三方包下载 使用npm下载以下插件: npm install jszip-utils docxtemplater pizzip file-saver docxtemplater-image-module-free 二、总页面组件代码 <template> <summaryDetails :securityId"securityId" :symbol"symbol" …...
防火墙带宽管理实验
一、实验拓扑图 二、实验要求 需求一: 企业组织架构中存在部门A ,部门 A 中存在销售组 1 和研发组 2 销售部门---> 业务 Email 、 ERP 服务 可以对部门A 中的销售组进行带宽资源细分,保证销售员工的业务服务流量正常转…...
高颜值多端适用软件:兼具屏保功能,PC 端登录可用
软件介绍 FliTik是一款翻页式时钟软件,外观颜值颇高,支持Windows和TV端。 这款软件最大的亮点之一,就是它采用了极为吸睛的翻页式设计。当你第一眼看到它的界面时,相信一定会和我一样,被它超高的颜值所惊艳到。简洁大方的布局&a…...
基于Fluent和深度学习算法驱动的流体力学计算与应用
流体力学基础 一、流体力学基础理论与编程实战 1、流体力学的主要内容 2、不可压缩流体力学的基本方程 3、Navier–Stokes方程的数值求解介绍 4、有限体积法与有限差分法介绍 案例实践: 1、Matlab编程实现有限差分(案例教学) 2、使用深度学习…...
uniapp使用蓝牙,usb,局域网,打印机打印
使用流程(支持安卓和iOS) 引入SDK 引入原生插件包地址如下 https://github.com/oldfive20250214/UniPrinterDemo 连接设备 安卓支持经典蓝牙、ble蓝牙、usb、局域网(参考API) iOS支持ble蓝牙、局域网(参考API&…...
【计算机网络】Socket
Socket 是网络通信的核心技术之一,充当应用程序与网络协议栈之间的接口。 1. Socket 定义 Socket(套接字)是操作系统提供的 网络通信抽象层,允许应用程序通过标准接口(如 TCP/IP 或 UDP)进行数据传输。它…...
YOLO11改进-模块-引入多尺度小波池化变压器MWPT 通过结合小波变换、多尺度池化以及门控机制等技术解决多尺度、小目标、边缘模糊等问题
手势识别在人机交互等领域应用广泛,但面临手部姿态多变、环境因素干扰等挑战。深度学习发展促使基于注意力的模型兴起,Transformer 在自然语言处理和计算机视觉诸多任务表现出色,也被用于手势识别。不过,传统 Transformer 处理视觉…...
HTML + CSS 题目
1.说说你对盒子模型的理解? 一、是什么 对一个文档进行布局的时候,浏览器渲染引擎会根据标准之一的css基础盒模型,将所有元素表示为一个个矩形的盒子。 一个盒子由四个部分组成: content,padding,border,margin 下…...
clickhouse的优缺点
《ClickHouse的优缺点及成功案例分析》 当我们谈论数据库技术时,ClickHouse无疑是一个引人注目的名字。它是一种专为在线分析处理(OLAP)设计的列式数据库管理系统(DBMS),由俄罗斯的Yandex公司开发。随着大…...
kettle工具使用从入门到精通(一)
安装 可以从链接: 官网(下载链接在Pentaho.pdf文件里)或者网络上查找对应的版本安装 Kettle (PDI) 版本与 JDK 版本对应关系 Kettle (PDI) 版本支持的 JDK 版本备注PDI 9.x 及以上JDK 11 或更高版本推荐使用 OpenJDK 或 Oracle JDK 11。PDI 8.xJDK 8 …...
引领变革!北京爱悦诗科技有限公司荣获“GAS消费电子科创奖-产品创新奖”!
在2025年“GAS消费电子科创奖”评选中,北京爱悦诗科技有限公司提交的“aigo爱国者GS06”,在技术创新性、设计创新性、工艺创新性、智能化创新性及原创性五大维度均获得评委的高度认可,荣获“产品创新奖”。 这一奖项不仅是对爱悦诗在消费电子…...
【探商宝】大数据企业销售线索平台:销售型公司的战略转型引擎
一、市场现状与销售型公司的核心痛点 在数字经济高速发展的2025年,全球企业获客成本较五年前增长超过300%,而B2B销售线索的平均转化率仍徘徊在15%-20%之间。这一矛盾背后,折射出传统销售模式的三重困境: 数据孤岛导致决策滞后…...
机器学习在地图制图学中的应用
原文链接:https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心内容 本文是《制图学与地理信息科学》特刊的扩展评论,系统探讨了机…...
Python Flask框架学习汇编
1、入门级: 《Python Flask Web 框架入门》 这篇博文条理清晰,由简入繁,案例丰富,分十五节详细讲解了Flask框架,强烈推荐! 《python的简单web框架flask【附例子】》 讲解的特别清楚,每一步都…...
C++20的简写函数模板
文章目录 简写函数模板的语法示例代码优点 C20引入了简写函数模板(Abbreviated Function Template),这是一种更简洁的函数模板声明方式,允许使用 auto或带有约束的 auto来代替显式的模板参数声明。 简写函数模板的语法 当在函数…...
【Python 数据结构 9.树】
我装作漠视一切,其实我在乎的太多,但我知道抓得越紧越容易失去 —— 25.3.6 一、树的基本概念 1.树的定义 树是n个结点的有限集合,n0时为空树。当n大于0的时候,满足如下两个条件: ① 有且仅有一个特定的结点ÿ…...